循环链表的设计与基本操作的实现

目录

一.循环链表的设计

二.循环链表的实现

三.循环链表的总结


一.循环链表的设计

1.循环链表的结构设计:

typedef struct CNode{

    int data;
    struct CNode* next;

}CNode ,*CList;

2.循环链表的示意图:

3.循环链表和单链表的区别:

唯一区别,没有空指针,尾节点的后继为头,为循环之意.

二.循环链表的实现

//初始化
void InitList(CList plist)
{
	assert(plist != NULL);
	if (plist == NULL)
		return;

	//头节点的数据域不使用
	plist->next = plist;//环形
}


//头插
bool Insert_head(CList plist, int val)
{
	assert(plist != NULL);
	if (plist == NULL)
		return false;

	//申请节点
	CNode* p = (CNode*)malloc(sizeof(CNode));
	assert(p != NULL);
	//放入数据
	p->data = val;
	//头插
	p->next = plist->next;
	plist->next = p;
	return true;

}

//尾插
bool Insert_tail(CList plist, int val)
{
	assert(plist != NULL);
	if (plist == NULL)
		return false;

	//创建新节点
	CNode* p = (CNode*)malloc(sizeof(CNode));
	assert(p != NULL);
	p->data = val;
	//找尾巴
	CNode* q;
	for (q = plist; q->next != plist; q = q->next)
	{
		;
	}
	//尾插
	p->next = q->next;//p->next=plist;
	q->next = p;

	return true;
}

//插入数据,在plist链表的pos位置插入val;
bool Insert(CList plist, int pos, int val)
{
	if (pos<0 || pos>GetLength(plist))
	{
		return false;
	}
	//申请节点
	CNode* p = (CNode*)malloc(sizeof(CNode));
	assert(p != NULL);
	p->data = val;
	//找位置
	CNode* q;
	int i = 0;
	for(q=plist;i<pos;i++,q=q->next)
	{
		;
	}
	//插入
	p->next = q->next;
	q->next = p;

	return true;
}

//判空
bool IsEmpty(CList plist)
{
	return plist->next == plist;
}

//获取数据节点的个数
int GetLength(CList plist)
{
	assert(plist != NULL);
	if (plist == NULL)
		return 0;
	int count = 0;
	for (CNode* p = plist->next; p != plist; p = p->next)
	{
		count++;
	}
	return count;
}

//在plist中查找第一个key值,找到返回节点地址,没有找到返回NULL;
CNode* Search(CList plist, int key)
{
	assert(plist != NULL);
	if (plist == NULL)
		return NULL;
	for (CNode* p = plist->next; p != plist; p = p->next)
	{
		if (p->data == key)
		{
			return p;
		}
	}
	return NULL;
}

//删除pos位置的值
bool DelPos(CList plist, int pos)
{
	if (pos < 0 || pos >= GetLength(plist))
	{
		return false;
	}
	CNode* p;
	int i;
	for (p = plist, i = 0; i < pos; i++, p = p->next)
	{
		;
	}
	CNode* q = p->next;//q是要删除的点

	p->next = q->next;
	free(q);

	return true;

}


bool DelVal(CList plist, int val)
{	
	CNode* p = GetPrio(plist, val);
	if (p == NULL)
	{
		return false;
	}
	CNode* q = p->next;//q为要删除的点
	p->next = q->next;
	free(q);

	return true;
}

//返回key的前驱地址,如果不存在返回NULL;
CNode* GetPrio(CList plist, int key)
{
	CNode* p;
	for (p = plist; p->next != plist; p = p->next)
	{
		if (p->next ->data == key)
		{

			return p;
		}
	}
	return NULL;

}

//返回key的后继地址,如果不存在返回NULL;
CNode* GetNext(CList plist, int key)
{
	CNode* p = Search(plist, key);
	if (p == NULL)
		return NULL;
	return p->next;
}

//输出
void Show(CList plist)
{
	for (CNode* p = plist->next; p != plist; p = p->next)
	{
		printf("%d  ", p->data);
	}
	printf("\n");
}

//清空数据
void Clear(CList plist)
{
	Destroy(plist);
}

