链表(数组实现的伟大二踢脚)

一.链表与数组

 链表作为 C 语言中一种基础的数据结构,在平时写程序的时候用的并不多,但在操作系统里面使用的非常多。不管是RTOS还是Linux等使用非常广泛,所以必须要搞懂链表,链表分为单向链表和双向链表,单向链表很少用,使用最多的还是双向链表。单向链表懂了双向链表自然就会了(网上这样说,但我啃了链表三天哭死)。

定义:

      链表是一种物理存储上非连续,数据元素的逻辑顺序通过链表中的指针链接次序,实现的一种线性存储结构。

特点:

      链表由一系列节点(链表中每一个元素称为节点)组成,节点在运行时动态生成 (malloc),每个节点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个节点地址的指针。

 链表最大的作用是通过节点把离散的数据链接在一起,组成一个表(听起来像废话),这大概就是链表 的字面解释了吧。 链表常规的操作就是节点的插入和删除,为了顺利的插入,通常一条链 表我们会人为地规定一个根节点,这个根节点称为生产者。通常根节点还会有一个节点计 数器,用于统计整条链表的节点个数。 双向链表与单向链表的区别就是节点中有两个节点指针,分别指向前后两个节点,其 它完全一样。

下面找到一个数组与链表的对比:

上面我们看的实际上是针对正规链表也就是使用指针来实现的链表,而我们这次使用的二踢脚不对使用的是数组代替指针进行操作, 但本质上是相同的。

二.单向链表 

模板:

