结构体,用指针处理结构体.链表

今天主要学习了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.输出结果

  • 22
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值