news 2026/6/10 7:37:34

不带头节点的链式存储实现链栈

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
不带头节点的链式存储实现链栈

1.先创建一个结构体类型,有数据域和指针域

typedef struct LNode { int data; struct LNode* next; }LNode,*LinkStack;

2.以头节点为栈口进行操作进栈和出栈

头节点进栈

int HeadPush(LinkStack* Ps, int elem) { if ((*Ps) == NULL) { (*Ps) = (LNode*)malloc(sizeof(LNode)); if ((*Ps) == NULL) { return 1; } (*Ps)->data = elem; (*Ps)->next = NULL; return 0; } LNode* s = (LNode*)malloc(sizeof(LNode)); if (NULL ==s) { return 1; } s->data = elem; s->next = (*Ps); (*Ps) = s; return 0; }

头节点出栈

int HeadPop(LinkStack* Ps)//头节点出栈 { if ((*Ps) == NULL) { return 1; } LNode* p = (*Ps); (*Ps) = (*Ps)->next; free(p); return 0; } LNode* GetTail(LinkStack* Ps) { LNode* p = (*Ps); if (NULL == p) { return p; } while (p->next) { p = p->next; } return p; }

3.以尾节点为栈口进行操作进栈和出栈,因为是不带头节点的链栈,在处理尾节点的时候需要考虑到没有头节点,需要进行特殊处理

尾节点进栈

