改进了一下pop操作
#include<stdio.h>
#include<stdlib.h>
#define True 1
#define False 0
//status状态信息定义为bool型
typedef bool status;
//链栈的结构化定义
typedef struct Lnode{
int data;
struct Lnode *next;
}Lnode;
//对栈的初始化操作
void initStack(Lnode *&lst){
lst=(Lnode*)malloc(sizeof(Lnode));
lst->next = NULL;
printf("链栈已经初始化完成,请输入您接下来的操作\n");
}
//判断是否栈空
status isempty(Lnode *&lst){
if(lst->next==NULL)
return True;
else
return False;
}
//进栈操作
status push(Lnode *lst , int x){
Lnode *r; //s为待插入的节点 r为跟随lst的指针
r=(Lnode*)malloc(sizeof(Lnode));//给r申请一个初始空间
r->next=NULL; //初始化进栈的节点r
r->data=x;
r->next=lst->next; //lst是带有头结点的链表,此处为头插
lst->next=r;
return True;
}
//出栈操作
status pop(Lnode *lst , int &x){
Lnode *p;
if(lst->next==NULL)
return False;
//对单链表的删除操作
p=lst->next;
x=p->data;
lst->next=p->next;
free(p);
return True;
}
//打印栈中元素
status printfs(Lnode *lst)
{
Lnode *r;
r = lst;
r = r->next;
while(r!=NULL){
printf("|%d|\n",r->data);
r=r->next;
}
printf(" — ");
return True;
}
//主函数
main(){
Lnode *lst; //先定义一个栈
int x;
int choose;
printf("1.初始化栈\n");
printf("2.判断栈是否为空\n");
printf("3.进栈操作\n");
printf("4.出栈操作\n");
printf("5.打印栈中元素\n");
for(;;){
printf("请输入您的操作\n");
scanf("%d",&choose);
switch(choose){
case 1:
initStack(lst); //对栈进行初始化
break;
case 2:
if(isempty(lst)==1)
printf("栈空\n");
else
printf("栈中存在元素\n");
break;
case 3: //进栈操作
// int x;
printf("请输入您需要进栈的元素\n");
scanf("%d",&x);
push(lst,x);
break;
case 4: //出栈操作
if(pop(lst,x)==1)
printf("出栈成功\n");
else
printf("出栈失败\n");
break;
case 5: //打印栈
printfs(lst);
break;
}
}
}