Машинное представление связных линейных списков


Связные линейные списки

Списком называется упорядоченное множество, состоящее из переменного числа элементов, к которым применимы операции включения и исключения. Список, отражающий отношения соседства между элементами, называется линейным. Списки рассматривались в главе 4, однако речь шла о полустатических структурах данных, и на размер списка накладывались ограничения. Если ограничения на длину списка не допускаются, то список представляется в памяти в виде связной структуры. Линейные связные списки являются простейшими динамическими структурами данных.

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

На рис. 6.1 приведена структура односвязного списка. В нем поле INF является информационным, поле NEXT – указатель на следующий элемент списка. Каждый список должен иметь особый элемент, называемый указателем начала списка или головой списка, который по формату обычно отличен от остальных элементов. В поле указателя последнего элемента списка находится признак nil, свидетельствующий о конце списка.

 

 
 

 


Рис. 6.1. Структура односвязного списка.

 

 

Обработка односвязного списка не всегда удобна, т.к. отсутствует возможность продвижения в противоположную сторону. Такую возможность обеспечивает двухсвязный список, каждый элемент которого содержит указатель на следующий и предыдущий элементы списка. Структура линейного двухсвязного списка показана на рис. 6.2. Наличие двух указателей в каждом элементе усложняет список и приводит к дополнительным затратам памяти, но в то же время обеспечивает более эффективное выполнение некоторых операций над списком.

 

 
 

 


Рис. 6.2. Структура двухсвязного списка.

 

 

Разновидностью рассмотренных видов линейных списков является кольцевой список, который может быть организован на основе односвязного или двухсвязного списков. При этом в односвязном списке указатель последнего элемента должен указывать на первый элемент; в двухсвязном списке в первом и последнем элементах соответствующие указатели переопределяются, как показано на рис. 6.3. При работе с такими списками несколько упрощаются некоторые процедуры, выполняемые над списком. Однако при просмотре такого списка следует принять меры предосторожности, чтобы не попасть в бесконечный цикл.

 

 


Рис. 6.3. Структура кольцевого двухсвязного списка.

 

 

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

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