Salve devo implentare una funzione che mi stampi tutti i nomi dei nodi che costituiscono il cammino minimo(se esiste)
tra 2 nodi passati come argomento alla funzione. Credo di dover usare una visita in ampiezza ma vista la struttura dati che utilizzo mi trovo un pò in difficoltà.
I nodi del grafo sono stringhe e la lista ombra rappresenta la lista di adiacenza dei nodi con distanza 1 da ogni nodo.codice:/*struct liste di adiacenza*/ struct ombra { char name[40]; struct ombra *next; }; /*struct dei luoghi*/ struct luoghi { char nome[40]; struct ombra *shadow; struct luoghi *next; };
Utilizzo delle classiche funzioni di inserimento per inserire i nodi, nelle due liste, luoghi e ombra.
Il problema mi nasce con questa funzione che deve appunto stampare un cammino di lunghezza minima tra u e v. Se non
esiste un tale itinerario, allora restituisce un messaggio d'errore.
In cui ho controllato che v appartenga alla lista di adiacenza di u.codice:void cammino Ombra(char *u, char *v) { struct luoghi *t1, *t2; struct ombra *tmp; t1=luogo; t2=luogo; /* Verifico l'esistenza della localita' di nome u. */ while ((t1 != NULL) && (strcmp(t1->nome, u) != 0)) { t1=t1->next; } if (t1 == NULL){ printf("Non e' possibile!\n"); return; } /* Verifico l'esistenza della localita' di nome v. */ while ((t2 != NULL) && (strcmp(t2->nome, v) != 0)) { t2=t2->next; } if (t2 == NULL){ printf("Non e' possibile!\n"); return; } tmp = t1->shadow; while ((tmp != NULL) && (strcmp(tmp->name, v) != 0)) { tmp=tmp->next; } if (tmp != NULL) { printf("%s\n", t1->nome); printf("%s\n", tmp->name); } else { }
Il problema ora è come fare in modo di cercare v nei nodi direttamente collegati a quelli nella lista di adiacenza di u,
e cosi' via. In modo che appena trova v si ferma e possa poi stampare il cammino.
Qualcuno potrebbe aiutarmi, anke spiegandomi che tipo di ciclo debba utilizzare.
Grazie

Rispondi quotando