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

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;

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