zoukankan      html  css  js  c++  java
  • C结构体与链表

    天来总结C语言的学习盲点——结构体,为了不显单一,也为了补足作者链表的编程缺陷,特更此博文,总结近段时间的学习成果。话不多说,先上一段代码

    struct none{int item; link next;};
    typedef struct none *link;
     
    int main(int argc ,char *argv[])
    {
       int i , N = atoi(argv[1]) , M = atoi(argv[2]);
        link t = malloc(sizeof(*t)) , x=t;
        t->item = 1; t->next = t;
    
        for(i=2 ; i <= N ; i++)
        {
            x = x->next = malloc(sizeof(*x));
            x->item = i; x->next = t;
        }
    
        while(x != x->next)
        {
            for(i=1 ; i < M ; i++)
                x = x->next;
            x->next = x->next->next;
        }
        printf("%d
    ",x->item);
        return 0;
    
    }
    

    上面这段代码是解决约瑟夫问题的一种算法

    码开头两行定义一个链表的数据节点并为节点结构取一别名link,注意:使用typedef取别名不能定义新的数据结构,只能对现有结构取别名。主函数里获取执行程序时对主函数输入的参数,函数第一个参数argc保存输入参数个数,第二个参数argv保存输入参数(参数类型为字符串)。for循环执行添加N个链表节点,并让其首尾相连。此处作者想重点讲讲关于结构体的用法,指针结构体变量调用结构体成员使用-link->item或(link).item,其余使用a.item。并且->与.的优先级与()、[]比其它运算符优先级高,故a.data表示为*(a.data)、++a.data表示++(a.data),这些概念都是作者在初学结构体没有注意到的点,到实战中给作者带来不少麻烦,先一并归纳分享。while循环对选中的节点删除,直至剩余一个节点,最后输出剩下的节点数据。

    要以为这样就结束了,程序还存在一些隐藏的bug,比如删除链表的节点去哪了,既然对节点分配了内存,删除的时候是否需要释放其内存呢,当然,如果程序比较小,系统资源充足,你可以这么干,但是对大型且安全要求较高的程序来说,由此造成的内存泄漏问题存在未知的风险,为了规避可能存在的风险,malloc应该与free配套使用,所以代码应改进为:

    int main(int argc , char *argv[])
    {
     
        int i , N = atoi(argv[1]) , M = atoi(argv[2]);
        link t = malloc(sizeof(*t)) , x=t , a;
        t->item = 1; t->next = t;
    
        for(i=2 ; i <= N ; i++)
        {
            x = x->next = malloc(sizeof(*x));
            x->item = i; x->next = t;
        }
    
        while(x != x->next)
        {
            for(i=1 ; i < M ; i++)
                x = x->next;
            a = x->next ;
            x->next= a->next;
            free(a);
        }
        printf("%d
    ",x->item);
        return 0;
    } 
    

    bug无尽,如有不足之处,欢迎各位道长分享评论

  • 相关阅读:
    Android动态加载jar/dex
    aiXcoder安装&使用
    笨办法学python 13题:pycharm 运行
    python2.7安装numpy、pandas、matplotlib库
    win10在文件夹下打开powershell
    SpringCloud:(一)服务注册与发现
    pycharm2018.2安装
    Python2.7安装&配置环境变量
    centos7配置NTP时间服务器
    centos7:Zookeeper集群安装
  • 原文地址:https://www.cnblogs.com/wdg-blog/p/12450013.html
Copyright © 2011-2022 走看看