数据结构实验四——链栈

#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;
}
链栈的很多细节之处比较难理解。链栈初始化问题困扰了我好久,调试了将近一个小时才找到问题之所在!!以后还要多写才能加深理解!
posted on 2015-01-19 23:57  赛亚人  阅读(369)  评论(0编辑  收藏  举报