数据结构第二讲:顺序表

数据结构第二讲:顺序表

  • 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://xiahunao.cn/news/3269368.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

京东发行稳定币的背后

加密市场很热&#xff0c;京东也要来分一杯羹&#xff1f; 7月24日&#xff0c;据财联社报道&#xff0c;京东科技旗下的京东币链科技 ( 香港 ) 将在香港发行与港元 1:1锚定的加密货币稳定币&#xff0c;在市场上掀起广泛热议。 由于众所周知的监管原因&#xff0c;国内大厂在早…

深度学习的前沿主题:GANs、自监督学习和Transformer模型

&#x1f48e; 欢迎大家互三&#xff1a;2的n次方_ &#x1f48e;1. 介绍 深度学习在人工智能领域中占据了重要地位&#xff0c;特别是生成对抗网络&#xff08;GANs&#xff09;、自监督学习和Transformer模型的出现&#xff0c;推动了图像生成、自然语言处理等多个领域的创…

【苍穹】完美解决由于nginx更换端口号导致无法使用Websocket

一、报错信息 进行到websocket开发的过程中&#xff0c;遇到了前端报错&#xff0c;无法连接的提示&#xff1a; 经过F12排查很明显是服务端和客户端并没有连接成功。这里就涉及到之前的坑&#xff0c;现在需要填上了。 二、报错原因和推导 应该还记得刚开苍穹的第一天配置前…

2024年第四届网络通信与信息安全国际学术会议(ICNCIS 2024,8月23-25)

2024年第四届网络通信与信息安全国际学术会议&#xff08;ICNCIS2024&#xff09;将于2024年8月23-25日于杭州召开。 会议围绕网络通信在信息安全领域中的最新研究成果&#xff0c;为来自国内外高等院校、科学研究所、企事业单位的专家、教授、学者、工程师等提供一个分享专业经…

移植QT项目出现无法找到 v143 的生成工具(平台工具集 =“v143”)。若要使用 v143 生成工具进行生成,请安装 v143 生成工具。

由于使用的是visual studio2019&#xff0c;在扩展里没找到msvc v143的工具集&#xff0c;这时候可能需要升级下版本&#xff0c;比如换用visual studio2022 或者在三个地方更改所使用的工具集&#xff0c;一般来讲只要v143编译能通过的v142编译也能通过&#xff0c;所以换用v…

数据结构 —— B+树和B*树及MySQL底层引擎

数据结构 —— B树和B*树及MySQL底层引擎 B树B*树B树的应用B树在MySQL中的应用MyISAMInnoDB 我们之前学习了B树的基本原理&#xff0c;今天我们来看看B树的一些改良版本——B树和B*树。如果还没有了解过的小伙伴可以点击这里&#xff1a; https://blog.csdn.net/qq_67693066/ar…

Navicat premium最新【16/17 版本】安装下载教程,图文步骤详解(超简单,一步到位,免费下载领取)

文章目录 软件介绍软件下载安装步骤激活步骤 软件介绍 Navicat是一款快速、可靠且功能全面的数据库管理工具&#xff0c;专为简化数据库的管理及降低系统管理成本而设计。以下是对Navicat的详细介绍&#xff1a; 一、产品概述 开发目的&#xff1a;Navicat旨在通过其直观和设计…

景联文科技入选艾瑞咨询《2024年中国AI基础数据服务产业图谱》

2024年7月&#xff0c;国内领先的数据服务提供商景联文科技&#xff0c;成功入选艾瑞咨询发布的《2024年中国AI基础数据服务产业图谱》&#xff0c;这一荣誉不仅是对景联文科技在AI数据服务领域卓越成就的认可&#xff0c;也是对公司在未来发展中持续引领行业创新的高度期待。 …

map和set的底层结构——AVL树

前面对map和set做了简单的介绍&#xff0c;这几个的个共同特点就是其底层都是用二叉搜索树来写的&#xff0c;但是二叉搜索树有自身的缺陷&#xff0c;如果树中插入的元素有序或接近有序&#xff0c;二叉搜索树就会退化成单支树&#xff0c;时间复杂度变成O(N),所以map和set等关…

