C语言:顺序表详解
C语言顺序表详解SeqList · 连续内存里的线性表 · 从结构定义到动态扩容一次讲透一、什么是顺序表线性表是n个相同类型元素的有序序列。顺序表是线性表最朴素的实现——用一段连续的内存依次存放元素。数组就是最简单的顺序表。但顺序表通常指带容量管理的动态数组能自动扩容、能插入删除。▶ 顺序表三要素连续内存、相同类型、逻辑顺序物理顺序。二、结构定义静态 vs 动态2.1 静态顺序表#define MAX_SIZE 100typedef struct {int data[MAX_SIZE]; //定长数组int size; //当前元素个数} SeqListStatic;缺点容量写死。存满了要么拒绝要么溢出——毫无弹性。2.2 动态顺序表推荐typedef struct {int* data; //指向堆上的连续内存int size; //当前元素个数int capacity; //容量最多能存多少个} SeqList;▶ 动态顺序表的核心思想容量不够就 realloc 扩容元素内存由 malloc 管着。三、初始化与销毁void seqlist_init(SeqList* sl, int init_cap) {sl-data (int*)malloc(init_cap * sizeof(int));sl-size 0;sl-capacity init_cap;}void seqlist_destroy(SeqList* sl) {free(sl-data);sl-data NULL;sl-size sl-capacity 0;}▶ 每次 malloc 都有对应的 free。初始化时分配销毁时归还成对出现。四、尾插与尾删最常用的操作void seqlist_push_back(SeqList* sl, int val) {if (sl-size sl-capacity) {seqlist_grow(sl); //扩容}sl-data[sl-size] val;}void seqlist_pop_back(SeqList* sl) {if (sl-size 0) sl-size--;}尾插的时间复杂度 O(1)均摊尾删 O(1)——这是顺序表最擅长的操作。五、动态扩容核心中的核心void seqlist_grow(SeqList* sl) {int new_cap sl-capacity 0 ? 4 : sl-capacity * 2;int* tmp (int*)realloc(sl-data, new_cap * sizeof(int));if (tmp NULL) {perror(realloc failed);exit(1);}sl-data tmp;sl-capacity new_cap;}扩容策略容量×2均摊后每次插入 O(1)最经典的策略固定N每次插入均摊 O(N)性能差realloc 返回值要用临时变量接失败时原指针不丢▶ 扩容量×2 的原因均摊分析。N次插入的总 realloc 成本 O(N)平均每次 O(1)。六、任意位置插入与删除6.1 指定位置插入pos ∈ [0, size]int seqlist_insert(SeqList* sl, int pos, int val) {if (pos 0 || pos sl-size) return 0;if (sl-size sl-capacity) seqlist_grow(sl);//从后往前搬移元素给pos腾位置for (int i sl-size; i pos; i--)sl-data[i] sl-data[i - 1];sl-data[pos] val;sl-size;return 1;}6.2 指定位置删除int seqlist_erase(SeqList* sl, int pos) {if (pos 0 || pos sl-size) return 0;//从前往后搬移覆盖被删位置for (int i pos; i sl-size - 1; i)sl-data[i] sl-data[i 1];sl-size--;return 1;}▶ 插入/删除的平均时间复杂度 O(N)——这是顺序表最贵的操作。频繁中间插入请考虑链表。七、查找与修改int seqlist_find(SeqList* sl, int val) {for (int i 0; i sl-size; i)if (sl-data[i] val) return i;return -1;}//按下标访问O(1)随机访问顺序表的杀手锏int seqlist_at(SeqList* sl, int idx, int* out) {if (idx 0 || idx sl-size) return 0;*out sl-data[idx];return 1;}▶ 按下标访问 O(1) 是顺序表相对链表的绝对优势——数据在内存里连续存放地址直接可算data[i] data i*sizeof(int)。八、顺序表 vs 链表┌──────────┬───────────────┬───────────────┐│ │ 顺序表 │ 链表 │├──────────┼───────────────┼───────────────┤│ 随机访问 │ O(1) ★ │ O(n) ││ 尾插尾删 │ O(1) ★ │ O(1) ││ 中间插入 │ O(n) │ O(1) ★ ││ 缓存友好 │ ★ 好 │ 差 ││ 空间 │ 连续可能浪费│ 分散有指针开销││ 扩容 │ realloc │ 无需动态节点│└──────────┴───────────────┴───────────────┘▶ 结论频繁按下标访问 → 顺序表频繁中间插入删除 → 链表。工程里两者结合才是常态。九、八条常见错误① 忘了检查 pos 越界——插入/删除前不验证下标静默写坏内存② size 和 capacity 混淆——size是元素个数capacity是容量③ 扩容后忘了更新 capacity——下次插入直接溢出④ realloc 返回值直接赋给原指针——失败时空指针丢失原数据⑤ 插入从前往后搬移——应该从后往前否则覆盖还没搬的元素⑥ 删除从后往前搬移——应该从前往后⑦ 销毁后不置 NULL——野指针⑧ 结构体按值传参——复制整个结构修改无效要传指针十、总结▶ 顺序表 连续内存 容量管理。数组是它的静态形态动态数组是它的完全体。▶ 三个状态量size有多少、capacity能存多少、data存在哪。▶ 扩容×2 realloc 临时变量接收是顺序表的两条铁律。▶ 随机访问 O(1) 是它的王牌中间插入 O(n) 是它的软肋。▶ 凡是按下标存取、尾部增删的场合顺序表永远是最优解。The first rule of Fight Club is: you do not talk about Fight Club.—— Tyler Durden, Fight Club—— 顺序表的第一条规则是下标永远从0开始。第二条规则永远不要越界。— END —

