大话数据结构学习笔记-线性表(二)-顺序存储结构

顺序存储定义

线性表的顺序存储结构,指的是用一段地址连续的存储单元一次存储线性表的数据元素。一般就是用一维数组来实现。

顺序存储结构定义

描述顺序存储结构的线性表需要以下三个属性
1)存储空间的起始位置:数组data。它的存储位置就是存储空间的存储位置
2)线性表的最大存储容量:数组长度MAX_SIZE
3)线性表的当前长度:length

结构代码如下

public class ArrayList<T>
{/// <summary>/// 存储空间初始分配量/// </summary>public const int MAX_SIZE = 20;/// <summary>/// 数组,存储数据元素/// </summary>private T[] _data;/// <summary>/// 线性表当前长度/// </summary>private int _length;
}

顺序存储结构的基本操作

初始化

工欲善其事必先利其器,如果要进行线性表的各种操作,首要任务肯定是要先创建一个线性表。
对于顺序存储的线性表来说,创建操作主要为以下两步
1)初始化数组,为数组分配MAX_SIZE的内存
2)初始化长度为0
初始化操作代码如下:

/// <summary>
/// 初始化一个线性表
/// </summary>
/// <returns>初始化后的线性表</returns>
public IList<T> Init()
{//1)初始化数组,为数组分配MAX_SIZE的内存_data = new T[MAX_SIZE];//2)初始化长度为0_length = 0;return this;
}

获取元素

对于线性表的顺序存储结构来说,如果我们要实现GetElem操作,其实就是将第i个位置的元素返回即可,对应代码中也就是返回data[i-1]。这里要注意返回之前要先判断位置i有没有超过当前线性表的长度。可分为以下两步:
1)如果获取元素的位置不合适(小于0或者大于当前线性表长度),抛出异常
2)返回第i个位置的元素
获取元素操作代码如下:

/// <summary>
/// 获取第i个位置的元素
/// </summary>
/// <param name="i">元素的位置</param>
/// <returns>待获取元素</returns>
/// <exception cref="ArgumentException"></exception>
public T GetElem(int i)
{//1)如果获取元素的位置不合适(小于0或者大于当前线性表长度),抛出异常if(i < 1 || i > _length){throw new ArgumentException("位置必须大于0,且必须小于等于当前线性表的长度");}//2)返回第i个位置的元素return _data[i-1];
}

插入操作

对于顺序存储存储线性表来说,插入操作主要是以下5步
1)如果插入的位置不合适(小于0或者大于当前线性表长度),抛出异常
2)如果线性表长度大于等于数组长度,则抛出异常,或者动态扩容。
3)从最后一个位置元素开始向前遍历到第i个位置,分别将它们都向后移动一个位置。
4)将要插入元素填入位置i处。
5)线性表当前长度+1
插入操作代码如下:

/// <summary>
/// 插入元素
/// </summary>
/// <param name="e">待插入元素</param>
/// <param name="i">插入的位置</param>
/// <exception cref="ArgumentException"></exception>
public void Insert(T e, int i)
{//1)如果插入的位置不合适(小于0或者大于当前线性表长度),抛出异常if (i < 1 || i > _length){throw new ArgumentException("位置必须大于0,且必须小于等于当前线性表的长度");}//2)如果线性表长度大于等于数组长度,则抛出异常,或者动态扩容。if (_length >= _data.Length){T[] newData = new T[_data.Length * 2];for(int j=0;j<_length;j++){newData[j] = _data[j];}_data = newData;}//3)从最后一个位置元素开始向前遍历到第i个位置,分别将它们都向后移动一个位置。for (int j=_length-1;j>=i-1;j--){_data[j+1] = _data[j];}//4)将要插入元素填入位置i处。_data[i - 1] = e;//5)线性表当前长度+1_length++;
}

删除操作

顺序存储结构的线性表删除操作可分为以下几步:
1)如果删除的位置不合适(小于0或者大于当前线性表长度),抛出异常。
2)取出删除元素。
3)从删除元素位置开始遍历到最后一个元素位置,分别将它们都向前移动一个位置。
4)线性表当前长度-1
5)返回删除元素
删除操作代码如下:

