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