数据结构 栈的链式存储结构 c语言版
链栈的初始化,创建,压入数据,取出数据,遍历输出,销毁等操作
C代码
#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
typedef struct StackNode{
ElemType data; //数据域
struct StackNode *next; //指针域
}StackNode,*Listackp;
typedef struct Listack {
Listackp top; //栈顶指针
}Listack;
initstack(Listack &S);
push(Listack &S,int i,ElemType e);
pop(Listack &S, int i,ElemType *e);
void Displystack (Listack &S);
void destroystack(Listack &S);
initstack(Listack &S)
{
S.top=NULL;//初始化栈顶指针
printf("初始化成功!\n");
return 1;
}
//处理原本的栈顶结点为新结点s的后继,将栈顶指针 top 重新指向新结点s
push(Listack &S, int i,ElemType e)
{
for(int j=0;j<i;j++)
{
StackNode *p=(StackNode*)malloc(sizeof(StackNode));//分配空间
printf("请输入第 %d 个要压入的数据:",j+1);
scanf("%d",&e);
p->next=S.top; // L为头指针
p->data=e;
S.top=p;
}
printf("压入成功!\n");
return 1;
}
//变量p用来存储要删除 的栈顶结点,将栈顶指针下移一位,最后释放p
pop(Listack &S, int i,ElemType *e)
{
for(int j=0;j<i;j++){
if (S.top == NULL) {
printf("栈已空!\n");
return 0;
}
StackNode *p = S.top;
*e=S.top->data;
S.top=S.top->next;
printf("%d 以出栈\n",p->data); //出栈
free(p);
}
return 1;
}
void DisplyStack (Listack &S)
{
StackNode *p = S.top;
printf("从栈顶由上往下依次输出:");
while(p){
printf(" %d ",p->data);
p=p->next;
}
printf("\n");
}
void destroystack(Listack &S)
{
while(S.top){
StackNode *p = S.top;
S.top=S.top->next;
free(p); //释放空间
}
printf("销毁成功!\n");
}
int main()
{
ElemType e;
Listack S;
int i;
printf("\n\n\n");
printf("\n\t\t\t\t\t\t1.创建顺序栈");
printf("\n\t\t\t\t\t\t2.栈顶压入元素");
printf("\n\t\t\t\t\t\t3.取出栈顶元素");
printf("\n\t\t\t\t\t\t4.输出栈内数据");
printf("\n\t\t\t\t\t\t5.销毁顺序栈");
printf("\n\t\t\t\t\t\t6.退出\n\n");
while(1)
{
printf("\n请选择您想选择的操作: ");
int k;
scanf("%d",&k);
switch(k)
{
case 1:
initstack(S);
break;
case 2:
printf("输入你想压入的个数:");
scanf("%d",&i);
push(S,i,e);
break;
case 3:
printf("输入你想取出的个数:");
scanf("%d",&i);
pop(S,i,&e);
break;
case 4:
DisplyStack(S);
break;
case 5:
destroystack(S);
break;
case 6:
return 0;
break;
}
}
}