1. 数据结构

    利用带头结点带环的结点实现栈的相关操作.因此, 每一个结点包括了一个前驱, 一个后继, 还有一个数据成员

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

    初始化即就是先给对应的结点申请一块内存, 然后将结点的数据成员置为 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. 入栈

    将每一个结点从链表的尾部插入,即先创建一个新结点, 然后修改新结点和最后一个结点的指向, 将新结点插入链表, 然后修改头结点和新结点的指向, 便实现了入栈操作

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. 出栈

    将每一个结点链表的尾部删除, 即修改倒数第二个结点和头结点的指向, 然后将倒数第一个结点删除, 这样便可以完成出栈

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. 创建结点
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. 取栈顶元素

    每次将头结点的下一个结点的数据返回, 即就完成了取栈顶元素

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;
}


    如有错误,还望大家能够随时提出, 大家共同进步

双向带环带头结点的链表实现栈相关推荐

  1. 数据结构之不带头结点单链表和带头结点单链表相关操作实现(C语言)

    文章目录 单链表定义 不带头结点单链表 带头结点单链表 头结点和头指针的区分 带头结点单链表优点 单链表定义 线性表的链式存储又称单链表,它是指通过一组任意的存储单元来存储线性表中的数据元素. 不带头 ...

  2. 带头结点单链表 和 不带头结点单链表的区别

    文章目录 不带头结点的操作 代码① 代码② 代码③ 代码④ 带头结点的操作 代码⑤ 下面的代码中,传递链表时,传的是头指针.如果是带头结点的链表,传递链表时,可以传头结点,具体可以看看 C语言实现-线 ...

  3. java不带头结点单链表,java带头结点的单链表

    JAVA 循环双链表的建立 import java.util.Scanner; //循环双向链表的结点类 class DuLNode { private Object data;// 存放结点值 前驱 ...

  4. 在带头结点单链表中查找最大值,将其与最后一个元素交换(交换值)

    [问题描述] 在带头结点单链表中查找最大值,将其值与最后一个元素交换,输出交换后的单链表各元素. [输入形式] 循环输入若干个整数,以字母结束输入,建立带头结点的单链表. [输出形式] 输出最大值与最 ...

  5. 小白算法积累——单链表6#带头结点单链表+递增有序

    题目:有一个带头结点的单链表L,设计一个算法使其元素递增有序. 关键字:带头结点单链表+递增有序 思路 采用直接插入排序算法的思想:就是先分理出头结点+第一个结点组成原始新链表,然后依次将后续结点摘下 ...

  6. 算法与数据结构之带头结点和不带头结点单链表存在的问题

    带头结点和不带头结点单链表注意的小细节 在写不带头结点的单链表中发现了一个问题,这个问题在带头结点的单链表中也存在,那就是值传递的问题. 首先来看一下 #include<stdio.h> ...

  7. 【问题描述】在带头结点单链表中查找最大值,将其值与最后一个元素交换,输出交换后的单链表各元素。【输入形式】循环输入若干个整数,以字母结束输入,建立带头结点的单链表。【输出形式】输出最

    [问题描述] 在带头结点单链表中查找最大值,将其值与最后一个元素交换,输出交换后的单链表各元素. [输入形式] 循环输入若干个整数,以字母结束输入,建立带头结点的单链表. [输出形式] 输出最大值与最 ...

  8. 带头结点单链表的基本使用

    1.功能说明: 1.带头结点单链表的创建      2.单链表头插      3.单链表尾插      4.单链表第i个位置插入      5.单链表输出      6.单链表删除第i个位置结点   ...

  9. 创建带头结点单链表实现二进制数加1的运算

    题目描述: 建立一个带头结点的线性链表,用以存放输入的二进制数,链表中每个结点的data域存放一个二进制位.在此链表上实现对二进制数加1的运算,并输出运算结果. 测试数据1: 1010011 测试数据 ...

最新文章

  1. 给IIS添加CA证书以支持https
  2. 86岁还在录网课:MIT教授Gilbert Strang最新「线性代数」课程上线
  3. 视频动作识别--Temporal Segment Networks: Towards Good Practices for Deep Action Recognition
  4. python中文字符串编码_浅谈python下含中文字符串正则表达式的编码问题
  5. 如何快速完成整理笔记?
  6. aps后缀是什么文件_APS审核真的取消了么?
  7. 多维标度法MDS古典解的证明与R语言实现
  8. html表格列平分行,CSS布局问题 , 如何实现一行多列div,类似于表格
  9. OPPO 回应“不务正业”生产口罩;旧款 iPhone 降速被罚 2500 万欧元;Angular 9.0.0 发布| 极客头条...
  10. kali升级python3.6_kali下将Python2.x切换至Python3.x
  11. Eye Tracking Methodology Theory and Practice, Third Edition
  12. 中公教育python培训讲师面试题_中公教育面试经验
  13. getwmi php 报错,调用win32_service类就报错“get-wmiobject :常规故障”,这是wmi类损坏?...
  14. Java 根据身份证号获取性别、年龄、出生日期等信息
  15. origin软件画流程图_免费的网络拓扑流程图绘制软件(PaceStar LanFlow)
  16. Jenkins配置定时任务
  17. 一颗 “不安分” 的螺丝钉
  18. 交换机Meth0是什么端口,啥作用?
  19. mui分页控件数据绑定封装
  20. 效率评价方法--DEA评价效率方法

热门文章

  1. 三、 将DataTable 转换为List
  2. mongodb地理空间索引原理阅读摘要
  3. Python服务器开发三:Socket
  4. 对于shell脚本参数获取时的一点小技巧
  5. Gridview一次更新所有记录
  6. mysql .pdb是什么文件_计算广告算法到底要做什么?
  7. python重启路由器_Python3控制路由器——使用requests重启极路由.py
  8. mac懒人版_这些实用的Mac软件你迟早会用到,建议收藏!
  9. mysql教程目录_MySql目录(二)
  10. C学习杂记(三)笔试题:字符串大小写字母切换