初始化
指標域置為空(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...