数据结构之——(手撕)顺序表

news2024/11/23 16:29:25

本章会介绍的知识点如下图:

 

 1: 顺序表的概念:顺序表是用一段物理地址连续的存储单元依次存储数据的线性结构,通常我们使用数组来表示,对数组进行增删查改。

                 顺序表的结构:逻辑结构与物理结构都是内存中一块连续开辟的空间,都是11对应的线性结构。

2: 顺序表的两种定义方式:静态的顺序表与动态的顺序表,一般情况下我们很少会用静态的顺序表,因为静态的顺序表会将空间固定,导致如果我们使用顺序表的时候可能会浪费很多的空间,也可能在我们增容的时候会出现空间不够的情况,这种情况下如果我们还是在继续使用的话那么数组将会越界这种情况是error的。

两种定义顺序表的方式代码如下

        静态的顺序表        

typedef int SqListDataType;//这里是给我们的顺序表元素的类型起个名字
//							 假设元素是其他类型我们就可以修改这里
//静态的
struct SqList1
{
	SqListDataType arr1[1000];//开辟了一个整形的数组
	int size;//用来记录顺序表当前使用了多少的空间
};

动态的顺序表:

        

struct SqList2
{
	SqListDataType* arr2;
	int size;
	int Capacity;//用来记录当前数组开辟了多少个空间
};

在这两种结构中通常我们是会选择动态的顺序表来管理数据的。

3:顺序表的接口实现:

我们最终选择这个定义的顺序表 

        1:这个接口的定义是应为当我们在增加元素的时候我们所存储的元素会变多,总有一种情况下我们空间会慢,所以这时候我们就需要扩容,使用了realloc这个函数扩容有两种情况,一种是原地扩,一种是换个空间扩。不管怎么样我们都定义一个空间,用来存储新开辟的地址,让后在给ps

//检查容量的代码
void check_capacity(SqList* ps)
{
	assert(ps);
	//空间不够,扩容,一次扩两倍
	if (ps->Capacity == ps->size)
	{

		SqListDataType* tmp=(SqListDataType*)realloc(ps->arr, (ps->Capacity)* 2*sizeof(SqListDataType));
		if (tmp == NULL)
		{
			perror("realloc fail");
			exit(-1);
		}
		else
		{
			printf("扩容成功\n");
			ps->arr = tmp;
			ps->Capacity *= 2;
		}
	}
	
}

2:头插思路:先检查空间是否足够,在从后往前移动元素,将第一个位置出来,最后在添加元素即可。

void PushFrontSqList(SqList* ps, SqListDataType x)
{
	//先检查空间够不够,空间不够扩容
	check_capacity(ps);//先判断空间是否满了
	//先移动元素
	int end = ps->size - 1;
	while (end >= 0)
	{
		ps->arr[end + 1] = ps->arr[end];
		end--;
	}
	ps->arr[0] = x;
	ps->size++;
}

上述代码的意思如下图:

        

 3:尾插思路:这个挺简单的,我们只要在size位置插入即可,size在++即可,这里要注意的就是我们插入要以数组的下标。

代码:

void PushBackSqList(SqList* ps, SqListDataType x)
{
	assert(ps);
	check_capacity(ps);
	ps->arr[ps->size] = x;
	ps->size++;
	//SqListInsert(ps, ps->size, x);
}

 4:头删思路:我们首先得判断顺序表是否有元素,如果有的话才能进行删除,我们只需要遍历数组从前往后将后一个元素移动到前一个就行,这里需要注意的就是我们移动时位置的不同可能导致代码的不一样,而我的代码是从第一个开始所以我最后的位置因该是size-2处,然后size--就可以了。

代码:

void PopFrontSqList(SqList* ps)
{
	assert(ps);
	assert(ps->size > 0);
	int i = 0;
	for (i = 0; i < ps->size - 1; i++)
	{
		ps->arr[i] = ps->arr[i + 1];
	}
	ps->size--;
}

5:尾删思路:这个挺简单的,首先还是得判断顺序表是否存在元素,如果有将size--就行了。

代码:

void PopBackSqList(SqList* ps)
{
	assert(ps);
	assert(ps->size > 0);
	ps->size--;
}

6:顺序表得查找思路:遍历数组就行了,如果存在则返回下标,如果不存在我们返回-1.

代码:

int FindSqList(SqList* ps, SqListDataType x)
{
    assert(ps);//防止ps没有意义
	//思路:遍历顺序表找
	int i = 0;
	for (i = 0; i < ps->size; i++)
	{
		if (ps->arr[i] == x)
		{
			return i;
		}
	}
	//未找到
	printf("未找到\n");
	return -1;
}

7:顺序表插入思路:在pos位置处插入一个元素,pos为下标,首先先我们得判断pos是否存在,如果存在我们先从前往后将元素向后移动,然后在pos位置处插入即可。

代码:

