單鏈表缺點是每次都要從頭開始索引,不能往回索引,很自然就會想乙個辦法,希望能夠往回索引。這有雙鏈表就產生了。
0.雙鏈表結構:
typedef struct增加了乙個前驅指標,這有就可以向回索引了。lnodeltnode,*ptnode;
1.雙鏈表的初始化
//2.雙鏈表的插入1.雙向鍊錶的init
void dlist_init(ptnode*head)
通過畫圖
2.雙向鍊錶的插入
int dlist_insert(ptnode list,int index,int
elem)
ptnode n = (ptnode)malloc(sizeof
(ltnode));
n->data =elem;
n->pri =null;
n->next =null;
ptnode pos =list;
while(index > 0
)
n->next = pos; //
(1) n->pri = pos->pri; //
(2) pos->pri->next = n; //
(3) pos->pri = n; //
(4)list->data = list->data+1
;
return1;
}對照程式 (1)(2)(3)(4)和圖中過程看。
其中,如果插入在最後的位置,則呼叫
dlist_add(list,elem);呼叫和結果:
用insert函式建立乙個表:
int ary[10] = ;執行後:ptnode list =null;
dlist_init(&list);
prt_list(list);
getchar();
int i=0
; printf(
"create!\n");
for (i=0;i<10;i++)
prt_list(list);
getchar();
然後再呼叫插入:
3.雙鏈表的刪除
畫圖過程:
3.雙向鍊錶的刪除
int dlist_delete(ptnode list,int
index)
ptnode pos =list;
while(index > 0
)
pos->pri->next = pos->next; //(1)
pos->next->pri = pos->pri; //(2)
free(pos); //(3)
list->data = list->data-1
;
return1;
}主函式呼叫:
printf("結果:delete:\n");
dlist_delete(list,1);
prt_list(list);
dlist_delete(list,5);
prt_list(list);
完成插入和刪除操作後面,基本功能都能夠實現。
演算法學習記錄
排序演算法複雜度 層序遍歷 雙端佇列 演算法流程 特例處理 當樹的根節點為空,則直接返回空列表 初始化 列印結果空列表 res 包含根節點的雙端佇列 queue bfs 迴圈 當 queue 為空時跳出 新建列表 temp 用於臨時儲存當前層列印結果 當前層列印迴圈 迴圈次數為當前層節點數 即 qu...
資料結構與演算法學習(二) 雙鏈表
雙鏈表的結點包括3個域,乙個是存放資料資訊的info域,另外兩個是指標域,雙鏈表的結構定義如下 typedef struct dlink nodednode 雙鏈表中第乙個結點沒有前驅,它的llink域為null 最後乙個結點沒有後繼它的rlink域為null 結點中的rlink域作用和單鏈表結點的...
c語言 雙鏈表 學習記錄
dblinklist.h ifndef dblinklist h included define dblinklist h included include include include typedef int datatype int length typedef struct node dbl...