【初阶数据结构】深入解析顺序表:探索底层逻辑

请添加图片描述

🔥引言

本篇将深入解析顺序表:探索底层逻辑,理解底层是如何实现并了解该接口实现的优缺点,以便于我们在编写程序灵活地使用该数据结构。

请添加图片描述
Alt

🌈个人主页:是店小二呀
🌈C语言笔记专栏:C语言笔记
🌈C++笔记专栏: C++笔记
🌈初阶数据结构笔记专栏: 初阶数据结构笔记

🌈喜欢的诗句:无人扶我青云志 我自踏雪至山巅
请添加图片描述

文章目录

  • 一、线性表的概念
  • 二、顺序表的概念
  • 三、顺序表的分类
  • 四、实现顺序表的相关接口(Seqlist.h)
  • 五、正式开始模拟实现顺序表
    • 5.1 顺序表的初始化
    • 5.2 顺序表的扩容(为插入数据提供保障)
    • 5.3 顺序表的插入数据
      • 5.3.1 顺序表的尾插
      • 5.3.2 顺序表的头插
    • 5.4 顺序表的删除数据
      • 5.4.1 顺序表的尾删
      • 5.4.2 顺序表的头删
    • 5.5 查找指定位置的下标
    • 5.5 顺序表的任意位置插入(pos是下标)
    • 5.6 顺序表的任意位置删除(pos是下标)
    • 5.7 顺序表的判空(主要是否存在有效元素)
    • 5.8 顺序表的打印
    • 5.9 顺序表的销毁
  • 六、顺序表的优缺点
  • 七、顺序表和链表的区别

一、线性表的概念

线性表(linear list)n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使 用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串等。线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的, 线性表在物理上存储时,通常以数组和链式结构的形式存储

二、顺序表的概念

顺序表属于线性表的其中一种。顺序表在逻辑、物理结构上是连续,顺序表底层逻辑实现一般是数组。关于物理结构上连续是指一段物理地址连续的存储单元依次存储数据元素的结构

三、顺序表的分类

顺序表分为两种:静态顺序表和动态顺序表,每一种都属于它自己的价值,在实际中。一般使用动态顺序表做的,比如我们经常用的通讯录(因为静态顺序表只适合事前知道需要多少内存的情况下,不然会出现申请多少内存问题)

在这里插入图片描述

四、实现顺序表的相关接口(Seqlist.h)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

五、正式开始模拟实现顺序表

提前说明下:每一个接口都需要断言下传过来的指针是否为空指针去判断是否是一个有效的结构体变量。如果是第一次接触数据结构,首先需要搞清楚size代表了有效元素个数,而capacity代表的是这块空间的大小或者容量,这里两个东西不是一个意思。

小技巧:在循环中如果不知道结束条件的话,带入临界值去尝试是否符合条件

5.1 顺序表的初始化

void SLInit(SL* phead)
{assert(phead);phead->a = NULL;phead->size = phead->capacity = 0;
}

这里需要注意的是:空间上没有硬性要求不开空间,可以适当开辟空间,当空间不足时,需向系统申请空间。

5.2 顺序表的扩容(为插入数据提供保障)

void SLChekckCapacity(SL* phead)
{assert(phead);if (phead->size == phead->capacity){int newcapacity =phead->capacity==0?4:phead->capacity * 2;SLDataType* pphead = (SLDataType*)realloc(phead->a, sizeof(SLDataType) * newcapacity);if (pphead == NULL){perror("realloc fail!!");return 1;}phead->a = pphead;phead->capacity = newcapacity;}
}

这里需要注意的是:当有效元素个数等于当前空间容量为了下一次的插入元素,需要进行扩容操作。由于扩容功能需要多次调用,对此可以考虑设计为一个接口SLChekckCapacity进行复用

在接口底层逻辑中,值得我们注意的是当capacity为空(零乘任何数为零),会导致申请空间大小出现错误。这里有两种解决措施:提前开辟一定量空间或者使用新的变量newcapacity进行接收,防止数据丢失。最好不要phead直接接收扩容的地址,防止扩容(第二种情况)失败导致找不到之前空间地址。开辟以字符类型来维修开辟的空间,需要为‘\0‘开辟一个空间。

5.3 顺序表的插入数据

插入分为三类:头插\尾插\任意位置插入(其中任意位置插入,在实现查找功能先放着)

5.3.1 顺序表的尾插

void SLPlusBack(SL*phead, SLDataType x)
{assert(phead);if(phead->size == phead->capacity)SLChekckCapacity(phead);phead->a[phead->size] = x;phead->size++;
}

这里需要注意的是:这里主要利用下标赋值完成插入的操作

