数据结构与算法——顺序表(顺序存储结构)及初始化详解

顺序表,全名顺序存储结构,是线性表的一种。通过《什么是线性表》一节的学习我们知道,线性表用于存储逻辑关系为“一对一”的数据,顺序表自然也不例外。

不仅如此,顺序表对数据的物理存储结构也有要求。顺序表存储数据时,会提前申请一整块足够大小的物理空间,然后将数据依次存储起来,存储时做到数据元素之间不留一丝缝隙。

例如,使用顺序表存储集合 {1,2,3,4,5},数据最终的存储状态如下图所示:

由此我们可以得出,将“具有 '一对一' 逻辑关系的数据按照次序连续存储到一整块物理空间上”的存储结构就是顺序存储结构。

通过观察上图中数据的存储状态,我们可以发现,顺序表存储数据同数组非常接近。其实,顺序表存储数据使用的就是数组。

顺序表的初始化

使用顺序表存储数据之前,除了要申请足够大小的物理空间之外,为了方便后期使用表中的数据,顺序表还需要实时记录以下 2 项数据:

  1. 顺序表申请的存储容量;
  2. 顺序表的长度,也就是表中存储数据元素的个数;

提示:正常状态下,顺序表申请的存储容量要大于顺序表的长度。

因此,我们需要自定义顺序表,C 语言实现代码如下:

typedef struct Table{int * head;//声明了一个名为head的长度不确定的数组,也叫“动态数组”int length;//记录当前顺序表的长度int size;//记录顺序表分配的存储容量
}table;

注意,head 是我们声明的一个未初始化的动态数组,不要只把它看做是普通的指针。

接下来开始学习顺序表的初始化,也就是初步建立一个顺序表。建立顺序表需要做如下工作:

  • 给 head 动态数据申请足够大小的物理空间;
  • 给 size 和 length 赋初值;

因此,C 语言实现代码如下:

#define Size 5 //对Size进行宏定义,表示顺序表申请空间的大小
table initTable(){table t;t.head=(int*)malloc(Size*sizeof(int));//构造一个空的顺序表,动态申请存储空间if (!t.head) //如果申请失败,作出提示并直接退出程序{printf("初始化失败");exit(0);}t.length=0;//空表的长度初始化为0t.size=Size;//空表的初始存储空间为Sizereturn t;
}

我们看到,整个顺序表初始化的过程被封装到了一个函数中,此函数返回值是一个已经初始化完成的顺序表。这样做的好处是增加了代码的可用性,也更加美观。与此同时,顺序表初始化过程中,要注意对物理空间的申请进行判断,对申请失败的情况进行处理,这里只进行了“输出提示信息和强制退出”的操作,可以根据你自己的需要对代码中的 if 语句进行改进。

通过在主函数中调用 initTable 语句,就可以成功创建一个空的顺序表,与此同时我们还可以试着向顺序表中添加一些元素,C 语言实现代码如下:

#include <stdio.h>
#include <stdlib.h>
#define Size 5
typedef struct Table{int * head;int length;int size;
}table;
table initTable(){table t;t.head=(int*)malloc(Size*sizeof(int));if (!t.head){printf("初始化失败");exit(0);}t.length=0;t.size=Size;return t;
}
//输出顺序表中元素的函数
void displayTable(table t){for (int i=0;i<t.length;i++) {printf("%d ",t.head[i]);}printf("\n");
}
int main(){table t=initTable();//向顺序表中添加元素for (int i=1; i<=Size; i++) {t.head[i-1]=i;t.length++;}printf("顺序表中存储的元素分别是:\n");displayTable(t);return 0;
}

程序运行结果如下:

顺序表中存储的元素分别是:
1 2 3 4 5

可以看到,顺序表初始化成功。

 2023新版数据结构与算法Java视频教程(上篇),java高级程序员必学的数据结构与算法
2023新版数据结构与算法Java视频教程(下篇),java高级程序员必学的数据结构与算法

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

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

相关文章

【论文阅读】TransCAM: Transformer Attention-based CAM Refinement for WSSS

