双向链表和循环链表

server/2024/9/23 9:30:35/

一、双向链表

在每个结点中多增加一个前驱指针,指向前一个元素

(为空表时前驱指针和后继指针都指向NULL)

1、定义双向链表的结构体(用于存储其数据的数据类型)

typedef int Elemtype;    
typedef struct DuLNode {           //定义一个新的数据类型Elemtype  data;struct DuLNode* prior, * next; //定义与该结构体相同的数据类型的一个用于指向前一个结点的指针//另一个用于指向后一个结点的指针
}DuLNode,*DuLinkList;           //代码中的 Elemtype是自己定义的数据类型可根据要存储的数据自己定义声明,例子中则是int

而整个结构体则是因为链表所需要存储的数据要多个不同数据类型,因此采用结构体的形式将其定义在结构体中,所以可以将结构同样看成一个数据类型(内部包含多个数据类型)

而双向链表则在链表的基础上增加了一个指向前一个结点的指针

插入


void ListInsert(DuLinkList& L, int i, Elemtype e) {if(!p=Get(L,i))          //Get(L,i)为找根据所给位置找寻对应的结点的函数 
printf("输入位置错误");s = new DuLNode;       //创建一个新的结点s->data=e;             //将要插入的值赋给新创建的结点的数据域s->prior = p->prior    //将要插入的结点的前驱指针指向要插入位置原来结点的前一个结点p->prior->next = s  //使要插入位置的原来结点的前一个结点指向要插入结点s->next = p;        //将要插入结点的后继指针指向要插入位置的原来结点p->prior = s;           //使要插入位置的原来结点的前驱指针指向插入的结点
}

 代码中的DuLinkList为创建L链表的结构体类型(可根据自身存储数据要求自行定义)

2、删除


void ListDelete(DuLinkList& L, int i) {if (!p = Get(L, i)) return ERROR;  //用来查找要删除的元素位置判断是否合法p->prior->next = p->next;  //将要删除的结点的前一个结点的后继指针指向要删除结点的后一个结点p->next->prior = p->prior; //使将要删除的结点的后一个结点的前驱指针指向要删除的结点的前一个free(p);      //释放要删除的结点的存储空间                                           结点            
}

 

二、循环链表

即最后一个结点的指针域不再指向空而是指向头结点形成一个环

(为空表时首元结点指针域指向自身)

其优点:从表中任一结点出发均可找到其他结点不用再局限于只能从头结点开始查找

1、循环链表的结构体定义和其他功能与链表大致相同,不同之处在于其初始化时尾指针(最后一个元素的指针)是指向头结点的再将两者置空完成初始化。

2、两个循环链表的合并

LinkList Connect(LinkList Ta, LinkList Tb) {p = Ta->next;        //将表Ta中的头结点存入p指针中Ta->next = Tb->next->next; //将Ta的尾指针指向Tb的首元结点delete Tb->next;     //释放Tb的头结点Tb->next = p;        //将Tb的尾指针指向Ta表的头结点return Tb;          //返回合并后的链表
}

 代码中的LinkList 为事先根据存储数据需要自己定义的结构体的名字(代码中未展示)

Ta和Tb为两个链表

三、双向循环链表

结合了双向链表和循环链表的特性,一个结点中存在着两个结点,一个指向前驱一个指向后继

再就是头结点的前驱指向最后一个结点,最后一个结点的后继指向头结点,形成双向循环


http://www.ppmy.cn/server/96155.html

相关文章

【C++进阶】特殊类设计 单例模式

目录 不能被拷贝的类只能在堆上创建对象只能在栈上创建对象不能被继承的类只能创建一个对象(单例模式)饿汉模式懒汉模式 不能被拷贝的类 //C98 class CopyBan { public:private:CopyBan(const CopyBan&){};const CopyBan& operator(const CopyB…

基于R语言绘制GGE双标图2

参考资料: 严威凯等: 双标图分析在农作物品种多点试验中的应用【作物学报】 https://cran.r-project.org/web/packages/GGEBiplots/GGEBiplots.pdf 1、如何判断双标图是否充分体现数据中的规律 在对双标图的解释中,有一个隐含的假设,就是所…

密码学简史:时间密语

​ 注:机翻,未校。 A brief history of cryptography: Sending secret messages throughout time Stemming from the Greek words for “hidden writing,” cryptography is the practice of encrypting transmitted information so that it can only b…

openGauss 5.0 LTS部署至华为云ECS CentOS8.2实操教程

一、前言 openGauss是一款高可靠、高性能、高安全、易运维的开源关系型数据库管理系统,然而其全功能部署对系统要求非常高。 本实操教程能够使个人开发者以及高校师生能够以成本最小的方式快速将openGauss部署到华为云的ECS上,以便快速进行功能验证以及…

STK12.2+Python开发(三):通过Access获取当前场景的信息,计算卫星访问目标信息

计算访问 在STK中,“Access”通常指的是卫星与地面目标之间的可见性或访问机会。在STK API中,Access分析功能允许用户计算和分析特定时间段内卫星与地面目标之间的访问窗口。这些访问窗口可以用来确定卫星何时能够观测或通信目标。 一个Access能够retu…

ARM知识点二

一、指令 指令的生成过程 指令执行过程示例 if (a 0) {x 0; } else {x x 3; } //翻译为 cmp r0,#0 MOVEQ R1,#0 ADDGT R1,R1,#3指令获取:从Flash中读取 CMP R0, #0,控制器开始执行。 指令解码:解码器解析 CMP 指令,ALU比较R…

RHEL9网络设定及网络脚本

1. 添加一张网卡 2. 重写一个网卡配置文件 [rootlocalhost ~]# cd /etc/NetworkManager/system-connections/ [rootlocalhost system-connections]# ls ens160.nmconnection [rootlocalhost system-connections]# vim ens224.connection [rootlocalhost system-connections…

在亚马逊云科技AWS上利用PEFT和RLHF高效微调AI大模型减少有害回复

简介: 小李哥将继续每天介绍一个基于亚马逊云科技AWS云计算平台的全球前沿AI技术解决方案,帮助大家快速了解国际上最热门的云计算平台亚马逊云科技AWS AI最佳实践,并应用到自己的日常工作里。 本次我将介绍如何用亚马逊云科技的AI模型训练服…