问题的引入:
在C语言中,向系统申请空间,是不是必须要先规定大小
int a[];//error
缺陷: 1,造成内存资源的浪费
2,不能完全保证分配的空间够用
==> 按需分配: 链表
新内容,却是老面孔:因为链表就是由一个或多个结构体通过指针指向关系构成的。
我们先看这样的一种结构体类型(带指针成员)
定义结构体变量方式:
1,栈空间:变量名不能重复,过了生存期自动释放
2,堆空间:malloc只需要保存地址就可以了,生存期随进程持续性
概念:链表就是由一个或多个含有指针成员的结构体,通过其指针成员的
地址指向,形成了一种逻辑上的链式数据结构。
我们把每个结构体变量称为该链表的结点(node)
首结点(head):链表中唯一一个只指向别的结点,而不被其他结点指向的结点。
首结点的地址就是整个链表的首地址,它可以代表整个链表。
尾结点(tail):链表中唯一一个只被别的结点指向,而不指向任何结点的结点。
尾结点的next成员的值一般是NULL(单链表中)
因此:(1)只要知道首结点的地址,则其他结点的数据就都能访问
(2)保存新的数据,只需要再创建一个结点,然后赋值添加进链表即可。
链表的创建步骤
(1)每需要保存一个数据,就创建一个结点(结构体)
(2)把数据写入到结点中去
(3)把结点加入到链表
创建过程:
(1)从无到有:第一个结点诞生,此时首结点和尾结点都是它本身
(2)从少到多(添加):
在后面添加(尾插法)
在前面添加(头插法)
尾插法: 新结点接在尾结点后面,即尾结点指向新的结点,
然后尾结点被新结点替代。
特点:先链入的结点在前面,后链入的结点在后面
头插法: 新结点接在首结点前面,即新的结点指向首结点,
然后首结点被新结点替代。
特点:后链入的结点在前面,先链入的结点在后面。