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\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结构体与链表的更多相关文章
- C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com
原文:C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | IT宅.com C语言语法笔记 – 高级用法 指针数组 指针的指针 二维数组指针 结构体指针 链表 | I ...
- 六、golang中的结构体和方法、接口
结构体: 1.用来自定义复杂数据结构 2.struct里面可以包含多个字段(属性) 3.struct类型可以定义方法,注意和函数的区分 4.strucr类型是值类型 5.struct类型可以嵌套 6. ...
- Linux设备驱动--块设备(二)之相关结构体
上回最后面介绍了相关数据结构,下面再详细介绍 块设备对象结构 block_device 内核用结构block_device实例代表一个块设备对象,如:整个硬盘或特定分区.如果该结构代表一个分区,则其成 ...
- Linux设备驱动--块设备(二)之相关结构体(转)
上回最后面介绍了相关数据结构,下面再详细介绍 块设备对象结构 block_device 内核用结构block_device实例代表一个块设备对象,如:整个硬盘或特定分区.如果该结构代表一个分区,则其成 ...
- linux块设备驱动---相关结构体(转)
上回最后面介绍了相关数据结构,下面再详细介绍 块设备对象结构 block_device 内核用结构block_device实例代表一个块设备对象,如:整个硬盘或特定分区.如果该结构代表一个分区,则其成 ...
- 【原创】只学到二维数组和结构体,不用链表也能写一个C贪食蛇?(四)
全系列Index: [原创]只学到二维数组和结构体,不用链表也能写一个C贪食蛇?(一) [原创]只学到二维数组和结构体,不用链表也能写一个C贪食蛇?(二) [原创]只学到二维数组和结构体,不用链表也能 ...
- C结构体变量2种运算(比如链表的结点)(区别与java)
a结构体变量,只能做两种运算, 整体引用(赋值,参数传递) 或访问成员(点运算—地址方式简化,地址方式)(见最后的图片) case万: 结论:java里面的class Node : Node p; p ...
- c语言结构体链表
原文链接:http://zhina123.blog.163.com/blog/static/417895782012106036289/ 引用自身的结构体,一个结构体中有一个或多个成员的基类型就是本结 ...
- go语言之行--结构体(struct)详解、链表
一.struct简介 go语言中没有像类的概念,但是可以通过结构体struct实现oop(面向对象编程).struct的成员(也叫属性或字段)可以是任何类型,如普通类型.复合类型.函数.map.int ...
随机推荐
- Linux Ubuntu 安装SSH服务
1.安装SSH命令:sudo apt-get install openssh-server 2.启动SSH服务命令:/etc/init.d/ssh start 3.停止SSH服务命令:/etc/ini ...
- js 实现排序算法 -- 归并排序(Merge Sort)
原文: 十大经典排序算法(动图演示) 归并排序 归并排序是建立在归并操作上的一种有效的排序算法.该算法是采用分治法(Divide and Conquer)的一个非常典型的应用.将已有序的子序列合并,得 ...
- linux下载文件到本地_把linux服务器的文件下到本地windows
tar -cvf script.tar scriptsz script.tar 文件夹先要打包,并且要指定打包的名字. 具体: sz/rz命令: 一般来说,linux服务器大多是通过ssh来进行远 ...
- 整数拆分-dp问题
Integer Partition In number theory and combinatorics, a partition of a positive integer n, also call ...
- 一个自动递增生成目录和文件的cop文件类
package com.hudong.util.orther; import java.io.File; import java.io.FileInputStream; import java.io. ...
- Uber刷单,刷出中国的人性劣根?
美国叫车应用Uber国际化之路一直挺顺利的,融资也挺顺利的,他们现在很有钱,最新总融资金额达到100亿美元,创下美国非上市高科技公司的融资纪录.全新的商业模式,以及优质的客户体验,让Uber ...
- Android 一个3D相册源码
我们专业课有Android的学习,最后老师让做一个简单的Android应用程序.我在网上找些资料,加上自己改造一下做了一个3D相册. 程序仿照Android的相册功能,调用Gallery类对相片进行浏 ...
- 对BFC的深层理解
BFC(Block Formatting Context)块级格式化上下文 注意:BFC首先是块,其次需要具备下面的条件之一才可以(通俗来说,BFC就好比一所985或者211的高校,想要成为985或者 ...
- Internet上的音频/视频概述
Internet上的音频/视频概述 计算机网络最初是为传送数据信息设计的.因特网 IP 层提供的"尽最大努力交付"服务,以及每一个分组独立交付的策略,对传送数据信息也是很合适的. ...
- K-means真的不能使用曼哈顿距离吗?
问题 说到k-means聚类算法,想必大家已经对它很熟悉了,它是基于距离计算的经典无监督算法,但是有一次在我接受面试时,面试官问了我一个问题:“k-means为什么不能使用曼哈顿距离计算,而使用欧式距 ...