news 2026/2/6 15:28:47

对于顺序表的学习

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
对于顺序表的学习

一.顺序表的概念

顺序表(Sequential List)是一种基于数组实现的线性数据结构,它可以用来存储一组有序的元素。顺序表是最常见的线性表之一,其特点是元素在内存中是连续存储的。顺序表中的每个元素都可以通过索引直接访问,因此它提供了高效的随机访问功能。

二.顺序表的结构

三.顺序表的实现

我们有两种方式来实现顺序表,但是最常用的肯定是动态申请的所以在这里只给出静态的形式不给出详细函数,我们来详细说一说动态的实现

1.静态(固定大小)

定义

typedefintSLDataType;#defineN1000//静态顺序表(开多了浪费,开少了不够用)structSeqList{SLDataType a[N];intsize;};

2.动态(按需申请)(详细讲)

定义

typedefintSLDataType;#defineINIT_CAPACITY4//动态顺序表 -- 按需申请typedefstructSeqList{SLDataType*a;intsize;//有效数据个数intcapacity;//空间容量}SL;

增删查改的各接口

voidSeqInit(SL*ps);voidSeqDestory(SL*ps);voidSeqPrint(SL*ps);voidSLCheckCapacity(SL*ps);voidSeqPushBack(SL*ps,SLDataType x);voidSeqPopBack(SL*ps);voidSeqPushFront(SL*ps,SLDataType x);voidSeqPopFront(SL*ps);voidSLInsert(SL*ps,intpos,SLDataType x);voidSLErase(SL*ps,intpos);intSLfind(SL*ps,SLDataType x);
2.1初始化

初始化给定一定的容量

