
- •I: Byte; I: Byte;
- •Связанный список
- •Var Заголовок: Указатель_на_узел;
- •Interface
- •Var a:array[1..10] of ta;
- •Var Key: Char);
- •Var Key: Char);
- •Var Key: Char);
- •Структура модели списка. Модуль построения и редактирования списка
- •Interface
- •Implementation
- •Создание (построение) и опустошение списка
- •Var I:integer;
- •Var temp:pTelem;
- •Вывод содержимого информационных полей списка (прямая и обратная печать)
- •Включение и удаление узлов списка
- •Var I:integer; temp:ptElem;
- •Var I:integer;
- •Поиск узла по номеру
- •Var I:integer;
Включение и удаление узлов списка
Выделяют две основные операции, которые используются, как правило, при моди-фикации структуры списка. Это включение и исключение узлов. Наиболее просто эти операции реализуются для узлов с левой и правой стороны списка, т. к. всегда известно их местоположение: адреса первого и последнего узлов находятся в заголовке списка. Для включения узла в середину списка и исключения узла из середины списка необходимо предварительно выполнить обход части списка.
Включение узла в список заключается в размещении нового узла в подходящем месте списка. Порядок узлов при выполнении операции включения обычно не нарушается. Включение узла в середину списка всегда требует ссылку на узел, после которого будет размещен новый. Часто адрес этого узла неизвестен, и для его обнаружения необходим обход списка. Ниже приведена процедура включения нового узла в список после узла с заданным номером.
Алгоритм процедуры 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;