Указатель структурных изменений - PullRequest
0 голосов
/ 19 декабря 2018
#include<stack>
#include<iostream>

class Tree{
    private:
        struct tree{
            int val;
            tree * lChild;
            tree * rChild;
            tree * Parent;
        };
        tree *root;
    public:
        Tree();
        void insert(int x);
};

Tree::Tree(){
    root = NULL;
    std::cout<<"ROOT inside constructor : "<<root<<std::endl;
}

void Tree::insert(int x){
    tree *wst;
    wst->val = x;
    wst->lChild = NULL;
    wst->rChild = NULL;

    tree *temp = root;
    tree *p = NULL;


    std::cout<<"ROOT inside insert : "<<root<<std::endl;

    while(temp != NULL){
        p = temp;
        if(x < temp->val)
            temp = temp->lChild;
        else
            temp = temp->rChild;
    }

    std::cout<<x<<std::endl;

    wst->Parent = p;

    if(p == NULL){
        root = wst;
    }
    else{
        if(x < p->val)
            p->lChild = wst;
        else
            p->rChild = wst;
    }

}


int main(){
    Tree tree;

    tree.insert(404);

}

Я хочу проверить, равен ли корень указателя NULL, но это, похоже, не слишком работает.Кажется, указатель меняется с 0 на 0x4, когда я нахожусь внутри метода вставки.Как я могу проверить, равен ли указатель структуры NULL?

РЕДАКТИРОВАТЬ В методе вставки, если дерево не имеет узлов, оно не должно входить первым во время цикла, так как корень должен быть равен NULL.И моя проблема в том, что он все равно входит в этот цикл и вылетает при проверке временных детей (которые до сих пор не определены).

1 Ответ

0 голосов
/ 19 декабря 2018

На что указывает wst?

tree *wst;
wst->val = x;
wst->lChild = NULL;
wst->rChild = NULL;
// [...]
wst->Parent = p;

Упс!Ваша программа имеет неопределенное поведение.Не удивительно, что он падает.:)

Вам, вероятно, нужно tree* wst = new tree(); там.Не забудьте также delete свои узлы в деструкторе Tree!

И я бы посоветовал не иметь тип Tree плюс тип tree;возможно, вместо последнего позвоните Node?

...