静态链表C/C++

C/C++静态链表数据结构实现与应用详解 ✅推荐使用场景- 嵌入式系统(MCU、RTOS)- 实时控制系统(PLC、ECU、无人机)- 对内存安全要求高的场合- 频繁增删但总量可控的数据结构- 中断上下文中需要操作链表❌不适用场景- 数据量完全不可预测- 需要长期运行且不断增长的链表- 上层应用软件(服务器、桌面程序)一句话总结:当你担心malloc会搞砸一切时,就该考虑静态链表了。它不是为了替代动态链表,而是为那些“容不得半点闪失”的系统提供一种更稳健的选择。 阅读详情

什么是静态链表

与常见的数据结构的链表不同,想想常见的链表,每次新增数据都要重新开辟内存,这对有时间限制的算法程序来说每次插入新的数据就malloc是绝对会TLE的(除非从一开始就新开辟连续的堆空间当然这种情况下就不是动态链表了).
所谓静态链表,指的是:

静态链表是一种使用数组来实现链表的数据结构。它是在数组的基础上,通过将每个节点中的指针指向它在数组中的位置来表示链表中的连接关系。通常情况下,静态链表的数组大小需要事先确定,并且不能随意修改,因此其空间利用率较低,但在某些特定场景下,如内存受限或者需要频繁的插入和删除操作时,静态链表可以发挥比较好的优势。

特点

  • 链表的长度固定.
  • 每次插入和删除只改变指针位置.
  • 若是只对第K个插入的数做操作,时间复杂度可以达到O(1)
  • 它的实现在空间存储上可以是不连续的,但逻辑上的连续的,通过ne[x]得到下一个值.正因为它的这种不连续性,在插入数据时,x后继节点应该是qs[ne[x]]而不是qs[x+1].

对第K个数的插入模板

对第K个插入的数的增,删的时间复杂度为O(1)
来源于acwing
https://www.acwing.com/blog/content/404/

// 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];
}

静态链表实现对第K个位置的增删查改(数据结构书上的朴素要求)

思想

通过朴素的暴力做法找到第K-1个位置,然后更改ne[]数组的下标值.

给出不带头节点的代码(第一个节点的操作需要判断,其他节点操作相同)

const int N = 100010;
int qs[N], ne[N];
int idx, head; //idx 当前可用的点
void init() {
   idx = 0;
   head = -1;
}

void headInsert(int x) //头节点插入
{
   qs[idx] = x;
   ne[idx] = head;
   head = idx;
   idx++;
   
}

int findKnum(int k) //查找第K个位置的数
{
   int temp = head;
   k = k - 1;
   while (temp != -1 && k--)
   {
   	temp = ne[temp];

   }
   if (temp == -1)return -1;
   return qs[temp];
}


int addinKpoi(int k, int x) //在第K个位置新增元素
{
   int temp = head;
   k = k - 2;
   qs[idx] = x;
   while (temp != -1 && k--)
   {
   	temp = ne[temp];
   	if (temp == -1)return -1;

   }
   ne[idx] = ne[temp];
   ne[temp] = idx;
   idx++;
   return 0;


}

