2017-10-12 28 views
-1

Est-ce que quelqu'un sait comment enregistrer une valeur dans un arbre binaire sur le côté gauche ou droit? par exemple nous avons 2 struct:structure d'accès avec une fonction, comment enregistrer la valeur?

struct A 
{ 
    int a; 
    struct A *left; 
    struct A *right; 
} 

struct B 
{ 
    A *root; 
} 

et nous avons une fonction:

void insert(B *tree, int value) 
{ 
    if(tree== NULL) 
    { 
     tree= (B*) malloc (sizeof(B)); 
    } 
    else if(tree!=NULL) 
    { 
     tree->root->a = value; 
     tree->root->left = NULL; 
     tree->root->right = NULL; 
    } 

maintenant nous avons la racine ... mais comment initiliase la valeur à droite et à gauche?

else if(tree->apointer->a< value) 
{ 
    tree->root->left = value // with & wont work cause is a pointer to integer 
} 

quelqu'un sait?

Merci à l'avance

+1

À moins que vous utilisez vi sur un smartphone debout sur un train, votre style de codage est tout à fait répréhensible. – Bathsheba

+0

Veuillez contacter votre professeur. Vous avez des problèmes fondamentaux avec certains concepts de base qui doivent être des adresses dans une situation d'enseignement plutôt qu'un site de questions-réponses. – Arkadiy

Répondre

0

Avec tree= (B*) malloc (sizeof(B));, vous créez un objet de type B, mais vous ne créez pas un objet de type A auquel tree->root pourrait pointer. L'accès à tree->root->a ou aux autres membres de root est alors un comportement indéfini;

Vous pouvez écrire:

tree = malloc (sizeof(B)); 
tree->root = malloc(sizeof(A)); 
+0

et comment puis-je accéder à la gauche? il y a un avertissement quand j'essaye ceci: tree-> root-> left = value comment puis-je résoudre ce problème? – Newuser1234567

+0

'root-> left' et' root-> right' doivent tous les deux pointer vers des objets de type 'A'; ces objets existent généralement lorsque vous triez dans un nouveau nœud. Mais - s'il vous plaît ne le prenez pas négatif - pourrait-il être que cet exemple est un peu au-delà de votre niveau de maturité? Les arbres de recherche binaires ne sont pas des choses appropriées quand on commence à apprendre C ... –

0

Je pense qu'il n'y a pas de sens de discuter de votre code :) Même les définitions de structure sont écrits sans points-virgules..

Compte tenu de ces définitions de structure

struct A 
{ 
    int value; 
    struct A *left; 
    struct A *right; 
}; 

struct B 
{ 
    struct A *root; 
}; 

et en supposant que dans main il y a la déclaration suivante de l'arbre

int main(void) 
{ 
    struct B tree = { NULL }; 
    //... 

alors la fonction insert peut être définie de la manière suivante

int insert(struct B *tree, int value) 
{ 
    struct A **node = &tree->root; 

    while (*node) 
    { 
     if (value < (*node)->value) 
     { 
      node = &(*node)->left; 
     } 
     else 
     { 
      node = &(*node)->right; 
     } 
    } 

    *node = malloc(sizeof(struct A)); 
    int success = *node != NULL; 

    if (success) 
    { 
     (*node)->value = value; 
     (*node)->left = NULL; 
     (*node)->right = NULL; 
    } 

    return success; 
} 

Le fu nction peut être appelé comme

insert(&tree, value); 

ou son appel peut être renfermée dans une instruction if

if (insert(&tree, value)) { /*...*/ }