void SqListInsert(SqList* ps, int pos, SqListDataType x)
{
	assert(ps);
	assert(pos >= 0 && pos <= ps->size);
	check_capacity(ps);
	int end = ps->size - 1;
	while (end >= pos)
	{
		ps->arr[end + 1] = ps->arr[end];
		end--;
	}
	ps->arr[pos] = x;
	ps->size++;
}

图:

 8:顺序表的删除思路:先判断,pos是否在顺序表中,我们只要从前完后移动pos后面的元素即可,然后我们在把size--;

代码:

void SqListErase(SqList* ps, int pos)
{
	assert(ps);
	assert(pos >= 0 && pos < ps->size);
	int i = pos;
	for (i = pos; i < ps->size - 1; i++)
	{
		ps->arr[i] = ps->arr[i + 1];
	}
	ps->size--;
}

9:顺序表的修改思路:先判断,pos是否在顺序表中,然后在根据数组随机访问的特点修改即可。

代码:

void ModifySqlist(SqList* ps, int pos, SqListDataType x)
{
	assert(ps);
	assert(pos >= 0 && pos < ps->size);
	ps->arr[pos] = x;

}

10:打印:遍历数组即可

代码:

void SqListPrint(SqList* ps)
{
	assert(ps);
	int i = 0;
	for (i = 0; i < ps->size; i++)
	{
		printf("%d ", ps->arr[i]);
	}
	printf("\n");
}

11:销毁顺序表这一步也不能省略,防止内存泄漏。

代码:

//销毁
void DestorySqList(SqList* ps)
{
	assert(ps);
	free(ps->arr);
	ps->arr = NULL;
	ps->Capacity = ps->size = 0;
}

以上就是顺序表的大致结构了。

通过上面我们可以发现:顺序表适合尾插,尾删,修改,这是因为顺序表随机访问的特点造成的。

        本章完,感谢大家的观看。

        

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

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

相关文章

无涯教程-PHP - preg_match()函数

preg_match() - 语法 int preg_match (string pattern, string string [, array pattern_array], [, int $flags [, int $offset]]]); preg_match()函数在字符串中搜索pattern&#xff0c;如果存在pattern&#xff0c;则返回true&#xff0c;否则返回false。 如果提供了可选…

回归预测 | MATLAB实现GA-RF遗传算法优化随机森林算法多输入单输出回归预测(多指标,多图)

回归预测 | MATLAB实现GA-RF遗传算法优化随机森林算法多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09; 目录 回归预测 | MATLAB实现GA-RF遗传算法优化随机森林算法多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09;效果一览基本介绍程…

今天七夕,群友让我帮忙给他分配一个对象,于是我。。。

今天七夕&#xff0c;群友让我帮忙给他分配一个对象&#xff0c;于是我只好尝试给他分配对象了&#xff1a; CGirlFrined *pGF new CGirlFrined("大屌萌妹");int nRet (群友).SetGirlFriend(pGF);if (nRet ! 0) {alert("分配失败&#xff01;"); }后来觉…

16、Flink 的table api与sql之连接外部系统: 读写外部系统的连接器和格式以及Apache Kafka示例(3)

Flink 系列文章 1、Flink 部署、概念介绍、source、transformation、sink使用示例、四大基石介绍和示例等系列综合文章链接 13、Flink 的table api与sql的基本概念、通用api介绍及入门示例 14、Flink 的table api与sql之数据类型: 内置数据类型以及它们的属性 15、Flink 的ta…

GitRedisNginx合集

目录 文件传下载 Git常用命令 Git工作区中文件的状态 远程仓库操作 分支操作 标签操作 idea中使用git 设置git.exe路径 操作步骤 linux配置jdk 安装tomcat 查看是否启动成功 查看tomcat进程 防火墙操作 开放指定端口并立即生效 安装mysql 修改mysql密码 安装lrzsz软…

Linux 线程同步——条件变量

一、条件变量的概念 如果说互斥锁是用于同步线程对共享数据的访问的话&#xff0c;那么条件变量则是用于在线程之间同步共享数据的值。条件变量提供了一种线程间的通知机制&#xff1a;当某个共享数据达到某个值的时候&#xff0c;唤醒等待这个共享数据的线程。如下图所示&…

Java【手撕双指针】LeetCode 202. “快乐数“, 图文详解思路分析 + 代码

文章目录 前言一、快乐数1, 题目2, 思路分析3, 代码展示 前言 各位读者好, 我是小陈, 这是我的个人主页, 希望我的专栏能够帮助到你: &#x1f4d5; JavaSE基础: 基础语法, 类和对象, 封装继承多态, 接口, 综合小练习图书管理系统等 &#x1f4d7; Java数据结构: 顺序表, 链表,…

Ubuntu系列弹性云服务器如何安装图形化界面?

​ 参考链接&#xff1a;Ubuntu系列弹性云服务器如何安装图形化界面&#xff1f; 操作场景 为了提供纯净的弹性云服务器系统给客户&#xff0c;Ubuntu系列弹性云服务器默认未安装图形化界面&#xff0c;如果您需要使用图形化界面&#xff0c;请参见本节内容进行安装。 对于GPU加…