int delinKpoi(int  k) //在第K个位置删除元素
{
   int temp = head;
   k = k - 2;


   //找到第K-1个元素
   while (temp != -1 && k--)
   {
   	temp = ne[temp];
   	if (temp == -1)return -1;

   }
   ne[temp] = ne[ne[temp]];
   

}
void show()
{
   int t = head;
   while (t != -1)
   {
   	cout << qs[t] << " ";
   	t = ne[t];

   }
   cout << endl;
}
int main()
{


   init();
   int op = 0;
   do	 
   {
    

   	cin >> op;
   	switch (op)
   	{
   	case 1: {
   		int x;
   		 
   	 
   		cout << "头节点插入" << endl;
   		cin >> x;
   		headInsert(x);
   		break;


   	}
   	case 2:
   	{
   		int x;
   		 
   			cout << "查询第K的位置的元素" << endl;
   			cin >> x;
   		 int ret=	findKnum(x);
   		 if (ret != -1) cout << "第K个位置的数为:" << ret << endl;
   		break;


   	}
   	case 3:
   	{

   		int x, k;

   		cout << "在第K个位置新增元素" << endl;
   		cin >> k >> x;
   		if (k == 1) 
   		{
   			headInsert(x);
   			cout << "插入元素成功" << endl;
   		}
   		else {


   			int ret = addinKpoi(k, x);
   			if (ret != -1) cout << "插入元素成功" << endl;

   		}
   		 
   		break;

   	}
   	case 4:
   	{
   	 

   		cout << "删除第K个位置的元素" << endl;
   		int  k = 0;
   		cin >> k;
   		if (k == 1)
   		{
   			head = ne[head];
   			cout << "删除元素成功" << endl;
   		}
   		int ret =delinKpoi(k);
   		if (ret != -1)cout << "删除元素成功" << endl;

   	}
   		break;
   	case 7:
   	{

   		cout << "打印数据" << endl;
   		show();


   		break;
   	}

   	case 0:
   		cout << "退出程序" << endl;
   		break;
   	default:
   		cout << "重新输入" << endl;

   	}
   } while (op!=0);



}

给出带头结点的代码( 头指针->头节点 ->第一个节点->第二个节点.所有节点的操作都相同)



const int N = 100010;
int qs[N], ne[N];
int idx, head; //idx 当前可用的点 head头指针指向头节点
void init() {
	idx = 1;  //带一个空的头节点 可用节点从1开始
	head = 0;
	ne[head] = -1;
}

void headInsert(int x) //头节点后插入  头指针->头节点 ->第一个节点->第二个节点
{
	
	qs[idx] = x;
	ne[idx] = ne[head];
	ne[head] = idx;
	idx++;
	
}

int findKnum(int k) //查找第K个位置的数
{
	int temp = head;
	while (temp != -1 && k--)
	{
		temp = ne[temp];

	}
	if (temp == -1)return -1;
	return qs[temp];
}


int addinKpoi(int k, int x) //在第K个位置新增元素
{
	int temp = head;
	k = k - 1;
	qs[idx] = x;
	while (temp != -1 && k--)
	{
		temp = ne[temp];
		if (temp == -1)return -1;

	}
	ne[idx] = ne[temp];
	ne[temp] = idx;
	idx++;
	return 0;


}

int delinKpoi(int  k) //在第K个位置删除元素
{
	int temp = head;
	k = k - 1;
 

	//找到第K-1个元素
	while (temp != -1 && k--)
	{
		temp = ne[temp];
		if (temp == -1)return -1;

	}
	ne[temp] = ne[ne[temp]];
	

}
void show()
{
	int t = ne[head]; //越过第一个头节点
	while (t != -1)
	{
		cout << qs[t] << " ";
		t = ne[t];

	}
	cout << endl;
}
int main()
{
 

	init();
	int op = 0;
	do	 
	{
	 

		cin >> op;
		switch (op)
		{
		case 1: {
			int x;
			 
		 
			cout << "头节点插入" << endl;
			cin >> x;
			headInsert(x);
			break;


		}
		case 2:
		{
			int x;
			 
				cout << "查询第K的位置的元素" << endl;
				cin >> x;
			 int ret=	findKnum(x);
			 if (ret != -1) cout << "第K个位置的数为:" << ret << endl;
			break;


		}
		case 3:
		{

			int x, k;

			cout << "在第K个位置新增元素" << endl;
			cin >> k >> x;
		 
				int ret = addinKpoi(k, x);
				if (ret != -1) cout << "插入元素成功" << endl;

			 
			 
			break;

		}
		case 4:
		{
		 

			cout << "删除第K个位置的元素" << endl;
			int  k = 0;
			cin >> k;
			int ret =delinKpoi(k);
			if (ret != -1)cout << "删除元素成功" << endl;

		}
			break;
		case 7:
		{

			cout << "打印数据" << endl;
			show();


			break;
		}

		case 0:
			cout << "退出程序" << endl;
			break;
		default:
			cout << "重新输入" << endl;

		}
	} while (op!=0);

 

}



