C++分配节点指针

C++ allocating node pointers

本文关键字:指针 节点 分配 C++      更新时间:2023-10-16

我正在使用不相交集合和联合/查找操作制作一个C++迷宫程序。

我有一个MakeSet(int x)函数,它为迷宫中的每个整数元素 x 创建一个新节点。 (即 4x4 迷宫的1 to 16)。因此,最初每个元素都在自己的集合中。

我的制作集看起来像这样

void Maze::MakeSet(int x)
{
    Node *root = new Node;
    root->label = x;
    root->parent = NULL;
}

但是在 CreateMaze() 函数中,我必须多次调用 MakeSet 才能将所有元素最初放入自己的集合中。因此,根将继续被覆盖。如何动态分配许多不同的节点?我应该将它们分开在一个数组中吗?

您已经分配了一个新的Node,只是没有保留它。您需要更改函数以返回 Node* ,并将结果存储在数组或向量中。

Node* Maze::MakeSet(int x) {
    Node *root = new Node;
    root->label = x;
    root->parent = NULL;
    return root;
}
Node *nodes[16];
for (int i = 0 ; i != 16 ; i++) {
    nodes[i] = Maze::MakeSet(i);
}

更好的方法是在构造函数中执行Node初始化:

Node::Node(int x) : label(x), parent(NULL) {
}

您现在可以在一个循环中创建所有集合,并将指向它们的指针存储在数组中:

Node *nodes[16];
for (int i = 0 ; i != 16 ; i++) {
    nodes[i] = new Node(i);
}
<</div> div class="answers">您可以将

Node对象或指针std::vector作为类成员:

class Maze
{
   std::vector<Node> nodes;
};

或者,如果您必须

class Maze
{
   std::vector<Node*> nodes;
}

并添加创建的节点:

void Maze::MakeSet(int x)
{
    Node *root = new Node;
    root->label = x;
    root->parent = NULL;
    nodes.push_back(root);
}
请注意,完成后

,必须实现析构函数来清理内存。这也意味着您应该有一个用于 Maze 的复制构造函数和赋值运算符。