5.3.2 顺序表的头插

void SLPlusFront(SL* phead, SLDataType x)
{assert(phead);if(phead->size == phead->capacity)SLChekckCapacity(phead);for (int i = phead->size; i >0; i--){phead->a[i] = phead->a[i - 1];}phead->a[0] = x;phead->size++;
}

这里需要注意的是:原数据整体向后移动,首次位置会数据重复,将首元素将其覆盖,实现头插的效果。

设置循环条件,数据向后移动(覆盖并数值不丢失)。如果是从前先后覆盖,比如1 2 3 4 5 变成 1 1 2 3 4 5,将i的值赋值给i+1i从首元素下标开始并且覆盖方式nums[i+1]=nums[i]

5.4 顺序表的删除数据

删除分为三类:头删 尾删 任意位置删除(其中任意位置删除,在实现查找功能先放着)

提前说明:空表无法进行删除数据,需要在删除操作之前进行断言检查assert(phead->a)

5.4.1 顺序表的尾删

void SLPopBack(SL* phead)
{assert(phead);assert(phead->a);phead->size--;
}

这里需要注意的是:这里删除不是将数据设为0就是删除数据。正确的做法,通过size(有效数据个数)个数控制。顺序表不访问size外的无效数据,那么从某种意义上是删除了数据(班里有位同学退学,班里人数少一位,同学还是存在,只是座位没有它),不需要空间是否浪费,尾插数据时,可能下次还是用到那个空间。

5.4.2 顺序表的头删

void SLPopFront(SL* phead)
{assert(phead);assert(phead->a);for (int i = 0; i < phead->size-1; i++){phead->a[i] = phead->a[i + 1];}phead->size--;
}

这里需要注意的是:数组删除数据的方式就是覆盖数据,那么只需要从后向前覆盖,首元素将被覆盖或者被删除

设置循环条件,数据向前移动(覆盖并数值不丢失)。如果是从后先前覆盖,比如1 2 3 4 5变成 2 3 4 5 5,将i+1的值赋值给ii从首元素下标开始并且覆盖方式nums[i]=nums[i+1]

5.5 查找指定位置的下标

int SLFind(SL* phead, SLDataType x)
{assert(phead);assert(phead->a);for (int i = 0; i < phead->size; i++){if (phead->a[i] == x)return i;}return -1;
}

这里需要注意的是:遍历顺序表,如果满足条件返回当前位置的下标,没有找到返回一个负数表示找不到。

5.5 顺序表的任意位置插入(pos是下标)

