链表_双向链表

C++实现单向链表,双向链表,单向环形链表,双向环形链表 本文讲解了链表的四种类型以及数据结构,同时给出了四种链表的C++代码实现。 阅读详情

typedef int ELEM_TYPE;
typedef struct Node
{
    ELEM_TYPE mdata;
    struct Node* pnext;
    struct Node* prev;
}DNode,*PDList;

void Init(PDList pl);
DNode* BuyNode(ELEM_TYPE val);
Status InsertHead(PDList pl, ELEM_TYPE val);
Status InsertTail(PDList pl, ELEM_TYPE val);
DNode* Search(PDList pl, ELEM_TYPE val);
Status DeleteKey(PDList pl, ELEM_TYPE val);
void Show(PDList pl);
void Clear(PDList pl);
void Destroyed(PDList pl);

//双向链表的初始化:
void Init(PDList pl)
{
    if (pl != NULL)
    {
        pl->pnext = NULL;
        pl->prev = NULL;
    }
}
//创建一个新的结点
DNode* BuyNode(ELEM_TYPE val)
{
    DNode* pnewnode = (DNode*)malloc(sizeof(DNode));
    if (pnewnode != NULL)
    {
        pnewnode->mdata = val;
        pnewnode->pnext = NULL;
        pnewnode->prev = NULL;
    }
    return pnewnode;
}
//头插
bool InsertHead(PDList pl, ELEM_TYPE val)
{
    if (pl == NULL)
    {
        return false;
    }
    DNode* pnewnode = BuyNode(val);
    if (pnewnode == NULL)
    {
        return false;
    }
    pnewnode->pnext = pl->pnext;
    pnewnode->prev = pl;
    if (pnewnode->pnext != NULL)
    {
        pnewnode->pnext->prev = pnewnode;
    }
    pl->pnext = pnewnode;
    return true;
}
//尾插
bool InsertTail(PDList pl, ELEM_TYPE val)
{
    if (pl == NULL)
    {
        return false;
    }
    DNode* pnewnode = BuyNode(val);
    if (pnewnode == NULL)
    {
        return false;
    }
    DNode* pCur = pl;
    while (pCur->pnext != NULL)
    {
        pCur = pCur->pnext;
    }
    pCur->pnext = pnewnode;
    pnewnode->prev = pCur;
    return true;
}
//查找元素
DNode* Search(PDList pl, ELEM_TYPE val)
{
    if (pl != NULL)
    {
        DNode* pCur = pl->pnext;
        while (pCur != NULL)
        {
            if (pCur->mdata == val)
            {
                return pCur;
            }
            pCur = pCur->pnext;
        }
    }
    return NULL;
}
//删除元素
bool DeleteKey(PDList pl, ELEM_TYPE val)
{
    if (pl == NULL)
    {
        return false;
    }
    DNode* pCur = Search(pl, val);
    if (pCur == NULL)
    {
        return false;
    }

    pCur->prev->pnext = pCur->pnext;
    if (pCur->pnext != NULL)
    {
        pCur->pnext->prev = pCur->prev;
    }
    free(pCur);
    return true;
}
//打印链表
void Show(PDList pl)
{
    if (pl == NULL)
    {
        return;
    }
    DNode* pCur = pl->pnext;
    while (pCur != NULL)
    {
        printf("%d ", pCur->mdata);
        pCur = pCur->pnext;
    }
    printf("\n");
}
//清理链表
void Clear(PDList pl)
{
    if (pl == NULL)
    {
        return;
    }
    DNode* pCur = pl->pnext;
    DNode* pNext = pCur;
    while (pCur != NULL)
    {
        pNext = pCur->pnext;
        free(pCur);
        pCur = pNext;
    }
    pl->pnext = NULL;
}
void Destroyed(PDList pl)
{
    Clear(pl);
}

双向链表详解 注意:这⾥的“带头”跟前⾯我们说的“头结点”是两个概念,实际前⾯的在单链表阶段称呼不严 谨,但是为了同学们更好的理解就直接称为单链表的头结点。在单链表中我们会去说头节点,并不是意思是说,单链表是带头链表,而是指的是单链表的第一个节点,方便理解而已。双向链表和单链表的区别在于:双向链表有哨兵位,也就是带头,我们在扩容的时候需要传一个无效的数据去占位。单链表是单向的所以只有指向下一节点的指针,而双向链表是双向的所以还要包括指向前一节点的指针。:数据+指向下一节点的指针+指向前一个节点的指针。 阅读详情

相关推荐

python知网爬虫论文pdf下载+立即可用(动态爬虫)

python实现动态爬虫知网论文,搜索+自动翻页+下载 收集数据利器

Braylon的博客 5379

双向链表

