数据结构篇-双向循环链表

news2024/9/21 14:42:56

目录

一、学习目标

二、概念

节点设计:

节点初始化(链表初始化):

节点头插:

插入数据的变形:

遍历显示:

有序插入:

四、总结


一、学习目标

  • 知识点:
    • 一文掌握数据结构的双向循环链表
    • 通过打怪实战来提升自己的理解

二、概念

        对链表而言,双向均可遍历是最方便的,另外首尾相连循环遍历也可大大增加链表操作的便捷性。因此,双向循环链表,是在实际运用中是最常见的链表形态。

节点设计:

// 数据域设计
typedef struct DataType
{
    int Num ;
    char Name[32];
}DataType;


// 节点设计
typedef struct Node
{
    // 数据域
    DataType Data;

    // 指针域
    struct Node * Prev ; // 前驱指针
    struct Node * Next ; // 后继指针
}Node , *P_Node ;

节点初始化(链表初始化):


P_Node NewNode( DataType * NewData )
{
    // 在堆内存中申请一个节点
    P_Node New = calloc(1 , sizeof(Node));

    // 数据域初始化
    if (NewData != NULL)
    {
        memcpy( &New->Data , NewData , sizeof(DataType) );
    }
    

    // 指针域初始化
    New->Next = New->Prev = New ;

    return New ;
}

节点头插:

void Add2Head(P_Node head , P_Node New )
{

    // 中心思想:先对新节点进行操作,然后再操作链表
    // 1. 让【新节点】的【后继指针】指向【第一个有效数据节点】
    New->Next = head->Next ;

    // 2. 让【新节点】的【前驱指针】指向头节点
    New->Prev = head ;

    // 3. 让链表的【头节点】的后继指针指向新节点
    head->Next = New; 

    // 4. 让【第一个有效数据节点】的前驱指针指向新节点
    New->Next->Prev = New ;

    return ;
}

插入数据的变形:

        在一下示例中该函数即可以用于实现头插也可以实现用于尾插。

        中心思想: 当需要把一个新数据插入到链表中的头节点的上一个位置称为尾差,反之插入下一个位置为头插。因此头插尾插的区别就在于把新数据插入到前方或后方的区别。

        

        得到结论:

                把新数据节点插入到目标节点的前方为尾插,因此给一下函数传递的参数就可以写成 Add2List ( 前驱节点 , 新数据 , 目标节点 ) ;

                把新数据节点插入到目标节点的后方为头插 , 因此给一下函数传递的参数就可以写成 Add2List ( 目标节点 , 新数据 , 后继节点 ) ;

void Add2List ( P_Node Prev ,  P_Node New , P_Node Next )
{
    Prev->Next = New ;
    New->Next = Next ;

    Next->Prev = New ;
    New->Prev = Prev ;
}

以上操作函数中的4个步骤不再需要关系先后顺序,因为每一个指针都是独立的,在操作过程中不会丢失。

遍历显示:

void DisplayList( P_Node head )
{

    for (P_Node tmp = head->Next ; tmp != head ; tmp = tmp->Next)
    {
        printf("[%d]%s\n" , tmp->Data.Num , tmp->Data.Name);
    }
}

有序插入:

void Add2List ( P_Node Prev ,  P_Node New , P_Node Next )
{
    Prev->Next = New ;
    New->Next = Next ;

    Next->Prev = New ;
    New->Prev = Prev ;
}


void Add2ListOrder( P_Node head , P_Node New )
{
    P_Node tmp = NULL ;
    for (tmp = head->Next ; tmp != head &&   // 条件1 tmp 不指向头节点
                    tmp->Data.Num < New->Data.Num ;  // 条件2 tmp 的数据小于 新数据的
                     tmp = tmp->Next );  // tmp 往后遍历
    
    Add2List( tmp->Prev , New , tmp );


}

打怪实战:

    • 理解现有代码
    • 尝试自行编写以上操作
    • 尝试实现链表的其他操作,比如增删改查
    • 【拓展】链表生成后使用其他关键字进行排序
    • 【拓展】思考双向循环链表的通用性

BOOS进阶:

    • 回顾本周所学,把不懂的标记出来尽快解决
    • 尝试自行编写双向循环链表的操作(增删改查从新排序等)
      • 【拓展】自行编写双向链表的通用性操作
    • 【拓展】 假设有两个双向循环链表L1,L2尝试编写一个函数用于合并他们,可以尝试完成一下两种合并需求:
      • 直接把L2连接到L1的尾部
      • 把L2有序地合并到L1中

