小白莲的数据结构day02

对线性表(顺序结构)的删除、插入、判断元素是否存在、合并操作

当当当(第四声)当(第一声),嘿嘿,小白莲又登场了,学会了线性表的创建与元素获取后,小白莲又开始亲自操刀对线性表进行删除、插入、判断元素是否存在、合并操作了(莫名自信!!!)
当然,如果觉得小白莲写得还不错,记得一定!一定!要点个赞再走哦!最好关注一下也是可以的,你们的对我的点赞和关注就是对我最大的支持,我真的很需要,谢谢!说的就是你,光收藏却不点赞,哼~~

废话少说,让我们往下看

1.线性表的删除操作

哎呦嘞,好简单一操作,大伙四不四一下就看懂了
但是还是得提醒一下哦,
删除操作结束后,记得让表长-1

//创建一个删除线性表第i个元素的函数
//删除第i个元素,用e返回其值,表长减一
Status DeleteElem(SqList& L, int i, ElemType &e) {
	//判断i的合法性(i>L.length 包含对线性表是否为空的判断)
	if (i<0 || i>L.length) return ERROR;
	//把要删除线性表的第i个值赋给e
	e = L.elem[i - 1];
	//进行删除操作
	//将第i个元素后面的所有元素向前挪动一位
	for (int k = i-1; k < L.length-1; k++)
	{
		L.elem[k] = L.elem[k + 1];
	}
	//表长减一
	--L.length;
	return OK;
}//DeleteElem

1.1对删除操作的测试

//测试
int main() {

	//创建一个线性表list
	SqList list;
	//创建一个接收返回值的元素e
	ElemType e;
	//调用InitList函数给list初始化,并判断是否初始化成功
	//若初始化成功,继续下一步,否则提示初始化失败
	if (InitList(list)) {
		//给线性表定义长度
		list.length = 10;
		//对线性表赋10个测试值
		for (int i = 0; i < list.length; i++)
		{
			list.elem[i] = i+8;
		}

		//将线性表的值输出
		for (int i = 0; i < list.length; i++)
		{
			printf("%d ", list.elem[i]);
		}
		printf("\n");

		//对DeleteElem进行测试
		if (DeleteElem(list, 6, e)) {
			printf("第6个元素%d已被删除\n", e);
			printf("线性表的当前长度为%d\n", list.length);
		}
		else
		{
			printf("输入了非法的i值,删除元素操作失败!\n");
		}
		//输出进行删除操作后的线性表
		for (int i = 0; i < list.length; i++)
		{
			printf("%d ", list.elem[i]);
		}
		printf("\n");
	}
	
	return 0;
}

1.2对删除操作的测试结果

在这里插入图片描述

2.线性表的插入操作

看会了删除操作,我们接下来看插入操作咯,当然也是很简单的啦
但是需要注意几点:
1.需要考虑当线性表存储空间已满时的处理
2.插入操作完成后,需记得让表长+1
3.可插入的位置为元素的总数+1

//创建一个插入元素到线性表第i个位置的函数(1<=i<=L.length+1)
//插入元素后,表长加一
//初始条件:1.线性表存储空间足够,若不够则给线性表增加存储空间
//2.线性表表长大于元素个数
Status InsertElem(SqList& L, int i, ElemType e) {
	//判断i的合法性(i>L.length+1 包含对线性表是否为空的判断)
	if (i<1 || i>L.length+1) return ERROR;
	//判断线性表的存储空间是否已满
	if (L.length >= L.listsize) {
		//若已满则申请增加存储空间
		ElemType* newbase;
		newbase = (ElemType*)realloc(L.elem,(LISTINCREMENT + L.listsize) * sizeof(ElemType));
		//若申请失败则退出程序
		if (!newbase)	exit(OVERFLOW);
		//给线性表赋上新的基址
		L.elem = newbase;
		//给线性表增加存储容量
		L.listsize += LISTINCREMENT;
	}
	//进行插入操作
	//1.将第i个元素后的所有元素向后挪动一位
	//如果i为L中的最后一个位置则直接插入,不用挪动元素
	//在for循环条件已给出判断是否为最后一个位置
	for (int k = L.length-1; k >= i-1; k--)
	{
		L.elem[k] = L.elem[k-1];
	}

	//2.将e插入第i个位置
	L.elem[i - 1] = e;
	//3.表长加一
	++L.length;
	return OK;
}
}

2.1对插入操作的测试

插入操作需要注意几点:
1.代码中的length是指当前线性表的长度,由于插入操作需要线性表的长度比元素个数大1位(主要用于插入非尾位置时用于元素挪动的一个空位置),所以我就把length-1当做是元素个数了(可以自己写个查看线性表元素个数的函数会更好),当插入的是尾位置时,元素不需要挪动。

2.线性表的实际存储长度不是length!不是length!不是length!重要的话说三遍,线性表的实际存储长度取决于你初始给线性表分配的存储空间,所以就算你的length=10,线性表里面元素有十个,还是可以往线性表插入元素(线性表存储空间足够的情况),详细实例可以看下面的第4点合并操作

