日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

双向带环带头结点的链表实现栈

發(fā)布時間:2023/11/30 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 双向带环带头结点的链表实现栈 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
1. 數(shù)據(jù)結構

????利用帶頭結點帶環(huán)的結點實現(xiàn)棧的相關操作.因此, 每一個結點包括了一個前驅, 一個后繼, 還有一個數(shù)據(jù)成員

typedef char DLinkStackType;typedef struct DLinkStack {DLinkStackType data;struct DLinkStack* next;struct DLinkStack* prev; }DLinkStack;
2. 初始化

????初始化即就是先給對應的結點申請一塊內(nèi)存, 然后將結點的數(shù)據(jù)成員置為 0 (個人所好), 然后將頭結點的前驅后繼依次指向空.

void DLinkStackInit(DLinkStack** stack) {if(stack == NULL || *stack == NULL){return;//非法輸入}*stack = (DLinkStack*)malloc(sizeof(DLinkStack));(*stack) -> next = *stack;(*stack) -> prev = *stack;(*stack) -> data = 0; }

3. 入棧

????將每一個結點從鏈表的尾部插入,即先創(chuàng)建一個新結點, 然后修改新結點和最后一個結點的指向, 將新結點插入鏈表, 然后修改頭結點和新結點的指向, 便實現(xiàn)了入棧操作

void DLinkStackPush(DLinkStack* stack, DLinkStackType value) {if(stack == NULL){return;}DLinkStack* new_node = CreatNewNode(value);DLinkStack* prev = stack -> prev;prev -> next = new_node;new_node -> prev = prev;new_node -> next = stack;stack -> prev = new_node; }

4. 出棧

????將每一個結點鏈表的尾部刪除, 即修改倒數(shù)第二個結點和頭結點的指向, 然后將倒數(shù)第一個結點刪除, 這樣便可以完成出棧

void DLinkStackPop(DLinkStack* stack) {if(stack == NULL){return;//非法輸入}if(stack -> next == stack){return;//空棧}DLinkStack* to_delete = stack -> prev;DLinkStack* prev = to_delete -> prev;//stack vs prevstack -> prev = prev;prev -> next = stack;DLinkStackNodeDestroy(to_delete);to_delete = NULL; }

5. 創(chuàng)建結點
DLinkStack* CreatNewNode(DLinkStackType value) {DLinkStack* new_node = (DLinkStack*)malloc(sizeof(DLinkStack));new_node -> data = value;new_node -> next = NULL;new_node -> prev = NULL;return new_node; }
6. 取棧頂元素

????每次將頭結點的下一個結點的數(shù)據(jù)返回, 即就完成了取棧頂元素

int DLinkStackGetFront(DLinkStack* stack, DLinkStackType* value) {if(stack == NULL){return -1;//非法輸入}if(stack -> next == stack){return -1;//空棧}*value = (stack -> prev) -> data;return 0; }

7. 銷毀棧

????從鏈表的第一個結點(stack -> next)開始, 依次刪除每一個結點, 直到最后一個結點, 同時不要忘記將頭結點(傀儡結點)也刪除

void DLinkStackDestroy(DLinkStack** stack) {if(stack == NULL){return;//非法輸入}if((*stack) -> prev == *stack){DLinkStackNodeDestroy(*stack);*stack = NULL;}DLinkStack* next; DLinkStack* to_delete;int i = DLinkStackSize(*stack);for(; i > 0; i--){to_delete = (*stack) -> next;next = to_delete -> next;(*stack) -> next = next;next -> prev = *stack;DLinkStackNodeDestroy(to_delete);to_delete = NULL;}DLinkStackNodeDestroy(*stack);*stack = NULL; }


????如有錯誤,還望大家能夠隨時提出, 大家共同進步

總結

以上是生活随笔為你收集整理的双向带环带头结点的链表实现栈的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。