2 votes

L'arbre n'est pas créé

Lorsque j'appelle la fonction createBst(), le programme se termine dans la fonction.

J'ai placé une instruction d'impression après la fonction, mais elle n'est pas appelée, ni l'instruction d'impression suivante "terminated".

int main(){
    bst b;
    b.createBst();
    std::cout<<"terminated"<<std::endl;
    return 0;
}
class node{
public:
    int val;
    node* left;
    node* right;
};

class bst{

public:
    node* head;
    void createBst();
    node* newNode(int val);

};

node* bst::newNode(int v){
    node n1;
    node* n=&n1;
    n->val=v;
    n->left=nullptr;
    n->right=nullptr;
    return n;
}

void bst::createBst(){
    head=bst::newNode(10);
    head->left=bst::newNode(11);
    (head->left)->left=bst::newNode(7);
    head->right=bst::newNode(9);
    (head->right)->left=bst::newNode(15);
    (head->right)->right=bst::newNode(8);
}

la sortie doit être "terminée".

3voto

Vlad from Moscow Points 36219

Pour commencer, les classes doivent être définies avant leur utilisation dans main.

Cette fonction

node* bst::newNode(int v){
    node n1;
    node* n=&n1;
    n->val=v;
    n->left=nullptr;
    n->right=nullptr;
    return n;
}

invoque un comportement non défini car il retourne un pointeur sur une variable locale n1 qui ne sera pas en vie après la sortie de la fonction.

La fonction pourrait être définie de la manière suivante

node* bst::newNode(int v)
{
    return new node { v, nullptr, nullptr };
}

En fait, la fonction peut être une fonction membre statique privée.

class bst{
public:
    node* head;
    void createBst();

private:
    static node* newNode(int val);
};

Et le nœud de classe doit être une classe privée (ou protégée) imbriquée de la classe bst.

Vous avez également besoin soit d'un constructeur par défaut pour la classe bst qui initialisera head à nullptr, soit d'initialiser explicitement head à nullptr dans la définition de la classe, comme par exemple

class bst{

public:
    node* head = nullptr;
    void createBst();

private:
    static node* newNode(int val);

};

Pour insérer une donnée dans l'arbre, vous devez écrire une fonction, par exemple comme ceci

void insert( int value )
{
    node **current = &head;

    while ( *current != nullptr )
    {
        if ( value < ( *current )->val )
        {
            current = &( *current )->left;
        }
        else
        {
            current = &( *current )->right;
        }
    }

    *current = newNode( value );
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X