帶頭結點的雙向迴圈鍊錶的基本操作

2021-09-10 01:26:11 字數 2214 閱讀 2223

定義與宣告

typedef

int datatype;

typedef

struct dlistnode

node;

void

dlistinit

(node*

* phead)

;//初始化

void

dlistpushback

(node* p, datatype data)

;//尾插

void

dlistpopback

(node* p)

;//尾刪

void

dlistpushfront

(node* p, datatype data)

;//頭插

void

dlistpopfront

(node* p)

;//頭刪

void

dlistinsert

(node* pos,datatype data)

;//在pos位址結點之前插入新的值為data的結點

node*

dlistfind

(node* p,datatype data)

;//找到值為data的結點返回結點的位址,沒有返回null

void

dlisterase

(node* pos)

;//刪除pos位址的結點

void

dlistremove

(node* p, datatype data)

;//刪除鍊錶中值為data的第乙個結點

void

dlistremoveall

(node* p, datatype data)

;//刪除鍊錶中所有值為data結點

void

listdestory

(node*

* p)

;//銷毀鍊錶

函式實現

#include

"dlist.h"

node*

buynewnode

(datatype data)

newnode->pre =

null

; newnode->next =

null

; newnode->data = data;

return newnode;

}void

dlistinit

(node*

* phead)

void

dlistpushback

(node* p, datatype data)

void

dlistpopback

(node* p)

else

}void

dlistpushfront

(node* p, datatype data)

void

dlistpopfront

(node* p)

node*

dlistfind

(node* p,datatype data)

cur = cur->next;

}return

null;}

void

dlistinsert

(node* pos, datatype data)

void

dlisterase

(node* pos)

void

dlistremove

(node* p, datatype data)

cur = cur->next;

} cur->next->pre = cur->pre;

cur->pre->next = cur->next;

free

(cur)

; cur =

null;}

void

dlistremoveall

(node* p, datatype data)

else}}

void

listdestory

(node*

* p)

free

(*p)

;*p =

null

;}

不帶頭結點的雙向迴圈鍊錶

基本概念 迴圈鍊錶 將單鏈表中最後乙個結點的next指向頭結點或者空指標,就使得整個單鏈表形成乙個環,這種頭尾相接的單鏈表稱為單迴圈鍊錶,簡稱迴圈鍊錶。雙向鍊錶 是在單鏈表的每個結點中,再設定乙個指向其前驅結點的指標域prior,在雙向鍊錶的結點中有兩個指標域,乙個next指向直接後繼,乙個prio...

實現帶頭結點的雙向迴圈鍊錶

dlist.h 帶頭節點的雙向迴圈鍊錶 為什麼要帶頭 原因是因為如果不帶頭的話,那麼頭插或者頭刪會比較麻煩 而且不帶頭的話需要傳遞二級指標,帶頭的話,只需要傳遞一級指標 為什麼給成雙向的?有乙個理由是可以逆向列印鍊錶 也就是對有些操作會簡單一些 pragma once 保證標頭檔案不會被重複包含 i...

鍊錶 帶頭結點的雙向迴圈鍊錶

還需改進 creat node這個函式應有返回型別,來判斷新建結點是否成功,不然主函式中不管成不成功都會訪問該節點成員。改了這個函式,在主函式中create node後要判斷是否成功,不成功就提示並退出函式,退出前別忘了還要釋放鍊錶!同時create link這個函式中也要判斷head是否申請成功,...