Arbre binaire en C erreur de segmentation
aurore18
Messages postés
13
Statut
Membre
-
fiddy Messages postés 11653 Statut Contributeur -
fiddy Messages postés 11653 Statut Contributeur -
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;
}
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:
- Arbre de segmentation
- Arbre généalogique famille michelin - Télécharger - Généalogie
- Zsh: segmentation fault - Forum Programmation
- Erreur de segmentation c ✓ - Forum C++
- Segmentation fault(core dumped ) avec gmp ✓ - Forum C
- Erreur segmentation fault (core dumped) - Forum C
8 réponses
les erreur de segmention c'est souvent des probleme allocation de memoire...
verifie tes malloc ça doit etre par la
verifie tes malloc ça doit etre par la
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 ?
questiion les malloc, on doit allouer la memoire que dans le main non ?
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
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
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
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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".
Cdt
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
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 ?
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 ?
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
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