数据结构之顺序表深度讲解

embedded/2024/11/9 0:32:12/

从这节课开始就要进入数据结构的课了,小伙伴们,你们准备好了吗?系好安全带,我们要发了。

顺序表的引入

概念

相互存在一种或多种特定关系的数据元素的集合

大白话:一个结构体包含了一些数据元素

概念不重要,大家这么理解一下就行,有兴趣可以自行搜索一些关于数据结构的专业解释

那么我们先来讲一下顺序表的里会有的数据元素

struct SQList 这是一个结构体,相信大家都可以理解。什么?你说你不理解结构体?没事,那我给大家简单的回顾一下结构体

结构体的简单回顾

结构体的基本框架:

struct   结构体的名字

 {

 }(结构体的缩名);//注意这里是有分号的哦

结构体的元素定义:

和我们一开始学的变量定义是一样的。

eg.   int size;

那么也许会有人问我们现在所创建的数组是int类型,但如果不是int类型,岂不是得一个一个修改?

当然了,我们的前辈早已想到了这个问题所以创建了另一个思路:

这个思路很简单,具体的模板我放在下面了,建议大家收藏一下。

模板:typedef    类型/结构体的缩名   新定义的名字;

思路讲解:我们使用定义变量的方法,运用自定义类型的typedef给想要包含的类型或结构体的缩名起一个新的名字,之后每当需要使用该类型或者结构体的缩名时直接替换,当需要修改时,也只需要修改这一行的代码。

顺序表的底层   

顺序表的底层是数组,因此我们需要用我们上面所写的自定义类型的新名字以指针的方式去定义一个数,并且还要记录有效的元素个数以及空间大小。

本篇文章的主要内容

温馨提示:图片中的代码所在文件是顺序表的头文件。

顺序表的创建

初始化时,需要将数组设为空,并且有效个数和所用空间均为0。

有创建就有销毁,那么我们先来看销毁

顺序表的销毁

当我们的程序走到销毁时,一定是有多余的空间是被占用的,所以当程序进入到这个函数时应当先释放数组arr所占用的多余空间,并且要将数组恢复为空。当然啦有效个数和空间也要恢复为0。

顺序表的尾插

这里我们先讲思路

首先我们先看第二种情况,这是我们容易想到的

紧接着,我们来看第一种情况

总结一下上面的两种情况:

当空间不够时,我们需要先申请增加空间容量,再插入数据,当空间足够时直接插入数据即可。

于是代码如下

函数——检查空间是否充足

当我们的程序进行到检查空间是否充足时,进入该函数,先判断空间是否已被占用完,如果还要剩余的空间,则跳出这个函数,进行插入语句。如果已被占用完,那么就会进入下一个判断,也就是空间是否为0,如果为0,则给出一定的空间,如果不为0,则成倍增加空间。

温馨提醒:malloc calloc 是申请空间,realloc是增加空间容量。

顺序表的头插

首先声明一下顺序表不为空,因为顺序表为空时,无法进行头插,之后通过遍历数组将元素进行头插。


顺序表的尾删

尾删比较简单,我们只需要确保顺序表不为空以及有效数字的个数不为空即可。


顺序表的头删

在确保顺序表不为空以及有效数字的个数不为空的情况下,我们通过循环,将整体的数往前移一个单位,注意:移完数字后千万别忘记将有效数字的个数减一!!!

指定位置添加数字

在确保顺序表不为空以及指定位置不为空的情况下,先检查空间,检查完空间后,通过循环,将元素从pos开始到结尾的元素统一往后移一个单位。空出位置后进行插入,并且size的个数要+1。

指定位置删除数字

在确保顺序表不为空以及指定位置不为空的情况下,通过循环,将从pos开始到末尾的元素统一往前移一个单位,记得将size的个数减一哦。

输出顺序表

顺序表的输出和数组的输出没什么区别,所以我不多讲了。

另外我在和大家分享一下我在写顺序表时遇到的问题

解决方案就是将x64改成x86,即可解决该问题了

测试文件的代码

最后做一下总结:

本篇文章需要学会的内容有:typedef    类型/结构体的缩名   新定义的名字;以及typedef   struct    结构体名{

}结构体缩名;

需要巩固的内容有指针、循环,以及部分函数的使用。


以上就是本篇文章的内容,本篇文章的内容对于初学数据结构的同学来说会比较难,但是熟能生巧,相信不久的将来你也可以成功的


http://www.ppmy.cn/embedded/23861.html

相关文章

Docker深入探索:网络与资源控制、数据管理与容器互联以及镜像生成

目录 一、 Docker网络 (一)Docker网络实现原理 (二)Docker网络模式 1. Bridge网络(默认) 2. Host网络 3. None网络 4. Container网络 5. 自定义网络 二、资源控制 (一)cgr…

Nacos的介绍和使用Docker、MySQL持久化挂载安装

文章目录 Nacos的介绍和使用Docker、MySQL持久化挂载安装一、Nacos的介绍二、使用Docker和MySQL进行持久化安装1、选择想要使用的MySQL服务器,创建一个数据库nacos-config,然后运行下面sql2、在linux下的opt文件夹下创建 /opt/nacos/data文件夹 和 /opt/…

吴恩达2022机器学习专项课程(一)7.2 逻辑回归的简化成本函数

问题预览/关键词 本节课内容逻辑回归的损失函数简化之后的形式是?为什么可以简化?成本函数的通用形式是?逻辑回归成本函数的最终形式是?逻辑回归为什么用对数损失函数计算成本函数?为什么不直接给出逻辑回归损失函数的…

Mysql基础(三)DDL之create table语句

一 create table 创表 说明: create table相关语句从功能上进行讲解补充: 前面已经讲解过相关的约束,已进行相关的铺垫声明: 参考价值较少,了解即可 ① 基本语法 思考: 约束加在哪里? ② 创建新表 强调:使…

基于单片机的机械臂运行轨迹在线控制系统设计

摘要:基于PLC的机械臂运行轨迹控制系统通过PLC采集现场信号及输出信号的状态变化实现机械臂运行轨迹的控制,不能实现多自由度机械臂控制。设计基于单片机的机械臂运行轨迹在线控制系统,系统硬件由上位机PC在线控制、主控制板和机械臂舵机控制板构成,通过光电编码器位移传感…

区块链技术与应用学习笔记(5-7节)——北大肖臻课程

​ 目录 ​BTC实现 基于交易的账本模式: UTXO集合: 交易费用: BTC网络 1.应用层: 2.网络层: 3传播层: 什么是鲁棒? BTC挖矿: 出块奖励: 挖矿难度调整&#…

如何评判一个算法的好坏,你知道吗

算法的评价指标通常包括以下几个方面: 1. **时间复杂度**:评估算法执行所需时间的量度,通常用大O符号表示。它描述了随着输入数据规模增长,算法执行时间的增长速度。 2. **空间复杂度**:评估算法执行所需存储空间的量度,也用大O符号表示。它描述了随着输入数据规模增长,…

Burp自定义插件实现请求拦截

在安全测试时,经常需要对请求进行拦截以及配置管理,以便过滤域名或路径的请求。例如:被测对象会不断收集信息(例如IP地址、设备信息)通过HTTP传给服务端。本文将介绍如何使用Burp Suite的扩展插件,通过开发…