顺序表的使用

news2024/10/5 12:21:17

SeqList.h

#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
typedef int SLDatatype;

//动态顺序表
typedef struct SeqList {
	SLDatatype* arr;
	int size;//有效数据个数
	int capacity;//空间容量
}SL;//将类型struct SeqList改为SL



//顺序表的初始化
void SLInit(SL* s);

//顺序表的销毁
void SLDestroy(SL* s);



//增容
void SLCheckCapacity(SL* s);



//顺序表的插入
void SLPushBack(SL* s, SLDatatype x);//尾插
void SLPushFront(SL* s, SLDatatype x);//头插


//指定位置之前插入/删除数据
void SLInsert(SL* s, int pos, SLDatatype x);
void SLErase(SL* s, int pos);//删除


//查找数据位置
int SLFind(SL* s, SLDatatype x);


//顺序表插入数据的删除
void SLPopBack(SL* s);//删除尾部的数据
void SLPopFront(SL* s);//删除头部的数据



//打印
void SLPrint(SL s);


SeqList.c


#include "SeqList.h"


//初始化,接收的是地址
void SLInit(SL* s) {
	s->arr = NULL;
	s->size = 0;
	s->capacity = 0;
}

//增容
void SLCheckCapacity(SL* s) {
	int NewCapacity = s->capacity == 0 ? 4 : 2 * s->capacity;//判断capacity是否为0,不为0就扩大2倍
	SLDatatype* tmp = (SLDatatype*)realloc(s->arr, NewCapacity * sizeof(SLDatatype));//空间增容
	//realloc有可能申请失败 
	if (tmp == NULL) {
		perror("realloc:");
		exit(1);//终止程序
	}
	//申请成功
	s->arr = tmp;
	s->capacity = NewCapacity;
}

//销毁
void SLDestroy(SL* s) {
	if (s->arr) {
		free(s->arr);
	}
	s->arr = NULL;
	s->size = 0;
	s->capacity = 0;
}

//尾插
void SLPushBack(SL* s, SLDatatype x) {
	assert(s);//判断指针有效性
	if (s->size == s->capacity) {
		//给空间增容
		SLCheckCapacity(s);
	}
	s->arr[s->size++] = x;//插入之后size要加1
}

//头插
void SLPushFront(SL* s, SLDatatype x) {
	assert(s);//判断指针有效性
	if (s->size == s->capacity) {
		//给空间增容
		SLCheckCapacity(s);
	}
	/*int NewSize = s->size;
	while (NewSize) {
		s->arr[NewSize] = s->arr[NewSize - 1];
		NewSize--;
	}*/
	for (int i = s->size; i > 0; i--) {
		s->arr[i] = s->arr[i - 1];
	}
	s->arr[0] = x;
	s->size++;
}

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

//尾删
void SLPopBack(SL* s) {
	assert(s);
	assert(s->size);
	s->size--;//减掉一位
}

//头删
void SLPopFront(SL* s) {
	assert(s);
	assert(s->size);
	for (int i = 0; i < s->size - 1; i++) {
		s->arr[i] = s->arr[i + 1];
	}
	s->size--;
}


//指定位置之前插入
void SLInsert(SL* s, int pos, SLDatatype x) {
	assert(s);
	//位置超出容量范围则终止程序
	if (pos > (s->capacity) || pos < 0)
		exit(1);
	//容量不够则增容
	if (s->capacity == s->size) {
		SLCheckCapacity(s);
	}
	for (int i = s->size; i > pos; i--) {
		s->arr[i] = s->arr[i - 1];
	}
	s->arr[pos] = x;
	s->size++;
}

//删除指定位置的数据
void SLErase(SL* s, int pos) {
	assert(s);
	if (pos > (s->capacity) || pos < 0)
		exit(1);
	for (int i = pos; i < s->size; i++) {
		s->arr[i] = s->arr[i + 1];
	}
	s->size--;
}


//查找数据的位置
int SLFind(SL* s, SLDatatype x) {
	assert(s);
	for (int i = 0; i < s->size; i++) {
		if (s->arr[i] == x) {
			return i;
		}
	}
	return 0;
}

Test.c


#include "SeqList.h"

