一.單鏈表的定義
1.線性表的鏈式儲存又稱為單鏈表,它是指通過一組任意的儲存單元來儲存線性表中的資料元素。
為了建立資料元素之間的線性關係對每個鍊錶結點,除存放元素自身的資訊外,還需要存放乙個指向
其後繼的指標。
2.單鏈表中結點型別的描述如下:
typedef
struct lnode //定義單鏈表結點型別
lnode,
*linklist;
3.利用單鏈表可以解決順序表需要大量連續儲存單元的缺點,但單鏈表附加指標域,也存在浪費存
儲空間的缺點。由於單鏈表的元素離散地分布在儲存空間中,所以單鏈表是非隨機訪問的儲存結構,
即不能直接找到表中某個特定的結點。查詢某個特定的結點時,需要從表頭開始遍歷,依次查詢。
4.引入頭結點後,可以帶來以下兩個優點:(1
)由於第乙個資料結點的位置被存放在頭結點的指標域中,所以在鍊錶的第乙個位置上的操作和
在表的其他位置上的操作一致,無須進行特殊處理(2
)無論鍊錶是否為空,其頭指標都指向頭結點的非空指標,因此空表和非空表的處理也就得到了統一
二、單鏈表上基本操作的實現
1.採用頭插法建立單鏈表
該方法從乙個空表開始,生成新結點,並將讀取到的資料存放到新結點的資料域中,然後將新結點插
入到當前鍊錶的表頭,即頭結點之後
linklist list_headinsert
(linklist &l)
//逆向建立單鏈表
return l;
}採用頭插法建立單鏈表時,讀入資料的順序與生成的鍊錶中的元素的順序是相反的。每個結點插入
的時間為o(1
),設單鏈表長為n,則總時間複雜度為o
(n)2.採用尾插法建立單鏈表
該方法將新結點插入到當前鍊錶的表尾,為此必須增加乙個尾指標r,使其始終指向當前鍊錶的尾結點
linklist list_tailinsert
(linklist &l)
//正向建立單鏈表
r->next=
null
;//尾結點指標空
return l;
}時間複雜度和頭插法的相同
3.按序號查詢結點值
在單鏈表中從第乙個結點出發,順指標next域逐個往下搜尋,直到找到第i個結點為止,否則返回最
後乙個結點指標域null
lnode *
getelem
(linklist l,
int i)
return p;
}時間複雜度為o
(n)4.按值查詢表結點
lnode *
locateelem
(linklist l,elemtype e)
時間複雜度為o
(n)5.插入結點操作
插入結點操作將值為x的結點插入到單鏈表的第i個位置上。先檢查插入位置的合法性,然後找到待
插入位置的前驅結點,即第i-
1個結點,再在其後插入新結點
s->next=p->next;
p->next=s;
6.刪除結點操作
找到被刪結點的前驅結點
q=p->next;
//令q指向被刪結點
p->next=q-next;
free
(q);
//釋放結點的儲存空間
7.求表長操作
從第乙個結點開始順序依次訪問表中的每個結點,直到訪問到空結點為止。
三、雙鏈表
1.單鏈表結點中只有乙個指向其後繼的指標,使得單鏈表只能從頭結點依次順序地向後遍歷。要訪
問某個結點的前驅結點,只能從頭開始遍歷,訪問後繼結點的時間複雜度為o(1
),訪問前驅結點的時
間複雜度為o
(n)。為了克服單鏈表的上述缺點引入了雙鏈表。
2.雙鏈表中結點型別的描述如下
typedef
struct dnode//定義雙鏈表結點型別
dnode,
*dlinklist;
3.雙鏈表的插入操作
s->next=p->next;
//將結點*s插入到*p之後
p->next->prior=s;
s->prior=p;
p->next=s;
4.雙鏈表的刪除操作
p->next=q->next;
q->next->prior=p;
free
(q);
四、迴圈鍊錶
1.迴圈單鏈表的判空條件不是頭結點的指標是否為空,而它是否等於頭指標。
2.迴圈雙鏈表為空表時,其頭結點的prior和next域都等於l,
五、靜態鍊錶
1.靜態鍊錶借助陣列來描述線性表的鏈式儲存結構,結點也有資料域data和指標域next,這裡的指
針是結點的相對位址(陣列下標)
,又稱游標。和順序表一樣,靜態鍊錶也要預先分配一塊連續的內
存空間。
2.靜態鍊錶結構型別的描述如下:
#define maxsize 50
//靜態鍊錶的最大長度
typedef
struct
slinklist[maxsize]
;3.靜態鍊錶以next==
-1作為其結束的標誌。靜態鍊錶的插入、刪除操作與動態鍊錶的相似,只需要
移動指標,不需要移動元素。
六、順序表和煉表的比較
1.訪問方式:順序表可以順序訪問,也隨機訪問,鍊錶只能從表頭順序訪問元素。
2 3線性表的鏈式表示和實現
演算法2.8 單鏈表中插入乙個節點 下面是書中的偽 status listinsert l linklist l,int i,elemtype e if p j i 1 return error i小於1或者大於表長 s linklist malloc sizeof lnode 生成新結點 s da...
線性表的鏈式表示
上篇文章是線性表的順序表示,本篇便是線性表的鏈式表示。主函式的步驟包括,輸入線性表資料,對鍊錶的刪除,插入。利用指標進行對鍊錶的訪問。同時為了增加程式可讀性,將結構體定義為lnode,linklist。include 線性表的鏈式表示 using namespace std typedef stru...
線性表續篇 線性表的鏈式表示
public class 04linearlist02 初始化指標域和資料域 private node t obj,node n 得到當前節點的資料域 public t getdata 得到當前節點的指標域 public node getnext 鍊錶的長度 private int length 鍊...