[cdev] задача 4, 135 гр.
jam
rg-400 на list.ru
Сб Дек 11 20:20:43 MSK 2010
первым действием мы проверили, что позиция, с которой будет производится
удаление не выходи за пределы массива, если выходит, то удалять с такой
позиции не возможно.
Второй шаг посчитать сколько у нас осталось элементов.
Теперь мы знаем сколько осталось и знаем сколько пользователь хочет
удалить и если пользователь хочет удалить больше чем есть, то мы дадим
ему удалить лишь столько сколько у нас осталось.
Отсюда делаем вывод, если пользователь хочет удалить все элементы с
определенной позиции, то после этой позиции уже нет элементов и ничего
перемещать на мне нужно.
А если и надо, что-то перемещать это ко-во легко вычислить взяв кол-во
элементов, которое осталось и уменьшит его на кол-во элементов которые
нужно удалить. И вот этот кусок и должен быть вставлен с позиции nth.
Ну теперь осталось, только посчитать сколько же элементов в массиве
осталось после этих манипуляций:
У нас железно остается nth элементов, еще возможно останется кусок, если
пользователь удалит не все элементы с позиции nth.
А у вас если пользователь захотел удалить больше элементов, чем
осталось, то получается следующее:
count = pa->nelems - nth;
memmove(pa->data + nth, pa->data + nth + count,
((pa->nelems - count))*sizeof(void *));
->
memmove(pa->data + nth, pa->data + nth + pa->nelems - nth,
(pa->nelems - (pa->nelems - nth))*sizeof(void *));
nth сокращаются и мы смело выходим за границы массива. Причем перемещаем
зачем-то nth элементов, а должны перемещать другое кол-во.
Подробная информация о списке рассылки cdev