rss
Rechercher : dans
Par : Pertinence Date Nom d'utilisateur
Statut : Résolu

Probleme de segmentation sur arbre binaire.

Posté par wlued, le lundi 10 octobre 2005 à 20:48:27
typedef struct noeud
{
int x;
struct noeud *gauche;
struct noeud *droite;
} noeud;
noeud *inserer(noeud *n,int x)
{
noeud * feuille;
if (n==NULL)
{
feuille->x=x;
feuille->gauche=NULL;
feuille->droite=NULL;
}

else {
if (x>n->x)
{
feuille= inserer(n->droite,x);
}

else {
if (x<n->x)
{
feuille= inserer(n->gauche,x);
}

else {
if ((existe(n,x))==1)
{
feuille= n;
}
}
}
}
return feuille;
}
...
}
int main(int argc, char **argv)
{
struct noeud *n;
n=malloc(sizeof(noeud));
inserer(n,8);
afficroi(n);
affidec(n);
return EXIT_SUCCESS;
}


Bonjour à tous,
Voila un algorithme que j'ai un peu raccourci pour cibler mon probleme sur la fonction en cause : inserer( ).
J'ai une fonction existe( ) qui me renvoi un 1 si la fonction trouve la valeur dans l'arbre, et deux fonctions d'affichage.
J'ai donc un probleme de segmentation sur l'algo ci dessus (compilation ok). Il me semble juste et j'ai tenté un malloc pour palier au pb de mémoire mais ça n'a rien changé.

Le pointeur part sur une zone non autorisée donc mais je ne vois pas où.

ps : la mise en page n'a pas été prise en compte, désolé pour la lisibilité.
Répondre à wlued  Signaler ce message aux modérateurs Aller au dernier message

1


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
kilian, le lundi 10 octobre 2005 à 21:11:05
Quand tu appeles une fois la fonction insérer, 8 est plus grand que 0 (chez moi la valeur par défaut d'un x dans un noeud fraichement alloué).

Donc premier appel de insérer() avec x=8, il va rappeler insérer sur feuille->droite pour y insérer 8.

Donc deuxième appel de inserer(), ici n==NULL (puisque tu n'a pas alloué de place pour feuille->droite précédemment).
Donc le "feuille->x=x;" provoque une erreur de segmentation, puisque la place n'a pas été allouée pour ce pointeur de noeud.

Donc juste une petite correction:
if (n==NULL)
{	
		feuille=malloc(sizeof(noeud)); // A rajouter
		feuille->x=x;
		feuille->gauche=NULL;
		feuille->droite=NULL;
}
Répondre à kilian

2


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
wlued, le lundi 10 octobre 2005 à 21:44:53
J'ai fait la modif et lors de la compilation j'ai implicit declaration of function.
Le pb est p-e basique mais je ne maitrise pas encore trés bien.
Répondre à wlued

3


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
kilian, le lundi 10 octobre 2005 à 21:49:13
Ah...
Tu pourrais me donner l'erreur complète?
Ou au pire, me citer le contenu de la ligne à laquelle se rapporte l'erreur? (si c'est un bout de code que tu n'as pas encore cité, mets tout ton code ici).

Tu as bien inclu <stdlib.h> pour le malloc?
Répondre à kilian

4


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
wlued, le mardi 11 octobre 2005 à 00:14:40
Le message exact est 'warning : implicit declaration of function 'maloc'.
Il porte sur la section suivante :
if (n==NULL)
{
feuille=maloc(sizeof(noeud));
feuille->x=x;
feuille->gauche=NULL;
feuille->droite=NULL;
}

En fait je n'ai fait que rajouter cette ligne au programme cité plus haut.
J'ai bien inclu le <stdlib.h>.
Répondre à wlued

5


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
leroy, le mardi 11 octobre 2005 à 01:09:11
Fais gaffe à la syntaxe! malloc et pas maloc!
epi fait un transtypage bien comme il faut:

feuille=(noeud*)malloc(sizeof(noeud))

@+
Répondre à leroy

6


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
kilian, le mardi 11 octobre 2005 à 06:54:48
Ah ben oui, maloc...
Répondre à kilian

7


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
wlued, le mardi 11 octobre 2005 à 08:40:16
Erf oui effectivement....
Bon l'erreur est réparée et je peux à nouveau compiler mais je récupère également mon segmentation fault.
Répondre à wlued

8


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
 wlued, le mardi 11 octobre 2005 à 10:53:37
Ok le pb est réglé, j'avais 'déplacé ' l'erreur en supprimant le malloc dans mon main. Le pointeur sur structure est alloué dans la fonction mais plus dans le main. Merci à vous.
Répondre à wlued
Discussions pertinentes trouvées dans le forum
25/11 19h14Arbre binaire en C erreur de segmentation8
24/04 09h45Arbre binaire1
15/04 20h42Arbres binaires1
13/01 17h14ARBRES BINAIRES4
Plus de discussions sur « Probleme de segmentation sur arbre binaire. »
Logiciels pertinents trouvés dans les téléchargements
Télécharger Binary Clock Screensaver   1.1Binary Clock Screensaver - Le langage binaire est encore mal connu de tous. Cet éditeur a trouvé le moyen d'allier ce langage avec un écran de veille. ...Catégorie: Personnalisation
Licence: Freeware/gratuit
Télécharger Genopro 2007Genopro - Genolog est un logiciel de généalogie permettant de construire un arbre généalogique sur plusieurs générations. Il s'agit...Catégorie: Bureautique
Licence: Freeware/gratuit
Télécharger Autopano SIFT 2.3Autopano SIFT - Autopano-SIFT est un logiciel venant en complément de logiciels tels que Hugin afin de permettre de réaliser très...Catégorie: Retouche photo
Licence: Freeware/gratuit
Télécharger PE Builder 3.1.10aPE Builder - PE Builder vous permet de créer un CD-Rom (ou un DVD) bootable (appelé BartPE) de Windows XP (SP1 minimum) ou Windows Server...Catégorie: Personnalisation
Licence: Freeware/gratuit
Plus de logiciels gratuits sur « Probleme de segmentation sur arbre binaire. »