/// <summary>
/// 删除第i个位置的元素
/// </summary>
/// <param name="i">删除元素的位置</param>
/// <returns>删除的元素</returns>
/// <exception cref="ArgumentException"></exception>
/// <exception cref="Exception"></exception>
public T Delete(int i)
{//1)如果删除的位置不合适(小于0或者大于当前线性表长度),抛出异常。if (i < 1 || i > _length){throw new ArgumentException("位置必须大于0,且必须小于等于当前线性表的长度");}if (_length == 0){throw new Exception("线性表为空");}//2)取出删除元素。T retEle = _data[i-1];//3)从删除元素位置开始遍历到最后一个元素位置,分别将它们都向前移动一个位置。for(int j=i;j<_length;j++){_data[j - 1] = _data[j];}//4)线性表当前长度-1_length--;//5)返回删除元素return retEle;}

定位元素操作

定位元素操作,就是定位要查找的元素在线性表中的位置,可分为以下几步:
1)从第一个元素开始遍历到最后一个元素,如果遍历的元素与要查找元素相等,则返回这个位置
2)如果整个遍历都没有返回,说明线性表中没有这个元素,返回0
查找元素操作代码如下:

/// <summary>
/// 定位元素
/// </summary>
/// <param name="e">要定位的元素</param>
/// <returns>定位元素的位置</returns>
public int LocateElem(T e)
{//1)从第一个元素开始遍历到最后一个元素,如果遍历的元素与要查找元素相等,则返回这个位置for (int i=0;i<_length;i++){if (_data[i].Equals(e)){return i+1;}}//2)如果整个遍历都没有返回,说明线性表中没有这个元素,返回0return 0;
}

其他操作

对于顺序存储的线性表来说,获取长度直接返回length即可;清空线性表就是将length置0;判断线性表是否为空就是判断length是否等于0。
线性表的剩余操作的代码如下:

/// <summary>
/// 清空线性表
/// </summary>
public void Clear()
{_length = 0;
}/// <summary>
/// 判断线性表是否为空
/// </summary>
/// <returns>为空返回true,否则返回false</returns>
public bool Empty()
{return _length == 0;
}/// <summary>
/// 获取线性表的长度
/// </summary>
/// <returns>线性表的长度</returns>
public int Length()
{return _length;
}

完整代码

namespace DataStructLearning.List;public class ArrayList<T> : IList<T>
{/// <summary>/// 存储空间初始分配量/// </summary>public const int MAX_SIZE = 20;/// <summary>/// 数组,存储数据元素/// </summary>private T[] _data;/// <summary>/// 线性表当前长度/// </summary>private int _length;/// <summary>/// 清空线性表/// </summary>public void Clear(){_length = 0;}/// <summary>/// 判断线性表是否为空/// </summary>/// <returns>为空返回true,否则返回false</returns>public bool Empty(){return _length == 0;}/// <summary>/// 获取线性表的长度/// </summary>/// <returns>线性表的长度</returns>public int Length(){return _length;}/// <summary>/// 定位元素/// </summary>/// <param name="e">要定位的元素</param>/// <returns>定位元素的位置</returns>public int LocateElem(T e){//1)从第一个元素开始遍历到最后一个元素,如果遍历的元素与要查找元素相等,则返回这个位置for (int i=0;i<_length;i++){if (_data[i].Equals(e)){return i+1;}}//2)如果整个遍历都没有返回,说明线性表中没有这个元素,返回0return 0;}/// <summary>/// 删除第i个位置的元素/// </summary>/// <param name="i">删除元素的位置</param>/// <returns>删除的元素</returns>/// <exception cref="ArgumentException"></exception>/// <exception cref="Exception"></exception>public T Delete(int i){//1)如果删除的位置不合适(小于0或者大于当前线性表长度),抛出异常。if (i < 1 || i > _length){throw new ArgumentException("位置必须大于0,且必须小于等于当前线性表的长度");}if (_length == 0){throw new Exception("线性表为空");}//2)取出删除元素。T retEle = _data[i-1];//3)从删除元素位置开始遍历到最后一个元素位置,分别将它们都向前移动一个位置。for(int j=i;j<_length;j++){_data[j - 1] = _data[j];}//4)线性表当前长度-1_length--;//5)返回删除元素return retEle;}/// <summary>/// 获取第i个位置的元素/// </summary>/// <param name="i">元素的位置</param>/// <returns>待获取元素</returns>/// <exception cref="ArgumentException"></exception>public T GetElem(int i){//1)如果获取元素的位置不合适(小于0或者大于当前线性表长度),抛出异常if (i < 1 || i > _length){throw new ArgumentException("位置必须大于0,且必须小于等于当前线性表的长度");}//2)返回第i个位置的元素return _data[i - 1];}/// <summary>/// 初始化一个线性表/// </summary>/// <returns>初始化后的线性表</returns>public IList<T> Init(){//1)初始化数组,为数组分配MAX_SIZE的内存_data = new T[MAX_SIZE];//2)初始化长度为0_length = 0;return this;}/// <summary>/// 插入元素/// </summary>/// <param name="e">待插入元素</param>/// <param name="i">插入的位置</param>/// <exception cref="ArgumentException"></exception>public void Insert(T e, int i){//1)如果插入的位置不合适(小于0或者大于当前线性表长度),抛出异常if (i < 1 || i > _length){throw new ArgumentException("位置必须大于0,且必须小于等于当前线性表的长度");}//2)如果线性表长度大于等于数组长度,则抛出异常,或者动态扩容。if (_length >= _data.Length){T[] newData = new T[_data.Length * 2];for(int j=0;j<_length;j++){newData[j] = _data[j];}_data = newData;}//3)从最后一个位置元素开始向前遍历到第i个位置,分别将它们都向后移动一个位置。for (int j=_length-1;j>=i-1;j--){_data[j+1] = _data[j];}//4)将要插入元素填入位置i处。_data[i - 1] = e;//5)线性表当前长度+1_length++;}
}

