顺序表的定义与实现(数据结构与算法)

news2025/1/12 18:22:23

一、顺序表的定义

1. 顺序表的定义

在这里插入图片描述

#define MaxSize 10                        //定义最大长度
typedef struct{                           
	ElemType data[MaxSize];              //用静态的“数组”存放数据元素
	int length;                          //顺序表的当前长度
}SqList;                                 //顺序表的类型定义(静态分配方式)
2.顺序表的实现---------静态分配

当我们声明一个顺序表的时候,把length值置为0是很有必要的: L.length = 0;

在这里插入图片描述

#include<stdio.h>
#define MaxSize 10                       //定义最大长度
typedef struct{                           
	ElemType data[MaxSize];              //用静态的“数组”存放数据元素
	int length;                          //顺序表的当前长度
}SqList;                                 //顺序表的类型定义(静态分配方式)  

//基本操作 ------初始化一个顺序表
void InitList(SqList &L)
{
	for (int i = 0; i < MaxSize; i++)
		L.data[i] = 0;                  //将所有数据元素设置为默认初始值
	L.length = 0;                       //顺序表初始长度为0
}
int main()
{
	SqList L;                        //声明一个顺序表
	InitList(L);                     //初始化顺序表
	// ............后续操作
	return 0;
}
  • 如果“数组”存满了怎么办?
  • 顺序表的表长刚开始确定后就无法更改(存储空间是静态的)
  • 思考:如果刚开始就声明一个很大的内存空间?会存在什么问题? ---------- 浪费!
#define MaxSize 10                   //定义最大长度
typedef struct{
	ElemType data[MaxSize];         //用静态的“数组”存放数据元素
	int length;                     //顺序表的当前长度
}SqList;                            //顺序表的类型定义

3. 顺序表的实现---------动态分配
顺序表是一种线性表的存储结构,可以在连续的内存空间中存储元素。动态分配顺序表是指在需要时,根据实际情况动态增加或释放存储空间。

在这里插入图片描述

以下是实现动态分配顺序表的基本步骤:

1.定义结构体或类:首先,需要定义一个结构体或类来表示顺序表,可以包含如下成员:

  • 数据区域的指针,用于存储元素的数组。
  • 当前顺序表的大小(元素个数)。
  • 当前分配的存储空间大小。
  • 其他辅助变量或信息。

2.创建动态顺序表:在内存中分配一定大小的空间作为动态顺序表的初始存储空间,并初始化顺序表的各个成员。可以使用动态内存分配函数(如malloc)来分配空间。

3.插入元素:当需要插入新元素时,按照顺序表的逻辑顺序找到插入位置。如果当前存储空间不足以容纳新元素,则需要进行动态扩容,重新分配更大的存储空间,并将原有的元素复制到新的空间中。

4.删除元素:当需要删除元素时,将待删除元素后面的元素向前移动,填补删除位置,并更新顺序表的大小。如果删除元素后,剩余存储空间占比过低,可以考虑进行动态缩容,释放多余的存储空间。

5.销毁顺序表:当顺序表不再使用时,需要释放占用的内存空间,即使用动态内存释放函数(如free)释放动态顺序表的存储空间。

#define InitSize 10            //顺序表的初始长度
typedef struct{
	ElemType *data;             //指示动态分配数组的指针
	int MaxSize;                //顺序表的最大容量
	int length;                 //顺序表的当前长度
}SeqList;                       //顺序表的类型定义 (动态分配方式)

//Key: 动态申请和释放内存空间   
//C---- malloc、free函数
		L.data = (Elem Type*) malloc(sizeof(ElemType), *InitSize);
//C++---new、delete关键字
  • malloc函数申请的是一整片连续的存储空间,malloc函数返回一个指针,需要强制转换型为你定义的数据元素类型指针。
  • malloc函数的参数,指明要分配多大的连续内存空间。
    在这里插入图片描述
#include<stdlib.h>            //malloc、free函数的头文件
#define InitSize 10          //默认的最大长度
typedef struct{
	int *data;               //指示动态分配数组的指针		
	int MaxSize;             //顺序表的最大容量
	int length;              //顺序表的当前长度
}SeqList;

void InitList(SeqList &L){
	//用malloc函数申请一片连续的存储空间,如下图所示
	//调用malloc函数,申请一整片连续存储空间,其大小能存的下10个int类型数据。
	//malloc会返回一个指针类型,将其转换成和int *data;同类型的指针类型(int *),然后将返回值赋值给data
	L.data = (int *)malloc(InitSize*sizeof(int));
	//malloc返回的是开辟的一整片存储空间的起始地址->data[0]
	L.length = 0;
	L.MaxSize = InitSize; //将顺序表最大容量设置为初始值
}