为什么需要双向链表? 单链表的结点都只有一个指向下一个结点,单链表的数据元素无法直接访问其前驱元素,所以逆序访问单链表中元素极其耗时; 思想有点类似使用空间复杂度换时间复杂度。 双向链表:在单链表的结点中增加一个指向其前驱的pre指针;该链表中第一个结点的前趋结点为NULL,最后一个结点的后继结点为NULL 。 双向链表具有单链表的所有操作:创建、销毁、获取链表长度、清空、获取某个元素、插入...

小童的博客 9950

地瓜机器人RDK Studio使用入门教程

不知道大家在使用AI开发板的时候有没有遇到过板子官方镜像占据空间大难以保存,想要的时候找不到?官方示例项目久而久之便难以找寻?首次登陆开发板连接网络还需要准备显示器键盘鼠标外设繁杂?…为了解决平时开发过程中遇到的种种不便利问题,地瓜机器人创新的推出了RDK Studio这一官方开发者软件,使智能机器人开发迎来新纪元!通过这一软件极大降低了机器人的开发门槛,哪怕是零基础的用户亦可轻松上手RDK系列板卡!

xiongqi123123的博客 3429

什么是双向链表,一篇搞懂双向链表

双向链表,python3

hahaha_1112的博客 1971

Arduino Uno R3开发板系列学习教程(番外篇:USB驱动安装与疑难排解)

本文详细介绍了Arduino Uno R3开发板USB驱动安装与疑难排解的完整指南,特别针对国产克隆版常见的CH340驱动问题提供解决方案。从识别开发板类型到Windows/Mac系统驱动安装步骤,再到常见问题排查与高级排错技巧,帮助开发者快速解决连接问题,确保程序烧录顺利进行。

weixin_29182481的博客 583

莫比乌斯反演

本文从算法竞赛和数论角度出发,系统介绍了狄利克雷卷积与莫比乌斯反演的核心概念。首先定义了数论函数及其基本性质,重点阐述了狄利克雷卷积的代数结构(交换环)和关键恒等式(如μ*1=ε)。随后通过卷积视角简化了莫比乌斯反演的证明过程。最后将理论提升至抽象代数层面,揭示这些数论工具本质上是偏序集关联代数在整除关系下的特例,其中莫比乌斯函数对应Zeta函数的逆元。全文展现了数学概念从具体到抽象的升华过程,为理解这些工具提供了更深刻的代数视角。

aichitang2024的博客 391

双向链表的实现

本文主要介绍了双向链表的结构,概念,相关接口的具体实现方法和链表与顺序表的区别, 并简要介绍了哨兵位的含义与作用。

2303_81060385的博客 1243

超详细版risc-v五级流水线cpu硬件设计实现解析

深入剖析risc-v五级流水线cpu的硬件架构与设计细节,涵盖指令流程、模块划分与关键时序控制,帮助理解risc-v五级流水线cpu的工作机制与优化策略。

weixin_42437253的博客 1633

【数据结构】之双向链表、双端(双向)链表、循环(双向)链表

双向链表、双端(双向)链表、循环(双向)链表示意(简)图: 声明:下面各图中,箭头指向的是整个节点,而不是指向节点中的prior或next。 双向链表:只有一个指针指向最开始的结点。 双端(双向)链表:有两个指针分别指向两端的节点。 循环(双向)链表:指向形成一个闭环。 双端(双向)链表的Java实现(简单示例): 注:双向链表、双端(双向)链表、循环(双向)链表的实现思路...

JustryDeng 2211

【WRFDA实操第一期】服务器中安装 WRFPLUS 和 WRFDA

【WRFDA实操第一期】安装 WRFPLUS 和 WRFDA

WW、forever的博客 2037

Yolov8-pose关键点检测:loss优化 | LRM loss困难样本挖掘,提升难样本、遮挡物等检测精度

LRM loss应用到能够大幅提升pose遮挡物性能

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 1715

数据结构——双向链表(双向连接的图解、双向链表的创建、操作双向链表)

举个例子: 假设一个文本编辑用链表来存储文本. 每一行用一个String对象存储在链表的一个节点中. 当编辑器用户向下移动光标时, 链表直接操作到下一个节点即可. 但是当用于将光标向上移动呢?- 我们可以轻松的到达下一个节点, 但是回到前一个节点是很难的. 但是, 在实际开发中, 经常会遇到需要回到上一个节点的情况。- 也就是链表相连的过程是单向的. 实现的原理是上一个链表中有一个指向下一个的引用.- 一个节点既有向前连接的引用, 也有一个向后连接的引用.- 既可以从头遍历到尾, 又可以从尾遍历到头。

qq_52301431的博客 4575

YOLO26涨点改进| TGRS 2026 | 独家自研创新、检测头改进篇| AHATHead自适应混合注意力检测头,二次创新,强化特征表达与目标判别能力,适合遥感小目标检测、小目标检测有效涨点