顺序存储结构的优缺点

优点

1)无需为表示表中元素之间的逻辑关系而增加额外的存储空间
2)可以快速的存取表中任意位置的元素。

缺点

1)插入和删除操作需要移动大量元素
2)当线性表长度变化较大时,难以确定存储空间的容量
3)造成存储空间的“碎片”

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

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

相关文章

L1正则化的数学公式

L1正则化是机器学习和统计学中常用的正则化技术&#xff0c;用于控制模型的复杂度并防止过拟合。它们的数学表达如下&#xff1a; L1正则化&#xff08;也称为Lasso正则化&#xff09;&#xff1a;在损失函数中添加模型参数的绝对值之和作为正则化项。其数学公式如下所示&…

利用地图资源工具让Sentinel-2自动生成NDVI\EVI

新版地图资源工具已经能自动计算EVI了&#xff0c;也就是现在工具可以自动计算NDVI、EVI及做哨兵L1C数据的自动预处理&#xff01;只要勾选如下选项后数据下载的同时会自动生成NDVI、EVI&#xff01; 归一化差异植被指数 (NDVI) 由于植被在近红外波段处有较强的反射&#…

Training - PyTorch Lightning 的 Horovod 策略实践 (all_gather)

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://blog.csdn.net/caroline_wendy/article/details/137686312 在 PyTorch Lightning 中使用 Horovod 策略&#xff0c;可以在多个 GPU 上并行训练模型。Horovod 是分布式训练框架&#xff…

Oladance、南卡、漫步者开放式耳机好不好用?3大当红明星产品测评PK

​在音频市场中&#xff0c;开放式耳机以其创新设计和卓越听感赢得了一定的关注。然而&#xff0c;也存在一些产品质量和音质不尽人意&#xff0c;甚至可能影响用户听力安全。作为一名专业的音频设备评测师&#xff0c;我建议用户在选择开放式耳机时&#xff0c;应优先选择那些…

《R语言与农业数据统计分析及建模》学习——控制流

1、控制流的概念和作用 控制流是指根据循环或条件来控制程序的执行顺序和逻辑。 2、循环语句 循环语句允许程序重复执行特定的代码块&#xff0c;知道满足特定条件。 在R语言中&#xff0c;常见的循环语句有for、while和repeat。 # for循环用于在已知次数的情况下重复执行代码…

磁盘的管理

会在linux中使用硬盘 分区 格式化&#xff08;重新安装文件系统&#xff09; 挂载 硬盘的分类 1.机械硬盘 2.固态硬盘 硬盘的数据结构 扇区&#xff1a;盘片被分为多个扇形区域&#xff0c;每个扇区存放512字节的 数据 &#xff08;扇区越多容量越大&#xff09; 存放数据的…

2024.4.13 Python 爬虫复习day01

目录 day01_HTTP协议HTML页面web服务器 各类名词解释 URL统一资源定位符 HTTP协议 HTML页面 知识点: 第一个页面 标题标签和图片标签 注册页面 登录页面 WEB服务器 安装fastapi和uvicorn 原始命令方式 镜像源命令方式 工具方式 快速搭建web服务器 知识点: 示例…

openGauss学习笔记-266 openGauss性能调优-TPCC性能调优测试指导-文件系统配置

文章目录 openGauss学习笔记-266 openGauss性能调优-TPCC性能调优测试指导-文件系统配置266.1 查看当前数据盘的文件系统类型266.2 对于需要修改的磁盘&#xff0c;备份所需的数据至其他磁盘或其他服务器266.3 格式化磁盘为xfs文件系统266.4 执行**步骤一** openGauss学习笔记-…

你见过哪些目瞪口呆的 Java 代码技巧?

