zoukankan      html  css  js  c++  java
  • 数据结构C语言实现----单链表实例

      编写一个程序,要求:从终端输入一组整数(大于10个数),以0作为结束标志,将这一组整数,存放在一个链表中(结束标志0不包括在内),打印出该链表中的值。然后删除该链表中的第五个元素,打印出删除后的结果。最后在内存中释放掉该链表;

    程序清单:

    #include<stdio.h>
    #include<stdlib.h>
    /*****************************************************************
     * 把一组数(大于10个)存到一个链表中,以0为结束标志,链表里不包含0
     * 打印链表中的值
     * 删除该链表中的而第五个元素
     * 打印删除后的结果
     * 销毁链表 
     *****************************************************************/
    
    typedef struct Node
    {
        int date;
        struct Node *next;
    }Node , *LinkList;
    
    /////////////////////////////////////////////////////////////////
    //创建一个链表
    LinkList creatlinklist(int n)
    {
        LinkList New_node , Tail_node;
        LinkList Head_node = NULL;
        int c;
        for (size_t i = 1; i < n; i++)
        {
            printf("请输入第%d个节点存入的数据:",i);
            scanf("%d",&c);
            if (c!=0)
            {
                New_node = (LinkList)malloc(sizeof(Node));
                New_node->date = c;
                New_node->next = NULL;
    
                if (Head_node==NULL)
                {
                    Head_node = New_node;
                }else
                {
                    Tail_node->next = New_node;
                }
                Tail_node = New_node;
            }else
            {//如果输入中出现0,结束链表的数据读取
                return Head_node;
            }
        }
        return Head_node;
    }
    ////////////////////////////////////////////////////////////////////
    //删除链表中的某个元素
    void deletlinklist(LinkList *List , int n)
    {
        LinkList dele_node = *List;
        for (size_t i = 1; i <n; i++)
        {
            dele_node = dele_node->next;
        }
        if (n==1)
        {
            *List = dele_node->next;
            free(dele_node);
        }else
        {
            LinkList befor_node = *List;
            for (size_t i = 1; i < n-1; i++)
            {
                befor_node = befor_node->next;
            }
            befor_node->next = dele_node->next;
            free(dele_node);
        }
    }
    /////////////////////////////////////////////////////////////////////
    //链表中插入元素
    void insertlinklist(LinkList *List , int m , int date)
    {
        LinkList insert_node , befor_node;
        insert_node = (LinkList)malloc(sizeof(Node));
        insert_node->date = date;
        insert_node->next = NULL;
        if (m!=1)
        {
            befor_node = *List;
            for (size_t i = 1; i <= m-1; i++)
            {
                befor_node = befor_node->next;
            }
            insert_node->next = befor_node->next;
            befor_node->next = insert_node;
        }else
        {
            *List = insert_node;
        }
        
    }
    /////////////////////////////////////////////////////////////////////
    //销毁链表
    void destrylinklist(LinkList *List)
    {
        LinkList p,q;
        p = *List;
        while (p)
        {
            q = p->next;
            free(p);
            p = q;
        }
        *List = NULL;
    }
    //////////////////////////////////////////////////////////////////////
    //////////////////////////////////////////////////////////////////////
    #define OK 1
    #define NO 0
    int main()
    {
    /////////////////////////////
    //引导
        int i;//命令字符
        int m = NO;//判断是否创建了链表
        LinkList outlist;
        while (1!=0)
        {
            printf("*创建一个链表请输入:1
    *销毁已有链表请输入:2
    *删除已有链表中结点:3
    *已有链表中插入数据:4
    *打印链表请输入:5
    *请输入命令代号以确定执行的操作:");
            scanf("%d",&i);
            fflush(stdin);
            switch (i)
            {
            case 1://创建列表操作
            {
                LinkList L;
                printf("请输入新建链表的最大结点个数(最好大于10个):");
                int n;
                scanf("%d",&n);
                fflush(stdin);
                L = creatlinklist(n);
                m = OK;
                outlist = L;
                printf("-----------------------------------------创建成功!
    ");
                break;
            }
            case 3://删除结点操作
                if ( m == OK )
                {
                    printf("请输入要删除第几个节点:");
                    int b;
                    scanf("%d",&b);
                    fflush(stdin);
                    deletlinklist(&outlist,b);
                    printf("-----------------------------------------删除成功!
    ");
                }else
                {
                    printf("-----------------------------------------当前没有链表,请先创建一个链表!
    ");
                }
                break;
            case 2://销毁链表操作
                if (m == OK)
                {
                    destrylinklist(&outlist);
                    if (outlist == NULL)
                    {
                        printf("-----------------------------------------销毁成功!
    ");
                        m = NO;
                    }else
                    {
                        printf("-----------------------------------------出现错误!
    ");
                        exit(0);
                    }
                }else
                {
                    printf("-----------------------------------------当前没有链表可销毁,请先创建一个链表!
    ");
                }
                break;
            case 4://插入结点操作
                if (m==OK)
                {
                    printf("请输入要在第几个节点后插入数据:");
                    int a;
                    scanf("%d",&a);
                    fflush(stdin);
                    printf("请输入要插入的数据:");
                    int j;
                    scanf("%d",&j);
                    insertlinklist(&outlist , a , j);
                    printf("-----------------------------------------插入数据成功!
    ");
                }else
                {
                    printf("-----------------------------------------无链表可用,请先创建一个链表!");
                }
                break;
            case 5://打印链表操作
                printf("-----------------------------------------链表打印中...
    -----------------------------------------打印结果为:");
                LinkList List = outlist;
                while (List!=NULL)
                {
                    printf("%d",List->date);
                    List = List->next;
                }
                putchar('
    ');
                break;
            default:
                break;
            }
        }
        
        return 0;
    }
    

      

    运行结果:

    $ 实例1-3.exe
    *创建一个链表请输入:1
    *销毁已有链表请输入:2
    *删除已有链表中结点:3
    *已有链表中插入数据:4
    *打印链表请输入:5
    *请输入命令代号以确定执行的操作:1
    请输入新建链表的最大结点个数(最好大于10个):15
    请输入第1个节点存入的数据:1
    请输入第2个节点存入的数据:2
    请输入第3个节点存入的数据:3
    请输入第4个节点存入的数据:4
    请输入第5个节点存入的数据:5
    请输入第6个节点存入的数据:6
    请输入第7个节点存入的数据:7
    请输入第8个节点存入的数据:8
    请输入第9个节点存入的数据:0
    -----------------------------------------创建成功!
    *创建一个链表请输入:1
    *销毁已有链表请输入:2
    *删除已有链表中结点:3
    *已有链表中插入数据:4
    *打印链表请输入:5
    *请输入命令代号以确定执行的操作:5
    -----------------------------------------链表打印中...
    -----------------------------------------打印结果为:12345678
    *创建一个链表请输入:1
    *销毁已有链表请输入:2
    *删除已有链表中结点:3
    *已有链表中插入数据:4
    *打印链表请输入:5
    *请输入命令代号以确定执行的操作:3
    请输入要删除第几个节点:3
    -----------------------------------------删除成功!
    *创建一个链表请输入:1
    *销毁已有链表请输入:2
    *删除已有链表中结点:3
    *已有链表中插入数据:4
    *打印链表请输入:5
    *请输入命令代号以确定执行的操作:5
    -----------------------------------------链表打印中...
    -----------------------------------------打印结果为:1245678
    *创建一个链表请输入:1
    *销毁已有链表请输入:2
    *删除已有链表中结点:3
    *已有链表中插入数据:4
    *打印链表请输入:5
    *请输入命令代号以确定执行的操作:4
    请输入要在第几个节点后插入数据:2
    请输入要插入的数据:3
    -----------------------------------------插入数据成功!
    *创建一个链表请输入:1
    *销毁已有链表请输入:2
    *删除已有链表中结点:3
    *已有链表中插入数据:4
    *打印链表请输入:5
    *请输入命令代号以确定执行的操作:5
    -----------------------------------------链表打印中...
    -----------------------------------------打印结果为:12345678
    *创建一个链表请输入:1
    *销毁已有链表请输入:2
    *删除已有链表中结点:3
    *已有链表中插入数据:4
    *打印链表请输入:5
    *请输入命令代号以确定执行的操作:2
    -----------------------------------------销毁成功!
    *创建一个链表请输入:1
    *销毁已有链表请输入:2
    *删除已有链表中结点:3
    *已有链表中插入数据:4
    *打印链表请输入:5
    *请输入命令代号以确定执行的操作:

  • 相关阅读:
    vue+springboot+element+vue-resource实现文件上传
    使用bfg快速清理git历史大文件
    git clone异常 【fatal: protocol error: bad line length character: Inte】
    excel 一次删除所有空行
    vim编辑器
    prometheus安装
    递归计算分波那契数列和阶乘
    如何理解线程安全?
    创建线程的方式
    为什么说一个对象是线程安全的?
  • 原文地址:https://www.cnblogs.com/jerryleesir/p/13323562.html
Copyright © 2011-2022 走看看