int TailPush(LinkStack*Ps,int elem) { if ((*Ps) == NULL) { (*Ps) = (LNode*)malloc(sizeof(LNode)); if ((*Ps) == NULL) { return 1; } (*Ps)->next = NULL; (*Ps)->data = elem; return 0; } LNode* p = GetTail(Ps);//得到了最后一个非空的节点 LNode* s = (LNode*)malloc(sizeof(LNode)); if (NULL == s) { return 1; } s->data = elem; s->next = p->next; p->next = s; return 0; }

尾节点出栈

int TailPop(LinkStack* Ps) { if ((*Ps) == NULL)//没有元素能够出栈 return 1; //需要找到倒数第二个非空的节点 if ((*Ps)->next == NULL) { LNode* temp = (*Ps);//只有一个元素 (*Ps) = (*Ps)->next; free(temp); return 0; } //if ((*Ps)->next->next == NULL) //{ // LNode* temp = (*Ps)->next; // (*Ps)->next = temp->next; // free(temp); // return 0; //} LNode* p = (*Ps); while (p->next->next) { p = p->next; } LNode* temp = p->next; p->next = temp->next; free(temp); return 0; }

4.打印链栈

void Display(LinkStack* Ps) { LNode* p = (*Ps); while (p) { printf("%d->", p->data); p = p->next; } printf("NULL\n"); }

5.判断一个链栈是不是空的,如果不是空的返回top元素

以头节点进行操作的top节点

void GetTop(LinkStack* Ps)//判断空栈和返回top元素 { if ((*Ps) == NULL)//说明是空表 { return 1; } return (*Ps)->data;//返回栈顶元素 }

以尾节点进行操作的top节点

LNode* GetTail(LinkStack* Ps) { LNode* p = (*Ps); if (NULL == p) { return p; } while (p->next) { p = p->next; } return p; }

6.全局代码,可以多测试几组,看是不是符合条件,主要是头节点和尾节点一定要考虑清楚

typedef struct LNode { int data; struct LNode* next; }LNode,*LinkStack; void InitStack(LinkStack* Ps) { (*Ps) = NULL;//头节点为空指针 } int HeadPush(LinkStack* Ps, int elem) { if ((*Ps) == NULL) { (*Ps) = (LNode*)malloc(sizeof(LNode)); if ((*Ps) == NULL) { return 1; } (*Ps)->data = elem; (*Ps)->next = NULL; return 0; } LNode* s = (LNode*)malloc(sizeof(LNode)); if (NULL ==s) { return 1; } s->data = elem; s->next = (*Ps); (*Ps) = s; return 0; } int HeadPop(LinkStack* Ps)//头节点出栈 { if ((*Ps) == NULL) { return 1; } LNode* p = (*Ps); (*Ps) = (*Ps)->next; free(p); return 0; } LNode* GetTail(LinkStack* Ps) { LNode* p = (*Ps); if (NULL == p) { return p; } while (p->next) { p = p->next; } return p; } int TailPush(LinkStack*Ps,int elem) { if ((*Ps) == NULL) { (*Ps) = (LNode*)malloc(sizeof(LNode)); if ((*Ps) == NULL) { return 1; } (*Ps)->next = NULL; (*Ps)->data = elem; return 0; } LNode* p = GetTail(Ps);//得到了最后一个非空的节点 LNode* s = (LNode*)malloc(sizeof(LNode)); if (NULL == s) { return 1; } s->data = elem; s->next = p->next; p->next = s; return 0; } int TailPop(LinkStack* Ps) { if ((*Ps) == NULL)//没有元素能够出栈 return 1; //需要找到倒数第二个非空的节点 if ((*Ps)->next == NULL) { LNode* temp = (*Ps);//只有一个元素 (*Ps) = (*Ps)->next; free(temp); return 0; } //if ((*Ps)->next->next == NULL) //{ // LNode* temp = (*Ps)->next; // (*Ps)->next = temp->next; // free(temp); // return 0; //} LNode* p = (*Ps); while (p->next->next) { p = p->next; } LNode* temp = p->next; p->next = temp->next; free(temp); return 0; } void Display(LinkStack* Ps) { LNode* p = (*Ps); while (p) { printf("%d->", p->data); p = p->next; } printf("NULL\n"); } void GetTop(LinkStack* Ps)//判断空栈和返回top元素 { if ((*Ps) == NULL)//说明是空表 { return 1; } return (*Ps)->data;//返回栈顶元素 } int main() { LinkStack S; InitStack(&S); //HeadPush(&S, 1); //HeadPush(&S, 2); //HeadPush(&S, 3); HeadPop(&S); TailPush(&S, 1); TailPush(&S, 2); TailPush(&S, 3); TailPush(&S, 4); TailPush(&S, 5); TailPop(&S); TailPop(&S); TailPop(&S); TailPop(&S); TailPop(&S); /*HeadPop(&S); HeadPop(&S); HeadPop(&S);*/ Display(&S); return 0; }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 6:11:17

vue基于Spring Boot框架泊智达智能停车场系统的设计与实现_114fjy5r

目录具体实现截图项目介绍论文大纲核心代码部分展示项目运行指导结论源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作具体实现截图 本系统(程序源码数据库调试部署讲解)同时还支持java、ThinkPHP、Node.js、Spring B…

作者头像 李华
网站建设 2026/6/10 16:03:40

vue基于Spring Boot框架的电子商城_电子商务网站 骑手配送系统ge56516b

目录具体实现截图项目介绍论文大纲核心代码部分展示项目运行指导结论源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作具体实现截图 本系统(程序源码数据库调试部署讲解)同时还支持java、ThinkPHP、Node.js、Spring B…

作者头像 李华
网站建设 2026/6/10 13:21:10

基于vue的城市出行旅游服务指南系统_nrno3uki_springboot php python nodejs

目录具体实现截图项目介绍论文大纲核心代码部分展示项目运行指导结论源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作具体实现截图 本系统(程序源码数据库调试部署讲解)同时还支持java、ThinkPHP、Node.js、Spring B…

作者头像 李华
网站建设 2026/6/10 5:33:17

23、GTK+与GNOME开发全解析

GTK+与GNOME开发全解析 1. GTK+文本缓冲区与视图 在GTK+开发中,文本缓冲区(GtkTextBuffer)和文本视图(GtkTextView)是处理文本显示和编辑的重要组件。 1.1 文本缓冲区信号 文本缓冲区有多个重要信号,这些信号在不同操作时被触发: - modified - changed :当缓冲区…

作者头像 李华
网站建设 2026/6/10 2:42:59

C++基础:Stanford CS106L学习笔记 8 继承

目录8.1 定义8.2 继承的实现8.3 继承类型私有继承&公有继承保护继承8.4 菱形问题与虚拟继承8.5 实例展示8.5.1 实现继承错误案例解决第一处错误解决第二处错误8.5.2 虚函数8.5.3 纯虚函数8.5.4 继承的缺点&组合8.1 定义 继承:一个类从另一个类继承属性的机…

作者头像 李华