CARS
|
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include "dgraph.h"
#include "macros.h"
#include "stringparser.h"
Functions | |
graph_t * | new_graph (unsigned int n, char **lbl) |
void | free_graph (graph_t **g) |
void | print_graph (graph_t *g) |
graph_t * | copy_graph (graph_t *g) |
int | add_edge (graph_t *g, char *e) |
int | is_node (graph_t *g, char *ss) |
bool_t | is_edge (graph_t *g, unsigned int n1, unsigned int n2) |
int | degree (graph_t *g, char *lbl) |
int | n_size (graph_t *g) |
int | e_size (graph_t *g) |
graph_t * | load_graph (FILE *fdnodes, FILE *fdarcs) |
int | save_graph (FILE *fdnodes, FILE *fdarcs, graph_t *g) |
Si dichiara che il contenuto di questo file e' in ogni sua parte opera originale dell' autore.
int add_edge | ( | graph_t * | g, |
char * | e | ||
) |
aggiunge un arco al grafo (senza ripetizioni, ogni arco deve connettere una diversa coppia sorgente-destinazione)
g | puntatore al grafo |
e | arco, stringa di formato LBLSORGENTE:LBLDESTINAZIONE:DISTANZA_IN_KM Esempio: FIRENZE:PRATO:20.4 |
Attenzione: le citta possono contenere solo caratteri alfanumerici e lo spazio ' ', la distanza e' un numero reale,
0 | se l'inserzione e' avvenuta con successo |
-1 | se si e' verificato un errore (setta errno), in questo caso il grafo originario non deve essere modificato errno == ENOMEM se l'allocazione e' fallita errno == EINVAL se l'arco e' inconsistente (esempio, il nodo sorgente/destinazione non esiste) |
References node::adj, FALSE, is_edge(), is_node(), LLABEL, MALLOC_ERRNO, graph::node, str_pars(), and TRUE.
Referenced by load_graph(), and main().
crea una copia completa del grafo (allocando tutta la memoria necessaria)
g | puntatore al grafo da copiare |
p | puntatore al nuovo grafo (se tutto e' andato bene) |
NULL | se si verificato un errore -- setta errno errno == ENOMEM se l'allocazione e' fallita errno == EINVAL se i parametri sono inconsistenti (esempio, g NULL) |
References node::adj, free_graph(), edge::km, edge::label, node::label, MALLOC_ERRNO, n_size(), edge::next, and graph::node.
Referenced by main().
int degree | ( | graph_t * | g, |
char * | lbl | ||
) |
grado di un nodo
g | puntatore al grafo |
lbl | la label del nodo |
n | il numero di archi uscenti dal nodo |
-1 | se si e' verificato un errore (setta errno ) |
References node::adj, is_node(), and graph::node.
int e_size | ( | graph_t * | g | ) |
void free_graph | ( | graph_t ** | g | ) |
distrugge un grafo deallocando tutta la sua memoria
g | puntatore al puntatore al grafo da deallocare -- viene messo a NULL dalla funzione dopo la deallocazione |
References node::adj, and n_size().
Referenced by copy_graph(), load_graph(), main(), and new_graph().
verifica l'esistenza di un arco
g | puntatore al grafo |
n1 | etichetta nodo primo estremo |
n2 | etichetta nodo secondo estremo |
TRUE | se l'arco esiste |
FALSE | altrimenti |
References node::adj, FALSE, edge::label, n_size(), edge::next, graph::node, and TRUE.
Referenced by add_edge(), and main().
int is_node | ( | graph_t * | g, |
char * | ss | ||
) |
verifica l'esistenza di un nodo
g | puntatore al grafo |
ss | label del nodo |
n | l'indice nel grafo (0..(n_size -1)) se il nodo esiste |
-1 | altrimenti |
References node::label, n_size(), and graph::node.
Referenced by add_edge(), appendReqOff(), checkValidMessage(), degree(), and main().
graph_t* load_graph | ( | FILE * | fdnodes, |
FILE * | fdarcs | ||
) |
carica il grafo da 2 file, il primo contiene le label possibili de nodi, ad esempio: PISA FIRENZE EMPOLI separate da '
', il secondo contenente gli archi secondo il formato LBLSORGENTE:LBLDESTINAZIONE:DISTANZA_IN_KM Esempio: FIRENZE:PRATO:20.4 sempre separati da '
'
Attenzione: le citta possono contenere solo caratteri alfanumerici e lo spazio ' ', la distanza e' un numero reale, ci possono essere linee vuote (cioe' che contengono solo '
')
fdnodes | file descriptor del file contenente le label dei nodi |
fdarcs | file descriptor del file contenente gli archi |
g | puntatore al nuovo grafo se il caricamento e' avvenuto con successo |
NULL | se si e' verificato un errore (setta errno), es errno == ENOMEM se l'allocazione e' fallita errno == EINVAL se i parametri sono inconsistenti (esempio, fd non valido) |
References add_edge(), free_graph(), LKM, LLABEL, MALLOC_ERRNO, and new_graph().
Referenced by main().
int n_size | ( | graph_t * | g | ) |
numero di nodi di un grafo
g | puntatore al grafo |
n | il numero di nodi di g |
-1 | se si e' verificato un errore (setta errno) |
References graph::size.
Referenced by copy_graph(), dijkstra(), e_size(), free_graph(), is_edge(), is_node(), main(), print_graph(), save_graph(), and shpath_to_string().
graph_t* new_graph | ( | unsigned int | n, |
char ** | lbl | ||
) |
crea un grafo
n | numero dei nodi del grafo |
lbl | array di etichette de nodi formato: static const char* citta[] = { "PISA", "LUCCA", "SIENA", "LIVORNO", NULL, }; |
Attenzione: le citta possono contenere solo caratteri alfanumerici e lo spazio ' '
p | puntatore al nuovo grafo (se tutto e' andato bene) |
NULL | se si e' verificato un errore (setta errno) (errno == EINTR se i parametri non sono validi es lbl a NULL) (errno == ENOMEM se l'allocazione e' fallita) |
References node::adj, FALSE, free_graph(), is_correct_labelarray(), node::label, and MALLOC_ERRNO.
Referenced by load_graph(), and main().
void print_graph | ( | graph_t * | g | ) |
stampa il grafo su stdout (formato arbitrario a caratteri)
g | puntatore al grafo da stampare |
References node::adj, edge::km, node::label, edge::label, and n_size().
Referenced by main().
int save_graph | ( | FILE * | fdnodes, |
FILE * | fdarcs, | ||
graph_t * | g | ||
) |
salva il grafo su due file, formato
fdnodes | file descriptor del file che dovra' contenere i nodi del grafo |
fdarcs | file descriptor del file che dovra' contenere gli archi del grafo |
g | grafo da scrivere |
0 | se la scrittura e' andata a buon fine |
-1 | se si e' verificato un errore (setta errno), es. errno == EIO se la scrittura e' fallita |
References node::adj, edge::km, edge::label, node::label, n_size(), and graph::node.
Referenced by main().