1

尝试创建一个指针向量,然后将每个指针设置为 NULL。然后我想让向量的某个部分连接到我分配的节点。我在不匹配方面遇到了一些困难。我还想将已经存在的内容添加到新节点的后面。任何反馈都会很友好。我不断收到段错误。

struct Node{
    int x;
    Node* rest;
};

void HTadd (int k, Node *ptr)
{

    Node* temp = new Node
    temp->x = k;
    temp->rest= ptr;
    ptr = temp;
}


int main ()
{
    vector <Node *> tableP;
    for (int i = 0; i < 10; i++){
    tableP.push_back(NULL);}

    Node * buggy = tableP[0];
    HTadd(26, buggy);
    cout << buggy->key << endl;


    return 0;
}
4

3 回答 3

4

请注意,我更改了 的函数声明HTAdd以接收指向 a 的指针的指针Node。由于您想修改向量的第一个元素(即 a )的内容Node*,因此您需要传入Node**to HTAdd

编辑:我的原始代码并没有真正改变要连接到您要添加的节点的第 0 个向量元素。下面是你将如何做到的。如您所见,最后两个cout语句打印向量 和 的第 0 个元素的内容buggy,它们指向同一个地址。

#include <iostream>
#include <vector>

using namespace std;

struct Node {
    int x;
    Node* rest;
};

void HTadd (int k, Node **ptr) {
    Node* temp = new Node;
    temp->x = k;
    temp->rest= *ptr;
    *ptr = temp;
}


int main ()
{
    vector<Node*> tableP;

    for (int i = 0; i < 10; i++){
        tableP.push_back(NULL);
    }


    HTadd(26, &tableP[0]);
    Node *buggy = tableP[0];

    cout << tableP[0]->x << endl;
    cout << buggy->x << endl;

    cout << tableP[0] << endl;
    cout << buggy << endl;


    return 0;
}
于 2013-03-14T04:33:42.780 回答
3

buggy 是 NULL 并且你正在尊重它。您通过值而不是通过引用传递指针,因此您更改了它的内容,而不是它指向的内容。更改 HTAdd 以将指针的引用作为其第二个参数。

于 2013-03-14T04:35:07.897 回答
3

像这样使用 HTadd 的定义

void HTadd (int k, Node *&ptr)

像你一样正常调用它。

原因:引用变量意味着为同一位置赋予不同的名称。如果你使用 just Node * ptrthen 你只是按值传递。ieptr是一个局部变量,它将具有buggy(即null)中的值的副本。你做什么ptr不影响buggy。因此要更改buggy何时ptr更改,请通过buggy引用传递。所以ptr应该声明为reference to a pointer to Node

编辑:现在根据下面的评论Node * buggy = tableP[1];将使越野车保持由new node(tableP [1] 保持此地址)返回的地址。现在在调用 之后, (coz temp = new node)为HTadd(26,buggy);buggy 赋予了一个新值。ptr = temp现在 buggy 指向别的东西,但 tableP[1] 没有改变,即tableP[1]->rest仍然NULL如此 tableP[1]->rest->x 没有意义。因此段错误。为什么 tableP[1] 没有挂起?因为 tableP[1] 是一个变量,buggy也是 Node * 类型的另一个变量,所以Node * buggy = tableP[1]只需将 tableP[1] 的内容复制到 buggy;

于 2013-03-14T05:12:00.000 回答