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.