Les Allergies
Alimentaires
Posez votre question Signaler

Arbre binaire en C erreur de segmentation

aurore18 7Messages postés 17 octobre 2007Date d'inscription - Dernière réponse le 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;
}
Lire la suite 

Arbre binaire en C erreur de segmentation »

8 réponses
Réponse
+0
moins plus
les erreur de segmention c'est souvent des probleme allocation de memoire...
verifie tes malloc ça doit etre par la
Ajouter un commentaire
Réponse
+0
moins plus
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 ?
Ajouter un commentaire
Réponse
+0
moins plus
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
Ajouter un commentaire
Réponse
+0
moins plus
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
Ajouter un commentaire
Réponse
+0
moins plus
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
Ajouter un commentaire
Réponse
+0
moins plus
merci beaucoup je comprend mieux maintenant, je m'etais embrouillé avec le root ...
Ajouter un commentaire
Réponse
+0
moins plus
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 ?
Ajouter un commentaire
Réponse
+0
moins plus
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
Ajouter un commentaire
Ce document intitulé « arbre binaire en C erreur de segmentation » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Dossier à la une
Passage au tout numérique : quel coût pour les particuliers ?