- •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;
Var temp:pTelem;
begin
current:=L.first; {ставим служебный указатель current
на первый узел списка}
if L.count<>0 then {если число узлов списка не равно
нулю, тогда начинаем итерационный
процесс удаления этих узлов}
repeat
temp:=current; {ставим вспомогательный указатель
temp на текущий (первый) узел,
заимствуя адрес у указателя current }
current:=current^.next;{перемещаем указатель current
с текущего (первого) узла на следующий (второй) узел}
temp^.Next:=nil; {обрываем связь между текущим
(первым) и следующим (вторым) узлом по указателю next}
temp^.prev:=nil; {обрываем связь между текущим
(первым) и предыдущим узлом по указателю prev
(при удалении первого узла списка этот оператор можно
не выполнять) }
dispose(temp); {удаляем узел на который указывает
указатель temp (первый узел)}
until current=nil; {цикл работает до тех пор пока,
перемещаясь по списку, указатель current не достигнет
последнего узла, который не удаляется}
dispose(current); {удаляем последний узел спика}
Tlist_Init; { инициализируем (освобождаем) указатели
First , Last и счетчик Count}
end;
Вывод содержимого информационных полей списка (прямая и обратная печать)
Вывод содержимого информационных полей списка (или печать списка) является частным случаем алгоритма обхода списка, основная идея которого заключается в переходе от узла к узлу списка согласно ссылкам, записанным в узлах. Для этой цели в процедуре прямой печати (от “головы” списка) PrintFirst организован цикл для переме-щения указателя current по узлам списка, начиная с первого. Внутри этого цикла присут-ствует оператор(mem.Add) для вывода содержимого информационных полей текущего узла в окно компонента memo1 через свойство lines:
procedure PrintFirst(mem:TStrings);
begin
current:=L.first; {ставим служебный указатель current
на первый узел списка}
if L.count<>0 then
repeat
mem.Add(current^.down.M+' '+current^.down.N+'
'+current^.down.W);
current:=current^.next; {перемещаем указатель current
с текущего узла на следующий}
until current=nil
else
end;
Процедура обратной печати PrintLast аналогична по-своему алгоритму процедуре прямой печати PrintFirst с той лишь разницей, что начальное положение указателя current находится на последнем узле списка и он перемещается в перед к началу списка.
procedure PrintLast(mem:TStrings);
begin
current:=L.Last; {ставим служебный указатель current
на последний узел списка}
if L.count<>0 then
repeat
mem.Add(current^.down.M+' '+current^.down.N+
' '+current^.down.W);
current:=current^.prev; {перемещаем указатель
current с текущего узла на предыдущий}
until current=nil
else
end;
