[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