今天主要学习了C语言的结构体与链表
一,结构体
1;关于c语言结构体的引入;
在前面已经介绍了整形(int,long,….),浮点型(flaot,double),字符型(char),还介绍了数组(存储一组具有相同类型的数据),字符串。但是在实际问题中只有这些数据类型是不够的,有时候我们需要其中的几种一起来修饰某个变量,例如一个学生的信息就需要学号(字符串),姓名(字符串),成绩(整形)等等,这些数据类型都不同但是他们又是表示一个整体,要存在联系,那么我们就需要一个新的数据类型。
——结构体,他就将不同类型的数据存放在一起,作为一个整体进行处理。
2.结构体声明;
这个声明描述了一个由两个字符数组和一个float变量组成的结构体,但是注意,他并没有创建一个实际的数据对象,而是描述了一个组成这类对象的元素,【因此,我们也有时候将结构体声明叫做模板,因为它勾勒出数据该如何存储,并没有实例化数据对象】。
下面介绍一下上面的结构体声明;
1,首先使用关键字struct,他表示接下来是一个结构体。
2;后面是一个可选的标志(student),它是用来引用该结构体的快速标记,可省略,但一般不省。因此我们以后就会可以这样创建数据对象
其中 ; 不可省略
可以给后面自定义变量s1,s2,也可以让用户自己定义。并且定义的变量在全局区
主函数
3.等量代换:(*s).id <==> s-> id
3.结构体对齐
系统由一的浪费几个字节来提高运行效率(用空间换时间)
1、结构体按照其最长成员大小对齐,意味着最终的大小必须是最长成员大小的整数倍;
2、结构体成员按照结构体成员声明先后次序依次存放,并且每个成员的首字节放置的位置必须能够整除成员的字节数;
红色和绿色的是存了的地址,白色的就是浪费的空间,所以说对齐方式很浪费空间,可是按照计算机的访问规则,这种方式提高了效率。
从上可以看出,该结构体的大小为:1 + 4 + 1 + 3(浪费的空间(白色)) = 9,然后通过法则2知道9是不行的,要偏移到12,因为总大小要是最大对齐数的整数倍
3、如果结构体某个成员的字节数大于CPU的字节数,则最长按照CPU的字节数对齐;
4、用预处理命令#pragma pack(n) 可以强制编译器按照指定的n来对齐,合法的n的数值分别是1、2、4、8、16。
二,用指针处理结构体
一个结构体变量的指针就是该变量所占据的内存段的起始地址。可以设一个指针变量,用来指向一个结构体变量,此时该指针变量的值是结构体变量的起始地址。指针变量也可以用来指向结构体数组中的元素。
1.打印函数
2.交换函数
3.逆序函数
4.qSort快排和主函数
三,用指针处理链表
链表每个节点的地址不连续,不能用+i 访问第i个节点,只能挨个访问;有头链表:在指针和头节点之间加一个首节点,避免指针的指针出现;
1.头插法:每个新节点都是首节点
什么是头插法? 在插入时,新的结点插入到当前链表的表头。
2.头插法代码
首先定义一个pHead为空指针NULL;
创建一个新的节点pNew;
pHead先把他自身的地址NULL给pNew作地址;
pHead再指向pNew
随后pNew的值被定义,此时pNew变成头节点,并且pHead指向pNew;pNew被销毁;
随后再创一个节点pNew;
pHead把头节点的地址再给pNew,此时,新的pNew指向头节点;
pHead再指向pNew,以此类推,
最终创建出一个链表,最开始插入的节点被排在最后一位节点,地址为NULL,最后一个插入的节点为头节点;
3.头插法打印函数
4.链表的有效字节数
5.是否为空链表
6.主函数
7.输出结果