【数据结构】二、线性表:4.循环链表的定义及其基本操作(循环单链表,循环双链表的初始化、判空、判断头结点、尾结点、插入、删除)

news2024/12/22 18:32:38

文章目录

      • 4.循环链表
        • 4.1循环单链表
          • 4.1.1初始化
          • 4.1.2判断单链表是否为空
          • 4.1.3判断p结点是否为循环单链表的表尾结点
        • 4.2循环双链表
          • 4.2.1初始化
          • 4.2.2判断循环链表是否为空
          • 4.2.3判断结点p是否为循环双链表的表尾结点
          • 4.2.4双链表的插入
          • 4.2.5双链表的删除

4.循环链表

4.1循环单链表

在这里插入图片描述

循环单链表(Circular Singly Linked List)是一种特殊类型的单链表,其中最后一个节点的指针指向头节点,形成一个循环。

在这里插入图片描述

循环单链表与普通单链表的主要区别在于,循环单链表的尾节点的指针不是指向 nullptr,而是指向头节点,形成一个闭环。这意味着,在循环单链表中,可以通过尾节点的指针重新回到头节点。

循环单链表的特点和优势:

  1. 尾节点的指针指向头节点,使得在遍历链表时不需要特别处理尾节点,方便实现循环遍历。
  2. 可以更容易地进行环形操作,如判断链表是否形成环、寻找环的起始点等。
  3. 循环单链表的插入和删除操作相对简单,因为不需要特别处理头部和尾部情况。
  4. 在使用循环单链表时,我们需要额外关注以下几点:
  5. 在插入和删除节点时,要确保更新指针的正确性,以避免死循环或链表中断。
  6. 在循环单链表中遍历时要设置终止条件,防止进入无限循环。
4.1.1初始化
typedef struct LNode{  		//定义单链表结合类型
	ElemType data;			//每个结点存放一个一个数据元素
	struct LNode *next; 	//指针指向下一个结点
}LNode, *LinkList;

//初始化一个循环单链表
bool InitList(LinkList &L){
	L=(LNode *)malloc(sizeof(LNode));	//分配一个头结点
	if(L == NULL)  		//内存不足,分配失败
		return false;
	L->next = L;		//头结点next指向头结点
	return true;
}
4.1.2判断单链表是否为空

判断循环单链表是否为空,检查头结点指针是否指向它自己就行

bool Empty(LinkList L){
	if(L->next == L)  //检查头结点指针是否指向它自己
		return true;
	else 
		return false;
}
4.1.3判断p结点是否为循环单链表的表尾结点
//判断 p 结点是否为循环单链表的表尾结点
bool isTail(LinkList L, LNode *p)
{
	if(p->next == L)
		return true;
	else
		return false;
}
4.2循环双链表

在这里插入图片描述

循环双链表(Circular Doubly Linked List)是一种特殊类型的双向链表,其中最后一个节点的下一个指针指向头节点,头节点的前一个指针指向最后一个节点,形成一个循环。

在这里插入图片描述

循环双链表与普通双链表的主要区别在于,循环双链表既具有双向链表的前驱和后继关系,也具有循环遍历的能力。

循环双链表的特点和优势:

  1. 可以通过任意节点的前驱和后继指针方便地在双链表中进行插入和删除操作。
  2. 最后一个节点的下一个指针指向头节点,使得在遍历链表时不需要特别处理尾节点,可以很方便地实现循环遍历。
  3. 可以更容易地进行环形操作,如判断链表是否形成环、寻找环的起始点等。
  4. 循环双链表的插入和删除操作相对简单,不需要特别处理头部和尾部情况。

注意:在插入和删除节点时,要确保更新前驱和后继指针的正确性,以避免链表中断或形成其他错误结构。在循环双链表中遍历时要设置终止条件,防止进入无限循环。

4.2.1初始化

当我们在初始化一个双链表时,需要让头结点的前指针和后指针都指向头结点自己(而普通的双链表指向NULL)

typedef struct DNode{
	ElemType data;
	struct DNode *prior,*next;
}DNode, *DLinkList;

//初始化空的循环双链表
bool InitDLinkList(DlinkList &L){
	L = (DNode*) malloc(sizeof(DNode));	//分配一个头结点
	if(L == NULL)		//内存不足,分配失败
		return false;
	L->prior = L;		//头结点的prior指向头结点
	L->next = L; 		//头结点的next指向头结点
	return true;		//初始化成功
}
4.2.2判断循环链表是否为空

