当前位置: 首页 > news >正文

【数据结构】顺序表的定义及实现方式

文章目录

  • 顺序表的定义
  • 顺序表的实现
    • 静态分配
    • 动态分配
    • 动态申请内存空间,动态释放内存空间(malloc,free)
  • 顺序表的特点
  • 总结


顺序表的定义

顺序表也就是用顺序存储的方式实现线性表。
顺序存储。把逻辑上相邻的元素存储在物理位置上也相邻的存储单元中,元素之间的关系由存储单元的邻接关系来体现。
在这里插入图片描述


顺序表的实现

在这里插入图片描述

静态分配

在静态分配时,由于数组的大小和空间事先已经固定,一旦空间占满,再加入新的数据就会产生溢出,进而导致程序崩溃。
在使用静态存储时,首先定义一个最大长度,然后声明顺序表,在声明的顺序表中使用数组存放数据元素,定义当前长度length,代码如下。
Sq:sequence(顺序,序列)

#include <stdio.h>// 静态存储
// 定义最大长度,最大为10个,所以只能存放10个
#define MaxSize 10
// 声明顺序表
typedef struct {// 用静态的数组存放数据元素int data[MaxSize];// 顺序表的当前长度int length;
}SqList; // 顺序表的类型定义

初始化顺序表
声明顺序表后,需要初始化顺序表,将所有数据元素设置为默认初始值,顺序表的初试长度设置为0(这一步必须做!!!)
如果没有初始化顺序表,则内存中会有遗留的脏数据,所以将length的值设置为0这一步必须做!!!
初始化代码如下:

