数据结构第二讲:顺序表

数据结构第二讲:顺序表

  • 1.线性表
  • 2.什么是顺序表
  • 3. 静态顺序表
  • 4.动态顺序表
    • 4.1顺序表基础
    • 4.2顺序表的初始化
    • 4.3顺序表的销毁
    • 4.4顺序表的尾插
    • 4.5顺序表的头插
    • 4.6顺序表的尾删
    • 4.7顺序表的头删
    • 4.8顺序表在指定位置之前插入数据
    • 4.9顺序表删除指定位置的数据
    • 4.10顺序表查找数据
    • 4.11顺序表的打印
  • 5.算法题1
  • 6.算法题2
  • 7.算法题3
  • 8.顺序表问题以及思考

1.线性表

顺序表是数据结构中的一种组织方式,是N个具有相同特性数据元素的有限序列,常见的线性表有:顺序表、链表、栈、队列、字符串…
本篇博客我们将详细阐述顺序表的实现以及注意事项

线性表在逻辑上是线性的,在物理结构上不一定是连续的
而顺序表在逻辑上和物理结构上都是连续的

2.什么是顺序表

顺序表是用一段物理地址连续的存储单元存储数据元素的线性结构,一般情况下采用数组存储

顺序表的底层逻辑是数组,但是有不同于数组,顺序表是对数组进行封装,实现了常见的增删改查的接口,就像这样:
在这里插入图片描述

3. 静态顺序表

顺序表分为静态顺序表和动态顺序表两种,静态顺序表的实现如下:

//静态顺序表的实现
typedef int SLDateType;#define N 100//数组长度struct Seqlist
{SLDateType arr[N];//定长数组,用来存储数据int size;//有效数据个数
};

可以看出,静态顺序表中使用的是定长数组,它的大小是固定的,而动态属性表的大小是可变的,由此可见,动态顺序表要比静态顺序表好用一些

4.动态顺序表

4.1顺序表基础

完成顺序表之前,我们要先实现一个框架,这个框架由结构体来实现,具体如下:

//动态顺序表
typedef int SLDateType;typedef struct SeqList
{SLDateType* a;//首先创建一个指针,指向动态开辟的地址int size;//有效数据的个数int capacity;//空间容量
}SL;

我们通过这个结构体创建了一个 sl 结构体变量

4.2顺序表的初始化

创建了一个变量,首先要做的就是对它的初始化,初始化很简单,操作如下:

//顺序表的初始化
void SLInit(SL* pa)
{//先将指向的空间赋值为0pa->a = NULL;//将大小全部初始化为0pa->capacity = 0;pa->size = 0;
}

4.3顺序表的销毁

写出了顺序表的初始化,我们顺便将顺序表的销毁也一并写了就行了,方式如下:

//顺序表的销毁
void SLDestory(SL* pa)
{//将结构体中的变量一一销毁即可if (pa->a != NULL){free(pa->a);pa->a = NULL;}pa->capacity = 0;pa->size = 0;
}

4.4顺序表的尾插

在这里插入图片描述
既然size指向的位置就是需要插入的位置的下表,那么我们直接在size这个位置插入数据,然后将size++,指向下一个位置即可,操作方法如下:

