双向链表的实现

双向链表的C++实现 双向链表的C++实现           双向链表与单向链表相比,各个结点多了一个指向前一个结点的指针。结构如图所示:           双向链表的结点定义如下: #ifndef SIMPLENODE_HPP #define SIMPLENODE_HPP template //再定义一个模板 写双链表 class DoubleNode { public: 阅读详情

 双向链表实际上是单向链表的扩展。
 当我们对单向链表进行操作的时候,有时你要对某个结点的前驱进行操作的时,又必须从表头开始查找。这是单向链表
 结构特点的局限性。因为单链表每个结点只有一个存储直接后继的结点地址的链域,那么能不能定义一个既有存储前驱,
 又能存储后继的这样一个链表结构呢?答案是可以的。这就是双向链表。
 
 在双向链表中,结点除了含有数据域外,还有两个链域,“前驱后继”,有的人称之为左右链域,差不多,知道这么个意
 思就可以了。其定义如下所示:
 
 struct RoleStruct
 {
      int  ID;
      string  Name;
      RoleStruct *lpLink,*rpLink; //注意:有的人经常犯错写成:RoleStruct *lpLink,rpLink;后一指针标示错误
 };
   
    还有一个问题是,我们还能不能使双向链表变成双向循环链表呢?答案同样是可以的。
   
    双向链表同单向链表一样,也有3种最基本的操作:查找、插入、删除。
   
    下边介绍双向链表的这3个最为基本的操作:

 

       #include <iostream>
       using namespace std;

 

       struct RoleStruct
      {
          int  ID;
          RoleStruct *lpLink,*rpLink;
      };

 

       typedef struct RoleStruct MyRoleStruct;
       typedef MyRoleStruct* lpMyRoleStruct;


      //0、生成双向链表

 

       lpMyRoleStruct CreateRoleLink(void)
     {
        lpMyRoleStruct pHead,pMiddle,pTail;

        int _Volue;
        pHead = new(MyRoleStruct);
        if (pHead == NULL)
       {
          cout << "分配头结点存储空间失败." << endl;
       }

       cout << "请任意输入自然值:" << endl;

       cin >> _Volue;

       pHead->ID = _Volue;
       pHead->lpLink = NULL;
       pHead->rpLink = NULL;
       pTail = pHead;
 

       cout << "请继续输入数值,以0结束录入:" << endl;
       cin >> _Volue;

       while (_Volue != 0)
     {
       pMiddle = new (MyRoleStruct);
       if (pMiddle == NULL)
      {
         cout << "中间存储空间申请失败." << endl;
      }

      //*生成双向链表的关键步骤
       pMiddle->ID = _Volue;
       pTail->rpLink = pMiddle;//将尾结点的右结点设置成中间结点
       pMiddle->lpLink = pTail;//将中间结点的前驱设置成尾结点
       pMiddle->rpLink = NULL; //将中间结点的后继设置成空结点
       pTail = pMiddle;

       cout << "请继续输入数值:"  << endl;
       cin >> _Volue;
    }

    return pHead;
 };

 

     //1、输出链表

   void printRoleLink_R(lpMyRoleStruct pHead)
   {
       lpMyRoleStruct pTail;

       while (pHead != NULL)
        {
              pTail = pHead;
              pHead = pHead->rpLink;

              cout << "输出:" << pTail->ID << endl;
        }

      cout << "----------------------------------------------------------" << endl;
   }

 

   //2、测试双向链表前驱是否工作正常

   void printRoleLink_L(lpMyRoleStruct pHead)
   {
         lpMyRoleStruct pTail;

         while (1)
        {
            pTail = pHead;
            pHead = pHead->rpLink;

            if (pTail->lpLink != NULL)
           {
                cout << pTail->lpLink->ID << endl;
                break;
           }
        }
 
        cout << "上边没做错的话,应该输出头结点起初的录入值" << endl;
  }

 

//3、双向链表的释放

   void DelRoleLink(lpMyRoleStruct pHead)
    {
         lpMyRoleStruct pTail;

         while (pHead != NULL)
         {
              pTail = pHead;
              pHead = pHead->rpLink;

              free(pTail);
         }

         cout << "释放链表成功." << endl;
         getchar();
    }

 

