2 3 線性表的鏈式表示

2021-10-10 09:11:45 字數 2751 閱讀 2592

一.單鏈表的定義

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 鍊...