王道数据结构C语言循环链表基本操作实现

news2024/9/21 22:45:41

文章目录

  • 一、循环单链表
    • 1.1初始化及判空操作
    • 1.2判断是否是尾结点
  • 二、循环双链表
    • 2.1初始化
    • 2.2判空
    • 2.3判断尾结点
    • 2.4循环双链表的删除


一、循环单链表

1.1初始化及判空操作

其实循环链表就是在单链表(双链表)上做一点小小的优化

它是把尾结点的next指向了头结点
如果当前链表为空,也就是只有一个头结点(头结点不放东西)
那么头结点的next是要指向它自己的,形成一个循环
在这里插入图片描述

我们判空也只需要判断头结点的next是不是头结点自己

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdbool.h>
typedef struct {
	int data;//结点存放的数据类型,这里考试一般把int换成ElemType
	LNode* next;//指向下一个结点的指针
}LNode,*LinkList;

//初始化一个循环单链表
bool Init(LinkList *L) {
	(*L) = (LNode*)malloc(sizeof(LNode));//分配一个头结点
	if ((*L) = NULL) {
		return false;
	}
	(*L)->next = L;//头结点的next指向头结点,先构成一个简单的循环、
	return true;
}

//判断循环单链表是否为空
bool Empty(LinkList L) {
	if (L->next == L) {
		return true;
	}
	else {
		return false;
	}
}


1.2判断是否是尾结点

这个也很好搞,尾结点指向头结点嘛,你就看哪个结点的next指向头结点就完了

//判断结点p是否为循环单链表的表尾结点
bool isTail(LinkList L, LNode* p) {
	if (p->next == L) {
		return true;
	}
	else {
		return false;
	}
}

很多时候对链表的操作都是在头部或者尾部,我们普通单链表如果要找最后一个结点,但是只给了头结点,我们只能一个一个往后遍历,时间复杂度为O(n)

然而对于循环单链表来说,如果我们让这个单链表的指针L不是指向头结点,而是指向尾部这个结点,从尾部找到头部只需要往后找一个结点即可,时间复杂度为O(1),而找尾部的话,因为本身指针就是指向尾部,时间复杂度也是O(1)

二、循环双链表

对于循环双链表来说,除了要把尾部结点next指向头结点,还要把头结点的prior指向尾结点
在这里插入图片描述

2.1初始化

初始化由于只有一个头,所以头的next指向自己,prior也要指向自己
在这里插入图片描述

//循环双链表初始化
typedef struct {
	int data;//考试中一般把int换成ElemType
	DNode* prior;
	DNode* 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;
}

2.2判空

这个和循环单链表判空一样,因为空表的时候就一个头结点,它的next指向自己

bool isTail(DLinkList L, DNode* p) {
	if (p->next == L) {
		return true;
	}
	else {
		return false;
	}
}

2.3判断尾结点

这个和单循环那里也是一样的,给一个结点,你就看它的next是不是指向头结点就行了

bool isTail(DLinkList L, DNode* p) {
	if (p->next == L) {
		return true;
	}
	else {
		return false;
	}
}

2.4循环双链表的删除

这个比普通双链表删除更简单,普通的还要判断被删的是不是尾结点

循环的双链表你直接进行下面的三步代码就完了,因为它是一个循环连起来的,是不是尾结点无所谓。

//删除p的后继结点q
p->next=q->next;
q->next->prior=p;
free(q);

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

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

相关文章

广西建筑模板施工中的常见问题及解决方法

广西建筑模板施工中的常见问题及解决方法在广西建筑模板的施工过程中&#xff0c;可能会出现一些常见的质量问题。以下是常见问题及其解决方法&#xff0c;以帮助您更好地处理这些问题。 1. 透胶问题&#xff1a;透胶是指模板中出现胶水渗透的现象。可能的原因包括单板质量差、…

设备树的理解与运用

设备树&#xff1a; 本质是一个文件&#xff0c;包含很多节点&#xff0c;每个节点里边是对设备属性的描述&#xff08;包括GPIO&#xff0c;时钟&#xff0c;中断等等&#xff09;,其中节点&#xff08;node&#xff09;和属性&#xff08;property&#xff09;就是设备树最重…

mysql数据库数据如何迁移目录

目录 1.关闭正在运行mysql2.找到本机my.ini 文件3.观察目录结构4.复制注意是复制Data文件夹到目的地5.找到my.ini初始位置修改数据路径并保存6.启动mysql7.关注my.ini 常用配置 1.关闭正在运行mysql 2.找到本机my.ini 文件 默认位置 C:\ProgramData\MySQL\MySQL Server 8.0 …

如果你是独立开发者,你是先写前端还是先写后端?

当我们站在独立开发的路口时&#xff0c;一个重要的抉择就摆在了我们面前&#xff1a;是先着手前端开发还是后端开发&#xff1f;这看似简单的问题&#xff0c;却蕴含着许多深刻的考虑和决策。无论你是准备构建一个复杂的分布式系统还是一个引人入胜的用户界面&#xff0c;接下…

LeetCode每日一题:1462. 课程表 IV(2023.9.12 C++)

目录 1462. 课程表 IV 题目描述&#xff1a; 实现代码与解析&#xff1a; 拓扑排序 原理思路&#xff1a; 1462. 课程表 IV 题目描述&#xff1a; 你总共需要上 numCourses 门课&#xff0c;课程编号依次为 0 到 numCourses-1 。你会得到一个数组 prerequisite &#xff…

分布式文件系统对比与选型参考

