資料結構3 鍊錶

2021-07-10 15:01:10 字數 1366 閱讀 8165

鍊錶是儲存許多同型別的資料元素組成的有序列表。鍊錶如同火車,人數決定車箱數,人多就向系統申請多加乙個車廂,人少就去除乙個車廂。這種動態分配記憶體的方式,按需分配,可以避免記憶體的浪費。

int

*p=&val;//int型別的指標p指向val;

動態記憶體分配:

就是程式在執行的時候向系統申請記憶體,程式執行結束應該手動釋放記憶體。否則將會出現記憶體洩漏的情況。程式的執行速度較慢!

動態記憶體的申請:

資料型別 *指標名稱=new 資料型別;//申請記憶體;

資料型別 *指標名稱=new 資料型別(初始值);//申請記憶體,並且給指標賦予初始值;

記憶體的釋放:

delete 指標;

指標=null

;//將指標指向空,將記憶體歸還給系統。

靜態記憶體分配:編譯階段分配記憶體,程式結束不需要釋放記憶體,這個動作在程式結束之後自動釋放。程式的執行速度較快!

3.2 單鏈表(singly linked list)

單鏈表是鍊錶中最常用的一種,他像火車一般,所有的結點串成一列,而且指標所指的方向一樣。鍊錶中的每個資料單元除了要儲存原來的資料外還必須儲存下乙個資料的儲存位址,所以在程式結中鍊錶由結點組成。

簡而言之,就是乙個鍊錶單元既儲存資料又儲存下乙個鍊錶單元的位址。

其他操作:單鏈表單元的結點刪除,插入、單鏈表連線、單鏈表反轉等。

主要思想都是前乙個節點的指標指向新插入的單元結點,然後新插入單元的指標指向後乙個單元的結點即可。

3.3 迴圈鍊錶(circle list)

將鍊錶尾部指標指向頭部結點,則鍊錶就是乙個單迴圈鍊錶。

結點插入:將新結點指標指向原煉表頭結點,尾部結點指標指向插入單元的結點即可。

簡而言之,在迴圈鍊錶中可以任意處插入新的單元,因為迴圈鍊錶沒有頭尾之分。具體操作可以是,如果新的資料單元c插在a和b單元之間,則a單元的指標指向c的結點,c的指標指向b的結點就可以實現了。

3.4 雙向鍊錶(double linked list)

單鏈表或者迴圈鍊錶只是沿著乙個方向去查詢資料,如果乙個指標斷裂,則鍊錶就會消失無法救回。雙向鍊錶則是單元中前後兩個閾存放指標,中間存放資料。其中乙個指標指向前面的結點,另乙個指標指向後面的結點。

結構是:

llink                  data                  rlink
操作也有:結點插入、結點的刪除等,不論如何操作都要讓鍊錶完整的連線上即可。

雙鏈表優缺點:

優點:每個單元兩個指標,分別指向前面和後面的單元,即使一根指標斷裂,也能找到其他結點。不需要經過反轉或者對比結點等處理,執行速度快。

資料結構 鍊錶(3)

現在我們可以回頭總結一下我們的鍊錶 鍊錶是乙個由節點組成的一條鏈。每個節點包含兩條資訊 序列中儲存的是一些資料 節點中有指向列表中下乙個節點的鏈結。我們可以從第乙個單元格開始跟隨著link指標,遍歷整個鍊錶。如同下圖所示 左邊是乙個節點,右邊是由節點組成的鍊錶 鍊錶是用於儲存元素序列的資料結構。每個...

面試 資料結構(3)(鍊錶)

1 除了用陣列描述線性表還可以用鍊錶描述線性表 2在鏈式描述中,線性表的元素在記憶體中的儲存位置是隨機的。每個元素都有乙個明確的指標或鏈指向線性表的下乙個元素的位置 即位址 陣列和鍊錶的區別 在陣列中,元素的位址是由數學公式決定的,而在鏈式描述中,元素的位址是隨機分布的 順序表是順序儲存,非順序訪問...

資料結構 鍊錶(3) 鍊錶的逆序

鍊錶的逆序 鍊錶的只逆序輸出,鍊錶不逆序,第二種是鍊錶的逆序。面試中經常考察鍊錶的逆序。總結鍊錶逆序的五個主要步驟 2 將當前結點的指標域指向當前結點的前乙個結點 3 將當前結點後移 4 將當前結點的前一結點的指標後移,進行迴圈 5 逆序之後的原來的頭指標的指標域為空。並建立新的頭結點 建立結構體 ...