Voila ce bout de code qui extrait les données d'un graphe dans un fichier et stoke cela dans un tableau dynamique contenant de sommets ou chaque case contient le nom du sommet et un champ liste chainnée des successeurs du sommet.
Ce code compile et lors de la verification affiche les noms de sommet mais pasla liste correspondante.
Que quequ'un m'aide a identifier le bug.
Voila le code et le fichier test.txt :
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<fcntl.h>
#include<sys/stat.h>
typedef struct sommet{ //Structure d'un sommet
char *nom;
struct arc *succ;
}Sommet;
typedef Sommet *Noeud;
typedef struct arc{ //Structure d'un arc
char *srce;
struct arc *dest;
int distance;
int temps;
}Arc;
typedef struct graphe{ //Structure du graphe
int taille;
Sommet *ptr;
}Graphe;
int i,j,taille;
char *temp; char ligne[120];
Arc *cell; Sommet *ptr; Sommet liste;
/*Cette fonction extrait les données du graphe à parti de la chaine de caractère
en paramètre creer un sommet et le stoke dans un indice du tableau*/
void Make_tab(char ligne[120]){
liste.nom = (char *)malloc(sizeof(char)*(strlen(strtok_r(ligne,":",&temp)+1)));
*liste.nom = *strtok_r(ligne,":",&temp); //nom du sommet
liste.nom[strlen(liste.nom)+1] = '\0';
liste.succ = NULL;
char * predecesseur = strtok_r(NULL,":",&temp); //nom du predecesseur
char *temp1 = strtok_r(NULL,",",&temp);
while(temp1){ //creation de la liste chainée des successeurs du sommet
cell = (Arc *)malloc(sizeof(Arc));
cell->srce = &temp1[strlen(cell->srce)];
cell->srce[strlen(cell->srce)+1] = '\0';
cell->distance = atoi(strtok_r(NULL,",",&temp));
cell->temps = atoi(strtok_r(NULL,",",&temp));
cell->dest = liste.succ;
liste.succ = cell;
temp1 = strtok_r(NULL,",",&temp);
}
ptr[i] = liste; //stokage su sommet dans l'indice i du tableau
}
/*Cette fonction lit les lignes du fichier et le transmet a Make_tab pour un chargement global du graphe*/
void Load(){
FILE *fichier = fopen("test.txt","r");
fgets(ligne,sizeof(char)*120,fichier);
taille = atoi(ligne);
ptr = (Sommet *)malloc(sizeof(Sommet)*taille); //creation du tableau dynamique
printf("Taille du tableau %d\n",taille);
for (i=0;i<taille;i++){ //transmission de la ligne a Make_tab
fgets(ligne,sizeof(char)*120,fichier);
Make_tab(ligne);
}
}
/*Cette affiche les elements contenus dans le tableu*/
void print_tab(Sommet *ptr){
for (i=0;i<taille;i++){
printf("%s %s\n",ptr[i].nom,&ptr[i].succ->srce);
}
}
int main(){
Load();
print_tab(ptr);
return 0;
}
fichier txt
10
A:Z:(B,2,1),(,2,3)
B:A:(D,1,1)
C:A:(E,8,4)
D:B:(F,10,1)
E:C:(F,9,2)
F:D:E:(G,11,1)
G:F:(I,6,1),(K,13,6),(J,14,6)
I:G:(K,5,1)
J:G:(K,4,3)
K:G:I:J