Arbre binaire en C erreur de segmentation

Fermé
aurore18 Messages postés 10 Date d'inscription mercredi 17 octobre 2007 Statut Membre Dernière intervention 1 juin 2016 - 25 nov. 2007 à 19:14
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 26 nov. 2007 à 15:51
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;

}
A voir également:

8 réponses

mype Messages postés 2435 Date d'inscription jeudi 1 novembre 2007 Statut Membre Dernière intervention 16 août 2010 436
25 nov. 2007 à 19:25
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 mercredi 17 octobre 2007 Statut Membre Dernière intervention 1 juin 2016 1
25 nov. 2007 à 20:05
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 samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 843
25 nov. 2007 à 21:23
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
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 samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 843
25 nov. 2007 à 22:51
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 mercredi 17 octobre 2007 Statut Membre Dernière intervention 1 juin 2016 1
26 nov. 2007 à 12:01
merci beaucoup je comprend mieux maintenant, je m'etais embrouillé avec le root ...
0
aurore18 Messages postés 10 Date d'inscription mercredi 17 octobre 2007 Statut Membre Dernière intervention 1 juin 2016 1
26 nov. 2007 à 13:21
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 samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 843
26 nov. 2007 à 15:51
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