【探索数据结构】线性表之顺序表

news2024/12/23 3:46:22

🎉🎉🎉欢迎莅临我的博客空间,我是池央,一个对C++和数据结构怀有无限热忱的探索者。🙌

🌸🌸🌸这里是我分享C/C++编程、数据结构应用的乐园✨

🎈🎈🎈期待与你一同在编程的海洋中遨游,探索未知的技术奥秘💞

📝专栏指路:

📘【C++】专栏:深入解析C++的奥秘,分享编程技巧与实践。

📘【数据结构】专栏:探索数据结构的魅力,助你提升编程能力。

前言

初步认识了数据结构后,我们一起来探索它的逻辑结构里面的线性结构吧。线性结构是一对一的关系。线性表在逻辑结构上是连续的,在物理结构上不一定是连续的。线性表中的顺序表(本篇的主角)在物理结构上是连续的,而线性表中的链表在物理结构上却是不连续的。

一、线性表

线性表是具有相同数据类型的n(n≥0)个数据元素的有限序列,其中n为表长,当n=0时线性表是一个空表。

几个概念:

1.ai是线性表中的“第i个”元素线性表中的位序(位序从1开始,注意区分数组下标从0开始

2.a1是表头元素;an是表尾元素。

3.除第一个元素外,每个元素有且仅有一个直接前驱(前一个元素);除最后一个元素外,每个元素有且仅有一个直接后继(后一个元素)

9d59d7f954594b72b79f785bc43c8078.png

二、顺序表

正片开始!

1.概念

顺序表——用顺序存储的方式实现线性表顺序存储。把逻辑上相邻的元素存储在物理位置上也相邻的存储单元中,元素之间的关系由存储单元的邻接关系来体现。顺序表的底层是数组。

9d44e91b48c64bed94713f95e628031c.jpg

2.静态顺序表

顺序表的空间大小固定

补充:为了简化代码,我们使用typedef 重命名自定义类型,typedef的优势是什么?

在C或C++中,typedef 关键字用于为已存在的数据类型定义一个新名称(别名)。这在需要简化复杂的数据类型声明,或者为特定的数据类型提供一个更有描述性的名称时非常有用。

代码如下:

typedef int SQLDataType;//顺序表的数据类型
//静态顺序表
typedef struct SeqList
{
	SQLDataType arr[100];
	int size;//有效数据个数
	int capacity;//空间大小
}SL;

3.动态顺序表

顺序表的大小空间不固定,可根据需求改变。

当顺序表存满时,用realloc增容。

typedef int SQLDataType;//顺序表的数据类型
//动态顺序表
typedef struct SeqList
{
	SQLDataType* arr;
	int size;//有效数据个数
	int capacity;//空间大小
}SL;

补充:realloc扩容的规则是什么?

一次扩充一个空间 ,插入一个元素还不会造成空间浪费程序(执行效率低下)

一次扩容固定个大小的空间(10、100…)【小了造成频繁扩容】【大了造成空间浪费】

最优解:成倍数的增加(1.5倍、2倍),数据插入的越多扩容的大小越来越大

扩容后会自动把原有空间释放掉

82685d545a784ea69d837396cae09657.png

malloc,realloc,calloc三者区别是什么?

  • malloc函数:用于动态分配指定字节数的内存空间,并返回一个指向它的指针。如果分配成功,则返回非空指针;如果内存空间不足,则返回NULL。需要注意的是,malloc分配的内存空间并未初始化,它们的值是未知的。
  • calloc函数:也用于动态分配内存空间,与malloc有所不同。calloc在分配内存空间时,会将其初始化为0。它的参数是要分配的元素个数和每个元素的大小,而不是总的字节数。如果分配成功,则返回指向分配的内存的指针;如果失败,则返回NULL。
  • realloc函数:用于调整之前分配的内存空间大小。它接收一个指向已分配内存的指针和一个新的大小,然后尝试调整内存块的大小。如果成功,则返回指向新的内存块的指针;如果失败,则返回NULL,而原来的内存块保持不变。

代码示例

//是否需要申请空间
void SQLcapacity(SL* ps)
{
	if (ps->capacity == ps->size)//空间已满,需要申请空间
	{
		//realloc增容,一般增加成原本空间大小的二或三倍
		int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
		SQLDataType* tmp = (SQLDataType*)realloc(ps->arr, newcapacity * sizeof(SQLDataType));
		if (tmp == NULL)
		{
			perror("reacoll fail!");//空间申请失败
			exit(1);//退出程序
		}
		ps->arr = tmp;
		ps->capacity = newcapacity;
	}
}

4.对顺序表的操作

(1)初始化

void InitSql(SL* ps)
{
	ps->arr = NULL;
	ps->size = ps->capacity = 0;
}

(2)尾插

d934bfbb346e4a638f70d2beca95b97c.png

void PushBackSql(SL* ps, SQLDataType x)
{
	assert(ps);
	//插入之前先看空间够不够
	SQLcapacity(ps);
	ps->arr[ps->size++] = x;//size是顺序表尾部,后置++插入x后size加一
}

(3)头插

124e19006b51471aaab9c905f9ade1b9.png

//头部插入
void PushHeadSql(SL* ps, SQLDataType x)
{
	assert(ps);
	//插入之前先看空间够不够
	SQLcapacity(ps);
	//让原本的数据往后移一位
	for (int i = ps->size;i > 0;i--)
	{
		ps->arr[i] = ps->arr[i - 1];//arr[1]=arr[0]让arr[1]的位置放入原本arr[0]的数据
	}
	ps->arr[0] = x;
	ps->size++;
}

(4)查找

//查找指定数据
int FindPosSql(SL* ps, SQLDataType x)
{
	assert(ps);
	for (int i = 0;i < ps->size;i++)
	{
		if (ps->arr[i] == x)
			return i;
	}
	return -1;
}

找到了返回下标,找不到则返回不存在的下标

(5)尾删

//尾部删除
void DelBackSql(SL* ps)
{
	assert(ps);
	assert(ps->size);//顺序表为空时不能执行删除操作
	ps->size--;
}

(6)头删

b688a74378ed4dc88226fa9a969ee07a.png

//头部删除
void DelHeadSql(SL* ps)
{
	assert(ps);
	assert(ps->size);//顺序表为空时不能执行删除操作
	//顺序表存放数据整体往前挪一位
	for (int i = 0;i < (ps->size) - 1;i++)
	{
		//arr[0]的位置放原本arr[1]的数据,最后是ps->arr[size-2]=ps->arr[size-1]
		ps->arr[i] = ps->arr[i + 1];//arr[0]的位置放原本arr[1]的数据,最后是ps->arr[size-2]=ps->arr[size-1]
	}
	ps->size--;
}

(7)在指定位置之前插入数据

89b960a539204d2c8b747945b29a0b28.png

//指定位置前插入
void AddPosSql(SL* ps, int pos, SQLDataType x)
{
	assert(ps);
	assert(pos >= 0 && pos <= ps->size);
	//先看看空间够不够
	SQLcapacity(ps);
	//pos位置上的数和他后面的数整体往后挪一位
	for (int i = ps->size;i > pos;i--)
	{
		ps->arr[i] = ps->arr[i - 1];//结束arr[pos+1]=arr[pos];
	}
	ps->arr[pos] = x;
	ps->size++;
}

(8)在指定位置删除数据

38e8eb6590294644a348f55083f5ab38.png

//删除指定位置数据
void DelPosSql(SL* ps, int pos)
{
	assert(ps);
	assert(pos >= 0 && pos <= ps->size);
	//整体往前挪一位
	for (int i = pos;i < ps->size - 1;i++)
	{
		ps->arr[i] = ps->arr[i + 1];//arr[size-2]=arr[size-1]
	}
	ps->size--;
}

(9)销毁

//销毁顺序表
void DestroySql(SL* ps)
{
	if (ps->arr)//不是空表才需要释放
	{
		free(ps->arr);
	}
	ps->arr = NULL;
	ps->size = ps->capacity = 0;
}

顺序表小结

a13c2e0f17464d7abd5d2d6220e6a887.png

下一篇预告:线性表之单链表

持续更新中...

敬请期待

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

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

相关文章

信息学奥赛初赛天天练-10-组合数学-排列组合-一次彻底搞懂分组分配问题

更多资源请关注纽扣编程微信公众号 平均分组 是指将所有的元素分成所有组元素个数相等或部分组元素个数相等&#xff0c;即m个不同的元素平均分成n个组&#xff0c;有多少种分组方法 由于是平均分组&#xff0c;分组选择元素时会出现重复&#xff0c;因此结果需要除以A(n,n…

LeetCode1466重新规划路线

题目描述 n 座城市&#xff0c;从 0 到 n-1 编号&#xff0c;其间共有 n-1 条路线。因此&#xff0c;要想在两座不同城市之间旅行只有唯一一条路线可供选择&#xff08;路线网形成一颗树&#xff09;。去年&#xff0c;交通运输部决定重新规划路线&#xff0c;以改变交通拥堵的…

【漏洞复现】智慧校园(安校易)管理系统 FileUpProductupdate.aspx 任意文件上传漏洞

0x01 产品简介 "安校易"是银达云创公司基于多年教育市场信息化建设经验沉淀&#xff0c;经过充分的客户需求调研&#xff0c;并依据国家"十三五”"教育信息化建设规范而推出的综合互联网教育信息化解决方案。“安校易“以物联网技术为基础&#xff0c;以学…

(Askchat.ai、360智脑、鱼聪明、天工AI、DeepSeek)

目录 1、Askchat.ai - 梦想为蓝图&#xff0c;ChatGPT为笔。 2、360智脑 — 以人为本&#xff0c;安全可信 3、鱼聪明AI - 做您强大的AI助手 (yucongming.com) 4、天工AI-搜索、对话、写作、文档分析、画画、做PPT的全能AI助手 (tiangong.cn) 5、DeepSeek | 深度求索 1、Askch…

第九节 设计 Starter 不能忽视的细节

我们要定义一个生产可用的 Starter &#xff0c;还有几个细节&#xff0c;我们必须要关注。这些细节可以很好的帮助我们写出更优秀的 Starter 一、maven 包依赖 每一个 Starter&#xff0c;可以理解为一个 Jar&#xff0c;这个 Jar 包&#xff0c;如果被其他应用引用&#xf…

FIFO-Diffusion,一个无需额外训练即可生成长视频的框架。通过确保每个帧引用足够多的先前帧来生成高质量、一致的长视频。

简单来讲&#xff0c;FIFO-Diffusion先通过一些模型如VideoCraft2、zeroscope、Opem-Sora Plan等与FIFO-Diffusion的组合生成短视频&#xff0c;然后取结尾的帧&#xff08;也可以取多帧&#xff09;&#xff0c;再用这一帧的图片生成另一段短视频&#xff0c;然后拼接起来。FI…

CentOS-7安装教程

目录 安装 修改主机名 配置静态IP 镜像下载地址 https://mirrors.aliyun.com/centos/7.9.2009/isos/x86_64/CentOS-7-x86_64-DVD-2009.iso VMware Workstation Pro下载 VMware Workstation Pro各版本下载&#xff08;2024.5.5之后&#xff09;(Windows与Linux安装包不限…

MilvusPlus向量数据库增强操作库

项目简介 &#x1f525;&#x1f525;&#x1f525;MilvusPlus&#xff08;简称 MP&#xff09;是一个 Milvus 的操作工具&#xff0c;旨在简化与 Milvus 向量数据库的交互&#xff0c;为开发者提供类似 MyBatis-Plus 注解和方法调用风格的直观 API,提高效率而生。 特性 无侵入…

【C++11】列表初始化,std::initializer_list和模版可变参数

一.列表初始化 一切对象都可以用大括号括起的列表来初始化。 //构造 Date d1(2024, 5, 24); Date d2{2024, 5, 24};//三个构造 new Date[3]{{2024, 5, 23}, {2024, 5, 24}, {2024, 5, 25}};//构造(隐式)拷贝构造 优化->一次构造 Date d3 {2024, 5, 24}; 二. std::initiali…

基于STM32实现智能空气质量监测系统

目录 文章主题环境准备智能空气质量监测系统基础代码示例&#xff1a;实现智能空气质量监测系统 配置传感器并读取数据数据处理与显示数据存储与传输应用场景&#xff1a;室内环境监测与空气质量控制问题解决方案与优化收尾与总结 1. 文章主题 文章主题 本教程将详细介绍如何…

AI视频智能分析技术:EasyCVR视频汇聚安防监控智能化方案

1、视频智能分析技术原理 视频智能分析技术是一项基于计算机图像视觉分析技术的创新解决方案。它利用先进的算法&#xff0c;将视频场景中的背景和目标进行有效分离&#xff0c;从而实现对目标的精准分析和追踪。 该技术可以对监控摄像头拍摄到的视频进行分析和识别&#xff0…

Java+Spring+ MySQL + MyCat云HIS有哪些优势?智慧医疗云(HIS)低成本与安全保障的完美结合

JavaSpring MySQL MyCat云HIS有哪些优势&#xff1f;智慧医疗云(HIS)低成本与安全保障的完美结合 云HIS的优点包括节省成本、便捷高效、稳妥安全等。通过云HIS&#xff0c;医疗机构无需在本地建立机房、购买服务器和应用软件&#xff0c;降低了硬件和人力成本。同时&#xff0…

OpenWrt改网桥模式(AP模式)

OpenWrt改网桥模式&#xff08;AP模式&#xff09; 点击“接口” 删掉所有 wan 接口 点击“设备”&#xff0c;配置“br-lan" 点击网桥接口&#xff0c;勾选所有接口 点击保存 添加新接口&#xff08;不添加的话路由器自身系统没网&#xff09; 返回 “网络” - “接…

AI大模型的口语练习APP

开发一个使用第三方大模型的口语练习APP涉及多个步骤&#xff0c;从需求分析到部署上线。以下是详细的开发流程和关键步骤&#xff0c;通过系统化的流程和合适的技术选型&#xff0c;可以有效地开发出一个功能丰富、用户体验良好的口语练习APP。北京木奇移动技术有限公司&#…

景源畅信电商:抖店需要的成本高吗?

在数字化时代的浪潮中&#xff0c;短视频平台迅速崛起&#xff0c;成为连接用户与商家的新桥梁。抖音作为其中的佼佼者&#xff0c;不仅改变了人们的娱乐方式&#xff0c;也催生了新型的电商模式——抖店。许多人好奇&#xff0c;入驻这样一个充满活力的平台&#xff0c;需要承…

C++ (week4):Linux基础

文章目录 零、Linux简介1.配置环境2.Linux历史3.Linux模型 一、vim二、Linux命令行 (shell命令)1.常用命令与快捷键(1)常用命令①man命令&#xff1a;查看帮助手册 (2)快捷键 2.用户子系统(1)Linux用户(2)用户命令 3.文件子系统命令(1)目录命令1.创建文件&#xff1a;mkdir2.删…

优于InstantID!中山大学提出ConsistentID:可以仅使用单个图像根据文本提示生成不同的个性化ID图像

给定一些输入ID的图像&#xff0c;ConsistentID可以仅使用单个图像根据文本提示生成不同的个性化ID图像。效果看起来也是非常不错。 相关链接 Code:https://github.com/JackAILab/ConsistentID Paper&#xff1a;https://ssugarwh.github.io/consistentid.github.io/arXiv.pd…

【openlayers系统学习】4.1渲染矢量瓦片、VectorTile 层

一、VectorTile 层 我们现在知道如何加载切片图像&#xff0c;并且已经看到了加载和渲染矢量数据的不同方法。但是&#xff0c;如果我们能够拥有快速传输到浏览器的切片&#xff0c;并且可以动态样式化&#xff0c;那该多好啊&#xff1f;这就是矢量切片的用途。OpenLayers 通…

ubuntu_概念

su(switch user) wget(Web Get) cd(change directory) dpkg(Debian Packager)为 “Debian” 专门开发的套件管理系统&#xff0c;方便软件的安装、更新及移除。 chmod(Change Mode)用于改变文件或目录的权限 ps(Process Status)进程状态 grep(Global Regular Expression Print)…