数据结构—顺序表(如果想知道顺序表的全部基础知识点,那么只看这一篇就足够了!)

        前言:学习完了C语言的基础知识点之后,我们就需要使用我们所学的知识来进一步对存储在内存中的数据进行操作,这时候我们就需要学习数据结构。而这篇文章为数据结构中顺序表的讲解。


✨✨✨这里是秋刀鱼不做梦的BLOG

✨✨✨想要了解更多内容可以访问我的主页秋刀鱼不做梦-CSDN博客

那么我们废话不多说,直接开始讲解。

先让我们看一下讲解的大体内容有哪些:

目录

1.初识顺序表

        (1)顺序表的定义

        (2)顺序表的特点

2.顺序表的分类

        【1】静态顺序表

        【2】动态顺序表

3.顺序表的功能

4.顺序表中各种功能的实现

        【1】 初始化顺序表中的数据。

        【2】 打印顺序表中的数据。

        【3】对顺序表进行尾插(末尾插入数据)。

        【4】对顺序表进行尾删(末尾删除数据)。

         【5】对顺序表进行头插(开头插入数据)。

      【6】 对顺序表进行头删(开头删除数据)。

          【7】 对顺序表查找数据。

        【8】对顺序表数据进行修改。

        【9】指定位置插入数据

        【10】删除指定位置数据

        【11】 销毁顺序表。


1.初识顺序表

在了解顺序表的定义之前,我们需要先了解一下什么是线性表:

线性表,全名为线性存储结构。使用线性表存储数据的方式可以这样理解,即“把所有数据用一根线儿串起来,再存储到物理空间中”

在了解完线性表的概念之后,我们在来看顺序表:        

        (1)顺序表的定义

数据结构在内存中的表示通常有两种形式,一种是顺序存储,另一种是链式存储。线性表的顺序存储是指用一组地址连续的存储单元依次存储线性表的数据元素,我们把这种存储形式存储的线性表称为顺序表。

例如,使用顺序表存储集合 {1,2,3,4,5},数据最终的存储状态如图 1 所示:

由上图可知顺序表存储数据同数组非常接近。其实,顺序表存储数据使用的就是数组。       

        (2)顺序表的特点

1.  顺序表的逻辑结构和物理结构是一致的,都是连续的。

2.  顺序表中任意一个数据元素都可以随机存取,所以顺序表是一种随机存取的存储结构。

这样我们就初步的了解了顺序表。

2.顺序表的分类

        从上边我们已经了解到了顺序表存储数据使用的就是数组,而数组又分为了静态数组和动态数组,所以顺序表也顺其自然的分成了静态顺序表和动态顺序表。

我们直接使用代码来看一下两种顺序表的定义:

        【1】静态顺序表

//静态顺序表
#define SLDateType int
#define NUMBER 10
typedef struct SeqList
{SLDateType arr[NUMBER];int size;
}SL;

由上边的代码我们可以看到,静态顺序表由一个定长的数组和一个 int 类型的变量size组成(size的作用是用来记录该数组中的元素个数)。

        【2】动态顺序表

//动态顺序表
#define SLDateType int
typedef struct SeqList
{SLDateType* arr;int size;int capacity;
}SL;

由上边的代码我们可以看到,动态顺序表是由一个指针(该指针存放一个数组的地址,该数组可以使用一些方法使其长度发生变化),一个 int 类型的变量size(size的作用是用来记录该数组中的元素个数)和一个 int 类型的变量capacity组成(capacity用来记录数组的容量)。

注:当然在日常的使用或者工作中,我们大部分都是使用动态顺序表(相较于静态顺序表更加灵活)来存储数据并使用顺序表的一些功能来对数据进行操作的。

这样我们就了解了顺序表的分类和其它们的定义方式了。

3.顺序表的功能

        顺序表可以大致包含以下几个功能:

1. 初始化顺序表中的数据。

