数据结构实验四——链栈

#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;
}
链栈的很多细节之处比较难理解。链栈初始化问题困扰了我好久,调试了将近一个小时才找到问题之所在!!以后还要多写才能加深理解!
原文地址:https://www.cnblogs.com/abc-24990/p/4257524.html