1. 程式人生 > >資料結構導論-2.4 線性表的鏈式儲存之迴圈連結串列與雙向迴圈連結串列

資料結構導論-2.4 線性表的鏈式儲存之迴圈連結串列與雙向迴圈連結串列

迴圈連結串列與雙向迴圈連結串列

一、迴圈連結串列

1.思路

對於單鏈表而言,最後一個結點的指標域是空指標,如果將該連結串列頭指標置入該指標域,則使得連結串列頭尾結點相連,就構成了單迴圈連結串列。

2.特點

無須增加儲存量,僅對錶的連結方式稍作改變,即可使得表處理更加方便靈活:從表中任一結點出發均可找到表中其他結點,提高查詢效率。

3.圖示

二、雙向迴圈連結串列

1.思路

每個結點包含兩個指標域,一個指向直接前趨(prior) ,一個指向直接後繼(next)。

雙鏈表由頭指標唯一確定。

將雙鏈表中的頭結點和尾結點連結起來可以構成迴圈連結串列,並稱之為雙向迴圈連結串列。

2.圖示

3.型別說明

struct dbnode

{ DataType data;

struct dbnode *prior,*next;

}

typedef struct dbnode, *dbpointer;

typedef dbpointer DLinkList;

4.雙向迴圈連結串列的基本運算

1)刪除

設p指向待刪結點,刪除*p可通過以下語句完成

p->prior->next=p->next;     //p前驅的後繼為p的後繼

p->next->prior=p->prior;     //p後繼的前驅為p的前驅

free(p);            //釋放*p的空間

2)插入

在p所指結點的後面插入一個新結點*t,需要修改4個指標,而且要注意語句的順序

t->prior=p;

t->next=p->next;

p->next->prior=t;

p->next=t;

基於特殊連結串列的演算法設計

【例題·演算法設計題】

若迴圈單鏈表長度大於1,p為指向連結串列中某結點的指標,試編寫一演算法刪除p結點的前驅結點。

【解】

Node *delete(p)

Node *P;

{

Node *q,*r;

q=p;

While (q->next!=p) q=q->next;    //找到p的前驅q

r=q;

while (r->next!=q) r=r->next;     //找到q的前驅r

r->next=p;            //從鏈中摘掉q

free(q);

return(p);

}

【解析】演算法的思路是先找到p的前驅q,再找到q的前驅r,然後刪除q,因為是迴圈連結串列,所以不必判斷是否到達表尾,比較簡單。大家也可對此演算法進行改進。