Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
К2_Допматериалы_15апр.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
2.99 Mб
Скачать

Кольцевые списки

Узел кольцевого односвязного списка содержит одно или несколько информационных полей и поле-ссылку, указывающее на следующий узел списка (рис.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. По приведенному выше псевдокоду напишите процедуру удаления узла из кольцевого односвязного списка.

  • Примечание: В случае двусвязного кольцевого списка решение задач добавления/удаления узла упрощается, т.к. всегда можно обратиться к узлу, предшествующему добавляемому (удаляемому), используя соответствующую ссылку.

  • СОРТИРОВКА СОДЕРЖИМОГО СВЯЗНЫХ СПИСКОВ