检查头结点next指针是否指向它自己

//判断循环链表是否为空
bool Empty(DLinkList L){
	if(L->next == L)
		return true;
	else
		return false;
}
4.2.3判断结点p是否为循环双链表的表尾结点

检查头结点next指针是否指向头结点

bool isTail(DLinkList L, DNode  *p){
	if(p->next == L)
		return true;
	else
		return false;
}
4.2.4双链表的插入
//在p结点之后插入s结点
bool InsertNextDNode(DNode *p, DNode *s){
	s->next = p->next;
	p->next->prior = s;//如果p没有后继结点,普通链表会出问题
	s->prior = p;
	p->next = s;
}

在这里插入图片描述

4.2.5双链表的删除
//删除p的后继结点q
p->next = q->next;
q->next->prior = p;  //如果p没有后继结点,普通链表会出问题
free(q);

在这里插入图片描述

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

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

相关文章

R语言:多值提取到点

ArcGIS中有相关工具实现多值提取到点的功能&#xff0c;在这里&#xff0c;我将使用R语言进行操作&#xff1a; library(dplyr) library(readxl) library(sf) library(raster)setwd("D:/Datasets") Bio <- stack(paste0("D:/Datasets/Data/worldclim2_1km/…

关于并发编程和并行

目录 前言: 并发编程: 1.并发编程的定义: 2. 并发编程的目的 2.1提高性能&#xff1a; 2.2增强响应性&#xff1a; 2.3资源利用&#xff1a; 3. 并发编程的实现方式 3.1多线程&#xff1a; 3.2多进程&#xff1a; 3.3异步编程&#xff1a; 3.4协程&#xff1a; 4. …

16、电源管理入门之驱动Runtime PM管理

目录 1. 框架介绍 1.1 为什么需要Runtime PM Framework? 1.2 系统框架图 2. Drivers 3. Runtime PM core 4. power domain framework 5. runtime pm的sysfs 6参考: Runtime PM管理也就是设备驱动里面的电源管理,即设备驱动结构体里面的struct dev_pm_ops,只控制设…

简明固体物理--晶体的形成与晶体结构的描述

简明固体物理-国防科技大学 chapter 1 Formation of Crystal Contents and roadmapQuantum Mechanics and atomic structureElectronsOld quantum theoryMethod of Quantum MechanicsDistributing functions of micro-particles BindingCrystal structure and typical crystal…

【打工日常】使用docker部署IT运维管理平台CAT

​一、CAT介绍 CAT是一个专为 IT 运维从业者打造的一站式解决方案平台&#xff0c;包含资产管理、工单、工作流、仓储等功能模块。 本项目是celaraze/chemex重构版&#xff0c;原项目chemex名称弃用&#xff1b;CAT采用全新架构设计&#xff0c;大量提升使用体验的细节&#xf…

Tensorflow实现手写数字识别

模型架构 具有10个神经元&#xff0c;对应10个类别&#xff08;0-9的数字&#xff09;。使用softmax激活函数&#xff0c;对多分类问题进行概率归一化。输出层 (Dense):具有64个神经元。激活函数为ReLU。全连接层 (Dense):将二维数据展平成一维&#xff0c;为全连接层做准备。展…

Solidworks界面左边FeatureManager/设计树/模型树/树区域/零件树/零件栏不见了

Solidworks界面左边FeatureManager/设计树/模型树/树区域/零件树/零件栏不见了&#xff0c;按F9还原/隐藏&#xff0c;有的笔记本按FnF9

Koa: 打造高效、灵活的Node.js后端 (介绍与环境部署)

在上一篇文章中&#xff0c;我们了解了Node.js的基础知识&#xff0c;今天我们将进一步学习Node.js 较新的一个轻量级Web框架Koa&#xff0c;一起创建NodeJS后端服务器吧&#xff01; 一、介绍 Koa是一个新生代Node.js Web框架&#xff0c;由Express原团队成员开发&#xff0c…

大模型笔记:最少到最多提示过程 (Least to Most prompting, LtM)

LEAST-TO-MOST PROMPTING ENABLES COMPLEX REASONING IN LARGE LANGUAGE MODELS 2023 ICLR 1 概述 进一步发展维链提示过程 (CoT prompting) 分为两个阶段&#xff1a; 第一阶段&#xff1a;向语言模型提出查询&#xff0c;将问题分解成子问题。第二阶段&#xff1a;再次向语…

