【初阶数据与算法】线性表之顺序表的定义与实现

【初阶数据与算法】线性表之顺序表的定义与实现
在这里插入图片描述

文章目录

一、线性表的概念

线性表(linearlist)是n个具有相同特性的数据元素的有限序列,线性表在物理结构上并不⼀定是连续的,在逻辑结构上是连续的
物理结构就是在存储数据时真实的内存存储位置,物理结构上连续就是说在存储数据时,使用的是一段连续的内存空间存储数据,例如数组,它开辟出来的内存空间就是连续不断的,我们在数组的章节也做了介绍,数组就属于物理结构连续的一种结构
而逻辑结构独立于物理结构,它关注的是数据元素之间的关系,逻辑结构连续就是,它虽然在物理结构上可能不是采用连续存储数据的方式,但是我们可以通过某种方式使得这些数据连续起来,使得在访问数据时可以将物理结构上分散的数据连续起来,这就是逻辑结构连续
我们今天介绍的线性表在逻辑上是线性结构,但是它在物理结构上并不⼀定是连续的,也就是在访问数据时,我们一定可以按照顺序进行访问,但是在存储数据时,我们既可以采用连续的内存空间存储数据,也可以采用不连续的内存空间存储数据,只要我们采用某种方式使得线性表的数据可以连续的访问即可
当线性表的物理结构是连续的时候,一般使用数组来存储数据,当线性表的物理结构不是连续的时候,一般以链式的结构存储,线性表是⼀种在实际中⼴泛使⽤的数据结构,常⻅的线性表:顺序表、链表、栈、队列、字符串等等,我们今天介绍的就是线性表之一的顺序表

二、顺序表

1.概念与结构

概念:顺序表是⽤⼀段物理地址连续的存储单元依次存储数据元素的线性结构,⼀般情况下采⽤数组存储,如图:

在这里插入图片描述


那么肯定就会有人有疑问了,顺序表既然底层使用了数组,为什么不直接使用数组,而要取一个顺序表的名字,那么它们真实的区别是什么呢?其实很简单,数组只是数组而已,一种可以连续存储数据的结构
但是我们在上一篇文章讲过,数据结构不仅要能够存储数据,还要能够合理的管理数据,我们的顺序表虽然底层是数组,但是在数组的基础上提供了增删查改等多种方法让我们可以去合理的管理数据
所以严格地说,单独的数组不算一种数据结构,而拥有增删查改等等功能的数组,也就是顺序表,才是一种数据结构,那么顺序表到底长什么样子呢?它其实是一个结构体,不同的顺序表定义的结构体不同,所以我们先来学习顺序表的分类

2.顺序表的分类

顺序表又可以分为静态顺序表和动态顺序表,我们接下来就来学习一下这两种不同顺序表的概念,以及我们平常使用的到底是哪种顺序表

静态顺序表

静态顺序表的静态是指顺序表底层的数组的元素大小是静态的,也就是静态顺序表使⽤的是定⻓的数组存储元素,而顺序表实际上就是使用一个结构体来进行维护,一般静态顺序表的结构如下:

typedefint SLDateType;#defineN7structSeqList{  SLDateType arr[N];int size;};

在上面我们提到了,顺序表其实是由一个结构体进行维护的,不同种类的顺序表的结构体不同,在静态顺序表中,底层数组的元素大小是确定了的,一般使用#define来定义一个常量来充当它的大小
而由于我们并不知道顺序表中会存储什么数据类型,所以我们可以使用typedef关键字对类型进行重命名,以后我们想要修改顺序表的数据类型时,就可以只修改typedef这一条语句,否则的话每次修改数据类型将会十分麻烦
我们也可以看到,这里结构体的名字就是SeqList,它里面包含了两个单词,Seq代表英文单词sequential,意思是顺序的,List就是表的意思,合起来就是我们的顺序表
在静态顺序表中的结构有两个成员,应该就是底层存储数据的数组,它的大小是确定的,第二个成员是整型变量size,它的含义是目前顺序表中有效元素的个数
静态顺序表的缺点也很明显,就是它的大小是固定的,空间给大了可能造成浪费,如果空间给小了可能不够用,就会十分纠结

动态顺序表

在上面静态顺序表的静态是指它的大小是固定的,同理,动态顺序表里面的动态就是指顺序表的大小是不固定的,也就是顺序表底层的数组的大小是不固定的,可以动态的变化,比如开始时给出4个元素的大小,不够时顺序表可以实现自动增容
接下来我们来看看动态顺序表的结构的定义:

//动态顺序表typedefint SLDateType;structSeqList{  SLDateType* arr;int size;int capacity;};

在动态顺序表中,数组通过动态内存开辟来申请空间,如果不够用就再次申请,所以第一个成员是指向这个数组开头的指针,第二个成员就是当前顺序表中的有效元素的个数,而第三个成员则是当前顺序表的总容量
如果总容量和有效元素个数相等,说明开辟的数组的空间满了,需要增容,所以这两个成员也是必不可少的
在动态顺序表中,我们的空间浪费可以显著减少,至少不会担心给出的空间大小不够,因为它可以自动增容,比起静态顺序表要灵活得多,所以我们一般情况下都会使用动态顺序表,平常说的顺序表如果没有明确说明是静态的,那么都是在说我们的动态顺序表
所以接下来我们顺序表的实现也是使用的动态顺序表

三、顺序表的实现

1.顺序表的结构

在上面我们也讲过,一般提起的顺序表默认都是动态顺序表,所以我们这里顺序表的结构就是动态顺序表的结构,这个顺序表是一个结构体,它有三个成员,分别是底层存放数据的数组,然后就是当前有效元素个数,以及整个顺序表当前的容量,如下:

