论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
搜索
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
只需一步,快速开始
账号登录
立即注册
找回密码
用户名
Email
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
ToB企服应用市场:ToB评测及商务社交产业平台
»
论坛
›
软件与程序人生
›
后端开发
›
Java
›
C语言数据结构:链式栈及其出入栈
C语言数据结构:链式栈及其出入栈
锦通
金牌会员
|
2024-5-18 07:41:20
|
显示全部楼层
|
阅读模式
楼主
主题
899
|
帖子
899
|
积分
2697
/********************************************************************************************************
*
*
* 实现链式栈一般是以链表作为基础,一般是把链表头部作为栈顶,方便数据的插入和删除,链式栈相当于是一个单向不循环的链表。
*
*
*
* Copyright (c) 2023-2024 a1583839363@163.com All right Reserved
* ******************************************************************************************************/
// 指的是链式栈中的结点有效数据类型,用户可以根据需要进行修改
typedef int DataType_t;
// 构造链式栈的结点,链表中所有结点的数据类型应该是相同的
typedef struct LinkedStack
{
DataType_t data; // 结点的数据域
struct LinkedStack *next; // 结点的指针域
}LStack_t;
// 创建一个空的链式栈,其中应该有一个头结点,对链式栈进行初始化
LStack_t *LStack_Create(void)
{
// 1.创建一个头结点并对头结点申请内存
LStack_t *Head = (LStack_t *)calloc(1, sizeof(LStack_t));
if (NULL == Head)
{
perror("Calloc memory for Head is Failed");
exit(-1);
}
// 2.对头结点进行初始化,头结点是不存储有效内容的!!!
Head->next = NULL;
// 3.把头结点的地址返回即可
return Head;
}
// 创建新的结点,并对新结点进行初始化(数据域 + 指针域)
LStack_t *LStack_NewNode(DataType_t data)
{
// 1.创建一个新结点并对新结点申请内存
LStack_t *New = (LStack_t *)calloc(1, sizeof(LStack_t));
if (NULL == New)
{
perror("Calloc memory for NewNode is Failed");
return NULL;
}
// 2.对新结点的数据域和指针域进行初始化
New->data = data;
New->next = NULL;
return New;
}
// 入栈
bool LStack_Push(LStack_t *Head, DataType_t data)
{
// 1.创建新的结点,并对新结点进行初始化
LStack_t *New = LStack_NewNode(data);
if (NULL == New)
{
printf("can not insert new node\n");
return false;
}
// 2.判断链式栈是否为空,如果为空,则直接插入即可
if (NULL == Head->next)
{
Head->next = New;
return true;
}
// 3.如果链式栈为非空,则把新结点插入到链式栈的头部
New->next = Head->next;
Head->next = New;
return true;
}
// 出栈
bool LStack_Pop(LStack_t *Head)
{
// 1.对链式栈的首结点的地址进行备份
LStack_t *Temp = Head->next;
// 2.判断链表是否为空,如果为空,则直接退出
if (NULL == Head->next)
{
return false;
}
// 3.链表是非空的,则直接删除首结点
Head->next = Temp->next;
Temp->next = NULL;
free(Temp);
return true;
}
// 遍历
void LStack_Print(LStack_t *Head)
{
// 对链表的头文件的地址进行备份
LStack_t *Phead = Head;
// 首结点
while (Phead->next)
{
// 把头的直接后继作为新的头结点
Phead = Phead->next;
// 输出头结点的直接后继的数据域
printf("data = %d\n", Phead->data);
}
}
int main(int argc, char const *argv[])
{
return 0;
}
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复
使用道具
举报
0 个回复
倒序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
回帖后跳转到最后一页
发新帖
回复
锦通
金牌会员
这个人很懒什么都没写!
楼主热帖
快速入手node.js
漏洞利用
vue3 - 最新详细实现 “拖曳式课程表“ ...
奇怪,为什么ArrayList初始化容量大小 ...
如何成为一位人心所向的管理者?我的经 ...
如何在文章中设置灰色文本框(正文底色 ...
八、MySQL之事务控制语言
医院HIS体系厂家统计
Vue实现复制粘贴功能
理解MVCC
标签云
存储
挺好的
服务器
快速回复
返回顶部
返回列表