删除的本质:
对于数组元素删除,其实不能算是删除,毕竟你数组是一片连续存储的空间,你要是真的删除了一个地方那还了得了,所以删除无非就是在输出结果的时候看上去像是某个地方的元素被删除了,实际上呢,要么是被别的元素覆盖了,要么是被标记了,跳过了这个位置进行输出,那么接下来就对着这两种说法展开讲解:
第一种:覆盖形式的删除
其实就是将数组的后面一位向前移动几位,每次都这样,最后再改变一下数组上限,这不就覆盖了吗。
那么代码实现呢也是比较容易理解的:
#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,cnt,删除,--,元素,++,int,数组 From: https://blog.csdn.net/x3477144355/article/details/144493382