news 2026/6/10 14:07:09

【C语言】数据结构——顺序表超详解!!!(包含顺序表的实现)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【C语言】数据结构——顺序表超详解!!!(包含顺序表的实现)

C语言数据结构——顺序表超详解!(含完整实现)

顺序表(Sequential List)是数据结构中最基础的线性结构之一,它使用数组来存储元素,实现逻辑上连续的存储。顺序表是数组的“升级版”,强调动态管理和操作。作为C语言入门数据结构的必学内容,它帮你理解内存分配、指针和基本算法。以下从基础到实现,一步步详解!

1. 顺序表概述

定义:顺序表是一种线性表,使用一组地址连续的存储单元(如数组)依次存储数据元素。元素的位置由索引(下标)决定,逻辑顺序与物理顺序一致。

核心特点

  • 存储方式:数组实现,固定或动态大小。
  • 随机访问:通过下标 O(1) 时间访问任意元素。
  • 逻辑结构:线性(每个元素有唯一前驱和后继,除首尾)。

与数组的区别

  • 数组是静态的,顺序表可以动态扩展(用 realloc 或自定义扩容)。
  • 顺序表封装了操作(如插入、删除),更像一个“类”。
2. 顺序表的优缺点对比表
方面优点缺点
访问O(1) 时间随机访问(高效)
插入/删除尾部操作 O(1)中间/头部需移动元素,O(n) 时间(低效)
空间连续存储,空间利用率高需预分配空间,浪费或溢出;扩容开销大
适用场景频繁访问、少修改(如查询系统)频繁插入/删除(如队列)不适合,用链表更好
3. 顺序表的基本操作

顺序表的核心操作包括初始化、插入、删除、查找、遍历等。时间复杂度分析如下:

操作时间复杂度说明
初始化O(1)分配数组并设置长度/容量
插入(指定位置)O(n)需后移元素(最坏 n 次移动)
删除(指定位置)O(n)需前移元素
查找(按值)O(n)线性扫描
访问(按索引)O(1)直接下标
扩容O(n)realloc 拷贝旧数据
遍历O(n)循环输出所有元素
4. C语言实现顺序表(完整代码)

在C语言中,我们用结构体封装顺序表:包含数组指针、当前长度(size)和容量(capacity)。支持动态扩容(初始容量10,每次扩容1.5倍)。

头文件(seqlist.h)

#ifndefSEQLIST_H#defineSEQLIST_H#include<stdio.h>#include<stdlib.h>// malloc, realloc, free// 定义数据类型(这里用 int,可换成其他)typedefintElemType;// 顺序表结构体typedefstruct{ElemType*data;// 动态数组intsize;// 当前元素个数intcapacity;// 当前容量}SeqList;// 函数声明voidinitSeqList(SeqList*list);// 初始化voiddestroySeqList(SeqList*list);// 销毁intisEmpty(SeqList*list);// 判断空intisFull(SeqList*list);// 判断满voidexpandCapacity(SeqList*list);// 扩容voidinsert(SeqList*list,intindex,ElemType val);// 插入voiddelete(SeqList*list,intindex);// 删除intfind(SeqList*list,ElemType val);// 查找(返回索引)voidprintSeqList(SeqList*list);// 打印#endif

源文件(seqlist.c)

#include"seqlist.h"// 初始化voidinitSeqList(SeqList*list){list->capacity=10;// 初始容量list->data=(ElemType*)malloc(list->capacity*sizeof(ElemType));if(list->data==NULL){printf("内存分配失败!\n");exit(1);}list->size=0;}// 销毁voiddestroySeqList(SeqList*list){free(list->data);list->data=NULL;list->size=0;list->capacity=0;}// 判断空intisEmpty(SeqList*list){returnlist->size==0;}// 判断满(实际用扩容避免满)intisFull(SeqList*list){returnlist->size==list->capacity;}// 扩容(1.5倍增长)voidexpandCapacity(SeqList*list){intnewCapacity=list->capacity+(list->capacity>>1);// 1.5倍ElemType*newData=(ElemType*)realloc(list->data,newCapacity*sizeof(ElemType));if(newData==NULL){printf("扩容失败!\n");exit(1);}list->data=newData;list->capacity=newCapacity;}// 插入(index 从0开始,合法范围[0, size])voidinsert(SeqList*list,intindex,ElemType val){if(index<0||index>list->size){printf("插入位置无效!\n");return;}if(isFull(list)){expandCapacity(list);}// 后移元素for(inti=list->size;i>index;i--){list->data[i]=list->data[i-1];}list->data[index]=val;list->size++;}// 删除(index 从0开始)voiddelete(SeqList*list,intindex){if(index<0||index>=list->size){printf("删除位置无效!\n");return;}// 前移元素for(inti=index;i<list->size-1;i++){list->data[i]=list->data[i+1];}list->size--;}// 查找(返回第一个匹配索引,-1表示未找到)intfind(SeqList*list,ElemType val){for(inti=0;i<list->size;i++){if(list->data[i]==val){returni;}}return-1;}// 打印voidprintSeqList(SeqList*list){if(isEmpty(list)){printf("顺序表为空!\n");return;}printf("顺序表元素:");for(inti=0;i<list->size;i++){printf("%d ",list->data[i]);}printf("\n");}

