2.3.3 双链表
双链表的初始化(带头结点):
双链表的插入:
若p结点是最后一个结点,p->next->prior = s;会出现问题,因此做出如下改进:
双链表的删除:
双链表的遍历:
双链表不可以随机存储,按值查找和按位查找都需要遍历链表,时间复杂度O(n)
知识回顾与重要考点:
2.3.4 循环链表
什么是循环链表?
初始化代码:
循环单链表可以从任何一个结点出发找到任何一个结点
循环双链表:
代码:
双链表的插入:
此时不会出现上一节的问题,因为尾结点的后继结点是头结点
知识回顾与重要考点:
2.3.5静态链表
什么是静态链表?
静态链表:分配一整片连续的内存空间,各个结点集中安置。
用代码定义一个静态链表
方法一:
方法二(课本):
两种方法的验证:
(初始化时,应该把空结点的next设定为-2,防止脏数据)
简述基本操作的实现:
考的少,理解就行
2.3.6 顺序表和链表的比较
Round 1 逻辑结构
都属于线性表,都是线性结构。
Round 2 存储结构
顺序表的优点:支持随机存储,存储密度高
顺序表的缺点:大片连续空间分配不方便,改变容量不方便
链表的优点:离散的小空间分配方便,改变容量方便
链表的缺点:不可随机存储,存储密度低
Round 3 基本操作(创销、增删改查)
创建:
销毁:
malloc申请的空间一定要用free释放
增加和删除:
(若数据元素极大,顺序表的时间代价极高)
查找:
什么时候用顺序表或者链表?