Arbre binaire en C erreur de segmentation

aurore18 Messages postés 10 Date d'inscription   Statut Membre Dernière intervention   -  
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,
voilà je dois programmer un dictionnaire sous forme d'arbre binaire, qui lit un texte et le stocke dans un arbre.
je nai pas d'erreur de compilation, mais quand je le teste j'obtient erreur de segmentation
pouvez vous me dire ou est l'erreur. la fonction d'affichage n'est pas definitive, là je voudrais juste voir si ma fonction de stockage fonctionne. merci d'avance


/*compte mot, version4 ouverture fichier, affichage ecran un mot par ligne, stockage arbre binaire */
#include <locale.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define taille 10000

struct wordtree
{ /* structure d'un noeud de l'arbre*/
char *wordvalue; /* la valeur du mot*/
int wordcount; /* le compteur associé*/
struct wordtree * left; /*lien vers le fils gauche*/
struct wordtree * right ; /* lien vers le fils droit*/
};

void stocker (struct wordtree *wtree, char *mot)
{
int trouve=0;
struct wordtree * root;
root=(struct wordtree *)malloc(sizeof(struct wordtree));
if (root==NULL) {strcpy(root->wordvalue, mot);
root->wordcount=1;
root->left=NULL;
root->right=NULL;
}
else {
root=wtree;
while (root!=NULL && trouve==0)
{
if(strcmp(root->wordvalue,mot)<0)
{
root=root->left;}
if (strcmp(root->wordvalue,mot)>0)
{root=root->right;}
if (strcmp(root->wordvalue,mot)==0)
{
(root->wordcount)++;
trouve=1;
}
}
strcpy(root->wordvalue, mot);
(root->wordcount)=1;
}
}



void affichage (struct wordtree *wtree)
{
while (wtree!=NULL)
{
printf("%s ", wtree->wordvalue);
printf("%d\n",wtree->wordcount);
wtree=wtree->left;
}
}

int main ( int argc , char ** argv )
{
setlocale(LC_ALL, ""); /*pour inclure les caractère daccent etc*/
FILE * df;
char car;
char mot[taille];
struct wordtree *wtree=NULL;
wtree=(struct wordtree *)malloc(sizeof(struct wordtree));
int i=0;

if (argc!=2) {printf ("utilisation : %s fichier \n",argv[0]);
exit(-1);
}

if ((df=fopen (argv[1],"r"))==NULL) {
printf ("fichier %s non accessible \n",argv[1]);
exit(-2);
}

while ((car=fgetc(df))!=EOF)
{
if (isalpha(car)) {mot[i]=car;
i=i+1 ;
}
else {if (i>0) { /* cas des separateurs multiples*/
mot[i]='\0';/* terminaison de chaine*/
stocker (wtree,mot); /*traiter le mot*/
i=0;/*remise à zero pour mot suivant*/
}}
}
affichage(wtree);
fclose (df);


return 0;

}

8 réponses

mype Messages postés 2435 Date d'inscription   Statut Membre Dernière intervention   437
 
les erreur de segmention c'est souvent des probleme allocation de memoire...
verifie tes malloc ça doit etre par la
0
aurore18 Messages postés 10 Date d'inscription   Statut Membre Dernière intervention   1
 
merci jessaie mais jai vraiment du mal jai deja trouve une grosse erreur mais pas de lordre de lallocation memoire.
questiion les malloc, on doit allouer la memoire que dans le main non ?
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
Salut,