c++ 语言 实现静态链表 c++ 语言实现的静态链表数据结构,visualc++ 2008编译通过。 立即下载

相关推荐

C++实现静态链表

本文实例为大家分享了C++实现静态链表的具体代码,供大家参考,具体内容如下 一、动态链表和静态链表区别: (1)动态链表: (2)静态链表:       应用:二叉树 二、思路: 1.结点设置:T data;                      int link; 2.链表要用一个avil来保存可分配空间的首地址; 3.初始化:引入头结点:elem[0];                   头结点先指向空NULL, 用-1表示;                   avil存储空分配的空间的首地址1;                   然后让其它可分配空间的结点的link指向坐标

C++数据结构之静态链表

cout << "元素" << e << "插入的位置" << i << "不合理,合理的位置为1到" << m_length << "之间" << endl;cout << "获取元素的位置" << i << "不合理,合理的位置应该位于1到" << m_length << "之间" << endl;cout << "删除的位置" << iPos << "不合理,合理的位置是1到" << m_length << "之间" << endl;//保存第i-1个位子对应的m_data数组的下标。

dryter的博客 381

【电力电子控制】基于强化学习的单相逆变器并网电流控制

本文将尝试以 DQN(Deep Q-Network)为例,设计并训练一个面向单相逆变器的智能控制器,实现对并网电流的精准调节。

weixin_62596197的博客 463

静态链表(c++)

文章目录静态链表通用解题步骤一、链表的共享空间1、题目描述输入样例1输出样例1输入样例2输出样例22、思路3、注意4、代码实现二、Linked List sorting1、题目描述输入样例输出样例2、思路3、注意4、代码实现 静态链表 与动态链表不同的是,静态链表不需要指针来建立结点之间的连接关系。对于有些问题,结点的地址是比较小的整数(例如五位数的地址),就没有必要建立动态链表。 静态链表的实现原理是hash,即通过建立一个结构体数组,并令数组的下标直接表示结点的地址,直接访问结点中的元素就可以访问结点

Eyno的博客 2919

保姆级教程:用+86手机号成功注册Discord的三种亲测方法(附节点选择技巧)

本文提供了三种经过验证的方法,帮助用户使用+86手机号成功注册Discord,包括号码格式调整、网络环境优化和设备组合方案。同时详细解析了'手机号无效'报错的深层原因,并附上节点选择技巧,确保注册流程顺利。

weixin_42683394的博客 1903

【Arduino】入门篇——交通信号灯

模拟交通信号灯一、实验目的二、实验材料三、电路图四、实验过程五、代码块六、实验结果 一、实验目的 我想大家都看见过交通灯,就是马路上十字路口的红绿灯。如果您开过车,我想您一定仔细观察过交通灯,如果您还没有驾驶过车,您是否仔细观察过交通灯呢?交通灯包括三种个不同颜色的灯:红灯、黄灯和绿灯。 每个路口的红绿灯切换的时间并不是相同,这个是根据不同路口的车流情况来设定的,下面就是模仿交通灯的一个实验 二...

漠宸离若的博客 1万+

C++数据结构静态链表(含完整代码)

静态链表是利用一维数组代替指针 在内存中也需要分配一整块连续的内存空间 每个元素都由两个数据域组成 data存储节点中的数据,cur存储后继节点所属的数组元素 cur也称为游标,用来模拟指针。 下标为0 的数组元素可以看做是链表的头结点,其cur域的值用于只是链表第一个数据节点对应的数组下标。 静态链表的插入操作 1.找到一个空闲位置代表新插入的节点,在其中存入数据元素。 2.从头节点开始,找到待插入位置的前一个节点。 3.设置新插入节点的cur值以指向前一个节点所指向的节点,设置前一个节点所指向的节点的

