详解最基本的数据顺序存储结构:顺序表

news2025/1/29 7:38:55

新的一年,我觉得这张图很合适!有梦想,敢拼,马上就是除夕了,希望新的一年我们逢考必过,事事顺心,看见朝阳的你是不是嘴角微微上扬!

本篇从0基础白话文讲述顺序表的概念、用法、注意事项、优缺点等等!帮助小白快速掌握!

目录

                      顺序表的概念

                      顺序表的特性

                      顺序表的分类

                      动态顺序表的空间类型设置

         顺序表:开辟与初始化接口

         顺序表:初始化空间

         顺序表:判断空间有效性

         顺序表:扩容空间 

         顺序表:使用空间

         顺序表:对开辟内存的释放

总结

完整代码


顺序表的概念

顺序表是线性表的一种,我们先简单介绍一下线性表:

线性表:最简单、基本、常用的数据结构,由相同特性的数据元素组成的有限序列,除了第一个跟最后一个元素外,其余元素都是收尾相连的,这种连接关系使得线性表在逻辑上呈现线性关系

收尾相连像一根线连接起来的存储方式嘛!下面我们来看看顺序表!

顺序表:在计算机内存中以数组形式保存的线性表,特点就是通过一组地址连续的存储单元依次存储线性表中的各个元素

那它跟数组又有什么区别?

比较形象的说:数组是主零件,顺序表是整个产品,可以实现增删查找等功能!

顺序表的特性

随机访问:通过首地址和元素的序号可以找到指定的元素

存储密度高:每个结点的存储空间只用来存储数据元素,没有额外开销

相邻关系:既然是像一条线把每个存储串联起来,是不是左右元素就有了相邻关系!这使得删除和插入元素比较耗时

顺序表的分类

静态顺序表:可以理解为一个比较抽象的数组,存储大小是提前规定好的。不仅存储大小有限,而且实时面临浪费空间跟空间不够的问题

比如:

这里的n已经写死了,可能需要多次更改宏定义才能更改,这种效率不高!

动态顺序表:相较于动态,我们可以根据需要开辟存储空间,这显得对空间的管理更好!

下面我们主要来学习动态顺序表的实现! 

动态顺序表的空间类型设置

                                                               第一步:分装文件

使用多个文件的原因:一方面显得工程的可读性高

                                    主要还是性能的管理更好

第一步:视图->解决方案管理器->找到需要开辟的文件种类->右键添加->新建项(就可以增加文件个数了!)

一般建议开辟3个文件:2个源文件(.c后缀)(思路大纲+函数实现)

                                      1个头文件(.h后缀)(用来写自实现函数的头文件) 

                                      命名尽量使用英文!

                                                  第二步:实现存储空间的类型

                                                     

                                                 第三步:宏定义常量与结构体变量创建

为了后面可以用宏定义来代替数字,增加可读性,我们设置2个宏常量,对应数字用常量符号代替

如果对宏不清楚的小伙伴,可以看我主页的:程序环境与预处理

创建结构体变量:

接下来会用到动态开辟知识,有不清楚的小伙伴们可以看我主页的:动态内存管理

顺序表:开辟与初始化接口

我们想要动态的存储,肯定要先开辟空间:

首先函数调用:

函数的声明:

 

函数的实现:

 

 

 顺序表:初始化空间

函数调用:

函数声明:

 

函数实现(注意calloc函数自带初始化功能):

 

 

顺序表:判断空间有效性

 函数调用(注意传的参数,因为后面还需要调用它,避免麻烦,我们传指针):

函数声明:

 

函数实现:

 

 

顺序表:扩容空间

 函数调用:

函数声明:

 

函数实现:

 

 

顺序表:使用空间

 函数调用:

函数声明:

 

函数实现:

 

 顺序表:对开辟内存的释放

我们使用完动态开辟后,需要对空间及时释放,避免内存泄漏!这个知识点可以在我主页:动态内存管理 里面找到!

函数调用:

函数声明:

函数实现:

 

总结

动态顺序表就是利用动态开辟函数来实现,所以我们的基础就是动态内存管理,不会的小伙伴们记得看我主页哦!超级详细的动态详解

完整代码
#define _CRT_SECURE_NO_WARNINGS 1
#include"text.h"


int main() 
{
	//创建结构体变量
	struct Library s;

	//开辟与初始化
	Open(&s);

	//判断空间有效性
	Judgment(&(s.Pointer));

	//扩容接口
	Expansion(&s);

	//使用空间
	Use(&s);

	//释放空间
	free_t(&s);
}

 

#define _CRT_SECURE_NO_WARNINGS 1
#define MAX 4  //初始最大空间为4
#define ADD 4  //每次扩容增加4个

//单个存储空间类型
typedef struct Information
{
	char name[10];  //名字
	int age;   //年龄
}Information;

//单个空间类型的指针
typedef struct Library
{
	Information* Pointer;   //结构体指针
	int sz;    //sz表示已使用的空间个数
	int max;  //MAX当前表示最大存储量
}Library;

