資料結構和演算法 雙向鍊錶

2021-09-28 18:46:29 字數 2453 閱讀 7801

初始化

指標域置為空(null) 資料域可用可不用

前插法

插入節點插在頭節點之後 為前插法

插入節點的next = 頭節點的next

插入節點的prev = 頭節點

頭節點的next = 插入節點

判斷是否存在下乙個節點

如果 頭節點的next != null 說明存在, 就需要把下乙個節點的prev指向插入節點

如果還是不懂, 可以畫圖理解一下

尾插法

插入節點插在最後乙個節點之後 為尾插法

找到最後乙個節點

插入節點的next = null

插入節點的prev = 最後乙個節點

最後乙個節點的next = 插入節點

任意位置插入

找到要插入的位置 把插入節點插在該位置之前, 插在該位置之後也可以(不過需要判斷該位置是否存在下乙個節點, 存在就把下乙個節點的prev 指向插入節點 )

我這裡就插在該位置之前吧

插入節點的next = 該位置的節點

插入節點的prev = 該位置節點的prev節點

該位置節點的prev節點的next = 插入節點

該位置的prev = 插入節點

其他操作類似,如有不懂,可畫圖理解

注:實現了部分**,而且沒有測試**

#include

#include

#include

//雙向鍊錶的定義

typedef

int nodetype;

typedef

struct _dlinklist dlinklist, dlinknode;

//雙向鍊錶的初始化

bool

initdlink

(dlinklist*

&head)

//前插法

bool

insertfront

(dlinklist*

&head, nodetype& e)

//尾插法

bool

insertback

(dlinklist*

&head, nodetype& e)

p =new dlinknode;if(

!p)return

false

; p-

>date = e;

p->next = last-

>next;

p->prev = last;

last-

>next = p;

return

true;}

// 任意位置插入

bool

insertsite

(dlinklist*

&head, nodetype& e,

const

int i)if(

!p)return

false;

s =new dlinknode;if(

!s)return

false

; s-

>date = e;

s->next = p;

s->prev = p-

>prev;

p->prev-

>next = s;

p->prev = s;

return

true;}

//遍歷

void

dlprint

(dlinklist* head)

printf

("\n");

printf

("逆序列印");

while

(head)

printf

("\n");

}//雙向鍊錶刪除節點

bool

dlinkdelete

(dlinklist*

&head,

const

int i)if(

!p)return

false;

p->prev-

>next = p-

>next;

//判斷刪除節點, 是否存在下乙個節點, 有就執行, 沒有過濾

if(p-

>next) p-

>next-

>prev = p-

>prev;

return

true;}

//雙向鍊錶的銷毀

bool

dlinkdestroy

(dlinklist*

&head)

head =

null

;return

true

;}

資料結構與演算法 雙向鍊錶

雖然從表內第乙個節點到最後乙個節點的遍歷操作是非常簡單的,但是反向遍歷鍊錶卻不是一件容易的事情。如果為node類新增乙個欄位來儲存指向前乙個節點的連線,那麼久會使得這個反向操作過程變得容易許多。當向鍊錶插入節點的時候,為了吧資料複製給新的字段會需要執行更多的操作,但是當腰吧節點從表移除的時候就能看到...

資料結構與演算法 雙向鍊錶

typedef struct lineline line initline line head return head line insertline line head,int data,int add else 判斷條件為真,說明插入位置為鍊錶尾 if body next null else r...

資料結構與演算法 雙向鍊錶

ps 前面已經說過線性表的兩種表現形式,一種是順序,另一種是鏈式,鏈式的一種普通表現形式就是加入乙個指標,前乙個的指標指向後乙個結點的位址,那麼還有一種形式就是雙向鍊錶,裡面又加上了乙個指標變數,讓前指標變數指向直接前驅,後指標變數指向直接後繼。建立結構體 typedef struct double...