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

Включение и удаление узлов списка

Выделяют две основные операции, которые используются, как правило, при моди-фикации структуры списка. Это включение и исключение узлов. Наиболее просто эти операции реализуются для узлов с левой и правой стороны списка, т. к. всегда известно их местоположение: адреса первого и последнего узлов находятся в заголовке списка. Для включения узла в середину списка и исключения узла из середины списка необходимо предварительно выполнить обход части списка.

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

Алгоритм процедуры AddAfterNode (добавление узла после заданного) также состоит из двух основных действий: первое-это создание узла, а второе-это его включение(привязка) в заданное место цепочки линейного списка, используя при этом поля указателей prev и next:

procedure AddAfterNode;

Var I:integer; temp:ptElem;

begin

current:=L.first; {ставим служебный указатель current

на первый узел списка}

if L.count<>0 then begin

for i:=1 to t-1 do current:=current^.next;{ цикл

прохода по списку }

{Оператор цикла for do предназначен для перемещения

текущего указателя current в заданное место списка, на

узел после которого добавляется новый. Цикл работает

до тех пор пока номер заданного узла(переменная t) не

совпадет со значением счетчика i}

{1} New(temp); {выделена память под новый узел списка,

а его адрес записан в указатель temp }

{2} temp^.Prev:=current; {устанавливаем связь между

новым узлом и узлом перед которым он вставляется(связь

по полю указателя prev справа-налево)}

{3} temp^.Next:=current^.next; {устанавливаем связь

между новым узлом и узлом после которого он

вставляется(связь по полю указателя next слева-направо)}

temp^.down.M:=a[ind].M; {заполним три

информационных поля }

temp^.down.N:=a[ind].N; {нового узла,}

temp^.down.W:=a[ind].W;

{4} current^.next^.prev:=temp; {устанавливаем связь

между новым узлом и узлом перед которым он

вставляется(связь по полю указателя prev справа-налево)}

{5} current^.next:=temp; {устанавливаем связь между

новым узлом и узлом после которого он вставляется(связь

по полю указателя next слева-направо)}

Inc(L.count); {узлов в списке стало на один больше}

end;

end;

На рис.15 графически интерпретированы действия пронумерованных операторов процедуры AddAfterNode.

Рис.15. Графическая интерпретация действий

Для исключения узла из середины списка всегда необходима ссылка на удаляемый узел. Часто адрес этого узла неизвестен, и для его обнаружения необходим обход списка. Ниже приведена процедура DeleteNode (исключения узла из списка по заданному номеру).Алгоритм этой процедуры состоит из трех основных действий: первое-это перемещение служебного указателя current в заданное место списка на удаляемый узел, второе-это установление связей по указателям prev и next между узлом предшествующим удаляемому и узлом следующим за ним и наконец удаления выбранного узла.

procedure DeleteNode;

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]