链栈的c语言实现方式,C语言链栈实现
C语言实现链栈总结
最近用C语言实现链栈时遇到了问题,经过上网收索资料以及师兄的讲解顺利地解决了该问题,现就将所遇到的问题以及解决方法总结如下:
1.带有空余头结点的链栈代码实现如下:
/**************************************************/
//函数功能:实现链栈的进栈和出栈功能
//说明:带有空余头结点,利用空余头结点将入栈的结点串接起来,
//通过出栈是对数据逆序输出
/**************************************************/
#include
#include
#include
#define FALSE 0
#define TRUE 1
typedef struct node{
int data;
struct node *next;
}Stack;
void StackInit(Stack *top)
{
top->next=NULL;
}
int Push(Stack *top,int data)
{
Stack *p;
p=(Stack *)malloc(sizeof(Stack));
if(p==NULL)
{
return FALSE;
}
p->data=data;
p->next=top->next;
top->next=p;
return TRUE;
}
int IsEmpty(Stack *top)
{
if(top->next==NULL)
{
return TRUE;
}
return FALSE;
}
int Pop(Stack *top,int *x)
{
Stack *p;
if(IsEmpty(top))
{
return FALSE;
}
p=top->next;
*x=p->data;
top->next=p->next;
free(p);
return TRUE;
}
int main()
{
int x;
Stack *top=(Stack *)malloc(sizeof(Stack));//带有头结点的链栈
StackInit(top);
printf("Input some positive integers:\n");
scanf("%d",&x);
while(x>0)
{
Push(top,x);
scanf("%d",&x);
}
while(Pop(top,&x))
{
printf("%d\t",x);
}
printf("\n");
return 0;
}
自己尝试了不带头结点的情况,其代码如下:
/*******************************************************/
//错误版本:不带空余都结点的链栈实现
/*******************************************************/
#include
#include
#include
#define FALSE 0
#define TRUE 1
typedef struct node{
int data;
struct node *next;
}Stack;
int Push(Stack *top,int data)
{
Stack *p;
p=(Stack *)malloc(sizeof(Stack));
if(p==NULL)
{
return FALSE;
}
p->data=data;
p->next=top;
top=p;
return TRUE;
}
int IsEmpty(Stack *top)
{
if(top==NULL)
{
return TRUE;
}
return FALSE;
}
int Pop(Stack *top,int *x)
{
Stack *p;
if(IsEmpty(top))
{
return FALSE;
}
p=top;
*x=p->data;
top=p->next;
free(p);
return TRUE;
}
int main()
{
int x;
Stack *top=NULL;//不带有头结点的链栈
printf("Input some positive integers:\n");
scanf("%d",&x);
while(x>0)
{
Push(top,x);
scanf("%d",&x);
}
while(Pop(top,&x))
{
printf("%d\t",x);
}
printf("\n");
return 0;
}
在编译运行后出不来预期的结果,通过编译调试后发现每次在出栈时遇到问题,因为上述代码在入栈和出栈子函数中传递的都是指针,在主函数中再来调用入栈和出栈子函数后,就如同值传递一样不改变结果,所以每次top=NULL,因而也就不执行出栈操作,我们采用如下测试看看效果:
测试如下:
1. #include
void f(int **p)
{
int k=10;
*p=&k;//修改指针修改值
}
int main()
{
int i=1;
int *q=&i;
printf("%d\n",long(q));
f(&q);
printf("%d\n",*q);//值修改了
printf("%d\n",long(q));//指针修改了
return 0;
}
//为说明问题,特做如下对比
//这是指针操作必须要搞清楚的问题
//写入栈操作时指针是要移动的,要修改的
2. #include
void f(int *p)
{
int k=10;
*p=k;
}
int main()
{
int i=1;
int *q=&i;
printf("%d\n",long(q));
f(q);
printf("%d\n",*q);//值修改了
printf("%d\n",long(q));//指针没有修改
return 0;
}
可以发现问题出在在子函数中修改后,返回时并没有对实参指针进行修改,也就是每次返回后top始终指向NULL,究其原因用指针作为参数,也只是拷贝指针,修改也只是修改指针对象,不能修改指针,解决方法如下:用二级指针作为参数,可以修改指针也可以修改指针对象。
代码修改如下:
*#include
#include
#include
#define FALSE 0
#define TRUE 1
typedef struct node{
int data;
struct node *next;
}Stack;
int Push(Stack**top,int data)
{
Stack *p;
p=(Stack *)malloc(sizeof(Stack));
if(p==NULL)
{
return FALSE;
}
p->data=data;
p->next=*top;
*top=p;
return TRUE;
}
int IsEmpty(Stack *top)
{
if(top==NULL)
{
return TRUE;
}
return FALSE;
}
int Pop(Stack**top,int *x)
{
Stack *p;
if(IsEmpty(*top))
{
return FALSE;
}
p=*top;
*x=p->data;
*top=p->next;
free(p);
return TRUE;
}
int main()
{
int x;
Stack *top=NULL;//不带有头结点的链栈
printf("Input some positive integers:\n");
scanf("%d",&x);
while(x>0)
{
Push(&top,x);
scanf("%d",&x);
}
while(Pop(&top,&x))
{
printf("%d\t",x);
}
printf("\n");
return 0;
}
链栈的c语言实现方式,C语言链栈实现相关推荐
- 1至100之和用c语言表达方式,C语言菜鸟基础教程之求1到100的和
题目:求1+2+3+--+98+99+100 (1)用数学方法求解 (2)编写C语言程序求解 解: (1)数学方法 S = 1+2+3+--+98+99+100 = (1+100) + (2+99) ...
- 魔王语言C语言 使用头文件封装 链表链栈顺序队列的基本操作
1.抽象数据类型的定义和说明: a) 链栈类型 由于沿用了链表,因此此处列出修改后的链表抽象数据类型 SElemType:数据结点,内含一个char型的数据zi; SqStack:栈,包含存储空间基址 ...
- 数据结构(C语言版) 第 三 章 栈与队列 知识梳理 + 作业习题详解
目录 一.栈 0.栈的基本概念 1.栈的实现 2.栈与递归 3.Hanoi塔问题 二.队列 0.队列的基本概念 1.队列的实现 2.循环队列 2.1循环队列的相关条件和公式: 3.链队列 4.链队列完 ...
- 栈(操作受限的线性表)---C语言版
目录 一.栈的相关概念 二.栈的基本操作 三.顺序栈 3.1 顺序栈的定义 3.2 顺序栈的操作 `InitStack(*S)`:构造一个空栈S `StackEmpty(S)`:若栈S为空栈,则返回T ...
- 我的全栈之路-C语言基础之C语言概述与开发环境搭建
我的全栈之路-C语言基础之C语言概述与开发环境搭建 我的全栈之路 1.1 信息技术发展趋势 1.2 浅谈计算机系统架构 1.2.1 计算机系统架构概述 1.2.2 计算机硬件系统 1.2.2 计算机软 ...
- 实现顺序栈的各种基本运算的算法C语言,实现顺序栈的各种基本运算的算法
试编写一个算法,让两个顺序栈共用一个数组stack[N]试编写一个算法,让两个顺序栈共用一个数组stack[N],分别实现入栈\出栈操要2个栈公用一个存储空间看来栈顶指针只能从两端开始了(和队列有点像 ...
- c语言的内存管理方式,c语言内存管理
2017-08-23 作用域 一个C语言变量的作用域可以是代码块 作用域,函数作用域或者文件作用域.代码块是{}之间的一段代码. auto 自动变量 一般情况下代码块内部定义的变量都是自动变量.当然也 ...
- c语言中变量有几种存储方式,C语言变量的存储类别有哪些详细资料介绍
描述 C语言中的变量根据其生存周期,可以分为静态存储方式和动态存储方式. 静态存储方式:是指在程序运行期间分配固定的存储空间的方式.静态存储区中存放了在整个程序执行过程中都存在的变量,如全局变量. 动 ...
- r语言error in match.fun(fun) :_Go语言200行写区块链源代码分析
Github上有一个Repo,是一个使用Go语言(golang),不到200行代码写的区块链源代码,准确的说是174行.原作者起了个名字是 Code your own blockchain in le ...
最新文章
- 【Java面试题】54 去掉一个Vector集合中重复的元素
- 关于Oracle组件如何正确实现动态Web的数据库
- git的一些知识梳理以及命令操作
- PowerDesigner教程系列(四)概念数据模型
- webapp 中为span元素赋值
- IAR在写结构体时不提示_智能物流装车系统的结构优化与改进
- java 创建文件夹_VS Code用来开发JAVA项目真香
- flutter 人脸检测_Flutter - 通过指纹和人脸识别认证
- Javascript中对空string调用split返回不是空数组
- CAD2012安装错误
- 敏感词过滤算法:前缀树算法
- chrome插件开发基础以及如何防止劫持
- 思岚A1M8激光雷达-ubuntu18.04-slam建图参考
- CPU内部架构与工作原理
- Selenium中的鼠标单击事件
- 【九阳真经口诀】他强由他强,清风拂山岗;他横由他横,明月照大江。他自狠来他自恶,我自一口真气足。
- NOI前的做题计划记录
- 你一定要知道长痘痘的注意点!!!
- java ee jpi是什么,“JPI”是“Java Plug In”的缩写,意思是“Java插件”
- 怎么自定义服务器的404,如何自定义404页面
热门文章
- Java反射方法赋值,java反射挟制赋值
- 九龙证券|超50亿主力资金砸盘计算机行业,这类股获资金青睐
- Linux上每个SCSI设备的最大LUN数目是多少(by quqi99)
- C# EF Core 简单工厂模式,接口多继承实例(三)
- WinXP下由于图标造成的System.Windows.Markup.XamlParseException
- 阿迪达斯联合贝克汉姆推出ULTRABOOST 19 DB99跑鞋
- 考研题库小程序中如何实现打开考研思维导图pdf
- python画土拨鼠代码_Python 用10行代码教你画出太阳花
- WLAN基础知识--认识WLAN基本概念
- 集成开发工具IDEA的安装教程----包括了解idea的Java工程目录