Arbre binaire en C

Fermé
Sofi - 20 sept. 2011 à 21:49
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 - 20 sept. 2011 à 23:18
Bonsoir,
Je voudrais poser une question à propos une arbre binaire en C.
Est ce qu'on peux le définir comme ça :
typedef struct noeud * tree;
 struct noeud
{
    int etiquette;
    tree SAG;
    tree SAD;

} typetree;

Et après je fais la fonction par exemple:
int estvide(typetree A)
{
if(A.SAG==NULL || A.SAD==NULL || A.etiquette==NULL)
return 0;
else
return 1;

}
il m'avertit qu'il y des fautes au niveau de 1 ligne :
C:\Users\Desktop\ARBRENOEUD\main.c|29|error: request for member 'SAD' in something not a structure or union|

5 réponses

KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 019
20 sept. 2011 à 22:11
Il faut mettre directement tes pointeurs dans la structure qui s'appelle elle même :

typedef struct noeud
{
    int etiquette;
    struct noeud *SAG;
    struct noeud *SAD;
}
typetree;


Remarque : ta méthode estVide est bancale, etiquette ne peut pas être NULL, et un arbre est vide lorsque ses deux sous-arbres sont vides, pas seulement l'un des deux.

int estVide(const typetree a)
{
	return a.SAG==NULL && a.SAD==NULL;
}
0
En prenant la structure déjà défini lorsque je fais un appelle récursif de la fonction: comment je peux le déclarer par exemple j'ai la fonction suivante:
int taille( typetree A)
{
int nombre;
if(estvide(A))
nombre=0;
else
{
nombre=1+taille(A.SAG)+taille(A.SAD);
}
return nombre;

}
alors comment je peux faire l'appelle le sous arbre Gauche car lorsque j'ai taille(A.SAG) il m'affiche un erreur
0
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 019
Modifié par KX le 20/09/2011 à 22:38
Il faut vérifier chaque sous-arbre indépendamment.
D'ailleurs ta fonction estVide a peu de sens, le simple fait que ton arbre existe implique qu'il contient au moins une valeur, il s'agit plutôt de savoir si c'est une feuille ou non...

int taille(const typetree A)    
{    
    int nombre = 1; // il faut compter A !!!    
        
    if (A.SAG!=NULL)    
        nombre+=taille(A.SAG);    

    if (A.SAD!=NULL)    
        nombre+=taille(A.SAD);    

    return nombre;    
}
La confiance n'exclut pas le contrôle
0
le problème c'est pas dans le code mais dans le déclaration de A.SAG par ce qu'on l'a définit comme noeud* mais dans l'appelle récursif on a besoin de taille(typetree A).
Alors le compilateur n'a pas accepté le type de variable déclaré dans taille(A.SAG).
En plus le taille dans une arbre est le nombre des noeuds
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 019
20 sept. 2011 à 23:00
Oups... erreur d'inattention ^^

C'est avec ton typedef, il faut déclarer typetree comme pointeur puis l'utiliser comme ça !

typedef struct noeud
{
    int etiquette;
    struct noeud *SAG;
    struct noeud *SAD;
} *typetree;

int estVide(const typetree a)
{
	return a->SAG==NULL && a->SAD==NULL;
}

int taille(const typetree a)    
{    
    int nombre = 1;   
        
    if (a->SAG!=NULL)    
        nombre+=taille(a->SAG);    

    if (a->SAD!=NULL)    
        nombre+=taille(a->SAD);    

    return nombre;    
}
0
alors c'est quoi la différence entre *typedetree et typetree .
En plus pourquoi on utilise la notion (a->SAG) c'est possible en C???!!!
0
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 019
20 sept. 2011 à 23:18
En fait on fait typedef struct noeud* typetree comme ça l'arbre a le même type que ses sous arbres qui sont eux même déclarés struct noeud* on peut donc considérer qu'ils sont tous typetree.
Faire a->SAG est équivalent à faire (*a).SAG mais on utilise plus souvent la flèche dans ce cas.
0