相关新闻

Chrome插件自动化测试:单元测试、集成测试

Chrome插件自动化测试:单元测试、集成测试

前言 Chrome 插件(Extension)由 background service worker、content script、popup 等多部分组成,逻辑分散且依赖浏览器运行时,很多团队只靠"手动点一遍"来验证功能,结果一发布就出线上问题。本文以一款单…

2026/8/1 7:44:03 阅读更多 →
嵌入式开发实战:构建高效RGB565颜色对照表(LUT)的原理与实现

嵌入式开发实战:构建高效RGB565颜色对照表(LUT)的原理与实现

1. 项目概述:为什么你需要一个“颜色对照表”? 如果你曾经在嵌入式开发、单片机编程或者任何涉及低级别图形显示的领域工作过,你大概率遇到过这样的场景:产品经理或者UI设计师递给你一张精美的效果图,上面标注着“按钮…

2026/8/1 7:44:03 阅读更多 →
Android singleTask启动模式深度解析:从原理到实战避坑指南

Android singleTask启动模式深度解析:从原理到实战避坑指南

1. 项目概述:为什么我们需要深入理解singleTask在Android开发中,Activity的启动模式是一个老生常谈却又常谈常新的基础话题。尤其是singleTask模式,它不像standard或singleTop那样直观,其行为与Task(任务栈&#xff09…

2026/8/2 10:11:45 阅读更多 →

最新新闻

5大痛点解决指南:BetterGI如何用AI视觉技术重构你的原神体验

5大痛点解决指南:BetterGI如何用AI视觉技术重构你的原神体验

5大痛点解决指南:BetterGI如何用AI视觉技术重构你的原神体验 【免费下载链接】better-genshin-impact 📦BetterGI 更好的原神 - 自动拾取 | 自动剧情 | 全自动钓鱼(AI) | 全自动七圣召唤 | 自动伐木 | 自动刷本 | 自动采集/挖矿/锄地 | 一条龙 | 全连音…

2026/8/2 10:11:28 阅读更多 →
STM32驱动Grove心率传感器:I2C通信、滤波算法与低功耗设计实战

STM32驱动Grove心率传感器:I2C通信、滤波算法与低功耗设计实战

1. 项目概述:从“Grove - 指夹式心率传感器”说起最近在捣鼓一个健康监测的小项目,核心是需要一个稳定、易用的心率检测模块。市面上心率传感器不少,但要么接线复杂,要么算法需要自己从头写,对快速原型开发不太友好。直…

2026/8/2 10:11:28 阅读更多 →
MPR121电容触摸传感器:从I2C通信到智能调光台灯实战

MPR121电容触摸传感器:从I2C通信到智能调光台灯实战

1. 项目概述:从“触摸”到“感知”的桥梁 在嵌入式开发和物联网项目中,我们常常需要一种直观、可靠且易于集成的人机交互方式。传统的机械按键虽然经典,但存在物理磨损、寿命有限、防水防尘性能差等问题。当我在一个智能家居控制面板的项目中…

2026/8/2 10:11:28 阅读更多 →
终极本地Cookie导出指南:3分钟掌握浏览器Cookie安全管理

终极本地Cookie导出指南:3分钟掌握浏览器Cookie安全管理

终极本地Cookie导出指南:3分钟掌握浏览器Cookie安全管理 【免费下载链接】Get-cookies.txt-LOCALLY Get cookies.txt, NEVER send information outside. 项目地址: https://gitcode.com/gh_mirrors/ge/Get-cookies.txt-LOCALLY 本地Cookie导出和浏览器扩展安…

2026/8/2 10:11:28 阅读更多 →
125、YOLOv8改进实战:小目标检测痛点分析——TAL标签分配优化与超分辨率辅助检测方案

125、YOLOv8改进实战:小目标检测痛点分析——TAL标签分配优化与超分辨率辅助检测方案

125、YOLOv8改进实战:小目标检测痛点分析——TAL标签分配优化与超分辨率辅助检测方案 从一次真实调试说起 上个月帮一个遥感团队调YOLOv8,他们检测机场跑道上的小飞机,模型跑出来的结果让我血压直接拉满——大飞机框得漂漂亮亮,小飞机要么漏检,要么框偏到隔壁跑道上去。…

2026/8/2 10:10:28 阅读更多 →
GPT-5.4持久化状态与200万上下文窗口:AI从工具到协作者的范式革命

GPT-5.4持久化状态与200万上下文窗口:AI从工具到协作者的范式革命

1. 项目概述:当“持久化状态”成为AI的标配最近圈子里关于GPT-5.4的传闻沸沸扬扬,核心就两点:200万级别的上下文窗口,以及一个听起来更“科幻”的特性——持久化状态。作为一名长期跟大模型打交道的从业者,我第一反应不…

2026/8/2 10:10:28 阅读更多 →

日新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/2 0:00:38 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/2 0:00:38 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/2 0:00:38 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/2 0:00:38 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/2 0:00:38 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/2 0:00:38 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/2 6:34:16 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/2 2:47:48 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/2 0:23:22 阅读更多 →