01-02-3

news2024/11/25 4:23:24

1、线性表

a.定义:

有n(n>=0)个相同类型的元素组成的有序集合。

数组是线性表的一种。通常用数组实现。

b.线性表的顺序存储

b-1:顺序表结构体的定义

顺序表是一个结构体变量。结构体内部有两个数据:一个用于存放元素的数组,一个是记录数组中有效元素个数的整型变量。顺序表的数组中每增加一个元素,记录个数的整型变量就要加1;每减少一个元素,整型变量就要减一。通过记录元素个数的整型变量来访问数组的最后一个元素。

使用的代码
typedef struct
{
    ElemType data[MaxSize];//创建数组
    int length;//记录当前数组中有效数据的个数
}SqList;//给结构体重命名为SqList

用此结构体创建结构体变量,作为顺序表:SqList L

b-2:插入数据

①原理:

将元素x插入到第四个位置(也就是下标为3)的地方:

先将第四个位置及后面所有位置的元素,依次向后移动一位,从最后的元素开始移动。

平均移动元素的次数计算方法:

放在开头,放在末尾,分别移动n个元素,0个元素,两者求平均即为:n/2。

以此类推,将放在第二个位置,放在倒数第二个位置,两个一组,即可算出平均次数为:n/2。

②代码说明:
Ⅰ.子函数的写法说明

插入数据的代码,子函数需要引用顺序表。只有引用顺序表,在子函数内对顺序表进行插入操作才能影响外面的顺序表。

代码如下

bool ListInsert(SqList& L, int i, ElemType e)//使用引用,在子函数内对顺序表进行插入操作才能影响外面的顺序表.这里的i表示位置

Ⅱ.判断插入的位置是否合法:

插入的位置<1或者>length+1,则表示非法。

元素1234
插入的位置123lengthlength+1length+2

插入的位置在length+1,则表示在最后一个元素后面的一个空间插入数据。若插入的位置比length+1大,则会造成空位的产生,不合法。返回false即可。

代码如下

if (i<1 || i>L.length + 1)//判断插入的位置是否合法
{
    return false;
}

Ⅲ.判断顺序表是否有空间可以插入:

将顺序表中记录数组元素个数的length变量与顺序表数组的最大容量MaxSize相比,若是length>=MaxSize,则不可插入,返回false。

代码如下

if (L.length >= MaxSize)//判断是否有空间可以插入
{
    return false;
}

Ⅳ.利用for循环,将插入位置及位置以后的数据后移一位

从最后的一个元素开始移动,利用记录数组元素个数的整型变量,访问最后一个元素。注意,这个元素个数就是元素位置,必须-1后才可以找到最后一个元素对应的空间。

for循环的区间是从最后一个位置开始,大于等于当前位置。

for (int j = L.length; j >= i; j--)//length是最后一个元素的位置,是最后一个元素后面一个空间的下标,length-1是最后一个元素的下标
{
    L.data[j] = L.data[j - 1];//将后面的元素向后移动一位。最后位置才是后移到的位置
}

Ⅴ.移动完后将插入的数据放到插入的位置即可

代码如下

L.data[i - 1] = e;//位置-1后,才能得到该位置对应的下标。
Ⅵ.最后将记录数组长度的变量length+1即可

代码如下

L.length++;
Ⅶ.整体代码如下:
bool ListInsert(SqList& L, int i, ElemType e)//使用引用,在子函数内对顺序表进行插入操作才能影响外面的顺序表.这里的i表示位置
{
    if (i<1 || i>L.length + 1)//判断插入的位置是否合法
    {
        return false;
    }
    if (L.length >= MaxSize)//判断是否有空间可以插入
    {
        return false;
    }
    for (int j = L.length; j >= i; j--)//length是最后一个元素的位置,是最后一个元素后面一个空间的下标,length-1是最后一个元素的下标
    {
        L.data[j] = L.data[j - 1];//将后面的元素向后移动一位
    }
    L.data[i - 1] = e;
    L.length++;
    return true;//走到此处,表示插入成功
}