分享一篇阅读的用于弱监督分割的论文 论文标题&#xff1a; TransCAM: Transformer Attention-based CAM Refinement for Weakly Supervised Semantic Segmentation 作者信息&#xff1a; 代码地址&#xff1a; https://github.com/liruiwen/TransCAM Abstract 大多数现有…

【React】- 组件生命周期连续渲染两次问题

最近在整理生命周期相关的知识内容&#xff0c;然后发现一个奇怪的现象&#xff0c;即组件的生命周期会运行2次&#xff01;经过确认不是代码问题&#xff0c;于是开始找度娘&#xff0c;终于找到其原因-React中的严格模式&#xff0c;在这里记录一下 一、问题重现 如图所示&a…

EMC学习笔记(十五)射频PCB的EMC设计(二)

射频PCB的EMC设计&#xff08;二&#xff09; 1.滤波1.1 电源和控制线的滤波1.2 频率合成器数据线、时钟线、使能线的滤波 2.接地2.1 接地分类2.2 大面积接地2.3 分组就近接地2.4 射频器件接地2.5 接地时应该注意的问题2.6 接地平面的分布 1.滤波 1.1 电源和控制线的滤波 随着…

人工智能自然语言处理:N-gram和TF-IDF模型详解

人工智能自然语言处理&#xff1a;N-gram和TF-IDF模型详解 1.N-gram 模型 N-Gram 是一种基于统计语言模型的算法。它的基本思想是将文本里面的内容按照字节进行大小为 N 的滑动窗口操作&#xff0c;形成了长度是 N 的字节片段序列。 每一个字节片段称为 gram&#xff0c;对所…

SpringBoot 整合redis + Aop防止重复提交 (简易)

1.redis的安装 redis下载 解压 安装 # wget http://download.redis.io/releases/redis-6.0.8.tar.gz # tar xzf redis-6.0.8.tar.gz # cd redis-6.0.8 # make 看一下就会有 进入redis-6.0.8下的src目录 [rootVM-16-8-centos redis]# cd redis-6.0.8 [rootVM-16-8-centos re…

HCIP——HCIA回顾及静态实验

HCIP HCIA一、知识回顾1、OSI七层参考模型&#xff1a;2、重要的几个协议报头格式 二、静态实验1、实验拓扑图2、实验要求3、实验思路4、实验步骤1、给接口划分IP地址以及配置环回地址2、交换机配置划分VLAN3、配置静态路由4、配置DHCP服务5、测试6、优化 HCIA 1、七层参考模型…

51单片机学习--独立按键控制LED

功能&#xff1a;按下K1时D1亮&#xff0c;松开时D1灭&#xff0c;P3_1对应K1 , P2_0对应D1 #include <REGX52.H>void main() {while(1) {if(P3_1 0) //按下K1{P2_0 0;}else{P2_0 1;}}} 按下按钮和松开按钮时会有抖动&#xff0c;所以需要用延时函数来避免抖动造成的…

短视频抖音账号矩阵系统源码开发分享

引用&#xff1a;MySQL数据库&#xff0c;NGINX&#xff0c;PHP7.4&#xff0c;MySQL5.7&#xff0c;redis 媒体组件 组件 描述 image 图片 图片。支持 JPG、PNG、SVG、WEBP、GIF 等格式。 video 视频 视频组件。相关 API 请参考 tt.createVideoContext。 开发背景&…

手机快充协议

高通:QC2.0、QC3.0、QC3.5、QC4.0、QC5.0、 FCP、SCP、AFC、SFCP、 MTKPE1.1/PE2.0/PE3.0、TYPEC、PD2.0、PD3.0/3.1、VOOC 支持 PD3.0/PD2.0 支持 QC3.0/QC2.0 支持 AFC 支持 FCP 支持 PE2.0/PE1.1 联发科的PE&#xff08;Pump Express&#xff09;/PE 支持 SFCP 在PP…

计算机网络——三次握⼿、四次挥手

TCP 三次握手 1、第⼀个SYN报⽂&#xff1a; 客户端随机初始化序列号client_isn&#xff0c;放进TCP⾸部序列号段&#xff0c; 然后把SYN置1。把SYN报⽂发送给服务端&#xff0c;表⽰发起连接&#xff0c; 之后客户端处于SYN-SENT状态。 2、第⼆个报⽂SYNACK报⽂&#xff1a; …