2. 打印顺序表中的数据。

3. 对顺序表进行尾插(末尾插入数据)。

4. 对顺序表进行尾删(末尾删除数据)。

5. 对顺序表进行头插(开头插入数据)。

6. 对顺序表进行头删(开头删除数据)。

7. 对顺序表查找数据。

8. 对顺序表数据进行修改。

9. 指定位置插入数据。

10. 删除指定位置数据。

11. 销毁顺序表。

这里我们只需要大致的了解顺序表又哪些功能就可以,下面我们会对这10个功能进行详细的讲解。

4.顺序表中各种功能的实现  

        接下来我们就开始对顺序表中的几个功能开始进行讲解(使用动态顺序表):

我们首先定义动态顺序表:

//动态顺序表
#define SLDateType int
typedef struct SeqList
{SLDateType* arr;int size;int capacity;
}SL;

        

        【1】 初始化顺序表中的数据。

我们直接使用代码来看一下:

//动态顺序表的初始化
void SLInit(SL* sl)
{assert(sl);sl->arr = NULL;sl->size = 0;sl->capacity = 0;
}

初始化顺序表时,我们先将数组长度设置为0(即为NULL,之后添加数据时在扩容),将元素个数和数组长度设置为0。

        【2】 打印顺序表中的数据。

我们直接使用代码来看一下:

//打印数据
void SLPrint(SL* sl)
{assert(sl);for (int i = 0; i < sl->size; i++){printf("%d ", sl->arr[i]);}printf("\n");
}

 打印数据只需要使用循环变量数组来打印就可以了。

        【3】对顺序表进行尾插(末尾插入数据)。

我们直接使用代码来看一下:

//向数据表的尾部插入数据
void SLPushBack(SL* sl, SLDateType n)
{//对传入的指针进行判断,判断是否为空指针assert(sl);//判断数组是否需要扩容if (sl->size == sl->capacity){//如果数组容量为0,则设置为5,如果不为0,则扩大为两倍int Newcapacity = sl->capacity = 0 ? 5 : 2 * (sl->capacity);SLDateType* temp = (SLDateType*)realloc(sl->arr, Newcapacity * sizeof(SLDateType));if (temp == NULL){perror("realloc is wrong");exit(1);}sl->arr = temp;temp = NULL;sl->capacity = Newcapacity;} //添加数据sl->arr[sl->size++] = n;
}

在上边的代码中我们发现,当数组满了之后,我们需要对数组进行扩容之后,在向数组中添加数据。   

  

        【4】对顺序表进行尾删(末尾删除数据)。

我们直接使用代码来看一下:

//删除顺序表尾部数据
void SLPopBack(SL* sl)
{//对传入的指针进行判断,判断是否为空指针assert(sl);//原来的数组中要有数据assert(sl->size);sl->size--;
}

对顺序表进行尾删的时候,我们根本不需要删除数组末尾的数据,我们只需要将记录元素个数的数减小1,这样我们在使用的时候就不会使用到末尾的数据了。       

         【5】对顺序表进行头插(开头插入数据)。

我们直接使用代码来看一下:

//向顺序表的头部插入数据
void SLPushFront(SL* sl, SLDateType n)
{//对传入的指针进行判断,判断是否为空指针assert(sl);//判断数组是否需要扩容if (sl->capacity == sl->size){//如果数组容量为0,则设置为5,如果不为0,则扩大为两倍int Newcapacity = sl->capacity = 0 ? 5 : 2 * (sl->capacity);SLDateType* temp = (SLDateType*)realloc(sl->arr, Newcapacity * sizeof(SLDateType));if (temp == NULL){perror("realloc is wrong");exit(1);}sl->arr = temp;temp = NULL;sl->capacity = Newcapacity;}//将所有的数据都往后移动一位for (int i = sl->size; i >=1 ; i--){sl->arr[i] = sl->arr[i-1];}//添加数据sl->arr[0] = n;sl->size++;
}

