Problème de chainage dans un tableau dynamique

hachure1 Messages postés 1 Date d'inscription vendredi 2 janvier 2009 Statut Membre Dernière intervention 1 février 2010 - 1 févr. 2010 à 21:02
delictum Messages postés 1 Date d'inscription mercredi 20 janvier 2010 Statut Membre Dernière intervention 18 avril 2011 - 18 avril 2011 à 23:53
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

1 réponse

delictum Messages postés 1 Date d'inscription mercredi 20 janvier 2010 Statut Membre Dernière intervention 18 avril 2011
18 avril 2011 à 23:53
code source :

soit G(X,T) un graphe d'ordre n
on demande de rédiger des fonctions et procédures suivants de manipulation et de création dans les cas suivants :

1) Graphe représenté physiquement par matrice d'incidence
2) Graphe représenté physiquement par chainage dynamique
3) Graphe représenté physiquement par chainage tabulé


on demande de rédiger dans chaque cas des procédures de :
-création du Graphe et affichage du DDS et du DDP
-tester si un Graphe (x,y) est un arc du Graphe
-tester si une suite donnée x1,x2,....,xn est un chemin du graphe
-tester si un chemin est Hamiltonien, Eulérien
-tester si un Graphe est fortement connexe
-tester si un Graphe est un GSC (graphe son circuit)
-déterminer tous les circuits de langeur donnée
-ordonner le graphe par niveaux
-tester si un graphe contient des circuits

Langage C++
0