数据结构-指向自身的C ++指针

时间:2019-02-28 04:47:48

标签: c++ pointers data-structures

我是C ++的新手。最初是Java开发人员

我用C ++创建了一个二叉树。 它添加了添加值和打印值的方法。

但是在某个地方我犯了一些错误,并且在printNode()方法中有一个指向自身的指针

我在下面粘贴我的代码。 谁能帮助我找出我犯的错误

main.cpp

#include <iostream>
#include <newbinarytree.cpp>

using namespace std;

int main()
{

    NewBinaryTree* newtree;
    NewBinaryTree tree;
    newtree = &tree;
    newtree->add(10);
    newtree->add(11);
    newtree->add(7); **-->ALL goes well til here & debugger shows a proper tree**
    newtree->printTree();**--> This method does not print the tree values properly**

    return 0;
}

newbinarytree.cpp

#include <iostream>

using namespace std;

class Node{
public:
    int data;
    Node* left =NULL;
    Node* right =NULL;

    Node(int d){
        data = d;

    }
};

    class NewBinaryTree{
    private:
        Node* root = NULL;

    public:
        NewBinaryTree(){
            cout<<"Inside NewBinaryTree constructor";
        }

        void add(int dt){

            if(root ==NULL){
                Node node(dt);
                root = &node;
            }else{
                addAsChildOf(root,dt);
            }
        }

        void addAsChildOf(Node* tnode,int dt){
            if(dt < tnode->data){
                if(tnode->left == NULL){
                    Node newnode = Node(dt);
                    tnode->left = &newnode;
                }else{
                    addAsChildOf(tnode->left,dt);
                }
            }else{
                if(tnode->right == NULL){
                    Node newnode = Node(dt);
                    tnode->right = &newnode;
                }else{
                    addAsChildOf(tnode->right,dt);
                }
            }
        }

        void printTree(){
            if(root==NULL){
                cout<<"empty tree";
            }else{
                printNode(this->root);
            }
        }

        void printNode(Node* node1){ **--> This method goes into infinite loop**
            if(node1==NULL){
                return;
            }else{
                cout<<node1->data<<"[";

                if(node1->left != NULL){
                    cout<<"Left:";
                    printNode(node1->left);
                }
                if(node1->right != NULL){
                    cout<<"Right:";
                    printNode(node1->right);
                }
                cout<<"]";
            }
        }

    };

我的控制台输出

10[Left:4210843[]Right:2686564[Left:2686564
[Left:2686564[Left:2686564[Left:2686564[Left:2686564[Left:2686564[Left:2686564[Left:.... an so on

1 个答案:

答案 0 :(得分:2)

您的add方法在newbinarytree.cpp中是错误的。您正在创建一个临时Node对象,该对象会在范围退出时自动销毁。这导致不确定的行为,解释了为什么从printTree方法中获取虚假值。 (我认为通常会出现一条警告通知您创建临时对象。)这就是我修改add方法的方法。

void add(int dt){
    if (root == NULL) {
        Node *node = new Node(dt);
        root = node;
    } else {
       addAsChildOf(root,dt);
    }
}

您应该对addAsChildOf方法执行相同的操作,因为它使用了相同的错误方式来构造和添加新节点。

要更好地了解代码为何无效:

if (root == NULL) {
    Node node(dt);  //  construct Node object. All is well.
    root = &node;   //  set Node object. All is well.
}   //  end of scope. Node is destructed. Not well.

此外,在将指针设置为空指针时,请使用nullptr。记住还要delete动态分配的节点,以防止内存泄漏。

希望这会有所帮助。