同單向鍊錶比較,雙向鍊錶的優勢在於查詢的方便性;
單向迴圈鍊錶僅對於該節點及後繼結點的查詢便利,但當查詢結點前驅節
點時就遇到最高時間複雜度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...