//增加动态数组的长度
void IncreaseSize(SeqList &L, int len){
	int *p = L.data;      //将顺序表data指针的值赋给指针p,即p指针和data指向同一个位置
	//调用malloc函数,申请的另一块内存空间能够存得下当前所有数据元素,再多存5个新的数据元素,
	//再乘以每个数据元素的大小
	L.data = (int *)malloc((L.MaxSize + len)*sizeof(int));
	for(int i = 0; i < L.length; i++)
	{
		L.data[i] = p[i];     //将数据复制到新区域(时间开销大)
	}
	L.MaxSize = L.MaxSize + len;  //顺序表最大长度增加len
	//free会将p指针所指向的一整片(原空间)释放掉,归还给系统,这样就实现了内存的扩展。  
	free(p);                //释放原来的内存空间
	//由于*p是局部变量,在该函数执行完后,*p所在内存空间会被系统自动释放
}

int main()
{
	SeqList L;           //声明一个顺序表,计算机会开辟一小块存储空间用来存储SeqList顺序表
	InitList(L);         //初始化顺序表
	//......往顺序表中插入几个元素.......
	IncreaseSize(L, 5);
	return 0;
}

//realloc函数也可以实现,但建议初学者使用malloc和free更能理解背后的过程。

4.顺序表的实现

顺序表:

  • 随机访问,即可以在O(1)常数级时间内找到第i个元素。 data[i-1]
  • 存储密度高,每个节点只存储数据元素。
  • 扩展容量不方便,(即便采用动态分配的方式实现,扩展长度的时间复杂度也比较高)。
  • 插入删除不方便,需要移动大量元素

:链式存储

  • 除了存储数据元素之外,还需要耗费一定存储空间来存放指针。
    在这里插入图片描述
    顺序表思维导图:
    在这里插入图片描述

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

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

相关文章

【MATLAB源码-第58期】基于蛇优化算法(SO)和粒子群优化算法(PSO)的栅格地图路径规划最短路径和适应度曲线对比。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 粒子群算法 (Particle Swarm Optimization, PSO) 1. 算法概述 粒子群算法是一种基于群体智能的优化算法&#xff0c;模拟鸟群觅食的行为。算法中的每个粒子代表问题的一个可能解&#xff0c;并且具有位置和速度两个属性。粒…

【计算机网络】什么是HTTPS?HTTPS为什么是安全的?

【面试经典题】 前言&#xff1a; HTTP最初的设计就是用于数据的共享和传输&#xff0c;并没有考虑到数据的安全性&#xff0c;如窃听风险&#xff0c;篡改风险和冒充风险。HTTPS是在 HTTP 的基础上引入了一个加密层。HTTPS通过数据加密&#xff0c;数据完整性检验和身份认证…

ES性能优化最佳实践- 检索性能提升30倍!

Elasticsearch是被广泛使用的搜索引擎技术&#xff0c;它的应用领域远不止搜索引擎&#xff0c;还包括日志分析、实时数据监控、内容推荐、电子商务平台、企业级搜索解决方案以及许多其他领域。其强大的全文搜索、实时索引、分布式性能和丰富的插件生态系统使其成为了许多不同行…

C++求欧拉角(eigen库中暴露的一些问题)

不同顺序欧拉角转旋转矩阵对照公式 eigen库求欧拉角公式 分别试验eigen库自带的matrix.eulerAngles()函数&#xff0c;与根据上述公式推导的两种方法求欧拉角 eigen库求得欧拉角的范围一定是 x − > r o l l x->roll x−>roll方向在 [ 0 , π ] [0,π] [0,π]之间&am…

argparse模块介绍

argparse是一个Python模块&#xff1a;命令行选项、参数和子命令解析器。argparse 模块可以让人轻松编写用户友好的命令行接口。程序定义了所需的参数&#xff0c;而 argparse 将找出如何从 sys.argv &#xff08;命令行&#xff09;中解析这些参数。argparse 模块还会自动生成…

实时数仓-Hologres介绍与架构

本文是向大家介绍Hologres是一款实时HSAP产品&#xff0c;隶属阿里自研大数据品牌MaxCompute&#xff0c;兼容 PostgreSQL 生态、支持MaxCompute数据直接查询&#xff0c;支持实时写入实时查询&#xff0c;实时离线联邦分析&#xff0c;低成本、高时效、快速构筑企业实时数据仓…

笔记本电脑识别不了刻录机,由于设备驱动程序的前一个实例仍在内存中,windows 无法加载这个硬件的设备驱动程序。 (代码 38)

目录 1 问题2 解决 1 问题 笔记本电脑识别不了刻录机&#xff0c;由于设备驱动程序的前一个实例仍在内存中&#xff0c;windows 无法加载这个硬件的设备驱动程序。 (代码 38) 笔记本电脑插入刻录机&#xff0c;一直识别不了&#xff1b; 右边点击属性 这里展示 由于设备驱动…

powerdesigner逆向mysql与pg生成er图

一、逆向mysql数据库 官网下载mysql的ODBC(开放数据库互连) 选择自己对应版本&#xff0c;我的power designer是32位的&#xff0c;需要选择32的ODBC进行下载&#xff0c;不然power designer会监测不到。 双击exe文件&#xff0c;安装ODBC 这个比较简单&#xff0c;就不阐述了…

