C/C++

Задачка по СИ на вставку элемента в динамический массив.

Дан массив размерности n. Вставить перед каждым вторым четным элементом последний отрицательный элемент. В полученном массиве удалить все нулевые элементы. Дополнительный массив не использовать. (Допустим есть массив из чисел: 4, -3, 6, 7, -5. Тогда перед 6 должна стоять -7)

Проблем по нахождению последнего отрицательного элемента и удалению нулей нету.
Сперва об ошибках в коде.

Считать чётные элементы надо с начала, а не с конца, то есть цикл должен быть такой:
 for(int i = 0; i < n; ++i) 
Считать чётные элементы надо, то есть надо изменять переменную countEven:
 ++countEven % 2 == 0 
Считать надо чётные элементы, то есть проверять чётность надо до проверки количества чётных:
 (arr[i] % 2 == 0 && ++countEven % 2 == 0) 
Но основной недостаток кода в том, что постоянно перевыделяется память и перемещаются одни и те же элементы. При этом получается квадратичная сложность.

Я бы предложил сперва подсчитать количество добавляемых элементов, выделить нужный объём памяти, а потом копировать массив с конца, добавляя при необходимости новый элемент. Таким образом сложность остаётся линейной.
 int countToInsert = 0; 
int countEven = 0;
for(int i = 0; i < n; ++i)
if(arr[i] % 2 == 0 && ++countEven % 2 == 0) ++countToInsert;

int n2 = n + countToInsert;
arr = realloc(arr, n2 * sizeof(*arr));

for(int i = n - 1; i >= 0; --i) {
arr[i + countToInsert] = arr[i];
if(arr[i] % 2 == 0 && countEven-- % 2 == 0) arr[i + --countToInsert] = lastNegative;
}

n = n2;

Надо бы, конечно, при первом проходе считать и количество нулей, а при втором их пропускать, но это уже задание на дом. :)

Кстати, а почему
Тогда перед 6 должна стоять -7

если последний отрицательный элемент -5?
Володимир Кохалик
Володимир Кохалик
12 091
Лучший ответ
Александр Караван Да, последний отрицательный -5, не знаю почему я написал -7, наверно голова варёная в тот день была, спасибо огромное