Пусть требуется создать связанный список из записей, содержащих сведения об автомобилях, а также реализовать операции со связанным списком: запись первым в список, удаление первого объекта из списка, просмотр всего списка, удаление объекта, следующего за указанным.
{Пример использования указателей для обработки связанного списка}
Program point;
Uses Crt;
Type
NameStr = String [20];
Link = ^Auto;
Auto = record
Name: NameStr; {Марка автомобиля}
Speed: real; {Скорость}
Next: Link; {Поле для связи со следующим объектом в списке}
end;
Var
Р,First: Link; {Указатели на запись: текущую, первую}
NamFind: NameStr; {Марка автомобиля для поиска}
V: 0..4; {Селектор меню}
EndMenu: boolean; {Окончание вывода меню}
{Поиск объекта с именем FN, по результатам поиска возвращает указатель на найденный объект или Nil, если объект не найден}
Function FindName(FN:NameStr): Link;
Var
Curr: Link;
begin
Curr:=First; {Установить указатель на первом объекте в списке }
{Повторять пока не дойдем до конца списка}
while Curr <> Nil do
if Curr^.Name=FN then {Если нашли заданный объект}
begin
FindName:=Curr; {Возвращаем значение указателя на него}
|
|
Exit; {Завершаем функцию}
end
else
Curr:=Curr^.Next; {Перейти к следующей записи}
FindName:=Nil; {В списке нет искомого объекта}
end; {Конец FindName}
{Добавление записи первой в связанный список}
procedure AddFirst(A:Link);
begin
A^. Next:=First; {Новый объект первый в списке}
First:=А; {Голова списка ссылается на новый объект}
end; {Конец AddFirst}
{Удаление первого объекта из списка}
procedure DelFirst(var A:Link);
begin
A:=First;
First:=First^. Next; {Теперь First указывает на тот объект, на который ранее ссылался объект А}
end; {Конец DelFirst}
{Удаление из списка объекта, стоящего после объекта Old}
procedure DelAfter(Old:Link; var A:Link);
begin
A:=Old^.Next; {Переменной А присваивается значение указателя на удаляемый объект}
Old^.Next:=Old^.Next^.Next; {Теперь Old указывает на тот объект, на который ранее ссылался следующий за ним объект, а объект А исключен из связанного списка}
end; {Конец DelAfter}
{Ввести данные об объекте}
procedure InpAvto;
begin
P:=New(Link); {Создать очередной объект типа Auto}
Write('Введите марку автомобиля:');
Readln(P^.Name);
Write('Максимальная скорость:');
Readln(Р^.Speed);
AddFirst(Р); {Вызов процедуры добавления записи, на которую ссылается указатель Р (Р- фактический параметр, А - формальный параметр-значение) }
end; {Конец InpAvto}
{Вывести на экран все объекты из связанного списка}
procedure MyList;
var
Curr: Link; {Локальная переменная - указатель на очередной объект}
begin
Curr:=First; {Установить указатель на первом объекте в списке}
{Повторять, пока не дойдем до конца списка}
while Curr <> Nil do
begin
Writeln('Марка: ', Curr^. Name,' скорость: ', Curr^. Speed);
Curr:=Curr^.Next; {Перейти к очередному объекту связанного списка}
end;
Write('Вывод списка окончен. Нажмите Enter');
Readln;
end; {Конец MyList}
Begin {Основная программа}
|
|
New(P); {Создать новую динамическую переменную и установить на нее переменную-указатель}
EndMenu:=False;
repeat {Очищать экран и выводить меню до тех пор, пока EndMenu<>True}
CIrScr;
Writeln('Укажите вид работы:');
Writein('1. Запись первым в список');
Writeln('2. Удаление первого объекта из списка');
Writein('3. Просмотр всего списка');
Writein('4. Удаление объекта, следующего в списке за указанным');
Writein('0. Окончание работы');
Readin(V);
Case V of {Вызов разных процедур в зависимости от выбора пункта меню}
1: InpAvto; {Ввод данных об объекте}
2: DelFirst(P); {Удаление первого в списке}
3: MyList; {Вывод списка всех элементов связанного списка}
4: begin {Удаление объекта, следующего за указанным}
Write('Введите марку автомобиля, за которым следует удаляемый из списка:');
Readln(NamFind);
DelAfter(FindHame(NamFind),P); {Вызов процедуры
DelAfter с параметрами: функцией FindName(NamFind) и указателем Р}
end
else
EndMenu:=True; {Завершить вывод меню}
end;
until EndMenu; {Если EndMenu=True, то завершить вывод меню на экран}
Dispose(Р); {Уничтожить динамическую переменную Р и освободить память в куче}
end.