数据结构入门 — 链表详解_双向链表

简介: 数据结构入门 — 双向链表详解双向链表(Doubly Linked List)是一种链表数据结构,它的每个节点都含有两个指针,一个指向前一个节点,一个指向后一个节点。相比较于单向链表,双向链表可以双向遍历,即可以从头到尾或从尾到头遍历链表。在双向链表中,每个节点包含两个指针域和一个数据域。其中,一个指针指向前驱节点,另一个指针指向后继节点。

前言

数据结构入门 — 双向链表详解

关注博主,后期持续更新系列文章

*****感谢观看,希望对你有所帮助*****


系列文章

第一篇:数据结构入门 — 链表详解_单链表

第二篇:数据结构入门 — 链表详解_双向链表

第三篇:数据结构入门 — 链表详解_循环链表


文章目录

前言

系列文章

什么是双向链表

概念与结构(图文)

双向链表与单链表的区别

带头双向循环链表接口实现(代码演示)

1. 动态存储结构

2.双向链表打印

3.增删查改接口

4.双向链表销毁

五、所有文件代码

1. Gitee链接

总结


什么是双向链表

双向链表(Doubly Linked List)是一种链表数据结构,它的每个节点都含有两个指针,一个指向前一个节点,一个指向后一个节点。相比较于单向链表,双向链表可以双向遍历,即可以从头到尾或从尾到头遍历链表。在双向链表中,每个节点包含两个指针域和一个数据域。其中,一个指针指向前驱节点,另一个指针指向后继节点。这两个指针使得双向链表的插入、删除等操作不需要像单向链表那样需要遍历整个链表来寻找前驱节点,提高了链表的操作效率。


概念与结构(图文)

image.png

带头双向循环链表:结构最复杂,一般用在单独存储数据。实际中使用的链表数据结构,都是带头双向循环链表。另外这个结构虽然结构复杂,但是使用代码实现以后会发现结构会带来很多优势,实现反而简单了,后面我们代码实现了就知道了。


双向链表与单链表的区别

双向链表和单链表是两种不同的链表结构。


单向链表是一种链表,在每个节点中包含指向下一个节点的指针。这意味着在单向链表中,节点只能从头开始遍历到尾部。在单向链表中,每个节点只存储指向下一个节点的指针,而不存储指向前一个节点的指针。


双向链表是一种链表,在每个节点中包含指向下一个节点和前一个节点的指针。这意味着在双向链表中,节点可以被从头到尾或从尾到头遍历。在双向链表中,每个节点存储指向前一个节点和下一个节点的指针。


因此,双向链表可以更方便地进行双向遍历,但是需要更多的内存空间来存储每个节点的两个指针。相比之下,在单向链表中,只需要一个指针来指向下一个节点,因此内存占用量更小。


带头双向循环链表接口实现(代码演示)

带头+双向+循环链表增删查改实现


1. 动态存储结构

typedefintSTDataType;
typedefstructListNode{
structListNode*prev;
structListNode*next;
STDataTypedata;
}LTNode;

双向链表打印

voidLTPrint(LTNode*phead)
{
assert(phead);
printf("phead<->");
//跳过哨兵位LTNode*cur=phead->next;
while (cur!=phead)
    {
printf("%d<->", cur->data);
cur=cur->next;
    }
printf("\n");
}

增删查改接口

根据增删查改顺序编排


双向链表头插:

//头插voidLTPushFront(LTNode*phead, STDataTypex)
{
assert(phead);
LTNode*newnode=BuyLTNode(x);
LTNode*first=phead->next;
newnode->next=first;
first->prev=newnode;
phead->next=newnode;
newnode->prev=phead;
}

双向链表尾插:

//尾插voidLTPushBack(LTNode*phead, STDataTypex)
{
assert(phead);
LTNode*newnode=BuyLTNode(x);
//找到最后一个LTNode*tail=phead->prev;
newnode->prev=tail;
tail->next=newnode;
newnode->next=phead;
phead->prev=newnode;
}

双向链表头删:

//头删voidLTPopFront(LTNode*phead)
{
assert(phead);
assert(phead->next!=phead);
LTNode*first=phead->next;
LTNode*second=first->next;
free(first);
phead->next=second;
second->prev=phead;
}

双向链表尾删:

