循环链表的创建及可控输出

[数据结构]链表之循环链表 需要注意的是,在循环链表中,插入和删除操作需要额外考虑最后一个节点的next指针和第一个节点的prev指针的修改。总之,循环链表是一种特殊的链表结构,在实现各种操作时需要注意其连续性和有序性,并针对特殊情况进行相应的处理。需要注意的是,在进行各种操作时,需要保证循环链表的连续性和有序性,以避免数据不一致等问题的发生。需要注意的是,在进行各种操作时,需要保证循环链表的连续性和有序性,即每个节点的next指针都指向下一个节点,并且最后一个节点的next指针指向头节点。但是,其实现简单,无需处理哈希冲突等问题。 阅读详情

循环链表的创建以及基本操作

上篇我们讲了运用头插法和尾插法创建单链表的方法,和两种方法的比较。 接着我们学习循环链表的创建。

只要学会了单链表的创建,循环链表的创建就变得很简单。

循环链表创建
单链表的结构:
在这里插入图片描述

循环链表:
在这里插入图片描述
所谓循环链表,就是将单链表的尾结点 end 的指针域 也就是 end->next 指向头结点的地址 : end->next = head 。 这样就完成了循环链表的创建。
这就完了? 当然没有那么简单了~~~

循环链表不同于单链表,原因在于上篇我们讲单链表的时候,尾结点指针域的指向永远是 NULL,也就是 end->next = NULL。 因此判断单链表结束的标志,就是 while( node->next != NULL) ,但是循环链表的尾结点指向的不是 NULL ,而是 头结点 head。因此,我们判断的标准也要改变。

思考过后,决定将头结点的数据域赋值为 -1,这样就有了一个标志,用来判断是否将循环链表执行完一次。

思而不学则殆,即刻上手!

Linklist Creat_list(Linklist head) {
	LNode *node = NULL;
	LNode *end = NULL;
	head = (Linklist)malloc(sizeof(LNode));
	head->next = NULL;
	head->data = -1;
	end = head;
	int count = 0;
	printf("Input node numbers: ");
	scanf("%d", &count);
	for (int i = 0; i < count; i++) {
		node = (LNode*)malloc(sizeof(LNode));
		node->data = i;
		end->next = node;
		end = node;
	}
	end->next = head;            //  将尾结点的指针指向头结点
	return head;
}

这就完成了循环链表的创建,接下来我们要想办法让循环链表按照我们预想来执行循环的次数。
思前想后,想出了这个函数来判断一个循环链表内的结点数。

int node_number(Linklist *head) {
	Linklist tem = head;
	tem = tem->next;              //  因为头结点的数据域值为-1,因此需要从头结点的下一个结点开始
	int count = 0;                //  计数结点的个数 
	while (tem->data != -1){               //  因为将头结点的数据域赋值-1,因此-1相当于一个标签
		count++;                        //  没执行一次,结点数就多一个
		tem = tem->next;           //  下一个结点
	}
	return count + 1;              //  因为第一次执行循环之前,跳过了头结点,因此得到的count 没有算头结点,返回的时候我们加上1
}

这样我们便得到了循环链表的结点个数。
只要有了结点个数,我们就可以根据我们的需求来执行输出循环链表所有结点的次数。

void Illustrate(Linklist head) {
	Linklist tem = head;
	int size = node_number(head)*2;           //  *2 表示将循环链表执行两次
	for (int i = 0; i < size; i++) {          //  size 表示需要通过的结点的个数。
		printf("%d   ", tem->data);
		tem = tem->next;
	}
}

这样我们就完成了循环链表的创建以及控制输出。

C++双向链表实现:从哨兵节点到迭代器设计的工程实践 链表作为一种基础数据结构,通过节点和指针实现元素的非连续存储,其核心原理在于利用指针建立元素间的逻辑顺序关系。相比数组,链表在任意位置插入和删除操作上具有O(1)的时间复杂度优势,避免了数据搬移的开销,这一特性使其在需要频繁动态调整数据顺序的场景中具有重要技术价值。在工程实践中,双向链表通过前驱和后继指针的维护,支持双向遍历,常被应用于实现LRU缓存淘汰算法、文本编辑器缓冲区、游戏对象管理等需要高效中间操作的场景。本文聚焦于C++中双向链表的工业级实现,深入探讨了哨兵节点设计如何统一插入删除的边界处理逻辑, 阅读详情