四、总结

        本文介绍了数据结构的双向循环链表的基础概念和操作,理解本文所有知识点后,便可打败其中的小怪,拿下经验值~

        本文参照 粤嵌文哥 部分课件经整理和修改后发布在C站,如有转载,请联系本人

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

芒果RT-DETR改进实验:深度集成版目标检测 RT-DETR 热力图来了!支持自定义数据集训练出来的模型

💡该教程为改进RT-DETR指南,属于《芒果书》📚系列,包含大量的原创改进方式🚀 💡🚀🚀🚀内含改进源代码 按步骤操作运行改进后的代码即可💡更方便的统计更多实验数据,方便写作 芒果RT-DETR改进实验:深度集成版目标检测 RT-DETR 热力图来了!支持自定义数据集…

103基于matlab的极限学习机(ELM)和改进的YELM和集成极限学习机(EELM)是现在流行的超强学习机

基于matlab的极限学习机&#xff08;ELM&#xff09;和改进的YELM和集成极限学习机(EELM)是现在流行的超强学习机&#xff0c;该程序是三者的方法比对。 包括学习时间&#xff0c;训练精度和测试精度的对比。数据可更换自己 的&#xff0c;程序已调通&#xff0c;可直接运行…

【带头学C++】----- 九、类和对象 ---- 9.13 运算符重载——9.13.9 设计MyString类案例

❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️创做不易&#xff0c;麻烦点个关注❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️ ❤️❤️❤️❤️❤️❤️❤️❤️❤️文末有惊喜&#xff01;献舞一支&#xff01;❤️❤️❤️❤️❤️❤️❤️❤️❤️❤️ 目录 9.13…

Ps:曲线的基本操作

在曲线上通过添加控制点&#xff0c;然后拖动或编辑这些控制点就可实现对图像的精细调整。 添加控制点 方法一&#xff1a; 直接在曲线上点击&#xff0c;即可添加控制点。 方法二&#xff1a; 使用目标调整工具时&#xff0c;在图像上单击&#xff0c;即可添加控制点。若按住并…

【重点】23.合并K个升序链表

题目 法1&#xff1a;分治合并 class Solution {public ListNode mergeKLists(ListNode[] lists) {return merge(lists, 0, lists.length - 1);}public ListNode merge(ListNode[] lists, int l, int r) {if (l > r) {return null;}if (l r) {return lists[l];}int mid l…

我对迁移学习的一点理解——领域适应(系列3)

文章目录 1. 领域适应&#xff08;Domain Adaptation&#xff09;的基本概念2.领域适应&#xff08;Domain Adaptation&#xff09;的目标3.领域适应&#xff08;Domain Adaptation&#xff09;的实现方法4.领域适应&#xff08;Domain Adaptation&#xff09;的可以解决的问题…

VRRP协议与原理

文章目录 VRRP协议与原理一、VRRP 协议二、单网关和多网管的缺陷1、单网关缺陷2、多网管的缺陷 三、VRRP基本概述四、VRRP工作原理1、VRRP主备份备份工作工程2、VRRP 主备路由器切换过程3、VRRP 负载分担工作过程 五、VRRP配置命令1、vrrp配置命令2、配置VRRP步骤&#xff1a; …

汽车EDI:Chrysler EDI项目案例

菲亚特克莱斯勒汽车Fiat Chrysler Automobiles(FCA)是一家全球性汽车制造商&#xff0c;主营产品包括轿车、SUV、皮卡车、商用车和豪华车等多种车型。其旗下品牌包括菲亚特、克莱斯勒、道奇、Jeep、Ram、阿尔法罗密欧和玛莎拉蒂等。 Chrysler通过EDI来优化订单处理、交付通知、…

C语言训练:三个字符串比较大小,实现两个整数数的交换统计二进制中1的个数

目录 一、编写程序&#xff0c;输入三个字符串&#xff0c;比较它们的大小&#xff0c;并将它们按由小到大的顺序输出。要求用函数、指针实现。要求:要采用函数调用&#xff0c;并用指向函数的指针作为函数的参数。 1.不使用函数指针作为参数&#xff0c;并自己模拟strcmp。 …

1846_安全SPI

Grey 全部学习内容汇总&#xff1a;GitHub - GreyZhang/g_embedded: some embedded basic knowledge. 1846_安全SPI SPI是一种常见的通信方式&#xff0c;在汽车电子中比较常用。但是如果涉及到安全相关的设计&#xff0c;可能得考虑更多。而SPI协议本身没有很好的标准化&am…

