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

文章目录

      • 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;elsereturn 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;elsereturn false;
}
4.2.3判断结点p是否为循环双链表的表尾结点

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

bool isTail(DLinkList L, DNode  *p){if(p->next == L)return true;elsereturn 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.hqwc.cn/news/521309.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数字孪生基础开发平台的流程

搭建数字孪生基础开发平台的流程可以分为以下步骤,具体的实施方法和步骤可能会根据具体项目的要求和特点而有所不同。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎交流合作。 1.需求分析: 确定数字孪生基础开发平台的目…

基于SSM的环境监测管理系统设计与实现

目 录 摘 要 I Abstract II 引 言 1 1 主要技术和工具介绍 3 1.1 SSM框架简介 3 1.1.1 Spring 3 1.1.2 Mybatis 数据持久化技术 3 1.1.3 SpringMVC 3 1.2 MySQL数据简介 4 1.3 本章小结 4 2 系统分析 5 2.1 需求分析 5 2.1.1 功能分析 5 2.1.2 用例说明 6 2.2 可行性分析 9 2.…

C++ Qt开发:QFileSystemModel文件管理组件

Qt 是一个跨平台C图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍如何运用QFileSystemModel组件实现文件管理器…

设计模式(工厂模式)

设计模式(工厂模式) 一、工厂模式介绍 在工厂模式中,父类决定生成示例的方式,但不决定所要生成的具体的类,具体的处理部分交给子类负责。这样就可以将生成示例的框架和生成示例的类解耦。 二、示例程序 以下示例程…

【C++】设计模式:观察者、策略、模板

😏★,:.☆( ̄▽ ̄)/$:.★ 😏 这篇文章主要介绍设计模式:观察者、策略、模板。 学其所用,用其所学。——梁启超 欢迎来到我的博客,一起学习,共同进步。 喜欢的朋友可以关注一下&#xf…

工地安全反光衣穿戴监测报警摄像机

工地安全反光衣穿戴监测报警摄像机是为了提高工地施工人员的安全意识和监管效率而设计的。这种设备结合了反光衣、监测系统和报警摄像机的功能,可以有效减少工地事故的发生。 首先,工地安全反光衣是一种具有高度可见度的服装,能够使穿戴者在夜…

媒体推广攻略:五大技巧助你打造品牌形象

如何进行网络推广,媒体营销的策略和方法 利用媒体发稿推广是塑造品牌的主要途径之一。 下面迅推客将详细介绍五种利用媒体套餐推广和塑造品牌的技巧。 技巧一:选择合适的媒体套餐,选择合适的媒体套餐,是推广品牌的基础。在选择媒体套餐时&a…

Windows®、Linux® 和 UNIX® 系统都适用的远程桌面工具 OpenText ETX

Windows、Linux 和 UNIX 系统都适用的远程桌面工具 OpenText ETX 为 Windows、Linux 和 UNIX 实施精益、经济高效的虚拟化;提供完整的远程 Windows 可用性;以类似本地的性能远程工作;安全地保护系统和知识产权(IP)&am…

如何阅读“计算机界三大神书”之一 ——《计算机程序的构造和解释》SICP

👨‍🎓博主简介 🏅云计算领域优质创作者   🏅华为云开发者社区专家博主   🏅阿里云开发者社区专家博主 💊交流社区:运维交流社区 欢迎大家的加入! 🐋 希望大家多多支…

基于Vue的分类招生App设计与实现

目 录 摘 要 I Abstract II 引 言 1 1 绪论 3 1.1 项目的研究背景与意义 3 1.1 研究背景 31.2 研究意义 3 1.2 研究现状 4 1.3 技术简介 43.1 前端开发技术 43.2 服务端开发技术 53.3 数据库 6 1.4 本章小结 6 2 项目…

如何批量更改图片的创建时间和修改时间 ? 图片属性更改

在数字时代,图像已经成为我们日常生活中不可或缺的一部分。无论是在社交媒体上分享生活点滴,还是在工作报告中展示数据成果,图像都扮演着至关重要的角色。然而,有时我们可能需要对图像进行一些调整,以更好地满足我们的…

Threejs用切线实现模型沿着轨道行驶

这次讲一个经常遇到的使用场景,让模型沿着轨迹运动,这个场景需要解决两个问题,第一是让模型沿着轨迹运动,第二是在沿着轨迹运动的同时,要保持模型的头部也时刻保持前方,而不是单纯的只是更新模型位置。 还是…