数组实现模拟链表及其理解

无中生有之突击NOIP(2)--栈,队列,链表 1、队列定义:形如我们排队买票,第一个站队的人第一个买票一样,一个可以控制变量先进先出的结构体里,我们称之为队列。理解:我们可以想象出一排东西整齐存放于一行里,我们要做的是用一个可以压缩的框框,通过从前到后移动,来决定我们框住的值到底为多少。 实现代码如下:#include<stdio.h> #include<algorithm> int main(){ int q[102]={0,6 阅读详情

模拟链表在<<啊哈算法>>提出了一种实现方式,代码如下

#include<stdio.h>
int main()
{
	int data[101], right[101];//定义了两个数组
	int i, n, t, len;
	scanf_s("%d", &n);//读入数组的元素个数n
	for (i = 1; i <= n; i++)
		scanf_s("%d", &data[i]);//读入数组元素
	//data数组里面存储的是元素
	len = n;//len也是数组元素个数
	for (i = 1; i <= n; i++)
	{
		if (i != n)
			right[i] = i + 1;
		else
			right[i] = 0;
	}
	//这个不是很理解,就执行几次循环看一下吧
	// 假设长度为5,输入1 2 3 4 9
	//第一次的时候right[1]=2;
	//第二次的时候right[2]=3;
	//第三次的时候right[3]=4;
	len++;//现在len比数组元素个数多一个
	scanf_s("%d", &data[len]);//获取要插入的数值存到data[len]
	//假设插入个5
	t = 1;
	while (t != 0)
	{
		if (data[right[t]] > data[len])
		{
			right[len] = right[t];
			right[t] = len;
			break;
		}
		t = right[t];
	}
	//再看这个循环right[1]=2,data[2]与data[len]比较
	//不满足然后t=2
	//第二次循环right[2]=3,data[3]与data[len]比较
	//不满足然后t=3
	t = 1;
	while (t != 0)
	{
		printf("%d", data[t]);
		t = right[t];
	}
	getchar();
	getchar();
	return 0;
}

但是参照他给出的解释并没有非常理解这个的原理,于是自己结合这个代码理解了一下,并分享在下面.

结合这个图,也还是没有理解,但是想到既然叫模拟链表,跟链表还是有共同之处的,于是生套链表,试图理解.

那样的话,首先花了这个图

 

 

 这个图的话,更好理解,在这两个模拟链表中,t=1类似头指针,然后data[1]和right[1]类似数据域和指针域,t=right[t];相当于单链表里面的p=p->next;作用是找到下一个结点.

结合<<啊哈算法>>中"right是存放当前序列中每一个元素右边的元素在数组data中位置的",这句话应该理解为"当前序列是data,比如到了data[5],这个元素,那么data[5]下一个元素如果表示为data[i]的话,那么right[5]=i;"

STM32CubeMX+FreeRTOS+CAN总线+传感器实战:多任务系统与通信融合开发详解 本文详细介绍了基于STM32CubeMX和FreeRTOS的CAN总线与光电传感器融合开发实战。通过多任务系统设计,实现传感器数据采集与CAN通信的协同工作,提供完整的配置例程和调试技巧,适用于工业控制与机器人感知等应用场景。 阅读详情

相关推荐

自抗扰(ADRC)控制原理及控制器设计

自抗扰控制原理以及控制器设计

weixin_43487974的博客 3万+

数组模拟链表、栈、队列、单调队、栈

数组模拟链表、栈、队列、单调队、栈——打印资料 数组和链表的优劣对比 参考:https://zhuanlan.zhihu.com/p/73514867 数组的特点: 在内存中,数组是一块连续的区域。 插入和删除数据效率低(插入数据时,这个位置后面的数据都要后移) **查询效率很高。**因为数组是连续的,知道每一个数据的内存地址,可以直接找到给地址的数据(直接索引就能实现,不需要重头遍历)。 不利于扩展,一开始数组定义的空间不够时要重新定义数组。 会造成冗余。空间浪费。 链表的特点: 在内存中,不要求连

马丘 568

Aras Innovator系统配置-01对象类(一)

对象类配置-对象类属性说明

企业信息化(PLM,ERP.MES) 2032

链表及数组模拟链表

