顺序表之初

news2024/9/22 21:30:23

在这里插入图片描述

欢迎来到我的:世界

希望作者的文章对你有所帮助,有不足的地方还请指正,大家一起学习交流 !


目录

  • 线性表简介
    • 顺序表定义
    • 动态顺序表的初始化
    • 尾插
    • 头插
    • Cheak 判断是否增容
    • 尾删:
    • 头删:
    • 打印
    • 在pos位置前插入x
    • 删除pos位置的值
    • 查找
    • 修改
    • 销毁

线性表简介

百度:线性表最基本、最简单、也是最常用的一种数据结构。线性表(linear list)是数据结构的一种,一个线性表是n个具有相同特性的数据元素的有限序列。

  • 线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使 用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串…
  • 线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的, 线性表在物理上存储时,通常以数组和链式结构的形式存储。

![在这里插入图片描述](https://img-blog.csdnimg.cn/407892b043c9486db9b64ff8f8d330a0.png


顺序表定义

顺序表是用一段物理地址连续的储存单元依次储存数据结构的线性结构,一般情况采用的是数组储存;在数组上完成数据的增删查改;

顺序表可以分为:
1.静态顺序表:使用固定长数组存储元素;

#define N 100
typedef int SLDateType;
//定义静态顺序表
typedef struct SeqList
{
	SLDateType a[N]; //固定数组大小,N的值无法改变
	int size;        //数组有效的个数
	
}SeqList;

2.动态顺序表:使用动态开辟的数组储存;

typedef int SLDateType;
//定动态义顺序表
typedef struct SeqList
{
	SLDateType* a;//指向动态数组的指针
	int size;     //数组的有效数据
	int capacity; //空间大小
}SeqList;

动态顺序表的初始化

初始化顺序表是使用动态分配数组空间方式构造一个空的线性表。

//初始化
void SeqListInit(SeqList* ps)
{
	//用 malloc申请一块空间
	ps->a = (SLDateType*)malloc(sizeof(SLDateType) * 4);
	if (ps->a== NULL)//判断是否申请空间成功
	{
		perror("malloc");
		exit(-1);
	}
	
	ps->capacity = 4;//将顺序表的最大长度设为 4
	ps->size = 0; //将顺序表的当前长度设为 0

}

有关malloc函数申请动态内存空间,可以看我的另一篇博客动态内存空间管理,有详细解释;

尾插

尾插就是在最后一个元素的后面插入一个元素

  • 尾插有三种情况:
    第一种:情况是顺序表压根就没有空间,用assert解决;
    第二种:情况就是我们创建的 capacity 空间满了,需要增容再往后插入;
    第三种:情况是空间足够,直接插入数据即可;
void SeqListPushBack(SeqList* ps, SLDateType x)
{
	//每次进来判断依次满了要扩容
	if (ps->size  == ps->capacity)
	{
		//realloc函数是专门用来增容的,以两倍的增容
		SLDateType* tem = (SLDateType*)realloc(ps->a, ps->capacity * 2  * sizeof(SLDateType));
		if (tem == NULL)//判断是否增容成功
		{
			perror("realloc");
			exit(-1);
		}
		ps->a = tem;
		ps->capacity *= 2;//空间大小以两倍增容
	}

	ps->a[ps->size] = x;//运用下标存储要插入的值
	ps->size++;//尾插成功则有效数据就加 1
}

有关realloc函数调整动态申请的内存空间,详解也再我的另一篇博客中:动态内存空间管理,其详细解释,一定要看懂!很重要!!

头插

顺序表要求数据是连续存储的,且必须是从头开始存储。所以,对于顺序表而言如果要实现头插,就需要把数据往后挪动。不能从前往后挪,如果从前往后挪就挪就会把后面的数据覆盖掉。
在这里插入图片描述

void SeqListPushFront(SeqList* ps, SLDateType x) {

	//每次进来判断依次满了要扩容
	if (ps->size == ps->capacity)
	{
		//realloc函数是专门用来增容的,以两倍的增容
		SLDateType* tem = (SLDateType*)realloc(ps->a, ps->capacity * 2 * sizeof(SLDateType));
		if (tem == NULL)//判断是否增容成功
		{
			perror("realloc");
			exit(-1);
		}
		ps->a = tem;
		ps->capacity *= 2;//空间大小以两倍增容
	}
	//从后往前式的往后移动一个元素
	int end = ps->size - 1;
	while (end>=0)
	{
		ps->a[end+1] = ps->a[end];
		--end;
	}

	ps->a[0] = x;//插入首元素
	ps->size++;//头插成功有效元素加1
}

这个时候你回头会发现,如果要增容的时的代码几乎一致,我们可以为要增容单独写一个函数,判断是否要增容:

Cheak 判断是否增容

void Cheak(SeqList*ps)
{
	//每次进来判断依次满了要扩容
	if (ps->size == ps->capacity)
	{
		//realloc函数是专门用来增容的,以两倍的增容
		SLDateType* tem = (SLDateType*)realloc(ps->a, ps->capacity * 2 * sizeof(SLDateType));
		if (tem == NULL)//判断是否增容成功
		{
			perror("realloc");
			exit(-1);
		}
		ps->a = tem;
		ps->capacity *= 2;//空间大小以两倍增容
	}
}

而这个时候的尾插、头插这样写:

头插:

void SeqListPushFront(SeqList* ps, SLDateType x) {
	Cheak(ps);//判断增容
	//从后往前式的往后移动一个元素
	int end = ps->size - 1;
	while (end>=0)
	{
		ps->a[end+1] = ps->a[end];
		--end;
	}

	ps->a[0] = x;//插入首元素
	ps->size++;//头插成功有效元素加1
}

尾插:

void SeqListPushBack(SeqList* ps, SLDateType x)
{
	Cheak(ps);//判断增容

	ps->a[ps->size] = x;//运用下标存储要插入的值
	ps->size++;//尾插成功则有效数据就加 1
}

尾删:

顺序表的尾删比较简单,直接让size–就可以;

void SeqListPopBack(SeqList* ps)
{
	//当顺序表中无元素,不会进行尾删
	if (ps->size == 0)
	{
		printf("size越界访问");
		exit(-1);
	}

	ps->size--;
}

头删:

头删可以理解为:直接将从第二元素从前往后的覆盖上去;

//头删
void SeqListPopFront(SeqList* ps)
{
	
	assert(ps->size > 0);

	//删减
	int i = 0;
	for (i = 0; i < ps->size; i++)
	{
		ps->a[i] = ps->a[i + 1];
	}
	ps->size--;
}

打印

打印出顺序表中的元素;

void SeqListPrint(SeqList* ps) {

	int i = 0;
	for (i = 0; i < ps->size; i++)
	{
		printf("%d ", ps->a[i]);
	}
	printf("\n");
}

在pos位置前插入x

需要知道pos为元素下标,找到pos位后,然后将其后面的所有元素向后移动一个元素,再将要插入的x插入pos位置;

void SeqListInsert(SeqList* ps, int pos, SLDateType x)
{
	//检查pos位置是否在顺序表里面
	assert(pos >= 0 && pos <= ps->size);
	Cheak(ps);//判断是否增容
	//找到有效数据元素的下标
	int end = ps->size - 1;
	//往后移
	while (end>=pos)
	{
		ps->a[end+1] = ps->a[end];
		end--;
	}
	ps->a[pos] = x;//空出pos位后插入
	ps->size++;
}

注意:SeqListInsert这个函数可以代替尾插或头插;

删除pos位置的值

删除指定位置的数据,我们仍然要限制 pos 的位置。限制条件部分和 SeqListInsert 不同的是,因为 psl->size 这个位置没有效数据,所以删除的位置不能是 psl->size!

void SeqListErase(SeqList* ps, int pos) {
	//检查pos位置是否在顺序表里面
	assert(pos >= 0&&pos< ps->size);
	//找到pos位置的下一个
	int begain = pos + 1;
	
	while (begain < ps->size)
	{
		ps->a[begain - 1] = ps->a[begain];
		begain++;
	}
	ps->size--;

}

注意:SeqListErase这个函数可以代替尾删或头删;

查找

//查找返回其下标,否则返回-1;
int SLFind(SL* ps, SLDatatype x)
{
	assert(ps);
	for (int i = 0; i <= ps->size; i++)
	{
		if (ps->a[i] == x)
			return i;
	}
	return -1;
 
}

修改

修改pos位置的值

//修改pos位置的值,pos是其下标
void SLModify(SL* ps, int pos, SLDatatype x)  
{
	assert(ps);
	assert(pos >= 0 && pos < ps->size);
 
	ps->a[pos] = x;
 
}

看代码运行结果:
在这里插入图片描述
最后的是:

销毁

如果进行了动态内存的内存空间申请,一定要记得销毁,因为动态内存空间是不会主动释放的,除非程序结束,否则可能会存在内存泄漏的风险;

//销毁
void SeqListDestroy(SeqList* ps)
{
	//释放
	free(ps);
	ps->a = NULL;
	ps->capacity = 0;
	ps->size = 0;

}

到了最后:感谢支持

我还想告诉你的是:
------------对过程全力以赴,对结果淡然处之
也是对我自己讲的

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

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

相关文章

Matlab之智能优化算法函数调用

1.句柄函数 句柄函数即我们要求的目标函数&#xff0c;以下三种算法的调用仅是求解最小值&#xff0c;若要求目标函数的最大值&#xff0c;可在返回结果中加负号。 function value Get_Fitness(x,y)value x^2 y^2;% 若要求x^2 y^2最大值可设value -(x^2 y^2); end句柄函数…

WPF基础入门-Class6-WPF通知更改

WPF基础入门 Class6-WPF通知 1、显示页面&#xff1a; <Grid><StackPanel><TextBox Text"{Binding Name}"></TextBox><TextBox Text"{Binding Title}"></TextBox><Button Command"{Binding ShowCommand}&qu…

VUE笔记(一)初识vue

一、vue的简介 1、什么是vue 官网地址:Vue.js Vue (读音 /vjuː/&#xff0c;类似于 view) 是一套用于构建用户界面的渐进式框架。 构建用户界面&#xff1a;之前在学习vue之前通过原生js对DOM操作进行构建用户界面的 使用原生js构建用户界面的不足 - 没有规范&#xff0c…

mysql sql 执行流程

监控查询缓存的命中率 show status like ‘%qcache%’; mysql 缓存机制&#xff0c;以及 8.0 为啥取消 select sql_NO_Cache * from 表 where xxx; # 不使用缓存

如何开发一款唯一艺术平台 区块链 /数字藏品

艺术作品是人类文化的瑰宝&#xff0c;而艺术平台则是连接艺术家与观众的桥梁。如何开发一款独一无二的艺术平台&#xff0c;既要满足专业艺术作品展示的要求&#xff0c;又要提供深度思考的空间&#xff0c;这是我们所面临的挑战。本文将从专业性、思考深度和逻辑性等多个方面…

几个nlp的小任务(抽取式问答)

几个nlp的小任务(抽取式问答) 安装库抽取式问答介绍、SQuAD数据集初始化参数加载、导入数据集查看数据集示例加载tokenizer对长文本处理的演示对答案的位置进行验证整合刚才的步骤对数据集中的数据进行预处理加载微调模型设置args 参数使用数据清洗设置训练函数,开始训练安装…

浅谈信息论和信息编码

目录 背景 信息是什么 信息度量 小白鼠实验 哈夫曼编码 密码学 其它应用 背景 克劳德艾尔伍德香农&#xff08;Claude Elwood Shannon&#xff09;出生于 1916 年 美国密歇根州。1936 年毕业于密歇根大学&#xff0c;获得数学和电子工程学士学位。之后&#xff0c;他在麻…

将数据类型,类名作为参数传递使用的方法

在开发中遇到一个问题&#xff0c;就是给了很多的数据类型&#xff0c;需要找出当前数据属于哪个数据类型。 举个例子&#xff0c;我们现在有一组数据类型<int, double, float, char, bool>&#xff0c;并给定一个数据char c&#xff1b;需要通过一个函数找出变量c是类型…

fegin实现方法级别注解超时配置

fegin实现方法级别注解超时配置 测试的3.18新版本已经支持方法中参数带有Options 也可以自定义配置, Options options findOptions(argv);; 使用该注解方式需配合AOP使用! 原理是包装自己的client客户端, 替换框架的客户端! 应用到生产环境需自己充验证测试 1.0 注解 Target(…

Banana Pi 开源社区在深圳国际电子展(2023)上展示全系列新产品

Banana Pi 开源社区在深圳国际电子展(2023)上展示全系列新产品 Banana Pi开源硬件社区是由广东比派科技主导、台湾鸿海科技&#xff08;富士康&#xff09;全面战略支持的开源硬件项目。Banana Pi开源硬件系列开发板&#xff0c;完成核心系统和架构设计。开发文档、软件、硬件…

远程调试环境

一、远程调试 1.安装vscode 2.打开vscode&#xff0c;下载插件Remote-SSH,用于远程连接 3.安装php debug 4.远程连接&#xff0c;连接到远端服务器 注&#xff1a;连接远程成功后&#xff0c;在远程依然要进行安装xdebug&#xff0c;刚才只是在vscode中进行的安装。 5.配置la…

Property ‘sqlSessionFactory‘ or ‘sqlSessionTemplate‘ are required

项目场景&#xff1a; 最近因为公司业务需要在搭一个新架构&#xff0c;用的springboot3和jdk17,在整合mybatis多数据源的时候报错 &#xff08;引用的mybatisplus 和 mybatisplusjion的是最新的包-2023-08-26&#xff09; Error creating bean with name ‘XXXServiceImpl’:…

Python中的format()函数详细讲解

注&#xff1a;所以代码皆成功运行&#xff0c;可直接复制运行 一、基本使用 1、Python中的format()函数是一个格式字符串的函数&#xff0c;通过花括号{}识别替换字段&#xff0c;从而完成字符串的格式化。 #format后面放数字、字符串都可以 print("{}喜欢{}岁的{}&qu…

「Python」机器学习之线性判别分析(代码,不调包)

「Python」机器学习之线性判别分析&#xff08;代码&#xff0c;不调包&#xff09; 前言1 线性判别分析&#xff08;LDA&#xff09;2 实现2.1 LDA实现2.2 数据集示例 3 最后 前言 语言&#xff1a;python库&#xff1a;numpy, matplotlib教材参考&#xff1a;《机器学习》——…

MySql学习4:多表查询

教程来源 黑马程序员 MySQL数据库入门到精通&#xff0c;从mysql安装到mysql高级、mysql优化全囊括 多表关系 各个表结构之间存在各种关联关系&#xff0c;基本上分为三种&#xff1a;一对多&#xff08;多对一&#xff09;、多对多、一对一 一对多&#xff08;多对一&…

论文阅读 The Power of Tiling for Small Object Detection

The Power of Tiling for Small Object Detection Abstract 基于深度神经网络的技术在目标检测和分类方面表现出色。但这些网络在适应移动平台时可能会降低准确性&#xff0c;因为图像分辨率的增加使问题变得更加困难。在低功耗移动设备上实现实时小物体检测一直是监控应用的…

计网第四章(网络层)(四)

目录 一、IP数据报的发送和转发过程 发送&#xff1a; 1.直接交付和间接交付 如果判断源主机和目的主机是否在同一个网络中&#xff1f; 2.默认网关&#xff1a; 转发&#xff1a; 路由表&#xff1a; 一、IP数据报的发送和转发过程 发送&#xff1a; 由主机发送IP数据…

统信OS国产操作系统身份证读卡器社保卡读卡web网页开发使用操作流程

用于DONSEE系列身份证阅读器谷歌Chrome火狐Firefox插件&#xff0c;支持的型号有&#xff1a;EST-100、EST-100GS、EST-100G、EST-100U、EST-200G、EST-J13X等。 本方案无缝支持最新版本谷歌Chrome火狐Firefox等网页浏览器&#xff0c;支持H5、Vue、React、Node.js、Electron、…

Java“牵手”天猫商品销量API接口数据,天猫API接口申请指南

天猫平台商品销量接口是开放平台提供的一种API接口&#xff0c;通过调用API接口&#xff0c;开发者可以获取天猫商品的标题、价格、库存、月销量、总销量、库存、详情描述、图片等详细信息 。 获取商品销量接口API是一种用于获取电商平台上商品销量数据的接口&#xff0c;通过…

mysql 命令行 执行sql文件

方法1 source source file.sql; file.sql : 绝对路径或 相对路径。 方法2 mysql -u xxx -p < file.sql 方法3 MySQLImport 工具 mysqlimport [options] database file_name 其中&#xff0c;database为要导入数据的数据库名&#xff0c;file_name为要导入的SQL文件名。还可以…