顺序表<数据结构 C 版>

news2024/9/23 19:19:07

目录

线性表

顺序表

动态顺序表类型

初始化

 销毁

打印

检查空间是否充足(扩容)

尾部插入

头部插入

尾部删除

头部删除

指定位置插入

指定位置删除

查找数据


线性表

        线性表是n个相同特性的数据元素组成的有限序列,其是一种广泛运用的数据结构,常见的线性表有顺序表、栈、链表、队列等。

        其在逻辑上是线性的,物理结构(存储结构)上不一定是线性的。


顺序表

        顺序表就是线性表的一种,它在逻辑结构与物理结构上都是连续的,一般情况下它的底层就是数组,在数组基础上多了增删查改操作。

顺序表有静态顺序表和动态顺序表,我们常常采用动态顺序表,因为它的扩容方便、空间浪费更少。


动态顺序表类型
typedef int SeqDataType;//将动态顺表的存储数据的类型重命名,方便后期统一修改



//动态顺序表
typedef struct SeqList {//命名:Sequence List顺序表
	SeqDataType* arr;
	int capacity;//动态顺序表的容量
	int size;//动态顺序表的有效个数
}SL;

初始化
//初始化
void SLInit(SL* s) {
	s->arr = NULL;
	s->capacity = s->size = 0;
}

 销毁
//销毁
void SLDestory(SL* s) {
	if (!s->arr) {//等同于s->arr==NULL,判断要释放的空间是否是NULL,防止释放NULL
		perror("Destory Fail");//打印错误
		exit(1);
	}
	free(s->arr);//释放动态开辟的内存
	s->arr = NULL;
	s->capacity = s->size = 0;
}

打印

打印操作方便我们检查错误。

//打印
void SLPrint(SL* s) {
	assert(s);
	for (int i = 0; i < s->size; i++) {
		printf("%d ", s->arr[i]);
	}
	printf("\n");
}

检查空间是否充足(扩容)

插入操作会扩大空间大小,那么在进行插入操作前,我们应该检查空间是否充足(扩容)

//检查空间是否充足(扩容)
void SLCheckCapacity(SL* s) {
	if (s->capacity == s->size) {
	//判断有效元素个数是否和空间大小相同,相同:空间用满了,要扩容
		int newcapacity = s->capacity == 0 ? 4 : s->capacity * 2;
		//空间是否为0,是:赋个初值4(防止按倍数扩容出错)
		//不是:按两倍扩容,赋给临时变量,防止扩容失败对原capacity改变
		SeqDataType* p = (SeqDataType*)realloc(s->arr, sizeof(SeqDataType) *newcapacity);
		//这里是为s->arr扩容,不是为结构体(动态顺序表)
		if (!p) {
			perror("realloc fail");
			exit(1);
		}
		s->arr = p;
		s->capacity = newcapacity;
	}
}

尾部插入
//尾插
void SLPushBack(SL* s, SeqDataType x) {
	assert(s);
	SLCheckCapacity(s);//检查空间是否充足
	s->arr[s->size++] = x;//尾部插入数据,并使有效元素加1
}

头部插入
//头插
void SLPushFront(SL* s, SeqDataType x) {
	assert(s);//
	SLCheckCapacity(s);
	for (int i = s->size ; i > 0; i--) {
		s->arr[i] = s->arr[i-1];
	}//将数据整体后移一位,腾出第一位给头插,且循环条件初始化i等于s->size
	s->arr[0] = x;
	s->size++;//别忘了将有效数据个数加一
}

尾部删除
//尾删
void SLPopBack(SL* s) {
	assert(s->arr);//不能对空数组进行删除
	assert(s->size);//不能对有效元素0个的数组进行删除
	s->size--;//直接使有效元素个数减1即可
}

头部删除
//头删
void SLPopFront(SL* s) {
	assert(s->arr);
	assert(s->size);
	for (int i = 0; i < s->size - 1; i++) {
		s->arr[i] = s->arr[i + 1];
	}//注意循环条件s->size-1,取到最后一个元素前一个位置
	s->size--;
}

指定位置插入
//指定位置之前插入数据
void SLInsert(SL* s, int pos, SeqDataType x) {
	assert(s);
	assert(pos >= 0 && pos <= s->size);//pos=0时头插,pos=s->size时尾插,
	SLCheckCapacity(s);
	for (int i = s->size; i >pos; i++) {//从pos位置开始腾出位置给要插入的数据
		s->arr[i] = s->arr[i - 1];
	}
	s->size++;
	s->arr[pos] = x;
}

