[debutant]structure dans un arbre binaire/pointeur

Résolu
gluff Messages postés 8 Date d'inscription dimanche 26 novembre 2006 Statut Membre Dernière intervention 1 mai 2007 - 26 nov. 2006 à 16:19
gluff Messages postés 8 Date d'inscription dimanche 26 novembre 2006 Statut Membre Dernière intervention 1 mai 2007 - 26 nov. 2006 à 23:42
Bonjour,
je n'arrive pas a remplir des strucutures a partir de la lecture d'un fichier.
Dans le fichier sont contenus un liste de nom de personne et un numéros correspondant a leur génération (1,2,3, ect...), je voudrais rentré le nom dans le champ nom de la structure NOEUD et le numéros dans gen, mais j'y arrive pas...
Une cela fait il faudra que je crée des liens entre les différente structure et là je galère aussi.
Voici un bout de code si vous pouviez m'éclairer.
Merci d'avance.

cordialement GLUFF

//////////////////////////////////************************************//////////////////////////////////////////////
#include <stdio.h>
#include <stdlib.h>
#include<string.h>

typedef struct NOEUD
        {
            char *Nom;
            int *gen;
            struct NOEUD *pere;
            struct NOEUD *ptg;
            struct NOEUD *ptd;
        }NOEUD;

main()
  {
    FILE *pfichier;
    pfichier=fopen("arbre.txt","r");
    //il faut ouvrir le fichier ds la fct,c mieux
    char temp1;
    int temp2;
    int temp3;
    int i;
    struct NOEUD *pcour;
  
  
                    while(!feof(pfichier))
                  
                  
                    {
                   
              
                    fscanf(pfichier,"%s %d",&temp1,&temp2);
                                    
                
                    //on fait des enfants par generation ptg
                  NOEUD*ptg=NULL;
                  ptg= (NOEUD*)malloc(sizeof(NOEUD));
                  (pcour->Nom)=&temp1;
                  (pcour->gen)=&temp2;  
                    pcour->ptg=ptg;
                    pcour=ptg;
                    }

}

10 réponses

gluff Messages postés 8 Date d'inscription dimanche 26 novembre 2006 Statut Membre Dernière intervention 1 mai 2007
26 nov. 2006 à 23:42
MERCI BEAUCOUP en réalité c pas System mais system.... c'est bon c'est fini.
Je suis trés satisfait de l'ambience de ce site
3
yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 26
26 nov. 2006 à 16:28
Tu passe un CHAR temp1 à sscanf("%s") %s est une chaine !
Tu n'alloues pas pCur->nom = &temp1 !!! (nom est un pointeur non alloué)
0
gluff Messages postés 8 Date d'inscription dimanche 26 novembre 2006 Statut Membre Dernière intervention 1 mai 2007
26 nov. 2006 à 16:58
Merci je vois le probleme, mais je ne sais pas le résoudre . J'ai un probleme avec les structutres et les pointeurs (enfaite les pointeurs dans les structures je supporte pas)

du coup si je change ca  en passant les pointeur nom et gen directement en variable(voir ) , mais du coup *(pcour->Nom)=temp1;*(pcour->gen)=temp2; est faux ? (voir ;)

ou alors je peux essayé d'alloue nom en le laissant en pointeur : voir plus bas
NOEUD*Nom=NULL;
Nom= (char*)malloc(sizeof(char));

                
///////////////////////////////////************************************/////////////////////////////////////////////////////

#include <stdio.h>
#include <stdlib.h>
#include<string.h>

typedef struct NOEUD
        {
           
char Nom[10];
            int gen;
            struct NOEUD *pere;
            struct NOEUD *ptg;
            struct NOEUD *ptd;
        }NOEUD;

main()
  {
    FILE *pfichier;
    pfichier=fopen("arbre.txt","r");
    //il faut ouvrir le fichier ds la fct,c mieux
    char temp1[10];
    int temp2;
    int temp3;
    int i;
    struct NOEUD *pcour;
  
  
                    while(!feof(pfichier))
                  
                  
                    {
                   
              
                    fscanf(pfichier,"%s %d",&temp1,&temp2);
                                    
                
                    //on fait des enfants par generation ptg
                  NOEUD*ptg=NULL;
                  ptg= (NOEUD*)malloc(sizeof(NOEUD));
                  *(pcour->Nom)=temp1;
                  *(pcour->gen)=temp2;  
                    pcour->ptg=ptg;
                    pcour=ptg;
                    }

}

///////////////////////////////////************************************/////////////////////////////////////////////////////
ou alors je peux essayé d'alloue nom en le laissant en pointeur :
typedef struct NOEUD
        {
            char *Nom;
            int *gen;
            struct NOEUD *pere;
            struct NOEUD *ptg;
            struct NOEUD *ptd;
        }NOEUD;