qq_63184211的博客 541

RK3566/RK3568 Android 11添加系统服务

【代码】RK3566/RK3568 Android 11添加系统服务。

qq_23921815的博客 641

静态链表(初始化,插入,删除)C语言实现

动态链表就是用数组描述的链表(这种描述方法叫游标实现法),我们让数组的每个元素都由一个结构体组成,结构体有两个成员,data和cursor,而cursor就相当于链表的next指针,用来存放后继元素在数组中的下标。

weixin_74048545的博客 1101

【ROS2】手眼标定:moveit2_handeye_calib使用详解

moveit2_handeye_calib MoveIt2 官方的 手眼标定功能包,包含标定插件、图形化界面和示例程序。提供基于 ArUco/ChArUco 标定板的采集与求解功能。标定板下载aruco在线生成器。

郭老二 247

【OpenClaw企业级智能体实战】第24篇:一人公司实战——用Agent Teams同时管理产品、运营、销售(附16个Agent配置方案+全流程指令模板)

当AI智能体从“单一工具”进化为“协同团队”,“一人公司”已从商业概念变为落地现实。2025年中国超1200万个体创业者采用OPC模式,靠AI团队突破人力边界。本文基于OpenClaw Agent Teams框架,拆解“1总指挥+15执行者”的三层AI组织架构,提供覆盖产品、运营、销售全业务的16个Agent分工矩阵、可直接复制的部署代码、通信配置方案与全流程指令模板。通过虚拟案例验证:单人+AI团队可实现月入26万的商业闭环,AI承担90%标准化工作,人力成本降低75000元/月,ROI超3200%。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 942

C++静态表的创建

C++静态链表的创建

weixin_64340669的博客 1446

19 04-读取DTC快照信息

为了方便找到故障的原因,车厂一般会在诊断调查表中定义一些信息作为快照信息,例如故障发生时间、电压、行驶里程数、车速等。在对应故障发生时,ECU端要记录发生故障时的快照信息,客户端可以通过此服务检索客户端定义的DTCMaskRecord的捕获DTC Snapshot记录号以及DTCSnapshot记录数据。通过查找故障发生时刻的这些数据,来分析故障原因。

诊断协议那些事儿's blog 5138

C/C++静态链表的函数和调用

#include&amp;lt;bits/stdc++.h&amp;gt; using namespace std; #define MAXSIZE 1000 typedef struct { int data; int cur; }Node,staticlinklist[MAXSIZE]; int initlinklist(staticlinklist space); int malloc_sll(s...

qq_43689622的博客 338

用 SAP Fiori Launchpad Content Manager 做目录传输:把 Catalog 变更稳稳送到目标系统

摘要:SAP Fiori项目中,目录传输是确保应用一致交付的关键环节。开发团队常遇到目录在不同系统/客户端间不一致的问题,核心在于理解Launchpad内容管理的两种作用域:系统级(/UI2/FLPCM_CONF)使用workbench请求跨系统传输,客户端级(/UI2/FLPCM_CUST)通过customizing请求按SCC4设置传输。混淆作用域会导致目录分叉,如系统级目录被客户端本地修改后形成独立副本。官方推荐使用Content Manager而非过时的Launchpad Designer,并强调手

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 104

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

C/C++实现静态链表

静态链表一般是创建在栈上的,出了栈,就不能访问,所有一般不适用静态链表,动态链表使用的更多 //创建链表节点 struct LinkNode { int num;//数据域 struct LinkNode* next;//指针域 }; void test() { //创建节点 struct LinkNode node1 = {10,NULL}; struct LinkNode node2 = {20,NULL}; struct L...

catofblack的博客 752

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

C/C++数据结构——静态链表

静态链表本质是一个数组 一、初始化 数组中的每个元素,暂且称为节点 在静态链表无数据存放的时候,第一节点(下标为0的那个元素)和最后一个节点(即下标为maxsize-1的元素)除外,其他每个节点游标指向下一个节点。 (1)第一节点(下标0)的游标: 存放备用链表的第一个结点的下标。 (2)最后节点(下标maxsize-1)游标: 存放第一个有数据的元素的下标(相当于单链表中的头结点作用)。 所以初...

