【数据结构】——顺序表详解

大家好!当我们学习了动态内存管理后,就可以写一个管理数据的顺序表了!!!

顺序表的理解:

线性表是最基本、最简单、也是最常用的一种数据结构。线性表(linear list)是数据结构的一种,一个线性表是n个具有相同特性的数据元素的有限序列。

顺序表是在计算机内存中以数组的形式保存的线性表,线性表的顺序存储是指用一组地址连续的存储单元依次存储线性表中的各个元素、使得线性表中在逻辑结构上相邻的数据元素存储在相邻的物理存储单元中,即通过数据元素物理存储的相邻关系来反映数据元素之间逻辑上的相邻关系,采用顺序存储结构的线性表通常称为顺序表。顺序表是将表中的结点依次存放在计算机内存中一组地址连续的存储单元中。

在这里插入图片描述

静态顺序表就是像数组一样的大小固定的,动态的可以在容量不够时进行扩容而达到能够存储大量数据的效果!!!

一、先创建一个结构体来表示顺序表

typedef int DATE;//重命名顺序表的数据类型
typedef struct ArrayList {DATE* date;size_t size;//顺序表长度size_t capacity;//顺序表容量
}AL;

二、顺序表的所有接口展示

void Init(AL* al);
void checkCapacity(AL* al);
void pushBack(AL* al, DATE info);
void pushFront(AL* al, DATE info);
void insertDate(AL* al,size_t pos, DATE info);
void printDate(AL* al);
void Erase(AL* al, size_t pos);
void PopBack(AL* al);
void PopFront(AL* al);
size_t FindDate(AL* al, DATE info);
void ExchangeDate(AL* al, size_t pos, DATE info);
void Deatory(AL* al);

三、每个接口功能介绍及实现原理

1、初始化函数的实现

void Init(AL* al)
{assert(al);al->size = 0;al->capacity = 4;//初始化容量为4DATE* tmp = (DATE*)malloc(sizeof(DATE) * al->capacity);if (tmp == NULL){perror("malloc fail");exit(-1);}al->date = tmp;
}

初始化顺序表的长度为0、容量为4!

2、检查容量函数的实现

void checkCapacity(AL* al)
{if (al->size == al->capacity){DATE* tmp = (DATE*)realloc(al->date, sizeof(DATE) * al->capacity*2);if (tmp == NULL){perror("realloc fail");exit(-1);}al->capacity *= 2;al->date = tmp;printf("扩容成功!\n");}
}

如果长度等于容量时就说明需要扩容了,就将容量扩到2倍大小

3、尾插函数的实现

void pushBack(AL* al, DATE info)
{assert(al);checkCapacity(al);al->date[al->size] = info;al->size++;
}

每次插入之前一定要检查容量
尾插就是在size尾位置写入需要插入的值,然后要对长度进行加一
在这里插入图片描述

4、头插函数的实现

void pushFront(AL* al, DATE info)
{assert(al);checkCapacity(al);if (al->size == 0){al->date[0] = info;al->size++;}else{size_t end = al->size;while (end){al->date[end] = al->date[end-1];end--;}al->date[0] = info;al->size++;}
}

头插一个数据,必须将后面的数据向后面移动,移动的过程中可能超过容量大小,所以在插入时都需要进行扩容判断

在这里插入图片描述

挪动方法如上

在这里插入图片描述

5、尾删函数

void PopBack(AL* al)
{assert(ps);assert(al->size > 0);al->size--;
}

将长度减一即可删除最后一个数据

6、头删函数

void PopFront(AL* al)
{assert(al->size > 0);int begin = 1;while (begin<al->size){al->date[begin - 1] = al->date[begin];begin++;}al->size--;
}

挪动顺序方法如下:
在这里插入图片描述
定义一个变量begin=1,首先是要将数据2移动到数据1的位置,对应的操作是
al->date[begin - 1] = al->date[begin];然后begin++,依次将数据3挪到数据2的位置,数据4挪到数据3的位置。循环最后一次是将数据5挪到数据4的位置,也就是begin=4,al->size=5.则循环判断条件为beginsize,循环结束后将
al->size–;

