Здавалка
Главная | Обратная связь

Пример программы создания и использования связанного списка



Пусть требуется создать связанный список из записей, содержащих сведения об автомобилях, а также реализовать операции со связанным списком: запись первым в список, удаление первого объекта из списка, просмотр всего списка, удаление объекта, следующего за указанным.

{Пример использования указателей для обработки связанного списка}

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.







©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.