//4、双向链表的查找(很简单,请参阅单向链表的查找方法,再此不再累述)

//注:其他方法也很简单,参看我实现的单向链表

 

   int main()
  {
         lpMyRoleStruct pHead;

         pHead = CreateRoleLink();
         printRoleLink_R(pHead);

         printRoleLink_L(pHead);

         DelRoleLink(pHead);

         getchar();
         return 0;
  }

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

相关推荐

手写实现双向链表

前面一篇文章写到了实现单向链表,这篇文章记录一下实现双向链表。 双向链表顾名思义就是双向的链表,双向的意思是链表可以双向移动,即从前往后遍历和从后往前遍历均可实现。 双向链表的定义:双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。——来自百度...

Mr__Viking的博客 614

数据结构-双向链表

//注意双向链表中插入节点的顺序 #include&lt;stdio.h&gt; #include&lt;stdlib.h&gt; #include &lt;stdbool.h&gt; // typedef struct _DNode { int data; struct _DNode* pre; //前驱指针 struct _DNode* next; //后继指针 }...

xiuxin121的博客 579

Python实现双向链表

Python实现双向链表 关于链表的介绍,请参考:https://blog.youkuaiyun.com/weixin_43790276/article/details/104033254 本篇文章使用 Python 来实现双向链表。 一、定义一个创建节点的类 链表是由一个一个的节点组成的,在创建链表之前,要先创建节点,然后把节点“串”到链表上。在同一个链表中,每个节点的结构都相同,只是节点中保存的数...

weixin_43790276的博客 1777

计算机基础:21、计算机基础实践-双向链表数据结构、FIFO算法、LRU算法

计算机基础:21、计算机基础实践-双向链表的原理与实践单向链表与双向链表的简介双向链表数据结构 单向链表与双向链表的简介 双向链表数据结构 下方的代码实现了上图中的功能(双向链表数据结构) # node类表示在链表中的节点 class Node: def __init__(self, key, value): self.key = key self.value = value self.prev = None # 用于存储上一个节点 self.next = None # 用于存储下一

weixin_36020178的博客 512

双向链表及如何使用GLib的GList实现双向链表

双向链表是一种比单向链表更为灵活的数据结构,与单向链表相比可以有更多的应用场景,本文讨论双向链表的基本概念及实现方法,并着重介绍使用GLib的GList实现单向链表的方法及步骤,本文给出了多个实际范例源代码,旨在帮助学习基于GLib编程的读者较快地掌握GList的使用方法,本文程序在 ubuntu 20.04 下编译测试完成,gcc 版本号 9.4.0;本文适合初学者阅读。

whowin 1464

JS实现双向链表

链表结构是我们在面试中经常会被问起的较为基础的数据结构问题,起初学习数据结构使用的是C++语言,最近在做前端面试题的过程中没碰到了需要用js实现双链表的需求,百度出来的文章发现可很多错误,于是索性自己重新写了,并且列出了一些错误点,这里给大家较为详细的一步步看一下实现思想和步骤,相较于C++语言,js的实现可以说是很简单了,不需要创建繁琐的对象,更加直观易懂; 首先我们来看一下双向链表的结构图: ...

StarFishing 4040

数据结构:双向循环链表、栈、队。

数据结构中的双向循环链表、栈、队的相关操作

Summer_taotao的博客 447

华为IC岗笔试刷题含答案(2)

又做了几套题,记录了部分及答案,如有错误,欢迎评论指正。

Ingrid的博客 1万+

Python双链表详细讲解实现:模拟计算机缓存淘汰算法,FIFO,LRU以及LFU!

首先建立双向链表 要注意的是,双链表增加头结点,会很方便操作 还有双链表的插入删除操作 上代码: 功能 弹出头部节点(pop) 默认尾部添加结点(append),尾插法 往头部添加结点(append_front),头插法 删除节点(remove),不加参数时,删除尾部结点, 加蚕食时,删除指定结点 打印 字符串格式化的 链表(print) #! -*- encoding=utf-8 -*- class Node: def __init__(self, key=0, value=0):

pythonstrat的博客 484

