演算法學習記錄 雙鏈表

2022-08-13 07:39:08 字數 2248 閱讀 1076

單鏈表缺點是每次都要從頭開始索引,不能往回索引,很自然就會想乙個辦法,希望能夠往回索引。這有雙鏈表就產生了。

0.雙鏈表結構:

typedef struct

lnodeltnode,*ptnode;

增加了乙個前驅指標,這有就可以向回索引了。

1.雙鏈表的初始化

//

1.雙向鍊錶的init

void dlist_init(ptnode*head)

2.雙鏈表的插入

通過畫圖

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...