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. 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) ...

  2. 魔王语言C语言 使用头文件封装 链表链栈顺序队列的基本操作

    1.抽象数据类型的定义和说明: a) 链栈类型 由于沿用了链表,因此此处列出修改后的链表抽象数据类型 SElemType:数据结点,内含一个char型的数据zi; SqStack:栈,包含存储空间基址 ...

  3. 数据结构(C语言版) 第 三 章 栈与队列 知识梳理 + 作业习题详解

    目录 一.栈 0.栈的基本概念 1.栈的实现 2.栈与递归 3.Hanoi塔问题 二.队列 0.队列的基本概念 1.队列的实现 2.循环队列 2.1循环队列的相关条件和公式: 3.链队列 4.链队列完 ...

  4. 栈(操作受限的线性表)---C语言版

    目录 一.栈的相关概念 二.栈的基本操作 三.顺序栈 3.1 顺序栈的定义 3.2 顺序栈的操作 `InitStack(*S)`:构造一个空栈S `StackEmpty(S)`:若栈S为空栈,则返回T ...

  5. 我的全栈之路-C语言基础之C语言概述与开发环境搭建

    我的全栈之路-C语言基础之C语言概述与开发环境搭建 我的全栈之路 1.1 信息技术发展趋势 1.2 浅谈计算机系统架构 1.2.1 计算机系统架构概述 1.2.2 计算机硬件系统 1.2.2 计算机软 ...

  6. 实现顺序栈的各种基本运算的算法C语言,实现顺序栈的各种基本运算的算法

    试编写一个算法,让两个顺序栈共用一个数组stack[N]试编写一个算法,让两个顺序栈共用一个数组stack[N],分别实现入栈\出栈操要2个栈公用一个存储空间看来栈顶指针只能从两端开始了(和队列有点像 ...

  7. c语言的内存管理方式,c语言内存管理

    2017-08-23 作用域 一个C语言变量的作用域可以是代码块 作用域,函数作用域或者文件作用域.代码块是{}之间的一段代码. auto 自动变量 一般情况下代码块内部定义的变量都是自动变量.当然也 ...

  8. c语言中变量有几种存储方式,C语言变量的存储类别有哪些详细资料介绍

    描述 C语言中的变量根据其生存周期,可以分为静态存储方式和动态存储方式. 静态存储方式:是指在程序运行期间分配固定的存储空间的方式.静态存储区中存放了在整个程序执行过程中都存在的变量,如全局变量. 动 ...

  9. r语言error in match.fun(fun) :_Go语言200行写区块链源代码分析

    Github上有一个Repo,是一个使用Go语言(golang),不到200行代码写的区块链源代码,准确的说是174行.原作者起了个名字是 Code your own blockchain in le ...

最新文章

  1. 【Java面试题】54 去掉一个Vector集合中重复的元素
  2. 关于Oracle组件如何正确实现动态Web的数据库
  3. git的一些知识梳理以及命令操作
  4. PowerDesigner教程系列(四)概念数据模型
  5. webapp 中为span元素赋值
  6. IAR在写结构体时不提示_智能物流装车系统的结构优化与改进
  7. java 创建文件夹_VS Code用来开发JAVA项目真香
  8. flutter 人脸检测_Flutter - 通过指纹和人脸识别认证
  9. Javascript中对空string调用split返回不是空数组
  10. CAD2012安装错误
  11. 敏感词过滤算法:前缀树算法
  12. chrome插件开发基础以及如何防止劫持
  13. 思岚A1M8激光雷达-ubuntu18.04-slam建图参考
  14. CPU内部架构与工作原理
  15. Selenium中的鼠标单击事件
  16. 【九阳真经口诀】他强由他强,清风拂山岗;他横由他横,明月照大江。他自狠来他自恶,我自一口真气足。
  17. NOI前的做题计划记录
  18. 你一定要知道长痘痘的注意点!!!
  19. java ee jpi是什么,“JPI”是“Java Plug In”的缩写,意思是“Java插件”
  20. 怎么自定义服务器的404,如何自定义404页面

热门文章

  1. Java反射方法赋值,java反射挟制赋值
  2. 九龙证券|超50亿主力资金砸盘计算机行业,这类股获资金青睐
  3. Linux上每个SCSI设备的最大LUN数目是多少(by quqi99)
  4. C# EF Core 简单工厂模式,接口多继承实例(三)
  5. WinXP下由于图标造成的System.Windows.Markup.XamlParseException
  6. 阿迪达斯联合贝克汉姆推出ULTRABOOST 19 DB99跑鞋
  7. 考研题库小程序中如何实现打开考研思维导图pdf
  8. python画土拨鼠代码_Python 用10行代码教你画出太阳花
  9. WLAN基础知识--认识WLAN基本概念
  10. 集成开发工具IDEA的安装教程----包括了解idea的Java工程目录