資料結構 雙向鍊錶(不迴圈)

2021-09-25 19:45:50 字數 3885 閱讀 3463

1、雙向鍊錶的定義:雙向鍊錶也是鍊錶的一種,它每個資料結點中都有兩個結點,分別指向其直接前驅和直接後繼。所以我們從雙向鍊錶的任意乙個結點開始都可以很方便的訪問其前驅元素和後繼元素。

2、雙向鍊錶的節點結構:

3、雙向鍊錶的儲存結構:

雙向鍊錶也是採用的鏈式儲存結構,它與單鏈表的區別就是每個資料結點中多了乙個指向前驅元素的指標域 ,它的儲存結構如下圖:

4、當雙向鍊錶只有乙個節點的時候它的儲存結構:

5、雙向鍊錶的實現與操作:

(1)dlist.h:

#pragma once

//帶頭節點的雙向鍊錶,不迴圈

//鍊錶尾節點的next為null,頭節點的prio為null

typedef struct dnode

dnode,*dlist;

//初始化

void initlist(dlist plist);

//頭插法

bool insert_head(dlist plist,int val);

//尾插法

bool insert_tail(dlist plist,int val);

//在pos下標插入資料val

bool insert_pos(dlist plist,int pos,int val);

//查詢,找到返回節點位址,沒有找到返回null

dnode *search(dlist plist,int key);

//刪除第乙個key對應的節點

bool delete(dlist plist,int key);

//刪除第乙個資料節點,並通過rtval獲得刪除的值

bool delete_head(dlist plist,int *rtval);

//刪除最後乙個資料節點,並通過rtval獲得刪除的值

bool delete_tail(dlist plist,int *rtval);

//獲取長度,統計資料節點的個數

int getlength(dlist plist);

//判空

bool isempty(dlist plist);

//清除所以資料

void clear(dlist plist);

//銷毀所有節點

void destroy(dlist plist);

//列印

void show(dlist plist);

//反轉

void reverse(dlist plist);

(2)dlist.cpp:

#include #include #include #include "dlist.h"

//初始化

void initlist(dlist plist)

plist->prio = null;

plist->next = null;

}static dnode *buynode(int val)

//頭插法

bool insert_head(dlist plist,int val)

p->next = plist->next;

p->prio = plist;

plist->next = p;

return true;

}//尾插法

bool insert_tail(dlist plist,int val)

//在pos下標插入資料val

bool insert_pos(dlist plist,int pos,int val)

dnode *p = buynode(val);

dnode *q;

int i;

for(i = 0,q = plist;q->next != null && i < pos;i++,q = q->next);

p->next = q->next;

p->prio = q->next->prio;

q->next->prio = p;

q->next = p;

return true;

}//查詢,找到返回節點位址,沒有找到返回null

dnode *search(dlist plist,int key)

} return null;

}//刪除第乙個key對應的節點

bool delete(dlist plist,int key)

p->prio->next = p->next;

//只有當p的後繼節點存在時才能將p的後繼節點的前驅改變

if(p->next != null)

free(p);

return true;

}//刪除第乙個資料節點,並通過rtval獲得刪除的值

bool delete_head(dlist plist,int *rtval)

if(plist->next == null)

dnode *p = plist->next;

plist->next = p->next;

if(p->next != null)

if(rtval = null)

*rtval = p->data;

free(p);

return true;

}//刪除最後乙個資料節點,並通過rtval獲得刪除的值

bool delete_tail(dlist plist,int *rtval)

if(plist->next == null)

dnode *p;

for(p = plist;p->next != null;p = p->next)

p->prio->next = p->next;

p->next->prio = p->prio;

free(p);

return true;

}//獲取長度,統計資料節點的個數

int getlength(dlist plist)

return count;

}//判空

bool isempty(dlist plist)

return false;

}//清除所有資料

void clear(dlist plist)

//銷毀所有節點

void destroy(dlist plist)

}//列印

void show(dlist plist)

printf("\n");

}//反轉

void reverse(dlist plist)

dnode *p = plist->next;//第乙個資料節點

dnode *q;

for(q = plist;q->next != null;q = q->next);//最後乙個資料節點

int len = getlength(plist);

for(int i = 0;i < len/2;i++)

}

(3)main.cpp:

#include #include "dlist.h"

int main()

show(&head);

delete(&head,9);

delete(&head,5);

delete(&head,0);

show(&head);

reverse(&head);

show(&head);

return 0;

}

資料結構 雙向迴圈鍊錶

近期我在學習資料結構,於是我自己整理了單鏈表 迴圈單鏈表 雙向鍊錶 雙向迴圈鍊錶的相關 以鞏固這段時間的學習,也希望能夠幫助初學者,希望大家在閱讀以下 時發現問題糾正於我,一起 cycdoublelist.h ifndef cycdoublelish h define cycdoublelish h...

資料結構 雙向迴圈鍊錶

typedef struct node node,pnode pnode init dc list void 雙向迴圈鍊錶的初始化 pnode new node int dat 新建乙個節點 把位址為pnew的節點插入到雙向迴圈鍊錶的尾部 頭節點的前面 bool list add tail pnod...

資料結構 雙向鍊錶,迴圈鍊錶

也許是自己太小看資料結構,練習了幾天還在第二章徘徊,可自己覺得基礎還是要打牢的好 總結一下 第乙個是雙向鍊錶,include include typedef struct node node,linklist void creat linklist l else int insert linklis...