静态线性链表
1 基本概念静态线性链表是一种使用数组或连续内存空间来模拟链表逻辑结构的数据结构。它通过数组下标索引来替代传统链表中的指针实现元素的线性连接。1.1 核心组成静态线性链表通常包含两个核心部分数据域data存储元素的实际值。游标cur 或 next存储下一个元素在数组中的下标索引。在链表的末尾或空闲位置游标通常用一个特殊值如 -1 或 0表示“空”。静态线性链表的第一个位置下标0不存储数据用来作为空间的头结点游标cur / next指向下一个结点当最后遍历到链表的游标指向0即为指向空到达链表的结尾。静态链表同时维护数据链表和备用链表节点在物理上固定逻辑上通过cur灵活组织插入删除本质是在两个链表间转移节点。1.2 基本操作静态线性链表支持与传统链表类似的基本操作但实现方式基于数组索引初始化将数组的每个位置节点的游标指向下一个空闲位置形成一个“空闲链表”。插入从空闲链表中分配一个节点修改相关节点的游标以建立新的链接关系。删除将节点从数据链表中移除并将其重新链入空闲链表。遍历从“头节点”下标开始顺着游标依次访问每个节点。2 与动态链表的相似点静态线性链表在逻辑行为上与动态链表指针实现的链表高度相似2.1 逻辑结构相同两者都是线性表元素之间通过“链接”关系指针或游标形成前后顺序物理存储位置可以不连续。2.2 操作接口一致插入、删除、查找、遍历等操作的逻辑步骤和算法复杂度如 O(1) 的头插、O(n) 的按值查找在概念上是相同的。2.3 无需预先确定长度与顺序表数组不同两者在逻辑上都可以动态地增加或删除元素而不必在创建时就固定最大容量尽管静态链表底层数组大小固定但逻辑上可用的节点数可以动态变化。3 与动态链表的区别尽管逻辑相似但静态线性链表在实现机制和特性上与动态链表有显著区别3.1 内存管理方式特性静态线性链表动态链表存储空间预先分配的固定大小数组运行时动态申请和释放的堆内存内存分配从“空闲链表”中分配节点通过malloc/new等实时分配内存释放节点放回“空闲链表”通过free/delete归还系统内存碎片无外部碎片数组连续可能产生外部碎片3.2 性能特点访问速度静态链表基于数组CPU 缓存友好连续访问可能更快动态链表节点分散缓存局部性较差。插入/删除开销两者逻辑开销相同但静态链表的节点分配/释放只是修改游标速度快且无系统调用动态链表涉及内存管理函数可能更慢。空间开销静态链表需要预先分配固定空间可能浪费或不足动态链表按需分配更灵活但每个节点可能有额外的内存开销如堆内存管理信息。3.3 适用场景静态线性链表适用场景嵌入式系统或内存受限环境避免动态内存分配的不确定性。需要频繁增删但总节点数有明确上限的场景。实现某些特定数据结构的基础如操作系统的文件分配表FAT、静态内存池管理。动态链表适用场景元素数量变化范围大无法预估上限。对内存使用效率要求高希望精确按需分配。支持复杂的内存管理策略如垃圾回收、内存池。4 代码实现以下是一个简单的静态线性链表实现演示初始化、插入和遍历基本结构#define MAXSIZE 8 typedef struct slinklist { int value; int cur; }component,SLinkList[MAXSIZE];基本操作#include iostream #include string #include stdio.h #include ctime void InitSpace_SL(SLinkList space) { //初始化静态备用链表 for (int i 0; i MAXSIZE - 1; i) { space[i].cur i 1; } // 设置0作为空指针结束标志 space[MAXSIZE - 1].cur 0; } int Malloc_SL(SLinkList space) { //若静态备用链表非空返回分配的节点下标否则返回0 int i space[0].cur; if(space[0].cur) space[0].cur space[i].cur; return i; } void Free_SL(SLinkList space, int k) { //将下标为k的空闲节点回收到备用链表中 space[k].cur space[0].cur; space[0].cur k; } void Insert_SL(SLinkList s, SLinkList space, int value,int loc) { //静态链表中插入数据 int index Malloc_SL(space); int i 0; int count 0; if (!index) { printf(空间已满位置%d无法插入%d\n,loc,value); return; } s[index].value value; while (s[i].cur countloc-1) { i s[i].cur; count; } if (count loc - 1) { printf(非法位置插入,超出长度\n); Free_SL(space, index); return; } s[index].cur s[i].cur; s[i].cur index; } int Delete_SL(SLinkList s, SLinkList space, int loc) { // 按位置删除数据 int del,i0,count 0; while (s[i].cur count loc - 1) { i s[i].cur; count; } if (count loc - 1) { printf(非法删除数据该位置超出链表长度\n); return -1; } del s[i].cur; s[i].cur s[del].cur; int re s[del].value; Free_SL(space,del); return re; } void Print_SL(SLinkList s) { // 打印内容 int i s[0].cur; while (i) { printf(%5d, s[i].value); i s[i].cur; } printf(\n); }代码测试int main() { SLinkList space; InitSpace_SL(space); SLinkList s; // 初始化数据链表 s[0].cur 0; s[0].value 0; int d; srand((unsigned int)time(0)); // 1 初始化插入前五位 for (int i 0; i 5; i) { d rand() % 100 1; Insert_SL(s, space, d, i 1); } printf(原始链表内容\n); Print_SL(s); printf(\n); // 2 继续插入测试空间满 printf(继续插入更多数据\n); Insert_SL(s, space, 50, 5); Insert_SL(s, space, 60, 5); Insert_SL(s, space, 70, 6); Insert_SL(s, space, 80, 7); printf(插入后链表内容\n); Print_SL(s); printf(\n); //第2个位置删除 int del Delete_SL(s, space, 2); if (del ! -1) { printf(第二个位置值%d删除现链表内容\n, del); Print_SL(s); } printf(\n); //第三个位置插入 Insert_SL(s, space, 60, 3); printf(第三个位置插入60现链表内容\n); Print_SL(s); printf(\n); return 0; }运行结果原始链表内容 55 59 26 14 25 继续插入更多数据 空间已满位置6无法插入70 空间已满位置7无法插入80 插入后链表内容 55 59 26 14 60 50 25 第二个位置值59删除现链表内容 55 26 14 60 50 25 第三个位置插入60现链表内容 55 26 60 14 60 50 255 总结刚开始我还搞不懂这个指向问题一直以为数组下标代表其在链表的位置于是我在数组和动态链表的思想中转变不过来后来才慢慢理解静态链表其实和动态链表相似区别是它的存储空间是连续的而它们在静态链表中的先后顺序和动态链表类似可以不连续。