//销毁整个内存
void Destroy(CList plist)
{
	//总是删除第一个数据节点
	CNode* p;
	while (plist->next != plist)
	{
		p = plist->next;
		plist->next = p->next;
		free(p);
	}
}

三.循环链表的总结

循环链表其实和单链表是一样的操作,只是在处理的时候处理好尾节点即可,切记,遍历循环链表中不可出现NULL,若遍历的时候出现NULL就错了.

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

OpenAI开发者大会之后,当何去何从?

简介 过往总结 ​产品升级 GPT-4 Turbo Agent化 此间的未来 定制GPT GPT商店 Assistants API 总结与思考 简介 此次发布会简单总结如下。 1. 发布GPT-4 Turbo&#xff1a; 更长。支持128K上下文输入&#xff0c;标准GPT-4是8K版本&#xff0c;之前升级出了32K版本 更…

TensorFlow学习笔记--(2)张量的常用运算函数

张量的取值函数 求张量的平均值: tf.reduce.mean(%张量名%)求张量的最小值:tf.reduce_min(%张量名%)求张量的最大值:tf.reduce_max(%张量名%)求张量的和:tf.reduce_sum(%张量名%)其次,对于上述所有操作 都可在函数后添加一个新的参数 axis%维度% axis0 代表第一维度 axis1 代表…

文件加密软件怎么用(附2种解密破解工具)

有时候出差或者有些商务场合&#xff0c;需要对一些敏感文件做一下简单的加密&#xff0c;这样在分享内容的时候&#xff0c;可以起到初步的保护作用。 当然了&#xff0c;如果文件非常重要&#xff0c;涉及到一些商业机密&#xff0c;这个时候你需要使用专业的加密工具&#x…

什么是代理IP池?如何判断IP代理商的IP池是否真实优质?

代理池充当多个代理服务器的存储库&#xff0c;提供在线安全和匿名层。代理池允许用户抓取数据、访问受限制的内容以及执行其他在线任务&#xff0c;而无需担心被检测或阻止的风险。代理池为各种在线活动&#xff08;例如网页抓取、安全浏览等&#xff09;提高后勤保障。 读完…

机器学习基础之《回归与聚类算法(5)—分类的评估方法》

问题&#xff1a;上一篇的案例&#xff0c;真的患癌症的&#xff0c;能被检查出来的概率&#xff1f; 一、精确率和召回率 1、混淆矩阵 在分类任务下&#xff0c;预测结果(Predicted Condition)与正确标记(True Condition)之间存在四种不同的组合&#xff0c;构成混淆矩阵(适…

【Python自学笔记】python os.getcwd文件目录找不对

写小组项目的时候需要按照路径读入数据表&#xff0c;数据库和图片列表显示到html&#xff0c;按ChatGPT的答案写了python os.getcwd()&#xff0c;结果迁移到同组同学的电脑上总是报错。 经过一番查询&#xff0c;在CSDN上发现一个完美解决问题的好帖&#xff0c;特此存下链接…

订水商城实战教程09-跑马灯

目录 1 跑马灯效果2 创建数据源3 创建变量4 搭建组件5 数据绑定6 录入测试数据总结 上一篇我们介绍了轮播图如何开发&#xff0c;本节我们介绍一下跑马灯的效果开发。 1 跑马灯效果 通常小程序会增加一点动画的效果来让页面显得不那么死板&#xff0c;我们这里增加了一个跑马灯…

ChatGPT生产力|中科院学术ChatGPT优化配置

资源链接&#xff1a;GitHub - binary-husky/gpt_academic b站配置讲解链接&#xff1a;chatgpt-academic 新手运行官方精简指南&#xff08;科研chatgpt拓展&#xff09; 某知配置图文讲解&#xff1a;图文详解&#xff1a;在windows中部署ChatGPT学术版 - 知乎 (zhihu.com) 一…

统计一个只包含大写字母的字符串中顺序对的数量.其中顺序对的定义为前面的字符小后面的字符大.例如在“ABC“中的顺序对为3,因为有AB,AC,BC

哈希法&#xff1a;扫描字符串&#xff0c;将出现的字符次数加1&#xff0c;统计比当前字符字典序小的字母出现的次数&#xff0c;即为顺序串的个数。 int CounSq(const char* arr)//时间复杂度O&#xff08;n&#xff09; {int sig[26] { 0 };int index 0;int sum 0;for (…

