C-从数组中删除元素并重新组织

时间:2019-03-16 09:54:03

标签: c arrays

给出此数组:

int a[] = {5, 8, 5, 6, 9, 5};

是否可以删除所有等于5的整数,然后将其余整数移动到数组的前面?

因此移除后的数组将如下所示:

int a[] = {8, 6, 9, 0, 0, 0}

我不知道通过删除元素是否将其变为0或NULL?

谢谢!

4 个答案:

答案 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)

您的数组不是动态数组,因此分配后就无法减小其大小。将值设置为零可能会解决您的情况。