转载请注明出处,部分内容引自百度百科、谭浩强《C程序设计》、蜗牛君的奋斗史大神的博客 前置知识: CCC语言入门 数组党的福音(本蒟蒻学链表时不会指针,然而好像所有人都拿指针写) 首先,我们需要知道什么是链表 百度百科 看不懂勿喷(毕竟百度百科也不是用来让人看懂的) 我们可以从中得出链表的特性: 链表是一种物理存储单元上非连续、非顺序的存储结构 提取主...

qq_42713350的博客 859

汽车零部件产线实战:C#上位机+YOLO实现螺栓装配到位视觉检测

本项目基于C#上位机+YOLOv8实现汽车零部件产线螺栓装配到位视觉检测,全程贴合产线实际场景,从硬件选型、安装调试,到模型训练、上位机开发,再到项目联调、优化扩展,均提供手把手实操指导,代码可直接复制使用,规避了工业视觉产线检测的高频踩坑点。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1333

64.qt quick-qml使用高德地图插件实现V2版本(新增:位置搜索、路径规划、轨迹编辑等)

qt quick-qml高德地图插件(新增:位置搜索、路径规划、轨迹编辑等) Qt地图插件,使用简单方便,不用浏览器内核,运行高效迅速 跨平台支持,(Qt Windows(MinGW, MSVC)\Linux(桌面、嵌入式)\Android\IOS\等) 在线更新瓦片地图下载,并且支持缓存保存离线地图实现.........

抵抗时间扭曲,坚持做一件有意义的事 6131

链表及链表与数组的区别优缺点

链表的概念   链表是一种物理存储结构上非连续,非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。   链表的结构是多式多样的,当时通常用的也就是两种:    无头单向非循环列表:结构简单,一般不会单独用来存放数据。实际中更多是作为其他数据结构的子结构,比如说哈希桶等等。   带头双向循环链表:结构最复杂,一般单独存储数据。实际中经常使用的链表数据结构...

张小丑 6812

数学建模Matlab算法,第七章 对策论

对策论作为研究竞争与决策的数学理论,从零和对策到非常数和对策,为分析各类博弈问题提供了系统框架。其核心要素包括局中人、策略集和赢得函数,通过稳定解、Nash平衡点等概念揭示竞争规律。该理论广泛应用于经济、军事、政治等领域,不仅提供具体分析工具,更改变了决策思维方式,强调在互动中实现理性选择。对策论既揭示了竞争本质,也凸显合作价值,为解决社会矛盾、促进共赢发展提供了重要启示,在全球化背景下将发挥更大作用。

unber的博客 114

数组和链表的区别

数组和链表的区别以及各自的优缺点 1.数组和链表的区别: (1)数组的元素个数是固定的,而链表的结点个数可按需要增减。 (2)数组元素的存储单元在定义时分配,链表节点的存储单元在执行时动态向系统申请。 (3)数组的元素顺序关系由元素在数组中的位置(即下标)确定,链表中的节点关系由节点所包含的指针来体现。 (4)对于不是固定长度的列表,用可能最大长度的数组来描述,会浪费许多的存储空间。 (5)对于元素的插入、删除操作非常频繁的列表处理场合,用数组表示列表也不是不合适。若用链表实现,会使程序结构清晰,处理的方法

Sljya的博客 7147

深入解析ZYNQ PL触发PS中断:从原理到创新实践

通过本文,您不仅学会了ZYNQ PL-PS中断的基础实现,更掌握了动态优先级调整中断负载均衡等创新技术。响应延迟降低40%以上系统吞吐量提升2-3倍功耗降低30%支持更复杂的实时应用硬件是身体的骨骼,软件是流动的血液,而中断则是连接二者的神经系统。只有精确控制每一条神经冲动,才能构建真正智能的嵌入式系统。拓展思考如何将AI决策引入中断调度?能否实现跨芯片中断同步?量子计算对中断架构的挑战?

QQ_778132974的博客 417

YOLOv13涨点改进 | 全网独家创新、高效涨点改进篇 | CVPR 2024 | YOLOv13引入SHSA单头自注意力模块,减少冗余的多头注意力,轻量化改进,助力目标检测和图像分类任务高效涨点

