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

  if (L <> nil)

    then

      with L^ do

       case size of

         0: begin

              first:= CreateE(E);

              last:= first;

              inc(size)

            end;

         else

           p:= CreateE(E);

           p^.next:= First;

           First:= p;

           inc(size)

       end

end;

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

function Tail(var L: PList): PList;

//Создает список, полученный выделением элементов хвоста списка L

//и возвращает указатель на него. В L остается голова исходного списка

begin

  Result:= CreateL;

  if Size(L) > 1

    then

      with Result^ do

      begin

        first:= L^.first^.next;

        last:= L^.last;

        size:= L^.size - 1;

        L^.last:= L^.first;

        L^.size:= 1;

        L^.first^.next:= nil;

      end;

end;

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

function Tail_(var L: PList): PList;

//Создает список, полученный выделением элементов хвоста списка L (справа)

//и возвращает указатель на него. В L остается голова исходного списка

var

  p: PNode;

begin

  Result:= CreateL;

  if Size(L) > 1

    then

      with Result^ do

      begin

        Result^:= L^;

        last:= PredLast(L,p);

        last:= p;

        Last^.next:= nil;

        size:= L^.size - 1;

        L^.first:= L^.last;

        L^.size:= 1;

      end;

end;

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

function Head(L: PList): T;

//Выделяет из списка L элемент списка, который является его головой,

//и возвращает указатель на него

var p: PNode;

begin

  if L = nil

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

      exit;

    with L^ do begin

      if size = 0

        then // Список пуст

          begin raise EListEmpty.Create('Список пуст'); exit end;

      Result:= first^.key;

      p:= first;

      first:= first^.next;

      dispose(p);

      dec(size);

      if size = 0

        then

          begin last:= nil; first:= nil end

    end

end;

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

function Head_(L: PList): T;

//Выделяет из списка L элемент списка, который является его головой (справа),

//и возвращает указатель на него

var

  p: PNode;

begin

  if L = nil then //Список не существует

    exit;

  if Size(L) > 0

    then //Список не пуст

      with L^ do

      begin

        Result:= last^.key;

        last:= PredLast(L,p);

        dispose(last);

        last:= p;

        last^.next:= nil;

        size:= size - 1;

        if size = 0

          then

            begin last:= nil; first:= nil end

      end

    else

      raise EListEmpty.Create('Список пуст');

end;

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

procedure EmptyList(L: PList);

//Опустошает список

begin

  if L <> nil then

    while L^.size <> 0 do Head(L)

end;

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

procedure Merge(L,T: PList);

//Объединяет два списка

begin

  if (T = nil) and (L = nil)

    then exit;

  if (IsEmpty(L) and IsEmpty(T)) or  IsEmpty(T) then exit;

  if IsEmpty(L) and not IsEmpty(T) then

    begin

      L^.first:= T^.first;

      L^.size := T^.size;

      L^.last := T^.last;

      T^.size:= 0;

      T^.first:= nil;

      T^.Last:= nil;

      exit;

    end;

  with L^ do

    begin

      Last^.next:= T^.First;

      Last:= T^.Last;

      size:= T^.size + size

    end;

  T^.size:= 0;

  T^.first:= nil;

  T^.Last:= nil;

end;

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

procedure DelList(var L: PList);

//Удаляет список из памяти

begin

  if L <> nil then begin

     EmptyList(L);

     Dispose(L);