- •Просуков е.А., Пащенко о.Б.
- •(Упрощенная версия для однонаправленных списков)
- •Содержание
- •1. Ссылки , динамические переменные и структуры.
- •Адресный тип-указатель, ссылочные переменные, простейшие действия с указателями.
- •Практические примеры работы с несвязанными динамическими данными.
- •2.1. Разновидности связанных списков
- •3 . Приемы программирования по работе со списком .
- •3.1 Создание пустого списка.
- •Ввод-вывод содержимого информационных полей списка .
- •Включение и исключение элементов из списка .
- •Процедуры включения элементов .
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
{3}
info
info
info
next
next
next
current
info
info
next
next=current^.next
Рис.3.2
Процедуру построения списка следует дополнить процедурой инициали-зации указателей начала и конца списка и счетчика узлов.
procedure init_list;
begin
list0.head:=nil; list0.tail:=nil; list0.count:=0;
end;