nu1l-死亡ping命令攻略

book-nu1l docker 虚拟化技术 把传统的虚拟机堪称容器 依赖镜像启动容器&#xff0c;镜像可以理解为模板克隆的虚拟机&#xff0c;删除容器&#xff0c;对镜像没有影响 镜像在云端 本地要使用某个镜像&#xff0c;根据地址&#xff0c;直接从云端拉取 基本命令 # 查看系统…

day14_集合

今日内容 零、 复习昨日 一、集合框架体系 二、Collection 三、泛型 四、迭代 五、List(ArrayList、LinkedList) 零、 复习 throw和throws什么区别 throwthrows位置方法里面方法签名上怎么写throw 异常对象throws异常类名(多个)作用真正抛出异常对象声明抛出的异常类型 运行时…

【开发篇】一、处理函数:定时器与定时服务

文章目录 1、基本处理函数2、定时器和定时服务3、KeyedProcessFunction下演示定时器4、process重获取当前watermark 前面API篇完结&#xff0c;对数据的转换、聚合、窗口等&#xff0c;都是基于DataStream的&#xff0c;称DataStreamAPI&#xff0c;如图&#xff1a; 在Flink…

【Linux08-进程信号】信号的一生……

今天&#xff0c;带来Linux下进程信号的讲解。文中不足错漏之处望请斧正&#xff01; 是什么 生活中的信号 例子: 红绿灯来电铃声老妈倒数321叫我起床外卖小哥叫我下楼拿外卖 理解: 过程&#xff1a;收到信号 → 分析信号 → 产生信号对应的行为信号不一定会被立即处理&…

Flutter——最详细(Scaffold)使用教程

Scaffold简介 相当于界面的主体&#xff08;类似于安卓最外层PhoneWindow&#xff09;&#xff0c;组件的展示都必须依附于它。 使用场景&#xff1a; 每一个界面都是脚手架&#xff0c;通过它来进行架构实现&#xff0c;优美的布局效果。 属性作用appBar顶部的标题栏body显示整…

Qwt QwtPlotMarker标记类详解

1.概述 QwtPlotMarker类是Qwt绘图库中用于在图表上绘制标记的类。标记可以是垂直或水平线、直线、文本或箭头等。它可用于标记某个特定的位置、绘制参考线或注释信息。 以下是类继承关系图&#xff1a; 2.常用方法 设置标记的坐标。传入x和y坐标值&#xff0c;标记将被放置在…

红黑树--讲解以及详细实现过程

目录 红黑树理解红黑树概念红黑树性质 红黑树实现红黑树图解基础结构实现插入实现 红黑树理解 红黑树概念 红黑树&#xff0c;是一种二叉搜索树&#xff0c;但在每个结点上增加一个存储位表示结点的颜色&#xff0c;可以是Red或Black。 通过对任何一条从根到叶子的路径上各个…

六零导航页SQL注入漏洞复现(CVE-2023-45951)

0x01 产品简介 LyLme Spage&#xff08;六零导航页&#xff09;是中国六零&#xff08;LyLme&#xff09;开源的一个导航页面。致力于简洁高效无广告的上网导航和搜索入口&#xff0c;支持后台添加链接、自定义搜索引擎&#xff0c;沉淀最具价值链接&#xff0c;全站无商业推广…

前端(二十五)——前端实现 OCR 图文识别的详细步骤与示例代码

&#x1f601;博主&#xff1a;小猫娃来啦 &#x1f601;文章核心&#xff1a;前端实现 OCR 图文识别的详细步骤与示例代码 文章目录 简介确定使用的 OCR API创建前端界面添加图像上传功能发送识别请求和处理识别结果完善代码添加注释结论附录 简介 在现代应用程序中&#xff…

如何选择向量数据库|Weaviate Cloud v.s. Zilliz Cloud

随着以 Milvus 为代表的向量数据库在 AI 产业界越来越受欢迎&#xff0c;传统数据库和检索系统也开始在快速集成专门的向量检索插件方面展开角逐。 例如 Weaviate 推出开源向量数据库&#xff0c;凭借其易用、开发者友好、上手快速、API 文档齐全等特点脱颖而出。同样&#xff…

使用AOP切面实现日志记录功能

系列文章 1.SpringBoot整合RabbitMQ并实现消息发送与接收 2. 解析JSON格式参数 & 修改对象的key 3. VUE整合Echarts实现简单的数据可视化 4. Java中运用BigDecimal对字符串的数值进行加减乘除等操作 5. List&#xff1c;HashMap&#xff1c;String,String&#xff1e;&…

【Javascript】函数(变量作用域)

变量&#xff1a;全局变量&#xff0c;局部变量 全局变量 挂载到window对象上的 var a全局变量;console.log(a);var a全局变量;console.log(window.a);var a全局变量;在控制台里输入a也能打印a的值 局部变量 函数体内部声明的变量 var a全局变量;function test(){var b局部…