Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Шпоры ОАиП(теория).docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
151.01 Кб
Скачать

30.Списки: двухсвязные

Линейный двусвязный список (linear double—linked list) дает возможность двигаться в одном из двух направлений. Он отличается от односвязного тем, что каждый его элемент содержит два логических указателя, один из которых (прямой указатель — direct pointer) адресует, как и в односвязном списке, следующий элемент, а другой указатель (обратный — backward pointer) адресует предыдущий элемент списка. Логическая структура линейного двусвязного списка (ЛДС) представлена на рис. 7.11. Заметим, что начало и конец такого списка логически эквивалентны, так как доступ к любому элементу может быть осуществлен с любого конца списка.

Описания типов и переменных, необходимые для линейного двусвязного списка, показаны на рис. 7.12.

Tyре Рt = ^Ваsеtyре;

Ваsеtуре = Rесоrd

Kеу : Integer;

DРоint, Вроint : Рt;

Dаtа: ...

еnd;

Vаr

Left, Сurrent, Right : Рt;

Рис. 7.12. Описания типов и переменных, соответствующие структуре ЛДС

Текст программы формирования ЛДС, состоящего из N элементов, приводится на рис. 7.13. Формирование списка осуществляется "справа — налево", то есть первый из созданных в динамической памяти элементов списка адресуется указателем Right, а последний (левый) — указателями Left и Сurrent. Если бы мы захотели, чтобы по завершении работы этой процедуры текущий указатель Сurrent располагался на правом конце списка, то после строки, содержащей end {¬While}, нужно было бы расположить оператор Сurrent : = Right;

Рrосеdurе Сеnerаtion_LDL (N : Word;

Vаr Left, Right, Сurrent : Рt);

{¬РЕЗУЛЬТАТЫ:

1) формирует ЛДС, содержащий N элементов типа Ваsеtуре (если N=0, то список пуст, Left=Right=Nil);

2) Left и Сurrent указывают на левый конец списка (последний из созданных элементов), указатель Right адресует элемент (он создается первым), расположенный на правом конце;

3) в поле Kеу элементов заносятся их номера в порядке возрастания значений "слева-направо"}

Vаr i :Word;

Веgin

Left := Nil; Right := Left;

I :=N;

Whilе i>0 Do

Веgin

New (Сurrent);

Сurrent^.DРоint := Left;

Сurrent^.ВРоint := Nil;

If i=N Тhen Right := Current

Else Current^.DPoint^.ВРоint :=Сurrent;

Left ;= Сurrent;

Сurrent^.Kеy := i;

i := i+1

еnd {¬Whilе}

Епd {¬Gеneration_LDL};

Рис. 7.13. Текст Паскаль-процедуры Generation_LDL

Для просмотра списка, созданного подпрограммой Gеneration_LDL, может быть использован фрагмент, представленный на рис. 7.14; при "работе" этого фрагмента список просматривается слева направо.

While Current<>Nil Do

{¬..действия над полями элемента Сurrent}

Current := Current^.DРоint;

еnd {¬Whilе};

Рис. 7.14. Программный фрагмент для просмотра ЛДС слева направо