Лабораторная работа №10 Работа с динамической памятью
Версия от 08:47, 15 апреля 2008; Калентьева Елена (обсуждение | вклад) (Защищена страница «Лабораторная работа №10 Работа с динамической памятью» [edit=sysop:move=sysop])
Теоретические сведения
Динамические списки представляют собой данные, размещённые в динамической памяти, связанные между собой посредством указателей. Объекты списка - это записи, содержащие информационные поля и поля - указатели.
Пример программы
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. Создайте процедуру сортировки объектов по заданному правилу.