{ File: grafsuc.pas }

{ Scopo: rappresentazione di grafi non etichettati tramite liste di successori }

{ Le dichiarazioni di tipo per i grafi richiedono la definizione preliminare di

const
  NumNodi = ... ;
}

type
  TipoNodo = 1..NumNodi;

  TipoElemLista = TipoNodo; { gli elementi delle liste di successori sono nodi }

{$I TIPOLIS.PAS} { inclusione del file  contenente la definizione del tipo
                   TipoLista }

type
  TipoListaSucc = TipoLista;
  TipoGrafo     = record
                    vett_succ : array [TipoNodo] of TipoListaSucc
                  end;        

{ Funzioni preliminari per utilizzare le procedure
  di inserimento ed eliminazione in una lista }

function UgualeElemento (elem1, elem2: TipoElemLista): boolean;
begin
  UgualeElemento := (elem1 = elem2)
end; { UgualeElemento }


function MinoreElemento (elem1, elem2: TipoElemLista): boolean;
begin
  MinoreElemento := (elem1 < elem2)
end; { MinoreElemento }


{$I LISTECON.PAS}   { inclusione del file contenente l'implementazione delle
                      operazioni sulle liste che effettuano il confronto di
                      uguaglianza tra elementi }

{$I LISTEORD.PAS}   { inclusione del file contenente l'implementazione delle
                      operazioni sulle liste che effettuano il confronto di
                      ordinamento tra elementi }


procedure InitGrafo (var grafo: TipoGrafo);
{ Inizializza un grafo. }
var
  i : TipoNodo;
begin
  for i := 1 to NumNodi do
    grafo.vett_succ[i] := NIL
end; { InitGrafo }


function TestEsisteArco (var grafo: TipoGrafo; i,j: TipoNodo): boolean;
{ Verifica l'esistenza di un arco in un grafo. }
begin
  TestEsisteArco := EsisteInLista(grafo.vett_succ[i], j)
end; { TestEsisteArco }


procedure InserArco (var grafo: TipoGrafo; i,j: TipoNodo);
{ Inserisce un arco in un grafo. }
begin
  if not TestEsisteArco(grafo, i, j) then
    InserisciInListaOrdinata(grafo.vett_succ[i], j)
end; { InserArco }


procedure ElimArco (var grafo: TipoGrafo; i,j: TipoNodo);
{ Elimina un arco da un grafo. }
begin
 if TestEsisteArco(grafo, i, j) then
   CancellaElementoLista(grafo.vett_succ[i], j)
end; { ElimArco }