雙向鍊錶
迴圈單鏈表的出現,雖然能夠實現從任一結點出發沿著鏈能找到其前驅結點,但時間耗費是o(
n)。如果希望從表中快速確定某乙個結點的前驅,另乙個解決方法就是在單鏈表的每個結點裡再增加乙個指向其前驅的指標域
prior
。這樣形成的鍊錶中就有兩條方向不同的鏈,我們可稱之為雙(向)鍊錶(
double linked list
)。雙鏈表的結構定義如下:
typedef struct dnode
dnode,*doublelist;
雙鏈表的結點結構如圖
2.14
所示。與單鏈表類似,雙鏈表一般也是有頭指標唯一確定的,增加頭結點也能使雙鏈表的某些運算變得方便。同時雙向鍊錶也可以有迴圈表,稱為雙向迴圈鍊錶,其結構如圖
2.15
所示。由於在雙向鍊錶中既有前向鏈又有後向鏈,尋找任乙個結點的直接前驅結點與直接後繼結點變得非常方便。設指標
p指向雙鏈表中某一結點,則有下式成立:
p->prior->next=p=p->next->prior
在雙向鍊錶中,那些只涉及後繼指標的演算法,如求表長度、取元素、元素定位等,與單鏈表中相應的演算法相同,但對於前插和刪除操作則涉及到前驅和後繼兩個方向的指標變化,因此與單鏈表中的演算法不同。
1.
雙向鍊錶的前插操作
演算法描述:欲在雙向鍊錶第
i個結點之前插入乙個新的結點,則指標的變化情況如圖
2.16
所示。int dlinkins(doublelist l,int i,elemtype e)
else
teturn false;
}演算法雙向鍊錶的插入操作
2.
雙向鍊錶的刪除操作
演算法描述:欲刪除雙向鍊錶中的第
i個結點,則指標的變化情況如圖
2.17
所示。int dlinkdel(doublelist l,int i,elemtype *e)
演算法雙向鍊錶的刪除操作
1 5 雙向鍊錶
實現 public class doublelinkedlistdemo 鍊錶操作類 class doublelinkedlist 新增節點 同單向,但有點區別,加上前乙個指標 public void add heronode2 heronode2 temp.next heronode2 heron...
20 雙向鍊錶
1 define crt secure no warnings 23 include4 include5 include67 define ok 1 8 define error 0 9 define true 1 10 define false 0 1112 typedef int elemtyp...
06 雙向鍊錶
修改 原理與單鏈表相同 刪除public class doublelinkedlist 新增結點到雙向鍊錶 追加 public void add heronode2 node 按編號順序將結點到鍊錶 如果有這個排名,則新增失敗,並給出提示 public void insertbyorder hero...