目录 一、分布式文件系统 1、 数据的存储方式&#xff1a; 2、 数据的读取速率 3、 数据的安全机制 二、主流分布式文件系统介绍 1. GFS&#xff08;Google File System&#xff09; 2. HDFS&#xff08;Hadoop Distributed File System&#xff09; 3. Ceph …

java在mysql中查询内容无法塞入实体类中,报错 all elements are null

目录 一、问题描述二、解决方案 一、问题描述 java项目中整体配置了mysql的驼峰式字段匹配规则。 mybatis.configuration.map-underscore-to-camel-casetrue由于项目需求&#xff0c;需要返回字段为file_id&#xff0c;file_url&#xff0c;并且放入实体类中&#xff0c;实体…

对话大模型中的情感支持及商业化落地

在1982年经典科幻电影《银翼杀手》中&#xff0c;仿生人瑞秋因为被植入记忆而以为自己是真人&#xff0c;当被告知自己是仿生人时&#xff0c;她拒绝相信&#xff0c;流下了眼泪。如今&#xff0c;随着AI领域对话大模型技术的发展&#xff0c;“比人更像真人”的人工智能正从梦…

vue实现左右伸缩(el-drawer自定义位置展开收缩)

内容左右收缩展开 实现需求实现效果自定义抽屉(el-drawer)展开位置实现原理 js方法&#xff0c;点击的时候抽屉伸缩展开&#xff0c;并且给左侧右侧内容对应的宽度第二种方法 实现需求 页面内容是左右布局&#xff0c;需求想让左侧内容可收缩&#xff0c;然后展示完全右侧内容。…

模拟经营类游戏是怎么开发的?

模拟经营类游戏开发是一个充满挑战但也充满乐趣的领域。下面是一些步骤和关键考虑因素&#xff0c;可以帮助您开始开发自己的模拟经营游戏&#xff1a; 明确游戏概念&#xff1a; 确定游戏开发的主题和类型&#xff0c;例如城市建设、农场经营、餐厅经营等。 制定一个引人入胜…

《论文阅读》通过动态融入常识知识来提高同理心对话的生成

《论文阅读》通过动态融入常识知识来提高同理心对话的生成 前言简介模型架构Contextual ProbingContextual Unification Workspace代码实现Knowledge-Aware Decoder实验结果前言 你是否也对于理解论文存在困惑? 你是否也像我之前搜索论文解读,得到只是中文翻译的解读后感到…

文件路径中的/,\的区别和文件路径的常见用法

/是Unix和类Unix系统上的路径分隔符.现代Windows通常可以同时使用\和/交换文件路径,但微软\几十年来一直主张使用路径分隔符. 关于文件路径的常用方法再学习一下&#xff1a; "./"&#xff1a;代表目前所在的目录 "../"&#xff1a;代表上一层目录 以&q…

如何在Blender中压缩/减小GLTF模型的大小

GLTF 如何在Blender中压缩/减小GLTF模型的大小 Blender是一款功能强大的开源软件&#xff0c;旨在创建3D图形&#xff0c;动画和视觉效果。它支持多种文件格式的导入和导出&#xff0c;包括GLB&#xff0c;GLTF&#xff0c;DAE&#xff0c;OBJ&#xff0c;ABC&#xff0c;USD…

CAD批量转换低版本怎么转?教你一看就会的转换方法

CAD文件需要转换版本是因为不同版本的CAD软件可能不兼容。这意味着&#xff0c;如果在一个版本的CAD软件中创建了一个文件&#xff0c;可能无法在另一个版本的CAD软件中打开它。这可能会导致数据丢失或格式错误。 为了避免这种情况&#xff0c;需要将CAD文件转换为适当的版本以…

短视频seo矩阵系统源码开发与部署全解析

在这个数字化快速发展的时代&#xff0c;短视频已经成为人们获取娱乐&#xff0c;学习&#xff0c;商业信息的主要途径之一。对于企业来说&#xff0c;利用短视频矩阵进行高效且精准的营销推广&#xff0c;无疑是一个重要的战略方向。本文将详细介绍如何进行短视频矩阵源码的开…

【开源】无忧企业文档文库管理界面介绍

无忧企业文档是软开企服研发的一款集知识库、网盘、在线协同为一体的企业级办公软件&#xff0c;有完全免费的开源版&#xff0c;也有功能丰富的商业版。开源版在社区开放了全量源码&#xff0c;商业版支持提供源码&#xff0c;支持二次开发&#xff0c;适合中小企业使用。 文…

企业如何简化线上营销服务流程,让服务更通畅?

在线客服是现代企业服务的重要组成部分&#xff0c;在线客服的质量在很大程度上决定客户的满意度和忠诚度。企业如何简化线上营销服务流程&#xff0c;让服务更通畅&#xff1f;本文将就此探讨。 一、建立流程管理体系 在线上营销服务中&#xff0c;建立流程管理体系可以帮助企…

期权期货品种的交易时间规定与限制

期权和期货品种是在交易所进行交易的&#xff0c;期货交易所有固定的工作时间&#xff0c;并不是24小时都可以交易的&#xff0c;一般国内的期货交易所有日盘和夜盘&#xff0c;不同交易所对交易时间的规定有所不同&#xff0c;交易的期货品种不同&#xff0c;交易时间也是有所…

真实的产品开发中,后端的设计规约可以写哪些

真实的产品开发中&#xff0c;后端的设计规约可以写哪些 产品开发的后端设计规约通常包括以下内容&#xff1a; 数据模型设计&#xff1a;详细描述数据库的结构&#xff0c;包括数据表的设计、字段的定义和关系的设置等。 业务逻辑设计&#xff1a;详细描述后端的业务逻辑&a…