b-3:删除数据

①原理:

将第i个位置的元素删除:

若是最后一个元素,需要控制下标,使其无法访问到最后一个空间即可。

若是中间的元素,则将改元素后面的所有元素,依次向前移动,进行覆盖即可。从最前面的元素开始前移。

平均移动元素的次数和增加时移动的次数计算方法一样,但是删除少了一个,所以分子是n-1

②代码说明:
Ⅰ.子函数的写法说明

引用顺序表,引用存放删除的元素的变量,用于后期在主函数中使用删除的元素。

代码如下

bool ListDelete(SqList& L, int i, ElemType& e)//因为要将删除的元素传回到主函数中,所以存放删除的元素的变量需要借助引用,即可影响主函数中的变量
Ⅱ.判断删除的位置是否合法

删除的位置必须在1~length(闭区间)之内。若是在不在此范围内,则不合法,返回false。

插入和删除的区别:前半部分一样,后边部分,插入是最后一个位置+1(即length+1),删除是最后一个位置(即length)。两个都是大于号和小于号。

代码如下

if (i<1 || i>L.length)//删除的位置必须有元素,相对与插入,插入可以访问到最后元素+1的空间即length+1,但是删除只能访问到最后一个元素的空间也就是length
{
    return false;
}

Ⅲ.判断顺序表是否有元素可以删除

通过顺序表中的记录元素个数的变量来判断,若是变量个数为0,则说明没有元素可以删除,则直接返回false。

代码如下

if(L.length==0)
{
    return false;
}

Ⅳ.将要删除的位置处的元素放到用于存放删除元素的变量中

注意:知道位置,位置-1后,才是对应的位置的下标,才能访问该位置的空间。

代码如下:

e = L.data[i - 1];//获取删除位置处对应的元素
Ⅴ.使用for循环,将删除位置后面的元素依次前移

从最前面的元素开始前移。直到最后一个元素结束

代码如下

for (int j = i; j < L.length; j++)
{
    L.data[j - 1] = L.data[j];//删除位置-1,才是前移到的位置
}

Ⅵ.记录数组元素个数的变量-1

代码如下

L.length--;
Ⅶ.整体代码如下
bool ListDelete(SqList& L, int i, ElemType& e)//因为要将删除的元素传回到主函数中,所以存放删除的元素的变量需要借助引用,即可影响主函数中的变量
{
	if (i<1 || i>L.length)//删除的位置必须有元素,相对与插入,插入可以访问到最后元素+1的空间即length+1,但是删除只能访问到最后一个元素的空间也就是length
	{
		return false;
	}
	if (L.length == 0)
	{
		return false;
	}
	e = L.data[i - 1];//获取删除位置处对应的元素
	for (int j = i; j < L.length; j++)
	{
		L.data[j - 1] = L.data[j];
	}
	L.length--;
	return true;
}

b-4:查找元素

Ⅰ.子函数的写法说明

返回值是int,因为返回的是该元素的位置,若是该元素不存在,则返回0,也可说明位置不存在。不需要借助引用。

代码如下

int LocateElem(SqList L, ElemType e)
Ⅱ.借助for循环,遍历顺序表,查看是否有该元素

在for循环内部使用if进行判断,若是某一个元素与指定元素相同,则返回该元素的位置。若是没有,则在for循环结束后返回0即可。

代码如下

int LocateElem(SqList L, ElemType e)
{
	for (int j = 0; j < L.length; j++)
	{
		if (L.data[j] == e)
		{
			return j + 1;
		}
	}
	return 0;
}

b-5:总结顺序表

顺序表是一个结构体变量。结构体内部有两个数据:一个用于存放元素的数组,一个是记录数组中有效元素个数的整型变量。顺序表的数组中每增加一个元素,记录个数的整型变量就要加1;每减少一个元素,整型变量就要减一。通过记录元素个数的整型变量来访问数组的最后一个元素。