在进行对顺序表进行头插的时候,我们也需要判断数组是否可以添加一个数据,并且由于我们是头插,所以要将原来数组中所有的数据都往后移动一位

      【6】 对顺序表进行头删(开头删除数据)。

我们直接使用代码来看一下:

//删除顺序表头部数据
void SlPopFront(SL* sl)
{//对传入的指针进行判断,判断是否为空指针assert(sl);//原来的数组中要有数据assert(sl->size);//将除了第一个位置的其他位置的元素往前移动一位for (int i = 0; i<sl->size-1; i++){sl->arr[i] = sl->arr[i + 1];}sl->size--;
}

将除了第一个位置的其他位置的元素往前移动一位,这样就可以将第一位的数据进行覆盖掉,完成对顺序表进行头删的操作。  

          【7】 对顺序表查找数据。

我们直接使用代码来看一下:

//对顺序表查找数据
int SeqListFind(SL*sl, SLDateType n)
{//对传入的指针进行判断,判断是否为空指针assert(sl);  int i = 0;for (i = 0; i < sl->size; i++){if (sl->arr[i] == n){//找到则返回该值在数组中的下标return i;}}//没有查找到则返回-1return -1;  
}

我们遍历数组查找想要的数据就可以,如果没有找到,则返回-1。      

        

        【8】对顺序表数据进行修改。

我们直接使用代码来看一下:

//对顺序表数据进行修改
void SeqListModify(SL* sl, int pos, SLDateType x)
{//对传入的指针进行判断,判断是否为空指针assert(sl);  //原来的数组中要有数据assert(sl->size > 0);//检查pos下标的合法性assert(pos >= 0 && pos < sl->size); //修改pos下标处对应的数据sl->arr[pos] = x;  
}

总体的思路就是先判断是否可行后将对应位置的数据进行修改。     

        【9】指定位置插入数据

我们直接使用代码来看一下:

//在指定位置插入数据
void SeqInsert(SL* sl, int pos, SeqType n)
{//对传入的指针进行判断,判断是否为空指针assert(sl);//判断指定位置的合理性assert(pos >= 0 && pos <= sl->size);//判断是否需要扩容if (sl->size == sl->capacity){int newcapacity = (sl->capacity == 0 ? 5 : 2 * (sl->capacity));SeqType* temp = (SeqType*)realloc(sl, newcapacity * sizeof(SeqType));if (temp == NULL){perror("realloc fail");exit(1);}sl = temp;temp = NULL;sl->capacity = newcapacity;}//添加数据for (int i = sl->size - 1;i>=pos; i--){sl->arr[i + 1] = sl->arr[i];}sl->arr[pos] = n;sl->size++;
}

在指定位置插入数据时,我们需要判断位置的合理性,即是否是在可以插入的位置进行插入,判断完后,我们判断是否需要扩容,判断完后我们进行数据的插入。    

        【10】删除指定位置数据

我们直接使用代码来看一下:

//删除指定位置数据
void SeqListErase(SL* sl, int pos)
{//对传入的指针进行判断,判断是否为空指针assert(sl);//顺序表不能为空assert(sl->size > 0);  //检查pos下标的合法性assert(pos >= 0 && pos < sl->size);  //将pos位置后面的数据依次向前挪动一位,完成覆盖for (int i = pos + 1; i < sl->size; i++)  {sl->arr[i - 1] = sl->arr[i];}//存储的数据-1sl->size--;  
}

对于删除指定位置数据,我们只需要将指定位置数据后面的数据全部向前移动一位完成覆盖即可。        

        【11】 销毁顺序表。

我们直接使用代码来看一下:

//销毁顺序表
void SLDelete(SL* sl)
{//将创建的数据空间进行回收assert(sl);if (sl->arr){free(sl->arr);sl->arr = NULL;}sl->size = sl->capacity = 0;
}