福德机械:植保无人机的领航者

亲爱的读者们&#xff0c;欢迎来到福德机械的神奇世界。在这个充满活力和创新的世界里&#xff0c;我们专注于植保无人机的发展与应用&#xff0c;以实现农业现代化、智能化和高效化的目标。植保无人机&#xff0c;作为一种高效、环保和安全的农业工具&#xff0c;已经逐渐成为…

大数据----32.hbase高可用的演示

1、概述&#xff1a;Hbase的优缺点和适用场景 优点&#xff1a;HBase 底层基于HDFS存储&#xff0c;高可用、高扩展、强一致性&#xff0c;支持上亿级别数据。 10亿数据 性能测试结果 写性能&#xff1a;集群吞吐量最大可以达到70000 ops/sec&#xff0c;延迟在几个毫秒左右。…

摄影预约小程序制作实战教程

在如今的移动互联网时代&#xff0c;小程序成为了各行业推广和服务的重要工具之一。而对于摄影行业来说&#xff0c;一个专业的摄影预约小程序无疑是提高服务质量和用户体验的关键。 为了让大家更便捷地制作摄影预约小程序&#xff0c;本文将介绍一种使用【乔拓云】第三方制作平…

钉钉机器人发送表格

背景: 由于每次发送excel连接&#xff0c;不太好看&#xff0c;想着简单的表格直接用消息的方式发送在群里&#xff0c;就想着弄一个直接发送的表格信息&#xff0c;但是钉钉官网是没有的。 我估计钉钉的开发人员也没有想过&#xff0c;会有人钻空子&#xff0c;用markdown发送…

天翼云盘秒变硬盘分享

https://cloud.189.cn/web/share?codeAvUnqaj6NNza&#xff08;访问码&#xff1a;wf4r&#xff09;y 以下介绍为作者开发的单机版软件&#xff0c;可用于Windows环境中将天翼云盘挂载为本地硬盘&#xff0c;确实可以达到本地硬盘的使用感知&#xff0c;对于多终端数据副本一…

【RocketMQ】顺序消费消息实现原理分析

一、顺序消息概述 1.1、什么是顺序消息 顺序消息是指对于一个指定的 Topic &#xff0c;消息严格按照先进先出&#xff08;FIFO&#xff09;的原则进行消息发布和消费&#xff0c;即先发布的消息先消费&#xff0c;后发布的消息后消费。 1.2、顺序消息的类型 全局顺序消息 …

【网络安全】网络防护之旅 - 对称密码加密算法的实现

&#x1f308;个人主页&#xff1a;Sarapines Programmer&#x1f525; 系列专栏&#xff1a;《网络安全之道 | 数字征程》⏰墨香寄清辞&#xff1a;千里传信如电光&#xff0c;密码奥妙似仙方。 挑战黑暗剑拔弩张&#xff0c;网络战场誓守长。 目录 &#x1f608;1. 初识网络安…

性能提升100%、存储节约50%!猕猴桃游戏搭载OceanBase开启云端手游新篇章

近日&#xff0c;武汉灵动在线科技有限公司&#xff08;以下简称“灵动在线”&#xff09;与 OceanBase 达成合作&#xff0c;旗下品牌猕猴桃游戏的“游戏用户中心&#xff08;微信小程序&#xff09;”和“BI 分析报表业务系统“两大关键业务系统全面接入 OB Cloud 云数据库&a…

中国企业领袖年会在京举行,天雨设计左明龙应邀出席参加

12月9-11日&#xff0c;第二十一届中国企业领袖年会在中国大饭店隆重举行。本届领袖年会以“致敬长期主义”为主题&#xff0c;逾百名世界500强、中国500强和行业领军企业家受邀汇聚一堂&#xff0c;共话中国经济未来。北京天雨盛世文化传媒有限公司&#xff08;以下简称“天雨…

Ubuntu如何安装KVM

环境&#xff1a; 联想E14笔记本 Ubuntu20.04 问题描述&#xff1a; Ubuntu如何安装KVM 解决方案&#xff1a; 1.验证CPU是否支持硬件虚拟化 rootst-ThinkPad-E14:~# grep -Eoc (vmx|svm) /proc/cpuinfo 162.检查 VT 是否在 BIOS 中启用 安装 apt install cpu-checker …