涉及的代码

#define MaxSize 50
typedef int ElemType;//顺序表中的元素类型
typedef struct
{
	ElemType data[MaxSize];//创建数组
	int length;//记录当前数组中有效数据的个数
}SqList;//给结构体重命名为SqList

bool ListInsert(SqList& L, int i, ElemType e)//使用引用,在子函数内对顺序表进行插入操作才能影响外面的顺序表.这里的i表示位置
{
	if (i<1 || i>L.length + 1)//判断插入的位置是否合法
	{
		return false;
	}
	if (L.length >= MaxSize)//判断是否有空间可以插入
	{
		return false;
	}
	for (int j = L.length; j >= i; j--)//length是最后一个元素的位置,是最后一个元素后面一个空间的下标,length-1是最后一个元素的下标
	{
		L.data[j] = L.data[j - 1];//将后面的元素向后移动一位
	}
	L.data[i - 1] = e;
	L.length++;
	return true;//走到此处,表示插入成功
}
//删除使用元素e的引用的目的是拿出对应的值
bool ListDelete(SqList& L, int i, ElemType& e)//因为要将删除的元素传回到主函数中,所以存放删除的元素的变量需要借助引用,即可影响主函数中的变量
{
	if (i<1 || i>L.length)//删除的位置必须有元素,相对与插入,插入可以访问到最后元素+1的空间即length+1,但是删除只能访问到最后一个元素的空间也就是length
	{
		return false;
	}
	if (L.length == 0)
	{
		return false;
	}
	e = L.data[i - 1];//获取删除位置处对应的元素
	for (int j = i; j < L.length; j++)
	{
		L.data[j - 1] = L.data[j];
	}
	L.length--;
	return true;
}
//查找成功,返回位置,位置从1开始;查找失败,返回0
int LocateElem(SqList L, ElemType e)
{
	for (int j = 0; j < L.length; j++)
	{
		if (L.data[j] == e)
		{
			return j + 1;
		}
	}
	return 0;
}
void PrintList(SqList L)//打印顺序表中的数据
{
	for (int i = 0; i < L.length; i++)
	{
		printf("%3d", L.data[i]);//将所有元素打印到同一行
	}
	printf("\n");
}
int main()
{
	SqList L;//创建循序表,命名为L:顺序表是一个结构体,内部有一个存放元素的数组,还有一个记录数组元素个数的整型变量
	bool ret;//创建bool类型的变量,命名为ret。bool类型的变量只能赋值为True,或者False
	ElemType del;//存储要删除的元素
	L.data[0] = 1;//手动给顺序表中的数组添加数据。
	L.data[1] = 2;
	L.data[2] = 3;
	L.length = 3;//顺序表中的数组每增加一个元素,记录元素个数的整型变量就要加一
	ret = ListInsert(L, 2, 60);//向顺序表L的第二个位置插入60这个元素
	if (ret)
	{
		printf("插入成功\n");
		PrintList(L);//打印插入成功后的顺序表
	}
	else {
		printf("插入失败\n");
	}
	ret = ListDelete(L, 1, del);//将顺序表L的第一个位置的元素删除,并将删除的元素传回到主函数中
	if (ret)
	{
		printf("删除成功\n");
		printf("删除的元素值为%d\n", del);
		PrintList(L);
	}
	else {
		printf("删除失败\n");
	}
	int elem_pos;
	elem_pos = LocateElem(L, 60);
	if (elem_pos)
	{
		printf("查找成功\n");
		printf("元素位置为%d\n", elem_pos);
	}
	else {
		printf("查找失败\n");
	}
	return 0;
}

C.线性表的链式存储

见02-4文件

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

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

相关文章

Nature 综述(IF=88):微生物群落和土壤性质之间的相互作用

