帶頭雙向迴圈鍊錶

2021-09-19 09:22:17 字數 3433 閱讀 6164

首先,我們來看一下帶頭雙向迴圈鍊錶的結構:

目錄

帶頭雙向迴圈鍊錶結點的定義:

相關操作介面:

1、初始化 && 獲取乙個結點

2、銷毀鍊錶 

3、尾插

4、頭插

5、指定元素查詢

6、任意位置插入

7、 尾刪

8、頭刪

9、任意位置刪除

10、列印鍊錶

附上完整**:

typedef int datatype;

typedef struct node

node, *pnode, *plist;

邏輯:因為實現的是帶頭結點的雙向迴圈鍊錶,所以初始化的時候,我們得到乙個空的結點,它的 next 和 prev 都指向它自己。獲取結點就是靠動態開闢空間。

pnode buynode(datatype d)

ptr->data = d;

ptr->next = null;

ptr->prev = null;

return ptr;

}plist initlist()

邏輯:遍歷逐個銷毀。

void destorylist(plist plist)

}

邏輯:記錄好最後乙個結點和頭結點。

void pushback(plist plist, datatype d)

邏輯:記錄好第乙個結點和頭結點。

void pushfront(plist plist, datatype d)

邏輯:遍歷比較是否有指定元素,注意不要造成死迴圈。

pnode findlist(plist plist, datatype d)

cur = cur->next;

} return null;

}

邏輯:記錄好指定位置的前乙個結點和後乙個結點。

void insertlist(pnode pos, datatype d)

邏輯:記錄好頭結點和倒數第二個結點。注意鍊錶是否只有頭結點,如果只有頭結點,不可以刪除。

void popback(plist plist)

邏輯:記錄好頭結點和第二個結點。注意鍊錶是否只有頭結點,如果只有頭結點,不可以刪除。

void popfront(plist plist)

邏輯:記錄好指定位置的前乙個結點和後乙個結點。注意鍊錶是否只有頭結點,如果只有頭結點,不可以刪除。

void eraselist(pnode pos)

邏輯:遍歷列印。

void printlist(plist plist)

printf("head\n");

}

總結:所有介面的實現,畫圖可以更好的讓我們了解介面實現的邏輯,並且雙向迴圈鍊錶介面的實現都是很簡單的,無論是插入刪除,效率都是比較高的。

dlist.h

#ifndef __dlist_h__

#define __dlist_h__

#include #include #include typedef int datatype;

typedef struct node

node, *pnode, *plist;

plist initlist();

void destorylist(plist plist);

pnode buynode(datatype d);

void pushback(plist plist, datatype d);

void pushfront(plist plist, datatype d);

pnode findlist(plist plist, datatype d);

void insertlist(pnode pos, datatype d);

void popback(plist plist);

void popfront(plist plist);

void eraselist(pnode pos);

void printlist(plist plist);

#endif //__dlist_h__

dlist.c

#include "dlist.h"

pnode buynode(datatype d)

ptr->data = d;

ptr->next = null;

ptr->prev = null;

return ptr;

}plist initlist()

void destorylist(plist plist)

}void pushback(plist plist, datatype d)

void pushfront(plist plist, datatype d)

pnode findlist(plist plist, datatype d)

cur = cur->next;

} return null;

}void insertlist(pnode pos, datatype d)

void popback(plist plist)

void popfront(plist plist)

void eraselist(pnode pos)

void printlist(plist plist)

printf("head\n");

}

test.c

#include "dlist.h"

void pushbacktest()

void pushfronttest()

void findlisttest()

else

destorylist(plist);

}void insertlisttest()

else

destorylist(plist);

}void popbacktest()

void popfronttest()

void eraselisttest()

else

destorylist(plist);

}int main()

帶頭雙向迴圈鍊錶

帶頭雙向迴圈鍊錶的增刪查改實現 帶頭 雙向 迴圈鍊錶增刪查改實現 typedef int ltdatatype typedef struct listnode listnode 建立乙個新節點 listnode buylistnode ltdatatype x 建立返回鍊錶的頭節點 listnode...

雙向迴圈帶頭節點鍊錶

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

帶頭雙向迴圈鍊錶增刪操作

標頭檔案list.h存放函式宣告 ifndef list h define list h include include include typedef int ltdatatype typedef struct listnodelistnode typedef struct listlist 初始...