Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лекции_ по алгоритм и структуре.doc
Скачиваний:
56
Добавлен:
07.08.2019
Размер:
1.34 Mб
Скачать

3. 2. Двусвязный список, кольцевой двусвязный список

Обработка односвязного списка не всегда удобна, так как отсутствует возможность продвижения в противоположную сторону.

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

рис. 15 - Структура линейного двухсвязного списка

Поле NEXT - указатель на следующий элемент, поле PREV - указатель на предыдущий элемент. В крайних элементах соответствующие указатели должны содержать nil

Для удобства обработки списка добавляют еще один особый элемент - указатель конца списка.

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

В двухсвязном списке в первом и последнем элементах соответствующие указатели переопределяются, как показано на рис.16.

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

При работе с такими списками несколько упрощаются некоторые процедуры, выполняемые над списком.

Однако, при просмотре такого списка следует принять некоторых мер предосторожности, чтобы не попасть в бесконечный цикл

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

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

Дескриптор списка реализуется в виде особой записи и содержит информацию о списке:

  • адрес начала списка,

  • код структуры,

  • имя списка,

  • текущее число элементов в списке,

  • описание элемента и т.д., и т.п.

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

Операции над двусвязными списками:

  • создание элемента списка;

  • поиск элемента в списке;

  • вставка элемента в указанное место списка;

  • удаление из списка заданного элемента

Примеры на Паскаль

    • элемент двухсвязного списка (dll - double linked list): список вдвоем с использованием указателей

type

dllptr = ^dlltype; { указатель в двухсвязном списке }

dlltype = record { элемент односвязного списка }

inf : data; { информационная часть }

next : sllptr; { указатель на следующий элемент (вперед) }

prev : sllptr; { указатель на предыдущий элемент (назад) }

end;

4. Рекурсивные алгоритмы

Рекурсия (от латинского recursio - возвращение) - это такой способ организации вычислительного процесса, при котором процедура или функция в ходе выполнения составляющих ее операторов обращается сама к себе.

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

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

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