双向链表,又称为双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。
0.0. 节点结构
0.1 带头结点和不带头节点
带头结点的双向链表,在操作链表时比较的容易,比如说,删除首元结点,在首元结点前面插入节点较没有头结点的链表判断要少。
1.创建双向链表
1.0.准备工作
#define ERROR 0
1.1.创建头结点和首元结点
创建头结点和首元结点,并让头结点的next指向首元结点
①.创建头结点p
②创建首元结点temp
③使p的后继指向temp
④使temp的前驱指向p
⑤把p移到首元结点,方便下一次插入
// 创建双向链接
2.打印链表
// 打印循环链表的元素
在main函数里面使用后在控制台打印如下
3.插入数据
3.1.在非尾节点插入
①遍历得到需要插入位置的上一个节点(p)
②创建需要插入的节点temp
③让p的next节点的prior指向temp (p.next.prior -> temp),这时③2就断开了
④让temp的next指向p的next (temp.next -> p.next)
⑤让p的next指向temp (p.next->temp),这时⑤2断开
⑥让temp的prior指向p
注意:上面的③和④必须在⑤和⑥的前面,且位置不能交换,当然③和④可以交换,⑤和⑥也可以交换
3.2.在尾部插入
③让p的next指向temp
④让创建temp的prior指向p
//双向链表插入元素
插入打印结果
4.双向链表的删除
①遍历需要删除节点的上一个节点得到节点p
②让p的next指向p的next的next (p.next=p.next.next),此时②1断开
③让p的next的next的prior指向p (p.next.next->p), 此时③2断开
④释放deleNode (free(deleNode))
// 删除双向链表指定位置上的结点
删除节点的打印
5.删除指定元素()
一般只删除第一次查找到的元素
// 删除双向链表指定的元素
6.查找元素
// 在双向链表中查找元素
7.更新元素
//更新结点