在實際工作中用雙向鍊錶又更多一點, 因為雙向鍊錶比單鏈表效率更高, 雙鏈表結構複雜, 但是使用**實現以後會發現結構會帶來
很多優勢,實現反而簡單了
其實寫了單鏈表之後再看雙鏈表其實非常簡單, 只不過就是多了乙個指標域而已, 再沒有什麼特別難的地方. 我們就直接上**吧
dlist.h
#pragma once
#include #include #include typedef struct node
node;
typedef struct dlist
dlist;
//初始化
void dlistinit(dlist* dl);
//建立乙個結點
node* buynode(int val);
//銷毀
void dlistdestory(dlist* dl);
//頭插
void dlistpushfront1(dlist* dl, int x);
void dlistpushfront2(dlist* dl, int x);
//頭刪
void dlistpopfront(dlist* dl);
//尾插
void dlistpushback1(dlist* dl, int x);
void dlistpushback2(dlist* dl, int x);
//尾刪
void dlistpopback(dlist* dl);
//查詢
node* dlistfind(dlist* dl, int x);
//隨機插入
void dlistinsert(node* pos, int x);
//隨機刪除
void dlisterase(node* pos);
//移除值為val的所有元素
void dlistremove(dlist* dl, int x);
//列印
void dlistprint(dlist* dl);
realize.c
#include "dlist.h"
//初始化
void dlistinit(dlist* dl)
//申請乙個結點
node* buynode(int val)
//銷毀
void dlistdestory(dlist* dl)
free(dl->_head);
dl->_head = null;
}//頭插(1) o(1)
void dlistpushfront1(dlist* dl, int x)
//頭插(2)
void dlistpushfront2(dlist* dl, int x)
//頭刪
void dlistpopfront(dlist* dl)
//尾插(1)
void dlistpushback1(dlist* dl, int x)
//尾插(2)
void dlistpushback2(dlist* dl, int x)
//尾刪
void dlistpopback(dlist* dl)
//隨機插入
void dlistinsert(node* pos, int x)
//隨機刪除
void dlisterase(node* pos)
//移除指定value的所有元素
void dlistremove(dlist* dl, int x)
}//查詢
node* dlistfind(dlist* dl, int x)
cur = cur->_next;
} printf("%d is not exits!!!\n", x);
return null;
}//列印
資料結構 棧的雙向帶頭迴圈鍊錶實現
使用雙向帶頭迴圈鍊錶來表示棧,表頭和表尾均可表示為棧頂,這裡以表頭為棧頂為例。進行入棧操作 頭插 進行出棧操作 頭刪 include include typedef int stdatatype typedef struct lstknode listnode typedef struct stac...
資料結構 雙向迴圈帶頭結點鍊錶
前面我們寫過了不帶頭結點的單鏈表,由於沒有頭結點,在對單鏈表進行頭插 刪的時候需要傳入二級指標 在需要進行尾插 刪的時候,需要先根據頭指標找到頭結點,然後從頭往後遍歷找到最後乙個結點再進行相應操作。而我們今天要寫的雙向迴圈帶頭結點鍊錶,相對於不帶頭結點的單鏈表做增刪時,將會方便許多。typedef ...
資料結構 實現帶頭雙向迴圈鍊錶增刪查改
初始化 listnode listinit clear鍊錶 void listclear listnode phead 摧毀鍊錶 void listdestroy listnode pphead 動態申請乙個節點 並返回指標 listnode buylistnode ltdatatype x 列印 ...