
- •Адресные типы
- •Использование динамической памяти
- •Линейные списки
- •Формы представления линейных списков в оперативной памяти
- •Стеки, очереди, деки
- •Представление стека в непрерывной памяти (в виде массива)
- •Представление стека в связанной памяти (в виде односвязного списка)
- •Очереди
- •Представление очереди в непрерывной памяти (в виде массива)
- •Представление очереди в связанной памяти (в виде односвязного списка)
- •Односвязный список
- •Двусвязный список
- •Кольцевые списки
- •Сортировка с помощью прямого выбора
- •Сортировка с помощью прямого обмена (пузырьковая)
- •Оценка затрат на поиск элемента
Двусвязный список
Описание: TYPE DList=^NODE; Node=record Info:Integer; Prev,Next:DList; End; |
Узел двусвязного списка содержит одно или несколько информационных полей и поля-ссылки на предшествующий (Prev) и следующий (Next) узлы. Первый узел не имеет предыдущего узла, последний – следующего за ним (значения nil). В кольцевом списке эти ссылки замыкаются (за последним узлом следует первый узел списка, а первому предшествует последний, см. далее). |
ЗАДАНИЕ 3.
рис. 13 Двусвязный список (фрагмент) |
Введем следующие обозначения (см. рис. 13): Q – ссылка на узел двусвязного списка. L - ссылка на узел, предшествующий Q^ R - ссылка на узел, следующий за Q^ Докажите истинность равенства Q^.Prev^.Next=Q^.Next^.Prev |
ДОБАВЛЕНИЕ УЗЛА В ДВУСВЯЗНЫЙ СПИСОК
В текст процедуры добавления узла в односвязный список (см. выше) добавляются операторы, устанавливающие ссылки prev на предыдущие узлы.
-
Возможны три случая:
A. Добавляемый узел находится между двумя узлами списка (L<>Nil, R<>Nil). Добавление узла Q^ между узлами L^ и R^ см. на рис.14;
B. Узел добавляется в начало списка (L=Nil, R<>Nil);
C. Узел добавляется в конец списка (L<>Nil, R=Nil).
Рис.14. Добавление узла
Действие
Случаи
Оператор(ы)
Найти узел L^ (и/или R^)
A, B, C
-------------
Создать новый узел Q^
A, B, C
Заполнить информационное поле узла Q^
A, B, C
Связать узел Q^ с предыдущим узлом (L^)
A, B, C
Связать узел Q^ со следующим узлом (R^)
A, B, C
Связать узел L^ с узлом Q^ (Q^ следует за L^)
A, C
Связать узел R^ с узлом Q^ (Q^ предшествует R^)
A, B
При добавлении в начало списка: перенести указатель начала списка на узел Q^
B
Примечание: Если ссылка L (R) ссылается на nil, ее разыменование в операторе 6 (7) не допускается.
ЗАДАНИЕ 4. Заполните свободные поля таблицы соответствующими операторами и напишите процедуру добавления узла в двусвязный список (порядок действий схематически показан на рис.14).
УДАЛЕНИЕ УЗЛА ИЗ ДВУСВЯЗНОГО СПИСКА
При удалении узла Q^ из двусвязного списка также выделим 3 случая:
-
A. Узел Q^ располагается между узлами L^ и R^ (L<>nil, R<>nil, рис. 15).
B. Удаляется первый узел списка (Q=HEAD, L=Nil).
C. Удаляется последний узел списка (R=Nil).
рис.15. Удаление узла
Рассмотрим удаление узла двусвязного списка для случая A:
-
Действие
Оператор(ы)
Найти удаляемый узел Q^ (по номеру или значению) и установить ссылки на узлы L^ и R^
Установить ссылку из узла L^ на узел R^
Установить ссылку из узла R^ на узел L^
Удалить узел Q^
ВОПРОС. Какие действия, указанные в таблице, не должны выполняться в случае B (L=nil) и в случае C (R=nil)?
ЗАДАНИЕ 5. Заполните свободные поля таблицы соответствующими операторами и напишите процедуру удаления узла из двусвязного списка.