数据结构第三课 -----线性表之双向链表

作者前言

🎂 ✨✨✨✨✨✨🍧🍧🍧🍧🍧🍧🍧🎂
​🎂 作者介绍: 🎂🎂
🎂 🎉🎉🎉🎉🎉🎉🎉 🎂
🎂作者id:老秦包你会, 🎂
简单介绍:🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂
喜欢学习C语言和python等编程语言,是一位爱分享的博主,有兴趣的小可爱可以来互讨 🎂🎂🎂🎂🎂🎂🎂🎂
🎂个人主页::小小页面🎂
🎂gitee页面:秦大大🎂
🎂🎂🎂🎂🎂🎂🎂🎂
🎂 一个爱分享的小博主 欢迎小可爱们前来借鉴🎂


双向链表

  • **作者前言**
  • 链表的差别
  • 带头双向循环链表的实现
    • 链表初始化
    • 节点创建
    • 链表的尾插
    • 链表尾删
    • 打印链表
    • 链表头插
    • 链表头删
    • 判断链表是否为空
    • 链表pos前插入
    • 计算链表长度
    • 链表删除pos前一个节点
    • 删除pos节点
    • 释放链表
    • 顺序表和链表的差异

链表的差别

在这里插入图片描述

  1. 无头单向非循环链表:结构简单,一般不会单独用来存数据。实际中更多是作为其他数据结
    构的子结构,如哈希桶、图的邻接表等等。另外这种结构在笔试面试中出现很多。
  2. 带头双向循环链表:结构最复杂,一般用在单独存储数据。实际中使用的链表数据结构,都
    是带头双向循环链表。另外这个结构虽然结构复杂,但是使用代码实现以后会发现结构会带
    来很多优势,实现反而简单了,后面我们代码实现了就知道了。

带头双向循环链表的实现

在这里插入图片描述

我们需要的当这种链表为空时,
在这里插入图片描述
这个小知识一定要记住

链表初始化

DLists* plist = (DLists*)malloc(sizeof(DLists));plist->next = plist;plist->prev = plist;

一个节点要包含三部分分别是值,两个指针

节点创建

//创建节点
DLists* CreateNode(DLDataType elemest)
{DLists* newnode = (DLists*)malloc(sizeof(DLists));newnode->next = newnode;newnode->prev = newnode;newnode->val = elemest;return newnode;
}

链表的尾插

在这里插入图片描述

