Пример программы создания и использования связанного списка
Пусть требуется создать связанный список из записей, содержащих сведения об автомобилях, а также реализовать операции со связанным списком: запись первым в список, удаление первого объекта из списка, просмотр всего списка, удаление объекта, следующего за указанным. {Пример использования указателей для обработки связанного списка} 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 Все права принадлежат авторам размещенных материалов.
|