随着社会的发展&#xff0c;环境污染和自然资源的消耗日益严重&#xff0c;土壤生态系统的健康状况备受关注。然而&#xff0c;当前研究领域存在一个问题&#xff0c;即在研究土壤微生物群落结构的同时&#xff0c;忽略了微生物对土壤环境的影响。本文旨在探讨微生物如何通过生…

牛客热题:旋转数组的最小数字

&#x1f4df;作者主页&#xff1a;慢热的陕西人 &#x1f334;专栏链接&#xff1a;力扣刷题日记 &#x1f4e3;欢迎各位大佬&#x1f44d;点赞&#x1f525;关注&#x1f693;收藏&#xff0c;&#x1f349;留言 文章目录 牛客热题&#xff1a;旋转数组的最小数字题目链接方法…

二叉树的前序、中序、后序遍历

二叉树的前序、中序、后序 1.二叉树的前序遍历 题目&#xff1a; 二叉树的前序遍历 给你二叉树的根节点 root &#xff0c;返回它节点值的 前序 遍历。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,2,3]示例 2&#xff1a; 输入&#xff…

​​​【收录 Hello 算法】第 6 章 哈希表

目录 第 6 章 哈希表 本章内容 第 6 章 哈希表 Abstract 在计算机世界中&#xff0c;哈希表如同一位聪慧的图书管理员。 他知道如何计算索书号&#xff0c;从而可以快速找到目标图书。 本章内容 6.1 哈希表6.2 哈希冲突6.3 哈希算法6.4 小结

UML快速入门篇

目录 1. UML概述 2. 类的表示 2.1. 类的表示 2.2. 抽象类的表示 2.3. 接口的表示 3. 类的属性&#xff0c;方法&#xff0c;访问权限的表示 3.1. 类的属性 3.2. 类的方法 3.3. 类的权限 4. 类的关联 4.1. 单向关联 4.2. 双向关联 4.3. 自关联 4.4. 类的聚合 4.5.…

LeetCode题练习与总结:不同的二叉搜索树Ⅱ--95

一、题目描述 给你一个整数 n &#xff0c;请你生成并返回所有由 n 个节点组成且节点值从 1 到 n 互不相同的不同 二叉搜索树 。可以按 任意顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;[[1,null,2,null,3],[1,null,3,2],[2,1,3],[3,1,null,nul…

通过GRE隧道实现OSPF、BGP、IS-IS的套接使用

正文共&#xff1a;999 字 9 图&#xff0c;预估阅读时间&#xff1a;1 分钟 书接上文&#xff08;专线入云场景能否配置动态路由协议&#xff1f;&#xff09;&#xff0c;我们发现通过一定的配置&#xff0c;具体就是组合使用IBGP和静态路由&#xff0c;在使用云专线接入到资…

科技查新中的工法查新点如何确立与提炼?案例讲解!

