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); // удаление элемента из головы списка
                procedure Del_Order(var L:TList;m:string);
                function CreateL (file_name:string; var L:TList):string;
                procedure PrintL (L:TList);
                procedure ClearL (var L:TList);
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.Less_and_Equiv(new_elem)= '<') 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;

  procedure Del_Order(var L:TList;m:string);
  var p, q : TList;
  begin
     P := L;
     while (p^.next <> nil) and (not P^.next^.info.compare(m)) do
     p := p^.next;
     if p^.next <> nil then
     begin
        q := p^.next;
        p^.next := q^.next;
        q^.info.Destroy;
        Dispose(P);
     end;
  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.