在这里插入图片描述

7、任意位置删除数据函数的实现

void Erase(AL* al, size_t pos)
{assert(al);assert(pos >= 0 && pos <= al->size);if (al->size == 0){printf("暂无数据!!\n");return;}size_t end = pos;while (end<al->size-1){![在这里插入图片描述](https://img-blog.csdnimg.cn/a1a63c6776c142eeb77e15536b8f9a53.png#pic_center)al->date[end] = al->date[end + 1];end++;}al->size--;
}

删除一个数据,就要将这个位置之后的元素全部向前挪动一个位置
由于下标易班都有size_t表示,所以一个要把握好头删时出现无符号-1和0循环条件比较大小的情况

如果我们要删除数3,然后数据3后面的数据向前挪动,第一步就是将数据4移动到数据3的位置,定义一个变量end=pos=2;对应的操作为al->date[end] = al->date[end+1];,然后end++;将数据5移动到最开始数据4的地方。最后一次循环是将数据5移动到数据4的地方,也就是end最后等于3,al->size=5,则循环判断条件是end< al->size-1,循环结束将al->size–;

在这里插入图片描述

8、任意位置插入数据函数的实现

void insertDate(AL* al, size_t pos, DATE info)
{assert(al);assert(pos >= 0 && pos <= al->size);checkCapacity(al);int end = al->size;while (end > pos){al->date[end] = al->date[end - 1];end--;}al->date[pos] = info;al->size++;
}

由于下标易班都有size_t表示,所以一个要把握好头插时出现无符号-1和0循环条件比较大小的情况

在这里插入图片描述

任意位置插入需要将插入位置及其以后的数据一次向后挪动一个位置!

9、头插头删和头删尾删函数的改进

我们写完任意插和任意删后,就可以对头插头删和头删尾删函数的改进,直接在他们的函数体里面调用任意插入和任意删除函数

void pushFront(AL* al, DATE info)
{assert(al);checkCapacity(al);if (al->size == 0){al->date[0] = info;al->size++;}else{insertDate(al, 0, info);}
}
void pushBack(AL* al, DATE info)
{assert(al);checkCapacity(al);insertDate(al, al->size, info);
}
void PopBack(AL* al)
{assert(al);if (al->size == 0){printf("暂无数据!!\n");return;}Erase(al, al->size);}
void PopFront(AL* al)
{assert(al);if (al->size == 0){printf("暂无数据!!\n");return;}Erase(al, 0);
}

头插就是调用insert函数在0位置插入
尾插就是调用insert函数在size位置插入
头删就是调用Erase函数删除0位置
尾删就是调用Erase函数删除size位置

10、查找数据函数实现

size_t FindDate(AL* al, DATE info)
{assert(al);for (size_t i = 0; i < al->size; i++){if (al->date[i] == info)return i;}return -1;
}

依次便利顺序表,如果找到需要查找的数据,咋返回其下标,否则返回-1

11、修改数据

void ExchangeDate(AL* al, size_t pos, DATE info)
{assert(al);assert(pos >= 0 && pos <= al->size);al->date[pos] = info;
}

先查找要修改的数据是否存在,然后进行修改
他一般会和查找函数配合使用

在这里插入图片描述

12、销毁顺序表

由于顺序表开辟了堆区内存,所以我们在使用完顺序表后一定要对开辟的内存进行释放!

void Deatory(AL* al)
{assert(al);free(al->date);al->date=NULL;al->capacity = al->size = 0;
}

销毁一个顺序表,将顺序表的容量置为0,顺序表的有效数据个数置为0,将date指针所指向的动态开辟的内存空间释放了,由于释放了动态开辟的内存空间,所有p指向的空间未初始化,date成为野指针,为了防止野指针,将date置为空指针。

数据结构篇之——顺序表的分享到这里就结束了,感谢大家的浏览访问!!!

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

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

相关文章

青藏高原1-km分辨率生态环境质量变化数据集(2000-2020)

青藏高原平均海拔4000米以上&#xff0c;人口1300万&#xff0c;是亚洲九大河流的源头&#xff0c;为超过15亿人口提供淡水、食物和其他生态系统服务&#xff0c;被誉为地球第三极和亚洲水塔。然而&#xff0c;在该地区的人与自然的关系的研究是有限的&#xff0c;尤其是在精细…

高德地图根据两点的经纬度计算两点之间的距离(修正版)

SQL语句可以用来计算两个经纬度之间的距离。下面是一个示例的SQL语句&#xff1a; SELECT id, ( 6371 * ACOS( COS( RADIANS( lat1 ) ) * COS( RADIANS( lat2 ) ) * COS( RADIANS( lng2 ) - RADIANS( lng1 ) ) SIN( RADIANS( lat1 ) ) * SIN( RADIANS( lat2 ) ) ) ) AS dista…

PyTorch - 模型训练损失 (Loss) NaN 问题的解决方案

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/133378367 在模型训练中&#xff0c;如果出现 NaN 的问题&#xff0c;严重影响 Loss 的反传过程&#xff0c;因此&#xff0c;需要加入一些微小值…

【SQL Server】外键约束

外键约束 前序外键约束 前序 在很多场景里面&#xff0c;都会用到外键来关联两张表或两张以上的表之间主从关系&#xff0c;从而来快捷地通过外键字段来查询数据之间的联系。 其实外键在我的概念中还是比较模糊的&#xff0c;没有真正地使用过。大多数情况下&#xff0c;我都…

Pandas 2.1中的新改进和新功能

大家好&#xff0c;Pandas 2.1于2023年8月30日发布&#xff0c;跟随本文一起看看这个版本引入了哪些新内容&#xff0c;以及它如何帮助用户改进Pandas的工作负载&#xff0c;包含了一系列改进和一组新的弃用功能。 Pandas 2.1在Pandas 2.0中引入的PyArrow集成基础上进行了大量…

【RabbitMQ实战】07 3分钟部署一个RabbitMQ集群

一、集群的安装部署 我们还是利用docker来安装RabbitMQ集群。3分钟安装一个集群&#xff0c;开始。 前提条件&#xff0c;docker安装了docker-compose。如果没安装的话&#xff0c;参考这里 docker-compose文件参考bitnami官网&#xff1a;https://github.com/bitnami/contai…

巧用@Conditional注解根据配置文件注入不同的bean对象

项目中使用了mq&#xff0c;kafka两种消息队列进行发送数据&#xff0c;为了避免硬编码&#xff0c;在项目中通过不同的配置文件自动识别具体消息队列策略。这里整理两种实施方案&#xff0c;仅供参考&#xff01; 方案一&#xff1a;创建一个工具类&#xff0c;然后根据配置文…

Swift 周报 第三十八期

文章目录 前言新闻和社区苹果自研调制解调器芯片受挫&#xff1a;速度太慢容易过热&#xff0c;落后高通 3 年App Store 现已接受适用于最新版操作系统的 App 和游戏提交 提案通过的提案正在审查的提案驳回的提案 Swift论坛推荐博文话题讨论关于我们 前言 本期是 Swift 编辑组…

弹性资源组件elastic-resource设计(一)-架构

简介 弹性资源组件提供动态资源能力,是分布式系统关键基础设施,分布式datax,分布式索引,事件引擎都需要集群和资源的弹性资源能力,提高伸缩性和作业处理能力。 本文介绍弹性资源组件的设计,包括架构设计和详细设计,指导开发人员代码开发 关键词 作业管理器/资源管理器/…

duilib 之 各种消息框

本文主要介绍,使用同一个布局文件,生成不同样式消息框是如何实现的。 目录 一、消息框 1、不同消息框展示 2、实现方式 1)、布局, 2)、扩展 MsgB

