單鏈表(演算法與資料結構)

2021-10-03 19:26:48 字數 2650 閱讀 6475

 鍊錶 單鏈表

為每個結點新增1個指標域,每個結點包括兩個域:

①資料域:存放元素本身資訊

②指標域:存放後繼結點的儲存位置;

指向鍊錶中第乙個結點的指標,稱為這個鍊錶的頭指標。

最後乙個元素的指標不指向任何結點,稱為空指標,圖示中用「^」表示,在演算法中用「null」表示

 帶頭結點的單鏈表

頭結點:

– 可以不存資訊,可以儲存與整個表相關的資訊,如表長;

– 空表的頭結點指標域為空null;

– 在k0處插入、刪除都不影響頭指標的值;

– 輔助結點,不屬於表的內容

– link域指向表的第乙個實際結點

 單鏈表定義(c語言描述)

struct node;

//單鏈表結點型別

typedef

struct node * pnode;

//結點指標型別(pnode是個指標,指向struct node)

struct node

;typedef

struct node * linklist;

//結點指標型別,c語言當中實際使用的是linklist指標

linklist llist;

//llist為單鏈表的頭指標

 單鏈表運算的實現

建立空表

①宣告頭指標

②為頭結點申請空間

③設定頭結點的指標域

linklist createnulllist_link

(void

)

判斷是否為空表

檢查頭結點的指標域 llist->link 是否為空

int

isnulllist_link

(linklist llist)

查詢元素、求某元素的儲存位置

pnode locate_link

(linklist llist, datatype x)

在單鏈表中插入元素

 在指標p所指結點之後,插入元素x

①申請新結點q,置其資料域為x;

②q掛到鍊錶上:q的指標域指向p的後繼;

③p的指標域指向q,原鏈自動斷開;

int

insertpost_link

(linklist llist, pnode p,datatype x)

else

}

 在指標p所指結點之前,插入元素x

①找到p的前驅p1

②申請新結點q,置其資料域為x;

③q掛到原鍊錶:q的指標域指向p;

④p1的指標域指向q,原鏈自動斷開;

尋找指標p所指結點的前驅:

從第1個結點開始,檢查各結點的指標域?=p

pnode locatepre_link

(linklist llist, pnode p)

尋找值為x的結點的前驅:

從第1個結點開始,檢查各結點的資料域?=x

 在帶頭結點單鏈表中,第i+1個結點之前,(順序表中下標為i的元素ki)之前,插入元素x

– 借助計數器 int j=0 尋找下標為i-1的元素

int

insert_link

(linklist llist,

int i, datatype x)

if(p==

null

|| j!=i)

//若未找到下標為i-1的元素

//若成功找到下標為i-1的結點(p正指向它)

q=(pnode)

malloc

(sizeof

(struct node));

if(q==

null

)else

//在p之後 插入新結點

return1;

}

從單鏈表中刪除元素

從單鏈表中刪除第1個值為x的結點

①遍歷,查詢x (位址為q),其前驅p;

②從鍊錶中刪除x

③釋放x結點占用的記憶體空間

int

deletev_link

(linklist llist, datatype x)

else

//找到x,且p指向x的前驅

}

 單鏈表代價分析

在單鏈表中查詢第乙個值為x的元素:

---- 從頭結點開始,遍歷、匹配

---- 時間複雜度為o(n)

在單鏈表中查詢第i個元素:

---- 從頭結點開始,借助計數器j, 遍歷

---- 時間複雜度為o(n)

 單鏈表分析與評價

優點:插入或刪除,只需修改指標,無需移動元素;

動態分配儲存空間;

缺點:儲存密度比順序表低;

不能隨機訪問第i個元素,需順鏈查詢;

資料結構與演算法 單鏈表

鍊錶是有序的列表,但是它在記憶體中是儲存如下 鍊錶是以節點的方式來儲存的 鍊錶的各個節點不一定是連續儲存的 鍊錶分帶頭結點的鍊錶和不帶頭結點的鍊錶 新增先建立乙個 head 頭結點,作用就是表示單鏈表的頭 後面我們每新增乙個結點,就直接加入到鍊錶的最後 遍歷 通過乙個輔助變數,幫助來遍歷整個鍊錶 第...

資料結構與演算法 單鏈表

單鏈表的建立 1.建立乙個head頭節點,作用就是表示單鏈表的頭 2.後面我們每新增乙個節點,就直接加入鍊錶的最後 定義heronode,每個heronode物件就是乙個節點 class heronode 為了顯示方法,重新tostring public string tostring 定義sing...

資料結構與演算法 單鏈表(一)

單鏈表的頭插法,插入時就是逆序。insertlist 還不完善。include include define error 0 define ok 1 typedef int status typedef int elemtype typedef struct nodenode typedef str...