数据结构——lesson2线性表和顺序表

目录

前言

 一、顺序表是什么?

1. 静态顺序表:使用定长数组存储元素

2. 动态顺序表:使用动态开辟的数组存储。

二、接口实现

1.动态顺序表存储

2.基本增删查改接口

(1)初始化顺序表

(2)顺序表摧毁

(3)检查空间

(4)顺序表打印

(5)顺序表尾插

(6)顺序表尾删

(7)顺序表头插

(8)顺序表头删

(9)顺序表在pos位置插入x

(10)顺序表在pos位置删除x

(11)顺序表查找

3.代码运行结果如下:



前言

在学习顺序表之前我们要了解什么是线性表?

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

 一、顺序表是什么?


顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。

顺序表一般可以分为:

1. 静态顺序表:使用定长数组存储元素

//顺序表的静态存储
#define N 7
typedef int SLDataType;//防止数组类型改变时麻烦typedef struct SeqList
{SLDataType arry[N];//定长数组size_t size;//有效数据个数}SeqList;

2. 动态顺序表:使用动态开辟的数组存储。

//顺序表的动态存储
typedef struct SeqList
{SLDataType* arry;//指向动态开辟的数组size_t size;//有效数据个数size_t capacity;//容量空间的大小
}SeqList;//空间不够则增容
静态顺序表只适用于确定知道需要存多少数据的场景。静态顺序表的定长数组导致 N 定大了,空间开多了浪费,开少了不够用。所以现实中基本都是使用 动态顺序表 ,根据需要动态的分配空间大小,所以下面我们实现动态顺序表。

二、接口实现

1.动态顺序表存储

:相较于静态顺序表动态顺序表arry表示的指针数据,不再是定长数组,从而可以使用mallo,realloc函数开辟动态内存空间,此外还增加了capacity变量来记录容量大小

typedef struct SeqList
{SLDataType* arry;//指向动态开辟的数组size_t size;//有效数据个数size_t capacity;//容量空间的大小
}SeqList;//空间不够则增容

①SLDataType:其实是int被typedef的

typedef int SLDataType;//防止数组类型改变时麻烦

②size_t:无符号位的整型

2.基本增删查改接口

(1)初始化顺序表

:(1)asert断言防止传入指针为空;

       (2)使用malloc函数给数组开4个SLDataType(typedef为int,避免修改数据的麻烦)大小的空间;

void SeqListInit(SeqList* psl)//顺序表初始化
{assert(psl);//asert断言防止传入指针为空psl->arry = (SLDataType*)malloc(sizeof(SLDataType) * 4);//给数组开4个SLDataType大小的空间if (psl == NULL){perror("malloc fail");//如果开辟没成功则返回错误return;}psl->size = 0;psl->capacity = 4;
}

(2)顺序表摧毁

:使用动态内存函数(malloc、realloc等函数)后记得要用free释放空间;

void SeqListDestory(SeqList* psl)//顺序表销毁
{assert(psl);//assert断言free(psl->arry);//使用动态内存函数后记得要用free释放空间psl->arry = NULL;//指针置空psl->capacity = 0;psl->size = 0;
}

(3)检查空间

:①如果空间满了使用realloc函数来增加空间;

        ②需要人为的将capacity增加到相应的容量(只是内存容量增加了,我们要将capacity与内存链接需要自己动手);

void CheckCapacity(SeqList* psl)
{assert(psl);//断言if (psl->size == psl->capacity)//判断空间是否满了{SLDataType* tmp = realloc(psl->arry, sizeof(SLDataType) * 2 * (psl->capacity));//增容每次扩展为上一次的2倍if (tmp == NULL)//判断是否开辟成功{perror("realloc fail");return;}psl->arry = tmp;psl->capacity *= 2;//开辟成功指示容量的capacity要相应的增加}
}

(4)顺序表打印

for循环逐一打印即可;

void SeqListPrint(SeqList* psl)
{assert(psl);for (int i = 0; i < psl->size; i++){printf("%d ", psl->arry[i]);}printf("\n");
}

(5)顺序表尾插

:①尾插数据也是增加数据所以要用检查容量函数(CheckCapacity)检查容量;

        ②相应元素加进去后,顺序表指向有效数据个数(size)要增加(类似于增加容量时capacity也要增加);

        ③后续等学习了在特定位置(pos)插入相应元素后即可使用SeqListInsert函数,能大大提高代码的利用率,此时应该在顺序表的尾端也就是下标为size的地方插入x;

void SeqListPushBack(SeqList* psl, SLDataType x)
{assert(psl);//断言CheckCapacity(psl);//检查容量psl->arry[psl->size] = x;psl->size++;//顺序表个数要相应增加//SeqListInsert(psl,ps->size,x);//在特定位置插入元素x
}

(6)顺序表尾删

:①要先判断顺序表中是否储存了元素,如果没有则没有继续的必要;

        ②因为顺序表是通过数组下标访问,所以只要将最大的下标减一即可,这样就访问不到最后的元素了,可以看成删掉了一个元素;

        ③后续等学习了在特定位置(pos)删除相应元素后即可使用SeqListErase函数,能大大提高代码的利用率,此时应该在顺序表的尾端也就是下标为size-1的地方删除;

void SeqListPopBack(SeqList* psl)
{assert(psl);//断言if (psl->size == 0)//判断顺序表是否有元素{return;//没有直接返回}psl->size--;//顺序表个数-1//SeqListErase(ps,ps->size-1);//在顺序表末尾删除元素
}

(7)顺序表头插

:①头插数据也是增加数据所以要用检查容量函数(CheckCapacity)检查容量;

        ②头插数据之前的数据下标要整体+1;顺序表个数也要+1;

        ③后续等学习了在特定位置(pos)插入相应元素后即可使用SeqListErase函数,能大大提高代码的利用率,此时应该在顺序表的首端也就是下标为0的地方插入x;

void SeqListPushFront(SeqList* psl, SLDataType x)//顺序表头插
{assert(psl);CheckCapacity(psl);//检查容量for (int i = psl->size-1; i >= 0; i--)//顺序表整体向后移{psl->arry[i + 1] = psl->arry[i];}psl->size++; //顺序表个数+1psl->arry[0] = x;//SeqListInsert(ps,0,x);//在下标为0的位置插入x
}

(8)顺序表头删

:①要先判断顺序表中是否储存了元素,如果没有则没有继续的必要;

        ②删除第一个元素,顺序表下标都要-1;

        ③顺序表元素个数(size)也要-1;

        ④后续等学习了在特定位置(pos)删除相应元素后即可使用SeqListErase函数,能大大提高代码的利用率,此时应该在顺序表的尾端也就是下标为0的地方删除;

void SeqListPopFront(SeqList* psl)//顺序表头删
{assert(psl);//断言if (psl->size == 0)//判断是否为空return;for (int i = 1; i < psl->size; i++)//顺序表数据整体都要前移{psl->arry[i - 1] = psl->arry[i];}psl->size--;//顺序表个数-1//SeqListErase(ps,0);//在下标为0位置删除
}

(9)顺序表在pos位置插入x

:①在特定位置插入数据也是增加数据所以要用检查容量函数(CheckCapacity)检查容量;

        ②判断插入下标pos是否合理(要小于size);

        ③插入pos位置的数据,其后的数据下标都要整体+1;

        ④顺序表元素个数(size)要+1;

void SeqListInsert(SeqList* psl, size_t pos, SLDataType x)//在pos位置插入x
{assert(psl);//断言assert(pos <= psl->size);//判断pos是否小于最大的下标CheckCapacity(psl);//检查容量for (int i = psl->size - 1; i >= pos; i--)//下标在pos之后的要整体+1{psl->arry[i + 1] = psl->arry[i];}psl->arry[pos] = x;//将x插入pos位置psl->size++;//顺序表元素个数+1
}

(10)顺序表在pos位置删除x

:①删除元素size要-1;

        ②在pos位置删除元素,pos之后的下标都要-1;

void SeqListErase(SeqList* psl, size_t pos)//在特定位置删除元素
{assert(psl);//断言for (int i = pos + 1; i < psl->size; i++)//pos之后下标-1{psl->arry[i - 1] = psl->arry[i];}psl->size--;//顺序表元素个数-1;
}

(11)顺序表查找

int SeqListFind(SeqList* psl, SLDataType x)//顺序表查找
{assert(psl);//断言if (psl->size == 0)//判断是否为空return -1;for (int i = 0; i < psl->size; i++)//循环逐一查找{if (psl->arry[i] == x){printf("%d\n", i);return i;//找到了返回下标}}printf("没找到\n");return -1
}

3.代码运行结果如下:

以上就是顺序表的所以内容啦,欢迎三连回访,有问题可以后台私信我或者打在评论区哦~ 

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

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

相关文章

第四篇【传奇开心果微博系列】Python微项目技术点案例示例:美女颜值判官

传奇开心果微博系列 系列微博目录Python微项目技术点案例示例系列 微博目录一、微项目目标二、雏形示例代码三、扩展思路四、添加不同类型的美女示例代码五、增加难度等级示例代码六、添加特殊道具示例代码七、设计关卡系统示例代码八、添加音效和背景音乐示例代码九、多人游戏…

C++ 音视频原理

本篇文章我们来描述一下音视频原理 音视频录制原理: 下面是对这张思维导图的介绍 摄像头部分: 麦克风采集声音 摄像头采集画面 摄像头采集回来的数据可以用RGB也可以用YUV来表示 图像帧帧率 一秒能处理多少张图像 图像处理 &#xff1a;调亮度 图像帧队列 :意思是将数据取…

简单介绍源程序执行方式

源程序执行方式 编译和解释 程序设计语言能够把算法翻译成机器能够理解的可执行程序。这里将计算机不能直接执行的非机器语言源程序翻译成能直接执行的机器语言的语言翻译程序称为语言处理程序 源程序&#xff1a;用各种程序设计语言编写的程序称为源程序&#xff0c;计算机不…

C++ //练习 6.6 说明形参、局部变量以及局部静态变量的区别。编写一个函数,同时用到这三种形式。

C Primer&#xff08;第5版&#xff09; 练习 6.6 练习 6.6 说明形参、局部变量以及局部静态变量的区别。编写一个函数&#xff0c;同时用到这三种形式。 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&#xff1a;vim 代码块 /********************…

分享87个CSS3特效,总有一款适合您

分享87个CSS3特效&#xff0c;总有一款适合您 87个CSS3特效下载链接&#xff1a;https://pan.baidu.com/s/1CAxe8nPBzXvH7Nr6B_U72Q?pwd8888 提取码&#xff1a;8888 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;收集整理更不…

更新至2022年,迪博上市公司内部控制指数、分项指数、评级等数据

更新至2022年&#xff0c;上市公司迪博内部控制指数、分项指数、评级等数据 1、时间&#xff1a;更新至2022年&#xff0c;四份数据&#xff0c;具体时间见下文 2、范围&#xff1a;上市公司 3、具体数据&#xff1a; 2000-2022年上市公司内部控制指数评级及评分数据 2007…

【JVM篇】什么是jvm

文章目录 &#x1f354;什么是Java虚拟机&#x1f6f8;Java虚拟机有什么用&#x1f339;Java虚拟机的功能&#x1f388;Java虚拟机的组成 &#x1f354;什么是Java虚拟机 JVM指的是Java虚拟机&#xff0c;本质上是一个运行在计算机上的程序&#xff0c;可以运行 Java字节码文件…

NAT——网络地址转换、NAPT

网络地址转换 NAT (Network Address Translation) 1994 年提出。 需要在专用网连接到互联网的路由器上安装 NAT 软件。 装有 NAT 软件的路由器叫做 NAT路由器&#xff0c;它至少有一个有效的外部全球 IP 地址。 所有使用本地地址的主机在和外界通信时&#xff0c;都要在 NA…

【教程】MySQL数据库学习笔记(三)——数据定义语言DDL(持续更新)

写在前面&#xff1a; 如果文章对你有帮助&#xff0c;记得点赞关注加收藏一波&#xff0c;利于以后需要的时候复习&#xff0c;多谢支持&#xff01; 【MySQL数据库学习】系列文章 第一章 《认识与环境搭建》 第二章 《数据类型》 第三章 《数据定义语言DDL》 文章目录 【MyS…

docker 1:介绍

docker 1&#xff1a;介绍 docker解决哪些问题&#xff1a; 传统APP在安装到不同电脑的时候可能会遇到依赖问题&#xff0c;比如缺少VS 20xx&#xff0c;软件无法运行”的情况。docker使用容器技术将软件 依赖​打包为image包发布&#xff0c;解决了依赖问题。docker有一个官…

MATLAB|【免费】高比例可再生能源电力系统的调峰成本量化与分摊模型

目录 主要内容 部分代码 结果一览 下载链接 主要内容 程序复现文献《高比例可再生能源电力系统的调峰成本量化与分摊模型》&#xff0c;从净负荷波动的角度出发&#xff0c;建立了调峰成本的量化与分摊模型&#xff0c;构造了无调峰需求的替代场景&#xff0c;将…

在Ubuntu22.04上部署FoooCUS2.1

Fooocus 是一款基于 Gradio的图像生成软件&#xff0c;Fooocus 是对 Stable Diffusion 和 Midjourney 设计的重新思考&#xff1a; 1、从 Stable Diffusion 学习&#xff0c;该软件是离线的、开源的和免费的。 2、从 Midjourney 中学到&#xff0c;不需要手动调整&#xff0c;…

优先级队列(堆)_PriorityQueue

前言 想要看如何使用可以通过目录跳转到 PriorityQueue的使用 优先级队列 概念 队列是一种先进先出(FIFO)的数据结构&#xff0c;但有些情况下&#xff0c;操作的数据可能带有优先级&#xff0c;一般出队 列时&#xff0c;可能需要优先级高的元素先出队列&#xff0c;该中场…

前端秘法引言(配置vscode, 以及html的基础)

目录 一.配置环境vscode 二.配置插件 三.vscode的实用小技巧 四.标题段落换行标签 五.格式化标签 一.配置环境vscode vscode官网https://code.visualstudio.com/ 点击右上角的download 根据不同的操作系统进行下载安装,我这里选的是Windows x64 安装好后打开,点击左上角的…

【知识整理】产研中心岗位评定标准之测试岗位

为贯彻执行集团数字化转型的需要,该知识库将公示集团组织内各产研团队不同角色成员的职务“职级”岗位的评定标准; 一、定级定档目的 通过对公司现有岗位及相应岗位员工的工作能力、工作水平进行客观公正评定,确定各岗位的等级及同等级岗位员工对应的档级,从而为员工以后的晋升…

【开源】JAVA+Vue.js实现天然气工程运维系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统角色分类2.2 核心功能2.2.1 流程 12.2.2 流程 22.3 各角色功能2.3.1 系统管理员功能2.3.2 用户服务部功能2.3.3 分公司&#xff08;施工单位&#xff09;功能2.3.3.1 技术员角色功能2.3.3.2 材料员角色功能 2.3.4 安…

九、java 继承

文章目录 java 继承3.1 根父类Object3.2 方法重写3.3 继承案例&#xff1a;图形类继承体系3.4 继承的细节3.4.1 构造方法3.4.2 重名与静态绑定3.4.3 重载和重写3.4.4 父子类型转换3.4.5 继承访问权限protected3.4.6 可见性重写3.4.7 防止继承final 3.5 继承是把双刃剑3.5.1 继承…

爬虫-华为云空间备忘录导出到docx-selenium控制浏览器行为-python数据处理

背景适用情况介绍 老的荣耀手机属于华为云系统&#xff0c;家里人换了新荣耀手机属于荣耀云系统无法通过云空间将备忘录转移到新手机&#xff0c;不想让他们一个一个搞&#xff0c;于是整了一晚上想办法爬取下来。从网页抓取下来&#xff0c;然后存到docx文档中&#xff08;包…

福布斯2023年推荐:十佳项目管理软件榜单揭晓

项目管理软件可以轻松规划项目、分配任务并保持团队井井有条&#xff0c;以便满足截止日期和目标。然而当今市场上有如此多的项目管理系统&#xff0c;选择适合您需求的正确选项可能很困难。为了提供帮助&#xff0c;福布斯小型企业顾问团队分析了数十家领先的提供商&#xff0…

.NET高级面试指南专题七【SocketWebSocket】

Socket&#xff08;套接字&#xff09;是一种在计算机网络中实现通信的一种机制&#xff0c;它提供了一种标准的接口&#xff0c;使不同计算机上的程序能够通过网络进行数据交换。Socket允许在网络中的不同设备之间建立连接&#xff0c;进行双向的数据传输。 Socket通常用于实现…