帶頭節點鍊錶總結

2021-10-08 05:13:27 字數 1773 閱讀 5186

帶頭節點鍊錶的建立:

初始化乙個頭結點(包含指向下乙個節點的point *next),

執行初始化前判斷這個鍊錶是否有效

if

(null

== head)

主要部分:

新增節點分兩種情況:

①新增的是第乙個節點,直接讓頭結點指向現節點即可

②需在鍊錶末尾新增節點,這時tail的作用就顯現出來,tail是上次錄入節點後的末尾節點,因為是末尾新增,直接讓tail指向新節點即可

if

(null

== head->next)

else

tail = p;

重點:查詢前驅節點:

所實現的前插入,刪除都需要前驅節點。

定義兩個point *型別 乙個p遍歷鍊錶查詢所要尋找的節點,另乙個pre記錄p的上乙個節點

for

(p = head.next; p; p = p->next)

pre = p;

}

最後返回pre

刪除節點:

找到所要刪除的節點的前驅節點,讓前驅節點pre的next例項跳過所刪節點p後 釋放p空間

p = pre->next;

pre->next = p->next;

free

(p);

插入節點:

類似於刪除節點,新節點p的next指向pre->next,前驅節點的next指向新節點p

p->next = pre->next;

pre->next = p;

注:

①若前驅節點沒有找到,返回值是最後乙個節點,pre != null,但pre->next == null

②若所查詢的節點為鍊錶第乙個節點,則前驅節點應為頭結點,但實際的pre返回值為null,所以對於第乙個節點的刪除,前插入操作需要額外將pre賦值為頭結點head

節點排序:

節點排序利用冒泡迴圈

for

(p = head->next; p; p = p->next)

}

但對於鍊錶的氣泡排序,替換完節點內容後,所替換的節點的next例項應換回來,

如:1->4->3->2

2和4內容交換後,1->2 3->4->3 2的next例項是null,4的next指向3,若2和4的next不交換,鍊錶無法連起來

所以交換過程如下:

temp =

*p;*p =

*q;*q = temp;

next = p->next;

p->next = q->next;

q->next = next;

摧毀鍊錶:

因為鍊錶除了頭結點都是利用malloc或calloc申請空間實現,在程式執行完後應釋放所申請的空間,

從第乙個節點開始,p用於記錄當前節點,先將頭結點指向改為當前節點的指向,這樣釋放遍歷才能進行。

若p不為空,釋放p,用p重複操作,記錄,改指向,釋放。

p = head->next;

while

(p)

帶頭節點的鍊錶

include include includetypedef int type typedef struct node node 建立乙個頭節點並將其指標返回 node node init 列印乙個鍊錶 void node display node head else printf n 找到第n個節...

不帶頭節點鍊錶

在本人之前的博文 帶頭節點的鍊錶 宿舍管理系統 中,本人介紹了鍊錶的基本知識點。那麼,在本人資料結構與演算法的專欄的開始,本人就來介紹下不帶頭節點鍊錶 由於本人在講解帶頭節點鍊錶的時候就已經講解過了鍊錶基本的增 刪 改 查 操作,所以,本人在這裡就不對這些重複的知識點進行講解了。本人在本篇博文中主要...

雙向迴圈帶頭節點鍊錶

include include struct dblnode typedef struct dblnode dblnode typedef struct dblnode dbllink void create link dbllink head 建立鍊錶 void create newnode db...