#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct StackNode{struct StackNode * next;//只维护指针域
};
//栈的链式结构体
struct Lstack{struct StackNode  header;//头结点int m_size;//栈的大小
};
typedef void* LinkStack;
//初始化栈
LinkStack Init_stack()
{struct Lstack * stack = (struct Lstack *)malloc(sizeof(struct Lstack));if (stack == NULL){return NULL;}stack->header.next = NULL;stack->m_size = 0;return stack;
}
//入栈
void Push_stack(LinkStack stack, void * data)
{if (stack == NULL){return;}if (data == NULL){return;}//入栈就是头插法struct Lstack * mystack = (struct Lstack *)stack;//把用户数据转换成“挂钩”,就是连接用的指针struct StackNode * mynode = (struct StackNode *)data;//插入节点mynode->next = mystack->header.next;mystack->header.next = mynode;mystack->m_size++;}
//出栈
void Pop_stack(LinkStack stack)
{if (stack == NULL){return;}struct Lstack * mystack = (struct Lstack *)stack;if (mystack->m_size == 0){return ;}//保存第一个有数据的节点——栈顶元素struct StackNode * pFirst = mystack->header.next;mystack->header.next = pFirst->next;mystack->m_size--;
}
//返回栈顶元素
LinkStack Top_stack(LinkStack stack)
{if (stack == NULL){return NULL;}struct Lstack * mystack = (struct Lstack *)stack;if (mystack->m_size == 0){return NULL;}return mystack->header.next;//将第一个有数据的节点返回
}
//返回栈大小
int Size_stack(LinkStack stack)
{if (stack == NULL){return -1;}struct Lstack * mystack = (struct Lstack *)stack;return mystack->m_size;
}
//判断是否为空
int Isempty_stack(LinkStack stack)
{if (stack == NULL){return -1;}struct Lstack * mystack = (struct Lstack *)stack;if (mystack->m_size == 0){return 1;}return 0;
}
//销毁栈
void Destroy_stack(LinkStack stack)
{if (stack == NULL){return;}free(stack);stack = NULL;
}
typedef struct person{struct StackNode node;char name[40];int age;
}person;
void test()
{//prepare datasperson p1 = { NULL, "aaa", 12 };person p2 = { NULL, "bbb", 13 };person p3 = { NULL, "ccc", 14 };person p4 = { NULL, "ddd", 15 };person p5 = { NULL, "eee", 16 };//初始化栈LinkStack stack = Init_stack();//入栈Push_stack(stack, &p1);Push_stack(stack, &p2);Push_stack(stack, &p3);Push_stack(stack, &p4);Push_stack(stack, &p5);int size = Size_stack(stack);printf("栈的大小为:%d\n", size);while (Isempty_stack(stack) == 0){person * pTop = (person *)Top_stack(stack);printf("姓名是:%s,年龄是:%d\n", pTop->name, pTop->age);Pop_stack(stack);}int size_t = Size_stack(stack);printf("栈的大小为:%d\n", size_t);Destroy_stack(stack);}
int main()
{test();return 0;
}

栈的链式存储结构(企业级链表)相关推荐

  1. 3.2_栈_链式存储结构(链表形式)

    [链式存储结构] 栈的链式存储结构,简称链栈. [具体实现] package com.Higgin.LinkStack;import java.util.EmptyStackException;/** ...

  2. 数据结构(二):线性表包括顺序存储结构(顺序表、顺序队列和顺序栈)和链式存储结构(链表、链队列和链栈)...

    还记得数据结构这个经典的分类图吧: 今天主要关注一下线性表. 什么是线性表 线性表的划分是从数据的逻辑结构上进行的.线性指的是在数据的逻辑结构上是线性的.即在数据元素的非空有限集中 (1) 存在唯一的 ...

  3. 链式存储mysql_链栈:栈的链式存储结构

    前面讲完了栈的顺序存储结构,我们现在来看看栈的链式存储结构,简称为链栈. 链栈是没有附加头结点的运算受限的单链表.栈顶指针就是链表的头指针. 栈是用栈顶来做插入和删除操作,那么对于链栈的栈顶放在链表的 ...

  4. 栈的链式存储结构及实现

    今天学习栈的链式存储结构. 链式存储结构最大的好处就是没有空间的限制,通过指针指向将结点像一个链子一样把结点链接,那么栈的同样可以用于链式存储结构. 栈的链式存储结构,简称为链栈.想想看,栈只是栈顶来 ...

  5. 关于栈的链式存储结构

    之前在创建栈的链式存储结构时,想当然误以为栈的top指针会指向链表的尾结点,在创建链表结构时的写法误写为: for(j=0;j<i;j++){         temp=(struct Node ...

  6. 数据结构与算法——栈的链式存储结构及实现

    目录 前言 一.栈的链式储存结构 二.栈的链式储存结构的操作 2.1   进栈操作 2.2   出栈操作 总结 前言 讲完了栈的顺序储存结构,我们现在来看看栈的链式存储结构,简称为链栈. 由于单链表中 ...

  7. 3.3 栈的链式存储结构

    <?php header("content-type:text/html;charset=utf-8"); /*** 栈的链式存储结构的基本操作**包括* 1.初始化 __c ...

  8. STL链式存储结构——————list链表

    c++的STL(标准模版库)提供了链表类的操作,称为list(表),是双向链表实现的 链式存储结构在实现插入.删除操作时不需要移动大量的数据元素.所以,链式存储结构适用于经常需要进行插入和删除操作的线 ...

  9. 栈的链式存储结构(C语言实现)

    简要 链栈就是利用单链表作为栈的存储结构,单链表的第一个节点为栈顶,而最后一个节点为栈底,链栈既可以带头节点也可以不带头节点. 实现过程 实现代码 #include<iostream> # ...

最新文章

  1. 宝塔 面板 放行端口
  2. Python SciPy教程
  3. Mybatis工作中常见关系映射总结
  4. mysql数据库服务器默认端口_各个数据库的默认端口
  5. 三通道HART / Modbus网关HTM-631
  6. 计算机网络的常用命令汇总
  7. java 热度算法_Raddit算法Java实现
  8. 使用python查找重复值
  9. SQL查询实现差集(补集)运算
  10. 通过 Amazon EFS 对 NFS 文件系统权限进行细粒度控制
  11. php导出excel列宽,PHP导出Excel 之 Spreadsheet_Excel_Writer
  12. 1076 Wifi密码
  13. Kafka eagel 网页能打开,但是登录不上
  14. 当计算机遇上经济学:如何量化你的投资并获得第一桶金
  15. 如何轻松高效开展设备巡检?
  16. 《算法导论》第十二章——二叉搜索树
  17. 【附PPT下载】2021腾讯广告算法大赛 ACM MM Grand Challenge录用论文揭晓
  18. spring源码解析,vip视频解析源码
  19. 脑波艺术DAO·dream lab
  20. 2.2 在Matlab中进行相机标定

热门文章

  1. java面向对象知识点02
  2. python怎么用gamma函数_「gamma函数」Gamma函数 - seo实验室
  3. python中如何定义数组_python中数组是如何使用的?
  4. [NLP] SentenceTransformers使用介绍
  5. RabbitMQ延迟消息:死信队列 | 延迟插件 | 二合一用法+踩坑手记+最佳使用心得
  6. Cocos2d-x《雷电大战》(2)-精灵随手指移动,你点哪我走哪!
  7. Qt判断摄像头是否被占用的一种方式
  8. getline函数详解
  9. 大屏页面三种缩放:按分辨率进行缩放、等比缩放(展示全部内容、展示部分内容和滚动条)
  10. 附完整python源码)基于tensorflow、opencv的入门案例_发票识别一:关键区域定位