给出此数组:
int a[] = {5, 8, 5, 6, 9, 5};
是否可以删除所有等于5的整数,然后将其余整数移动到数组的前面?
因此移除后的数组将如下所示:
int a[] = {8, 6, 9, 0, 0, 0}
我不知道通过删除元素是否将其变为0或NULL?
谢谢!
答案 0 :(得分:2)
您可以在数组上进行两次迭代,第一次迭代两次以打开要删除的元素,第二次迭代将零与非零分开。
int a[] = {5, 8, 5, 6, 9, 5};
int n = 6;
for(int i = 0 ; i < n ; i++ ) {
if(a[i] == 5 ) {
a[i] = 0;
}
}
int* zero = a;
int* nonZero = a;
int j = 0;
while(j < n) {
while(*zero != 0) {
zero++;
}
while(*nonZero == 0) {
nonZero++;
j++;
}
if(zero < nonZero) {
*zero = *nonZero;
*nonZero = 0;
}
j++;
}
答案 1 :(得分:1)
您的数组是静态分配的,因此始终具有相同的大小,并且删除的元素具有0
值(根据您定义删除值的方式)。
This link可以为您提供帮助,并说明如何从数组中删除元素。
答案 2 :(得分:0)
我用C语言编程已经有一段时间了,但它是正题。
这只是一个伪代码,但是您只需要将其更改为C编程方式即可。
int a[] = {5, 8, 5, 6, 9, 5};
int b[] = {5, 8, 5, 6, 9, 5}; // copy of array a to hold temp
for(int i = 0; i < Size of array; i++ ){
for(int j = i; j < Size of array; j++ ){
if(b[j] != 5){
a[i] = b[j];
a[j] = b[i];
break;
}
}
}
就像(▼:要交换的目标,F:完成的,X:不是交换的目标,N:未处理):
▼,▼,N,N,N,N
5、8、5、6、9、5
F,▼,X,▼,N,N
8、5、5、6、9、5
F,F,▼,X,▼,N
8、6、5、5、9、5
结果: 8、6、9、5、5、5
删除5s,这取决于您的意思。如果不更改数组大小,则它们可以为0或undefined(null)。因此,我认为这取决于您对返回数组的函数进行编程的方式。
答案 3 :(得分:0)
您的数组不是动态数组,因此分配后就无法减小其大小。将值设置为零可能会解决您的情况。