#ifndef _MY_LINKSTACK_H_
#define _MY_LINKSTACK_H_typedef void LinkStack;//创建链表栈
LinkStack* LinkStack_Create();//销毁链表栈
int LinkStack_Destroy(LinkStack** stack);//清空链表栈
int LinkStack_Clear(LinkStack* stack);//压栈
int LinkStack_Push(LinkStack* stack, void* item);//出栈
void* LinkStack_Pop(LinkStack* stack);//获取栈顶元素
void* LinkStack_Top(LinkStack* stack);//获取栈的大小
int LinkStack_Size(LinkStack* stack);#endif //_MY_LINKSTACK_H_

//链式栈代码实现
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include"LinkList.h"//调用链表动态库
#include"linkstack.h"/*
自己构造结构体的必要性
链表栈是调用线性链表动态库实现的  线性链表必须要求结构体中有LinkNode类型的属性
但是用户未必会让自己的结构体带这个属性,必须由栈实现方法里带上
*/
typedef struct _TLinkStack{LinkNode node;void * item;
}TLinkStack;//创建链表栈
LinkStack* LinkStack_Create(){return (LinkStack*)LinkList_Create();
}//销毁链表栈
int LinkStack_Destroy(LinkStack** stack){int ERRO_MSG = 0;/*删除的时候,先清空链表,然后再删除*/ERRO_MSG=LinkStack_Clear(*stack);//销毁链表ERRO_MSG = LinkList_Destroy(stack);return ERRO_MSG;
}//清空链表栈
/*
因为TLinkStack是我们帮用户创建的,不是用户自己的结构体,所以用户不可能会释放,只能由我们来实现必须循环遍历  一个个的删除
*/
int LinkStack_Clear(LinkStack* stack){int ERRO_MSG = 0;while (LinkList_Length(stack)){//一个个删除元素  从第一个开始删除  减少遍历次数TLinkStack * temp = (TLinkStack *)LinkList_Delete(stack, 0);if (temp!=NULL){free(temp);temp = NULL;}}//将元素个数置零ERRO_MSG = LinkList_Clear(stack);return ERRO_MSG;
}//压栈
/*
对于链表而言,从尾部插入,需要遍历前面的所有节点,还是从头结点插入比较效率
*/
int LinkStack_Push(LinkStack* stack, void* item){int ERRO_MSG = 0;//临时变量必须mallocTLinkStack * tstack = (TLinkStack *)malloc(sizeof(TLinkStack));if (tstack==NULL){ERRO_MSG = -1;printf("分配内存失败!erro msg:%d \n", ERRO_MSG);return ERRO_MSG;}//初始化内存memset(tstack, 0, sizeof(TLinkStack));//将用户数据赋值到内存中tstack->item = item;//用头插法插入元素ERRO_MSG=LinkList_Insert(stack, (LinkNode *)tstack, 0);return ERRO_MSG;
}//出栈
void* LinkStack_Pop(LinkStack* stack){//删除栈顶元素TLinkStack *tstack = (TLinkStack *)LinkList_Delete(stack, 0);//定义返回变量void * ret = NULL;if (tstack!=NULL){ret = tstack->item;free(tstack);tstack = NULL;}return ret;
}//获取栈顶元素
void* LinkStack_Top(LinkStack* stack){//定义返回变量void * ret = NULL;//获取第0个节点元素TLinkStack *tstack = (TLinkStack *)LinkList_Get(stack, 0);if (tstack!=NULL){ret = tstack->item;}return ret;
}//获取栈的大小
int LinkStack_Size(LinkStack* stack){return LinkList_Length(stack);
}

//链表栈的测试代码
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include"linkstack.h"typedef struct _Student{char name[30];int age;
}Student;void Test(){Student s1, s2, s3, s4, s5;int numx = 0, i = 0, ret = 0;strcpy(s1.name, "小米");s1.age = 11;strcpy(s2.name, "小刚");s2.age = 12;strcpy(s3.name, "小红");s3.age = 10;strcpy(s4.name, "啸天");s4.age = 13;strcpy(s5.name, "莲华");s5.age = 12;LinkStack *stack = NULL;//创建栈stack = LinkStack_Create();//压栈ret = LinkStack_Push(stack, &s1);if (ret != 0){printf("入栈失败!\n");return;}ret = LinkStack_Push(stack, &s2);if (ret != 0){printf("入栈失败!\n");return;}ret = LinkStack_Push(stack, &s3);if (ret != 0){printf("入栈失败!\n");return;}ret = LinkStack_Push(stack, &s4);if (ret != 0){printf("入栈失败!\n");return;}ret = LinkStack_Push(stack, &s5);if (ret != 0){printf("入栈失败!\n");return;}numx = LinkStack_Size(stack);//出栈for (i = 0; i < numx; i++){Student *temp = (Student *)LinkStack_Pop(stack);printf("我的名字是%s;我的年龄是%d\n", temp->name, temp->age);}//清空栈ret = LinkStack_Clear(stack);if (ret != 0){printf("销毁链表失败!\n");return;}//销毁栈LinkStack_Destroy(&stack);
}void main(){Test();system("pause");
}

转载于:https://www.cnblogs.com/zhanggaofeng/p/5697502.html

数据结构 线性链表栈相关推荐

  1. python单链表实现具体例子_Python实现数据结构线性链表(单链表)算法示例

    本文实例讲述了Python实现数据结构线性链表(单链表)算法.分享给大家供大家参考,具体如下: 初学python,拿数据结构中的线性链表存储结构练练手,理论比较简单,直接上代码. #!/usr/bin ...

  2. C++数据结构之链表栈

    这里我们通过C++实现一个链表栈结构,内核是链表,但是需要遵循栈的规则,并包含初始化空栈,判断栈是否为空,判断栈是否已满,插入元素,删除元素,获取栈顶元素,具体操作如下所示: 堆栈的基本操作 初始化空 ...

  3. C++ 数据结构 线性链表

    #pragma once 减少头文件组合,降低编译出错的概率 作用等效于 #ifndef FUNC_H #define FUNC_H代码主体#endif 线性表的定义 排队问题 简单的线性表 (物理 ...

  4. 2021-9-下旬 数据结构-线性表- 栈 -java代码实现(复习用)

    import java.util.ArrayList; import java.util.List; //栈的本质就是线性表,因为总在线性表的表尾端进行操作(出栈入栈),其重要特性为FILO先进后出 ...

  5. 数据结构 线性存储 -- 栈 讲解

    1.栈的定义 我们有时会听到这句话,  静态定义的内存是在栈中分配的, 动态内存是在堆里面分配的. 例如下面这个简单的函数: int f(int k){ int m = 2 * k;int * p = ...

  6. c语言数据结构linklist用法,C语言数据结构-线性链表LinkList

    1. 头结点表示链表中第一个结点的存储位置 2. 最后一个结点的存储位置为空(NULL); #ifndef __LINKLLIST_H__ #define __LINKLLIST_H__ #defin ...

  7. 常见数据结构和算法实现(排序/查找/数组/链表/栈/队列/树/递归/海量数据处理/图/位图/Java版数据结构)

    常见数据结构和算法实现(排序/查找/数组/链表/栈/队列/树/递归/海量数据处理/图/位图/Java版数据结构) 数据结构和算法作为程序员的基本功,一定得稳扎稳打的学习,我们常见的框架底层就是各类数据 ...

  8. 黑马程序员 C语言数据结构与算法之线性表(链表/栈/队列/顺序表)

    C语言 链表基础知识清晰讲解(黑马) 讲的蛮好,就是音质不太好,有时听不清讲的啥! [黑马]数据结构与算法之线性表(链表/栈/队列/顺序表)[配套源码 嘛蛋,看错了,这是java的... 文章目录 链 ...

  9. c语言用两个栈构造队列伪码,数据结构习题线性表栈队列.doc

    数据结构习题线性表栈队列 线性表(58) 1. 在单链表.双链表和单循环链表中,若仅知道指针p指向某结点,不知道头指针,能否将结点*p从相应的链表中删去?若可以,其时间复杂度各为多少? 2.设线性表的 ...

最新文章

  1. golang goland报错错误 $GOPATH/go.mod exists but should not 解决方法
  2. dokuwiki导航的研究
  3. word编辑论文技巧
  4. Java软件开发:自定义MyBatis持久层框架
  5. 在linux下,如何在C语言中使用正则表达式
  6. AngularJS案例:简单计算
  7. c位边上还有什么位_会议桌C位,是它!
  8. DataSet 读取Oracle 数据
  9. 再看序列化与反序列化[转]
  10. 米家扩展程序初始化超时_一套完整的PLC程序是什么样子
  11. opencv(10)图像变换之边缘检测
  12. java俄罗斯方块代码_俄罗斯方块java源代码提供
  13. ChIP-Atlas:基于公共chip_seq数据进行分析挖掘
  14. 2022年R2移动式压力容器充装操作证考试题库及答案
  15. java60秒倒计时
  16. Excel 技巧百例:数据透视表的简单使用-行列转换
  17. 梯度提升(Gradient Boosting)算法
  18. SQLserver中的内连接和左连接
  19. Java获取IP和端口(Linux)
  20. UVA1626 / ZOJ1463 Brackets sequence 区间DP

热门文章

  1. 解决spring整合mybatis时错误 ‘org.mybatis.spring.mapper.MapperScannerConfigurer#0‘
  2. 安装mysql初始化date_0001_mysql 5.7.25安装初始化
  3. mysql保存特殊表情_让 MySQL 支持 emoji 表情等特殊字符存储
  4. CentOS 6 rpm方式安装mysql
  5. java短链接_java 生成短链接
  6. python敏感词过滤代码简单_大型企业都在用,Python实现敏感词过滤
  7. java encode in ansi_Java应用中的编码问题
  8. 10 i lt shell的if_shell脚本----if(数字条件,字符串条件,字符串为空)
  9. python提高运行效率_提高 Python 运行效率的六个窍门
  10. getparameter方法中文显示问号解决方法_电脑显示器花屏怎么办 电脑显示器花屏解决方法【原因分析】...