{ File: sol2-2.pas }

{definizione della procedura Esercizio2}

procedure Esercizio2 (var tab: tabella; nomef: string);
{ Legge gli elementi della lista da un file in cui i primi
  due interi indicano il numero di righe e di colonne della
  tabella. }

var
  filetesto                  : text;
  numrighe, numcolonne, i, j : integer;
  paux                       : tabella;

begin { Esercizio2 }
  assign(filetesto, nomef);
  reset(filetesto);
  read(filetesto, numrighe);
  read(filetesto, numcolonne);
  new(tab);
  paux := tab;
  for i:=1 to numrighe do
    for j:=1 to numcolonne do
    begin
      new(paux^.next);
      paux := paux^.next;
      read(filetesto, paux^.info);
      paux^.riga := i;
      paux^.colonna := j;
    end;
  paux^.next:=NIL;
  paux := tab;
  tab := tab^.next;
  dispose(paux);
  close(filetesto);
end;  { Esercizio2 }


{definizione della procedura Esercizio3}

procedure Esercizio3 (var lis, tab:tabella; e:integer);

var
  taux : tabella;

  procedure EliminaElemento(var t:tabella);
  { Elimina l'elemento puntato da t }
  var
    paux : tabella;

  begin { EliminaElemento }
    paux := t;
    t := t^.next;
    dispose(paux);
  end; { EliminaElemento }

  procedure InserisciElemento (var l : tabella; elem: elemento_tabella);
  { Inserisce l'elemento elem in testa alla lista l }
  var
    paux : tabella;

  begin { InserisciElemento }
    new(paux);
    paux^.info := elem.info;
    paux^.riga := elem.riga;
    paux^.colonna := elem.colonna;
    paux^.next := l;
    l := paux;
  end; { InserisciElemento }


begin { Esercizio3 }
  new(taux);
  taux^.next := tab;
  tab := taux;
  while taux^.next <> NIL do
  begin
    if (taux^.next^.riga+taux^.next^.colonna) = e then
    begin
      InserisciElemento(lis,taux^.next^);
      EliminaElemento(taux^.next);
    end;
    taux := taux^.next;
  end;
  taux := tab;
  tab := tab^.next;
  dispose(taux);
end; { Esercizio3 }