Лабораторная работа №10 Работа с динамической памятью
Перейти к навигации
Перейти к поиску
Теоретические сведения
Динамические списки представляют собой данные, размещённые в динамической памяти, связанные между собой посредством указателей. Объекты списка - это записи, содержащие информационные поля и поля - указатели.
Пример программы
Program SPISOC; uses crt; Type PoleSv: ^Auto; {определён тип - указатель на тип Auto-список} Str: string[15]; {определён тип - строка длиной 15} Auto = record {определение типа - запись} MarcAuto:Str; {поле - марка автомобиля } SpeedMax:real; {поле - максимальная скорость} Next: PoleSv {поле связи со следующим объектом списка - указатель на список} end; var P1,P2:PoleSv; {Указатель на список} S:Str; procedure Init(var u:PoleSv); {процедура создания списка} var x,y:PoleSv; i,n:integer; begin WriteLn('Инициализация списка: '); WriteLn('Введите количество элементов списка:'); ReadLn(n); u:=Nil ; {пустой указатель} for i:=1 to n do begin New(y); Write('Введите марку авто: '); ReadLn(y^.MarcAuto); Write('Введите максимальную скорость: '); ReadLn(y^.SpeedMax); y^.Next:=Nil; if u=Nil Then u:=y Else begin x^.Next:=y; x:=y; end; end; end; procedure AddFirst(var u:PoleSv); {процедура добавления элемента в начало списка } var x:PoleSv; begin WriteLn('Добавим элемент в начало списка:'); New(x); Write('Введите марку авто: '); ReadLn(x^.MarcAuto); Write('Введите максимальную скорость: '); ReadLn(x^.SpeedMax); x^.Next:=u; u:=x; end; procedure Wr_Spisok(var u:PoleSv); {процедура вывода списка} var x:PoleSv; begin WriteLn('Вывод списка:'); x:=u; While x<> Nil do begin WriteLn('марка авто: ',x^.MarcAuto); WriteLn('максимальная скорость: ',x^.SpeedMax:5:1); x:=x^.Next; end; end; Function FindName(F_n:str;var u:PoleSv):PoleSv; {Функция ищет в списке объект, поле MarcAuto которого совпадает с параметром F_n} var Curr:PoleSv; {Переменная для прохода по связанному списку} begin WriteLn('Поиск данных об автомобиле по его марке:'); Curr:=u; While Curr<> Nil do {поиск завершится, когда список закончится } if Curr^.MarcAuto=F_n then begin FindName:=Curr; {нашли объект, возвращаем в основную программу значение и завершаем функцию} Exit; end else Curr:=Curr^.Next; {иначе переходим к следующему объекту} FindName:=Nil {цикл завершился значит нет такого объекта, возвращаем свободный указатель} end; begin {начало основной программы} clrscr; Init(P1); {создаем список} Wr_Spisok(P1); {выводим значения информационных полей объектов списка} AddFirst(P1); {добавляем объект в начало списка} Wr_Spisok(P1); {выводим значения информационных полей объектов списка} WriteLn('Введите марку автомобиля для поиска: '); ReadLn(S); {вводим информацию для поиска объекта} P2:=FindName(S,P1); {запоминаем результат-указатель на найденный объект } if P2<>Nil then {анализируем результат поиска и выводим его} begin WriteLn('марка авто:',P2^.MarcAuto); WriteLn('максимальная скорость:',P2^.SpeedMax:5:1) end else WriteLn('Нет данных в списке.'); readln end.
Задания к работе
1. Изучите алгоритм программы SPISOC. Алгоритм позволяет создавать список информационных объектов (procedure Init). Информационные поля каждого объекта содержат данные об автомобиле (MarcAuto, SpeedMax). Алгоритм позволяет добавлять объект в список, выводить информацию об объектах, искать объект по запросу. 2. Проверьте работу программы, добавьте к объекту новые поля - цвет авто, номер и т.п. 3. Создайте процедуру, позволяющую добавить объект в список после указанного объекта, то есть вставлять объект. 4. Создайте процедуру сортировки объектов по заданному правилу.