Python支持下最新Noah-MP陆面模式站点与区域数据的处理、单站和区域的模拟、模拟结果的输出和后续分析及可视化

目录 Noah-MP 5.0模型介绍&模型所需环境的搭建 Python教程 Noah-MP 5.0模型站点模拟 Noah-MP 5.0模型区域模拟 更多应用 熟悉陆表过程的主要研究内容以及陆面模型在生态水文研究中的地位和作用&#xff1b;深入理解Noah-MP 5.0模型的原理&#xff0c;掌握Noah-MP模型&…

Video-LLaMA

文章目录 链接主要贡献模型一些思考啥是Q-former为什么position embedding可以辅助学到temporal的信息 代码视觉处理 一些惊喜 链接 https://github.com/DAMO-NLP-SG/Video-LLaMA 主要贡献 能够捕捉到一小小短时间&#xff08;temporal&#xff09;里视觉的变化 - 使用了Q-f…

“卷王”新茶饮们:从风口,卷到了十字路口

【潮汐商业评论/原创】 “楼下奈雪开业了&#xff0c;扫码9块9就可以喝到杨枝甘露&#xff0c;这也太便宜了&#xff0c;”Chloe向同事说道。 “上次跟Fendi联名的喜茶&#xff0c;两杯也只要38元。” “喜茶奈雪开始向二线价格靠拢&#xff1f;怎么都那么便宜了&#xff1f…

【一对一学习小组】2023年有三AI-CV初阶-基础算法组发布,如何夯实深度学习图像识别算法理论基础与实践...

2023年有三AI-CV初阶-基础算法组正式发布&#xff01;有三AI已经推出了CV初-中-高级培养计划&#xff08;原名有三AI-CV季划&#xff09;&#xff0c;这是我们的终身计算机视觉学习小组。 该培养计划具有以下特点&#xff1a; 【系统性】配套有非常完备的理论与实践 【永久性】…

jacaScript的详解与使用2

javaScript详解与使用2 Window.open()和location对象在HTML中我们一般使用的是a标签进行页面的跳转 而在js中也有自己的跳转页面的方式 window.open() 里面可以传递参数 在跳转的页面使用location对象进行接收 面象对象什么是面向对象1.面向对象是一种编程思想 简称为oop&#…

Qt快速学习(二)--QMainWindow,对话框,布局管理器,常用控件

目录 1 QMainWindow 1.1 菜单栏 1.2 工具栏 1.3 状态栏 1.4 铆接部件 1.5 核心部件&#xff08;中心部件&#xff09; 1.6 资源文件 2 对话框QDialog 2.1 基本概念 2.2 标准对话框 2.3 自定义消息框 2.4 消息对话框 2.5 标准文件对话框 3 布局管理器 3.1 系统…

华为OD机试 - 数字颠倒(Java 2023 B卷 100分)

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、Java算法源码投机取巧七、效果展示 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷&am…

回归预测 | MATLAB实现PSO-RF粒子群优化算法优化随机森林算法多输入单输出回归预测(多指标,多图)

回归预测 | MATLAB实现PSO-RF粒子群优化算法优化随机森林算法多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09; 目录 回归预测 | MATLAB实现PSO-RF粒子群优化算法优化随机森林算法多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09;效果…

链表的顶级理解

目录 1.链表的概念及结构 2.链表的分类 单向或者双向 带头或者不带头 循环或者非循环 3.无头单向非循环链表的实现 3.1创建单链表 3.2遍历链表 3.3得到单链表的长度 3.4查找是否包含关键字 3.5头插法 3.6尾插法 3.7任意位置插入 3.8删除第一次出现关键字为key的节点 …

ROS2与ROS1通信

文章目录 准备工作通信包安装启动ros1_bridge在ROS1中启动相机节点在ROS2中查看ROS1话题 准备工作 本机系统20.04 ROS2-foxyROS1-noetic 两个版本的ROS 均需要按照官网教程进行安装&#xff0c;安装完成以后&#xff0c;source环境变量都不放到~/.bashrc文件里面 通信包安装…

MES管理系统和MOM系统哪个更适合中小企业

中小型制造企业需要在选择制造管理系统前进行充分的需求分析和系统评估&#xff0c;结合企业的战略目标和资源状况来做出决策。MES和MOM系统是两种常见的制造管理系统&#xff0c;它们都能够帮助企业提高生产效率、降低生产成本&#xff0c;实现持续发展。然而&#xff0c;MES管…

模糊测试面面观 | 模糊测试对软件质量和性能的影响

随着软件行业的几十年发展和数字化转型的加快&#xff0c;我国已经度过了软件行业的野蛮发展时代。用户对软件的质量和性能要求越来越高&#xff0c;已经成为企业成功与否的至关重要条件。然而&#xff0c;随着软件规模的扩大和黑客攻击方式的多样化&#xff0c;保障软件的安全…