- •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;
Implementation
Содержимое процедур приведено в разделе реализации модуля.
Создание (построение) и опустошение списка
Под пустым списком следует понимать служебную структуру данных типа запись, содержащую поля указателей на начало и конец линейного списка, а также поле-счетчик узлов этого списка. При этом поля указателей еще не содержат конкретный адрес узла начала и узла конца списка, а лишь проинициализированы безадресным значением nil. В свою очередь поле-счетчик содержит значение 0. Поэтому на начальном этапе построения списка используется процедура TList_Init она инициализирует указатели First , Last и счетчик Count, присваивая им начальные значения, и используется в процедурах как построения так и удаления списка.
procedure TList_Init;
begin
L.First:=nil;
L.Last:=nil;
L.Count:=0;
end;
Затем следует ключевая процедура построения списка CreateList. Построение непустого списка можно осуществить посредством вставки новых узлов либо со стороны “головы” (начала) списка, либо со стороны “хвоста” (конца) списка. Возьмем в качестве примера процедуру вставки узла со стороны “головы” списка, и пусть эта процедура имеет вид:
procedure CreateList;
Var I:integer;
begin
Tlist_Init; {вызвана процедура инициализации указателей
First , Last и счетчика Count}
{1} new(current); {выделена память под первый узел
списка, а его адрес записан в указатель current }
Inc(L.Count); {узлов в списке стало на один больше}
current^.down.M:=a[L.Count].M; {заполним три
информационных поля первого узла,}
current^.down.N:=a[L.Count].N; {иначе говоря введем
данные по первому владельцу}
current^.down.W:=a[L.Count].W;{автомобиля, используя
операцию разименовывания «^» для работы с полем down}
{2} current^.prev:=nil; ;{поле prev первого узла принимает
значение nil}
L.first:=current; {указатель начала списка поставлен на
текущий первый узел (куда указывает current туда же
будет указывать и first, адреса уравнены) }
while L.Count<>ind do {цикл работает до тех пор
пока не будет создано заданное число узлов «ind»}
begin
{3} new(current^.next); {выделить память для следующего
узла по адресу, записанному в поле next текущего}
Inc(L.Count); {узлов в списке стало на один больше}
current^.next^.down.M:=a[L.Count].M; {заполним три
информационных поля }
current^.next^.down.N:=a[L.Count].N; {следующего узла,}
current^.next^.down.W:=a[L.Count].W;
{4} current^.next^.Prev:=current; {инициализируем
поле prev следующего(второго) узла, записывая в него
адрес предыдущего(первого) узла (связывание второго
узла с первым по полю prev)}
{5} current:=current^.Next; {сделать следующий(второй)
узел текущим (перемещаем указатель current на
следующий узел)}
end;
L.Last:=current; {указатель конца списка
поставлен на текущий последний узел (куда
указывает current туда же будет указывать и Last,
адреса уравнены)}
current^.Next:=nil; {поле next последнего узла
списка принимает значение nil}
end;
Таким образом для построения списка следует выполнить итерационную процедуру связывания структурированных узлов, посредством инициализации их полей prev и next. На рис.14 графически интерпретированы действия пронумерованных операторов программы.
Рис.14. Графическая интерпретация действий
Чтобы опустошить, т. е. уничтожить список, надо организовать итерационный процесс удаления узлов либо со стороны “головы” списка, либо со стороны “хвоста” списка до тех пор, пока список не станет пустым. Возьмем в качестве примера процедуру DisposeList (удаления узла со стороны головы списка) и пусть эта процедура имеет вид:
procedure DisposeList;
