帶頭節點鍊錶的建立:
初始化乙個頭結點(包含指向下乙個節點的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...