main()
  {
    FILE *pfichier;
    pfichier=fopen("arbre.txt","r");
    //il faut ouvrir le fichier ds la fct,c mieux
    char temp1[10];
    int temp2;
    int temp3;
    int i;
    struct NOEUD *pcour;
  
  
                    while(!feof(pfichier))
                  
                  
                    {
                   
              
                    fscanf(pfichier,"%s %d",&temp1,&temp2);
                                    
                
                    //on fait des enfants par generation ptg
                  NOEUD*ptg=NULL;
                  ptg= (NOEUD*)malloc(sizeof(NOEUD));
                  NOEUD*Nom=NULL;

                 Nom= (char*)malloc(sizeof(char));
                  (pcour->Nom)=&temp1;
                  (pcour->gen)=&temp2;  
                    pcour->ptg=ptg;
                    pcour=ptg;
                    }

}

Merci encore d'anvance
0
yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 26
26 nov. 2006 à 17:05
1 -  fscanf(pfichier,"%s %d",&temp1,&temp2); 
   &temp1 ne veut rien dire, c'est ou &temp1[0] OU temp1 le pointeur !

2 - Nom= (char*)malloc(sizeof(char)); un noeud n'est pas un char !
     Nom= (char*)malloc(sizeof(NOEUD));
     Nom->nom = (char*)malloc(10);

3 - on n'utilise pas = pour les chaines C
      strcpy(chaineSource, chaineDestination);
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 26
26 nov. 2006 à 17:09
erreur pour moi : Nom= (NOEUD*)malloc(sizeof(NOEUD));
0
yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 26
26 nov. 2006 à 17:14
2 solutions :
si pointeur dans la structure (char* nom) on passe par un buffer pour la lecture dans fichier
puis on alloue avec la taille du buffer
pNoeud->nom = (char*)malloc(strlen(buffer)+1);
puis on copie;
strcpy(pNoeud->nom, buffer);

ou le nom est toujours de taille fixe dans la structure
#define TAILLE_NOM 32
struct
{
   char nom[TAILLE_NOM];
}
0
gluff Messages postés 8 Date d'inscription dimanche 26 novembre 2006 Statut Membre Dernière intervention 1 mai 2007
26 nov. 2006 à 18:14
Merci je crois que ca marche enfin mais g un pb tout con de pauvre debutant :
quand je lance le programme la fenetre se ferme tout de suite et on a pas le temp de voir ce qui y est écrit...comment on fait?

reremerci d'avance
GLUFF

#include <stdio.h>
#include <stdlib.h>
#include<string.h>

typedef struct NOEUD
        {
            char *Nom;
            int *gen;
            struct NOEUD *pere;
            struct NOEUD *ptg;
            struct NOEUD *ptd;
        }NOEUD;

main()
  {
    FILE *pfichier;
    pfichier=fopen("arbre.txt","r");
    //il faut ouvrir le fichier ds la fct,c mieux
    char temp1[10];
    int temp2;
    int temp3;
    int i;
    NOEUD *pcour;
    pcour= (NOEUD*)malloc(sizeof(NOEUD));
    pcour->Nom = (char*)malloc(10);
    pcour->gen = (int*)malloc;
                    while(!feof(pfichier))               
                    {
                  
             
                    fscanf(pfichier,"%s %d",temp1,&temp2); // lecture dans fichier
                                   
               
                   
                  NOEUD*ptg=NULL;//on fait des enfants par generation ptg
                  ptg= (NOEUD*)malloc(sizeof(NOEUD));// reservation mémoire
                  NOEUD*Nom=NULL;
                  strcpy(pcour->Nom,temp1);
                  //remplissage des donné
                  (pcour->gen)=&temp2; 
                  printf("%s", pcour->Nom);
                    pcour->ptg=ptg;
                    pcour=ptg; // passage au noeud suivant
                    }
                 

}
0
yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 26
26 nov. 2006 à 18:18
System("pause");
0
gluff Messages postés 8 Date d'inscription dimanche 26 novembre 2006 Statut Membre Dernière intervention 1 mai 2007
26 nov. 2006 à 18:47
J'ai peur d'etre chiant mais je comprend pas
j'ai rajouter:
System("pause");
et ca marchait pas alors aprés de recherche j'ai vu qu'il fallait iostream
alors
j'ai rajouter:
#include ou #include
System("pause");
et devc++ me dit qu'il trouve pas iostream...et je le trouve pas sur internet....
Merci
0
yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 26
26 nov. 2006 à 20:47
Quant tu installes un compilateur il faut parametrer des variables d'environnement pour qu'il puisse trouver les LIB, INCLUDE, ect...
Sinon il faudrait que tous les fichiers soient dans le rep courant !
Donc dans ton cas, il faut ajouter dans tes vars d'env. :
Set PATH=chemin vers compilateur
Set LIB=chemin vers lib
Set INCLUDE=chemin vers include

de plus le header vers system est plutot stdlib.h
0
Rejoignez-nous