Вы можете найти рассылки сходной тематики в Каталоге рассылок.
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 |
В избранное | ||