unit Un_list;

interface
  uses
  Un_Abonent;
  type TInfo=TAbonent;
       TList=^TNode;
       TNode=record
              info:TInfo;
              next:TList
             end;
                procedure Init (var L:TList);
                function Empty (L:TList):boolean;
                procedure Add_Order (var L:TList; new_elem:TInfo);
                procedure Delete(var L:TList); // удаление элемента из головы списка
                function Del(var L:TList;N:TInfo):boolean;
                function CreateL (file_name:string;var L:TList):string;
                procedure PrintL (L:TList);
                procedure ClearL (var L:TList);
                function add_Abonent(l:Tlist;s:TInfo):Boolean;
implementation


  procedure Init (var L:TList);
  begin
    new(L);
    L^.next:=nil
  end;

  function Empty (L:TList):boolean;
  begin
    result:=L^.next=nil
  end;

  procedure Add_Order(var L:TList; new_elem:TInfo);
  var p,q:TList;
  begin
   // поиск места для вставки
    p:=L;
    while (p^.next<>nil) and (p^.next^.info.compare(new_elem)<0) do  //(p^.next^.info.inf1<=new_elem.inf1)
    p:=p^.next;
   // вставка нового элемента
    new(q);
    q^.info:=new_elem;
    q^.next:=p^.next;
    p^.next:=q
  end;

  function Add_abonent;
  var p:TList;
  begin
    p:=L;
    while (p^.next<>nil)and (p^.next^.info.Compare(s)<0) do
    p:=p^.next;
    if (p^.next<>nil)and (p^.next^.info.Compare(s)=0) then
                                                       begin
                                                         result:=True;
                                                         s.Destroy
                                                        end
                                                     else  result:=False
  end;

  function Del(var L:TList;N:TInfo):boolean;
  var p, q : TList;
  begin
     P := L;
     while (p^.next <> nil) and  (P^.next^.info.compare(N)<0) do
     p := p^.next;
     if (p^.next <> nil) and (p^.next^.info.Compare(n)=0)  then
                       begin
                        result:=True;
                        q := p^.next;
                        p^.next := q^.next;
                        q^.info.Destroy;
                        Dispose(q)
                       end
                       else result:=False;
  end;

  procedure Delete (var L:TList);
  var p:TList;
  begin
    p:=L^.next;
    L^.next:=p^.next;
    p^.info.Destroy;
    dispose(p)
  end;

  function CreateL (file_name:string; var L:TList):string;
  var t:TextFile;
      new_elem:TInfo;
  begin
   // подготовка файла
    AssignFile(t,file_name);
    Reset(t);
   // подготовка списка
    readln(t,result);
    Init(L);
   while not eof(t) do
    begin
      // считываем очередной элемент из файла
      new_elem:=TAbonent.Create(t);
      // добавляем считанный элемент в списк
      Add_Order(L,new_elem)
    end;
   CloseFile(t)
  end;


  procedure PrintL (L:TList);
  var p:TList;
  begin
    p:=L^.next;
    while p<>nil do
     begin
       p^.info.Print;
       p:=p^.next
     end
  end;

  procedure ClearL (var L:TList);
  begin
    // удаление элементов списка
    while not Empty(L) do
     Delete(L);
    // удаление заглавного звена
    Dispose(L)
  end;

end.