从上边的代码中我们知道,我们开创的数组的空间是由malloc函数开辟的,所以在使用完顺序表之后要对该空间进行归还。


以上就是顺序表的全部内容了~~~

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

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

相关文章

一、OpenCvSharp环境搭建

一、Visual Studio 创建新项目 二、选择Windows窗体应用&#xff08;.NET Framework&#xff09; 直接搜索模板&#xff1a;Windows窗体应用(.NET Framework) 记得是C#哈&#xff0c;别整成VB(Visual Basic)了 PS&#xff1a;若搜索搜不到&#xff0c;直接点击安装多个工具和…

MemoryAnalyzer分析OpenJ9上的phd格式文件

在做excel大数据写入时&#xff0c;发生内存泄漏 core.20240412.093703.1.0001.dmp heapdump.20240412.093703.1.0002.phd需要分析heap dump文件 mat本身不支持&#xff0c;需要我们下载插件 https://public.dhe.ibm.com/ibmdl/export/pub/software/websphere/runtimes/tools…

同等学力申硕-计算机专业-历年真题及其他资料分享

同等学力申请硕士学位考试是比较适合在职人员的提升学位方式&#xff0c;了解过的人应该都知道&#xff0c;现在社会的竞争压力越来越大&#xff0c;为了提高职业生存能力&#xff0c;提升学位在所难免。 我将与大家分享一份珍贵的复习资料&#xff1a;这不仅是我个人备考的心…

Docker Desktop修改镜像存储路径 Docker Desktop Start ... 卡死

1、CMD执行wsl -l -v --all 2、Clean / Purge data 3、导出wsl子系统镜像: wsl --export docker-desktop D:\docker\wsl\distro\docker-desktop.tar wsl --export docker-desktop-data D:\docker\wsl\data\docker-desktop-data.tar4、删除现有的wsl子系统&#xff1a; wsl -…

Springboot集成RabbitMq+延时队列

1. 引入jar包 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</artifactId> </dependency> 2.配置yml 2.1 配置生产者yml spring:rabbitmq:host: localhostport: 5672virtual-host: …

主题换肤操作

有许多项目会遇见有light和dark多种颜色方案展示&#xff0c;如下&#xff1a; 这种是怎么实现的呢&#xff1f; 方案1&#xff1a;采用css变量来实现 /* 默认粉色主题 */ :root {--underline-dark: #000d8a;--gray-light: 229, 233, 240;--gray-dark: 34, 41, 57;--black: 1…

华为远程登陆管理配置:轻松掌握核心要点

实验拓扑及需求 实验步骤 A、配置相关地址及连通性测试 R1&#xff1a; [R1]int GigabitEthernet 0/0/0 [R1-GigabitEthernet0/0/0]ip address 192.168.12.1 24 R2&#xff1a; [R2]int gi 0/0/0 [R2-GigabitEthernet0/0/0]ip add 192.168.12.2 24 [R2]int gi 0/0/1 […

如何将对象转换成json字符串,以json格式输出,并获取到其中的特定字段

小王学习录 Json格式示例 1&#xff1a;简单的 JSON 对象示例 2&#xff1a;JSON 对象嵌套示例 3&#xff1a;JSON 数组示例 4&#xff1a;混合使用对象和数组 使用Gson将java对象转换成json字符串哪些数据类型的对象可以使用Gson转换为json字符串如何使用Gson将java对象转换成…

go语言学习--3.常用语句

目录 1.条件语句 1.1 if语句 1.2 if-else语句 1.3 switch语句 1.4 select语句 2.循环语句 2.1循环处理语句 2.2循环控制语句 3.go语言关键字 1.条件语句 和c语言类似&#xff0c;相关的条件语句如下表所示&#xff1a; 1.1 if语句 if 布尔表达式 {/* 在布尔表达式为 t…

小红的白色字符串