MQTT协议在物联网环境中的应用及代码实现解析(一)

MQTT协议全称是Message Queuing Telemetry Transport&#xff0c;翻译过来就是消息队列遥测传输协议&#xff0c;它是物联网常用的应用层协议&#xff0c;运行在TCP/IP中的应用层中&#xff0c;依赖TCP协议&#xff0c;因此它具有非常高的可靠性&#xff0c;同时它是基于TCP协议…

TCP/IP协议是什么?

78. TCP/IP协议是什么&#xff1f; TCP/IP协议是一组用于互联网通信的网络协议&#xff0c;它定义了数据在网络中的传输方式和规则。作为前端工程师&#xff0c;了解TCP/IP协议对于理解网络通信原理和调试网络问题非常重要。本篇文章将介绍TCP/IP协议的概念、主要组成部分和工…

深度学习 / 数据处理:如何处理偏态数据

1 前言 当我们使用一个线性回归模型时&#xff0c;通常这个模型是在很大假设的前提下才有一个很好的结果&#xff1a; 1、假设预测因子和预测目标之间的关系是线性的2、数据不存在外在噪声&#xff1a;不存在一些极端的数据3、非共线性&#xff08; collinearity&#xff09;…

新增进程管理、SSH会话管理功能,1Panel开源面板v1.4.0发布

2023年7月17日&#xff0c;现代化、开源的Linux服务器运维管理面板1Panel正式发布v1.4.0版本。 在这个版本中&#xff0c;1Panel新增了进程管理和SSH会话管理功能&#xff1b;支持容器编辑和升级&#xff0c;数据库兼容MySQL 5.6&#xff1b;备份账号可以添加微软OneDrive&…

github简单使用

留个链接等着吃灰 链接github的使用 举例 先选择需要上传的文件夹 比如db -main文件夹 gitbash 打开shell 进行如下的操作 一般都得写的东西 git init git remote add origin 想要上传的地址 git pull 将远程库拉过来 如果远程没有文件的话 那么shell就显示没有文件 git …

【Vue】 在 vue 中使用 iframe 挂载 html 文件

文章目录 首先需要将要挂载的html文件放到public 文件夹中 路径的引用形式 <iframe ref"sheet" src"/luckysheet.html" width"100%" height"100%"></iframe>通过绑定 ref 获取到 iframe&#xff0c;data为我需要传递的数…

Vscode自定义注释模板

首先安装插件Doxygen Documentation Generator&#xff0c;安装完成之后点击Doxygen插件的设置&#xff0c;按照下面的步骤打开settings.json进行编辑&#xff1a; 在settings.json中追加如下代码&#xff1a; "doxdocgen.file.copyrightTag": ["Copyright (C),…

Python一行命令搭建HTTP服务器并外网访问+-+内网穿透

文章目录 1.前言2.本地http服务器搭建2.1.Python的安装和设置2.2.Python服务器设置和测试 3.cpolar的安装和注册3.1 Cpolar云端设置3.2 Cpolar本地设置 4.公网访问测试5.结语 转载自远程内网穿透的文章&#xff1a;【Python】快速简单搭建HTTP服务器并公网访问「cpolar内网穿透…

FlinkCDC第四部分-同步mysql到mysql,ctrl就完事~(flink版本1.17.1)

本文介绍了不同源单表-单表同步&#xff0c;不同源多表-单表同步。 注&#xff1a;此版本支持火焰图 Flink版本&#xff1a;1.17.1 环境&#xff1a;Linux CentOS 7.0、jdk1.8 基础文件&#xff1a; flink-1.17.1-bin-scala_2.12.tgz、 flink-connector-jdbc-3.0.0-1.16.…

人工智能与Chat GPT

一本书全面掌握ChatGPT&#xff0c;既有向ChatGPT提问的技巧&#xff0c; 也有构建自己的ChatGPT模型的方法&#xff0c;涵盖开发背景、关联技术、使用方法、应用形式、实用案例等 人工智能是我们这个时代最热门的话题&#xff0c;人们既希望它能代替我们做一些工作&#xff0c…