總結:由於順序儲存最大的缺點就是增刪慢,在增刪操作後需要移動大量元素,比較耗費時間。所以鏈式儲存解決了這個問題。
物理儲存單元上非連續的、非順序的儲存結構。鏈式結構中,除了儲存資料元素外,還需要儲存後繼的儲存位址。
儲存資料元素資訊的域叫作"資料域",儲存後繼位置的域叫作"指標域"(指標域中儲存的資訊叫作"指標"或"鏈")
資料域 + 指標域 = 結點(node)。n個結點鏈結成為乙個鍊錶,即為線性表的鏈式儲存結構。(典型的 linklist)
鍊錶是由多個"結點"組成,「結點"由資料域和指標域組成,若每個結點只包含乙個指標域,稱之為"單鏈表」
鍊錶中的第乙個結點儲存位置叫作"頭指標" 由於線性表的最後乙個元素是沒有直接後繼的,所以在鏈式儲存中,將最後乙個結點指標設定為 null 或 ^ 表示。
單鏈表的第乙個結點前附設乙個結點,稱為"頭結點"。(可儲存線性表長度等附加資訊,方便對鍊錶的操作。一般為手動設定)
頭指標:
頭結點:
若線性表為空表,頭結點的指標域就為"空"。頭指標是鍊錶的必要元素。
比如:結點1(資料+指標5)————>結點5(資料+指標8)————>結點8(資料+指標…)
插入:目前有三個結點p、q、s,如何將s插入?目前p->next=q。
只需要將結點中的指標進行改變即可,p的指標指向s,s的指標指向q。如下:
s->next = p->next,p->next = s; 也就是說,先將新插入"結點s"的指標域指向"結點q",再將"結點p"的指標指向"結點s"即可。
可不可以 p->next = s,s->next = p->next;?
先將"結點p"的指標指向"結點s",就等同於將"結點p"的指標給覆蓋成"結點s"的位址了,相當於p->next=s,也就是指向"結點s"。
這時候s->next = p->next; 由於p->next = s,那麼s->next = s,結果就是我的"結點q"沒上級了!!!!!中途掉鍊子的情況是不能允許的,所以這種插入是失敗的。
刪除:同樣目前有三個結點p、q、s,如何將"結點s"刪除?
只需要將"結點p"的指標指向"結點q"即可,
s = p->next,p->next = s->next;當前"結點s"被"結點p"的指標p->next所指向,將"結點p"的指標指向"結點q"即可。p->next = s->next等同於p->next = p->next->next。
結論:插入和刪除的第一步都會進行乙個表的遍歷步驟,查到結點位置後進行操作。所以這個"遍歷步驟"相較於"順序儲存結構"來說,時間複雜度為o(n),當遍歷完成後,進入插入和刪除操作時,這時候僅僅是移動指標而已,所以複雜度為o(1)。對弈插入和刪除頻繁的操作來說,單鏈表的效率優勢就更加明顯。
建立單鏈表的過程就是乙個動態生成鍊錶的過程,有以下兩種形式進行建立:
1、頭插法:始終讓新結點在第一的位置。
比如:插入a、b、c三個結點,頭結點——>結點c——>結點b——>結點a
2、尾插法:始終讓新節點在中斷結點的厚點。
比如:插入a、b、c三個結點,頭結點——>結點a——>結點b——>結點c
單鏈表的刪除就是把鍊錶銷毀,在記憶體中釋放掉。
具體思路就是迴圈鍊錶後,每釋放乙個結點,就把"當前釋放結點"前繼的指標指向"當前釋放結點"指標的指向結點。
如圖所示:將"結點s"刪除,就是將前繼"結點p"的指標指向"結點q",和上面說的刪除操作性質一致。
靜態鍊錶:用陣列描述的鍊錶,就是陣列元素包含兩個資料域,data和cur。和鍊錶相似就是存放資料和游標。
迴圈鍊錶:將單鏈表中的終端節點的指標由空指標改為指向頭結點,使單鏈表形成乙個閉環。
雙向鍊錶:單鏈表的每個結點中,再設定乙個指向前驅結點的指標域。
a、儲存分配;
順序儲存結構——>開闢了一段連續的儲存單元。
鏈式儲存結構——>用一組任意的儲存單元存放線性元素,可連續,也可以不連續。
b、時間效能:
順序儲存結構——>查詢o(1),插入和刪除o(n)。
鏈式儲存結構——>查詢o(n),插入和刪除o(1)。
c、空間效能:
順序儲存結構——>預分配儲存空間,分大了,浪費。分小了易發生上溢。
鏈式儲存結構——>不需要分配儲存空間,只要有就可以分配。元素個數不受限制。
在增刪操作比較多的時候,使用單鏈表效率會更高,在查詢操作比較多的時候,順序儲存結構效率比較高。
無法確定元素個數,使用單鏈表結構,反之則順序儲存結構。總之只有最適合的,沒有最完美的。
資料結構(二) 線性表
線性表是最簡單最常用的資料結構,是一種典型的線性儲存結構。定義 線性表是由n n 0 個資料元素 結點 a1 a 2 an 組成的有限序列。n為表的長度。當n 0,為 空表 n 0時,為 a1,a 2,an 邏輯特徵 非空的線性表只有乙個頭結點,也只有乙個終結點,頭結點只有乙個直接後繼結點,而沒有直...
資料結構之線性表(二)
線性表的鏈式儲存結構之單鏈表 1.標頭檔案nodelist.h typedef int elemtype typedef struct node listnode,linklist 單鏈表的建立 void createlisthead linklist l,int n 單鏈表的刪除 int list...
總結二 資料結構 線性表
線性表簡單的說就是n個資料元素的有限序列。特點 1.存在唯一的乙個被稱為 第乙個 的資料元素 2.存在唯一的乙個被稱為 最後乙個 的資料元素 3.除第乙個之外,集合中的每乙個資料元素均只有乙個前驅 4.除最後乙個之外,集合中每個資料元素均只有乙個後繼。按物理儲存方式分為兩大類 順序表示和鏈式表示 線...