一、双向链表
1、定义:从下图中的定义结点的代码我们能发现,双向与单向最明显的区别就是是否可以反向查找上一结点。
2、创建:大致和单向的创建差不多,区别在于多了prior的处理
步骤:
1、*L 指向头结点
2、新增数据:
2.1.创建1个临时的结点
2.2.为新增的结点建立双向链表关系
① temp 是p的后继
② temp 的前驱是p
③ p 要记录最后的结点的位置,方便下一次插入
3、插入:
步骤:
1. 插入的位置不合法 为0或者为负数
2. 新建结点
3.将p指向头结点!
4. 找到插入位置i直接的结点
5. 如果插入的位置超过链表本身的长度
6. 判断插入位置是否为链表尾部
1️⃣ 将p->next 结点的前驱prior = temp
2️⃣ 将temp->next 指向原来的p->next
3️⃣ p->next 更新成新创建的temp
4️⃣ 新创建的temp前驱 = p
4、删除
1.判断双向链表是否为空,如果为空则返回0
2. 将指针p移动到删除元素位置前一个
3.如果k>i 或者 p == NULL 则返回0
4.创建临时指针delTemp 指向要删除的结点,并将要删除的结点的data 赋值给*e,带回到main函数
5. p->next 等于要删除的结点的下一个结点
6. 如果删除结点的下一个结点不为空,则将将要删除的下一个结点的前驱指针赋值p
7. 删除delTemp结点
二、双向循环链表
1、创建
步骤:
1、*L 指向头结点
2、新增数据:
2.1.创建1个临时的结点
2.2.为新增的结点建立双向链表关系
① temp 是p的后继
② temp 的前驱是p
③ temp的后继是*L
④ p 的前驱是新建的temp
⑤ p 要记录最后的结点的位置,方便下一次插入
2、插入
步骤:
1. 创建指针p,指向双向链表头
2.双向循环链表为空,则返回0
3.找到插入前一个位置上的结点p
4.如果i>index 则返回0
5.创建新结点temp
6.temp 结点为空,则返回error
7.将生成的新结点temp数据域赋值e.
8.将结点temp 的前驱结点为p;
9.temp的后继结点指向p->next;
10.p的后继结点为新结点temp;
11.如果temp 结点不是最后一个结点,temp节点的下一个结点的前驱为temp 结点
3、删除
步骤:
1.如果删除到只剩下首元结点了,则直接将*L置空;
2.找到要删除的结点
3.给e赋值要删除结点的数据域
4.修改被删除结点的前驱结点的后继指针
5.修改被删除结点的后继结点的前驱指针
6. 删除结点temp