{ File: grafdrv.pas }

{ Scopo: driver per verificare il funzionamento delle operazioni su grafi
         non etichettati }

program DriverGrafi;

const
  NumNodi = 10;

type
  TipoNomeFile = string[128];

{ File da Includere per Grafi normali
	GRAFMAT.PAS : matrici di adiacenza oppure
	GRAFSUC.PAS : vettore delle liste dei successori
	GRAFIO.PAS  : operazioni di stampa, lettura e scrittura su file
        GRAFVIS.PAS : procedure di visita di un grafo }

{$I GRAFSUC.PAS}
{$I GRAFIO.PAS}
{$I GRAFVIS.PAS}

var
  nome_file : TipoNomeFile;
  grafo     : TipoGrafo;
  i, j      : TipoNodo;
  scelta    : char;
  lista     : TipoListaSucc;
            
begin { DriverGrafi }
  { inizializza il grafo }
  InitGrafo(grafo);

  repeat
    writeln('Opzioni:');
    writeln('Re-Inizializza Grafo    : 0');
    writeln('Test esistenza arco     : 1');
    writeln('Inserisci arco          : 2');
    writeln('Elimina arco            : 3');
    writeln('---------------------------');
    writeln('Visita Ric. in prof.    : 4');
    writeln('Visita in profondita    : 5');
    writeln('Visita in ampiezza      : 6');
    writeln('---------------------------');
    writeln('Stampa grafo su schermo : 7');
    writeln('Leggi grafo da file     : 8');
    writeln('Scrivi grafo su file    : 9');
    writeln('---------------------------');
    writeln('FINE                    : F');
    write('Scelta: ');
    readln(scelta);

    case scelta of
      '0' : DistruggeGrafo(grafo);
      '1' : begin
              write('Esistenza. Scrivere Arco i j da testare: ');
              readln(i,j);
              if TestEsisteArco(grafo,i,j) then
                writeln('Arco (',i,',',j,') esiste')
              else
                writeln('Arco (',i,',',j,') NON esiste')
            end;
      '2' : begin
              write('Inserimento. Scrivere Arco i j da inserire: ');
              readln(i,j);
              InserArco(grafo,i,j)
            end;
      '3' : begin
              write('Test Eliminazione. Scrivere Arco i j da eliminare: ');
              readln(i,j);
              ElimArco(grafo,i,j)
            end;
      '4' : begin
              write('Visita ricorsiva in prof. Scrivere Nodo i di partenza: ');
              readln(i);
              VisitaRicInProfondita(grafo,i)
            end;
      '5' : begin
              write('Visita in profondita. Scrivere Nodo i di partenza: ');
	      readln(i);
              VisitaInProfondita(grafo,i);
            end;
      '6' : begin
              write('Visita in ampiezza. Scrivere Nodo i di partenza: ');
              readln(i);
              VisitaInAmpiezza(grafo,i);
            end;
      '7' : begin
            { StampaGrafo(grafo); }
              writeln;
              for i:=1 to NumNodi do
              begin
                write(i:2,':');
                lista := grafo.vett_lista_succ[i];
                while lista <> NIL do
                begin
                  write('->', lista^.successore:2, ' ');
                  lista := lista^.next
                end;
                writeln
              end
            end;
      '8' : begin
              write('Scrivi il nome del file di ingresso: ');
              readln(nome_file);
              LeggeGrafoDaFile(grafo,nome_file)
            end;
      '9' : begin
              write('Scrivi il nome del file di uscita: ');
              readln(nome_file);
              ScriveGrafoSuFile(grafo,nome_file)
            end;
    end;
    readln;
  until (scelta = 'F') or (scelta = 'f')
end. { DriverGrafi }