微信小程序:js实现不改变原数组的情况下增加一条对象到新数组中

效果 核心 old_array.slice(0) 表示对 old_array 这个数组进行切片操作&#xff0c;从索引 0 开始&#xff08;包括索引 0&#xff09;&#xff0c;直到数组的末尾&#xff0c;old_array.slice(0) 中的 0 表示开始切片的索引位置&#xff0c;而由于没有传入第二个参数&#xff…

蓝桥杯每日一题2023.11.6

取位数 - 蓝桥云课 (lanqiao.cn) 题目描述 题目分析 由题意我们知道len中为现阶段长度&#xff0c;如果其与k相等也就是找到了正确的位数&#xff0c;否则就调用递归来进行搜索&#xff0c;每次搜索一位数。 #include <stdio.h> // 求x用10进制表示时的数位长度 int …

【MATLAB源码-第72期】基于matlab的OFDM-IM索引调制系统在高斯,瑞利,莱斯信道误码率对比,对比传统OFDM系统。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 OFDM-IM索引调制技术是一种新型的无线通信技术&#xff0c;它将正交频分复用&#xff08;OFDM&#xff09;和索引调制&#xff08;IM&#xff09;相结合&#xff0c;以提高频谱效率和系统容量。OFDM-IM索引调制技术的基本思想…

Vscode禁止插件自动更新

由于电脑的vscode版本不是很新。2022.10月份的版本1.7.2&#xff0c;电脑vscode的python插件装的也是2022年4月份的某个版本&#xff0c;但插件经常自动更新&#xff0c;导致python代码无法Debug,解决办法&#xff1a; 点设置&#xff0c;搜autoUpdate, 把红色框选成无

12、填写NGINX配置部署前端;运行jar部署后端

后端可以部署的方式&#xff0c;首先直接运行jar是肯定可以的。此外&#xff0c;可以单独开docker容器运行在容器中。 但是这里运行在容器中必要性&#xff0c;其实并不大。 当前我们直接运行jar来运行后端。后面推出集成docker。 直接运行jar包的方式&#xff0c;首先需要打…

Vue 3 相对于 Vue2,模板和组件的一些变化

目录 1&#xff0c;模板的变化1&#xff0c;v-modelvue2vue3 2&#xff0c;v-if 和 v-for3&#xff0c;keyv-forv-if 4&#xff0c;Fragment 2&#xff0c;组件的变化1&#xff0c;Teleport2&#xff0c;异步组件 1&#xff0c;模板的变化 1&#xff0c;v-model vue2 对组件…

新版HI3559AV100开发注意事项

新版HI3559AV100开发注意事项 一、在Hi3559A上使用openCV VideoCapture开启.mp4影像档, isOpened一直得到false 在Hi3559A上已经cross compile ffmepg 4.1openCV 3.4.4 但使用openCV VideoCapture开启.mp4影像档, isOpened一直得到false 请问要如何知道是什么原因无法开启影像…

java测试private

java测试private变量、方法 📕反射的基本作用、关键? 反射是在运行时获取类的字节码文件对象,然后可以解析类中的全部成分反射的核心思想和关键就是:得到编译以后的class文件对象可以破坏封装性(很突出)也可以破坏泛型的约束性(很突出)更重要的用途是适合:做java高级…

运营商大数据精准获客:我们提供精准客源渠道的最大资源体?

运营商大数据精准营销 谈起精准获客&#xff0c;竞争对手永远是为我们提供精准客源渠道的最大资源体&#xff01; 最新的获客方式&#xff0c;就是从竞争对手的手中把他们的精准客户资源变为自己的。 今年最火的运营商大数据精准营销是拒绝传统营销方式的烧钱推广&#xff0…

VSCode使用插件Github Copilot进行AI编程

演示示例 函数封装 根据上下文 根据注释 详情请看GitHub Copilot 安装插件 在VS Code中安装插件 GitHub Copilot 登录账号 点击VS code左下角账户图标&#xff0c;点击【Sign in】&#xff0c;会自动在浏览器打开Github登录页&#xff0c;登录具有 Github Copilot 服务的…
最新文章