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

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

本篇从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.mzph.cn/news/893754.shtml

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

相关文章

字节跳动发布UI-TARS,超越GPT-4o和Claude,能接管电脑完成复杂任务

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

移动光猫怎么自己改桥接模式?

环境&#xff1a; 型号H3-8s 问题描述&#xff1a; 家里宽带用的是H3-8s 光猫&#xff0c;想改桥接模式。 解决方案&#xff1a; 1.默认管理员账号和密码&#xff1a; 账号&#xff1a;CMCCAdmin 密码&#xff1a;aDm8H%MdAWEB页面我试了登陆不了&#xff0c;显示错误 …

【Java数据结构】排序

【Java数据结构】排序 一、排序1.1 排序的概念1.2 排序的稳定性1.3 内部排序和外部排序1.3.1 内部排序1.3.2 外部排序 二、插入排序2.1 直接插入排序2.2 希尔排序 三、选择排序3.1 选择排序3.2 堆排序 四、交换排序4.1 冒泡排序4.2 快速排序Hoare法&#xff1a;挖坑法&#xff…

Java数据结构 (链表反转(LinkedList----Leetcode206))

1. 链表的当前结构 每个方框代表一个节点&#xff0c;每个节点包含两个部分&#xff1a; 左侧的数字&#xff1a;节点存储的值&#xff0c;例如 45、34 等。右侧的地址&#xff08;如 0x90&#xff09;&#xff1a;表示该节点 next 指针指向的下一个节点的内存地址。 例子中&a…

Linux查看服务器的内外网地址

目录&#xff1a; 1、内网地址2、外网地址3、ping时显示地址与真实不一致 1、内网地址 ifconfig2、外网地址 curl ifconfig.me3、ping时显示地址与真实不一致 原因是dns缓存导致的&#xff0c;ping这种方法也是不准确的&#xff0c;有弊端不建议使用&#xff0c;只适用于测试…

微服务学习-服务调用组件 OpenFeign 实战

1. OpenFeign 接口方法编写规范 1.1. 在编写 OpenFeign 接口方法时&#xff0c;需要遵循以下规范 1.1.1.1. 接口中的方法必须使用 RequestMapping、GetMapping、PostMapping 等注解声明 HTTP 请求的类型。 1.1.1.2. 方法的参数可以使用 RequestParam、RequestHeader、PathVa…

基于C语言的数组从入门到精通

简介:本篇文章主要介绍了一维数组,二维数组,字符数组的定义,数组的应用,数组的核心代码解析,适用于0基础的初学者. C语言数组 1.一维数组 1.1定义 1.1.1声明 语法:数据类型 数组名[数组大小];示例:int arr[5]; 1.1.2初始化 a.静态初始化 完全初始化&#xff1a;int arr[5] {1…

音频入门(二):音频数据增强

本文介绍了一些常见的音频数据增强方法&#xff0c;并给出了代码实现。 目录 一、简介 二、代码 1. 安装必要的库 2. 代码 3. 各函数的介绍 4. 使用方法 参考&#xff1a; 一、简介 音频数据增强是机器学习和深度学习领域中用于改善模型性能和泛化能力的技术。 使用数据…

Go中new和make的区别对比

Go 中 new 和 make 的区别 在 Go 语言中&#xff0c;new 和 make 都用于分配内存&#xff0c;但它们的使用场景和行为有显著的区别。 1. new 定义 new 是 Go 语言中的一个内置函数&#xff0c;用于分配内存并返回指向该内存的指针。new 分配的内存会被初始化为零值。 作用…

消息队列篇--通信协议篇--AMOP(交换机,队列绑定,消息确认,AMOP实现实例,AMOP报文,帧,AMOP消息传递模式等)

AMQP&#xff08;Advanced Message Queuing Protocol&#xff0c;高级消息队列协议&#xff09;是一种开放的、跨平台的消息传递协议&#xff0c;旨在提供一种标准化的方式在不同的消息代理和客户端之间进行消息传递。AMQP不仅定义了消息格式和路由机制&#xff0c;还规定了如何…

LLaMA-Factory 微调LLaMA3

