7. ДИНАМИЧЕСКАЯ ПАМЯТЬ
107
Он выполняет инициализацию указателя первого элемента списка, иначе говоря, показывает,
что список пуст. Всякое другое значение будет означать адрес первого элемента списка (не пу-
тать с неинициализированным состоянием указателя).
Структура линейного однонаправленного списка показана на рисунке 17.
Если последний элемент содержит ссылку на первый элемент списка, то такой спи-
сок называется кольцевым, циклическим. Изменения в списке при этом минимальны – до-
бавляется ссылка с последнего на первый элемент списка: в адресной части последнего
элемента значение Nil заменяется на адрес первого элемента списка (см. рис. 18).
При обработке однонаправленного списка могут возникать трудности, связанные с
тем, что по списку с такой организацией можно двигаться только в одном направлении,
как правило, начиная с первого элемента. Обработка списка в обратном направлении
сильно затруднена. Для устранения этого недостатка служит двунаправленный список,
каждый элемент которого содержит ссылки на последующий и предыдущий элементы
(для линейных списков – кроме первого и последнего элементов). Структура элемента
представлена на рис. 1бб.
Такая организация списка позволяет от каждого элемента двигаться по списку как в
прямом, так и в обратном направлениях. Наиболее удобной при этом является та органи-
зация ссылок, при которой движение, перебор элементов в обратном направлении являет-
ся строго противоположным перебору элементов в прямом направлении. В этом случае
список называется симметричным. Например, в прямом направлении элементы линейного
списка пронумерованы и выбираются так: 1, 2, 3, 4, 5. Строго говоря, перебирать элемен-
ты в обратном направлении можно по-разному, соответствующим способом организуя
ссылки, например: 4, 1, 5, 3, 2. Симметричным же будет называться список, реализующий
перебор элементов в таком порядке: 5, 4, 3, 2, 1.
Следует заметить, что «обратный» список, так же, как и прямой, является просто
линейным однонаправленным списком, который заканчивается элементом со ссылкой,
имеющей значение NIL. Для удобства работы со списком в обратном направлении и в
соответствии с идеологией однонаправленного списка нужен доступ к первому в обрат-
ном направлении элементу. Такой доступ осуществляется с помощью указателя LAST на
этот первый в обратном направлении элемент. Структура линейного двунаправленного
симметричного списка дана на рис. 19 .
Как указывалось ранее, замкнутый, циклический, кольцевой список организован
таким образом, что в адресную часть конечного элемента вместо константы NIL помеща-
ется адрес начального элемента (список замыкается на себя). В симметричном кольцевом
списке такое положение характерно для обоих – прямого и обратного – списков, следова-
тельно, можно построить циклический двунаправленный список (см. рис. 20).
Описать элемент однонаправленного списка (см. рис 1) можно следующим образом:
TYPE
POINT=^ZAP;
ZAP=RECORD
INF1:INTEGER; { первое информационное поле }
INF2:STRING; { второе информационное поле }
NEXT:POINT; {ссылочное поле }
END;
Из этого описания видно, что имеет место рекурсивная ссылка: для описания типа
POINT используется тип ZAP, а при описании типа ZAP используется тип POINT. По
соглашениям Паскаля в этом случае сначала описывается тип «указатель», а затем уже тип
связанной с ним переменной. Правила Паскаля только при описании ссылок допускают