2

我在返回指向结构的指针时遇到问题。有人可以解释我做错了什么吗?我希望search()返回一个指向匹配输入的指针。这将被存储到一个向量中,以防它们在“数组”中重复。这似乎可行,但是我无法从返回的指针中获取“数据”?

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);
    }
}
4

3 回答 3

3

您需要打开编译器警告。

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

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

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

和:

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

search()递归调用不会自动将它们的返回值传递给当前函数的返回值。:)

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

如果不是nullptr',请->data在打印之前对其进行操作。

即,改变:

    cout << hold[i] << endl;

至:

    if (hold[i]) {
      cout << "Found: " << hold[i]->data << "\n";
    } else {
      cout << "Not Found\n";
    }

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

于 2012-11-24T02:52:08.153 回答
1

您正在打印hold[i],它是指向节点的指针,而不是hold[i]->data,这是您想要打印的内容。

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

于 2012-11-24T02:51:48.383 回答
0
        search(x->left, input);
        search(x->next, input);

这两个调用的结果只是被忽略了。您可能应该存储第一次搜索的结果,如果不是NULL,则返回它,否则返回第二次搜索的结果

Node* res = search(x->left, input);
if (res) return res;
return search(x->next, input);
于 2012-11-24T02:52:29.023 回答