Extraits
[...] oui, renvoit le vol en question. [...]
[...] result : mini; } void chercher_trajet(Un_aeroport* depart, Un_aeroport* arrivee, char* hdepart){ P_un_element trajet = A_etoile(depart, arrivee); char* heure = hdepart; for (P_un_element iter = trajet; iter; iter = iter->suivant) { Un_vol* vol = chercher_vol(((Une_connexion*)iter->element)->route, heure); heure = vol->h_arrivee; printf("%s ((Une_connexion*)iter->element)->depart->nom, vol->h_depart, ((Une_connexion*)iter->element)->destination->nom, vol->h_arrivee); } } Ficher "connexions.h" : Un_aeroport* creer_aeroport(char* nom); P_un_element cherche_aeroport(P_un_element graphe, char* nom); Une_connexion* creer_connexion(Un_aeroport * depart, Un_aeroport * destination, Une_route * route); P_un_element construire_graphe(Une_route P_un_element/*< une_connexion >*/ reconstruire_chemin(Un_aeroport* depart, Un_aeroport* destination, P_un_element/*Une connexion*/ came_from); P_un_element A_etoile(Un_aeroport* depart, Un_aeroport* destination); Un_vol* chercher_vol(Une_route* route, char* heure); void chercher_trajet(Un_aeroport* depart, Un_aeroport* arrivee, char* hdepart); Fichier "entrees_sorties.c" : #include #include #include #include "liste_double.h" #include "structure_avion.h" #include "compagnie_aerienne.h" #include "entrees_sorties.h" #include "connexions.h" extern int nb_routes; //fonction modifiee pour tenir compte des listes chainees void afficher_plan_route(Une_route *route) { Un_vol *vol; printf("De : \t",route->nom_depart); printf("A : \t",route->nom_destination); printf("Cette ligne a vol(s) par jour, voici les horaires route->nb_vols); P_un_element pl = route->vols; while vol=pl->element; if(vol){ printf("vol num); printf("%s h_depart); printf("%s h_arrivee); } printf("\n"); pl=pl->suivant; } printf("\n"); } void afficher_plan_compagnie(Une_route { int for(i=0; i [...]
[...] //utile notamment pour la fonction rechercher_element_vols suivante. [...]
[...] Chercher un trajet\n"); printf(" 2. [...]
[...] ATTENTION : n'incremente pas route->nb_vols void ajouter_vol(Une_route *route, Un_vol P_un_element p_elem = creer_element(vol); route->vols = ajouter_a_liste(route->vols, p_elem); } void supprimer_vol(Une_route *route, Un_vol P_un_element pl = route->vols; if(comp_vols(pl->element,vol) route->vols=pl ->suivant; route->nb_vols--; return; } se place sur le predecesseur du vol while(comp_vols(pl->suivant->element,vol) pl=pl->suivant; } if (pl==NULL) return; P_un_element to_free = pl->suivant; pl->suivant = pl->suivant->suivant; free(to_free->element); route->nb_vols--; } void ajouter_route(Une_route Une_route *route){ bd[nb_routes] = route; nb_routes++; } //fonction modifiee pour prendre en compte les listes void supprimer_route(Une_route Une_route *route) { int if (bd!=NULL){ while(bd[i]){ if(strcmp(bd[i]->nom_depart,route->nom_depart)==0 &&strcmp(bd[i]->nom_destination,route->nom_destination)==0){ P_un_element pl=bd[i]->vols; while(pl){ pl = pl->suivant; } bd[i]=NULL; nb_routes--; break; } } if(i #include #include #include "liste_double.h" #include "structure_avion.h" #include "compagnie_aerienne.h" #include "entrees_sorties.h" #include "connexions.h" extern int nb_routes; Un_aeroport* creer_aeroport(char* nom){ Un_aeroport* aeroport= (Un_aeroport*)malloc(sizeof(Un_aeroport)); aeroport->nom = nom; aeroport->connexions = NULL; return aeroport; } P_un_element cherche_aeroport(P_un_element graphe, char* nom){ P_un_element listEl = graphe; while(listEl->suivant){ if (strcmp(((Un_aeroport*)listEl->element)->nom, nom) return listEl; } } return NULL; } Une_connexion* creer_connexion(Un_aeroport * depart, Un_aeroport * destination, Une_route * route){ Une_connexion* connexion = (Une_connexion*)malloc(sizeof(Une_connexion)); connexion->depart = depart; connexion->destination = destination; connexion->route = route; return connexion; } P_un_element/*Un_aeroport*/ construire_graphe(Une_route int nb_routes = sizeof(bd) / sizeof(Une_route*); int P_un_element graphe=NULL; for(i=0; i nom_destination); if(noeud_arrivee==NULL){ doit creer un nouveau noeud dans le graphe Un_aeroport* nouvel_aeroport = creer_aeroport(bd[i]->nom_destination); graphe = ajouter_a_liste(graphe, nouvel_aeroport); noeud_arrivee = cherche_aeroport(graphe, bd[i]->nom_destination); } traite l'aeroport de depart P_un_element noeud = cherche_aeroport(graphe, bd[i]->nom_depart); if(noeud==NULL){ doit creer un nouveau noeud dans le graphe Un_aeroport* nouvel_aeroport = creer_aeroport(bd[i]->nom_depart); graphe = ajouter_a_liste(graphe, nouvel_aeroport); noeud = cherche_aeroport(graphe, bd[i]->nom_depart); } doit ajouter la nouvelle connexion Une_connexion* nconnexion = creer_connexion(noeud->element, noeud_arrivee->element, ((Un_aeroport*)noeud->element)->connexions = ajouter_a_liste(((Un_aeroport*)noeud->element)->connexions, nconnexion); } return graphe; } P_un_element/*< une_connexion >*/ reconstruire_chemin(Un_aeroport* depart, Un_aeroport* destination, P_un_element/*Une connexion*/ came_from){ P_un_element result = NULL; while(strcmp(destination->nom, depart->nom)){ for(P_un_element iter = came_from; iter; iter = iter->suivant){ if(strcmp(((Une_connexion*)iter->element)->destination->nom, destination->nom)==0){ result=inserer_debut(result, iter->element); break; } } destination = ((Une_connexion*)result->element)->depart; } return result; } P_un_element A_etoile(Un_aeroport* depart, Un_aeroport* destination){ P_un_element closedset = NULL; P_un_element openset = creer_element(depart); P_un_element came_from = NULL; while(openset){ Un_aeroport* current = openset->element; if(strcmp(current->nom, destination->nom)==0){ return reconstruire_chemin(depart, destination, came_from); } openset = enlever_element(openset, openset); closedset = ajouter_a_liste(closedset, current); for(P_un_element iter = current->connexions; iter; iter=iter->suivant){ if(cherche_aeroport(closedset, ((Une_connexion*)iter->element)->destination->nom)){ continue; } if(!cherche_aeroport(openset, ((Une_connexion*)iter->element)->destination->nom)){ openset = ajouter_a_liste(openset, ((Une_connexion*)iter->element)->destination); came_from = ajouter_a_liste(came_from, iter); } } } return NULL; } Un_vol* chercher_vol(Une_route* route, char* heure){ Un_vol* result = NULL; Un_vol* mini = NULL; for (P_un_element iter = route->vols; iter; iter = iter->suivant){ if (strcmp(heure,((Un_vol*)iter->element)->h_depart) { if (!result strcmp(((Un_vol*)iter->element)->h_depart, result->h_depart) result = iter->element; } if (!mini strcmp(((Un_vol*)iter->element)->h_depart, mini->h_depart) mini = iter->element; } return result ? [...]