數據結構之循環鏈表和雙向鏈表


一、循環鏈表

循環鏈表:是一種頭尾相接的鏈表。其特點是最后一個結點的指針域指向鏈表的頭結點,整個鏈表的指針域鏈接成一個環。

特點是: 從循環鏈表的任意一個結點出發都可以找到鏈表中的其它結點,使得表處理更加方便靈活。

其示意圖如下圖所示

循環鏈表的操作:

對於單循環鏈表,除鏈表的合並外,其它的操作和單線性鏈表基本上一致,僅僅需要在單線性鏈表操作算法基礎上作以下簡單修改:

⑴ 判斷是否是空鏈表: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);

注意: 與單鏈表的插入和刪除操作不同的是,在雙向鏈表中插入和刪除必須同時修改兩個方向上的指針域的指向。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM