
- •Адресные типы
- •Использование динамической памяти
- •Линейные списки
- •Формы представления линейных списков в оперативной памяти
- •Стеки, очереди, деки
- •Представление стека в непрерывной памяти (в виде массива)
- •Представление стека в связанной памяти (в виде односвязного списка)
- •Очереди
- •Представление очереди в непрерывной памяти (в виде массива)
- •Представление очереди в связанной памяти (в виде односвязного списка)
- •Односвязный список
- •Двусвязный список
- •Кольцевые списки
- •Сортировка с помощью прямого выбора
- •Сортировка с помощью прямого обмена (пузырьковая)
- •Оценка затрат на поиск элемента
Кольцевые списки
Узел кольцевого односвязного списка содержит одно или несколько информационных полей и поле-ссылку, указывающее на следующий узел списка (рис.16А). Для последнего узла поле-ссылка ссылается на первый узел списка.
Узел кольцевого двусвязного списка содержит одно или несколько информационных полей и поля-ссылки на предшествующий и следующий узлы. За последним узлом кольцевого списка следует первый его узел, а первому предшествует последний списка (вместо значения Nil в соответствующих полях необходимо задавать адреса первого и последнего узлов, рис.16B).
-
A)
B)
0 узлов
1 узел
>1 узла
рис. 16. Кольцевые списки: A) односвязный; B) двусвязный.
ДОБАВЛЕНИЕ УЗЛА В КОЛЬЦЕВОЙ ОДНОСВЯЗНЫЙ СПИСОК (вариант)
ЕСЛИ список пуст ТО
Создать список из 1 узла
ИНАЧЕ
ЕСЛИ добавление в начало списка ТО
Переместить ссылку pr на последний узел списка
Создать новый узел p^
Установить ссылки между узлами pr^ и p^, p^ и Head^
Сделать узел p^ головным узлом списка
ИНАЧЕ
Переместить ссылку pr на узел, за которым должен следовать p^
Создать новый узел p^
Изменить значения полей-ссылок для узлов p^ и pr^
ВСЕ-ЕСЛИ
ВСЕ-ЕСЛИ
ДОБАВЛЕНИЕ ЭЛЕМЕНТА В КОЛЬЦЕВОЙ ОДНОСВЯЗНЫЙ УПОРЯДОЧЕННЫЙ СПИСОК
-
Procedure AddCircle(var H:List; value:Byte);
Var
Pr,p:list;
Begin
If H=nil then
Begin
New(H);
H^.info:=Value;
H^.next:=H;
end
ЕСЛИ список пуст ТО
Создать список из 1 узла
else
if Value<H^.info then
begin
pr:=H;
While pr^.next<>H do
pr:=pr^.next;
New(p);
p^.info:=Value;
p^.next:=pr^.next;
pr^.next:=p;
H:=p;
end
ИНАЧЕ
ЕСЛИ добавление в начало списка ТО
Переместить ссылку pr на последний узел списка
Создать новый узел p^
Установить ссылки между узлами pr^ и p^, p^ и H^
Сделать узел p^ головным
else
begin
pr:=H;
p:=H;
While (Value>p^.info)and(pr^.next<>H) do
begin
pr:=p;
p:=p^.next;
end;
New(p);
p^.info:=Value;
p^.next:=pr^.next;
pr^.next:=p;
end;
end;
ИНАЧЕ
Переместить ссылку pr на узел, за которым должен следовать p^
Создать новый узел p^
Изменить значения ссылок для узлов p^ и pr^
ВСЕ-ЕСЛИ
ВСЕ-ЕСЛИ
ВОПРОС. Какие изменения нужно внести в процедуру AddCircle, чтобы добавить узел в кольцевой двусвязный упорядоченный список?
УДАЛЕНИЕ УЗЛА ИЗ КОЛЬЦЕВОГО ОДНОСВЯЗНОГО СПИСКА (вариант)
ЕСЛИ список пуст ТО
Вывести сообщение «список пуст»
ИНАЧЕ
Найти удаляемый (p^) и предшествующий ему (pr^) узлы списка
ЕСЛИ узел p^ не найден ТО
Вывести сообщение «узел не найден»
ИНАЧЕ
ЕСЛИ в списке 1 узел ТО
HEAD=nil // для списка без вспомогательных узлов
ИНАЧЕ
Установить ссылку из узла pr^ на узел, следующий за p^
ЕСЛИ узел p^ - первый узел списка ТО
Перенести указатель начала списка на следующий за p^ узел
ВСЕ-ЕСЛИ
ВСЕ-ЕСЛИ
Освободить память, занимаемую узлом p^
ВСЕ-ЕСЛИ
ВСЕ-ЕСЛИ
ЗАДАНИЕ 6. По приведенному выше псевдокоду напишите процедуру удаления узла из кольцевого односвязного списка.
Примечание: В случае двусвязного кольцевого списка решение задач добавления/удаления узла упрощается, т.к. всегда можно обратиться к узлу, предшествующему добавляемому (удаляемому), используя соответствующую ссылку.
СОРТИРОВКА СОДЕРЖИМОГО СВЯЗНЫХ СПИСКОВ