{ 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 }