voidSeqInit(SL*ps){//assert(ps);ps->a=(SLDataType*)malloc(sizeof(SLDataType)*INIT_CAPACITY);if(ps->a==NULL){perror("malloc fail");return;}ps->size=0;ps->capacity=INIT_CAPACITY;}
2.2销毁
voidSeqDestory(SL*ps){assert(ps);free(ps->a);ps->a==NULL;ps->capacity=ps->size=0;}
2.3打印
voidSeqPrint(SL*ps){assert(ps);for(inti=0;i<ps->size;i++){printf("%d\n",ps->a[i]);}}
2.4检查容量

当容量不够时将容量扩大为原来的2倍最合适,不会太大也不会太小

voidSLCheckCapacity(SL*ps){assert(ps);if(ps->size==ps->capacity){SLDataType*tmp=(SLDataType*)realloc(ps->a,sizeof(SLDataType)*ps->capacity*2);if(tmp==NULL){perror("realloc fail");return;}ps->a=tmp;ps->capacity*=2;}}
2.5尾插尾删
voidSeqPushBack(SL*ps,SLDataType x){assert(ps);// SLCheckCapacity(ps);// ps->a[ps->size++] = x;SLInsert(ps,ps->size,x);}voidSeqPopBack(SL*ps){assert(ps);//assert(ps->size > 0);if(ps->size==0){return;}ps->size--;}
2.6头插头删
voidSeqPushFront(SL*ps,SLDataType x){// assert(ps);// SLCheckCapacity(ps);// int end = ps->size - 1;// while(end >= 0)// {// ps->a[end+1] = ps->a[end];// --end;// }// ps->a[0] = x;// ps->size++;SLInsert(ps,0,x);}voidSeqPopFront(SL*ps){assert(ps);intbegin=1;while(begin<ps->a[begin]){ps->a[begin-1]=ps->a[begin];++begin;}ps->size--;}
2.7查找
intSLfind(SL*ps,SLDataType x){assert(ps);for(inti=0;i<ps->size;i++){if(ps->a[i]==x){return1;}}}
2.8任意位置插删

这里基于查找函数来实现

voidSLInsert(SL*ps,intpos,SLDataType x){assert(ps);assert(pos>=0&&pos<=ps->size);SLCheckCapacity(ps);intend=ps->size-1;while(end>=pos){ps->a[end+1]=ps->a[end];--end;}ps->a[pos]=x;ps->size++;}voidSLErase(SL*ps,intpos){assert(ps);assert(pos>=0&&pos<ps->size);intbegin=pos+1;while(begin<ps->size){ps->a[begin-1]=ps->a[begin];++begin;}ps->size--;}

四.总结比较

或许大家对于顺序表还有疑问,明明链表更加的好用但是为什么还要学习顺序表。
最后我来总结一下链表和顺序表的优缺点

顺序表的优缺点

  • 优点
    • 支持快速随机访问,时间复杂度 O(1)。
    • 结构简单,实现容易。
    • 内存使用较为高效,没有额外的指针开销。
  • 缺点
    • 插入和删除操作效率低,尤其是中间位置的插入和删除需要 O(n) 时间。
    • 扩展时需要 O(n) 的时间来重新分配和复制数组。
    • 需要预设容量,如果容量不足需要扩展,可能浪费空间。

链表的优缺点

  • 优点
    • 动态分配内存,能够有效利用内存空间。
    • 插入和删除操作非常高效,特别是在头部和中间位置,时间复杂度 O(1)。
    • 可以在任何位置进行插入和删除,操作灵活。
  • 缺点
    • 不支持快速的随机访问,需要 O(n) 时间逐个访问节点。
    • 每个节点除了存储数据外,还需要存储指针,因此内存开销较大。
    • 实现相对复杂,尤其是在指针管理方面容易出错。

8.适用场景

  • 顺序表适用场景
    • 当需要频繁进行随机访问时,顺序表是一个很好的选择。
    • 元素个数相对固定或不经常改变,或者修改主要发生在末尾时,顺序表的表现非常好。
    • 适合存储大量静态数据,如查找表、缓存等。
  • 链表适用场景
    • 当需要频繁插入和删除元素时,链表表现优异,特别是在需要在中间位置插入或删除时。
    • 元素的数量动态变化较大,不确定的场景下,链表更具优势。
    • 适用于实现栈、队列等需要频繁插入和删除的应用场景。

这篇文章之前忘记发了现在补上,并且添加了和链表的比较方便大家更好的理解二者之间的区别
有不足之处希望大家可以指出来,我们一起学习一起进步。

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

AI人脸隐私卫士处理速度优化:批处理与异步机制实战

AI人脸隐私卫士处理速度优化&#xff1a;批处理与异步机制实战 1. 引言&#xff1a;从单图处理到高并发场景的挑战 随着AI图像处理技术的普及&#xff0c;本地化、低延迟、高安全性的隐私保护工具正成为个人和企业用户的刚需。AI人脸隐私卫士基于Google MediaPipe Face Detec…

作者头像 李华
网站建设 2026/1/30 11:23:39

动态打码系统搭建:AI人脸隐私卫士部署实战教程

动态打码系统搭建&#xff1a;AI人脸隐私卫士部署实战教程 1. 学习目标与背景介绍 在数字化时代&#xff0c;图像和视频中的人脸信息极易成为隐私泄露的源头。无论是社交媒体分享、监控数据归档&#xff0c;还是企业内部资料流转&#xff0c;如何高效、安全地对人脸进行脱敏处…

作者头像 李华
网站建设 2026/2/1 11:08:14

动态隐私打码技术详解:AI人脸隐私卫士核心算法解析

动态隐私打码技术详解&#xff1a;AI人脸隐私卫士核心算法解析 1. 技术背景与隐私保护挑战 在社交媒体、公共影像系统和智能监控广泛应用的今天&#xff0c;个人面部信息已成为最敏感的生物识别数据之一。一张未经处理的合照可能无意中暴露多人的隐私&#xff0c;尤其在远距离…

作者头像 李华
网站建设 2026/2/6 15:14:43

跨境电商必备:用HY-MT1.5-1.8B快速搭建多语言翻译服务

跨境电商必备&#xff1a;用HY-MT1.5-1.8B快速搭建多语言翻译服务 1. 引言&#xff1a;跨境电商的语言挑战与技术破局 在全球化浪潮下&#xff0c;跨境电商已成为企业拓展国际市场的重要路径。然而&#xff0c;语言障碍始终是制约用户体验和转化率的关键瓶颈。传统商业翻译AP…

作者头像 李华
网站建设 2026/2/5 7:33:04

宠物骨骼检测拓展:从人体到动物的模型迁移实战

宠物骨骼检测拓展&#xff1a;从人体到动物的模型迁移实战 引言 想象一下&#xff0c;你家的智能宠物摄像头不仅能识别猫咪在睡觉还是吃饭&#xff0c;还能精确分析它跳跃时的骨骼动作——这正是宠物智能硬件公司正在探索的新功能。但直接使用现成的人体骨骼检测模型时&#…

作者头像 李华
网站建设 2026/2/6 3:48:19

如何导入元件库?LTspice Web在线电路仿真扩展教程

如何在 LTspice Web 中导入自定义元件&#xff1f;——从零开始的实战指南 你有没有遇到过这种情况&#xff1a;想用 LTspice Web 快速验证一个新电源 IC 的电路性能&#xff0c;结果打开元件库却发现根本找不到这个芯片&#xff1f;点遍了 F2 的搜索框也没见踪影。 别急。这…

作者头像 李华