資料結構 雙向鍊錶

2021-08-15 20:04:19 字數 3699 閱讀 1941

帶頭節點的雙向鍊錶

dlinklist.h

#pragma once

#include #include #include typedef int dlinktype;

typedef struct dlinknode dlinknode;

void dlinklistinit(dlinknode** head);//初始化鍊錶

dlinknode* dlinklistpushback(dlinknode* head, dlinktype value);//尾插資料

void dlinlistpopback(dlinknode* head);//尾刪

void dlinklistpushfront(dlinknode* head, dlinktype value);//頭插

void dlinklistpopfront(dlinknode* head);//頭刪

dlinknode* dlinklistfind(dlinknode* head, dlinktype to_find);//查詢資料

/***@brief 往指定位置之前插入乙個元素

*/void dlinklistinsert(dlinknode* pos, dlinktype value);//在指定位置前插入資料

/***@brief 往指定位置之後插入乙個元素

*/void dlinklistinsertafter(dlinknode* pos, dlinktype value);//在指定位置之後插入資料

dlinklist.c

#include

"dlinklist.h"

dlinknode* creatnode(dlinktype value)

dlinknode* destroynode(dlinknode *ptr)

void dlinklistinit(dlinknode** head)

*head = creatnode(0);

(*head)->next =

*head;

(*head)->prev =

*head;

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

dlinknode* new_node=creatnode(value);

dlinknode* new_node_next = head;

dlinknode* new_node_prev = head->prev;

new_node->next = new_node_next;

new_node_prev->next = new_node;

new_node_next->prev = new_node;

new_node->prev = new_node_prev;

return new_node;

}void dlinlistpopback(dlinknode* head)

dlinknode* to_delete = head->prev;

dlinknode* to_delete_next = head;

dlinknode* to_delete_prev = to_delete->prev;

to_delete_next->prev = to_delete_prev;

to_delete_prev->next = to_delete_next;

destroynode(to_delete);

}void dlinklistpushfront(dlinknode* head, dlinktype value)

dlinknode* new_node = creatnode(value);

dlinknode* new_node_next = head->next;

dlinknode* new_node_prev = head;

new_node->next = new_node_next;

new_node->prev = new_node_prev;

new_node_next->prev = new_node;

new_node_prev->next = new_node;

}void dlinklistpopfront(dlinknode* head)

dlinknode* to_delete = head->next;

dlinknode* to_delete_prev = head;

dlinknode* to_delete_next = to_delete->next;

to_delete_prev->next = to_delete_next;

to_delete_next->prev = to_delete_prev;

destroynode(to_delete);

}dlinknode* dlinklistfind(dlinknode* head, dlinktype to_find)

dlinknode* cur = head->next;

for (; cur != head; cur = cur->next)

return

null;

}void dlinklistafter(dlinknode* pos, dlinktype value)

dlinknode* new_node = creatnode(value);

dlinknode* new_node_prev = pos;

dlinknode* new_node_next = pos->next;

new_node_next->prev = new_node;

new_node_prev->next = new_node;

new_node->next = new_node_next;

new_node->prev = new_node_prev;

}void dlinklistinsert(dlinknode* pos, dlinktype value)

dlinknode* new_node = creatnode(value);

dlinknode* new_node_next = pos;

dlinknode* new_node_prev = pos->prev;

new_node_prev->next = new_node;

new_node_next->prev = new_node;

new_node->next = new_node_next;

new_node->prev = new_node_prev;

}//以下是測試**

///#define test_header printf("\n*****====%s*****===\n",__function__)

void dlinklistprint(dlinknode* head, const char* s)

printf("\n");

return;

}void testpushback()

void testpopback()

void testpushfront()

void testpopfront()

void testfind()

void testinsert()

void testafter()

int main()

資料結構 鍊錶 雙向鍊錶

注意typedef的定義結構,以及dinklist的資料型別 typedef struct dnode dnode,dinklist 注意插入第乙個結點時,prior指標的空指向問題 if l next null 若l後繼結點為空 則省略該步驟 l next prior p 基本 頭插法建立雙向鍊錶...

資料結構 雙向鍊錶

前幾天寫了乙個單向鍊錶,今天參考自己單向鍊錶改寫了乙個雙向非迴圈鍊錶,下面只討論雙向非迴圈鍊錶。雙向非迴圈鍊錶有如下特點 一 雙向鍊錶每個結點都有乙個前驅指標和後驅指標 當然頭結點和尾結點除外 二 雙向鍊錶中的任意乙個結點開始,都可以很方便地訪問它的前驅結點和後繼結點。三 頭結點只有後驅指標沒有前驅...

資料結構 雙向鍊錶

單鏈表的單向性 只能從頭結點開始高效訪問鍊錶中的資料元素。單鏈表還存在另乙個缺陷 逆序訪問時候的效率極低。如下 linklistlist for int i 0 i 5 i for int i list.length 1 i 0 i 根據大o推算法可以得出乙個for迴圈的時間複雜度為o n get ...