//开辟与初始化
void Open(struct Library* pc);

//判断空间有效性
void Judgment(Information* pc);

//对空间进行扩容
void Expansion(struct Library* pc);

//使用空间
void Use(struct Library* pc);

//释放空间
void free_t(struct Library* pc);
#define _CRT_SECURE_NO_WARNINGS 1
#include"text.h"
#include <cstddef>

//开辟与初始化的实现
void Open(struct Library* pc)
{
	Information* pc = (Information*)calloc(4, sizeof(Information*));
	pc->max = MAX;
	pc->sz = 0;
}

//判断空间有效性
void Judgment(Information* pc)
{
	if (pc == NULL)
	{
		printf("空间开辟失败\n");
		perror("pc");//打印原因
		return;
	}
}

//实现扩容
void Expansion(struct Library* pc)
{
	if (pc->sz == pc->max)
	{
		//表示需要扩容
		Information* str = (Information*)realloc(pc, pc->max + ADD);

		//修改最大存储量
		pc->max += ADD;

		//调用接口进行判断新空间的有效性
		open(&str);

		pc = str;
	}
}

//使用空间
void Use(struct Library* pc)
{
	int input = 0;
	while (input)
	{
		//调用函数接口,判断是否需要扩容
		Expansion(&pc);

		printf("请输入姓名\n");
		scanf("%s", pc->Pointer[pc->sz].name);

		printf("请输入年龄\n");
		scanf("%s", pc->Pointer[pc->sz].age);

		pc->sz++;

		printf("继续输入请按1,退出请按0");
		scanf("%d", &input);
	}
}

//释放空间
void free_t(struct Library* pc)
{
	free(pc->Pointer);
	pc->Pointer = NULL;
	pc -> max = 0;
	pc->sz = 0;
}

 

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

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

相关文章

STM32使用VScode开发

文章目录 Makefile形式创建项目新建stm项目下载stm32cubemx新建项目IED makefile保存到本地arm gcc是编译的工具链G++配置编译Cmake +vscode +MSYS2方式bilibiliMSYS2 统一环境配置mingw32-make -> makewindows环境变量Cmake CmakeListnijia 编译输出elfCMAKE_GENERATOR查询…

安装Office自定义项,安装期间出错

个人博客地址&#xff1a;安装Office自定义项&#xff0c;安装期间出错 | 一张假钞的真实世界 卸载PowerDesigner后&#xff0c;打开“WPS文字”时出现下图错误&#xff1a; 解决方法&#xff1a; 按“WinR”快捷键&#xff0c;打开【运行】框&#xff0c;在对话框中输入“re…

代码审查中的自动化与AI应用

代码审查&#xff08;Code Review&#xff09;作为软件开发中的一项重要实践&#xff0c;通常被认为是提高代码质量、减少bug和提升团队协作的重要手段。随着开发规模的不断扩大&#xff0c;手动代码审查在效率、准确性、以及可扩展性上都存在明显的局限性。尤其是在敏捷开发和…

蓝桥杯模拟算法:蛇形方阵

P5731 【深基5.习6】蛇形方阵 - 洛谷 | 计算机科学教育新生态 我们只要定义两个方向向量数组&#xff0c;这种问题就可以迎刃而解了 比如我们是4的话&#xff0c;我们从左向右开始存&#xff0c;1&#xff0c;2&#xff0c;3&#xff0c;4 到5的时候y就大于4了就是越界了&…

PostGIS笔记:PostgreSQL 数据库与用户 基础操作

数据库基础操作包括数据模型的实现、添加数据、查询数据、视图应用、创建日志规则等。我这里是在Ubuntu系统学习的数据库管理。Windows平台与Linux平台在命令上几乎无差异&#xff0c;只是说在 Windows 上虽然也能运行良好&#xff0c;但在性能、稳定性、功能扩展等方面&#x…

Nginx中部署多个前端项目

1&#xff0c;准备前端项目 tlias系统的前端资源 外卖项目的前端资源 2&#xff0c;nginx里面的html文件夹中新建&#xff0c;tlias和sky两个文件夹。 切记这是在nginx/html下创建的 mkdir sky mkdir tlias 把tlias和sky的资源都放到对应的文件夹中 3&#xff0c;编辑配置ngi…

人力资源管理HR系统的需求设计和实现

该作者的原创文章目录&#xff1a; 生产制造执行MES系统的需求设计和实现 企业后勤管理系统的需求设计和实现 行政办公管理系统的需求设计和实现 人力资源管理HR系统的需求设计和实现 企业财务管理系统的需求设计和实现 董事会办公管理系统的需求设计和实现 公司组织架构…

2025年美赛B题-结合Logistic阻滞增长模型和SIR传染病模型研究旅游可持续性-成品论文

