• 数据结构实验四——链栈


    #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;
    }
    
    链栈的很多细节之处比较难理解。链栈初始化问题困扰了我好久,调试了将近一个小时才找到问题之所在!!以后还要多写才能加深理解!
  • 相关阅读:
    消失的 unittest.makeSuite()
    自定义错误信息在各个浏览器表现不同
    “创建Web应用程序”与“创建Web网站”的区别
    如何将Notepad++改造成Python开发工具
    64位服务器IIS不能识别32位framework版本。IIS没有Asp.net切换界面的解决办法。
    C++文件流,读入数据注意
    Chessboard(二分图完备匹配)
    courses二分图最大匹配
    Linux BASH Shell文件名匹配/输出重定向
    LinuxShell一些很少用到却很有用的指令
  • 原文地址:https://www.cnblogs.com/abc-24990/p/4257524.html
Copyright © 2020-2023  润新知