天来总结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\n",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\n",x->item);
return 0;
}

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

C结构体与链表的更多相关文章

  1. C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com

    原文:C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | I ...

  2. 六、golang中的结构体和方法、接口

    结构体: 1.用来自定义复杂数据结构 2.struct里面可以包含多个字段(属性) 3.struct类型可以定义方法,注意和函数的区分 4.strucr类型是值类型 5.struct类型可以嵌套 6. ...

  3. Linux设备驱动--块设备(二)之相关结构体

    上回最后面介绍了相关数据结构,下面再详细介绍 块设备对象结构 block_device 内核用结构block_device实例代表一个块设备对象,如:整个硬盘或特定分区.如果该结构代表一个分区,则其成 ...

  4. Linux设备驱动--块设备(二)之相关结构体(转)

    上回最后面介绍了相关数据结构,下面再详细介绍 块设备对象结构 block_device 内核用结构block_device实例代表一个块设备对象,如:整个硬盘或特定分区.如果该结构代表一个分区,则其成 ...

  5. linux块设备驱动---相关结构体(转)

    上回最后面介绍了相关数据结构,下面再详细介绍 块设备对象结构 block_device 内核用结构block_device实例代表一个块设备对象,如:整个硬盘或特定分区.如果该结构代表一个分区,则其成 ...

  6. 【原创】只学到二维数组和结构体,不用链表也能写一个C贪食蛇?(四)

    全系列Index: [原创]只学到二维数组和结构体,不用链表也能写一个C贪食蛇?(一) [原创]只学到二维数组和结构体,不用链表也能写一个C贪食蛇?(二) [原创]只学到二维数组和结构体,不用链表也能 ...

  7. C结构体变量2种运算(比如链表的结点)(区别与java)

    a结构体变量,只能做两种运算, 整体引用(赋值,参数传递) 或访问成员(点运算—地址方式简化,地址方式)(见最后的图片) case万: 结论:java里面的class Node : Node p; p ...

  8. c语言结构体链表

    原文链接:http://zhina123.blog.163.com/blog/static/417895782012106036289/ 引用自身的结构体,一个结构体中有一个或多个成员的基类型就是本结 ...

  9. go语言之行--结构体(struct)详解、链表

    一.struct简介 go语言中没有像类的概念,但是可以通过结构体struct实现oop(面向对象编程).struct的成员(也叫属性或字段)可以是任何类型,如普通类型.复合类型.函数.map.int ...

随机推荐

  1. SAGE|DNA微阵列|RNA-seq|lncRNA|scripture|tophat|cufflinks|NONCODE|MA|LOWESS|qualitile归一化|permutation test|SAM|FDR|The Bonferroni|Tukey's|BH|FWER|Holm's step-down|q-value|

    生物信息学-基因表达分析 为了丰富中心法则,研究人员使用不断更新的技术研究lncRNA的方方面面,其中技术主要是生物学上的微阵列芯片技术和表达数据分析方法,方方面面是指lncRNA的位置特征. Bac ...

  2. python3之urllib代理池

    1.常见状态吗 301:重定向到新的URL,永久性302:重定向到临时URL,非永久性304:请求的资源未更新400:非法请求401:请求未经授权403:禁止访问404:没找到对应页面500:服务器内 ...

  3. 转:Zabbix-3.0.x使用OneAlert发送告警

    转自: http://blog.sina.com.cn/s/blog_87113ac20102w7il.html   ( 标签: onealert 分类: zab OneAlert 是国内首个 Saa ...

  4. __filename意思

    __filename 表示当前正在执行的脚本的文件名.它将输出文件所在位置的绝对路径,且和命令行参数所指定的文件名不一定相同. 如果在模块中,返回的值是模块文件的路径.

  5. NERDTree快捷键

    切换工作台和目录 ctrl + w + h 光标 focus 左侧树形目录ctrl + w + l 光标 focus 右侧文件显示窗口ctrl + w + w 光标自动在左右侧窗口切换ctrl + w ...

  6. DIY电压基准测万用表

    | 分类 日志  | 手里有三个常用的手持表,UT61E四位半,优利德明星产品:福禄克F117C,换挡快,单手操作还带LoZ:UT210E小钳表能够通过修改EEPROM更改电表配置,已经刷了6000字 ...

  7. C++扬帆远航——18(项目五2,递归式)

    /* * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:qiushi.cpp * 作者:常轩 * 微信公众号:World ...

  8. android逆向---charles抓包

    手机与电脑处于同一网络环境,且正确设置代理后,charles显示CONNECT失败,提示信息SSL handshake with client failed: An unknown issue occ ...

  9. spring——AOP原理及源码(二)

    回顾: 在上一篇中,我们提到@EnableAspectJAutoProxy注解给容器中加入了一个关键组件internalAutoProxyCreator的BeanDefinition,实际类型为 An ...

  10. js中如何判断属性是对象实例中的属性还是原型中的属性

    ECMAScript5中的hasOwnProperty()方法,用于判断只在属性存在与对象实例中的时候,返回true,in操作符只要通过对象能访问到属性就返回true. 因此只要in操作符返回true ...