#include <stdio.h>
#include <stdlib.h>
int flag=0;
typedef struct linknode
{
char data;
struct linknode *next;
}linknode;
typedef struct LinkStack
{
linknode *top;
}LinkStack;
void InitStack(LinkStack *S)
{
S->top=NULL;
}
void CreateStack(LinkStack *S)
{
if(flag==1)
printf("链栈已经创建!
");
else
{
InitStack(S);
int i,length;
char ch;
linknode *p;
printf("请输入要创建链栈的长度:
");
scanf("%d",&length);
for(i=0;i<length;i++)
{
printf("请输入链栈的元素:
");
scanf("%c",&ch);
if((ch=getchar())!='
')
{
p=(linknode *)malloc(sizeof(linknode));
p->data=ch;
p->next=S->top;
S->top=p;
}
}
flag=1;
printf("链栈创建完成!
");
}
}
void PushStack(LinkStack *S)
{
if(flag==0)
printf("链栈未创建,无法进行入栈操作!
");
else
{
char e;
linknode *p;
printf("请输入入栈的元素!
");
scanf("%c",&e);
if((e=getchar())!='
')
{
p=(linknode *)malloc(sizeof(linknode));
p->data=e;
p->next=S->top;
S->top=p;
}
printf("入栈操作成功!
");
}
}
void PopStack(LinkStack *S)
{
if(flag==0)
printf("链栈未创建,无法进行出栈操作!
");
else
{
if(S->top==NULL)
printf("链栈为空,无法进行出栈操作!
");
else
{
char ch;
linknode *p;
p=S->top;
ch=p->data;
S->top=p->next;
free(p);
printf("链栈出栈成功,出栈元素为%c
",ch);
}
}
}
void StackLength(LinkStack S)
{
int len=0;
if(flag==0)
printf("链栈未创建,无法计算栈长度!
");
else
{
linknode *p=S.top;
while(p)
{
len++;
p=p->next;
}
printf("链栈的长度为:%d
",len);
}
}
void StackEmpty(LinkStack S)
{
if(flag==0)
printf("链栈未创建,无法判断是否为空!
");
else
{
if(S.top==NULL)
printf("链栈为空!
");
else
printf("链栈不为空!
");
}
}
void DisplayStack(LinkStack S)
{
if(flag==0)
printf("链栈未创建,无法显示!
");
else
{
linknode *p=S.top;
printf("链栈的显示顺序为:
");
while(p)
{
printf("%c ",p->data);
p=p->next;
}
printf("
");
}
}
void DestoryStack(LinkStack *S)
{
if(flag==0)
printf("链栈未创建,不需要销毁!
");
else if(S->top==NULL)
printf("链栈已经被销毁!
");
else
{
linknode *p,*q;
p=S->top;
q=p->next;
while(p)
{
q=p;
p=p->next;
free(q);
}
flag=0;
printf("链栈已成功被销毁!
");
}
}
void menu()
{
printf("链栈基本实验操作
");
printf("*********************************
");
printf("1 建立链栈! *
");
printf("2 链栈入栈操作! *
");
printf("3 链栈出栈操作! *
");
printf("4 求链栈长度! *
");
printf("5 判断链栈是否为空! *
");
printf("6 显示链栈! *
");
printf("7 销毁链栈! *
");
printf("0 退出程序! *
");
printf("*********************************
");
}
int main()
{
LinkStack ptr;
int select;
while(1)
{
menu();
printf("请输入选择命令:
");
scanf("%d",&select);
switch(select)
{
case 1:
CreateStack(&ptr);
break;
case 2:
PushStack(&ptr);
break;
case 3:
PopStack(&ptr);
break;
case 4:
StackLength(ptr);
break;
case 5:
StackEmpty(ptr);
break;
case 6:
DisplayStack(ptr);
break;
case 7:
DestoryStack(&ptr);
break;
case 0:
exit(1);
break;
default :
printf("命令输入有误,请重新输入!
");
break;
}
}
return 0;
}
链栈的很多细节之处比较难理解。链栈初始化问题困扰了我好久,调试了将近一个小时才找到问题之所在!!以后还要多写才能加深理解!