void DLPushBack(DLists* plist, DLDataType elelmest)
{assert(plist);//创建节点 DLists* newnode = CreateNode(elelmest);DLists* n = plist->prev;newnode->next = plist;newnode->prev = n;n->next = newnode;plist->prev = newnode;}

这里我们只需要更改四个指针指向就可以,分别是哨兵位的 、prev 和新节点的prev 、next和旧节点的next

链表尾删

在这里插入图片描述

void DLPopBack(DLists* plist)
{assert(plist->next != plist && plist);//保存最后一个节点的地址DLists* p = plist->prev;plist->prev = p->prev;DLists* p1 = p->prev;p1->next = plist;free(p);
}

这样写可以防止只有一个节点的时候报错
我们可以创建两个指针,一个指向要free的节点,一个是要和哨兵位关联的节点也就是d2

打印链表

在这里插入图片描述
我们可以从d1这个节点开始打印,遇见头节点就结束

//打印
void DLPrint(DLists* plist)
{assert(plist);printf("哨兵位");DLists* tail = plist->next;while (tail != plist){printf("<=>%d", tail->val);tail = tail->next;}printf("<=>哨兵位\n");
}

链表头插

在这里插入图片描述
我们可以创建一个指针用于存储d1的地址,然后把节点插入,这样可以简单快捷

//头插
void DLPushFront(DLists* plist, DLDataType elemest)
{assert(plist);DLists* n1 = plist->next;//创建节点DLists* newnode = CreateNode(elemest);plist->next = newnode;newnode->prev = plist;n1->prev = newnode;newnode->next = n1;
}

链表头删

在这里插入图片描述
当我们删除到哨兵位就不要删除了

//头删
void DLPopFront(DLists* plist)
{assert(plist->next != plist && plist);// 保存下一个节点DLists *nextnode = plist->next;DLists* nexnode_next = nextnode->next;plist->next = nexnode_next;nexnode_next->prev = plist;free(nextnode);}

判断链表是否为空

// 判断链表是否为空
bool Empty(DLists* plist)
{assert(plist);return plist->next == plist;
}

链表pos前插入

在这里插入图片描述

//在pos前面插入
DLists* DLPushbefore(DLists* plist, DLists* pos, DLDataType elemest)
{assert(plist);//创建节点DLists* newnode = CreateNode(elemest);//pos的前一个节点DLists* node = pos->prev;pos->prev = newnode;newnode->next = pos;newnode->prev = node;node->next = newnode;}

计算链表长度

// 长度
int DLSize(DLists* plist)
{assert(plist);DLists* tail = plist->next;int size = 0;while (tail != plist){size++;tail = tail->next;}return size;}

链表删除pos前一个节点

//删除pos前一个节点
DLists* DLPopbefore(DLists* plist, DLists* pos)
{assert(plist && pos);assert(pos->prev != plist);//前一个节点DLists* n2 = pos->prev;//前前一个节点DLists* n1 = n2->prev;n1->next = pos;pos->prev = n1;free(n2);
}

删除pos节点

// 删除 pos节点
DLists* DLPop(DLists* plist, DLists* pos)
{assert(plist && pos);assert(pos!= plist);//pos前一个节点DLists* n2 = pos->prev;//pos后一个节点DLists* n1 = pos->next;n2->next = n1;n1->prev = n2;free(pos);
}

释放链表

在这里插入图片描述
从d1开释放,遇见head停止

//释放链表
void DLDestroy(DLists** plist)
{assert(*plist && plist);DLists* tail = (*plist)->next;while (tail != *plist){DLists* node = tail;tail = tail->next;free(node);}free(*plist);*plist = NULL;}

顺序表和链表的差异

在这里插入图片描述
链表的优势

  1. 任意位置插入和删除都是O(1),前提是知道位置
  2. 按需申请和释放

缺点问题
3. 下标随机访问不方便,物理空间不连续,O(n)
4. 链表不好排序

顺序表的问题
5. 头部插入或者中间插入删除效率低下,要移动数据
6. 空间不够要扩容,扩容会有一定消耗且可能存在一定的空间浪费.
7. 只适合尾插尾删

优势
支持下标的随机访问

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/175449.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VS Code画流程图:draw.io插件

文章目录 简介快捷键 简介 Draw.io是著名的流程图绘制软件&#xff0c;开源免费&#xff0c;对标Visio&#xff0c;用过的都说好。而且除了提供常规的桌面软件之外&#xff0c;直接访问draw.io就可以在线使用&#xff0c;堪称百分之百跨平台&#xff0c;便捷性直接拉满。 那么…

Looking for downloadable pre-built shared indexes关闭

这个功能很烦,把他关闭就行了 PyCharm的“Looking for downloadable pre-built shared indexes”是指PyCharm IDE中的一个功能&#xff0c;用于搜索和下载可共享的预构建索引。 这个功能的主要用途是帮助开发人员在开发过程中快速地获取和使用预构建的索引&#xff0c;以提高…

Supervisor管理器

如果宝塔版本是低于 7.9 可以选用supervisor 管理器&#xff0c;宝塔7.9及以上版本此工具可能出BUG&#xff0c;请选择 堡塔应用管理器跳过本页&#xff0c;看堡塔应用管理器 Supervisor 管理器 和 堡塔应用管理器 二选一使用 步骤总结&#xff1a; 一、切换PHP命令行版本和站…

一文解码语言模型:语言模型的原理、实战与评估

在本文中&#xff0c;我们深入探讨了语言模型的内部工作机制&#xff0c;从基础模型到大规模的变种&#xff0c;并分析了各种评价指标的优缺点。文章通过代码示例、算法细节和最新研究&#xff0c;提供了一份全面而深入的视角&#xff0c;旨在帮助读者更准确地理解和评估语言模…

创建具有负载平衡和集群的可扩展 Node.js 应用程序

创建具有负载平衡和集群的可扩展 Node.js 应用程序 负载平衡是提高应用程序性能、可扩展性和可用性的一项重要技术。当客户端向负载均衡器发出请求时&#xff0c;负载均衡器根据预定义的规则将请求分发到不同的实例。 可以使用cluster集群模块或 PM2 等工具根据负载均衡器的流…

使用vue2实现todolist待办事项

个人名片&#xff1a; &#x1f60a;作者简介&#xff1a;一名大二在校生 &#x1f921; 个人主页&#xff1a;坠入暮云间x &#x1f43c;座右铭&#xff1a;懒惰受到的惩罚不仅仅是自己的失败&#xff0c;还有别人的成功。 &#x1f385;**学习目标: 坚持每一次的学习打卡 文章…

Java版B/S架构云his医院信息管理系统源码(springboot框架)

一、技术框架 ♦ 前端&#xff1a;AngularNginx ♦ 后台&#xff1a;JavaSpring&#xff0c;SpringBoot&#xff0c;SpringMVC&#xff0c;SpringSecurity&#xff0c;MyBatisPlus&#xff0c;等 ♦ 数据库&#xff1a;MySQL MyCat ♦ 缓存&#xff1a;RedisJ2Cache ♦ 消息队…

Android设计模式--工厂模式

一&#xff0c;定义 工厂模式与Android 设计模式--单例模式-CSDN博客&#xff0c;Android设计模式--Builder建造者模式-CSDN博客&#xff0c;Android设计模式--原型模式-CSDN博客 一样&#xff0c;都是创建型设计模式。 工厂模式就是定义一个用于创建对象的接口&#xff0c;让…

pycharm pro v2023.2.4(Python编辑开发)

PyCharm2023是一款集成开发环境&#xff08;IDE&#xff09;&#xff0c;专门为Python编程语言设计。以下是PyCharm2023的一些主要功能和特点&#xff1a; 代码编辑器&#xff1a;PyCharm2023提供了一个功能强大的代码编辑器&#xff0c;支持语法高亮、自动补全、代码调试、版…

【移远QuecPython】EC800M物联网开发板的MQTT协议腾讯云数据上报

【移远QuecPython】EC800M物联网开发板的MQTT协议腾讯云数据上报 文章目录 导入库初始化设置MQTT注册回调订阅发布功能开启服务发送消息函数打包调用测试效果附录&#xff1a;列表的赋值类型和py打包列表赋值BUG复现代码改进优化总结 py打包 导入库 from TenCentYun import TX…

无标题栏的Qt子窗体在父窗体中停靠时,如何做到严丝合缝

目录 1. 问题的提出 2. 一般实现 3. 加强版 1. 问题的提出 由于业务的要求&#xff0c;需要从父窗体弹出一个子窗体&#xff0c;该子窗体无标题栏&#xff0c;且该子窗体要停靠到父窗体右下角。这个看似很容易的问题&#xff0c;细研起来其实不容易&#xff01; 2. 一般实现…

VScode+python开发,多个解释器切换问题

内容&#xff1a;主要VScode使用多个解释器 环境准备 VScode编辑器&#xff0c;两个版本python解释器 python3.7.2 python3.11.6 问题&#xff1a; 目前我们的电脑安装了python3.7.2、python3.11.6两个解释器&#xff0c;在vscode编辑器中&#xff0c;无法切换解释器使用如…