unit Un_list;

interface
uses Un_abonent;
type TInfo=TAbonent;
     TList=^tmode;
     tmode=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 Create(file_name:string;var L:TList);
    procedure Print(L:tList);
    procedure Clear(var L:tList);
    function Search(var L:TList;s,q:string):boolean;

implementation

procedure init;
begin
  new(L);
  L^.next:=nil;
end;

function Empty;
begin
  result:=L^.next=nil;
end;

procedure Add_order;
var
  p,q:Tlist;
begin
 // поиск места для вставки
  p:=L;
  while (p^.next<>nil)and Less_and_equiv(p^.next^.info,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 delete;
var
   p:TList;
begin
  p:=L^.next;
  L^.next:=p^.next;
  dispose(p)
end;

procedure Create;
var
    t:textfile;
    new_elem:TInfo;
begin
// подготовка файла
  AssignFile(t,file_name);
  reset(t);
  //подготовка списка
  init(L);
  while not eof(t) do
   begin //считывание очередного элемента в список
     Read_rec(t,new_elem);
     add_order(L,new_elem)
   end;
  CloseFile(t)
end;

procedure Print;
 var
    p:TList;
begin
   writeln('List:',#10);
   p:=L^.next;
   while p<>nil do
    begin
      print_rec(p^.info);
      p:=p^.next
    end
end;

function Search;
var k:integer;
     p:TList;
     h:boolean;
 begin
    p:=L^.next;
    result:=false;
    if stop(p^.info,s) then
    h:=false;
    while (p<>nil) and not h do
     begin
       if (Compare(p^.info,s)) and (compare1(p^.info,q)) then
                              begin
                                Print_Rec(p^.info);
                                result:=true
                              end;
       h:=Stop(p^.info,s);
       p:=p^.next
     end;
 end;

procedure Clear;
begin
// удаление элементов списка
  while not Empty(L) do
   delete(L);
//удаление заглавного звена
  dispose(L)
end;
end.