模型设计思路与创新点&#xff1a; 建模的时候应该先确定我们需要建立什么类的模型&#xff1f;优化类还是统计类&#xff1f;这个题需要大量的数据分析&#xff0c;因此我们可以建立一个统计学模型。 统计学建模思路&#xff1a;观察规律&#xff0c;建立模型&#xff0c;参…

【太阳——几何计算】

题目 代码 #include <bits/stdc.h> using namespace std; using PII pair<int, int>; using ll long long; const int N 1e5 10; set<PII> s; bool st[N]; struct node {int x, y, id; } arr[2 * N]; int main() {int n, X, Y;cin >> n >> …

嵌入式MCU面试笔记2

目录 串口通信 概论 原理 配置 HAL库代码 1. 初始化函数 2. 数据发送和接收函数 3. 中断和DMA函数 4. 中断服务函数 串口通信 概论 我们知道&#xff0c;通信桥接了两个设备之间的交流。一个经典的例子就是使用串口通信交换上位机和单片机之间的数据。 比较常见的串…

云原生时代,如何构建高效分布式监控系统

文章目录 一.监控现状二.Thanos原理分析SidecarQuerierStoreCompactor 三.Sidecar or ReceiverThanos Receiver工作原理 四.分布式运维架构 一.监控现状 Prometheus是CNCF基金会管理的一个开源监控项目&#xff0c;由于其良好的架构设计和完善的生态&#xff0c;迅速成为了监控…

火语言RPA--配置文件读取

&#x1f6a9;【组件功能】&#xff1a;读取配置文件信息以字典类型输出。 配置预览 配置说明 要读取的文件 支持T或# 读取配置文件的路径及名称&#xff0c;绝对路径。 配置文件类型 INI或XML两种选项供选择。 编码 写入配置文件的编码&#xff0c;以列表方式供选择&am…

电子应用设计方案104:智能家庭AI弹簧床系统设计

智能家庭 AI 弹簧床系统设计 一、引言 智能家庭 AI 弹簧床系统旨在为用户提供更加舒适、个性化的睡眠体验&#xff0c;通过结合人工智能技术和先进的床垫设计&#xff0c;实时监测和调整睡眠环境&#xff0c;以满足不同用户的需求。 二、系统概述 1. 系统目标 - 自动适应用户…

基于paddleocr的表单关键信息抽取

全流程如下&#xff1a; 数据集 XFUND数据集是微软提出的一个用于KIE任务的多语言数据集&#xff0c;共包含七个数据集&#xff0c;每个数据集包含149张训练集和50张验证集分别为&#xff1a; ZH(中文)、JA(日语)、ES(西班牙)、FR(法语)、IT(意大利)、DE(德语)、PT(葡萄牙)&a…

爬虫基础之爬取某基金网站+数据分析

声明: 本案例仅供学习参考使用&#xff0c;任何不法的活动均与本作者无关 网站:天天基金网(1234567.com.cn) --首批独立基金销售机构-- 东方财富网旗下基金平台! 本案例所需要的模块: 1.requests 2.re(内置) 3.pandas 4.pyecharts 其他均需要 pip install 模块名 爬取步骤: …

深入理解动态规划(dp)--(提前要对dfs有了解)

前言&#xff1a;对于动态规划&#xff1a;该算法思维是在dfs基础上演化发展来的&#xff0c;所以我不想讲的是看到一个题怎样直接用动态规划来解决&#xff0c;而是说先用dfs搜索&#xff0c;一步步优化&#xff0c;这个过程叫做动态规划。&#xff08;该文章教你怎样一步步的…

(1)STM32 USB设备开发-基础知识

开篇感谢&#xff1a; 【经验分享】STM32 USB相关知识扫盲 - STM32团队 ST意法半导体中文论坛 单片机学习记录_桃成蹊2.0的博客-CSDN博客 USB_不吃鱼的猫丿的博客-CSDN博客 1、USB鼠标_哔哩哔哩_bilibili usb_冰糖葫的博客-CSDN博客 USB_lqonlylove的博客-CSDN博客 USB …

基于STM32单片机设计的宠物喂食监控系统

1. 项目开发背景 随着宠物数量的增加&#xff0c;尤其是人们对宠物的养护需求日益增多&#xff0c;传统的人工喂养和管理方式难以满足现代养宠生活的需求。人们越来越希望通过智能化手段提高宠物养护的质量和效率&#xff0c;特别是对于宠物喂食、饮水、温湿度控制等方面的智能…

MATLAB绘图:随机彩色圆点图

这段代码在MATLAB中生成并绘制了500个随机位置和颜色的散点图。通过随机生成的x和y坐标以及颜色&#xff0c;用户可以直观地观察到随机点的分布。这种可视化方式在数据分析、统计学和随机过程的演示中具有广泛的应用。 文章目录 运行结果代码代码讲解 运行结果 代码 clc; clea…

重定向与缓冲区

4种重定向 我们有如下的代码&#xff1a; #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <string.h>#define FILE_NAME "log.txt"int main() {close(1)…