typedefint SLDateType;typedefstructSeqList{  SLDateType* arr;int size;int capacity;}SL;

其中,数组是一个指针,因为我们的空间需要动态开辟,这个指针就指向了我们开辟的空间,可以把它当作正常使用,在动态内存管理部分我们也讲过使用malloc来模拟实现数组的使用,链接:【C语言】动态内存管理及相关笔试题
我们对数组的数据类型作了优化,以后需要用到哪种数据我们就可以只修改typedef后面的int,方便我们使用,其次就是我们给顺序表也取了一个别名,叫SL,这样可以避免我们每次要使用顺序表时还要带上struct关键字,这就是一个顺序表的完整结构,接着我们就来实现顺序表的各种功能

2.顺序表的初始化和销毁

初始化函数

我们创建一个顺序表之后需要对它进行初始化才能使用,初始化的方法也很简单,就是将我们顺序表的第一个成员置为NULL,然后把有效元素个数和总容量都置为0
由于我们初始化顺序表时要修改里面的成员,所以我们在传参时需要传地址,那么我们的顺序表初始化函数的参数类型就是SL*,如下:

voidSLInit(SL* ps){ assert(ps); ps->arr =NULL; ps->capacity = ps->size =

Read more

java场景面试汇总_java场景题面试,零基础入门到精通,收藏这篇就够了

一、并发与多线程场景题 1. 场景:一个高并发的电商系统,在秒杀活动中,如何防止超卖? 答案: 超卖问题是由于多个线程同时读取库存,然后进行扣减导致的。解决方案可以从几个层面考虑: 1. 数据库层面: * 使用乐观锁:在库存表中增加版本号字段,更新时检查版本号。 * 使用悲观锁:SELECT ... FOR UPDATE,但会降低并发性能。 * 使用数据库的唯一索引:通过订单唯一键防止重复提交。 2. 应用层面: * 使用分布式锁,如Redis或ZooKeeper,在扣减库存前先获取锁。 * 使用队列,将请求串行化,比如用Kafka或RocketMQ,消费者逐个处理。 3. 缓存层面: * 将库存预加载到Redis中,利用Redis的原子操作(如DECR)来扣减库存,然后再异步同步到数据库。 综合方案:通常采用缓存(Redis)预扣库存+数据库最终一致的方案。具体步骤: * 秒杀开始前,将商品库存加载到Redis中。 * 用户请求扣减库存时,使用Redis的DECRBY原子操作扣减库存,如果返回结果大于等于0,

By Ne0inhk
网红酒店|基于java的网红酒店预定系统(源码+数据库+文档)

网红酒店|基于java的网红酒店预定系统(源码+数据库+文档)

酒店预定|网红酒店|网红酒店预定系统 目录 基于java的网红酒店预定系统 一、前言 二、系统设计 三、系统功能设计 四、数据库设计  五、核心代码  六、论文参考 七、最新计算机毕设选题推荐 八、源码获取:   博主介绍:✌️大厂码农|毕设布道师,阿里云开发社区乘风者计划专家博主,ZEEKLOG平台Java领域优质创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。✌️ 主要项目:小程序、SpringBoot、SSM、Vue、Html、Jsp、Nodejs等设计与开发。 🍅文末获取源码联系🍅 基于java的网红酒店预定系统 一、前言 网红酒店预定系统的设计与实现,利用计算机搭建网红酒店预定系统,实现网红酒店预定的信息化。则对于进一步提高网红酒店预定管理发展,丰富网红酒店预定管理经验能起到不少的促进作用。开发了具有网红酒店预定系统首页,个人中心,客户管理,客房类型管理,客房信息管理,

By Ne0inhk
Java 大视界 -- Java 大数据在智能教育在线学习平台用户活跃度提升与留存策略研究中的应用(354)

Java 大视界 -- Java 大数据在智能教育在线学习平台用户活跃度提升与留存策略研究中的应用(354)

Java 大视界 -- Java 大数据在智能教育在线学习平台用户活跃度提升与留存策略研究中的应用(354) * 引言: * 正文: * 一、Java 构建的用户行为感知系统 * 1.1 多维度行为数据实时分析 * 1.2 用户画像动态更新(全周期标签) * 二、Java 驱动的个性化学习与留存策略 * 2.1 智能推荐引擎(课程 / 练习匹配) * 2.2 留存策略自动化(全周期干预) * 三、实战案例:从 “流失” 到 “留存” 的蜕变 * 3.1 K12 平台:让 “跟不上” 的学生留下来 * 3.2 职业教育平台:考证学员的 “不放弃” 方案

By Ne0inhk
华为OD机试双机位C卷 - 螺旋数字矩阵 (C语言 & C++ & Python & JAVA & JS & GO)

华为OD机试双机位C卷 - 螺旋数字矩阵 (C语言 & C++ & Python & JAVA & JS & GO)

螺旋数字矩阵 2025华为OD机试双机位C卷 - 华为OD上机考试2025年双机位C卷 100分题型 华为OD机试双机位C卷真题目录点击查看: 华为OD机试双机位C卷真题题库目录|机考题库 + 算法考点详解 题目描述 疫情期间,小明隔离在家,百无聊赖,在纸上写数字玩。他发明了一种写法: 给出数字个数n和行数m(0 < n ≤ 999,0 < m ≤ 999),从左上角的1开始,按照顺时针螺旋向内写方式,依次写出2,3…n,最终形成一个m行矩阵。 小明对这个矩阵有些要求: * 每行数字的个数一样多 * 列的数量尽可能少 * 填充数字时优先填充外部 * 数字不够时,使用单个*号占位 输入描述 输入一行,两个整数,空格隔开,依次表示n、m 输出描述 符合要求的唯一矩阵 示例1 输入 9 4 输出

By Ne0inhk