Динамические структуры и абстракции данных, страница 6

  procedure AddRight(L: PList; E: T);

// --------------------Добавить элемент к списку (слева)------------------------

  procedure AddLeft(L: PList; E: T);

// --------------------Опустошить список----------------------------------------

  procedure EmptyList(L: PList);

// --------------------Объединить два списка в один-----------------------------

  procedure Merge(L,T: PList);

//---------------------Освобождает выделенную под список память-----------------

  procedure DelList(var L: PList);

// --------------------Выводит  значения элементов  списка в строку-------------

  function ListToStr(L: PList): String;

// --------------------Создать узел списка-----------------------------------

  function  CreateE(key: T): PNode;

implementation

//------------------------------------------------------------------------------

function ListToStr(L: PList): String;

//Распечатывает поле key всех элементов списка,

//начиная с головы списка

var p: PNode;

begin

  if L <> nil

    then

      begin

        Result:= 'Size = ' + IntToStr(Size(L)) + '| Elements: ';

        p:= L^.first;

        while p <> nil do

          begin

            Result:= Result+ IntToStr(p^.key) + '; ';

            p:= p^.next

        end;

        if Size(L) = 0 then Result:= Result + 'no elements';

      end

    else

      Result:= 'List not exist';

end;

//------------------------------------------------------------------------------

function PredLast(L: PList; var Pred: PNode): PNode;

//Возвращает укзатель на предпоследний и последний элементы списка

begin

  Pred:= nil;

  if (L <> nil) then

     with L^ do

       case size of

         0: Result:= nil;

         1: begin Result:= first; Pred:= first end;

          else

            Result:= first;

            while Result^.next <> nil do

              begin

                pred:= Result;

                Result:= Result^.next

              end

       end

  else

    Result:= nil

end;

//------------------------------------------------------------------------------

function CreateE(key: T): PNode;

//Создаёт элемент списка

begin

  try

    new(Result);

    Result^.key:= key;

    Result^.next:= nil

  except

    on EOutOfMemory do begin

      Result:= nil;

      raise;

    end;

  end;

end;

//------------------------------------------------------------------------------

function CreateL: PList;

//Создаёт пустой список

begin

  try

    new(Result);

    Result^.first:= nil;

    Result^.last:= nil;

    Result^.size:= 0

  except

    on EOutOfMemory do begin

      Result:= nil;

      raise;

    end;

  end;

end;

//------------------------------------------------------------------------------

function Size(L: PList): integer;

//Возвращет число элементов списка L

begin

  if L <> nil

    then

      Result:= L^.size

    else//Список не существует

      Result:= -1

end;

//------------------------------------------------------------------------------

function IsEmpty(L: PList): Boolean;

//Определяет пуст ли список L

begin

  Result:= False;

  if L <> nil

    then

      if L^.first = nil

        then

          Result:= True;

end;

//------------------------------------------------------------------------------

procedure AddRight(L: PList; E: T);

//Добавляет элемент к списку справа

begin

  if (L <> nil)

    then

      with L^ do

        case size of

          0: begin

               first:= CreateE(E);

               last:= first;

               inc(size)

             end;

          else

            Last^.next:= CreateE(E);

            Last:= Last^.next;

            inc(size)

        end

end;

//------------------------------------------------------------------------------

procedure AddLeft(L: PList; E: T);

//Добавляет элемент к списку слева

var p: PNode;

begin