【数据结构】二、线性表:2.单链表的插入、删除、查找

文章目录 2.3插入2.3.1按位序插入2.3.2指定结点后插入2.3.3指定结点前插入 2.4删除2.4.1按位序删除2.4.2指定结点删除 2.5查找2.5.1按位查找2.5.2按值查找 2.3插入 2.3.1按位序插入 ListInsert(&L,i,e)&#xff1a;插入操作。在表L中的第i个位置上插入指定元素e。 带头结…

【MATLAB第98期】基于MATLAB的MonteCarlo蒙特卡罗结合kriging克里金代理模型的全局敏感性分析模型【更新中】

【MATLAB第98期】基于MATLAB的Monte Carlo蒙特卡罗结合kriging克里金代理模型的全局敏感性分析模型【更新中】 PS:因内容涉及较多&#xff0c;所以一时半会更新不完 后期会将相关原理&#xff0c;以及多种功能详细介绍。 麻烦点赞收藏&#xff0c;及时获取更新消息。 引言 在…

从《繁花》看图数据库的关联力!

2024年开年&#xff0c;最热的电视剧非《繁花》莫属。 这部现象级剧集不仅在全国掀起了一股怀旧潮&#xff0c;还引发了对故事情节和人物关系的深入探讨。 随着《繁花》的热播&#xff0c;不少观众为了更好地理解复杂的故事情节&#xff0c;开始自制人物关系图。 这些关系图以…

【Spring Boot 3】获取已注入的Bean

【Spring Boot 3】获取已注入的Bean 背景介绍开发环境开发步骤及源码工程目录结构总结 背景 软件开发是一门实践性科学&#xff0c;对大多数人来说&#xff0c;学习一种新技术不是一开始就去深究其原理&#xff0c;而是先从做出一个可工作的DEMO入手。但在我个人学习和工作经历…

java SSM科研管理系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java SSM科研管理系统是一套完善的web设计系统&#xff08;系统采用SSM框架进行设计开发&#xff0c;springspringMVCmybatis&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S…

OPC UA 学习笔记:状态机/有限状态机

有限状态机 有限状态机 &#xff08;FSM&#xff09; 是程序员、数学家、工程师和其他专业人士用来描述具有有限数量条件状态的系统的数学模型。 有限状态机的构成包括以下内容&#xff1a; 一组潜在的输入事件。与潜在输入事件相对应的一组可能的输出事件。系统可以显示的一…

19.题目:编号3865 Alice与Bob的爱恨情仇

题目&#xff1a; ###该题主要考察思维、和博弈 &#xff08;写起来容易&#xff0c;但是不太好想&#xff09; #include<bits/stdc.h> using namespace std; int main(){int n,k;cin>>n>>k;int ans0,x;while(n--){cin>>x;ansx%2;}if(ans%2){cout<…

Effective C++ 学习笔记 条款16 成对使用new和delete时要采取相同形式

以下动作有什么错&#xff1f; std::string *stringArray new std::string[100]; // ... delete stringArray;每件事看起来都井然有序&#xff0c;使用了new&#xff0c;也搭配了对应的delete。但还是有某样东西完全错误&#xff1a;你的程序行为未定义。至少&#xff0c;str…

进程:守护进程

一、守护进程的概念 守护进程是脱离于终端控制&#xff0c;且运行在后端的进程。&#xff08;孤儿进程&#xff09;守护进程不会将信息显示在任何终端上影响前端的操作&#xff0c;也不会被终端产生的任何信息打断&#xff0c;例如&#xff08;ctrlc&#xff09;.守护进程独立…

[密码学]入门篇——加密方式

一、概述 加密方法主要分为两大类&#xff1a; 单钥加密&#xff08;private key cryptography&#xff09;&#xff1a;加密和解密过程都用同一套密码双钥加密&#xff08;public key cryptography&#xff09;&#xff1a;加密和解密过程用的是两套密码 历史上&#xff0c…

POS 之 最终确定性

Gasper Casper 是一种能将特定区块更新为 最终确定 状态的机制&#xff0c;使网络的新加入者确信他们正在同步规范链。当区块链出现多个分叉时&#xff0c;分叉选择算法使用累计投票来确保节点可以轻松选择正确的分叉。 最终确定性 最终确定性是某些区块的属性&#xff0c;意味…