void Test01() {
	//SL s1;
	//SLInit(&s1);
	//SLPushBack(&s1, 4);
	//SLPushBack(&s1, 2);
	//SLPushBack(&s1, 8);
	//SLPushBack(&s1, 3);
	//SLPushBack(&s1, 7);
	//SLPrint(s1);
	///*SLPopFront(&s1);
	//SLPrint(s1);
	//SLPopFront(&s1);
	//SLPrint(s1);
	//SLPopBack(&s1);
	//SLPrint(s1);
	//SLPopBack(&s1);
	//SLPrint(s1);*/
	//SLInsert(&s1, 3, 6);
	//SLPrint(s1);
	//SLErase(&s1, 0);
	//SLPrint(s1);
	//int position = SLFind(&s1, 6);
	//printf("%d", position);
	SL s;
	SLInit(&s);
	SLPushBack(&s, 5);
	SLPushBack(&s, 2);
	SLPushBack(&s, 8);
	SLPushBack(&s, 10);
	SLPushBack(&s, 22);
	SLPrint(s);
	SLPopBack(&s);
	SLPrint(s);
	SLPushFront(&s, 66);
	SLPrint(s);
	SLInsert(&s, 3, 77);
	SLPrint(s);
}

int main() {
	Test01();
	return 0;
}

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

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

相关文章

目标检测 DAB-DETR(2022)

文章目录 前言Query是什么&#xff0c;Detr收敛速度慢的原因是什么&#xff1f;改进策略位置先验和模型框架设置温度系数 前言 本文认为原始的Detr系列论文中&#xff1a;可学习的object queries仅仅是给model预测box提供了锚点&#xff08;中心点&#xff09;信息&#xff0c…

SpringBoot环境下古典舞交流平台的快速开发

第三章 系统分析 3.1 可行性分析 需要使用大部分精力开发的古典舞在线交流平台为了充分降低开发风险&#xff0c;特意在开发之前进行可行性分析这个验证系统开发是否可行的步骤。本文就会从技术角度&#xff0c;经济角度&#xff0c;还有操作角度等进行综合阐述。 3.1.1技术可行…

Python案例--三数排序

一、引言 在信息爆炸的时代&#xff0c;我们每天都会接触到大量的数据。无论是工作中的报表、学习中的数据集&#xff0c;还是日常生活中的购物清单&#xff0c;数据的有序性对于提高效率和决策质量都至关重要。排序算法作为数据处理的基础工具&#xff0c;其重要性不言而喻。…

日记学习小迪安全27

感觉复制粘贴没有意思&#xff0c;而且还有点浪费时间&#xff0c;主要是学习&#xff0c;不是复制&#xff0c;那就复制别人的吧 第27关就参考这篇文章吧&#xff0c;以下大部分内容都是参考以下文章&#xff08;侵权删除&#xff09; 第27天&#xff1a;WEB攻防-通用漏洞&a…

芯片录-低压差线性稳压器AZ1084D-ADJE1失效记录与原理分析

背景 最近主板坏了&#xff0c;现象是主机不停重启&#xff0c;USB设备LED灯一会儿亮&#xff0c;一会儿灭。经过一些分析和定位&#xff0c;通过测温发现主板上AZ1084D-ADJE1芯片高达91摄氏度&#xff0c;进一步测量该芯片的输出引脚和接地引脚短路&#xff0c;初步推测某些原…

Shell-使用函数

在 Shell 脚本中&#xff0c;函数是由一段代码定义的&#xff0c;可以被重复调用。Shell 函数的定义和调用相对简单&#xff0c;并且它支持参数传递和返回值。错误处理在 Shell 中也非常重要&#xff0c;通常通过检查返回的状态码来判断是否有错误发生。 1.Shell 函数的定义和…

构建高效招聘流程:Spring Boot大学生就业系统

1系统概述 1.1 研究背景 如今互联网高速发展&#xff0c;网络遍布全球&#xff0c;通过互联网发布的消息能快而方便的传播到世界每个角落&#xff0c;并且互联网上能传播的信息也很广&#xff0c;比如文字、图片、声音、视频等。从而&#xff0c;这种种好处使得互联网成了信息传…

28 基于51单片机的两路电压检测(ADC0808)

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于51单片机&#xff0c;通过ADC0808获取两路电压&#xff0c;通过LCD1602显示 二、硬件资源 基于KEIL5编写C代码&#xff0c;PROTEUS8.15进行仿真&#xff0c;全部资源在页尾&#xff0c;提供…

【中间件学习】Git的命令和企业级开发

一、Git命令 1.1 创建Git本地仓库 仓库是进行版本控制的一个文件目录。我们要想对文件进行版本控制&#xff0c;就必须创建出一个仓库出来。创建一个Git本地仓库对应的命令是 git init &#xff0c;注意命令要在文件目录下执行。 hrxlavm-1lzqn7w2w6:~/gitcode$ pwd /home/hr…

Yocto - 使用Yocto开发嵌入式Linux系统_06 掌握Bitbake工具

