鍊錶之雙向有頭迴圈鍊錶

2021-08-20 12:14:10 字數 2627 閱讀 4093

雙向有頭迴圈鍊錶的結構體只是增加了乙個前乙個節點

typedef

struct slistnode

slistnode;

當鍊表為空是,還是有乙個節點 ,那就是頭節點,此時:

當鍊表不為空時:

雙向鍊錶的初始化:

一定要注意,鍊錶的初始化,相當於要初始化乙個節點,使它的next指向自己。它的prev也指向自己。

slistnode* slistinit()//初始化,即使是乙個空鍊錶,也要建立乙個節點,給malloc乙份記憶體

建立乙個節點:

slistnode* buynode(datatype x)

頭插:

void slistpushfront(slistnode *pphead, datatype x)//頭插

slistnode* newnode =

null;

slistnode* phead_next = (pphead)->pnext;

newnode = buynode(x);

assert(newnode);

newnode->pnext = (pphead)->pnext;

phead_next->pprev = newnode;

newnode->pprev = pphead;

(pphead)->pnext = newnode;

//slistnodeinsert(pphead, x);

}

尾插:

void slistpushback(slistnode *pphead, datatype x)//尾插

slistnode*newnode = buynode(x);

slistnode*cur = pphead;//頭

slistnode*node = pphead->pprev;//尾

newnode->pprev = node;

node->pnext = newnode;

newnode->pnext = cur;

(cur)->pprev = newnode;

//slistnodeinsert(pphead->pprev, x);

}

尾刪:

void slistnodepopback(slistnode *pphead)//尾刪

頭刪:

void slistnodepopfront(slistnode *pphead)//頭刪

在任意位置插入:

在任意位置刪除:

void slistnodeerase(slistnode *pos)//刪除指定位置

查詢某個節點:

slistnode* find(slistnode* pphead,datatype x)

}

刪除遇到的第乙個某個特定的元素:

void slistnoderemove(slistnode *pphead, datatype x)//刪除乙個指定元素

else}}

刪除所有特定的元素:

void slistnoderemoveall(slistnode *pphead, datatype x)//刪除所有指定元素

else}}

測試:

void test()

執行結果:

鍊錶之單向有頭不迴圈鍊錶

typedef struct listnode listnode 下面就是一些構造鍊錶的一些 函式,包括刪除,插入,銷毀等 建立乙個節點 listnode buynode typedate x 頭插 就是從頭節點處 插入乙個節點 void slistpushfront listnode pphead...

迴圈鍊錶,雙向鍊錶

迴圈鍊錶 迴圈鍊錶與順序鍊錶之間的區別 迴圈鍊錶最後乙個資料的next指標域不為空,而是指向頭結點,其他基本操作大體相同,只是在判斷表結束的條件變為判斷節點的引用域是否為頭引用 雙向鍊錶 author neosong date oct 10,2017 4 43 01 pm program of in...

鍊錶 雙向迴圈鍊錶

雙向迴圈鍊錶與單鏈表一樣,都是邏輯連續 物理不連續的儲存方式,但它的效果要遠遠優於單鏈表,其結構如下 雙向迴圈鍊錶首先要有乙個頭節點,頭節點中不存放資料,真正的資料從頭節點的下乙個節點開始存放 然後每乙個節點都有兩個指標,分別指向前乙個節點和後乙個節點 最後頭尾相連,就成了雙向迴圈鍊錶。includ...