LoRA介绍 LoRA&#xff08;Low-Rank Adaptation&#xff09;是一种用于大模型微调的技术&#xff0c; 通过引入低秩矩阵来减少微调时的参数量。在预训练的模型中&#xff0c; LoRA通过添加两个小矩阵B和A来近似原始的大矩阵ΔW&#xff0c;从而减 少需要更新的参数数量。具体来…

【项目实战】—— 高并发内存池设计与实现

目录 一&#xff0c;项目介绍 1.1 关于高并发内存池 1.2 关于池化技术 1.3 关于malloc 二&#xff0c;定长内存池实现 2.1 实现详情 ​2.2 完整代码 三&#xff0c;高并发内存池整体设计 四&#xff0c;threadcache设计 4.1 整体设计 4.2 哈希桶映射对齐规则 4.3 …

设计模式的艺术-代理模式

结构性模式的名称、定义、学习难度和使用频率如下表所示&#xff1a; 1.如何理解代理模式 代理模式&#xff08;Proxy Pattern&#xff09;&#xff1a;给某一个对象提供一个代理&#xff0c;并由代理对象控制对原对象的引用。代理模式是一种对象结构型模式。 代理模式类型较多…

计算机网络 (54)系统安全:防火墙与入侵检测

前言 计算机网络系统安全是确保网络通信和数据不受未经授权访问、泄露、破坏或篡改的关键。防火墙和入侵检测系统&#xff08;IDS&#xff09;是维护网络系统安全的两大核心组件。 一、防火墙 定义与功能 防火墙是一种用来加强网络之间访问控制的特殊网络互联设备&#xff0c;它…

three.js+WebGL踩坑经验合集(3):THREE.Line的射线检测问题(不是阈值方面的,也不是难选中的问题)

笔者之所以要在标题里强调不是阈值方面&#xff0c;是因为网上的大多数文章提到线的射线检测问题&#xff0c;90%以上的文章都说是因为线太细所以难选中&#xff0c;然后让大家把线的阈值调大。 而本文所要探讨的问题则恰好相反&#xff0c;不是难选中&#xff0c;而是在某些角…

省市区三级联动

引言 在网页中&#xff0c;经常会遇到需要用户选择地区的场景&#xff0c;如注册表单、地址填写等。为了提供更好的用户体验&#xff0c;我们可以实现一个三级联动的地区选择器&#xff0c;让用户依次选择省份、城市和地区。 效果展示&#xff1a; 只有先选择省份后才可以选择…

快速搭建深度学习环境(Linux:miniconda+pytorch+jupyter notebook)

本文基于服务器端环境展开&#xff0c;使用的虚拟终端为Xshell。 miniconda miniconda是Anaconda的轻量版&#xff0c;仅包含Conda和Python&#xff0c;如果只做深度学习&#xff0c;可使用miniconda。 [注]&#xff1a;Anaconda、Conda与Miniconda Conda&#xff1a;创建和管…

BGP分解实验·11——路由聚合与条件性通告(3)

续接上&#xff08;2&#xff09;的实验。其拓扑如下&#xff1a; 路由聚合的负向也就是拆分&#xff0c;在有双出口的情况下&#xff0c;在多出口做流量分担是优选方法之一。 BGP可以根据指定来源而聚合路由&#xff0c;在产生该聚合路由的范围内的条目注入到本地BGP表后再向…

攻防世界easyRSA

解密脚本&#xff1a; p473398607161 q4511491 e17def extended_euclidean(a, b):if b 0:return a, 1, 0gcd, x1, y1 extended_euclidean(b, a % b)x y1y x1 - (a // b) * y1return gcd, x, ydef calculate_private_key(p, q, e):phi (p - 1) * (q - 1)gcd, x, y extend…

常见的多媒体框架(FFmpeg GStreamer DirectShow AVFoundation OpenMax)

1.FFmpeg FFmpeg是一个非常强大的开源多媒体处理框架&#xff0c;它提供了一系列用于处理音频、视频和多媒体流的工具和库。它也是最流行且应用最广泛的框架&#xff01; 官方网址&#xff1a;https://ffmpeg.org/ FFmpeg 的主要特点和功能&#xff1a; 编解码器支持: FFmpe…