//顺序表尾插
void SLPushBack(SL* ps, SLDateType x)
{if (ps->capacity == ps->size){//首先判断一开始是否有空间int newcapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;//然后需要开辟空间,才能插入数据SLDateType* pa = (SLDateType*)realloc(ps->a, newcapacity * sizeof(SLDateType));//此时一般开辟两倍的空间if (pa == NULL){perror("realloc faile!");exit(-1);}ps->a = pa;ps->capacity = newcapacity;}//尾插就是直接将数据插入即可ps->a[ps->size++] = x;
}

在这串代码中,对于空间大小的判断需要经常使用,所以我们将它封装成一个函数即可:

//顺序表检查空间是否充足
void SLCheckCapacity(SL* ps)
{if (ps->capacity == ps->size){//首先判断一开始是否有空间int newcapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;//然后需要开辟空间,才能插入数据SLDateType* pa = (SLDateType*)realloc(ps->a, newcapacity * sizeof(SLDateType));//此时一般开辟两倍的空间if (pa == NULL){perror("realloc faile!");exit(-1);}ps->a = pa;ps->capacity = newcapacity;}
}

这时尾插就变得非常朴实无华了:

//顺序表尾插
void SLPushBack(SL* ps, SLDateType x)
{assert(ps);SLCheckCapacity(ps);//尾插就是直接将数据插入即可ps->a[ps->size++] = x;
}

4.5顺序表的头插

有尾插,那肯定要有头插,头插就是将所有数据向后移,然后在下标为0的位置插入数据即可:
平移前:
在这里插入图片描述
平移之后:
在这里插入图片描述
实现方法如下,一个简单的for循环即可:

//顺序表的头插
void SLPushFront(SL* ps, SLDateType x)
{//注意点:头插之前,需要判断ps是否为空assert(ps);//头插也一样,也需要先判断一下空间是否充足SLCheckCapacity(ps);//头插首先需要将所有数据进行后移for (int i = ps->size; i > 0; i--){ps->a[i] = ps->a[i - 1];}//随后将数据插入到第一位即可ps->a[0] = x;ps->size++;
}

4.6顺序表的尾删

尾删非常简单,将size–就行了,因为根本就没有必要将数据删除!!!方法如下:

//顺序表的尾删
void SLPopBack(SL* ps)
{//首先需要先判断ps是否为空,没有空间不能删除,指针为空不能删除assert(ps);assert(ps->size);//直接将size-1就行了ps->size--;
}

4.7顺序表的头删

头删也很简单,将所有数据向前平移即可,将第一个数据覆盖掉就行了:

//顺序表的头删
void SLPopFront(SL* ps)
{//头删时,空指针不能删,没有空间不能删assert(ps);assert(ps->size);//头删将所有的数据向前平移,size--即可for (int i = 0; i < ps->size-1; i++){ps->a[i] = ps->a[i + 1];}ps->size--;
}

4.8顺序表在指定位置之前插入数据

随机插入数据才更显得高级,难道不是吗?
假设pos是我们需要插入位置的下标,方法根据画图来理解吧:
在这里插入图片描述
在这里插入图片描述
实现方法如下:

//顺序表在指定位置之前插入数据
void SLInsert(SL* ps, SLDateType x, int pos)
{//我们插入的位置肯定不能够超过有效空间的位置,也不能小于0assert(ps);assert(pos >= 0 && pos <= ps->size);//先检查空间是否足够SLCheckCapacity(ps);//插入就是将数据进行后移,空出位置进行插入即可for (int i = ps->size; i > pos; i--){ps->a[i] = ps->a[i - 1];}ps->a[pos] = x;ps->size++;
}

4.9顺序表删除指定位置的数据

要删除指定位置的数据的话只需要一个平移就可以了,就是这样:
在这里插入图片描述
实现方法如下:

//顺序表删除指定位置的数据
void Erase(SL* ps, int pos)
{assert(ps);assert(pos >= 0 && pos < ps->size);for (int i = pos; i < ps->size - 1; i++){ps->a[i] = ps->a[i + 1];}ps->size--;
}

4.10顺序表查找数据

查找数据十分简单,只需要遍历数组就可以了:

//顺序表查找数据
void SLFind(SL* ps, SLDateType x)
{assert(ps);for (int i = 0; i < ps->size; i++){if (ps->a[i] == x){printf("找到了! 下标为:%d\n", i);return;}}printf("没找到!\n");
}

4.11顺序表的打印

实现了那么多的操作,不打印一下看一下那怎么能行呢?打印很简单,方法如下:

//打印顺序表
void SLPrint(SL *ps)
{for (int i = 0; i < ps->size; i++)printf("%d ", ps->a[i]);printf("\n");
}

5.算法题1

链接: 移除元素

int removeElement(int* nums, int numsSize, int val) {int src = 0;int dst = 0;int k = numsSize;while (src < numsSize) {if (nums[src] == val) {src++;k--;} elsenums[dst++] = nums[src++];}return k;
}

6.算法题2

链接: 删除有序数组中的重复项

int removeDuplicates(int* nums, int numsSize) {int src = 1;int dst = 0;int k = 1;while (src < numsSize) {if (nums[src] != nums[dst]) {nums[++dst] = nums[src];k++;}src++;}return k;
}

7.算法题3

链接: 合并两个有序数组

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) {int l1 = m - 1;int l2 = n - 1;int l3 = nums1Size - 1;while (1) {if (l3 == l1)return;if (l3 == l2)break;if (nums1[l1] > nums2[l2]) {nums1[l3--] = nums1[l1--];} else {nums1[l3--] = nums2[l2--];}}for (int i = l2; i >= 0; i--)nums1[i] = nums2[i];
}

8.顺序表问题以及思考

当然,顺序表并不是完美的,它仍然具有着一些问题:
在这里插入图片描述
为了解决以上问题,我们就需要引入一个东西:链表,这个我们下一次再讲!!!

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

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

相关文章

JNPF全新V5.0版本!重磅升级——全局优化篇

尊敬的JNPF用户们&#xff1a; 我们非常高兴地宣布&#xff0c;经过团队数月的辛勤努力和不断的技术创新&#xff0c;JNPF快速开发平台终于迎来了里程碑式的全新升级——V5.0版本&#xff01;这一版本的更新发布&#xff0c;不仅代表着我们技术实力的进一步提升&#xff0c;是…

大模型深度神经网络(Deep Neural Network, DNN)

大模型深度神经网络&#xff08;Deep Neural Network, DNN&#xff09;是一种复杂的机器学习模型&#xff0c;其特点在于包含多个隐藏层&#xff0c;从而赋予模型强大的非线性表达能力和对复杂数据模式的学习能力。以下是对大模型DNN的详细介绍&#xff1a; 一、基本概念 深度…

el-table列的显示与隐藏

需求&#xff1a;实现 表字段的显示与隐藏。效果图 代码实现 写在前面 首先 我部分字段有自定义的排序逻辑&#xff0c;和默认值或者 数据的计算 所以是不能简单的使用 v-for 循环column 。然后 我需要默认展示一部分字段&#xff0c;并且 当表无数据时 提示不能 显示隐藏 …

Flink-CDC解析(第47天)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言1. CDC 概述1.1 什么是CDC&#xff1f;1.2 CDC的实现机制1) 基于主动查询的 CDC&#xff1a;2) 基于事件接收CDC&#xff1a; 前言 本文主要概述了Flink-CDC. …

人工智能驱动的光学检测技术可阻止假冒芯片

欢迎关注GZH《光场视觉》 在过去的60年里&#xff0c;半导体行业已经蓬勃发展&#xff0c;成为了一个价值5000亿美元的全球市场。然而&#xff0c;这个行业正面临着两大挑战&#xff1a;新芯片的严重短缺和假冒芯片的激增。这两个问题不仅带来了巨大的故障风险&#xff0c;还导…

idea启动项目报:the command line via JAR manifest or via a classpath file and rerun.

解决方案 1.打开Edit Configurations&#xff0c;进去编辑&#xff0c;如下&#xff1a; 笔记配置 2.选择Modfiy options,点击Shorten command line 3.在新增的Shorten command line选项中选择JAR manifest或classpath file 4.点击保存后即可

RK3588+MIPI+GMSL+AI摄像机:自动车载4/8通道GMSL采集/边缘计算盒解决方案

RK3588作为目前市面能买到的最强国产SOC&#xff0c;有强大的硬件配置。在智能汽车飞速发展&#xff0c;对图像数据矿场要求越来越多的环境下&#xff0c;如何高效采集数据&#xff0c;或者运行AI应用&#xff0c;成为刚需。 推出的4/8通道GMSL采集/边缘计算盒产品满足这些需求…

leetcode日记(51)不同路径Ⅱ

和上一道题&#xff08;无障碍物的最短路径&#xff09;很像&#xff0c;但事实上比上一题多了优化方法 根据上一题改的代码如下&#xff0c;添加了对障碍物的判定&#xff0c;如果有障碍物则将数组值设为0。 class Solution { public:int uniquePathsWithObstacles(vector&l…

【PyCharm】PyCharm 2024.1 的最新变化-代码补全与智能提示

目录 代码补全与智能提示 更智能的代码补全功能 基于机器学习的代码建议 上下文相关的代码片段推荐 全行代码补全支持 (JavaScript 和 TypeScript) 本地 ML 模型的全行补全 示例 示例 1: 基于上下文的代码建议 示例 2: 全行代码补全 详细对比示例 示例 3: 传统代码补…

[Vulnhub] Raven2 PHPMailer-RCE+MSQP:Mysql权限提升

信息收集 IP AddressOpening Ports192.168.101.160TCP:22,80,111,46606 $ nmap -p- 192.168.101.160 --min-rate 1000 -sC -sV PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 6.7p1 Debian 5deb8u4 (protocol 2.0) | ssh-hostkey: | 1024 26:81:c1:f…

数据结构 链式存储 +

int DeleteLinkList(LinkList *list, char *name); int ReviseLinkList(LinkList *list, char *name, DATATYPE data); int DestroyLinkList(LinkList *list); int InsertTailLinkList(LinkList *list, DATATYPE data); ​​​​​​​删除 修改​​​​​​​ 销毁 ​​​​​…

Anaconda +Pytorch安装教程

Anaconda Pytorch安装教程 Anaconda安装 小土堆的安装教程&#xff1a;PyTorch深度学习快速入门教程&#xff08;绝对通俗易懂&#xff01;&#xff09;【小土堆】_哔哩哔哩_bilibili Free Download | Anaconda 这里自己选一个文件夹安装即可 第一个红框表示添加图标到开始菜…

CentOS配置NTP服务

更改配置文件 [rootController ~]# vim /etc/chrony.conf 重启服务并设置为开机自启动 [rootController ~]# systemctl restart chronyd.service [rootController ~]# systemctl enable chronyd.service 在另一台CentOS测试 更改配置文件 [rootCompute ~]# vim /etc/chron…

magento2 安装win环境和linux环境

win10 安装 安装前提&#xff0c;php,mysql,apach 或nginx 提前安装好 并且要php配置文件里&#xff0c;php.ini 把错误打开 display_errorsOn开始安装 检查环境 填写数据库信息 和ssl信息&#xff0c;如果ssl信息没有&#xff0c;则可以忽略 填写域名和后台地址&#xff0…

websocket通信问题排查思路

websocket通信问题排查思路 一、websocket连接成功&#xff0c;但数据完全推不过来。 通过抓包发现&#xff0c;是回包时间太长超过了1分钟导致的。这种通常是推送数据的线程有问题导致的。 正常抓包的情况如下&#xff1a; 二、大量数据可以正常推送成功&#xff0c;不定时…

matlab笔记 - 最小二乘法拟合直线的原理与实现

最小二乘法拟合直线原理与实现 一、引言二、原理概述1. 建模思路2.误差函数3.求解最优参数 三、matlab实现最小二乘法拟合直线1.直接代码实现2.MATLAB内置函数实现 四、扩展统计学与回归分析经济学工程学图像处理机器学习 一、引言 最小二乘法&#xff08;Least Squares Metho…

Java成为最适合中国人体质编程语言的缘由

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「java的资料从专业入门到高级教程」&#xff0c;点个关注在评论区回复“666”之后私信回复“666”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01; 语言的流行度Java在中国的普及…

Mybatis(四)特殊SQL的查询:模糊查询、批量删除、动态设置表明、添加功能获取自增的主键

实体类&#xff1a; 数据库&#xff1a; 1、模糊查询 方案一&#xff1a; 不适用#{ }&#xff0c;’%?%‘ 问号是属于字符串的一部分 不会被解析成占位符&#xff0c;会被当作是我们字符串的一部分来解析&#xff0c;所以我们执行的语句中找不到占位符&#xff0c;但是我们却…

WEB前端11-Vue2基础01(项目构建/目录解析/基础案例)

Vue2基础(01) 1.Vue2项目构建 步骤一&#xff1a;安装前端脚手架 npm install -g vue/cli步骤二&#xff1a;创建项目 vue ui步骤三&#xff1a;运行项目 npm run serve步骤四&#xff1a;修改vue相关的属性 DevServer | webpack //修改端口和添加代理 const { defineCo…

车载录像机:移动安全领域的科技新星

随着科技的飞速发展&#xff0c;人类社会的各个领域都在不断经历技术革新。其中&#xff0c;车载录像机作为安防行业与汽车技术结合的产物&#xff0c;日益受到人们的关注。它不仅体现了人类科技发展的成果&#xff0c;更在安防领域发挥了重要作用。本文将详细介绍车载录像机的…