数据结构----链栈
链栈与顺序栈的区别就是链栈可以让储存的空间是无限的,不会有溢出的风险,可以更加合理的利用计算机存储内存。`
以下是代码实现:
创建·压栈·出栈
#include<stdio.h>
#include<stdlib.h>
//首先先定义一个结构体,并用typedef来定义名称
typedef struct chu zhu;
struct chu{
int sum;
zhu *next;
};
//在单独定义一个头指针,也用typedef定义简介的名称,
//这样做可以更加明显分辨头指针,当然也可以不用这样做
typedef struct lin str;
struct lin{
zhu *pnext;
};
// 此函数是创建链栈的
str * chuang()
{
struct lin *ak;//先为头指针申请内存
ak=(str *)malloc(sizeof(str));
if(!ak) //
printf("无存储其他\n");//就是该指针的内存指向处无内存占用
else{
ak->pnext=NULL;//否则指向NULL
}
printf("创建成功");
return ak; //然后创建成功后返回创建好的头指针
}
//接下来这个函数为链栈的值的压入
void push(str * ak,int a)
{
zhu *p;
p=(zhu *)malloc(sizeof(zhu));
if(!p)
printf("无法分配内存");//如果内存内不为空就无法存储
else //反之,将数值压入,并改变头指针的指向
{
p->sum=a;
p->next=ak->pnext;
ak->pnext=p;
}
}
//这个函数为出栈,就是取出栈中的值,并且删除所占用内存
//此处我取出栈中所有的值为例
void bn(str * ak)
{
zhu *p;
p=NULL;
p=ak->pnext;
while(p)
{
printf("%d\n",p->sum);
ak->pnext=p->next;
free(p); //每次取出栈顶元素后,就可以删除栈顶所用的内存
p=ak->pnext;
}
free(ak);//最后一步需要再删除头指针
}
int main()
{
str * dd;
dd=chuang(); //创建链栈
int n;
scanf("%d",&n); //表示为链栈元素的个数
for(int i=1;i<=n;i++)
{
int a;
scanf("%d",&a); //输入链栈中所存储的值
push(dd,a); //把输入的值压入链栈
}
printf("输出链栈元素\n");
bn(dd); //出栈并输出栈中的元素
system("pause");
return 0;
}
如有错误,还请指出,谢谢。