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

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

}
Afficher la suite 

10 réponses

Meilleure réponse
Messages postés
8
Date d'inscription
dimanche 26 novembre 2006
Statut
Membre
Dernière intervention
1 mai 2007
3
Merci
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

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 205 internautes nous ont dit merci ce mois-ci

Commenter la réponse de gluff
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
17
0
Merci
Tu passe un CHAR temp1 à sscanf("%s") %s est une chaine !
Tu n'alloues pas pCur->nom = &temp1 !!! (nom est un pointeur non alloué)
Commenter la réponse de yann_lo_san
Messages postés
8
Date d'inscription
dimanche 26 novembre 2006
Statut
Membre
Dernière intervention
1 mai 2007
0
Merci
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
Commenter la réponse de gluff
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
17
0
Merci
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);
Commenter la réponse de yann_lo_san
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
17
0
Merci
erreur pour moi : Nom= (NOEUD*)malloc(sizeof(NOEUD));
Commenter la réponse de yann_lo_san
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
17
0
Merci
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];
}
Commenter la réponse de yann_lo_san
Messages postés
8
Date d'inscription
dimanche 26 novembre 2006
Statut
Membre
Dernière intervention
1 mai 2007
0
Merci
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
                    }
                 

}
Commenter la réponse de gluff
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
17
0
Merci
System("pause");
Commenter la réponse de yann_lo_san
Messages postés
8
Date d'inscription
dimanche 26 novembre 2006
Statut
Membre
Dernière intervention
1 mai 2007
0
Merci
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
Commenter la réponse de gluff
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
17
0
Merci
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
Commenter la réponse de yann_lo_san