{ P_54_1 – Размещение данных в несортированном списке }
type PRec = ^TRec; { Тип указатель на запись }
TRec = record { Тип записи для базы данных }
mNumber : integer; { Номер авто }
mFam : string[31]; { Фамилия владельца }
mNext : PRec; { Указатель на следующую запись }
end;
var List : PRec; { Указатель на начало списка (голова) }
{ Добавление в список записи об автомобиле }
procedure AddToList(aNumber: integer; const aFam : string);
var P : PRec;
begin
New(P); { Создаем динамическую переменную-запись }
{ Размещаем данные в полях записи }
P^.mNumber:= aNumber; P^.mFam:= aFam;
P^.mNext:= List; { Цепляем предыдущую запись к новой записи }
List:= P; { Теперь голова указывает на новую запись }
end;
{ Распечатка списка }
procedure PrintList;
var P : PRec;
begin
P:= List;
while Assigned(P) do begin
Writeln(P^.mNumber, '':3, P^.mFam);
P:= P^.mNext;
end;
end;
begin { Главная программа }
List:= nil;
AddToList(10, 'Иванов');
AddToList(20, 'Петров');
AddToList(30, 'Сидоров');
PrintList;
Readln;
end.
Основу программы составляют процедуры вставки в список и его распечатки. В процедуре AddToList – добавить в список – первые строки вам знакомы: после создания динамической переменной P^ данные копируются в её поля. Обратите внимание на то, что указатель P – это локальная переменная, которая исчезнет после выхода из процедуры. И тогда, если не сохранить этот указатель, адрес новой переменной будет утерян, что приведет к утечке памяти. Поэтому после создания новой переменной P^ адрес из головы списка List копируется в поле mNext вновь созданной записи, и адрес новой записи P помещается в голову списка. Вот эти операторы.
P^.mNext:= List; { Цепляем предыдущую запись к новой записи }
List:= P; { Теперь голова указывает на новую запись }
Все просто, но если эти строки поменять местами, катастрофа неминуема!