数据结构--线性表之顺序表

embedded/2024/9/24 13:22:54/

本篇主要整理介绍数据结构--线性表的使用,持续更新中。

老铁们,整理不易,创作不易,先赞后看养成习惯,你的支持是对我更新最大的鼓励!

线性表 知识框架

线性表概念:线性表 ( linear list ) 是n(n>=0)个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,其中n为表长,若用L命名线性表,则有L=(a 1,a 2,......,a i,a i+1,...,a n),其中a1为表头元素,an为表尾元素。

线性表特点

1.表中元素个数有限

2.表中元素具有逻辑上的顺序性,表中元素有先后次序

3.表中元素都是数据元素,每个元素都是单个元素

4.表中元素的数据类型都相同,每个元素占用相同大小的存储空间

5.表中元素具有抽象性,仅讨论元素之间的逻辑关系,而不考虑元素究竟表示什么内容

常见的线性表:顺序表、链表、栈、队列、字符串... 线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储。

1. 顺序存储

1.1 顺序表(线性表的顺序表示)

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

1.2 顺序表分类

一般可以分为:

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

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

1.2.1 静态顺序表:

静态顺序表只适用于确定知道需要存多少数据的场景。

#define MaxSize 50           //定义线性表最大长度
typedef struct{ElemType data[MaxSize];  //顺序表的元素int length;              //顺序表的当前长度
}SqList;                     //顺序表的类型定义

注:一维数组可以是静态分配,也可以是动态分配。在静态分配时,由于数组的大小和空间事先已经固定,定长数组导致MaxSize定大了,空间开多了浪费,开少了不够用。所以现实中基本都是使用动态顺序表,根据需要动态的分配空间大小,所以下面我们实现动态顺序表。

1.2.2 动态顺序表:
#define InitSize 100   //表长度的初始定义
tyepdef struct{
ElemTyepe *data;       //动态分配数组的指针
int MaxSize,length;    //数组的最大容量和当前个数
}SeqList;              //d冬天分配数组顺序表的类型定义

C语言的初始动态分配语句为:

L.data=(ElemType*)malloc(sizeof(Elemtype)*InitSize);

C++的初始动态分配语句为:

L.data=new ElemType[InitSize];

注:动态分配并不是链式存储,它同样属于顺序存储结构,物理结构没有变化,依然是随机存取的方式,只是分配的空间大小可以在运行时动态决定。

1.3 顺序表的特点

最主要的特点是 随机访问 ,即通过首地址和元素序号可在时间O(1)内找到指定的元素。

此外还有,存储密度高,每个节点只存储数据元素,逻辑上相邻的元素物理上也相邻,所以插入删除操作需要大量移动元素。(弊端)

1.4 顺序表基本操作实现

这里重点讨论实现相对繁琐的插入删除和按值查找算法,其他操作比较简单。

(1)插入操作

在顺序表L第i个位置插入新元素e,若i输入不合法,则返回false,表示插入失败;否则,将第i个元素及其往后的所有元素依次往后移动一个位置并插入e元素,顺序表的长度加1,插入成功,返回true。

bool ListInsert (SqList &L,int i,ElemType e){
if (i<1 || i>L.length+1)     //判断i的范围是否有效return false;
if (L.length>=MaxSize)       //当前存储空间已满,无法插入return false;
for(int j=L.length;j>=i;j--){L.data[j]=L.data[j-1]//将第i个元素及之后的元素后移}L.data[i-1]=e;       //在第i位插入eL.length++;          //线性表长度加1return true; 
}

注:时间复杂度

最好情况:在表尾插入,时间复杂度 O(1)

最坏情况:在表头插入,元素向后移动n次,时间复杂度O(n)

未完待续,下节预告,顺序表删除操作,查找操作,单链表的实现,参考下方下节目录。
(2)删除操作

(3)查找操作

2. 链式存储

2.1 单链表    (指针实现)
2.2 双链表    (指针实现)
2.3 循环链表 (指针实现)
2.4 静态链表 (数组实现)

持续更新中,未完待续..

老铁们觉得对你有帮助还请点赞收藏转发评论,你的支持是对我最大的鼓励


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

相关文章

JavaEE技术之MySql高级(索引、索引优化、sql实战、View视图、Mysql日志和锁、多版本并发控制)

文章目录 1. MySQL简介2. MySQL安装2.1 MySQL8新特性2.2 安装MySQL2.2.1 在docker中创建并启动MySQL容器&#xff1a;2.2.2 修改mysql密码2.2.3 重启mysql容器2.2.4 常见问题解决 2.3 字符集问题2.4 远程访问MySQL(用户与权限管理)2.4.0 远程连接问题1、防火墙2、账号不支持远程…

设计模式- 访问者模式(Visitor Pattern)结构|原理|优缺点|场景|示例

设计模式&#xff08;分类&#xff09; 设计模式&#xff08;六大原则&#xff09; 创建型&#xff08;5种&#xff09; 工厂方法 抽象工厂模式 单例模式 建造者模式 原型模式 结构型&#xff08;7种&#xff09; 适配器…

centos学习-压缩和解压缩命令

CentOS 压缩与解压缩命令详解 在CentOS操作系统中&#xff0c;压缩和解压缩命令是极为常用的工具&#xff0c;用于对文件进行打包、压缩和解压缩操作。这些命令能够方便地处理大量的文件&#xff0c;使其更易于拷贝、移动和存储。本文将详细介绍CentOS中常见的压缩解压缩命令的…

情感类ppt素材

小清新手绘插画风毕业季毕业相册同学录画册纪念册PPT下载 - 觅知网这是一张关于清新毕业相册的PPT模板&#xff0c;清新风格设计&#xff0c;加上风为装饰元素&#xff0c;包含毕业相册、毕业季、毕业、同学、纪念等主题内容&#xff0c;也可用作毕业相册PPT、毕业季PPT、毕业P…

【论文阅读】Image Super-Resolution with Non-Local Sparse Attention

Image Super-Resolution with Non-Local Sparse Attention 论文地址摘要1. 简介2. 相关工作2.1.稀疏表示形式。2.2 Non-Local Attention (NLA) for image SR. 3. 非局部稀疏注意力&#xff08;NLSA&#xff09;3.1 稀疏注意力的一般形式3.2. Attention Bucket from Locality Se…

a-table 控制列的展示和隐藏

一、业务场景&#xff1a; 最近在使用 Antd-vue 组件库的时候&#xff0c;a-table需要根据不同角色的权限显示和隐藏 columns的列 为了避免大家走弯路&#xff0c;为大家整理了一下&#xff0c;粘走可以直接用的那种 二、具体实现步骤&#xff1a; 1.在需要显示与隐藏的列增加一…

无人零售与传统便利店的竞争优势

无人零售与传统便利店的竞争优势 成本控制 • 无人零售 显著降低了人力成本&#xff0c;无需支付店员薪资和相关福利&#xff0c;且通过智能化管理减少能源消耗与维护费用&#xff0c;尤其在高租金和高人流区域效益突出。 • 传统便利店 则承担较高的人员开支&#xff0c;…

2024年华为OD机试真题-智能驾驶-Python-OD统一考试(C卷D卷)

题目描述: 有一辆汽车需要从 m*n 的地图的左上角(起点)开往地图的右下角(终点),去往每一个地区都需要消耗一定的油量,加油站可进行加油 请你计算汽车确保从起点到达终点时所需的最少初始油量说明: (1) 智能汽车可以上下左右四个方向移动1 (2) 地图上的数字取值是 0或-1 或者…