相关新闻

Service Mesh 配置热更新:修改 VirtualService 后多久生效

Service Mesh 配置热更新:修改 VirtualService 后多久生效

Service Mesh 配置热更新:修改 VirtualService 后多久生效 一、你改了 Istio 的路由规则,等了 5 分钟发现还没生效 这是 Service Mesh 运维中最让人抓狂的场景:你在 VirtualService 里加了一条路由权重——destination: v2, weight: 100&am…

2026/10/12 17:01:18 阅读更多 →
Agent 级联失败防护:一个工具挂了不该拖垮整个会话

Agent 级联失败防护:一个工具挂了不该拖垮整个会话

Agent 级联失败防护:一个工具挂了不该拖垮整个会话 一、用户问天气,Agent 调天气 API 失败,然后整个会话就废了 Agent 的典型调用链路是:用户消息 → LLM 推理 → Function Calling → 执行工具 → 返回结果 → LLM 推理 → 下一个…

2026/10/13 18:56:04 阅读更多 →
容器资源限制底层机制:cgroup v2 与 CPU 内存的真实边界

容器资源限制底层机制:cgroup v2 与 CPU 内存的真实边界

容器资源限制底层机制:cgroup v2 与 CPU 内存的真实边界 一、你设了 memory limit 2Gi,Pod 还是在 1.8Gi 被 OOM 了 这是容器平台上最令人困惑的故障之一。你明确在 Pod Spec 里写了 resources.limits.memory: "2Gi",监控显示 Pod …

2026/10/11 21:39:01 阅读更多 →

最新新闻

卡尔曼滤波器从一维到EKF:机器人状态估计实战笔记

卡尔曼滤波器从一维到EKF:机器人状态估计实战笔记

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 18:56:01 阅读更多 →
POD-LSTM高维时间序列预测实战:降维+建模+可视化一站式指南

POD-LSTM高维时间序列预测实战:降维+建模+可视化一站式指南

简介:本资源是一份面向数据科学与工业智能领域工程师的POD-LSTM时间序列预测实战指南,聚焦高维多变量场景下的降维建模与可解释预测难题,适用于风电功率、设备状态监测、环境治理等实际业务场景。资源以1个146KB的docx文档形式交付&#xff0…

2026/10/13 18:56:01 阅读更多 →
LiteLLM:大模型多平台协议桥接与标准化调用实战指南

LiteLLM:大模型多平台协议桥接与标准化调用实战指南

1. 一个被严重低估的“协议翻译官”:LiteLLM到底在解决什么真问题?很多人第一次看到LiteLLM这个名字,下意识会以为它是又一个大模型训练框架、推理加速库,或者某种新型开源大模型。我最初也这么想——直到在某次跨平台AI服务集成中…

2026/10/13 18:56:01 阅读更多 →
华为AI DevSpace编译星闪WS63 SDK全攻略

华为AI DevSpace编译星闪WS63 SDK全攻略

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 18:56:01 阅读更多 →
Django+Vue小说推荐系统:从爬虫到可视化完整实现

Django+Vue小说推荐系统:从爬虫到可视化完整实现

看到标题里同时出现了“DjangoVue.js”“小说推荐系统”“小说可视化”“小说爬虫”“大数据毕业设计”这一串关键词,我基本能猜到你在选毕设题目时经历了什么——翻了一下午题目清单,要么是太简单拿不出手,要么是纯理论写到头秃,…

2026/10/13 18:56:01 阅读更多 →
静态时序分析实战:从时序弧到时钟约束的完整解读

静态时序分析实战:从时序弧到时钟约束的完整解读

说实话,静态时序分析这个系列写到第二篇,我想换个切入点。上一篇我们把STA是什么、为什么需要它、建立时间和保持时间的基本定义聊了一遍。但很多刚接触时序分析的同学,看完概念之后对着工具报出来的一屏时序报告,还是会有一种&qu…

2026/10/13 18:54:57 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →