帶頭節點的雙向列表

2021-08-19 14:09:17 字數 4848 閱讀 6072

雙向列表都有乙個前驅和乙個後繼,新增或者刪除節點可以使用雙向列表的這乙個特性去做。

.h#pragma once //防止標頭檔案重複定義

#include

#include

#include

typedef char dlinktype; 

typedef struct dlinknode dlinknode;

//初始化函式 

void dlinklistinit(dlinknode** phead); 

//鍊錶尾插 

dlinknode* dlinklistpushback(dlinknode* head, dlinktype value); 

//鍊錶尾刪 

void dlinklistpopback(dlinknode* head);

//煉表頭插 

void dlinklistpushfront(dlinknode* head, dlinktype value);

//煉表頭刪 

void dlinklistpopfront(dlinknode* head); 

//查詢指定元素的位置 

dlinknode* dlinklistfind(dlinknode* head, dlinktype value); 

// 在指定位置之前插入元素 

void dlinklistinsert(dlinknode* head, dlinknode* pos, dlinktype value);

// 在指定位置之後插入元素

void dlinklistinsertafter(dlinknode* head, dlinknode* pos, dlinktype value); 

//刪除指定位置的元素

void dlinklisterase(dlinknode*head, dlinknode* to_delete); 

//刪除指定值的元素 

void dlinklistremove(dlinknode* head, dlinktype to_remove);

//刪除指定值的所有元素 

void dlinklistremoveall(dlinknode* head, dlinktype to_remove);

//求鍊錶的長度 

size_t dlinklistsize(dlinknode* head); 

//判斷鍊錶是否為空

int dlinklistempty(dlinknode* head); #include"dlinknode.h"//建立新節點 

dlinknode* dlinknodecreat(dlinktype value) 

//銷毀節點 

void dlinknodedestroy(dlinknode* node) 

//初始化函式

void dlinklistinit(dlinknode** phead) 

*phead = dlinknodecreat(0); //建立乙個不具有實際意義的頭節點, 

(*phead)->next = *phead; 

(*phead)->prev = *phead; } //鍊錶尾插

dlinknode* dlinklistpushback(dlinknode* head, dlinktype value) 

dlinknode* new = dlinknodecreat(value);

dlinknode* tail = head->prev; //head 2-2 

new->next = head;

head->prev = new; //tail 2-2

tail->next = new; 

new->prev = tail; 

return new; } //鍊錶尾刪 

void dlinklistpopback(dlinknode* head)

if (head->next == head || head->prev == head)

dlinknode* lastone = head->prev;

dlinknode* lasttwo = lastone->prev; 

lasttwo->next = head;

head->prev = lasttwo; 

dlinknodedestroy(lastone);

} //煉表頭插 

void dlinklistpushfront(dlinknode* head, dlinktype value)

dlinknode* new = dlinknodecreat(value); 

dlinknode* second = head->next; // sencond new

new->next = second;

second->prev = new; // head new 

head->next = new;

new->prev = head; } //煉表頭刪

void dlinklistpopfront(dlinknode* head)

if (head->next == head || head->prev == head) 

dlinknode* second = head->next; 

dlinknode* third = second->next;

head->next = third; 

third->prev = head;

dlinknodedestroy(second);

} //查詢指定元素的位置

dlinknode* dlinklistfind(dlinknode* head, dlinktype to_find)

dlinknode* cur = head->next;

while (cur != head)

cur = cur->next; 

} return null;

} // 在指定位置之前插入元素

void dlinklistinsert(dlinknode* head, dlinknode* pos, dlinktype value)

dlinknode* pospre = pos->prev;

dlinknode* new = dlinknodecreat(value); //pospre new 

new->prev = pospre; 

pospre->next = new; //new pos

new->next = pos;

pos->prev = new;

} // 在指定位置之後插入元素

void dlinklistinsertafter(dlinknode* head, dlinknode* pos, dlinktype value) 

dlinknode* new = dlinknodecreat(value);

dlinknode* posafter = pos->next; // pos new 

pos->next = new; 

new->prev = pos; //new posafter

new->next = posafter;

posafter->prev = new;

} //刪除指定位置的元素

void dlinklisterase(dlinknode*head, dlinknode* to_delete) 

dlinknode* after = to_delete->next;

dlinknode* before = to_delete->prev;

before->next=after; 

after->prev = before; 

dlinknodedestroy(to_delete); } //刪除指定值的元素

void dlinklistremove(dlinknode* head, dlinktype to_remove)

dlinknode* pos = dlinklistfind(head, to_remove); 

dlinklisterase(head, pos); } //刪除指定值的所有元素 

void dlinklistremoveall(dlinknode* head, dlinktype value) 

dlinknode* cur = head->next;

while (cur != head)

cur = cur->next;}} 

#include"dlinknode.h" 

#define function() printf("****** %s ***********\n",__function__) ; 

void printchar(dlinknode* head, const char *msg) 

dlinknode* cur = head->next; //正序列印 

while (cur != head) 

printf("\n"); //逆序列印 

dlinknode* ret = head->prev;

while (ret != head) 

printf("\n");

} void testdinit()  

void testpushback() 

void testpopback()

void testpushfront()

void testpopfront()

void testfind()  

void testinsert() 

void testinsertafter() 

void testerase()

void testremove() 

void testremoveall()

雙向帶環帶頭節點的鍊錶

建立乙個雙向鍊錶的節點 class listnode 關於頭插 如何將鍊錶列印出來 public void display system.out.println system.out.println 反向 system.out.print for listnode cur head.prev cur...

雙向鍊錶的實現(帶頭傀儡節點)

有注釋 class listnode public listnode int val public class doublelinkedlist 頭插法 public void addfirst int data node.next this.dummyhead.next this.dummyhea...

雙向迴圈帶頭節點鍊錶

include include struct dblnode typedef struct dblnode dblnode typedef struct dblnode dbllink void create link dbllink head 建立鍊錶 void create newnode db...