自从毕业后&#xff0c;今年已经是我工作的第 8 个年头了&#xff0c;我甚至都快忘记了到底是那年毕业的。从出来本人一直在做 Java 相关的工作&#xff0c;现在终于有时间坐下来&#xff0c;写一篇关于 Java 写法的一篇文章&#xff0c;来探讨一下如果你真的是一个 Java 程序员…

[Leetcode]用队列实现栈

1.用队列实现栈 请你仅使用两个队列实现一个后入先出&#xff08;LIFO&#xff09;的栈&#xff0c;并支持普通栈的全部四种操作&#xff08;push、top、pop 和 empty&#xff09;。 实现 MyStack 类&#xff1a; void push(int x) 将元素 x 压入栈顶。int pop() 移除并返回…

C语言和JAVA语言的语法小区别

学习记录 记录一些学习过程的&#xff0c;防止后续遗忘&#xff0c;方便回顾 文章目录 学习记录一、数据类型二、标识符三、流程控制语句四、输入输出五、switch语句六、数组 一、数据类型 C语言 基本数据类型&#xff1a; 整型&#xff1a;short&#xff08;2B&#xff09;…

《Kubernetes部署篇:基于Kylin V10+ARM架构CPU+外部etcd使用containerd部署K8S 1.26.15容器版集群(多主多从)》

总结&#xff1a;整理不易&#xff0c;如果对你有帮助&#xff0c;可否点赞关注一下&#xff1f; 更多详细内容请参考&#xff1a;企业级K8s集群运维实战 1、在当前实验环境中安装K8S1.25.14版本&#xff0c;出现了一个问题&#xff0c;就是在pod中访问百度网站&#xff0c;大…

Mysql嵌套查询太简单了

1、子查询的分类 不相关查询&#xff1a; 子查询能独立执行 相关查询&#xff1a; 子查询不能独立运行 相关查询的执行顺序&#xff1a; 首先取外层查询中表的第一个元组,根据它与内层查询相关的属性值处理内层查询, 若WHERE子句返回值为真&#xff0c;则取此元组放入结果…

maven3.9+下载安装

maven介绍 Maven 是一个项目管理和理解工具&#xff0c;它基于项目对象模型&#xff08;POM&#xff09;概念。Maven 可以帮助开发者定义项目结构、依赖关系、构建过程以及其他任务。它主要用于 Java 项目&#xff0c;但也可以用于其他类型的项目。Maven 的主要目标是简化构建…

hacs安装midea ac lan 0.3.22无法下载

1.hacs下载midea ac lan 0.3.20安装成功 2.GitHub下载0.3.22zip包 3.上传至群晖文件夹 4.SSH连接操作先备份一下 cp -r /var/packages/HomeAssistant/home/.homeassistant/custom_components/midea_ac_lan/ /volume2/homes/ 5.删除 rm -rf /var/packages/HomeAssistant/home/.h…

Centos7 ElasticSearch集群搭建

1. 服务器环境配置 1.1 配置hosts文件 3台服务器都要执行 vim /etc/hosts; # 将以下内容写入3台服务器hosts文件 192.168.226.148 es001 192.168.226.149 es002 192.168.226.150 es003 1.2 关闭防火墙 3台服务器都要执行 systemctl stop firewalld; systemctl disable…

探究汇编中的栈帧和局部变量

本节视频学习链接&#xff1a;https://pan.quark.cn/s/2db92a03734d 汇编语言中的函数调用和局部变量的管理是通过栈帧&#xff08;Stack Frame&#xff09;来实现的。栈帧是在函数调用时创建的&#xff0c;它存储了函数的局部变量、参数以及返回地址。本文将详细讲解栈帧的概…

未来互联网

未来互联网的发展将涉及人、物、环境三个方面的系统整合&#xff0c;下面是具体的解释&#xff1a; 人&#xff1a;未来互联网将更加人性化&#xff0c;通过智能化技术实现个性化服务和定制化体验&#xff0c;从而提高用户的满意度和忠诚度。同时&#xff0c;未来互联网也将加强…

Python语言零基础入门——条件判断

目录 一、单分支选择结构&#xff1a;if语句 二、双分支选择结构&#xff1a;if-else 三、多分支选择结构 四、嵌套选择 五、match语句 match与if的对比 六、代码规范 七、练习题 1.年龄判断 2.成绩判断 3.闰年判断 一、单分支选择结构&#xff1a;if语句 if 条件&…

STM 32 GPIO 的几种工作模式怎么运行?

在嵌入式开发领域&#xff0c;STM32微控制器系列因为功能强大和灵活性而广受欢迎。 其中&#xff0c;通用输入输出&#xff08;GPIO&#xff09;是最基础的功能&#xff0c;用于与外部世界的直接电子接口。 STM32 GPIO可以配置为多种工作模式&#xff0c;以适应不同的应用场景…