指定位置删除
//指定位置删除
void SLErase(SL* s, int pos) {
	assert(s->arr);
	assert(pos >= 0 && pos < s->size);//保证pos是可删除的
	for (int i = pos; i < s->size - 1; i++) {//使pos以后的数据向前移一位
		s->arr[i] = s->arr[i + 1];
	}
	s->size--;
}

查找数据
//查找数据
void SLFind(SL* s, SeqDataType x) {
	assert(s->arr);
	assert(s->size > 0);
	for (int i = 0; i < s->size; i++) {//遍历顺序表,找到值返回下标,找不到,返回-1
		if (s->arr[i] == x) {
			return i;
		}
	}
	return -1;
}

最后我们来测试一下我们写的代码

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

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

相关文章

vue实现动态图片(gif)

目录 1. 背景 2. 分析 3. 代码实现 1. 背景 最近在项目中发现一个有意思的小需求&#xff0c;鼠标移入一个盒子里&#xff0c;然后盒子里的图就开始动起来&#xff0c;就像一个gif一样&#xff0c;然后鼠标移出&#xff0c;再按照原来的变化变回去&#xff0c;就像变形金刚…

掌握Vue.js:六步打造前端开发高手!

Vue.js&#xff0c;这个在前端开发界熠熠生辉的名字&#xff0c;以其轻巧、高效、易学的特性&#xff0c;成为了众多开发者构建动态交互式网页的首选框架。它不仅简化了前端开发的复杂性&#xff0c;还提供了一套丰富的组件库和工具链&#xff0c;使得开发者能够快速上手并构建…

微软Office PLUS办公插件下载安装指南

微软OfficePLUS插件下载安装指南 简介&#xff1a; OfficePLUS微软官方出品的Office插件 &#xff0c;OfficePLUS拥有30万高质量模板素材&#xff0c;能帮助Word、Excel、Powerpoint、PDF等多种办公软件提升效率&#xff0c;具有智能化、模板质量高、运行快、稳定性强等优点。…

【大语言模型】私有化搭建-企业知识库-知识问答系统