#include <stdio.h>// 静态存储
// 定义最大长度,最大为10个,所以只能存放10个
#define MaxSize 10
// 声明顺序表
typedef struct {// 用静态的数组存放数据元素int data[MaxSize];// 顺序表的当前长度int length;
}SqList; // 顺序表的类型定义// 初始化顺序表
void InitList(SqList& L){for (int i = 0; i < MaxSize; i++) {// 将所有数据元素设置为默认初始值L.data[i] = 0;// 设置顺序表初试长度为0L.length = 0;}
}int main() {// 声明顺序表SqList L;// 初始化顺序表InitList(L);return 0;
}

注意:

  • 使用静态分配时,如果数组存满了,就“放弃治疗”,因为顺序表的表长刚开始确定后就无法更改(存储空间是静态的)。
  • 如果刚开始就声明一个很大的内存空间是没有必要的,这样会浪费存储资源。

动态分配

使用动态分配时,存储数组的空间是在程序执行过程中通过动态存储分配语句分配的,一旦数组空间占满,就另外开辟一块更大的存储空间,替换原来的存储空间,而不需要为线性表一次性地划分所有空间。
动态分配使用“动态数组”实现,先定义一个初始长度,然后定义顺序表,在顺序表中用指针来动态分配数组,定义顺序表的最大容量和当前长度。

#include <stdio.h>
// 初始长度
#define InitSize 10
typedef struct {// 动态分配数组的指针ElemType *data;// 顺序表的最大容量int MaxSize;// 顺序表的当前长度int length;
}SeqList;

动态申请内存空间,动态释放内存空间(malloc,free)

初始动态分配内存语句: L.data = (ElemType *)malloc(sizeof(ElemType) * InitSize)

  • L.data:指向一整片连续的存储空间的起始地址。
  • (ElemType *):malloc 函数返回一个指针, 需要强制转型为你定义的数据元素类型指针。
  • malloc:动态申请内存空间。
  • InitSize:malloc 函数的参数,指明要分配多大的连续内存空间。

注意:使用malloc和free函数需要引入头文件 #include <stdlib.h>

#include <stdio.h>
#include <stdlib.h>
// 初始长度
#define InitSize 10
typedef struct {// 动态分配数组的指针int *data;// 顺序表的最大容量int MaxSize;// 顺序表的当前长度int length;
}SqList;
// 初始化顺序表
void InitList(SqList& L) {//申请一片连续的存储空间L.data = (int *)malloc(sizeof(int) * InitSize);// 设置顺序表初试长度为0L.length = 0;L.MaxSize = InitSize;
}
//动态插入数据,增加长度
void IncreaseSize(SqList& L, int len) {int* p = L.data;L.data = (int*)malloc((L.MaxSize + len) * sizeof(int));for (int i = 0; i < L.length;i++) {// 将数据复制到新区域,但是这样使用时间开销大L.data[i] = p[i];}// 顺序表的最大长度增加lenL.MaxSize = L.MaxSize + len;// 释放原来的内存空间free(p);
}
int main() {// 声明顺序表SqList L;// 初始化顺序表InitList(L);//插入数据IncreaseSize(L, 6);return 0;
}

顺序表的特点

顺序表的特点有随机访问,存储密度高,拓展容量不方便,插入和删除数据元素不方便。
在这里插入图片描述


总结

以上就是今天的学习内容啦~
如果有兴趣的话可以订阅专栏,持续更新呢~
咱们下期再见~
在这里插入图片描述

相关文章:

【数据结构】顺序表的定义及实现方式

文章目录 顺序表的定义顺序表的实现静态分配动态分配动态申请内存空间&#xff0c;动态释放内存空间&#xff08;malloc&#xff0c;free&#xff09; 顺序表的特点总结 顺序表的定义 顺序表也就是用顺序存储的方式实现线性表。 顺序存储。把逻辑上相邻的元素存储在物理位置上…...

R语言数据挖掘-关联规则挖掘(1)

一、分析目的和数据集描述 要分析的数据是美国一区域的保险费支出的历史数据。保险费用数据表的每列分别为年龄、性别、体重指数、孩子数量、是否吸烟、所在区域、保险收费。 本文的主要目的是分析在年龄、性别、体重指数、孩子数量、是否吸烟、所在区域中这些因素中&#xf…...

【ansible】ansible的介绍和安装

前言运维自动化 云计算核心职能 搭建平台架构 日常运营保障 性能效率优化 相关工具 代码管理&#xff08;SCM&#xff09;&#xff1a;GitHub、GitLab、BitBucket、SubVersion 构建工具&#xff1a;maven、Ant、Gradle 自动部署&#xff1a;Capistrano、CodeDeploy 持续…...

二维数组_矩阵交换行

任务描述 给定一个5*5的矩阵&#xff08;数学上&#xff0c;一个rc的矩阵是一个由r行c列元素排列成的矩形阵列&#xff09;&#xff0c;将第n行和第m行交换&#xff0c;输出交换后的结果。 输入格式: 输入共6行&#xff0c;前5行为矩阵的每一行元素,元素与元素之间以一个空格…...

mysql笔记:14. 权限管理

文章目录 MySQL权限授予权限查看权限撤销权限权限生效机制访问控制的实现 在实际生产中&#xff0c;为了保证数据的安全&#xff0c;数据库管理人员需要为不同的操作人员分配不同的权限&#xff0c;限制登录MySQL服务器的用户只能在其权限范围内操作。同时管理员还可以根据不同…...

无硫防静电手指套:高科技产业的纯净与安全新选择

随着科技的飞速发展&#xff0c;高科技产业对于生产环境的纯净度和产品的防静电要求日益严格。为了满足这一高标准的需求&#xff0c;无硫防静电手指套应运而生&#xff0c;以其独特的无硫特性和出色的防静电功能&#xff0c;迅速成为了高科技产业中的纯净与安全新选择。 无硫手…...

由浅到深认识C语言(10):字符串处理函数

该文章Github地址&#xff1a;https://github.com/AntonyCheng/c-notes 在此介绍一下作者开源的SpringBoot项目初始化模板&#xff08;Github仓库地址&#xff1a;https://github.com/AntonyCheng/spring-boot-init-template & CSDN文章地址&#xff1a;https://blog.csdn…...

防范服务器被攻击:查询IP地址的重要性与方法

在当今数字化时代&#xff0c;服务器扮演着重要的角色&#xff0c;为企业、组织和个人提供各种网络服务。然而&#xff0c;服务器也成为了网络攻击者的目标之一&#xff0c;可能面临各种安全威胁&#xff0c;例如DDoS攻击、恶意软件攻击、数据泄露等。为了有效地防范服务器被攻…...

3. ElasticSearch搜索技术深入与聚合查询实战

1. ES分词器详解 1.1 基本概念 分词器官方称之为文本分析器&#xff0c;顾名思义&#xff0c;是对文本进行分析处理的一种手段&#xff0c;基本处理逻辑为按照预先制定的分词规则&#xff0c;把原始文档分割成若干更小粒度的词项&#xff0c;粒度大小取决于分词器规则。 1.2 …...

【Linux】Shell编程【一】

shell是一个用 C 语言编写的程序&#xff0c;它是用户使用 Linux 的桥梁。Shell 既是一种命令语言&#xff0c;又是一种程序设计语言。 Shell 是指一种应用程序&#xff0c;这个应用程序提供了一个界面&#xff0c;用户通过这个界面访问操作系统内核的服务。 Shell属于内置的…...

Windows10+tensorrt+python部署yolov5

一、安装cuda 打开NVIDIA控制面板 —>帮助—>系统信息—>组件&#xff0c;找到驱动版本新&#xff0c;我这边是11.2&#xff0c; 然后去CUDA Toolkit Archive | NVIDIA Developer下载对应版本的CUDA&#xff0c;根据查看的CUDA型号确定对应的cuda Toolhit版本&#…...

【前端框架的发展史详细介绍】

前端框架的发展史 前端框架的发展史可以追溯到1995年&#xff0c;当时微软推出了IE浏览器并开始支持CSS&#xff0c;随后&#xff0c;在1997年&#xff0c;W3C&#xff08;万维网联盟&#xff09;发布了CSS的第一个正式标准。 在2003年&#xff0c;苹果推出了Safari浏览器&am…...

[JAVAEE]—进程和多线程的认识

文章目录 什么是线程什么是进程进程的组成什么是pcb 进程概括线程线程与进程的关系线程的特点 创建线程创建线程方法创建线程的第二种方法对比 其他的方式匿名内部类创建线程匿名内部类创建Runable的子类lambda表达式创建一个线程 多线程的优势 什么是线程 什么是进程 首先想…...

sqllab第十九关通关笔记

知识点&#xff1a; 错误注入 最大长度为32位&#xff1b;如果目标长度>32时&#xff0c;需要利用截取函数进行分段读取referer注入 insert语句update语句 通过admin admin进行登录发现页面打印除了referer字段的信息 这应该是一个referer注入 首先进行测试一下 构造payl…...

张量维度改变总结

文章目录 一、view() 或 reshape()二、unsqueeze()三、squeeze()四、transpose()五、torch.expand_dims 一、view() 或 reshape() view() 或 reshape(): 这两个函数可以用于改变张量的形状&#xff0c;但保持元素总数不变。它们可以接受一个新的形状作为参数&#xff0c;并返回…...

C++ ezOptionParse的用法

在网上找了一下&#xff0c;发现并没有很多关于这个小型头文件的资料 只好自己上了 int main(int argc, const char * argv[]) {ezOptionParser opt;opt.overview "Demo of parsers features."; //概要说明,一般需要填写&#xff0c;简要介绍程序的作用opt.synta…...

MATLAB:一些杂例

a 2; b 5; x 0:pi/40:pi/2; %增量为pi/40 y b*exp(-a*x).*sin(b*x).*(0.012*x.^4-0.15*x.^30.075*x.^22.5*x); %点乘的意义 z y.^2; %点乘的意义 w(:,1) x; %组成w&#xff0c;第一列为x w(:,2) y; %组成w&#xff0c;第二列为y w(:,3) z; %组成w&#xff0c;第三列为z…...

使用OpenCV实现两张图像融合在一起

简单介绍 图像融合技术是一种结合多个不同来源或不同传感器捕获的同一场景的图像数据&#xff0c;以生成一幅更全面、更高质量的单一图像的过程。这种技术广泛应用于遥感、医学影像分析、计算机视觉等多个领域。常见的图像融合技术包括基于像素级、特征级和决策级的融合方法&a…...

PyTorch学习笔记之基础函数篇(十)

文章目录 6 张量操作6.1 torch.reshape()函数6.1 torch.transpose()函数6.1 torch.permute()函数6.1 torch.unsqueez()函数6.1 torch.squeeze()函数6.1 torch.cat()函数6.1 torch.stack()函数 6 张量操作 6.1 torch.reshape()函数 torch.reshape() 是 PyTorch 中的一个函数&a…...

kubernetes部署集群

kubernetes部署集群 集群部署获取镜像安装docker[集群]阿里仓库下载[集群]集群部署[集群]集群环境配置[集群]关闭系统Swap[集群]安装Kubeadm包[集群]配置启动kubelet[集群]配置master节点[master]配置使用网络插件[master]node加入集群[node]后续检查[master]测试集群 集群部署…...

51c自动驾驶~合集58

我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留&#xff0c;CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制&#xff08;CCA-Attention&#xff09;&#xff0c;…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路

进入2025年以来&#xff0c;尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断&#xff0c;但全球市场热度依然高涨&#xff0c;入局者持续增加。 以国内市场为例&#xff0c;天眼查专业版数据显示&#xff0c;截至5月底&#xff0c;我国现存在业、存续状态的机器人相关企…...

SpringTask-03.入门案例

一.入门案例 启动类&#xff1a; package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...

docker 部署发现spring.profiles.active 问题

报错&#xff1a; org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...

RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)

RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发&#xff0c;后来由Pivotal Software Inc.&#xff08;现为VMware子公司&#xff09;接管。RabbitMQ 是一个开源的消息代理和队列服务器&#xff0c;用 Erlang 语言编写。广泛应用于各种分布…...

Oracle11g安装包

Oracle 11g安装包 适用于windows系统&#xff0c;64位 下载路径 oracle 11g 安装包...

React从基础入门到高级实战:React 实战项目 - 项目五:微前端与模块化架构

React 实战项目&#xff1a;微前端与模块化架构 欢迎来到 React 开发教程专栏 的第 30 篇&#xff01;在前 29 篇文章中&#xff0c;我们从 React 的基础概念逐步深入到高级技巧&#xff0c;涵盖了组件设计、状态管理、路由配置、性能优化和企业级应用等核心内容。这一次&…...

对象回调初步研究

_OBJECT_TYPE结构分析 在介绍什么是对象回调前&#xff0c;首先要熟悉下结构 以我们上篇线程回调介绍过的导出的PsProcessType 结构为例&#xff0c;用_OBJECT_TYPE这个结构来解析它&#xff0c;0x80处就是今天要介绍的回调链表&#xff0c;但是先不着急&#xff0c;先把目光…...

用 Rust 重写 Linux 内核模块实战:迈向安全内核的新篇章

用 Rust 重写 Linux 内核模块实战&#xff1a;迈向安全内核的新篇章 ​​摘要&#xff1a;​​ 操作系统内核的安全性、稳定性至关重要。传统 Linux 内核模块开发长期依赖于 C 语言&#xff0c;受限于 C 语言本身的内存安全和并发安全问题&#xff0c;开发复杂模块极易引入难以…...

Python第七周作业

Python第七周作业 文章目录 Python第七周作业 1.使用open以只读模式打开文件data.txt&#xff0c;并逐行打印内容 2.使用pathlib模块获取当前脚本的绝对路径&#xff0c;并创建logs目录&#xff08;若不存在&#xff09; 3.递归遍历目录data&#xff0c;输出所有.csv文件的路径…...