На этом шаге мы рассмотрим первый случай удаления звена.
Пусть нам известен указатель Res на удаляемое звено. Возможны два случая:
Вначале рассмотрим ситуацию, когда он не последний, то есть (*Res).sled!=NULL. Изобразим схему "до", соответствующую этому случаю:
Рис.1. "Начальная" позиция
(*(*Res).sled).pred = (*Res).pred; (*(*Res).pred).sled = (*Res).sled;
Рис.2. "Перенастройка" указателей
delete Res;
Рис.3. Освобождение памяти
Пусть теперь удаляемый элемент оказался последним.
Взгляните на схему "до":
Рис.4. "Начальная" позиция
(*(*Res).pred).sled = NULL;
ksp = (*ksp).pred;
Рис.5. "Настройка" указателей
delete Res;
Рис.6. Возврат памяти в кучу
Запишем функцию для удаления звена, на которое указывает ссылка:
void Delete (node **nsp, node **ksp, node *Res) // Удаление звена из двунаправленного списка. // *nsp - указатель на начало списка, // *ksp - указатель на конец списка, // Res - указатель на удаляемое звено. { if ((*Res).sled!=NULL) { (*(*Res).sled).pred = (*Res).pred; (*(*Res).pred).sled = (*Res).sled; delete Res;} else { (*(*Res).pred).sled = NULL; *ksp = (**ksp).pred; delete Res;} }
На следующем шаге мы продолжим знакомиться с алгоритмами удаления звена.