Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методика_списки_1.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
186.37 Кб
Скачать

3 . Приемы программирования по работе со списком .

3.1 Создание пустого списка.

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

type List=record

head:PtrNode; { указатель начала списка }

tail:PtrNode; { указатель конца списка }

count:integer;

end;

Графически это можно представить как показано на рис.3.1.

head:=nil;

tail:=nil;

count:=0;

nil nil

Рис.3.1

Как следует из раздела 2, каждый узел однонаправленного линейного списка содержит один указатель на следующий узел. В последнем узле списка указатель на следующий узел содержит значение nil. Для реализации этих целей используем следующие структурные построения данных:

type PtrStud=^student;

student=record { информационная запись }

name:string[20]; age:integer; group:string[10]

end;

PtrNode=^node;

node=record

info:student;

next:PtrNode; и на последующие узлы списка }

end;

List=record

head:PtrNode;

tail:PtrNode;

count:integer;

end;

Proc=procedure(x:ptrnode);

Для построения списка следует выполнить итерационную процедуру связывания структурированных узлов, посредством инициализации поля next:

var current:ptrnode; {указатель на текущий узел}

listfile:file of student;

list0:list;

file_name:string;

procedure create_list;

begin

reset(listfile);

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

read(listfile,current^.info); {чтение из файла информации

по первому студенту в узел 1}

list0.count:=1;

list0.head:=current; {указатель начала списка поставлен на

текущий первый узел}

while not eof(listfile) do

begin

{3} new(current^.next);{выделить память для следующего узла

по адресу, записанному в поле next текущего узла}

read(listfile,current^.next^.info);

inc(list0.count);

{5} current:=current^.next;{сделать следующий(второй) узел текущим (перемещаем указатель current на следующий узел)}

end;

list0.tail:=current;{указатель конца списка ставим на

последний узел}

current^.next:=nil;{поле next последнего узла списка

принимает значение nil}

close(listfile);

readln;

end;

На рис.3.2 графически интерпретированы действия операторов программы.

current

{

current

1} {3}

info

info

info

next

next

next

current

{5}

info

info

next

next=current^.next

Рис.3.2

Процедуру построения списка следует дополнить процедурой инициали-зации указателей начала и конца списка и счетчика узлов.

procedure init_list;

begin

list0.head:=nil; list0.tail:=nil; list0.count:=0;

end;