眾所周知,南京某頂著985,211,雙一流名頭的三本大學的放假時間是極晚的,若不是學生鬧一鬧,恐怕得到二月份才放假。上學期的c++課我雖然考了100,但越學越覺得力不從心。所以抽出來寒假來學一下資料結構。
資料結構書配合網課雖然易於理解,但使用的畢竟是類c語言而且還不完整,所以用c++來實操一下就特別有必要了。
struct listnode
//建構函式
};
鍊錶就是用鍊子把一連串節點給串起來,節點中存有資料與指向下乙個節點的指標,用結構體來實現再合適不過了。(雖然我們c++課學的是類,不過類還是要用public之類的語句,我覺得不如結構體簡便)
listnode* head=null;
這裡我建立了頭節點,它不儲存資料,但是整個鍊錶的開始。
listnode* first=new listnode(1);
head->next=first;
這裡我建立了首元節點,並存入了資料1,然後把頭節點的next指向了首元,這樣就基本串了起來。
status getelem(linklist l,int i,elemtype &e)
if(!p||j>1)return 0;
e=p->data;
return 1;
}
這是類c語言描述出來的函式,用e來承接返回來的資料。這個函式還是比較簡單的,把它轉換為c++語言很容易。
查詢的演算法與取值類似,不同之處在於查詢到後返回的是位址。不過我感覺這種方法還是有缺陷的,它只能返回查詢到的首個資料位址,如果之後還有的話那就查不到了。我認為可以給它改一下,用陣列指標來承接每個元素。
插入來說相對難實現一些。假如我們要在第二和第三個節點之間插入乙個節點a,應該如何實現呢?
一開始我們要插入的節點其next為nullptr,只存有資料
第一步,讓a節點的next指向三,**為
a->next=second->next;
第二步,讓第二個節點的next指向a
second->next=a;
這兩步是不能互換的,一換就會出問題。
於是,其完整的演算法為
status listinsert(listnode &l,int i,elemtype e)
if(!p||j>i-1)return error;
s=new lnode(e);
s->next=p->next;
p->next=s;
return ok;
}
展示一下我寫的乙個很簡單的c++**
int insert(listnode* head,int e,int i)
listnode* s;
s=new listnode(e);
s->next=p->next;
p->next=s;
return 1;
}
這段**基本上實現了簡單的插入,當然其健壯性不高。
刪除單鏈表中的乙個節點,我們僅需讓該節點的前驅指向該節點的後繼,然後再把該節點的next改為nullptr。但這樣操作後節點所佔記憶體還是存在的,我們要想辦法把它給釋放掉。我們一般把要刪除的節點的位址儲存在乙個臨時的q中,然後c++中通常用delete刪除。這個演算法個人感覺比較簡單,因此不再贅述。
前面研究這些操作時我建立了first,second等結構體指標來作為節點。但這樣子不僅效率不高而且與順序表沒有本質區別,因此必須尋求一種高效的方法。
void createlist_h(linklist &l,int n)
}
這個演算法還是容易理解的,我們要在l後插入n個節點,每次都要建立乙個新的節點,讓它的next變為l的next(即上乙個p的next),然後讓l的next變為這個p。
這個可以這麼理解,在初始的l後面還存在著乙個null節點,每次操作都相當於在null和null之前的節點之間插入乙個節點。
前插法中資料的順序並不是按照輸入順序來的
後插法資料的順序就是按照輸入順序來的了。
l=new lnode;
l->next=null;
r=l;
for(int i=0;i>p->data;
p->next=null;r->next=p;
r=p;
}
不同的是後插法需要輔助節點,該輔助節點始終指向鍊錶的最後乙個元素 資料結構 day1
資料結構往往跟演算法有很大關係 ep1 圖書館 ep2 遞迴函式很有可能導致記憶體溢位 因為每一次遞迴都在記憶體裡新建了乙個 程式 如果遞迴次數過多,那麼這個程式占用的空間會很恐怖 ep3 多項式 正常演算法和秦九韶演算法的比較。秦九韶演算法有效的減少了乘法的量級 clock 獲得從程式開始到呼叫這...
寒假自學資料結構打卡 Day4 佇列
1.離線列印輸出 2.多使用者分時使用cpu和記憶體 3.實時控制系統,訊號按接受的優先順序處理 initquene q 構造空佇列q destroyquene q 銷毀佇列 clear q 清空佇列 length q 返回佇列長度 gethead q.e 返回隊頭 enquene q,e 把e插入...
資料結構day1 棧
1.什麼是棧 後進先出 lifo 的線性表,僅能在一邊進出。2.實現方式有 順序棧和鏈式棧 順序棧的實現 將陣列的尾部當作棧頂,在棧頂尾部進行pop和push操作只需要常數時間。順序棧的實現 public class astack implements stackadt astack void in...