//测试
int main() {

	//创建一个线性表list
	SqList list;
	//创建一个接收返回值的元素e
	//ElemType e;
	//调用InitList函数给list初始化,并判断是否初始化成功
	//若初始化成功,继续下一步,否则提示初始化失败
	if (InitList(list)) {
	
		//给线性表定义长度
		list.length = 10;
		//对线性表赋10个测试值
		for (int i = 0; i < list.length; i++)
		{
			list.elem[i] = i + 8;
		}

		//将线性表的值输出
		for (int i = 0; i < list.length; i++)
		{
			printf("%d ", list.elem[i]);
		}
		printf("\n");

		//对InsertElem函数进行测试
		//先将线性表空出一个位置
		++list.length;
		if (InsertElem(list, 1, 888)) {
			printf("888已插入list的第1个位置\n");
			printf("当前线性表的长度为%d\n", list.length);

			//输出插入元素后的线性表
			for (int i = 0; i < list.length - 1; i++)
			{
				printf("%d ", list.elem[i]);
			}
		}
		else
		{
			printf("输入了非法的i值,获取元素操作失败\n");
		}
	}
	
	return 0;
}

2.2对插入操作的测试结果

在这里插入图片描述

3.对某个元素是否存在于线性表的判断

这个很简单,不用多说吧

//创建一个判定元素e是否在线性表中的函数
Status JudgeElem(SqList L, ElemType e) {
	//遍历线性表L看是否存在e,若存在返回1,否则返回0
	int flag = 0;
	//el用来临时存储从L中遍历到的元素
	ElemType el;
	for (int i = 0; i < L.length; i++)
	{
		//调用GetElem函数,并获取L中的元素
		//看到这里有人可能会有疑惑,
		//我明明直接用L.elem[]就可以获取元素,为啥还用个GetElem函数?
		//答:GetElem包含了对i值的合法性判断,程序更有健壮性
		if (GetElem(L, i + 1, el)) {
			if (el == e) {
				flag = 1;
				break;
			}
		}
		else
		{
			printf("i值非法,获取元素失败!\n");
		}
	}
	return flag;
}//JudgeElem

4.两个线性表的合并操作

//创建一个将线性表L2的元素合并到L1的函数,并返回新的L1
//这里引用了L,所以会改变实参中的L,不需要用函数返回改变的L
//目标:将所有在L2中而L1没有的元素添加入L1
Status UnionList(SqList& L1, SqList L2) {
	//e用来获取从L2中遍历出来的元素
	ElemType e;
	//遍历L2
	for (int i = 0; i < L2.length; i++)
	{
		//调用GetElem函数,并获取L2中的元素,并赋给e
		GetElem(L2, i + 1, e);
		//调用JudgeElem函数,并判断e是否存在于L1
		if (!JudgeElem(L1, e)) {
			//如果不存在则将e插入L1的尾部
		
			//调用InsertElem函数,进行插入操作
			if (InsertElem(L1, L1.length+1, e))
				continue;
			else {
				printf("插入操作失败!!!\n");
				return ERROR;
			}
		}
	}
	return OK;
}

4.1对两个线性表的合并操作的测试

看了上面的操作后,是不是感觉合并操作也是小case?

这里就是我在插入操作那里说的实例,在这里可以看到L1的length=10,这里的length和元素个数一样,但是在代码中却给L1中直接插入了新的元素,在我的InsertElem函数里面是先插入元素,才执行++length的。具体原因我在插入操作讲了,这里不再赘述。

//测试
int main() {

	//创建线性表
	SqList L1,L2;
	//调用InitList函数给线性表初始化,并判断是否初始化成功
	//若初始化成功,继续下一步,否则提示初始化失败
	if (InitList(L1)&& InitList(L2)) {
	
		//给线性表定义长度
		L1.length = 10;
		L2.length = 10;
		//对线性表L1赋10个测试值
		printf("L1中的元素:\n");
		for (int i = 0; i < L1.length; i++)
		{
			L1.elem[i] = i;
			printf("%d ", L1.elem[i]);
		}
		printf("\n");
		//对线性表L2赋10个测试值
		printf("L2中的元素:\n");

		for (int i = 0; i < L2.length; i++)
		{
			L2.elem[i] = i+3;
			printf("%d ", L2.elem[i]);
		}
		printf("\n");
		//测试UnionList函数
		if (UnionList(L1, L2)) {
			//将线性表L1的值输出
			printf("合并后L1中的元素:\n");
			for (int i = 0; i < L1.length; i++)
			{
				printf("%d ", L1.elem[i]);
			}
			printf("\n");
		}
		else
		{
			printf("合并线性表操作失败!\n");
		}
	}
	
	return 0;
}

4.2 对两个线性表的合并操作的测试结果

在这里插入图片描述
end

呀,写博客好累啊,这是小白莲的第二篇博客,不过感觉不错,更有信心往下写了,好啦好啦,今天就到这里。

给人点赞,手留余香
预知后续操作如何,请看下集

@author 白莲居仙 QQ:1131977233

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值