Miles--Teg | Voilà, je pense avoir fini !!
J'ai compiler (sans erreurs), mais pas testé !
Voilà le code de ma fonction :
Code :
- void LireGRAPHE ( char * fic_name , GRAPHE *graphe ) {
- FILE * fichier;
- char ligne[1024];
- char tampon[256];
- char noeud1[256];
- char noeud2[256];
- int test_commentaire;
- int test_noeuds;
- int valeur_recuperee, i;
- int poids_arete;
- int dic_num_n1; /* Le N° retourné par le Dico pour le noeud 1 */
- int dic_num_n2; /* Le N° retourné par le Dico pour le noeud 2 */
-
-
- fichier = fopen( fic_name , "r" );
- if (fichier==NULL) {
- printf("\nProblème lors de l'acces en lecture du fichier !!\nVous n'avez pas les permissions requises, ou le fichier n'existe pas !!\n" );
- exit (1);
- }
- while( fgets(ligne,1024*sizeof(char),fichier) != NULL) {
- /* histoire de pas lire 2 fois le meme caractere ;) */
-
- if (ligne[0] != '#') {
- /* Ce n'est pas une ligne de commentaire !! */
- /* On va traiter la ligne lue */
- sscanf( ligne , "%s " , tampon );
- if ( strcmp(tampon,"nb_noeud" ) == 0) {
- /* traitenement si nb_noeud */
- sscanf( ligne+strlen(tampon)+1 , "%d" , &(graphe->nb_noeuds) );
- graphe->tla = (TLA) malloc ( (graphe->nb_noeuds+1) * sizeof ( Liste ));
- if ( graphe->tla == NULL ) {
- fprintf(stderr,"\nProblème lors de l'allocation mémoire du Tla du Graphe !!!\n" );
- exit (1);
- }
- for ( i=1 ; i<=graphe->nb_noeuds ; i++ ) {
- /* On initialise le tla du graphe */
- graphe->tla[i] = CreerVide();
- }
- }
- else {
- if ( strcmp(ligne,"nb_arete" ) == 0) {
- /* traitenement si nb_arete */
- sscanf( ligne+strlen(tampon)+1 , "%d" , &(graphe->nb_aretes) );
-
- /* Mettons à jours la variable taille du dico */
- graphe->g_dico.taille = graphe->nb_noeuds;
-
- /* On va maintenant lancé la création du Dico */
- Construire_Dico ( fichier , &(graphe->g_dico) );
-
- }
- else {
- /* traitenement sinon */
- /* cad que l'on doit lire 2 chaines de caract l'une */
- /* à la suite de l'autre, et apres un entier */
- sscanf( ligne , "%s %s %d" , noeud1 , noeud2 , &poids_arete );
-
- /* Il faut récuperer la correspondance des Mots - N° depuis le DICO :: */
- dic_num_n1 = Recup_Num( noeud1 , &(graphe->g_dico) );
- if ( dic_num_n1 == -1 ) {
- printf("\nLe nom du noeud n°1 ne figure pas dans le Dictionnaire !!\n Le programme va s'arreter !!\n" );
- exit (1);
- }
- dic_num_n2 = Recup_Num( noeud2 , &(graphe->g_dico) );
- if ( dic_num_n2 == -1 ) {
- printf("\nLe nom du noeud n°1 ne figure pas dans le Dictionnaire !!\n Le programme va s'arreter !!\n" );
- exit (1);
- }
- /* On met l'arete dans le graphe */
- graphe->tla[dic_num_n1] = Ajoute_GRAPHE ( graphe->tla[dic_num_n1] , dic_num_n2 , poids_arete );
-
- }
- }
- }
- /* sinon c'est une ligne de commentaire !! */
- /* et repart au début, lire une autre ligne */
- }
- /* On a atteint la fin du fichier ! */
- fclose ( fichier );
- }
|
UNe explication des diverses fonctions non explicitées que j'appelle :
- Construire_Dico : va me contruire un dictionnaire avec mes nom de noeuds associés à un N°
- Ajoute_GRAPHE : va ajouter une arete au graphe tq A = ( S1 , S2, Pds )
voilà les différentes structures utilisées :
Code :
- struct dico {
- char ** tab; /* Un tableau de ptr sur des char * */
- int taille; /* taille du tableau */
- int nb_mots; /* nombre de mots dans le dico */
- };
- typedef struct dico DICO;
- struct elementliste {
- int valeur; /* Evident !! */
- int poids; /* Poids sur l'arète */
- struct elementliste *suivant; /* Pointeur sur un elementliste */
- /* désignant l'elt suivant */
- };
- typedef struct elementliste ElementListe, *Liste;
- typedef Liste *TLA;
- /* La structure pour le Graphe */
- struct s_graphe {
- TLA tla; /* le tla */
- int nb_noeuds; /* le nb de noeuds du graphe */
- /* aussi appelés sommets */
- int nb_aretes; /* le nb d'aretes du graphe */
- DICO g_dico; /* le dico necessaire au graphe */
- };
- typedef struct s_graphe GRAPHE;
- struct elementtas {
- int poids_noeud;
- ElementListe * elt_tas;
- };
- typedef struct elementtas ElementTAS;
- struct s_tas {
- ElementTAS** tab; /* Un tableau de pointeurs sur des ElementListe */
- int nb_elt; /* nb d'elt à prendre en compte dans le tas */
- int taille; /* nb total d'elt du tas (le max) */
- };
- typedef struct s_tas TAS;
|
Bon c'est peut-être pas dans le bon ordre pour que ca fonctionne, mais du pts de vue de mes includes, c'est OK ! J'ai juste mis en vrac !!
Voilà, merci de votre aide,
AU fait, est-ce correct ?
[edit]
au fait, voilà le code de la fonction qui me cree le dico :
Code :
- void Construire_Dico ( FILE * fichier , DICO * Le_Dico ) {
- char tampon[256];
- int fini=0;
- int test_fin;
- int i; /* servira d'indexeur pour l'elt à ajouter dans le tableau du dico */
- Le_Dico->nb_mots = 0;
- /* ON alloue l'espace mémoire necessaire au dico */
- Le_Dico->tab = (char **) malloc ((Le_Dico->taille+1) * sizeof (char *));
- if ( Le_Dico->tab == NULL ) {
- fprintf (stderr,"Erreur lors de l'allocation mémoire pour le tableau du dico !! " );
- exit (1);
- }
- i = 1; /* on commence l'indexation à 1 */
-
- /* on arrete de lire les aretes qd on atteindra la ligne "###l.ligne.01.txt.arete" */
- /* Qd on atteindra cette ligne, fini passera à 1 !! */
- while ( fini==0 ) {
- test_fin = strncmp ( tampon , "###" , 3 );
- if ( test_fin == 0 ) { /* C'est la fin de la lecture du dico */
- fini = 1;
- }
- else {
- fscanf ( fichier , "%s" , &tampon );
- Le_Dico->tab[i] = (char *) strdup (tampon);
- i++; /* pour passer à l'elt suivant */
- Le_Dico->nb_mots++;
- }
-
- }
- }
|
Est-ce que avec la méthode de lecture du fichier faite dans LireGRAPHE, celle de Construire_DICO va marcher ?
[/edit]
@+
Miles Message édité par Miles--Teg le 27-04-2003 à 14:00:05
|