C - удалить элемент из массива и реорганизовать - PullRequest
0 голосов
/ 16 марта 2019

Учитывая этот массив:

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

Можно ли удалить все целые, равные 5, и переместить остальные в начало массива?

чтобы после удаления массив выглядел так:

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

Я не знаю, если при удалении элемента он становится 0 или NULL?

Спасибо!

Ответы [ 4 ]

2 голосов
/ 16 марта 2019

Вы можете сделать это с двумя итерациями по массиву, первая итерация - для поворота элемента, который вы хотите удалить, вторая итерация - для отделения нулей от ненулевых.

    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 голос
/ 16 марта 2019

Ваш массив распределен статически, поэтому всегда имеет одинаковый размер, а удаленные элементы имеют значение 0 (в зависимости от того, как вы определяете удаленные значения).

Эта ссылка может помочьВы и объясняете, как удалить элемент из массива.

0 голосов
/ 16 марта 2019

ваш массив не является динамическим, поэтому вы не можете уменьшить его размер после того, как он был выделен. Установка нулевого значения может решить проблему в вашем случае.

0 голосов
/ 16 марта 2019

Я давно программировал на 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, 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 или неопределенными (null). Поэтому я думаю, что это отличается тем, как вы программируете функцию, которая возвращает массив.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...