Лабораторная работа №10 Работа с динамической памятью

Материал из wiki.nntc.nnov.ru
Перейти к навигации Перейти к поиску

Теоретические сведения

Динамические списки представляют собой данные, размещённые в динамической памяти, связанные между собой посредством указателей. Объекты списка - это записи, содержащие информационные поля и поля - указатели.

Пример программы

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. Создайте процедуру сортировки объектов по заданному правилу.