На этом шаге мы рассмотрим другой способ вставки звена в двуноправленный список.
Рассмотрим алгоритм вставки звена перед звеном, на которое указывает ссылка Res. Опишем его с помощью схем "до и после" Д.Кнута:
q = new(node);
(*q).elem = Элем;
Рис.1. Создание элемента
(*q).sled = (*(*Res).pred).sled; (*q).pred = (*Res).pred;
Рис.2. "Настройка" указателей созданного элемента
(*(*Res).pred).sled = q; (*Res).pred = q;
Рис.3. "Настройка" указателей элементов списка на созданный элемент
Рис.4. Итоговый результат
Оформим алгоритм помещения звена в список в виде функции:
void InsBefore (int el, node **nsp, node **ksp, node *Res) // Вставление звена с информационным полем el в двуна- // правленный список, заданный указателями *nsp и *ksp, // перед звеном, на которое указывает Res. { node *q; q = new (node); (*q).elem = el; (*q).sled = (*(*Res).pred).sled; (*q).pred = (*Res).pred; (*(*Res).pred).sled = q; (*Res).pred = q; }
Со следующего шага мы начнем знакомиться с алгоритмами удаления звена из двунаправленного списка.