一、循環鏈表
循環鏈表:是一種頭尾相接的鏈表。其特點是最后一個結點的指針域指向鏈表的頭結點,整個鏈表的指針域鏈接成一個環。
特點是: 從循環鏈表的任意一個結點出發都可以找到鏈表中的其它結點,使得表處理更加方便靈活。
其示意圖如下圖所示
循環鏈表的操作:
對於單循環鏈表,除鏈表的合並外,其它的操作和單線性鏈表基本上一致,僅僅需要在單線性鏈表操作算法基礎上作以下簡單修改:
⑴ 判斷是否是空鏈表:head->next==head ;
⑵ 判斷是否是表尾結點:p->next==head ;
二、雙向鏈表
雙向鏈表(Double Linked List) :指的是構成鏈表的每個結點中設立兩個指針域:一個指向其直接前趨的指針域prior,一個指向其直接后繼
的指針域next。這樣形成的鏈表中有兩個方向不同的鏈,故稱為雙向鏈表。
(1)雙向鏈表的類型定義:
typedef struct Dulnode {
ElemType data ;
struct Dulnode *prior ,*next ;
}DulNode ;
其節點形式如下圖所示:
帶頭結點的雙向單鏈表如下圖所示:
雙向鏈表的特點有:
雙向鏈表結構具有對稱性,設p指向雙向鏈表中的某一結點,則其對稱性可用下式描述:
(p->prior)->next=p=(p->next)->prior ;
結點p的存儲位置存放在其直接前趨結點p->prior的直接后繼指針域中,同時也存放在其直接后繼結點p->next的直接前趨指針域中。
(2)雙向鏈表的基本操作
1、雙向鏈表的插入: 將值為e的結點插入雙向鏈表中。插入前后鏈表的變化如下圖所示。
① 插入時僅僅指出直接前驅結點,鈎鏈時必須注意先后次序是: “先右后左” 。部分語句組如下:
S=(DulNode *)malloc(sizeof(DulNode));
S->data=e;
S->next=p->next; p->next->prior=S;
p->next=S; S->prior=p; /* 鈎鏈次序非常重要 */
② 插入時同時指出直接前驅結點p和直接后繼結點q,鈎鏈時無須注意先后次序。部分語句組如下:
S=(DulNode *)malloc(sizeof(DulNode));
S->data=e;
p->next=S; S->next=q;
S->prior=p; q->prior=S;
2、 雙向鏈表的結點刪除
設要刪除的結點為p ,刪除時可以不引入新的輔助指針變量,可以直接先斷鏈,再釋放結點。部分語句組如下:
p->prior->next=p->next;
p->next->prior=p->prior; free(p);
注意: 與單鏈表的插入和刪除操作不同的是,在雙向鏈表中插入和刪除必須同時修改兩個方向上的指針域的指向。