Tu as un problème dans ta fonction stocker().
if(strcmp(root->wordvalue,mot), le problème c'est que root->wordvalue est null.
Tu as fait root=wtree, mais wtree->wordvalue est null.

Cdt
0
le père
 
Bonsoir,

Rien ne t'oblige à faire les malloc uniquement dans le main.

J'ai commencé à la ta fonction stocker et plusieurs chose m'échappent :
si l'allocation échoue (root==NULL) tu utilises le pointeur root ? Plantage assuré
si elle réussit, tu écrases immédiatement le pointeur obtenu (root=wtree)

Bon admettons que tu aies voulu écrire if (root!= NULL)
Dans ce cas, le noeud que tu crées en cas de succès de l'allocation n'est pas raccroché à ton arbre ??? de plus, la mémoire ne sera jamais désallouée
0

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

Posez votre question
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
Salut,

Voilà, ton code corrigé, il y avait plein de petites bétises.
Il en reste encore une que j'ai pas corrigée, n'oublie pas les "free".


#include <locale.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define taille 10000

struct wordtree
{ /* structure d'un noeud de l'arbre*/
char *wordvalue; /* la valeur du mot*/
int wordcount; /* le compteur associé*/
struct wordtree * left; /*lien vers le fils gauche*/
struct wordtree * right ; /* lien vers le fils droit*/
};

void stocker (struct wordtree *wtree, char *mot)
{
int trouve=0;
struct wordtree * root;

if (wtree->wordvalue==NULL) {
   wtree->wordvalue=(char*)malloc(50);
   strcpy(wtree->wordvalue, mot);
   wtree->wordcount=1;
   wtree->left=NULL;
   wtree->right=NULL;
}
else {
   root=wtree;
   while (root!=NULL && trouve==0)
   {
      if(strcmp(wtree->wordvalue,mot)<0)
      {
         root=root->left;}
      else if (strcmp(root->wordvalue,mot)>0)
         {root=root->right;}
      else if (strcmp(root->wordvalue,mot)==0)
      {
         (root->wordcount)++;
         trouve=1;
      }
    }
    root=(struct wordtree *)malloc(sizeof(struct wordtree));
    root->wordvalue=(char*)malloc(50);
    strcpy(root->wordvalue, mot);
    (root->wordcount)=1;
}
}



void affichage (struct wordtree *wtree)
{
while (wtree!=NULL)
{
printf("%s ", wtree->wordvalue);
printf("%d\n",wtree->wordcount);
wtree=wtree->left;
}
}

int main ( int argc , char ** argv )
{
setlocale(LC_ALL, ""); /*pour inclure les caractère daccent etc*/
FILE * df;
char car;
char mot[taille];
struct wordtree *wtree=NULL;
wtree=(struct wordtree *)malloc(sizeof(struct wordtree));
int i=0;

if (argc!=2) {printf ("utilisation : %s fichier \n",argv[0]);
exit(-1);
}

if ((df=fopen (argv[1],"r"))==NULL) {
printf ("fichier %s non accessible \n",argv[1]);
exit(-2);
}

while ((car=fgetc(df))!=EOF)
{
if (isalpha(car)) {mot[i]=car;
i=i+1 ;
}
else {if (i>0) { /* cas des separateurs multiples*/
mot[i]='\0';/* terminaison de chaine*/
stocker (wtree,mot); /*traiter le mot*/
i=0;/*remise à zero pour mot suivant*/
}}
}
affichage(wtree);
fclose (df);


return 0;

}




Cdt
0
aurore18 Messages postés 10 Date d'inscription   Statut Membre Dernière intervention   1
 
merci beaucoup je comprend mieux maintenant, je m'etais embrouillé avec le root ...
0
aurore18 Messages postés 10 Date d'inscription   Statut Membre Dernière intervention   1
 
en fait je comprends pas bien les malloc, pourquoi faut til faire un malloc pour la structure en entier puis aussi un pour le wordvalue

root=(struct wordtree *)malloc(sizeof(struct wordtree));
root->wordvalue=(char*)malloc(50);

je sais pas, le fait d'allouer de la memoire pour la structure en entier ne sousentend pas la place pour le wordvalue ?
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
Salut,

Non, le fait d'allouer de la mémoire pour la structure en entier ne donne pas d'allocation pour le wordvalue. On peut prendre l'exemple d'une armoire. On dit que l'armoire prend tant de place, mais ça ne donne pas la dimension des étagères. Dès que tu as un char *, tu dois l'allouer, à mois de l'initialiser à la déclaration.

N'hésite à reposer des questions, et n'oublie pas non plus les free() ;)

Cdt
0