相关推荐

C++数组实现约瑟夫环:状态标记法与环形遍历详解

数组是计算机科学中最基础且核心的数据结构之一,以其连续的内存布局和高效的随机访问特性,成为实现各类算法的基石。其原理在于通过下标直接定位元素,时间复杂度为O(1),在需要频繁遍历和状态管理的场景中极具技术价值。约瑟夫环问题作为经典的算法案例,常被用于考察对循环逻辑和数据结构的选择能力。本文聚焦于利用C++中的数组(或vector)结合状态标记法,通过取模运算实现环形遍历,详细拆解其实现细节、性能考量及工程实践中的调试技巧,为理解数据结构应用和算法优化提供了清晰的范例。

weixin_32667955的博客 277

C语言数据结构篇——循环链表的创建,插入,节点删除,打印等操作

C语言数据结构篇——循环链表的创建,插入,节点删除,打印等操作

m0_68382289的博客 2887

UE5摄像机视角切换的三种高效实现方式

本文详细解析了在UE5中实现摄像机视角切换的三种高效方法:遍历场景摄像机、变量存储引用以及利用Tag标签系统。针对不同项目规模与需求,分析了各自的原理、蓝图实现步骤、优缺点及实战优化建议,并探讨了混合使用策略,帮助开发者构建流畅、可控的视角切换体验。

weixin_29008805的博客 429

线性表之循环链表的建立、查找、插入和删除(附C++程序)

本文介绍了线性表中的循环链表,包括循环单链表、循环双链表的头插法和尾插法的建立,按元素查找,插入和删除操作。

ch18328071580的博客 3808

服务端图表渲染新思路:JSON直接生成SVG/PNG,无需浏览器

数据可视化是报表、监控和文档自动化中的关键环节,而服务端高效产出图表图片一直是工程实践的难点。传统方案依赖前端图表库与浏览器截图,往往带来资源占用高、结果不稳定等问题。基于JSON配置的声明式渲染模式,将图表结构抽象为标准化数据,由渲染器直接输出SVG或PNG,实现了确定性、可复现、无浏览器的图形生成。该方案具备轻量部署、批量出图快、适合CI/CD集成等优势,为定时报表、监控告警配图、批量可视化等场景提供了稳定高效的解决路径。SlickFast正是这一思路的代表工具,通过配置契约分离数据与样式,让服务端出图

weixin_33946020的博客 404

C++构建高性能家政管理系统:架构设计、调度算法与工程实践

在现代软件开发中,系统性能与资源控制是核心考量。C++以其零成本抽象和直接内存管理能力,在需要高并发、低延迟和确定性行为的业务场景中展现出独特优势。其原理在于通过精细控制硬件资源,避免垃圾回收等机制带来的不可预测停顿,从而保障核心业务逻辑的执行效率。这一技术价值在实时计算、调度算法和高性能服务端开发中尤为突出。应用场景广泛覆盖金融交易、游戏服务器、嵌入式系统及物联网网关等。本文以家政管理系统为例,深入探讨如何运用C++17现代特性、CMake构建系统及高性能库(如cpp-httplib、spdlog),实现

weixin_33871366的博客 545

如何创建单链表以及循环链表