简易实现通讯录(2.0)

这篇文章是在上期实现的通讯录基础上&#xff0c;增加了自动增容的功能&#xff0c;也解决了一开始通讯录自动开辟一个空间&#xff0c;可能会浪费空间&#xff0c;或者是信息过多无法增容的痛点&#xff0c;由于我们使用的是malloc这类函数来开辟空间&#xff0c;我们也需要来…

vue 实现弹出菜单,解决鼠标点击其他区域的检测问题

弹出菜单应该具有的功能&#xff0c;当鼠标点击其他区域时&#xff0c;则关闭该菜单。 问题来了&#xff0c;怎么检测鼠标点击了其他区域而不是当前菜单&#xff1f; 百度“JS检测区域外的点击事件”&#xff0c;会发现有很多方法&#xff0c;有递归检测父元素&#xff0c;有遍…

大语言模型LLM知多少?

你知道哪些流行的大语言模型?你都体验过哪写? GPT-4,Llamma2, T5, BERT 还是 BART? 1.GPT-4 1.1.GPT-4 模型介绍 GPT-4(Generative Pre-trained Transformer 4)是由OpenAI开发的一种大型语言模型。GPT-4是前作GPT系列模型的进一步改进,旨在提高语言理解和生成的能力,…

Centos 7安装pm2 , 操作等常用命令