题目描述 小红拿到了一个字符串&#xff0c;她准备将一些字母变成白色&#xff0c;变成白色的字母看上去就和空格一样&#xff0c;这样字符串就变成了一些单词。 现在小红希望&#xff0c;每个单词都满足以下两种情况中的一种&#xff1a; 1.开头第一个大写&#xff0c;其余为…

echarts折线图自定义打点标记小工具

由于没研究明白echarts怎么用label和lableLine实现自定义打点标记&#xff0c;索性用markPoint把长方形压扁成线模拟了一番自定义打点标记&#xff0c;记录下来备用。&#xff08;markLine同理也能实现&#xff09; 实现代码如下&#xff1a; <!DOCTYPE html> <html…

C#基础--之数据类型

C#基础–之数据类型 在第一章我们了解了C#的输入、输出语句后&#xff0c;我这一节主要是介绍C#的基础知识&#xff0c;本节的内容也是后续章节的基础&#xff0c;好的开端等于成功的一半。在你阅读完本章后&#xff0c;你就有足够的C#知识编写简单的程序了。但还不能使用封装、…

电视盒子哪个好?2024口碑网络电视盒子排行榜

多年来电视盒子始终占据重要地位&#xff0c;功能上并没有受到影响。在这么多品牌中哪些电视盒子的评价是最好的呢&#xff1f;小编根据各大电商平台的用户评价情况整理了口碑最好的网络电视盒子排行榜&#xff0c;跟着小编一起看看市面上的电视盒子哪个好吧。 TOP 1&#xff1…

OpenHarmony 资源调度之内存管理源码分析

作者&#xff1a;张守忠 1 内存管理简介 内存管理部件位于全局资源调度管控子系统中&#xff0c;基于应用的生命周期状态&#xff0c;更新进程回收优先级列表&#xff0c;通过内存回收、查杀等手段管理系统内存&#xff0c;保障内存供给。 1.1 内存管理框架 内存管理部件主要…

外贸开发信必知技巧:高回复率不再是梦

外贸行业在Zoho的客户群体中占比较高。因为我们的国际化背景、丰富的产品组合、多语言多币种跨时区、高性价比等特点&#xff0c;成为外贸企业开展业务的选择。在和外贸客户沟通中&#xff0c;发现无论是外贸大拿还是新手小白&#xff0c;大家遇到一个共同的问题——发出去的开…

抖音上阳哥的视频号带货推荐靠谱吗?

在抖音这个短视频平台的广阔天地里&#xff0c;阳哥以其独到的眼光和精准的推荐&#xff0c;成为了众多粉丝心中的带货指南。不同于一些网红直接进行视频号带货&#xff0c;阳哥更多地是以一个推荐人的身份出现&#xff0c;为粉丝们筛选并推荐优质的带货内容。那么&#xff0c;…

python——列表(list)

概念 列表一般使用在一次性存储多个数据 语法 lst[数据1&#xff0c;数据2&#xff0c;.....]方法 #mermaid-svg-flVxgVdpSqFaZyrF {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-flVxgVdpSqFaZyrF .error-icon{…

图像版PDF文件OCR识别转换为文本的3款免费工具软件

图像版PDF文件里面都是图片&#xff0c;要先通过OCR技术识别出文本&#xff0c;然后才能进行进一步处理编辑。下面是3个免费的PDF文件OCR识别软件工具&#xff1a; ●简可信PDF批量识别工具 简可信PDF批量识别工具是一款专门用于将PDF文件进行批量OCR&#xff08;光学字符识别…

ObjectiveC-第一部分-基础入门-学习导航

专题地址:MacOS一站式程序开发系列专题 第一部分:基础入门学习导航 OSX-01-Mac OS应用开发概述:简单介绍下MacOS生态、Xcode使用以及使用Xcode创建app的方法OSX-02-Mac OS应用开发系列课程大纲和章节内容设计:介绍下此系列专题的文章内容组织形式以及此系列专题的覆盖内容…