在这里插入代码片@[TOC](这里写#### 标题 标题定义目录标题) 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。 新的改变 我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客: 全新的界面设计 ,将会带来全新的写作体验; 在创作中心设置你喜爱的代码高亮样式

triggerV的博客 2032

CTF PWN入门:从栈溢出到堆漏洞的实战攻防技术解析

二进制安全是网络安全的核心领域,涉及程序底层的内存管理与执行控制。其基本原理在于程序运行时数据与指令在内存中的布局存在安全边界,当输入数据超出预定缓冲区时,可能覆盖关键控制数据,从而改变程序执行流程。这项技术的核心价值在于揭示软件深层次缺陷,提升系统安全防护能力,广泛应用于漏洞挖掘、安全评估和CTF竞赛等场景。在CTF PWN挑战中,参赛者通过分析ELF可执行文件,利用栈溢出等内存破坏漏洞,结合Ret2libc和ROP链构造技术,最终实现权限获取。本文聚焦栈溢出与格式化字符串漏洞的利用,详细讲解如何通过GD

weixin_34121282的博客 370

数据结构之循环链表(C语言)

用C语言实现循环链表

sskdspdl的博客 1002

嵌入式数据结构实战:栈队列二叉树的资源受限实现

在嵌入式系统中,栈、队列、二叉树并非抽象算法概念,而是直面内存限制、中断响应与实时性约束的核心工程组件。其设计本质是物理内存布局问题——栈涉及SP寄存器操作与栈帧对齐,队列需应对DMA高频率写入与无锁同步,二叉树则必须放弃动态指针、转向线索化数组索引以压缩RAM占用。这些结构共同支撑协议解析、实时调度与本地检索等关键场景,技术价值体现在确定性执行、零动态分配与字节级资源可控。本文聚焦STM32、ESP32、GD32等主流MCU平台,详解三类结构在中断上下文、FreeRTOS任务及裸机环境下的硬核落地方法。

weixin_30521161的博客 351

钉钉Java面经及参考答案

TCP 三次握手建立连接的核心目标是双向确认双方发送、接收能力,同步通信序列号,协商初始窗口大小,防止历史过期连接报文干扰新连接。第一次握手,客户端主动向服务端发送 SYN 报文,携带客户端随机生成的初始序列号 ISN,客户端状态变更为 SYN_SENT,目的是告知服务端客户端具备发送数据的能力。第二次握手,服务端收到 SYN 报文后,回复 SYN+ACK 报文,其中 ACK 确认号为客户端 ISN+1,同时携带服务端自身随机初始序列号,服务端进入 SYN_RCVD 状态,代表服务端确认收到客户端报文,且自

大模型大数据攻城狮的专栏 229

Python图论可视化实战:NetworkX与Matplotlib绘制非赋权、赋权与有向图

图论是描述实体间关系的基础数据结构,广泛应用于社交网络、知识图谱和系统依赖分析。其核心原理在于通过节点和边对关系进行建模,将抽象数据转化为直观洞察。在数据科学和算法工程中,图可视化技术能极大提升复杂关系数据的分析效率。借助Python的NetworkX库,可以便捷地构建和计算图模型,再结合Matplotlib的绘图能力,能够实现从基础非赋权图到带权重的赋权图,再到具有方向性的有向图的可视化表达。通过调整布局算法、视觉编码(如用边宽映射权重、箭头表示方向),可以将算法结果、网络结构清晰呈现,服务于数据分析、学

weixin_30509393的博客 359

【信息科学与工程学】【数据科学】数据科学领域 第六篇 算法设计 02 分布式多服务器管理算法

类别子类数量算法总数主要功能领域1. 负载均衡​12个子类150+算法请求分发、会话保持、健康检查2. 资源分配​15个子类180+算法CPU/内存/存储/网络分配3. 缓存管理​10个子类120+算法内容放置、替换、预取、一致性4. 队列管理​8个子类100+算法消息队列、任务队列、优先级队列5. 路由调度​12个子类150+算法路径选择、流量工程、拥塞控制6. 服务治理​10个子类120+算法服务发现、熔断、限流、降级7. 服务质量​8个子类90+算法SLA保障、QoE优化、准入控制8. 安全管控​12

weixin_49199313的博客 763

读懂FreeRTOS task.c:掌握任务调度与内存管理核心机制

任务调度是实时操作系统的核心能力,其本质依赖于任务控制块(TCB)的生命周期管理、就绪列表的优先级索引机制以及延时/阻塞任务的时间管理模型。FreeRTOS通过task.c实现O(1)调度、双缓冲延时链表和异步资源回收等关键设计,支撑高确定性任务切换与中断协同。理解TCB内存布局、uxTopReadyPriority更新逻辑及xTasksWaitingTermination清理机制,是解决freertos spi乱码、freertos can通信丢帧等典型问题的技术前提。本文深入task.c源码层,解析任务

weixin_34389926的博客 462

【信息科学与工程学】【数据科学】数据科学领域 第六篇 算法设计 07 堆、栈、表、矩阵、集合、队列、数组、字符串、树、图、动态规划、结构体、元组的算法01

当前段必须包含所有字符的最后出现位置。1. 字符串分割成最多片段2. 基因序列功能域划分3. 文本段落划分4. 音频声道分离5. 图像色彩分区6. 社交网络社群划分7. 蛋白质结构域8. 音乐乐章分段9. 代码模块划分10. 章节划分特征:一次扫描,贪心确定边界。

weixin_49199313的博客 1251

【信息科学与工程学】计算机科学与自动化-——第十五篇云计算 11 算法篇

在百万级虚拟机、百万级租户的超大规模云环境中,核心算法挑战包括:挑战维度具体问题算法需求技术复杂度规模性​百万级对象并发管理分布式算法、分区算法极高(NP-hard问题)多租户​租户间隔离与资源共享公平性算法、隔离算法高(多目标优化)动态性​资源需求实时变化自适应算法、在线算法高(实时决策)异构性​硬件/负载/需求差异分类算法、匹配算法中高(多维度优化)经济性​资源利用率与成本平衡优化算法、博弈论算法高(多目标博弈)以下是按领域分类的详细算法列表:算法名称数学建模表达核心思想时间复杂度适用场景推理步骤首次适

weixin_49199313的博客 1387

C++数据结构与算法实战:从《数据结构、算法与应用》出发的工程化学习路径

数据结构与算法是计算机科学的核心基础,它们决定了程序如何高效地组织与处理数据。其原理在于通过特定的数据组织方式(如数组、链表、树、图)和操作步骤(算法),在时间与空间复杂度间取得平衡,以解决各类计算问题。掌握它们的技术价值巨大,不仅能提升代码性能与资源利用率,更是构建复杂系统、通过技术面试的基石。在应用场景上,从数据库索引(B+树)、网络路由(图算法)到缓存系统(哈希表),无处不在。本文聚焦于通过《数据结构、算法与应用》这本经典教材,结合C++语言进行系统性实战,尤其深入探讨了**指针操作**与**内存管理

weixin_34054866的博客 433

Unity开发HoloLens应用:从打包到部署的完整指南

本文为Unity开发者提供了将应用部署到HoloLens设备的完整实战指南。详细讲解了从环境准备、Unity项目配置、生成Visual Studio工程,到最终构建APPX安装包并通过设备门户或Visual Studio进行部署的全流程,帮助开发者高效完成混合现实应用的打包与安装。

red88的博客 1017

新疆大学828数据结构考研:算法设计能力提升与高频考点精析

数据结构是计算机科学的核心基础,它研究数据的组织、存储和操作方式,直接影响程序的效率和性能。其核心原理在于通过逻辑结构(如线性表、树、图)和物理存储结构的有效结合,实现数据的高效管理。掌握数据结构对于提升算法设计能力、优化软件性能具有关键价值,广泛应用于数据库索引、编译器设计、网络路由等场景。在考研专业课复习中,精准把握目标院校的高频考点和命题风格至关重要。本文聚焦新疆大学计算机技术专业(085404)的初试科目“828数据结构”,深入解析其以“算法设计题”为核心的考核重点,并围绕“链表”和“二叉树遍历”等

weixin_30263073的博客 442

fMRI脑影像特征提取——静息态与任务态,ALFF/fALFF和ReHo(Dpabi,Rest1.8)

任务态和静息态是大脑的两种状态,前者主要是指大脑在执行记忆、识别以及运动等具体任务时的状态,静息态则是指大脑不执行具体认知任务、保持安静、放松、清醒时的状态,是大脑所处的各种复杂状态中最基础和最本质的状态。任务态fMRI分析有非常悠远的历史,而静息态fMRI自1995年biswal教授及其同事率先报告静息态fMRI具有生理意义后,越来越多的人进入了静息态的研究领域。任务态fMRI主流的分析方法是模型驱动(GLM+HRF),也可以引用静息态fMRI

意疏的学习笔记 6万+

从信号到振镜:STM32F103 + XY2-100协议 + AM26LS31芯片的激光打标/雕刻系统信号链搭建指南

本文详细介绍了基于STM32F103微控制器和XY2-100协议的激光打标/雕刻系统信号链搭建方法。从数字振镜控制协议解析、AM26LS31差分驱动电路设计到信号完整性优化,提供了一套完整的解决方案,帮助工程师实现高精度激光控制系统的开发与调试。

weixin_42536058的博客 229
上一篇: 创建单链表的头插法与尾插法详解
下一篇: 顺序表实现栈的操作
Descosmos
博客等级 码龄9年 318粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值