数据结构实验四——链栈
2015-01-19 23:57
176 查看
#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; }链栈的很多细节之处比较难理解。链栈初始化问题困扰了我好久,调试了将近一个小时才找到问题之所在!!以后还要多写才能加深理解!