Arbre binaire problème de segmentation

Fermé
mikhail105 Messages postés 4 Date d'inscription vendredi 8 novembre 2013 Statut Membre Dernière intervention 8 décembre 2013 - 8 nov. 2013 à 10:21
mikhail105 Messages postés 4 Date d'inscription vendredi 8 novembre 2013 Statut Membre Dernière intervention 8 décembre 2013 - 10 nov. 2013 à 12:07
Bonjour, je suis entrain de faire mon tp de programmation.
Donc tout d'abord je dois créer un arbre binaire et puis le parcourir (VLR , racine->gauche->droit).
Voilà l'algorithme que j'ai fait:

#include<stdio.h>
#include<stdlib.h>



struct noeud_str

{
int val;
struct noeud_str*fils_g;
struct noeud_str*fils_d;};

//rénommage


typedef struct noeud_str noeud;
typedef noeud*arbre;





arbre creer_arbre(int e)
{
arbre a1=malloc(sizeof(noeud));
a1->val=e;
a1->fils_g=NULL;
a1->fils_d=NULL;
return a1;

}



void inserer_element(int e, arbre a1)
{
if (a1==NULL)
{
a1=creer_arbre(e);
}
else if ((a1!=NULL)&&(e<(a1->val)))
{
inserer_element(e,a1->fils_g);
}
else
{
inserer_element(e,a1->fils_d);
}
}


void parcours_VLR(arbre a1)
{

if (a1==NULL) return;
if(a1->fils_g){
parcours_VLR(a1->fils_g);
}
printf("%d" ,(a1->val));
if(a1->fils_d){
parcours_VLR(a1->fils_d);
}
}


main()
{
int d;
arbre temp=creer_arbre(4);
inserer_element(2,temp);
inserer_element(3,temp);
inserer_element(5,temp);
(temp->fils_d->val)=d;
printf("%d",d);
}

Après avoir compilé , j'exécute le programme et il m'écrit ERREUR DE SEGMENTATION.
Je n'arrive pas à trouver le problème dans l'algorithme :(
Pouvez-vous m'aider?
Je vous remercie d'avance!

2 réponses

ElementW Messages postés 4816 Date d'inscription dimanche 12 juin 2011 Statut Contributeur Dernière intervention 5 octobre 2021 1 228
8 nov. 2013 à 23:34
Aaah la magie des pointeurs ;)
Parfois ça porte à confusion... Tu as compris qu'il fallait utiliser des pointeurs dans ce cas de structure récursive, c'est déjà bien.
Mais le problème réside dans la fonction
inserer_element
: tu créé un nouvel arbre si celui pointé est inexistant (NULL). Jusque là ça va, mais tu l'associes à
a1
qui est un pointeur de noeud (type
arbre
), or ce pointeur est copié vu qu'il est un paramètre de la fonction.
a1
ne sortira pas de ce cadre, or tu veux l'associer au neud pointé; il faut donc des pointeurs de pointeurs, pour pointer l'
arbre
, qui est lui-même un pointeur de noeud. C'est complexe mais après réflexion c'est logique; il m'a quand même fallu cogiter un peu pour trouver ça. Je te fais cadeau de la version pointe-pointeur de ta fonction:
void inserer_element(int e, arbre *a1)

{
if (*a1==NULL)
{
*a1 = creer_arbre(e);
}
else if (e < ((*a1)->val))
{
inserer_element(e,&((*a1)->fils_g));
}
else
{
inserer_element(e,&((*a1)->fils_d));
}
}
Du coup le
main
devient en partie ça:
inserer_element(2,&temp);

inserer_element(3,&temp);
inserer_element(5,&temp);
1
mikhail105 Messages postés 4 Date d'inscription vendredi 8 novembre 2013 Statut Membre Dernière intervention 8 décembre 2013
10 nov. 2013 à 12:07
Je vous remercie :) Je vais remplacer ce code dans mon algorithme.
Merci encore une fois :)
0