資料結構導論-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,因為是迴圈連結串列,所以不必判斷是否到達表尾,比較簡單。大家也可對此演算法進行改進。