小发现-->对“删除”数组元素的不同做法

 删除的本质:

对于数组元素删除,其实不能算是删除,毕竟你数组是一片连续存储的空间,你要是真的删除了一个地方那还了得了,所以删除无非就是在输出结果的时候看上去像是某个地方的元素被删除了,实际上呢,要么是被别的元素覆盖了,要么是被标记了,跳过了这个位置进行输出,那么接下来就对着这两种说法展开讲解:

第一种:覆盖形式的删除

其实就是将数组的后面一位向前移动几位,每次都这样,最后再改变一下数组上限,这不就覆盖了吗。

那么代码实现呢也是比较容易理解的:
 

#include<stdio.h>
int main()
{
	int a[10];
	for(int i = 0;i < 10;i++){
		a[i] = i;
	}
	for(int i = 0;i < 10;i++){
		printf("%d ",a[i]);
	}
	putchar('\n');
	//删除5-8之间的元素
	int cnt = 0;
	int n = 10;
	for(int i = 0;i < 10;i++){
		if(a[i] > 5&&a[i] < 8){
			cnt++;
		} else {
			a[i-cnt] = a[i];
		}
	} 
	n -= cnt;
	for(int i = 0;i < n;i++){
		printf("%d ",a[i]);
	}
	return 0;
}

核心部分其实就是:

int cnt = 0;//用来标记覆盖的位数
	int n = 10;
	for(int i = 0;i < 10;i++){
		if(a[i] > 5&&a[i] < 8){
			cnt++;//如果满足条件5-8之间,就让cnt++,这样就可以确定移动的位数了,可以将这个范围的元素过滤掉
		} else {
			a[i-cnt] = a[i];//如果不满足上面的条件就说明得完成覆盖的交接
		}
	} 
	n -= cnt;//缩小数组上限

第二种:将特定元素标记为不可能出现的数字,输出的时候直接跳过就行了

#include<stdio.h>
int main()
{
	int a[10];
	for(int i = 0;i < 10;i++){
		a[i] = i;
	}
	for(int i = 0;i < 10;i++){
		printf("%d ",a[i]);
	}
	putchar('\n');
	//继续删除5-8之间的元素
	for(int i = 0;i < 10;i++){
		if(a[i] > 5&&a[i] < 8){
			a[i] = -1;
		}
	} 
	for(int i = 0;i < 10;i++){
		if(a[i] >= 0){
			printf("%d ",a[i]);
		}
	}
	return 0;
}

总归就是那几种,一般第二种方法是比较常用的,因为它确实快啊,不过第一种方法是真正的进行了删除的操作,所以当你写到了线性表元素的区间删除这种题目的时候,你就得使用第一种方法了。

到这里就结束啦!!!

欢迎小伙伴们评论区讨论,提问。

我是荒古前,期待你的关注~~~

~~~完结撒花✌y( •̀ ω •́ )y✌~~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值