[debutant]structure dans un arbre binaire/pointeur [Résolu]

Signaler
Messages postés
8
Date d'inscription
dimanche 26 novembre 2006
Statut
Membre
Dernière intervention
1 mai 2007
-
Messages postés
8
Date d'inscription
dimanche 26 novembre 2006
Statut
Membre
Dernière intervention
1 mai 2007
-
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;
                    }

}
A voir également:

10 réponses

Messages postés
8
Date d'inscription
dimanche 26 novembre 2006
Statut
Membre
Dernière intervention
1 mai 2007

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
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
18
Tu passe un CHAR temp1 à sscanf("%s") %s est une chaine !
Tu n'alloues pas pCur->nom = &temp1 !!! (nom est un pointeur non alloué)
Messages postés
8
Date d'inscription
dimanche 26 novembre 2006
Statut
Membre
Dernière intervention
1 mai 2007

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
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
18
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);
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
18
erreur pour moi : Nom= (NOEUD*)malloc(sizeof(NOEUD));
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
18
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];
}
Messages postés
8
Date d'inscription
dimanche 26 novembre 2006
Statut
Membre
Dernière intervention
1 mai 2007

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
                    }
                 

}
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
18
System("pause");
Messages postés
8
Date d'inscription
dimanche 26 novembre 2006
Statut
Membre
Dernière intervention
1 mai 2007

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
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
18
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