void SLInsert(SL* phead, int pos, SLDataType x)
{assert(phead);assert(0 <= pos && pos <= phead->size);SLChekckCapacity(phead);for (int i = phead->size; i>pos;i--){phead->a[i] = phead->a[i-1];//pos+1 pos-->注意覆盖的顺序,向后就是后面开始}phead->a[pos] = x;	phead->size++;
}

这里需要注意的是:任意位置上的修改(任意是相对的,需要对pos进行限制)。具体流程就是以下标pos为界,pos之后的数据向后移动(跟头插类似,主要是在循环条件略显差异)

5.6 顺序表的任意位置删除(pos是下标)

void SLErase(SL* phead, int pos)
{assert(phead);assert(pos >= 0 && pos < phead->size);for (int i = pos;i<phead->size-1;i++){phead->a[i] = phead->a[i + 1];}phead->size--;
}

这里需要注意的是:任意位置上的修改(任意是相对的,需要对pos进行限制)。具体流程就是以下标pos为界,pos之后的数据向前移动(跟头删是类似的,主要是在循环条件略显差异)

小总结:顺序表通过任意位置插入\删除去取代头尾的插入\删除操作,至于为什么需要了解头尾的插入\删除操作,虽然相当于基础,也是需要学习的(只有学会1+1,才能学会7+8)

5.7 顺序表的判空(主要是否存在有效元素)

bool SLEmpty(SL*phead)
{assert(phead);assert(phead->a);return phead->size==0;
}

5.8 顺序表的打印

void SLPrintData(SL*phead)
{assert(phead);for (int i = 0; i < phead->size; i++){printf("%d ", phead->a[i]);}printf("\n");
}

5.9 顺序表的销毁

void SLDestory(SL*phead)
{assert(phead);if (phead->a){free(phead->a);//free该前顺序表的动态开辟的空间phead->a = NULL;phead->size = phead->capacity = 0;}	
}

六、顺序表的优缺点

顺序表的优点:支持下标随机访问(时间复杂度O(1))

顺序表的缺点:

  • 在实现插入和删除操作过程中,通过大量的移动数据,效率较低
  • 空间不足需要扩容并且需要付出一定的代价,可能存在空间浪费
  • 只适合尾插尾删

七、顺序表和链表的区别

不同点顺序表链表
存储空间上物理上一定连续逻辑上连续,但物理上不一定 连续
随机访问支持O(1)不支持:O(N)
任意位置插入或者删除 元素可能需要搬移元素,效率低 O(N)只需修改指针指向
插入动态顺序表,空间不够时需要 扩容没有容量的概念
应用场景元素高效存储+频繁访问任意位置插入和删除频繁
缓存利用率

不管是哪一种数据结构都有他的优点和缺点,对此在使用数据结构中应该知道它的优缺点是什么,加以合理地利用解决实际中的问题。


请添加图片描述

以上就是本篇文章的所有内容,在此感谢大家的观看!这里是店小二初阶数据结构笔记,希望对你在学习初阶数据结构中有所帮助!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/346854.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

快递一键查询,只需快递单号,轻松掌握全程物流信息,让您的包裹追踪无忧!

在快节奏的现代生活中&#xff0c;快递已经成为我们生活中不可或缺的一部分。无论是网购的宝贝、亲朋好友寄来的礼物&#xff0c;还是工作中的紧急文件&#xff0c;快递都承载着我们的期待和需要。然而&#xff0c;面对众多的快递公司和复杂的查询流程&#xff0c;如何快速、准…

浅谈DALL-E2

目录 1.概述 2.诞生背景 3.作用 4.版本历史 5.模型和技术 6.应用场景 6.1.十个应用场景 6.2.游戏开发 7.接口 8.未来展望 9.总结 1.概述 DALL-E2 是由 OpenAI 开发的一个图像生成模型&#xff0c;可以根据文本描述生成高质量的图像。DALL-E2 是 DALL-E 的升级版&am…

jupyter notebook使用conda环境

pycharm中安装过可以使用的库在jupyter notebook中导入不进来 1 检查pycharm中安装的库的位置 2 检查jupyter notebook中安装的库的位置 3 查看jupyter notebook内核名字 可以看到jupyter notebook中内核名字叫ipykernel 4 安装ipykernel 在pycharm的terminal中 pip instal…

Polar Web【中等】反序列化

Polar Web【中等】反序列化 Contents Polar Web【中等】反序列化思路&探索EXPPHP生成PayloadGET传递参数 运行&总结 思路&探索 一个经典的反序列化问题&#xff0c;本文采用PHP代码辅助生成序列字符串的方式生成 Payload 来进行手动渗透。 打开站点&#xff0c;分析…

fastadmin/thinkPHP5.0的框架使用注意事项

0.主要链接 一张图解析表格 数据表规划一定要做好,省的做的时候很乱,一会要改一下,就特别麻烦 在线命令生成crud的时候一定不要填写自定义控制器名,要让他自己生成,否则后面你要修改东西还需要再找.默认的永远能知道在哪里 在线命令生成的时候,可以试着删除一下(不会成功),但…

Shell脚本01

一、shell脚本 脚本就是可运行的代码的集合&#xff0c;脚本语言&#xff08;计算机语言&#xff09;。 脚本的特点&#xff1a;从上到下&#xff0c;按行执行。 shell 脚本就是在shell环境&#xff08;bin/bash&#xff09;bash就是shell解释器&#xff0c;linux环境下的编…

重邮计算机网络803-(1)概述

目录 一.计算机网络向用户提供的最重要的功能 二.互联网概述 1.网络的网络 2.计算机网络的概念 3. 互联网发展的三个阶段 4.制订互联网的正式标准要经过以下的四个阶段 5.互联网的组成&#xff08;功能&#xff09; 6.互联网功能 7.互联网的组成&#xff08;物理&…

物联网TCP、UDP、CoAP、LwM2M、MQTT协议简单对比

一、前言 目前物联网行业有TCP、UDP、CoAP、LwM2M、MQTT、Modbus系列、JT808、HTTP、TLINK、ISAPI等协议&#xff0c;本文先对其中的几款协议进行介绍。具体关系见下图&#xff1a; 传输层协议&#xff1a;TCP、UDP&#xff1b;应用层协议&#xff1a;CoAP、LwM2M、MQTT、Modbu…

Go微服务: 关于消息队列的选择和分类以及使用场景

消息队列概述 在分布式系统和微服务架构中&#xff0c;消息队列&#xff08;Message Queue&#xff09;是一个核心组件&#xff0c;用于在不同的应用程序或服务之间异步传递消息在 Go 语言中&#xff0c;有多种实现消息队列的方式&#xff0c;包括使用开源的消息队列服务&…

OSI七层网络参考模型

一、物理层 我们要发送出去的数据在计算机里只不过是无数的0和1&#xff0c;0或1就叫做比特&#xff0c;物理层就是把这些比特用不同的媒介传输出去&#xff0c;可以用电、光或者其他形式的电磁波来表示和传输信号&#xff0c;数据从网络接口出去以后&#xff0c;会经过不同的网…

一文带你入门 - Qt绘图QPainter

QPaintEvent绘图事件: QPaintEvent 是 Qt 框架中一个重要的事件类&#xff0c;专门用于处理绘图事件。当 Qt 视图组件需要重绘自己的一部分时&#xff0c;就会产生 QPaintEvent 事件。这通常发生在以下几种情况&#xff1a; 1. 窗口第一次显示时&#xff1a;当窗口或控件第一次…

计算机组成原理(二)

ACC&#xff08;累加器&#xff09;&#xff1a; 用于存储高位部分 MQ&#xff08;乘数-商寄存器&#xff09;&#xff1a; 用于存储低位部分。在除法中保存商&#xff0c;在乘法中保存乘数&#xff0c;所以也叫乘商寄存器 左移 8 位&#xff08;相当于乘以 256&#xff09…

AI产品经理的转行之路,如何迈向年薪80w的职业高峰?

前言 在当今科技日新月异的时代&#xff0c;AI产品经理作为一个炙手可热的职业&#xff0c;吸引了众多向往高薪与前沿领域结合的求职者的目光。年薪80万的诱惑力无疑是巨大的&#xff0c;但不少自学中的朋友发现&#xff0c;即便涉猎广泛的产品知识&#xff0c;想要顺利转型成…

掌握Python的全方位教程,2024年最新版本,初学者必备指南

哈喽&#xff0c;大家好&#xff01;热烈欢迎你迈出成为python开发者的第一步。我想这一定非常激动人心&#xff0c;对吧&#xff1f;无论你是刚刚开始学习编程&#xff0c;还是曾经用过其他语言有一定的编程经验&#xff0c;本书中课程将帮助你加速实现你学习python的目标。作…

2024第十六届亚洲水技术展览会Aquatech China

Aquatech China 2024第十六届亚洲水技术展览会 专注水行业覆盖全领域—荷兰阿姆斯特丹水展中国展 2024.12.11-13 上海新国际博览中心 展会背景 Aquatech品牌创立于1968年。作为水处理行业历史悠久 的展览会&#xff0c;荷兰国际水处理展览会(Aquatech Amsterdam)至今已有近55…

物联网8大协议介绍及对比

一.物联网主流协议介绍 1.MQTT 协议 MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;即消息队列遥测传输。 MQTT 协议最初是在 1999 年由 IBM 公司开发的&#xff0c;用于将石油管道上的传感器与卫星相连接。2014 年正式成为 OASIS 开放标准。 MQTT 使用…

车圈内卷的真相:技术创新与长期主义的存亡之战

引言 随着中国汽车市场的不断发展&#xff0c;行业竞争也日趋激烈。近期&#xff0c;在2024年6月6日举行的中国汽车重庆论坛上&#xff0c;多位汽车界大佬就“内卷”问题展开了激烈讨论。本文将详细分析这些讨论内容&#xff0c;揭示汽车行业内卷的真实情况及其背后的深层次原…

怎么选海外仓操作管理系统才能满足amazon电商需求?考虑好这些,做好FBA并不难

对于跨境电商领域来说&#xff0c;amazon一定是绕不过去的一个平台。不过想做好这个平台的业务并不容易&#xff0c;一方面是现在竞争确实越来越大&#xff0c;另一个是现在电商平台对海外仓业务水平的要求也越来越高。 尤其是对一些中小型的海外仓来说&#xff0c;如何高效、…

Autoware 定位之EKF 滤波定位(四)

Tip: 如果你在进行深度学习、自动驾驶、模型推理、微调或AI绘画出图等任务&#xff0c;并且需要GPU资源&#xff0c;可以考虑使用UCloud云计算旗下的Compshare的GPU算力云平台。他们提供高性价比的4090 GPU&#xff0c;按时收费每卡2.6元&#xff0c;月卡只需要1.7元每小时&…

新火种AI|摊上事儿了!13名OpenAI与谷歌员工联合发声:AI失控可能导致人类灭绝...

作者&#xff1a;小岩 编辑&#xff1a;彩云 2024年&#xff0c;OpenAI的CEO Sam Altman就没有清闲过&#xff0c;他似乎一直走在解决麻烦的路上。最近&#xff0c;他的麻烦又来了。 当地时间6月4日&#xff0c;13位来自OpenAI和Google Deep Mind的现任及前任员工联合发布了…