雙向鍊錶
迴圈單鏈表的出現,雖然能夠實現從任一結點出發沿著鏈能找到其前驅結點,但時間耗費是o(n)。如果希望從表中快速確定某乙個結點的前驅,另乙個解決方法就是在單鏈表的每個結點裡再增加乙個指向其前驅的指標域prior。這樣形成的鍊錶中就有兩條方向不同的鏈,我們可稱之為雙(向)鍊錶(doublelinked list)。雙鏈表的結構定義如下:
typedef structdnode
dnode,*doublelist;
雙鏈表的結點結構如圖2.14所示。
與單鏈表類似,雙鏈表一般也是有頭指標唯一確定的,增加頭結點也能使雙鏈表的某些運算變得方便。同時雙向鍊錶也可以有迴圈表,稱為雙向迴圈鍊錶,其結構如圖2.15所示。
由於在雙向鍊錶中既有前向鏈又有後向鏈,尋找任乙個結點的直接前驅結點與直接後繼結點變得非常方便。設指標p指向雙鏈表中某一結點,則有下式成立:
p->prior->next=p=p->next->prior
在雙向鍊錶中,那些只涉及後繼指標的演算法,如求表長度、取元素、元素定位等,與單鏈表中相應的演算法相同,但對於前插和刪除操作則涉及到前驅和後繼兩個方向的指標變化,因此與單鏈表中的演算法不同。
1.雙向鍊錶的前插操作
演算法描述:欲在雙向鍊錶第i個結點之前插入乙個新的結點,則指標的變化情況如圖2.16所示。
演算法雙向鍊錶的插入操作
2.雙向鍊錶的刪除操作
演算法描述:欲刪除雙向鍊錶中的第i個結點,則指標的變化情況如圖2.17所示。
雙向鍊錶實現 插入刪除
include stdafx.h include stdio.h include stdlib.h 雙向鍊錶 結點 typedef struct nodenode 鍊錶管理 節點 typedef struct linklink 鍊錶的初始化 void inital link link 鍊錶的插入 v...
鍊錶插入刪除操作
include using namespace std 定義單向鍊錶節點 struct listnode end of listnode 將新節點插入煉表頭 void insertlist listnode head,int insertdata listnode pnode new listnod...
雙向鍊錶的插入刪除運算
include include define len sizeof struct node typedef int datatype typedef struct node dlinklist dlinklist head 雙向鍊錶的前插運算 在結點p之前 dlinklist dinsert bef...