本文提出了一种改进YOLOv13模型的新方法——SHSA(单头自注意力)模块,用于提升目标检测任务的计算效率和推理速度。SHSA通过简化多头注意力机制为单头结构,显著减少了计算冗余和内存占用。实验表明,该模块在保持精度的同时,在GPU、CPU和移动设备上分别实现了3.3倍、8.1倍和2.4倍的加速效果。文章详细介绍了SHSA的结构原理、核心代码实现方法,以及如何集成到YOLOv13的配置文件中。这种改进特别适合资源受限设备,为实时目标检测提供了更优的速度-精度平衡方案。

Ai缝合怪、助力小伙伴高效发论文 510

数组和链表的区别浅析

1.链表是什么 链表是一种上一个元素的引用指向下一个元素的存储结构,链表通过指针来连接元素与元素; 链表是线性表的一种,所谓的线性表包含顺序线性表和链表,顺序线性表是用数组实现的,在内存中有顺序排列,通过改变数组大小实现。而链表不是用顺序实现的,用指针实现,在内存中不连续。意思就是说,链表就是将一系列不连续的内存联系起来,将那种碎片内存进行合理的利用,解决空间的问题。 所以,链表允许插入和删除表上任意位置上的...

m0_46107486的博客 1360

第069篇:浸入边界法进阶

