Циклический список

Голова списка

Для того, чтобы избавиться от особенностей вставки и удаления в начале списка и для того, чтобы иметь возможность отличить пустой список от несуществующего, в начало списка можно поместить специальный узел, называемый головой списка. Таким образом, даже пустой список содержит хотя бы один узел – голову. В таком случае, все узлы списка, в тои числе и первый имеют предшественника и операции вставки и удаления в начале списка не имеют особенностей. В поле данных головы обычно помещают данные, которые не может иметь ни один рабочий узел списка.

 
 

В циклическом списке поле связи последнего узла указывает на начало списка, как это изображено на рис. 7.

Рис.7 Циклический список

 

Циклический список обычно представлен в программе указателем на хвост (Tail), так как получить в этом случае указатель на начало не представляет труда. Для циклических списков становятся простыми операции сцепления и расщепления. Рис. 8 иллюстрирует операцию расщепления по узлу P. Пунктиром изображено изменение связей после операции.

 
 

Рис.8 Расщепление списка

 

На языке СИ это может быть записано следующим образом:

 

NODE *x;

x=P->Next;

P->Next=Tail->Next;

Tail->Next=x;

 

Нетрудно заметить, что операция выполняет обмен местами указателей P->Next и Tail->Next. Следовательно, повторное применение той же операции приведет к сцеплению списков. Операция работает как кнопочный выключатель.