Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.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_Struct - Fatal编程技术网

C++ 结构中的指针问题

C++ 结构中的指针问题,c++,pointers,struct,C++,Pointers,Struct,返回指向结构的指针时出现问题。有人能解释我做错了什么吗?我希望搜索返回指向匹配输入的指针。这将存储到向量中,以防它们在数组中重复。这似乎可行,但我无法从返回的指针获取数据 struct Node { int data; Node *left; Node *next; }; vector<Node *> array; void find(int & input) { currentSize = 0; vector<Node

返回指向结构的指针时出现问题。有人能解释我做错了什么吗?我希望搜索返回指向匹配输入的指针。这将存储到向量中,以防它们在数组中重复。这似乎可行,但我无法从返回的指针获取数据

struct Node
{
    int data;
    Node *left;
    Node *next;
};

vector<Node *> array;


void find(int & input)
{
     currentSize = 0;
     vector<Node *> hold;

    for( int i = 0; i < array.size( ); i++ ){
        if(search(array[i], input) != NULL)
        {
            hold.push_back(search(array[i], input));
        }
        else{
            cout << "The Key is not found" << endl;
        }

    }

    for(int i = 0; i < hold.size(); i++)
    {
        cout << hold[i] << endl;
        //Problem here:: I want to see the "data" that the search function returned not the hex value
    }
}


Node * search(Node * x, const int & input)
{
    if( x == NULL )
    {
       return NULL;
    }
    else
    {
        if(input == x->element)
        {
            return x;
        }
            search(x->left, input);
            search(x->next, input);
    }
}
您正在打印hold[i],它是指向节点的指针,而不是hold[i]->数据,它看起来是您想要打印的

同样,这段代码几乎肯定会像筛子一样泄漏和/或破坏堆,但您没有显示足够的代码让我告诉您哪里出了问题。

您正在打印hold[i],它是指向节点的指针,而不是hold[i]>数据,它似乎是您想要打印的数据


此外,这段代码几乎肯定会像筛子一样泄漏和/或破坏堆,但您没有显示足够的代码让我告诉您哪里出了问题。

您需要打开编译器警告

并非所有搜索的代码路径都返回一个值,特别是,如果编译器没有大脑死亡,那么应该得到警告

要解决此问题,请替换此:

            search(x->left, input);
            search(x->next, input);
    }
}
与:

搜索递归调用不会自动将其返回值传递给当前函数的返回值:

此外,正如Zack所指出的,您需要查看节点的一些子字段来打印它。首先检查返回值是否为nullptr,或者在不支持C++11的编译器中是否为NULL如果为NULL,则无法安全地取消引用,这表示搜索失败

如果它不是nullptr',则在打印前对其执行->数据操作

换言之,改变:

    cout << hold[i] << endl;
致:


请注意,我没有使用std::endl,因为我认为没有必要在每一行上刷新缓冲区。

您需要打开编译器警告

        search(x->left, input);
        search(x->next, input);
并非所有搜索的代码路径都返回一个值,特别是,如果编译器没有大脑死亡,那么应该得到警告

要解决此问题,请替换此:

            search(x->left, input);
            search(x->next, input);
    }
}
与:

搜索递归调用不会自动将其返回值传递给当前函数的返回值:

此外,正如Zack所指出的,您需要查看节点的一些子字段来打印它。首先检查返回值是否为nullptr,或者在不支持C++11的编译器中是否为NULL如果为NULL,则无法安全地取消引用,这表示搜索失败

如果它不是nullptr',则在打印前对其执行->数据操作

换言之,改变:

    cout << hold[i] << endl;
致:

请注意,我没有使用std::endl,因为我不认为需要在每一行上刷新缓冲区

        search(x->left, input);
        search(x->next, input);
这两个调用的结果将被忽略。您可能应该存储第一次搜索的结果,如果不为NULL,则返回它,否则返回第二次搜索的结果

Node* res = search(x->left, input);
if (res) return res;
return search(x->next, input);
这两个调用的结果将被忽略。您可能应该存储第一次搜索的结果,如果不为NULL,则返回它,否则返回第二次搜索的结果

Node* res = search(x->left, input);
if (res) return res;
return search(x->next, input);

我希望搜索函数中的x->元素也不会编译。正如Zack指出的,您的编码标准有点弱。但至少你在努力。随着时间的推移,你将学会如何坚持下去。我希望搜索函数中的x->元素也不会编译。正如Zack指出的,您的编码标准有点弱。但至少你在努力。随着时间的推移,你将学会如何坚持。当我打印hold[I]->数据时,我得到了一些不可读的字符,后跟一个seg错误。@user1771695这意味着hold[I]指向的不是节点。当我打印hold[I]->数据时,我得到了一些不可读的字符,后跟一个seg错误。@user1771695这意味着hold[I]指向节点以外的其他对象。我按照您的建议进行了更改,Yakk可以正常工作。谢谢。然而,我有点困惑于理解为什么对搜索的更改确实有效。我试图找到x->数据与输入匹配的所有位置,并返回指针,但在代码节点*leftSearch=searchx->left,input;如果leftSearch返回leftSearch;返回searchx->next,输入;它是否仍然检查ifinput==x->element?这是递归推理。你可能还没看过归纳法,是吗?但其思想是,递归调用search只会返回非null值,前提是该节点上的任何内容都有答案。如果它返回非null,那么它已经找到了答案,因此我们不必检查它,只需将其转发。如果它返回null,我们检查另一个节点指针,看看里面是否有答案。哦,是的,你确实需要用x->data替换x->element x没有名为elementI的字段。我按照你的建议做了更改,它工作了。谢谢。然而,我有点困惑于理解为什么对搜索的更改确实有效。我试图找到x->数据与输入匹配的所有位置,并返回指针,但在代码节点*leftSearch=searchx->left,input;如果leftSearch返回leftSearch;返回searchx->next,i
nput;它是否仍然检查ifinput==x->element?这是递归推理。你可能还没看过归纳法,是吗?但其思想是,递归调用search只会返回非null值,前提是该节点上的任何内容都有答案。如果它返回非null,那么它已经找到了答案,因此我们不必检查它,只需将其转发。如果它返回null,我们检查另一个节点指针,看看里面是否有答案。哦,是的,您确实需要用x替换x->element->data x没有名为element的字段