雙向迴圈鍊錶簡介

2021-10-09 13:59:09 字數 2202 閱讀 3176

同單向鍊錶比較,雙向鍊錶的優勢在於查詢的方便性;

單向迴圈鍊錶僅對於該節點及後繼結點的查詢便利,但當查詢結點前驅節

點時就遇到最高時間複雜度o(n),遍歷一周;

雙向迴圈鍊錶則只需要o(1),詳細**如下;

定義鍊錶結點

給出了兩個指標prior 和 next,乙個指向前驅結點,乙個指向後繼結點;

struct dulnode

};

初始頭結點

這裡使用乙個頭結點,不儲存資料!!

至於為啥有個頭結點,我認為這應該是作為終止訊號的標誌,方便後續操作;

dulnode*

createdulnode()

新增結點

同單向鍊錶操作稍微不同的是,這裡需要多操作乙個指標prior;

void

adddulnode

(dulnode* head, string s)

//new node

dulnode* tar =

newdulnode()

; tar-

>data = s;

//資料

//指標操作

tar-

>prior = p;

//前驅

tar-

>next = p-

>next;

//後繼 p->next 即 head

p->next = tar;

//原尾結點後繼連上

head-

>prior = tar;

//頭結點的前驅結點更新***

}

上述需要注意的只有指標改變的順序,以免「認錯指標」;(改之前看原指標有沒有改變)

插入結點

插入節點和單向鍊錶相同,先找到插入結點位置的前驅結點,再進行指標操作;

//在第 i 個資料前插入

void

insertdulnode

(string s, dulnode* head,

int i)

//準備空結點

dulnode* tar =

newdulnode()

; tar-

>data = s;

//插入

tar-

>prior = p;

tar-

>next = p-

>next;

p->next-

>prior = tar;

p->next = tar;}/*

由於鍊錶的迴圈特性,實際上插入的是第 (i-1) % n 個結點, n 為有效結點個數, i - 1 是因為有乙個 頭結點 不存資料

*/

順序順序!注意指標變化的順序即可;

刪除結點

步驟無太大差別,會插入結點刪除應該問題不大了;

//刪除第 i 個資料

void

deletedulnode

(dulnode* head,

int i)

剩下一些必要操作直接給**了
//列舉結點資料

void

showdulnode

(dulnode* head)

//當 p 指向頭結點 結束迴圈

/* 這裡正向迴圈,若要反向,只需要將其中的 next 都修改為 prior 即可!

*/}//獲取有效長度

intgetlengthdn

(dulnode* head)

return ret;

}

共勉!

雙向鍊錶和雙向迴圈鍊錶

和單向鍊錶相比,多了乙個前驅結點。如果他為空,那麼next和prior都指向自己。而對於雙迴圈鍊錶,只需要最後乙個元素的next指向head next,head next的prior指向最後乙個節點即可。新節點s插入鍊錶,s next給p結點,s prior給p prior,然後,p prior n...

迴圈鍊錶,雙向鍊錶

迴圈鍊錶 迴圈鍊錶與順序鍊錶之間的區別 迴圈鍊錶最後乙個資料的next指標域不為空,而是指向頭結點,其他基本操作大體相同,只是在判斷表結束的條件變為判斷節點的引用域是否為頭引用 雙向鍊錶 author neosong date oct 10,2017 4 43 01 pm program of in...

鍊錶 雙向迴圈鍊錶

雙向迴圈鍊錶與單鏈表一樣,都是邏輯連續 物理不連續的儲存方式,但它的效果要遠遠優於單鏈表,其結構如下 雙向迴圈鍊錶首先要有乙個頭節點,頭節點中不存放資料,真正的資料從頭節點的下乙個節點開始存放 然後每乙個節點都有兩個指標,分別指向前乙個節點和後乙個節點 最後頭尾相連,就成了雙向迴圈鍊錶。includ...