news 2026/4/16 8:47:10

对于顺序表的学习

作者头像

张小明

前端开发工程师

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/4/10 9:10:51

工厂作业姿态监测:关键点检测安全生产应用实例

工厂作业姿态监测&#xff1a;关键点检测安全生产应用实例 1. 为什么工厂需要AI姿态监测&#xff1f; 在工业生产现场&#xff0c;工人不规范的操作姿势是引发安全事故的主要原因之一。传统监控摄像头只能被动记录画面&#xff0c;而AI关键点检测技术能实时分析人体姿态&…

作者头像 李华
网站建设 2026/4/14 18:12:02

保姆级骨骼检测教程:MacBook也能跑,云端GPU按秒计费

保姆级骨骼检测教程&#xff1a;MacBook也能跑&#xff0c;云端GPU按秒计费 引言&#xff1a;设计师的AI动作生成困境 作为一名创意设计师&#xff0c;当你想尝试用AI生成动态艺术效果时&#xff0c;是否经常遇到这样的困扰&#xff1a;网上找到的骨骼检测教程清一色要求Wind…

作者头像 李华
网站建设 2026/4/15 11:32:28

UDS协议入门实战:模拟会话控制操作指南

UDS协议实战精讲&#xff1a;从会话控制到安全解锁的完整路径你有没有遇到过这样的场景&#xff1f;在做ECU刷写测试时&#xff0c;明明发送了编程会话请求&#xff08;0x10 02&#xff09;&#xff0c;结果却收到NRC 0x22——“条件不满足”。翻遍手册也没找到到底哪里出了问题…

作者头像 李华
网站建设 2026/4/11 22:09:43

姿态检测模型部署秘籍:避开CUDA坑,云端5分钟跑通

姿态检测模型部署秘籍&#xff1a;避开CUDA坑&#xff0c;云端5分钟跑通 引言&#xff1a;为什么你需要这篇指南 如果你正在为OpenPose这类姿态检测模型的部署而头疼&#xff0c;特别是遇到CUDA版本冲突、PyTorch环境配置失败等问题&#xff0c;那么这篇文章就是为你准备的。…

作者头像 李华
网站建设 2026/4/11 20:37:25

多视角骨骼融合:4路摄像头+云端GPU同步处理方案

多视角骨骼融合&#xff1a;4路摄像头云端GPU同步处理方案 引言 在体育科研领域&#xff0c;精确分析运动员的三维动作对于提升训练效果和预防运动损伤至关重要。想象一下&#xff0c;当一位跳高运动员起跳时&#xff0c;我们需要从多个角度同时捕捉他的动作细节——这就像用…

作者头像 李华
网站建设 2026/4/9 2:05:54

新手入门:如何响应未知usb设备(设备描述)插入事件

如何在系统中“看见”那些未被识别的USB设备&#xff1f;你有没有遇到过这样的场景&#xff1a;把一个自制的开发板、一个老款U盘&#xff0c;或者一块嵌入式模块插到电脑上&#xff0c;系统却只弹出一句冰冷提示——“未知USB设备&#xff08;设备描述&#xff09;”&#xff…

作者头像 李华