Centos 7安装pm2 1、首先需要安装node&#xff0c;node安装教程前一篇已经说了&#xff0c;是安装pm2 [rootlocalhost ~]# npm install -g pm2 2、pm2 命令参考 复制代码 2.1 启动进程/应用 pm2 start bin/www 或 pm2 start app.js 2.2 重命名进程/应用 pm2 start app.js -…

Blender导出FBX给UE5

最近在学习UE5的资源导入&#xff0c;总结如下&#xff1a; 建模使用Blender&#xff0c;UE5版本是5.3 1.纯静态模型导入UE5 Blender FBX导出设置保持默认即可&#xff0c; UE5把导入设置里Miscellaneous下Force Front XAxis和Convert Scene Unit勾选即可 2.带骨骼动画的模型…

ios项目安装hermes-engine太慢问题

问题说明 ios工程&#xff0c;在使用"pod install"安装依赖的时候&#xff0c;由于超时总是报错 $ pod install ... Installing hermes-engine (0.71.11)[!] Error installing hermes-engine [!] /usr/bin/curl -f -L -o /var/folders/4c/slcchpy55s53ysmz_1_q_gzw…

react项目优化

随着项目体积增大&#xff0c;打包的文件体积会越来越大&#xff0c;需要优化&#xff0c;原因无非就是引入的第三方插件比较大导致&#xff0c;下面我们先介绍如何分析各个文件占用体积的大小。 1.webpack-bundle-analyzer插件 如果是webpack作为打包工具的项目可以使用&…

MySQL 连接查询(多表查询 二)

基本介绍 作用&#xff1a;连接查询&#xff08;Join&#xff09;操作&#xff0c;用于联结多个表以获取更全面和准确的数据 基本分类&#xff1a; 内连接&#xff1a;相当于查询A、B交集部分数据&#xff08;去掉迪卡尔积无效组合&#xff09;外连接&#xff1a; 左外连接&…

Docker方式创建MySQL8的MGR集群

目录 一、MGR简述二、安装环境及要求2.1 系统版本2.2 网络要求 三、安装步骤3.1 创建容器3.2 创建用户3.3 安装插件3. 4 启动集群3.5 加入集群 四、查看集群查看 MGR 组成员列表查看 MGR 组成员拓扑信息 五、其他说明集群配置要求集群配置限制集群相关变量和状态 一、MGR简述 …

lwIP 开发指南(下)

目录 NETCONN 编程接口简介netbuf 数据缓冲区netconn 连接结构netconn 编程API 函数 NETCONN 编程接口UDP 实验NETCONN 实现UDPNETCONN 接口的UDP 实验硬件设计软件设计下载验证 NETCONN 接口编程TCP 客户端实验NETCONN 实现TCP 客户端连接步骤NETCONN 接口的TCPClient 实验硬件…