Unit DList;
Interface
{
uses maintype;
}
Type
     Telem = integer;

     TList = ^TElement;
     TElement = Record
      Data : Telem;
      Next, Prev : TList;
     End;


{процедура инициализирует список и добавляетпервый элемент}
Procedure InitListAndAddFirst(X : Telem; var L:Tlist );
{добавление в НЕПУСТОЙ список -ПОСЛЕ элемента на который указывает L}
Procedure AddAfter(X : Telem; Var L : TList); 
{переход кконцу списка}
Procedure GotoLast(var l:tlist);
{к началу}
Procedure GotoFirst(var l:tlist);
{печать}
Procedure ListPrint(l:Tlist);
{уничтожение}
Procedure ListDestroy(var l:tlist);

IMPLEMENTATION
Procedure InitListAndAddFirst(X : Telem; var L:Tlist );
begin
 L:=Nil;
 L:=New(TList);
 L^.Next:=Nil;
 L^.Prev:=Nil;
 L^.Data:=X; {создаем первый элемент}
end;

Procedure AddAfter(X : Telem; Var L : TList); {добавление в НЕПУСТОЙ список}
Var P : TList;
Begin
 if l<>nil then
 begin
  P:=New(TList); {создаем элемент}
  P^.Data:=X;
  If (L^.Next = Nil) Then {надо добавить элемент в конец списка}
   Begin
    L^.Next:=P;
    P^.Prev:=L;
    P^.Next:=Nil;
   End Else
   Begin {надо вставить элемент между двумя}
    P^.Next:=L^.Next;
    L^.Next^.Prev:=P;
    P^.Prev:=L;
    L^.Next:=P;
   End;
  end else writeln('Error!');
End;
Procedure GotoLast(var l:tlist);
begin
 While L^.next <> Nil Do L:=L^.Next
end;

Procedure GotoFirst(var l:tlist);
begin
 While L^.Prev<>NIL Do L:=L^.Prev
end;

Procedure ListPrint(l:Tlist);
begin
 While L^.prev <> Nil Do L:=L^.prev;
 While L <> Nil Do
 begin
  write(L^.data, ' ');
  L:=L^.next
 end
end;


Procedure ListDestroy(var l:tlist);
var
 p:Tlist;
begin
 While L^.Next <> Nil Do L:=L^.Next;
 While L <> Nil Do
  Begin
   P:=L;
   L:=L^.Prev;
   Dispose(P);
  End;
end;
end.