Работа с динамической памятью и указателями в системе Turbo Pascal. Мирецкий И.Ю - 15 стр.

UptoLike

Составители: 

{вводимого в очередь; age - возраст пациента}
function pospat(age:integer):elem;
var a,b:elem; {a - текущий элемент списка}
begin
a:=first;
while (a^.next <> nil) and (a^.age > age)
do begin
{организация движения по списку от элемента к следующему элементу}
b := a; a := a^.next
end;
if a^.age > age then pospat := a
else pospat := b
end;
{процедура inspat вводит элемент в очередь на}
{позицию, соответствующую возрасту пациента}
procedure inspat(pat:elem);
var a:elem; {a - текущий элемент списка}
begin
a:=first;
if pat^.age > 60
then if a^.age <= 60
{если возраст пациента больше60 лет и все пациенты в очереди }
{моложе 60 лет,
элемент становится первым в списке}
then begin
pat^.next := first; first := pat; exit end
{если возраст пациента больше 60 лет и не все пациенты в очереди }
{моложе 60 лет, позицию элемента определяется функцией pospat }
else a := pospat(60);
{если возраст пациента не превышает }
{60 лет, pospat ищет "хвост" очереди}
if pat^.age <= 60 then a := pospat(0);
pat^.next := a^.next; {переопределение ссылок}
a^.next := pat
end;
{процедура delpat удаляет элемент из очереди по имени nm пациента}
procedure delpat(nm:s_t_r);
var a,b:elem; {a - текущий элемент списка}
begin
a:=first;
while a <> nil do
if a^.fio = nm
then begin
if a = first
then begin
{удаление первого элемента}
first := a^.next;
                                                                {вводимого в очередь; age - возраст пациента}
        function pospat(age:integer):elem;

            var a,b:elem;           {a - текущий элемент списка}

            begin
               a:=first;
               while (a^.next <> nil) and (a^.age > age)
                   do begin
                                      {организация движения по списку от элемента к следующему элементу}
                            b := a; a := a^.next
                         end;
               if a^.age > age then pospat := a
                                                  else pospat := b
            end;

                                  {процедура inspat вводит элемент в очередь на}
                                  {позицию, соответствующую возрасту пациента}

        procedure inspat(pat:elem);

   var a:elem;                                         {a - текущий элемент списка}
   begin
       a:=first;
       if pat^.age > 60
           then if a^.age <= 60
                                                 {если возраст пациента больше60 лет и все пациенты в очереди }
                                                           {моложе 60 лет, элемент становится первым в списке}
                       then begin
                                     pat^.next := first; first := pat; exit end
                                          {если возраст пациента больше 60 лет и не все пациенты в очереди }
                                           {моложе 60 лет, позицию элемента определяется функцией pospat }
                       else a := pospat(60);

                                                                             {если возраст пациента не превышает }
                                                                              {60 лет, pospat ищет "хвост" очереди}
      if pat^.age <= 60 then a := pospat(0);

      pat^.next := a^.next;          {переопределение ссылок}
      a^.next := pat
   end;


                                         {процедура delpat удаляет элемент из очереди по имени nm пациента}
procedure delpat(nm:s_t_r);

   var a,b:elem;                         {a - текущий элемент списка}

   begin
      a:=first;
      while a <> nil do
         if a^.fio = nm
              then begin
                            if a = first
                                 then begin
                                                            {удаление первого элемента}
                                              first := a^.next;