星星亮了bulingbuling~ 272

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

C/C++数据结构-简单的静态链表

Triplet.h #ifndef _TRIPLET_H_ #define _TRIPLET_H_ #include<string.h> #include<ctype.h> #include<malloc.h> /* malloc()等 */ #include<limits.h> /* INT_MAX等 */ #include<s...

SSSS的博客 227

C/C++面试可能会问一:静态链表与动态链表

C/C++面试可能会问一:静态链表与动态链表

xiaoyaolangwj的博客 319

静态链表 C++版

  笔记静态链表的实现 1 #include "stdafx.h" 2 #include<iostream> 3 4 using namespace std; 5 6 #define MAXSIZE 100 7 8 typedef int ElemType; 9 10 typedef struct { 11 ElemType ...

weixin_30651273的博客 157

静态链表

#include <iostream> #include <stdio.h> #include <stdlib.h> #define MAXSIZE 1000 //链表的最大长度 typedef float ElemType;//定义float的别名 typedef int Status;//定义int的别名 typedef struct{ ElemTy...

阳神 258

数据结构:静态链表(C语言描述)

这一篇文章我们总结一下静态链表。 主要内容:静态链表的创建、申请节点、回收节点、显示节点数据,用数组模拟链表和一些经典题目。(链表的查找、插入、删除、修改操作与动态链表基本一致,这里就不涉及了) 其实我认为静态链表在C/C++语言当中作用不是很大,因为C/C++可以直接对地址进行处理,动态分配内存可以很方便的实现某些功能。对于那些不能直接对地址进行处理的语言,例如:Java,静态链表就可以起到一定的作用,从而达到不动用地址也能实现动态链表的功能。 ①结构体及宏定义如何定义: 代码如下,静态链表也可以

一条咸鱼的博客 5886

静态链表的基本操作

0、宏定义以及静态链表结点结构体#include<stdio.h> #include<stdlib.h> #include<iostream> using namespace std; #define MAXSIZE 1000 #define OK 0 #define error 1 typedef int Status; typedef int ElemType;//静态链表结构体 typed

BruthYU的博客 1006

动态链表和静态链表的区别

静态链表是用数组实现的,是顺序的存储结构,在物理地址上是连续的,而且需要预先分配大小。动态链表是用申请内存函数(C是malloc,C++是new)动态申请内存的,所以在链表的长度上没有限制。动态链表因为是动态申请内存的,所以每个节点的物理地址不连续,要通过指针来顺序访问。*所有结点都是在程序中定义的,不是临时开辟的,也不能用完后释放,这种链表称为“静态链表”。*/ struct Student {

adlics_r的博客 2370

深信服C/C++技术一面二面20180924

技术一面:主要是一些关于数据结构和C/C++相关的内容 1)链表和数组的相同点和不同点; 2)了解静态链表吗?怎么用数组实现静态链表? 3)使用库函数strcpy应该注意的问题有哪些? 4)链表反转手撕代码? 5)判断含括号的表达式是否合法,手撕代码? 6)map的底层实现是什么?为什么要用红黑树,从插入删除考虑? 7)重载重写覆盖的区别是什么? 8)virtual关键字是为了实现...

xx18030637774的博客 3131

线性表之链表之循环链表(C++/C)

线性表之链表之循环链表(C++/C) 1.循环单链表 #include<stdio.h> #include <stdlib.h> #define ElemType int typedef struct LNode{ ElemType data; struct LNode *next; }LNode,*LinkList; //初始化一个循环单链表 bool InitList(LinkList &L){ L=(LNode*)malloc(.

JangKeo 231
上一篇: 基于动态规划的0-1背包问题学习
下一篇: 嵌入式软件和C/C++面经汇总
昊月光华
博客等级 码龄6年 340粉丝 158原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值