演算法2 鍊錶3 雙向鍊錶

2022-05-23 05:39:11 字數 1797 閱讀 8517

雙(向)鍊錶中有兩條方向不同的鏈,即每個結點中除next域存放後繼結點位址外,還增加乙個指向其直接前趨的指標域prior。雙向鍊錶在查詢時更方便 特別是大量資料的遍歷。

注意:①雙鏈表由頭指標head惟一確定的。

②帶頭結點的雙鏈表的某些運算變得方便。

③將頭結點和尾結點鏈結起來,為雙(向)迴圈鍊錶。

形式描述:

typedef struct dlistnodedlistnode;

typedef dlistnode *dlinklist;

dlinklist head;

由於雙鏈表的對稱性,在雙鏈錶能能方便地完成各種插入、刪除操作。

注意箭頭 沒有直入框內 而是整體 代表指向的是整個結點包括 prior data next;

注意: 第⑤⑥步的順序不能改變,因為第6步操作會影響第五步;

雙鏈表上刪除結點*p自身的操作;

注意:與單鏈表上的插入和刪除操作不同的是,在雙鏈表中插入和刪除必須同時修改兩個方向上的指標。

上述兩個演算法的時間複雜度均為o(1)。

#include #include 

typedef

struct

doublelinkedlist

dlinkedlist_node;

//建立鍊錶

dlinkedlist_node*createdlink()

else

}p->next =null;

head = head ->next;

head->pre =null;

return

head;}//

順序、反序列印鍊錶

void printdlink(dlinkedlist_node *head)

printf(

"\n 逆序輸出雙向鍊錶: \n");

while

(s)

printf(

"\n \n");

}//刪除乙個結點

dlinkedlist_node* deletedlinkedlist_node(dlinkedlist_node *head,int

i)

while

(p)

p = p->next;

}printf(

"沒有找到想要刪除的資料\n");

return

head;}//

插入乙個結點

dlinkedlist_node* insertdlinkedlist_node(dlinkedlist_node *head,int

i)

while(p != null && i > p->data)//

尋找合適的插入位置

if(i < p->data)//

在鍊錶中間某處找到合適插入位置

else

//沒有找到合適的位置,只有將資料插入到鍊錶尾部

}int

main()

鍊錶家族(2) 雙向鍊錶

前面實現了乙個單鏈表,現在我們再來做乙個雙向鍊錶吧!附上單鏈表描述 和單鏈表差別非常小,只是多了乙個指標指向前乙個元素。這樣就更像我們生活中的鏈條了。typedef struct lnode lnode,linklist lnode是型別名,linklist是指向lnode型別的指標 特別說一下插入...

鍊錶 三 雙向鍊錶

前兩篇部落格中介紹的鏈式儲存結構中只有乙個指示直接後繼的指標域。因此,從單鏈表中的某個結點出發,之能向後遍歷每個結點,所尋找這個結點的直接前驅只能向用頭結點出。而若在每個結點的指標域中再加入乙個指向當前結點直接前驅的指標,就可以克服以上問題。雙向鍊錶,帶頭節點,頭的前驅為null,尾的後繼為null...

鍊錶 05 雙向鍊錶

main.cpp include include doublelinkedlist.h using namespace std int main 雙向鍊錶類 class doublelinkedlist void insert doublelinkednode doublelinkednode 新節...