單鏈表結點中只有乙個只指向後繼的指標,使得單鏈表只能從頭結點開始一次順序的先後遍歷。要訪問某個結點的前驅結點(插入刪除操作時),只能從頭開始遍歷,訪問後繼節點的時間複雜度為o(1),訪問前驅結點的時間複雜度為o(n)。
為了克服單鏈表的上述缺點,引入了雙鏈表,雙鏈表結點中有兩個指標prior 和 next,分別指向其前驅結點和後繼結點。
雙鏈表中結點型別描述:
typedef
struct dnodednode,
*dlinklist;
在雙鏈表中,按位查詢和按值查詢的操作和單鏈表中的相同。但在插入和刪除上有著較大的不同。因為雙鏈表有prior指標,可以很方便地找到其前驅結點,因此插入,刪除結點的時間複雜度為o(1)。
將結點s 插入到指標p所指結點b之前:
bool
dlinklist_insert
(dlinklist& l,elemtyep c)
注意:第一,二步必須在第四步之前,否則*p的前驅結點的指標就會丟失,導致插入失敗。將結點s 插入到指標p所指的節點b 之後(如上圖,假設後面的結點是d):
bool
dlinklist_insert
(dlinklist& l,elemtype c)
同樣的,前插操作和後插其實沒區別,注意第四步即可,大家不清楚可以在草稿紙上面畫出來,畫出來了就一目了然了。
刪除指標p指向的結點b:
bool
dlinklist_delete
(dlinklist& l)
如果是刪除指標p指向的結點的後繼結點,指標q指向後繼結點,也就是後刪:
bool
dlinklist_delete
(dlinklist& l)
如果喜歡的話,不妨關注一波,謝謝啦。
資料結構 雙鏈表
typedef struct nodenode 雙鏈表的根節點的bwd指標指向雙鏈表的最後乙個節點,fwd指標指向雙鏈表的第乙個節點,雙鏈表的value欄位為空 以下程式是將乙個值插入到乙個有序的雙鏈表中,如果鍊錶中已經有和該值相同的節點則不插入 include include typedef st...
資料結構 雙鏈表
目標 掌握雙鏈表的資料結構 來看看什麼是雙鏈表吧 雙鏈表與單鏈表的區別,單鏈表是單項的 而雙鏈表是有左右的 題目acwing 827 實現乙個雙鏈表,雙鏈表初始為空,支援5種操作 1 在最左側插入乙個數 2 在最右側插入乙個數 3 將第k個插入的數刪除 4 在第k個插入的數左側插入乙個數 5 在第k...
資料結構 雙鏈表
概念 在使用乙個單鏈表時,我們可以通過next指標很輕鬆地訪問下乙個結點,但是如果想要找到乙個結點的前驅結點卻沒有什麼好的辦法,只能從頭開始遍歷。既然我們想要很輕鬆地訪問前驅結點,那麼定義乙個像next一樣的指標指向前驅結點不就好了嗎!確實如此,這樣每個結點都有兩個指標域,分別指向前驅結點和後繼結點...