// head存储链表头,e[]存储节点的值,ne[]存储节点的next指针,idx表示当前用到了哪个节点
int head, e[N], ne[N], idx;// 初始化
void init()
{head = -1;idx = 0;
}// 在链表头插入一个数a
void insert(int a)
{e[idx] = a, ne[idx] = head, head = idx ++ ;
}// 将头结点删除,需要保证头结点存在
void remove()
{head = ne[head];
}

 例题:

 

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
map<int,int> e;
int main(){int n;cin>>n;while(n--){int a,b,c;cin>>a>>b;switch(a){case 1:cin>>c;e[c]=e[b];// 插入<y, y的指向>, y的指向为前一个数x的指向e[b]=c;// 更新x的指向,使其指向ybreak;case 2:cout<<e[b]<<endl;break;case 3:int cc=e[b];e[b]=e[cc];e.erase(cc);}}system("pause");return 0;
}

 三.双向链表

模版:

// e[]表示节点的值,l[]表示节点的左指针,r[]表示节点的右指针,idx表示当前用到了哪个节点
int e[N], l[N], r[N], idx;// 初始化
void init()
{//0是左端点,1是右端点r[0] = 1, l[1] = 0;idx = 2;
}// 在节点a的右边插入一个数x
void insert(int a, int x)
{e[idx] = x;l[idx] = a, r[idx] = r[a];l[r[a]] = idx, r[a] = idx ++ ;
}// 删除节点a
void remove(int a)
{l[r[a]] = l[a];r[l[a]] = r[a];
}

例题一:

 

 

 

 

 一定要注意模版中针对的是下标k进行插入,不是值,因此我们使用一个桶来存储插入值的下标。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=500010;
//r[N]储存该结点后一结点的下标
//l[N]储存该结前一结点的下标
//e[N]储存该点的值
//idx表示插入的次数(即下标)
int e[N];
int l[N];
int r[N];
map<int,int> mp;//存储值的下标
int idx;
void init(){//以下标为0的结点为头结点,以下标为1的结点为尾结点//初始化r[0]=1;l[1]=0;idx=2;//由于已经进行了两次插入头尾结点的操作,所以idx初始化为2(前面是0,1)
}
//将一结点插入到下标为k的结点的前或后位置处,进行4次指针的变换
//如果要将结点插入至下标为k的结点之前,将add内的实参赋值为(l[k],x)即可
void add(int k,int x){e[idx]=x;//将待插值x插入e[idx]mp[e[idx]]=idx;//将待插结点与前后两结点连接l[idx]=k;//将k赋值给插入结点的l[idx]r[idx]=r[k];//将下标为k的结点的r[k]赋值给插入结点的r[idx]//下面两步操作不能交换顺序l[r[k]]=idx;r[k]=idx;idx++;
}
//将下标为a的数删除,进行两次指针变换即可
void remove(int a){//将待删点的下一结点与待删点的前一结点相互连接l[r[a]]=l[a];r[l[a]]=r[a];
}
int main(){int n;cin>>n;init();for(int i=1;i<=n;i++){int x;cin>>x;add(l[1],x);}int t;cin>>t;while(t--){int a;cin>>a;int x;cin>>x;//int cnt=0;/*for(int i=r[0];i!=1;i=r[i]){if(e[i]==x){cnt=i;}}*///cout<<cnt<<" ";switch(a){case 1:int y;cin>>y;add(mp[x],y);break;case 2:remove(mp[x]);break;}}for(int i=r[0];i!=1;i=r[i]){cout<<e[i]<<" ";}system("pause");return 0;
}

例题二

实现一个单链表,链表初始为空,支持三种操作:

向链表头插入一个数;
删除第 k个插入的数后面的数;
在第 k 个插入的数后插入一个数。
现在要对该链表进行 M 次操作,进行完所有操作后,从头到尾输出整个链表。

注意:题目中第 k 个插入的数并不是指当前链表的第 k 个数。例如操作过程中一共插入了 n 个数,则按照插入的时间顺序,这 n 个数依次为:第 1 个插入的数,第 2个插入的数,…第 n 个插入的数。

输入格式

第一行包含整数 M,表示操作次数。

接下来 M 行,每行包含一个操作命令,操作命令可能为以下几种:

H x,表示向链表头插入一个数 x。
D k,表示删除第 k 个插入的数后面的数(当 k 为 00 时,表示删除头结点)。
I k x,表示在第 k 个插入的数后面插入一个数 x(此操作中 k均大于 00)。
输出格式

共一行,将整个链表从头到尾输出。

数据范围

1≤M≤100000
所有操作保证合法。

输入样例:

10
H 9
I 1 1
D 1
D 0
H 6
I 3 6
I 4 5
I 4 5
I 3 4
D 6

 输出样例:

6 4 6 5
#include <iostream>
using namespace std;
const int M = 1e5 + 10;
int e[M],l[M],r[M],idx;
int m;
void init(){r[0] = 1;l[1] = 0;idx = 2; // idx从2开始,所以删除第k个插入的数是remove(k+1) 
}void add(int k,int x){e[idx] = x;r[idx] = r[k];l[idx] = k;l[r[k]] = idx;r[k] = idx;idx ++;
}void remove(int k){r[l[k]] = r[k];l[r[k]] = l[k];
}
int main(){cin>>m;init();while(m--){string op;cin>>op;if(op == "R"){int x;cin>>x;add(l[1],x);}else if( op == "L"){int x;cin>>x;add(0,x);}else if( op == "D"){int k;cin>>k;remove(k+1); // idx从2开始,所以删除第k个插入的数是remove(k+1) }else if (op == "IL"){int k,x;cin>>k>>x;add(l[k+1],x);}else{int k,x;cin>>k>>x;add(k+1,x);}}for(int i=r[0];i!=1;i = r[i]) cout<<e[i]<<" ";}

 终于在我三天不懈之努力才弄出来这篇可以弄懂的数组方式实现的链表,虽然五一假期,但代码人永不退缩(真累啊我哭死)!!!

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

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

相关文章

c++大湾区模拟题4

一、单项选择题(共 15 题&#xff0c;每题 2 分&#xff0c;共计 30 分&#xff1b;每题有且仅有一个正确选项) 1. 以下哪些不是属于国家顶级域名的是&#xff08;&#xff09; A..au B..cn C.com D..jp 2. 一棵完全二叉树&#xff0c;共有 1234 个节点&#xff0c;其叶子…

2024年教你怎么将学浪视频保存到本地

你是否曾为无法将学浪视频保存到本地而烦恼&#xff1f;现在&#xff0c;我们将在2024年教给你如何解决这个问题&#xff01;只需简单几步操作&#xff0c;即可轻松将学浪视频保存到您的本地设备&#xff0c;随时随地想看就看&#xff01; 我已经将下载学浪的工具打包好了&…

与Apollo共创生态:探索自动驾驶的未来蓝图

目录 引言Apollo开放平台Apollo开放平台企业生态计划Apollo X 企业自动驾驶解决方案&#xff1a;加速企业场景应用落地Apollo开放平台携手伙伴共创生态生态共创会员权益 个人心得与展望技术的多元化应用数据驱动的智能化安全与可靠性的重视 结语 引言 就在2024年4月19日&#x…

解码Starknet Verifier:深入逆向工程之旅

1. 引言 Sandstorm为&#xff1a; 能提交独立proof给StarkWare的Ethereum Verifier&#xff0c;的首个开源的STARK prover。 开源代码见&#xff1a; https://github.com/andrewmilson/sandstorm&#xff08;Rust&#xff09; L2Beat 提供了以太坊上Starknet的合约架构图&…

一探究竟轻松畅玩:我独自升级崛起怎么玩 怎么快速上手的教程

一探究竟轻松畅玩&#xff1a;我独自升级崛起怎么玩 怎么快速上手的教程 最近一款漫改的MMORPG游戏《我独自升级&#xff1a;崛起》给玩家们带来了不少惊喜。在刚进入游戏时&#xff0c;玩家们需要从E级猎人开始玩起&#xff0c;逐步成长为S级猎人&#xff0c;通过升级学习新技…

ngrinder项目-本地调试遇到的坑

前提-maven mirrors配置 <mirrors><!--阿里公有仓库--><mirror><id>nexus-aliyun</id><mirrorOf>central</mirrorOf><name>Nexus aliyun</name><url>http://maven.aliyun.com/nexus/content/groups/public</ur…

在龙梦迷你电脑福珑2.0上试了三款操作系统

最近抽时间在龙梦迷你电脑上试了三款操作系统。 这几款操作系统以前都下载过。试用速度会快很多。 试用第一款&#xff1a;统信操作系统龙芯版。能正常安装。安装好了以后&#xff0c;下载了一个软件&#xff1a;龙芯游览器。修改该游览器的界面&#xff0c;不能实现所有页面…

C语言----贪吃蛇(补充)

各位看官好&#xff0c;我想大家应该已经看过鄙人的上一篇博客贪吃蛇了吧。鄙人在上一篇博客中只是着重的写了贪吃蛇的实现代码&#xff0c;但是前期的一些知识还没有具体的介绍&#xff0c;比如确认光标位置&#xff0c;句柄等。那么我这一篇博客就来补充上一篇博客所留下来的…

nacos2.3.x 修改登陆密钥

在使用nacos2.3.x的时候&#xff0c;启动之后&#xff0c;可以不用登陆&#xff0c;直接进入nacos的控制台&#xff0c;但是会提示去开启鉴权&#xff0c;开启的方式如下&#xff1a; 重启nacos之后&#xff0c;再次访问nacos时&#xff0c;就会跳到登陆页面&#xff0c;默认登…

JAVA面试专题-框架篇(Spring+Mybatis)

Spring Spring框架中的单例bean是线程安全的吗&#xff1f; bean上面可以加入注解Scope&#xff0c;如果是singleton&#xff08;默认&#xff09;&#xff0c;意味着bean在每个spring IOC容器中只有一个实例&#xff1b;如果是prototype&#xff0c;说明一个bean定义可以有多…

nginx--配置文件

组成 主配置文件&#xff1a;nginx.conf 子配置文件&#xff1a;include conf.d/*.conf 协议相关的配置文件&#xff1a;fastcgi uwsgi scgi等 mime.types&#xff1a;⽀持的mime类型&#xff0c;MIME(Multipurpose Internet Mail Extensions)多用途互联⽹网邮件扩展类型&…

NASA数据集——NASA 标准二级(L2)暗目标(DT)气溶胶产品每 6 分钟在全球范围内对陆地和海洋上空的气溶胶光学厚度(AOT)产品

VIIRS/NOAA20 Dark Target Aerosol 6-Min L2 Swath 6 km 简介 NOAA-20&#xff08;前身为联合极地卫星系统-1&#xff08;JPSS-1&#xff09;&#xff09;--可见红外成像辐射计套件&#xff08;VIIRS&#xff09;NASA 标准二级&#xff08;L2&#xff09;暗目标&#xff08;D…

NASA数据集——VIIRS每日 L3深蓝气溶胶网格产品(AERDB_D3_VIIRS_SNPP),以 1 x 1 度

VIIRS/SNPP Deep Blue Level 3 monthly aerosol data, 1 degree x1 degree grid 简介 美国国家航空航天局&#xff08;NASA&#xff09;的可见红外成像辐射计套件&#xff08;VIIRS&#xff09;标准三级&#xff08;L3&#xff09;每月深蓝气溶胶产品来自苏米国家极轨伙伴关系…

机器学习:基于Sklearn、XGBoost,使用逻辑回归、支持向量机和XGBClassifier预测股票价格

前言 系列专栏&#xff1a;机器学习&#xff1a;高级应用与实践【项目实战100】【2024】✨︎ 在本专栏中不仅包含一些适合初学者的最新机器学习项目&#xff0c;每个项目都处理一组不同的问题&#xff0c;包括监督和无监督学习、分类、回归和聚类&#xff0c;而且涉及创建深度学…

推开通用人工智能大门,多模态大模型是新一代人工智能技术范式

大家好&#xff0c;我是爱编程的喵喵。双985硕士毕业&#xff0c;现担任全栈工程师一职&#xff0c;热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。…

C——双向链表

一.链表的概念及结构 链表是一种物理存储单元上非连续、非顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的指针链接次序实现的。什么意思呢&#xff1f;意思就是链表在物理结构上不一定是连续的&#xff0c;但在逻辑结构上一定是连续的。链表是由一个一个的节点连…

【15】Head First Java 学习笔记

HeadFirst Java 本人有C语言基础&#xff0c;通过阅读Java廖雪峰网站&#xff0c;简单速成了java&#xff0c;但对其中一些入门概念有所疏漏&#xff0c;阅读本书以弥补。 第一章 Java入门 第二章 面向对象 第三章 变量 第四章 方法操作实例变量 第五章 程序实战 第六章 Java…

windows 驱动开发-DMA技术(三)

在早期&#xff0c;是按照基于包或者基于流的方式来描述DMA的&#xff0c;不过这个描述可能不准确&#xff0c;故在Vista之后修改为使用数据包/使用公共缓冲区的系统DMA。 简单的解释一下基于包和基于流的说法的原因&#xff0c;数据包是指一个个基于一定大小的数据块&#xf…

IDA pro动态调试so层初级教程

一、开启服务 adb push D:\MyApp\IDA_Pro_7.7\dbgsrv\android_server64 /data/local/tmpadb shell cd /data/local/tmp chmod 777 android_server64 ./android_server64二、IDA附加进程 十万个注意&#xff1a;IDA打开的so文件路径不能有中文 手机打开要调试的app 附加成功

讯飞星火大模型赋能教育,引领教育实现数字化转型 | 最新快讯

&#xff08;原标题&#xff1a;讯飞星火大模型赋能教育&#xff0c;引领教育实现数字化转型&#xff09; 随着人工智能的发展&#xff0c;大模型正成为人们获取知识、学习知识的“超级助手”&#xff0c;是解放生产力、释放想象力的“好帮手”。随着大模型在多个领域大放异彩…