测试主函数(main.c)

#include"seqlist.h"intmain(){SeqList list;initSeqList(&list);// 插入测试insert(&list,0,10);// [10]insert(&list,1,20);// [10,20]insert(&list,0,5);// [5,10,20]printSeqList(&list);// 输出: 5 10 20// 查找intidx=find(&list,10);printf("10 的位置: %d\n",idx);// 1// 删除delete(&list,1);// [5,20]printSeqList(&list);// 输出: 5 20// 扩容测试(插入多个)for(inti=30;i<=100;i+=10){insert(&list,list.size,i);}printSeqList(&list);// 会自动扩容destroySeqList(&list);return0;}

编译运行:用 gcc 编译gcc main.c seqlist.c -o seqlist,运行./seqlist。注意内存管理,避免泄漏!

5. 深入分析与注意事项
  • 扩容策略:1.5倍增长常见(像 vector),避免频繁 realloc。
  • 边界检查:插入/删除时检查 index,防止越界。
  • 内存泄漏:总是配对 malloc/free,destroy 时释放。
  • 改进版:可加清空(clear)、尾插(push_back)、尾删(pop_back)等操作,模拟 std::vector。
  • 与链表比较:顺序表适合读多写少;链表适合写多读少。

掌握顺序表,你就打好了数据结构基础!接下来可以学链表、栈、队列。如果想看动态演示代码或调试技巧,继续问我~ 🚀

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/9 20:53:44

深度测评8个AI论文工具:本科生毕业论文全场景痛点破解

深度测评8个AI论文工具&#xff1a;本科生毕业论文全场景痛点破解 2026年AI论文工具测评&#xff1a;聚焦本科生论文写作全场景 随着人工智能技术在学术领域的广泛应用&#xff0c;越来越多的本科生开始借助AI论文工具提升写作效率与质量。然而&#xff0c;面对市场上琳琅满目的…

作者头像 李华
网站建设 2026/6/10 10:36:33

成本杀手:用Llama Factory在Spot实例上省下90%训练费用

成本杀手&#xff1a;用Llama Factory在Spot实例上省下90%训练费用 作为一名精打细算的初创公司CTO&#xff0c;我深知频繁实验不同模型架构对技术选型的重要性。但每次看到云服务商的GPU报价单&#xff0c;总让我倒吸一口凉气——直到我发现Llama Factory与Spot实例的组合方案…

作者头像 李华
网站建设 2026/6/10 10:36:02

Llama Factory+AutoDL:24小时不间断微调实战手册

Llama FactoryAutoDL&#xff1a;24小时不间断微调实战手册 为什么需要云端微调方案&#xff1f; 作为一名参加AI竞赛的大学生&#xff0c;我深刻理解在本地电脑上运行大模型微调任务的痛苦。显存不足、训练中断、散热问题……这些问题在长时间高负载运行时尤为突出。而Llama F…

作者头像 李华
网站建设 2026/6/9 18:07:15

使用Sambert-HifiGan前后对比:语音合成质量提升惊人

使用Sambert-HifiGan前后对比&#xff1a;语音合成质量提升惊人 引言&#xff1a;中文多情感语音合成的演进需求 在智能客服、有声阅读、虚拟主播等应用场景中&#xff0c;自然、富有情感的中文语音合成&#xff08;TTS&#xff09; 已成为用户体验的核心要素。传统TTS系统常面…

作者头像 李华
网站建设 2026/6/10 9:05:06

某教育平台如何用Sambert-HifiGan实现智能语音播报,效率提升200%

某教育平台如何用Sambert-HifiGan实现智能语音播报&#xff0c;效率提升200% 引言&#xff1a;从“人工配音”到“智能播报”的演进 在在线教育快速发展的今天&#xff0c;高质量、多情感的语音内容已成为提升学习体验的关键要素。传统的人工录音方式不仅成本高、周期长&#x…

作者头像 李华