下面是我关于大语言模型学习的一点记录 目录 人工智能学习路线 MaxKB 系统(基于大语言模型的知识问答系统) 部署开源大语言模型LLM 1.CPU模式(没有好的GPU&#xff0c;算力和效果较差) 2.GPU模式&#xff08;需要有NVIDIA显卡支持&#xff09; Ollama网络配置 Ollama前…

docker私有仓库harbor安装

Harbor默认安装 下载harbor https://github.com/goharbor/harbor/releases/download/v2.11.0/harbor-offline-installer-v2.11.0.tgz 目前要求docker版本&#xff0c;docker 20.10.10-ce &#xff0c;和docker-compose 1.18.0 查看 docker-compose版本 docker-compose --ver…

卷积神经网络图像识别车辆类型

卷积神经网络图像识别车辆类型 1、图像 自行车: 汽车: 摩托车: 2、数据集目录 3、流程 1、获取数据,把图像转成矩阵,并随机划分训练集、测试集 2、把标签转为数值,将标签向量转换为二值矩阵 3、图像数据归一化,0-1之间的值 4、构造卷积神经网络 5、设置图像输入…

Mysql数据表的约束(下)

3.默认值约束(default) 与非空约束的命令一致,因为都属于列级约束,因此只需将not null改为default 默认值即可 删除默认值约束: 4.主键约束(primary key) 表示给一张表格设置了一个唯一标识,为了更快的去通过唯一的数据去准确的查找到每一条记录,一半咱们在创建表…

强化学习编程实战-5 基于时间差分的方法

第4章中&#xff0c;当模型未知时&#xff0c;由于状态转移概率P未知&#xff0c;动态规划中值函数的评估方法不再适用&#xff0c;用蒙特卡洛的方法聘雇值函数。 在蒙特卡洛方法评估值函数时&#xff0c;需要采样一整条轨迹&#xff0c;即需要从初始状态s0到终止状态的整个序列…

【学习笔记】无人机(UAV)在3GPP系统中的增强支持(七)-通过无人机实现无线接入的独立部署

引言 本文是3GPP TR 22.829 V17.1.0技术报告&#xff0c;专注于无人机&#xff08;UAV&#xff09;在3GPP系统中的增强支持。文章提出了多个无人机应用场景&#xff0c;分析了相应的能力要求&#xff0c;并建议了新的服务级别要求和关键性能指标&#xff08;KPIs&#xff09;。…

【精品资料】模块化数据中心解决方案(33页PPT)

引言&#xff1a;模块化数据中心解决方案是一种创新的数据中心设计和部署策略&#xff0c;旨在提高数据中心的灵活性、可扩展性和效率。这种方案通过将数据中心的基础设施、计算、存储和网络资源封装到标准化的模块中&#xff0c;实现了快速部署、易于管理和高效运维的目标 方案…

FPGA入门-自用

写代码&#xff0c;并将引脚对应到板子相应的引脚上 下载程序到板子上 遇到错误了&#xff0c;不按想的来的了&#xff0c;进行仿真 查看网表图查看问题所在 简化了一些步骤&#xff1a;未使用引脚的设置&#xff0c;电压设置&#xff1b; 通过画网表结构图来构成电路 时钟 …

Android焦点之SurfaceFlinger的apply

接animate()的openSurfaceTransaction(),prepareSurfaces(),closeSurfaceTransaction() 1. mService.openSurfaceTransaction()&#xff0c;通过SurfaceControl来通知native开始一个Transaction&#xff1b; 2. mService.closeSurfaceTransaction()&#xff0c;通过SurfaceCo…

JVM系列 | 对象的创建与存储

JVM系列 | 对象的生命周期1 对象的创建与存储 文章目录 前言对象的创建过程内存空间的分配方式方式1 | 指针碰撞方式2 | 空闲列表 线程安全问题 | 避免空间冲突的方式方式1 | 同步处理&#xff08;加锁)方式2 | 本地线程分配缓存 对象的内存布局Part1 | 对象头Mark Word类型指针…

如何在Mac上恢复已删除的存档文件?

在本文中&#xff0c;我们将分享在 macOS 或 OS X 上运行的 MacBook、iMac 或 Mac mini 上恢复已删除存档文件的不同方法。 下载免费试用的 Mac 数据恢复软件以在 Mac 上恢复已删除的存档文件。 macOS 可以选择压缩您的文件。您只需选择文件&#xff0c;按住 Control 键单击&a…

实验场:在几分钟内使用 Bedrock Anthropic Models 和 Elasticsearch 进行 RAG 实验

作者&#xff1a;来自 Elastic Joe McElroy, Aditya Tripathi 我们最近发布了 Elasticsearch Playground&#xff0c;这是一个新的低代码界面&#xff0c;开发人员可以通过 A/B 测试 LLM、调整提示&#xff08;prompt&#xff09;和分块数据来迭代和构建生产 RAG 应用程序。今天…

基于Fail2ban及iptables的SSH端口爆破防御方案

君衍. 一、本篇介绍二、Fail2ban1、简介2、工作方式3、优缺点4、工作原理5、目录结构6、功能特点 三、更改默认SSH端口1、更改配置文件2、重启服务 四、SSH日志审计1、连接失败的IP2、失败IP次数排行3、连接成功的IP4、成功IP次数排行 五、Fail2ban1、安装2、配置3、日志查看4、…

前端项目本地的node_modules直接上传到服务器上无法直接使用(node-sasa模块报错)

跑 jekins任务的服务器不能连接外网下载依赖包&#xff0c;就将本地下载的 node_modules直接上传到服务器上&#xff0c;但是运行时node-sass模块报错了ERROR in Missing binding /root/component/node_modules/node-sass/vendor/linux-x64-48/binding.node >> 报错信息类…

matlab PID tuner整定工具箱的用法

从主页的APP中搜索到它&#xff1a; 按照下图IMPORT导入被控对象的传递函数 在下图的Inspect按钮中可以看到导入的被控对象的传函。 在下图的Type中选择控制器类型&#xff1a; 在下图的Form中选择PID的形式&#xff1a;有两种可选&#xff1a;平行式Parallel和标准式Standard …

0基础学会在亚马逊云科技AWS上利用SageMaker、PEFT和LoRA高效微调AI大语言模型(含具体教程和代码)

项目简介&#xff1a; 小李哥今天将继续介绍亚马逊云科技AWS云计算平台上的前沿前沿AI技术解决方案&#xff0c;帮助大家快速了解国际上最热门的云计算平台亚马逊云科技AWS上的AI软甲开发最佳实践&#xff0c;并应用到自己的日常工作里。本次介绍的是如何在Amazon SageMaker上…

深度学习概览

引言 深度学习的定义与背景 深度学习是机器学习的一个子领域&#xff0c;涉及使用多层神经网络分析和学习复杂的数据模式。深度学习的基础可以追溯到20世纪80年代&#xff0c;但真正的发展和广泛应用是在21世纪初。计算能力的提升和大数据的可用性使得深度学习在许多领域取得…