Grasping the BitBake Tool 在上一章中&#xff0c;我们了解了元数据、元数据集合概念以及 conf/layer.conf 的重要性。在本章中&#xff0c;我们将更深入地研究元数据&#xff0c;了解配方如何相互依赖&#xff0c;并了解 BitBake 如何处理依赖关系。 In the previous chapter…

Python机器视觉:01- 利用列表和切片操作 - 做一个弧线和图片相交的mask区域

前言&#xff1a; Python的列表处理&#xff0c;在机器视觉中经常被用到&#xff0c;这里结合基本的概念机器视觉实践案例&#xff0c;成文如下&#xff1a; 本身将实现一个&#xff0c;弧线的mask填充&#xff1a;这个mask是我的一个天文项目的应用&#xff0c;目的在于将月…

冥想第一千三百零一天(1301)

1.今天上午溪溪和小侄子写作业&#xff0c;我带着桐桐去了惠济区的裕华广场永辉&#xff0c;给家人买了好吃的&#xff0c;下午4点半左右去了妈妈朋友家里摘石榴。 2.感谢父母&#xff0c;感谢朋友&#xff0c;感谢家人&#xff0c;感谢不断进步的自己。

JavaWeb 14.详解TCP协议的三次握手和四次挥手

目录 一、TCP协议与UDP协议 二、TCP协议 1、建立连接&#xff08;三次握手&#xff09; 过程 2、断开连接&#xff08;四次挥手&#xff09; 过程 国庆节快乐&#xff01; 一文详解TCP协议中的三次握手建立连接和四次挥手断开连接 —— 24.10.3 一、TCP协议与UDP协议 tcp协议与…

【可答疑】基于51单片机的智能台灯(含仿真、代码、报告、演示视频等)

✨哈喽大家好&#xff0c;这里是每天一杯冰美式oh&#xff0c;985电子本硕&#xff0c;大厂嵌入式在职0.3年&#xff0c;业余时间做做单片机小项目&#xff0c;有需要也可以提供就业指导&#xff08;免费&#xff09;~ &#x1f431;‍&#x1f409;这是51单片机毕业设计100篇…

MATLAB中minres函数用法

目录 语法 说明 示例 线性系统的迭代解 使用指定了预条件子的 minres 提供初始估计值 使用函数句柄代替数值矩阵 minres函数的功能是求解线性系统 - 最小残差法。 语法 x minres(A,b) x minres(A,b,tol) x minres(A,b,tol,maxit) x minres(A,b,tol,maxit,M) x mi…

CPU性能篇-平均负载-Day 01

1. 平均负载 1.1 什么是平均负载 平均负载是指单位时间内&#xff0c;系统处于可运行状态和不可中断状态的平均进程数&#xff0c;也就是平均活跃进程数&#xff0c;它和 CPU 使用率并没有直接关系。 1.1.1 什么是可运行状态 指正在使用 CPU 或者正在等待 CPU 的进程&#xff…

如何轻松查看你的 Windows 版本? 检查电脑Windows版本号五种方法

很多朋友发现windows拥有许多版本&#xff0c;比如如家庭版、企业版、专业版和教育版等&#xff0c;而每个版本都有相应的版本号&#xff0c;那么&#xff0c;怎么知道电脑windows版本呢&#xff1f;下面分享五种查看方法 自 1985 年首次推出以来&#xff0c;Windows 操作系统…

IntelliJ IDEA 2024.2 新特性概览

文章目录 1、重点特性:1.1 改进的 Spring Data JPA 支持1.2 改进的 cron 表达式支持1.3 使用 GraalJS 作为 HTTP 客户端的执行引擎1.4 更快的编码时间1.5 K2 模式下的 Kotlin 性能和稳定性改进 2、用户体验2.1 改进的全行代码补全2.2 新 UI 成为所有用户的默认界面2.3 Search E…

利用CRITIC客观权重赋权法进行数值评分计算——算法过程

1、概述 ‌CRITIC客观评价法是一种基于指标的对比强度和指标之间的冲突性来确定指标客观权数的方法。‌ 该方法适用于判断数据稳定性&#xff0c;并且适合分析指标或因素之间有着一定的关联的数据‌。 CRITIC方法的基本原理包括两个主要概念&#xff1a;对比强度和指标之间的…

Linux学习笔记(六):服务管理,监控,RPM包管理,yum包管理工具,Linux启动管理,网络管理

Linux学习笔记&#xff08;六&#xff09;&#xff1a;服务管理&#xff0c;监控&#xff0c;RPM包管理&#xff0c;yum包管理工具&#xff0c;Linux启动管理&#xff0c;网络管理 1. 服务管理 1.1 service 启动/停止服务 service 命令是最常用的服务管理工具之一&#xff0c…