全球“微软蓝屏”事件:IT基础设施韧性与安全性的考验

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌…

postman请求响应加解密

部分接口&#xff0c;需要请求加密后&#xff0c;在发动到后端。同时后端返回的响应内容&#xff0c;也是经过了加密。此时&#xff0c;我们先和开发获取到对应的【密钥】&#xff0c;然后在postman的预执行、后执行加入js脚本对明文请求进行加密&#xff0c;然后在发送请求&am…

Sentinel 入门与实战

一、Sentinel概念 1.1 什么是Sentinel Spring Cloud Alibaba Sentinel 是一个开源的流量控制和熔断框架&#xff0c;它是 Alibaba 开源的微服务框架 Spring Cloud Alibaba 中的一个组件。Sentinel 旨在解决分布式系统中的流量控制和熔断问题&#xff0c;帮助开发人员保护微服…

Power App学习笔记以及基础项目管理demo

Power App学习笔记以及基础项目管理demo 最近学习了一点Power App&#xff0c;感觉挺有意思。配置式组件开发。浅浅记录一下自己实现的项目管理系统&#xff08;即Excel数据的增删改查&#xff09;关于函数的一点皮毛认识。 效果图 筛选数据 编辑 详情 数据源 PowerApp 网…

流量录制与回放:jvm-sandbox-repeater工具详解

在软件开发和测试过程中&#xff0c;流量录制与回放是一个非常重要的环节&#xff0c;它可以帮助开发者验证系统在特定条件下的行为是否符合预期。本文将详细介绍一款强大的流量录制回放工具——jvm-sandbox-repeater&#xff0c;以及如何利用它来提高软件测试的效率和质量。 …

如何在Selenium Webdriver中点击SVG元素?

我们将在URL上单击下面突出显示的SVG元素&#xff1a;https&#xff1a;//testkru.com/Elements/SVGelemnts。 有几种方法可以点击SVG元素&#xff0c;我们将在这篇文章中讨论它们&#xff0c;并讨论它们之间应该首选哪一种。 使用 WebElement Click() 通过使用Action Click() …

vue3 Router 点击index中的按钮,查看相应的详情信息,并且传递id,及其路由的定义方法。

1、路由的定义 结构如下: 2、路由定义代码&#xff1a; {path: tabs,name: TabsDemo,component: () > import(/views/demo/feat/tabs/index.vue),meta: {title: t(routes.demo.feat.tabs),hideChildrenInMenu: true,},children: [{path: detail/:id,name: TabDetail,compon…

maven介绍 搭建Nexus3(maven私服搭建)

Maven是一个强大的项目管理工具&#xff0c;它基于项目对象模型&#xff08;POM&#xff1a;Project Object Model&#xff09;的概念&#xff0c;通过XML格式的配置文件&#xff08;pom.xml&#xff09;来管理项目的构建 Maven确实可以被视为一种工程管理工具或项目自动化构…

SpringcloudAlibaba详解---超详细

简介 Spring Cloud Alibaba是阿里巴巴结合自身的微服务实践开源的微服务全家桶&#xff0c;我个人觉得其组件比Spring Cloud 中的组件更加好用和强大。并且对的Spring Cloud组件做了很好的兼容。比如在Spirng Cloud Alibaba中依然可以使用Feign作为服务调用方式&#xff0c;使…

Mac如何在某个目录下快速打开iTerm2

最近喜欢上用Mac了&#xff0c;为了让自己用的更顺手和快速&#xff0c;设置了一堆快捷键&#xff0c;这里主要记录一下如何在某个文件夹下快速打开某一个软件。 然后你要快速再某一个文件夹路径下打开iTerm2这个软件&#xff0c;就鼠标选中文件夹&#xff0c;然后直接按快捷键…

一文带你搞懂C++运算符重载

7. C运算符重载 C运算符重载 什么是运算符重载 运算符重载赋予运算能够操作自定义类型。 运算符重载前提条件&#xff1a; 必定存在一个自定义类型 运算符重载实质: 就是函数调用 友元重载 类重载 在同一自定义类型中&#xff0c;一个运算符只能被重载一次 C重载只能重载…