伊吖学C笔记(8、结构体、链表、union、enum、typedef)
伊吖学C笔记(结构体)
一、结构体
如果说单个数据(比如一个int、一个char,一个double)是一维数据,那结构体就是一个二维数据,把几个相关数据当作一行记录(一个记录包含几个数据),这样更方便处理大量同属性的对象。这个记录的形式就是构造数据类型,多个记录形成了一张二维表,这也是最常见的(比如电子表格、数据库)的数据存储的基本形式。看看某班的花名册:
每个人都有5项基本属性,人数很多,我们可以如下定义。
1.定义。
关键字struct不能省,花括号外的“;”不能省。
也可以定义结构时,同时定义结构体变量,这样:
这个st1,就是结构体变量名,用来标注一行记录。
当然,也可以在结构体定义后,单独定义:
除了定义变量,同样可以定义数组、指针:
单独定义结构体指针:
对于字符串数组,可以这样定义:char *name。
可以看出结构体把不同类型的数据,定义在一起,体现了对数据管理的灵活性。
2.赋值。
定义直接赋值:
数组赋值:
数组是双花括号,中间有“,”,最后结尾有“;”。
键盘输入赋值:
结构体指针的使用:&p->no等同于&(p->no),->优先级高,意思是指针p指向成员no的地址。
3.输出。
通常用指针输出:
结构体数组的输出形式:
通过定义结构体函数的输出方式:
4.结构体嵌套。
输出:
变量的引用为分级的“树”型引用。
5.结构体按关键字排序。
二、共用体
类似结构体定义、赋值。
关键字union不可少,可声明多个成员,最后一次成员赋值被保存,有效。
最后一次赋值类型为有效类型,*name长度为4字节,而name[9]以4为倍数的长度,超过8为12字节。
数组形式不适合共用体。
三、枚举类型
一周七天,一年12个月,等等,可以确定成员数量的类型,定义为枚举:
变量只能是其中一个,长度为4字节。
发生跳跃,自动顺延。
四、类型说明符
typedef,这是组合词,type类型def定义,功能就是取个新名字简化定义。
一般用大写表示。
五、链表
1.链表定义
数据由一节一节组成,前面是数据域,存放数据,后面是指针域,存放指针,即下一节点的首地址。最后一个指针域为空NULL。每个节点使用动态内存分配malloc(),节点之间可以有距离。
也就是说,在结构体内要定义一个指针,指针要指向下一个结构体,从而形成链表形式。一个结构体的长度确定了,就是链表一节的长度。此例为12字节。
2.链表赋值
声明A、B、C三个结构体指针,分配三节内存(每节12字节),写入数据,通过指针传递实行首尾相连,最后一个指向NULL。
可以看出,12字节长度的链表,相距24字节。
3.链表打印输出
循环体内加个指针传递,实现遍历输出。
4.链表的实际变化
如果这个链表一个数据也没有,是个空链表,那就必须要有一个头节点,不含数据,只有一个指针,指向NULL。
增加了一个头节点head,只有指针没有数据,内存空间还是在的,输出了乱七八糟。这样似乎浪费了一个空间,把它利用起来,也就是头节点也记录数据。
这样,如果没有数据,只有头,head->next=NULL;如果有一个数据,数据存在头部,head->next=NULL。
也可以先声明空指针struct stu *head=NULL;然后指向第一节。
在实际操作链表时,不可能每一节都声明一个指针(象B、C),它需要动态存入数据,比如1000个节点后再增加一个节点数据,这时我们可以用函数构建一个循环体,来增加节点和数据。
主函数里如下调用:
如果是在链表前添加数据,可以这样:
5.释放链表内存
6.链表删除节点
主程序调用如下:
至此,struct、union、enum、typedef、链表,我们就有了基本了解。
7、链表应用场景
六、结构体应用例子
结构体很适合大量成组、成对数据的操作,比如学生统计表、单位员工信息表工资表、xy坐标、地理经纬度、字典键值对等。
例子:输入一段文本,现在要把里面的省份名全部替换成省份简称?
思路:首先是建立省份全称、简称结构体,象这样:
{ {"北京市", "京"}, {"天津市", "津"},....},然后到文本中查找“北京市”,找到替换,再找,直到找不到为止;再开始“天津市”...直到全部完成。关于在一段文本查找字符串,我们学过:字符串截取strncpy(a,b+索引,长度)、字符串比较strcmp(a,b)两个函数,可以在文本中从头到尾(不能跳)截串比较。还有更好的函数strstr(a,b),返回b在a中索引。
代码实现:
替换函数代码:
主调用函数代码及结果: