Задачка по СИ на вставку элемента в динамический массив.
Дан массив размерности 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?