🔥本文提出了一种改进YOLO26模型的AHATHead自适应混合注意力检测头,通过融合全局与局部注意力机制增强特征表达能力。该方法采用动态权重分配策略,在预测阶段自动调整关键区域与通道特征权重,有效提升小目标和密集场景的检测性能。实验表明,AHATHead在保持较高推理效率的同时,显著提高了目标定位精度与类别判别能力。文章详细介绍了模块结构、实现原理和代码集成步骤,并提供了两种改进配置方案(yolo26_AHATHead.yaml和yolo26_RFHA-YOLO-AHATHead.yaml)

Ai缝合怪、助力小伙伴高效发论文 159

【双向链表】数据结构双向链表的实现

双向链表的实现

m0_56069910的博客 2196

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

双向链表和双向循环链表

1.创建一个新结点2.遍历链表找到最后一个结点p3.p结点的后继指针指向新结点,新结点的前驱指针指向p,新结点的后继指针指向NULL;void Insert_tail(DLIST head, DLIST node)\\尾部插入= NULL)void Show(DLIST head)\\打印链表while (p!= NULL)int main()\\运行Show(head);return 0;

weixin_63082397的博客 1015

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

数组实现双向链表、双向链表的操作

分析: 思路: 遍历:和单链表一样,只是可以向前,也可以向后查找。 添加(默认添加到双向链表的最后) (1).先找到双向链表的最后这个节点(temp) (2).temp.next = newHeroNode (3).newHeroNode.pre = temp; 修改思路和单链表一样 删除 (1).以为是双向链表,因此,我们可以实现自我删除某个节点 (2).直接找到要删除的这个节点,比...

qq_40823802的博客 2011

第2章 双向链表

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

m0_74916669的博客 945

特殊的链表——双向链表

一、双向链表的概述 1、双向链表的定义:在单链表的每个结点里再增加一个指向其直接前驱的指针域prior,这样链表中就形成了有两个方向不同的链,故称为双向链表。 2、优点:双向链表可以克服单链表查找链表中某结点不方便的缺点。 3、双向循环链表:和单链的循环表类似,双向链表也可以有循环表。让头结点的前驱指针指向链表的最后一个结点,让最后一个结点的后继指针指向头结点。 二、双向链表的特点与算法操作 1、双向链表结构的对称性:设指针P指向某一结点,侧有: p->next->prior=p=p

kxbdys的博客 4419

双向链表的双向遍历

双向链表的双向遍历 双向链表相比较于单向链表的优势之一就是可以快速遍历,对于单向链表只能借助于单个指针逐个遍历,而对于双向链表而言因为每个节点都存在一个前指针和后指针,所以可以借助于两个指针双向遍历,相对于单向链表而言可以节省很多时间。但是对于双向链表的双向遍历需要考虑的因素偏多,代码的步骤需要非常严谨。对于两个指针而言需要考虑节点数是奇数还是偶数,若是奇数,要考虑两指针相遇的情况,只需要输出其中...

A___jay的博客 3901

mysql 双向链表_双向链表

双向链表是链表变型,相比于单链表导航或者是向前和向后的两种方式。以下是重要的术语来理解双向链表的概念Link− 链表的每个链路存储数据称为一个元素。Next− 链表的每个链接包含一个链接到下一个被称为下一个(Next)。Prev− 链表的每个链接包含一个链接,称为上一个链接(Prev)。LinkedList− LinkedList包含连接链接到名为首先第一个链接,并称为最后的最后一个链接(...

weixin_36475451的博客 596

【C++】双向链表

前言: 前面我们实现了 单向链表 ,也发现了它的一些局限性。 比如说: ∙\bullet∙ 查找方向只能是单向的,每次只能从头查到尾 ∙\bullet∙ 对于删除操作,它必须借助辅助节点帮助进行删除 所以为了克服这些缺点,我们引出了双向链表。 一.基本介绍 双向链表它的方向是双向的,相对于单向链表它可以实现自我删除。 双向链表的节点包含三个量,首先一个还是节点信息data,还有指向下一个节点地址的next指针,最后添加了指向前一个节点地址的pre指针。 实现思路: ∙\bullet.

taoxing 2525

双向链表、双向循环链表

当转化完成以后,树中节点的左指针需要指向前驱,树中节点的右指针需要指向后继。这些子列表可以有一个或多个自己的子列表,以此类推,以生成如下面的示例所示的。对于双向循环列表,你可以将左右孩子指针作为双向循环链表的前驱和后继指针,第一个节点的前驱是最后一个节点,最后一个节点的后继是第一个节点。为了将每一级都序列化到一起,我们需要每一级中添加值为 null 的元素,以表示没有节点连接到上一级的上级节点。你会得到一个双链表,其中包含的节点有一个下一个指针、一个前一个指针和一个额外的。是一个带有子列表的节点。

nameofcsdn的博客 868
上一篇: 链表_单链表_带头节点的单链表
下一篇: 链表_链表相关问题
Duc_Duke
博客等级 码龄9年 11粉丝 73原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值