Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用包含指针的队列时的奇怪行为_C++_Pointers_Stl_Queue - Fatal编程技术网

C++ 使用包含指针的队列时的奇怪行为

C++ 使用包含指针的队列时的奇怪行为,c++,pointers,stl,queue,C++,Pointers,Stl,Queue,我试图创建一个二叉树,当您尝试向其中添加新节点时,它会将节点添加到第一个位置,即nullptr 实际上是制作一个完整的二叉树 请看下面的代码: #include <iostream> #include <queue> using namespace std; class node{ private: char data; node* right; node* left; public: node(char n){ data

我试图创建一个二叉树,当您尝试向其中添加新节点时,它会将节点添加到第一个位置,即
nullptr

实际上是制作一个完整的二叉树

请看下面的代码:

#include <iostream>
#include <queue>
using namespace std;

class node{
private:
    char data;
    node* right;
    node* left;
public:
    node(char n){
        data = n;
        left = nullptr;
        right = nullptr;
    }
    char getdata(){
        return data;
    }
friend class binTree;
};

class binTree{
private:
    node *root;
public:
    binTree(){
        root = nullptr;
    }
    binTree(node *root){
    this->root = root;
    }

    node* getRoot(){
    return this->root;
    }


    void addNode(char data){
        cout << "adding " << data << endl;

        if(root == nullptr) {
            root = new node(data);
            return;
        }


        queue<node*> Q;
        Q.push(root);
        node* toadd;
        while(true) {
            node* toadd = Q.front();
            Q.pop();
            Q.push(toadd->left);
            Q.push(toadd->right);

            if(toadd->left == nullptr)  break;
            if(toadd->right == nullptr) break;
        }

        if((toadd->left) == nullptr)
        {
            cout << "add data to the left of " << toadd -> data << endl;
            toadd->left = new node(data);
        } else if((toadd -> right) == nullptr){
            cout << "add data to the right of " << toadd -> data << endl;
            toadd->right = new node(data);
        } else {
            cout << "toadd left and right are not nullptr" << endl;
        }

    }
};

int main()
{
    binTree bin;
    string s = "abcdefg";
    cout << s << endl << endl;
    for(int i = 0; i < s.size(); i++)
    {
        bin.addNode(s[i]);
    }
}
奇怪的是,当打印“toadd left and right not nullptr”时 因为存在一段时间(真),唯一的退出条件是:

            if(toadd->left == nullptr)  break;
            if(toadd->right == nullptr) break;
所以其中一个条件是真的,我们可以打破循环; 因此,我们应该输入以下代码的
if
else if
部分(在while之后),但令人惊讶的是,我们输入了
else
部分并在打印结束时“toadd left和right都不是null ptr”。
有人能解释这种行为吗?

您已经定义了两次添加
,一次在循环之前,一次在循环内部。容易犯错误。

您已经定义了两次添加
,一次在循环之前,一次在循环内部。容易犯错误。

-Werror=shadow
在gcc和clang上避免此类错误。
-Werror=shadow
在gcc和clang上避免此类错误。
            if(toadd->left == nullptr)  break;
            if(toadd->right == nullptr) break;