//尾删voidLTPopBack(LTNode*phead)
{
assert(phead);
assert(phead->next!=phead);
LTNode*tail=phead->prev;
LTNode*tailprev=tail->prev;
free(tail);
phead->prev=tailprev;
tailprev->next=phead;
}

查找:

LTNode*LTFind(LTNode*phead, STDataTypex)
{
assert(phead);
LTNode*cur=phead->next;
while (cur!=phead)
    {
if (cur->data==x)
        {
returncur;
        }
cur=cur->next;
    }
returnNULL;
}

在指点位置插入:

voidLTInsert(LTNode*pos, STDataTypex)
{
LTNode*newnode=BuyLTNode(x);
LTNode*posprev=pos->prev;
newnode->next=pos;
pos->prev=newnode;
posprev->next=newnode;
newnode->prev=posprev;
}

在指点位置删除:

// 把pos删除voidLTErase(LTNode*pos)
{
LTNode*posprev=pos->prev;
LTNode*posnext=pos->next;
free(pos);
posprev->next=posnext;
posnext->prev=posprev;
}

双向链表销毁

voidLTDestory(LTNode*phead)
{
LTNode*cur=phead->next;
while (cur!=phead)
    {
LTNode*next=cur->next;
free(cur);
cur=next;
    }
free(phead);
phead=NULL;
}

五、所有文件代码


1. Gitee链接

***查看所有代码***

点击右边蓝色文字 DuckBro Gitee 代码仓库


总结

带头双向循环链表的基本概念和常见操作。带头双向循环链表是一种特殊的双向链表,它多了一个头节点和一个尾节点,并且首尾相连形成一个环。


这样可以实现循环遍历链表。在带头双向循环链表中,插入、删除节点等操作都有特殊处理方式。带头双向循环链表在实际应用中比较常见,如操作系统中的进程管理、音乐播放器中的播放列表等。


如这篇博客对大家有帮助的话,希望 三连 支持一下 !!! 如果有错误感谢大佬的斧正 如有 其他见解发到评论区,一起学习 一起进步。


目录
相关文章
|
21天前
|
存储 C语言
【数据结构】手把手教你单链表(c语言)(附源码)
本文介绍了单链表的基本概念、结构定义及其实现方法。单链表是一种内存地址不连续但逻辑顺序连续的数据结构,每个节点包含数据域和指针域。文章详细讲解了单链表的常见操作,如头插、尾插、头删、尾删、查找、指定位置插入和删除等,并提供了完整的C语言代码示例。通过学习单链表,可以更好地理解数据结构的底层逻辑,提高编程能力。
48 4
|
22天前
|
算法 安全 搜索推荐
2024重生之回溯数据结构与算法系列学习之单双链表精题详解(9)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第2.3章之IKUN和I原达人之数据结构与算法系列学习x单双链表精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
22天前
|
存储 Web App开发 算法
2024重生之回溯数据结构与算法系列学习之单双链表【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构之单双链表按位、值查找;[前后]插入;删除指定节点;求表长、静态链表等代码及具体思路详解步骤;举例说明、注意点及常见报错问题所对应的解决方法
|
21天前
|
C语言
【数据结构】双向带头循环链表(c语言)(附源码)
本文介绍了双向带头循环链表的概念和实现。双向带头循环链表具有三个关键点:双向、带头和循环。与单链表相比,它的头插、尾插、头删、尾删等操作的时间复杂度均为O(1),提高了运行效率。文章详细讲解了链表的结构定义、方法声明和实现,包括创建新节点、初始化、打印、判断是否为空、插入和删除节点等操作。最后提供了完整的代码示例。
39 0
|
1月前
|
存储
[数据结构] -- 双向循环链表
[数据结构] -- 双向循环链表
23 0
|
1月前
|
存储
探索数据结构:便捷的双向链表
探索数据结构:便捷的双向链表
|
1月前
|
存储
探索数据结构:单链表的实践和应用
探索数据结构:单链表的实践和应用
|
5月前
|
存储 SQL 算法
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
|
5月前
|
存储 SQL 算法
LeetCode 题目 86:分隔链表
LeetCode 题目 86:分隔链表
|
5月前
|
存储 算法 Java
【经典算法】Leetcode 141. 环形链表(Java/C/Python3实现含注释说明,Easy)
【经典算法】Leetcode 141. 环形链表(Java/C/Python3实现含注释说明,Easy)
56 2

热门文章

最新文章

下一篇
无影云桌面