按《工程建设工法管理办法》( 建 质&#xff3b;2014&#xff3d;103 号) &#xff0c;工法&#xff0c;是指以工程为对象&#xff0c;以工艺为核心&#xff0c;运用系 统工程原理&#xff0c;把先进技术和科学管理结合起来&#xff0c;经过一定工程实践形成的综合配套的施工方…

【go项目01_学习记录11】

操作数据库 1 文章列表2 删除文章 1 文章列表 &#xff08;1&#xff09;先保证文章已经有多篇&#xff0c;可以直接在数据库中添加&#xff0c;或者访问链接: localhost:3000/articles/create&#xff0c;增加几篇文章。 &#xff08;2&#xff09;之前设置好了articles.ind…

移动端自动化测试工具 Appium 之自定义报告

文章目录 一、背景二、具体实现1、保存结果实体2、工具类3、自定义报告监听类代码4、模板代码4.1、report.vm4.2、执行xml 三、总结 一、背景 自动化测试用例跑完后报告展示是体现咱们价值的一个地方咱们先看原始报告。 上面报告虽然麻雀虽小但五脏俱全&#xff0c;但是如果用…

JavaScript 进阶(一)

一、作用域 1. 局部作用域 &#xff08;1&#xff09;函数作用域 、 &#xff08;2&#xff09;块作用域 2. 全局作用域 3. 作用域链 g 作用域可以访问 f 作用域&#xff08;子访问父&#xff09;&#xff0c;但是 f 作用域&#xff0c;不能访问 g 作用域&#xff08;父…

[数据集][图像分类]杂草分类数据集17509张9类别

数据集格式&#xff1a;仅仅包含jpg图片&#xff0c;每个类别文件夹下面存放着对应图片 图片数量(jpg文件个数)&#xff1a;17509 分类类别数&#xff1a;9 类别名称:["chineseapple","lantana","negatives","parkinsonia","part…

经典面试题---环形链表

1. 环形链表1. - 力扣&#xff08;LeetCode&#xff09; 要解决这道题&#xff0c;我们首先要挖掘出带环的链表与不带环的链表之间的差别。 以此&#xff0c;才能设计出算法来体现这种差别并判断。 二者最突出的不同&#xff0c;就是不带环的链表有尾结点&#xff0c;也就是说…

Springboot打包jar如何后台启动和查看日志?

如何后台启动Spring Boot的fat jar 使用nohup命令启动&#xff1a; 在Linux或Unix系统中&#xff0c;你可以使用nohup命令来启动jar包&#xff0c;以确保即使你关闭了终端或断开了SSH连接&#xff0c;程序仍然可以在后台运行。命令格式如下&#xff1a;nohup java -jar yourapp…

C语言(指针)6

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸各位能阅读我的文章&#xff0c;诚请评论指点&#xff0c;关注收藏&#xff0c;欢迎欢迎~~ &#x1f4a5;个人主页&#xff1a;小羊在奋斗 &#x1f4a5;所属专栏&#xff1a;C语言 本系列文章为个人学习笔记&#x…

opencv车道偏离系统-代码+原理-人工智能-自动驾驶

车道偏离预警系统&#xff08;Lane Departure Warning System, LDWS&#xff09;是一种主动安全技术&#xff0c;旨在帮助驾驶员避免因无意中偏离车道而引发的事故。从原理到实战应用&#xff0c;其工作流程大致如下&#xff1a; 传感器采集 &#xff1a;系统通常配备有一个或…

智能终端RK3568主板在智慧公交条形屏项目的应用,支持鸿蒙,支持全国产化

基于AIoT-3568A的智慧公交条形屏&#xff0c;可支持公交线路动态展示&#xff0c;语音到站提醒&#xff0c;减少过乘、漏乘的情况&#xff0c;有效提高了公交服务效率和质量&#xff0c;为乘客提供了更舒适、更安全和更方便的出行体验&#xff0c;为城市的发展增添了新的活力。…

升级Microsoft 365后,SAP GUI中无法打开Excel的解决方案

最近&#xff0c;我们遇到了一个棘手的问题&#xff0c;一位客户在升级到Microsoft 365后&#xff0c;无法在SAP GUI中打开Excel。这个问题不仅影响了工作效率&#xff0c;也给用户的日常操作带来了不便。在本文中&#xff0c;我们将探讨问题的成因&#xff0c;并提供一种解决方…

纯福利|手把手教你如何白嫖免费的GPU资源(二)

大家好&#xff0c;我是无界生长。 前段时间写过一篇文章《纯福利&#xff5c;手把手教你如何白嫖免费的GPU资源&#xff08;一&#xff09;》&#xff0c;使用Google Colab提供的免费的GPU资源&#xff0c;今天接着写白嫖GPU资源攻略&#xff0c;可获得“长期免费的CPU实例资源…

Redis:分布式系统

文章目录 认识RedisRedis和MySQLRedis的场景Redis的设计 分布式单机架构应用数据分离架构应用服务集群架构 认识Redis 在开始Redis学习前&#xff0c;要先认识一下Redis Redis的设计&#xff0c;是想要把它当做是一个数据库&#xff0c;一个缓存&#xff0c;或者说是一个消息…