浸入边界法(Immersed Boundary Method, IBM)是处理流固耦合问题的强大数值方法。本文深入介绍直接力法、反馈力法、Ghost Cell方法和多域IBM等高级技术。通过Python实现完整的IBM求解器,展示处理移动边界、弹性边界和多体相互作用的方法。浸入边界法,直接力法,反馈力法,Ghost Cell,流固耦合,移动边界,弹性边界Navier-Stokes方程添加体积力项:∂u∂t+(u⋅∇)u=−1ρ∇p+ν∇2u+f\frac{\partial \mathbf{u}}{\part

2401_87715305的博客 414

静态链表(数组模拟链表)

1、单链表 #include <iostream> using namespace std; const int N = 100010; // head 表示头结点的下标 // e[i] 表示节点i的值 // ne[i] 表示节点i的next指针是多少 // idx 存储当前已经用到了哪个点 int head, e[N], ne[N], idx; // 初始化 void init() { head = -1; idx = 0; } // 将x插到头结点 void ad

qq_35860865的博客 239

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

数组模拟实现的单链表 → 邻接表

【知识点】 在算法竞赛中,对算法的时间复杂度要求都比较高。 而利用结构体struct实现的单链表比用数组模拟实现的单链表运行速度慢,因此算法竞赛选手多用数组模拟实现单链表。 现对单链表的数组模拟实现简述如下: 一、变量含义 head:头指针。初始化时指向空结点(值为-1),插入元素后指向头结点后的第一个元素。 idx:存储结点编号 e[idx]:存储结点idx的值 ne[idx]:存储结点idx的next指针 二、主要操作 1.单链表的初始化 void init() { //单链表初始化 h..

hnjzsyjyj的专栏 1279

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

第一题:数组模拟单链表(链式前向星)

数组模拟单链表,又称链式前向星,在图的存储方面有着很大的用处(邻接表存储法),打比赛过程中试用数组模拟链表可以有效的防止TLE

getinobacar的博客 760

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

静态链表(C++实现)——基于数据结构(沈俊版)(初学者食用)

静态链表(C++实现)——基于数据结构(沈俊版) 初学数据结构,不喜勿喷。欢迎大佬们指正! 静态链表是利用数组来模拟存储空间来实现链表的,如果为数组中每一个元素附加一个链接指针(数组下标),就形成静态链表结构。它允许不改变各元素的物理位置,只要重新链接就能改变这些元素的逻辑顺序。由于它是利用数组定义的,在整个运算过程中存储空间的大小不会发生改变,因此称为静态链表。 静态链表(C++)源代码 // ...

Nly1116的博客 441

【数据结构学习篇】--链表

单链表为空 就是空 (插入时判断:当前是否为空 是否有节点 )带头链表为空 默认有哨兵位节点。

2401_86475221的博客 718

数据结构与算法-栈

数据结构与算法-栈栈介绍应用场景用数组模拟栈思路分析代码实现用链表模拟栈思路分析代码实现 栈 介绍 栈是一个先入后出(FILO-First In Last Out)的有序列表。 栈(stack)是限制线性表中元素的插入和删除只能在线性表的同一端进行的一种特殊线性表。允许插入和删除的一端,为变化的一段,称为栈顶(top),另一端为固定的一端,称为栈底(bottom)。 最先放入栈中的元素在栈底,最后放入的元素在栈顶,而删除元素刚好相反,最后放入的元素最先删除,最先放入的元素最后删除。 入栈push 出栈

咏樟的博客 244

Java实现队列以及队列的相关面试题

目录 JAVA实现队列 队列的经典题目 1.JAVA实现队列 1.1.概念 队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出的特点:进行插入操作的一端称为队尾(Rear)出队列:进行删除操作的一端称为队头(Front) 因为Queue是一个接口,所以不能自己实例化,所以需要通过链表和数组两种方式来实现它,,, 链表实现(较简单): public class MyLinkedList { static class Node { .

xaiobit_hl的博客 1345

数据结构与算法 第二章:栈 -- 栈的介绍、实现方式(链表、数组)、应用场景、快速入门(使用数组模拟栈的使用、回文数)、栈实现计算器

栈的介绍、实现方式(链表、数组)、应用场景、快速入门(使用数组模拟栈的使用、回文数)、栈实现计算器

天行健 君子以自强不息,地势坤 君子以厚德载物。 668

【计算机原理交集】前端初识数据结构与算法---上篇(栈、队列、链表、集合、字典)

插入一个,后面的子项都要后移,相较于pop复杂度O1来说,是个On复杂度。细品一下,你就会发现第二种方法在一次操作之后剩下的栈内容需要改变下标,所以栈成员多的时候,第一种性能更好。冷知识:一个js文件的调用其实是一个大的匿名函数的调用,文件里面的代码就是匿名函数里面要执行的东西。)来人为的模拟,但是如果数据量大的话,用数组的方式去实现就比较耗费性能,因为。直接看上面的简单版就行了,下面的类实现太复杂了,会写了过时间久了就会忘。队列就和现实中的排队一样,后来的人排后面,第一个人先出,遵循。

庞囧的博客 294

初识 Vector List

一:vector 的使用 vector可以说是动态的arr,或者是可增容的顺序表 vectory的成员函数 vectory Iterators

Maniac_wp的博客 387

栈与队列深度解析:概念、实现与应用

/ 存储元素的数组// 栈中有效元素个数// 构造方法:初始化数组容量为3// 压栈操作// 检查容量,不足则扩容return e;// 出栈操作// 栈空则抛异常throw new RuntimeException("栈为空,无法执行出栈操作");size--;// 直接通过size减少实现“删除”(后续元素会覆盖)// 获取栈顶元素throw new RuntimeException("栈为空,无法获取栈顶元素");// 获取元素个数// 判断栈是否为空。

nice_lcj520的博客 434

第二章 数据结构(一)

队列中存储的数组下标而不是存储数据值,因为如果存储数据值,则无法进行判断到底是否溢出。存储下标的话,只需要套一层,就可以得到对应的数据值。先想一下暴力做法怎么做,观察其中没有用的元素,把其中没有用的元素删掉得到单调性。相等的最大长度是多少。思路:先想一下暴力做法是什么,再挖掘一些性质,使我们可以将目标集中在比较少的状态中,从而将问题的复杂度降低。为方便,下标为0为头部,下标为1为尾部,任意节点最终都插入至两者之间,因此不需要head指针。数字2在4的后面输入,2比4小并且在4的后面,因此4永远不会被输出。.

m0_49448331的博客 408

4.3.3 算法之美--约瑟夫环的问题

题目: n个人围成一个圈,每个人分别标注为1、2、...、n,要求从1号从1开始报数,报到k的人出圈,接着下一个人又从1开始报数,如此循环,直到只剩最后一个人时,该人即为胜利者。例如当n=10,k=4时,依次出列的人分别为4、8、2、7、3、10,9、1、6、5,则5号位置的人为胜利者。给定n个人,请你编程计算出最后胜利者标号数。(要求用单循环链表完成。) 第一行为人数n; 第二行为报数k ...

weixin_34144450的博客 94
上一篇: <<啊哈算法>>链表问题及malloc和free动态内存问题
下一篇: 参数方程求二阶导时候不能直接把y,x分别对t求二阶导然后再相除作为d²y/dx²的原因
chenmozero
博客等级 码龄5年 2粉丝 9原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值