Вы можете найти рассылки сходной тематики в Каталоге рассылок.
for (Cur = *List; --Place && Cur->Next; Cur = Cur->Next);Она выполняет две функции: осуществляет поиск необходимого элемента и еще раз демонстрирует вам, что цикл for в C существенно мощнее, чем в остальных языках :-) Итак, остановлюсь на нем еще раз более подробно. Нам нужно найти в списке элемент под индексом (Place - 1). При инициализации цикла мы устанавливаем Cur на начало списка, а затем передвигаемся по нему (Cur = Cur->Next), пока Place не станет равной нулю. При этом мы также уменьшаем Place на единицу (обратите внимание на префиксную форму записи: можно было использовать и постфиксную, но при этом потребовалось бы уменьшить Place на единицу в инициализации цикла). Также предусмотрена проверка: если мы добрались до последнего элемента списка (Cur->Next == NULL), то цикл можно (и нужно!) остановить.
if (!RemoveElem (&List, 4))
{
printf ("Ошибка: невозможно удалить элемент\n");
return 0;
}
Итак, разберемся теперь в ней. Если функция InsertElem сперва создает
элемент, а потом включает его в список, то RemoveElem сперва исключает
элемент из списка, а потом удаляет его. Но если в списке был только один элемент,
то после удаления список будет пуст - так что присвоим ему NULL (разумеется,
сохранив перед этим указатель на элемент - нам же надо будет его как-то удалять).
В противном случае опять-таки проверим, является ли удаляемый элемент первым.
Если да, то теперь указатель на список - это просто указатель на его второй элемент.
Если нет, то схожей конструкцией найдем элемент под индексом (Place - 1)
(он опять будет в Cur) и изменим ссылки: Cur->Next = Cur->Next->Next.
Теперь в списке в любом случае нет ссылок на удаляемый элемент и его можно смело
удалять.
struct TElem
{
void *Item;
struct TElem *Next, *Prev;
}
void InsertBefore (struct TElem *Elem, void *NewItem);
void InsertAfter (struct TElem *Elem, void *NewItem);
void RemoveElem (struct TElem *Elem);
struct TElem *Advance (struct TElem *Elem, int Count);
void *GetItem (struct TElem *Elem);
void DeleteList (struct TElem *Elem);
Теперь более подробно о каждой из функций.
| http://subscribe.ru/
E-mail: ask@subscribe.ru | Отписаться | Relayed by Corbina
Рейтингуется SpyLog |
| В избранное | ||