雙向鍊錶(前插操作,刪除操作)

2021-06-02 23:47:18 字數 1254 閱讀 6338

雙向鍊錶

迴圈單鏈表的出現,雖然能夠實現從任一結點出發沿著鏈能找到其前驅結點,但時間耗費是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所示。

演算法雙向鍊錶的插入操作

2.雙向鍊錶的刪除操作

演算法描述:欲刪除雙向鍊錶中的第i個結點,則指標的變化情況如圖2.17所示。

演算法雙向鍊錶的刪除操作

雙向鍊錶(前插操作,刪除操作)

迴圈單鏈表的出現,雖然能夠實現從任一結點出發沿著鏈能找到其前驅結點,但時間耗費是o n 如果希望從表中快速確定某乙個結點的前驅,另乙個解決方法就是在單鏈表的每個結點裡再增加乙個指向其前驅的指標域prior。這樣形成的鍊錶中就有兩條方向不同的鏈,我們可稱之為雙 向 鍊錶 doublelinked li...

雙向鍊錶(前插操作,刪除操作)

迴圈單鏈表的出現,雖然能夠實現從任一結點出發沿著鏈能找到其前驅結點,但時間耗費是o n 如果希望從表中快速確定某乙個結點的前驅,另乙個解決方法就是在單鏈表的每個結點裡再增加乙個指向其前驅的指標域prior。這樣形成的鍊錶中就有兩條方向不同的鏈,我們可稱之為雙 向 鍊錶 doublelinked li...

2007 08 22雙向鍊錶(前插操作,刪除操作)

雙向鍊錶 迴圈單鏈表的出現,雖然能夠實現從任一結點出發沿著鏈能找到其前驅結點,但時間耗費是o n 如果希望從表中快速確定某乙個結點的前驅,另乙個解決方法就是在單鏈表的每個結點裡再增加乙個指向其前驅的指標域 prior 這樣形成的鍊錶中就有兩條方向不同的鏈,我們可稱之為雙 向 鍊錶 double li...