OpenClaw的引导配置(onboard)流程

脚本安装的直接安装完到引导配置界面,其他安装方式还可以直接命令到配置。

supersolon的专栏 1323

DC/DC恒压输出控制原理与应用

DC/DC恒压输出控制

propor的专栏 4277

用双向链表实现内存置换算法(二)

用双向链表实现内存置换算法(二) FIFO(First in first out) 这里使用之前实现了的双向链表来实现FIFO算法。 FIFO算法还是比较好理解的,如果内存满了,则最先淘汰先进入的。 直接上代码: from DoubleLinkedList import DoubleLinkedList, Node class FIFOCache: def __init__(self, capacity): self.capacity = capacity se

weixin_45451171的博客 233

ArcGIS中地理坐标系与投影坐标系以及投影转换

简单介绍arcgis软件中坐标系定义、设置和常见问题。

weixin_41399650的博客 8万+

C语言实现双向链表

本章使用C语言实现了数据结构中的双向链表,对于数据结构的初学者来说有一定难度,但对于提升对链表的理解来说意义非凡,值得我们亲自去实现。

2401_86557724的博客 2718

Seedance 2.5本地部署指南:AI生图与视频生成的完整实践

最近在AI生成内容领域,本地部署方案越来越受到开发者关注。特别是Seedance 2.5的发布,让很多原本依赖云端服务的用户开始转向本地化解决方案。本文将从实际使用角度出发,完整介绍Seedance 2.5的本地部署流程、功能特性对比以及实际应用技巧。 1. Seedance 2.5核心特性解析 1.1 什么是Seedance 2.5 Seedance 2.5是一款开源的AI生图和视频生成工具,支持在本地环境运行,无需联网即可实现高质量的图像和视频生成。相比之前的2.0版本,2.5在生成质量、运行效率和功能

weixin_42566121的博客 1657

拆解博世、大陆的EMB方案:自增力机构如何省下83%的能耗?

本文深度解析了博世和大陆的电子机械制动(EMB)技术,重点探讨了自增力机构如何实现83%的能耗节省。通过对比电机直驱型和自增力型EMB的技术参数,揭示了自增力机构在能量优化和系统集成方面的创新优势,为汽车电动化和智能化提供了关键技术支持。

weixin_42665725的博客 390

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

双向链表的实现

m0_56069910的博客 2196

DC-DC 转换器中的压电谐振器:当前状态和限制

在功率转换器应用中,居里温度较低的谐振器的 k 2和 Q M显着降低会导致效率降低,需要仔细的热处理。由于使用 PR 的功率转换器在不同的条件下运行,包括温度范围、电压偏置和功率电平,因此不可避免地会出现非线性效应,必须妥善解决这一问题,以免影响转换器的性能。等效电路模型(Butterworth Van-Dyke 或 BVD 模型)将压电谐振器在其机械谐振附近的电响应转换为一个简单电路,该电路由与由电极形成的输入电容 C 0并联的串联 RLC 动分支组成,见图图 1 还显示了阻抗与频率的关系。

2301_79716471的博客 1294

用C语言实现双向链表

用C语言实现了一个带头双向循环链表,简单介绍了每个函数的实现和顺序表与双向链表的优缺点。

0xFFFFFFFF 1452

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

数据结构之双向链表的实现

主要是定义一些功能常量和单链表的结构,和之前的数据结构的文章一样。

m0_62681656的博客 1205

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Java实现双向链表

双向链表1 双向链表需求2 功能及算法分析2.1 迭代功能实现分析2.2 添加元素2.3 删除节点3 详细设计说明3.1 LinkIterator内部类3.2 DoubleLink部分方法的实现3.3 代码实现4 链表的测试用例 1 双向链表需求         双向链表主在节点的构成上与单向链表略有区别,双向链表的节点拥有一个元素存储空间和两个指针域...

gaoy_kkk的博客 1274

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

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

双向链表的定义与实现

m0_73367097的博客 1937

链表之双向链表的实现

双向链表的实现(完整代码)

月亮夹馍干的博客 661
上一篇: DirectX中常用的宏定义
LJDirectxProgram
博客等级 码龄16年 0粉丝 10原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值