2

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

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

我的 MakeSet 看起来像这样

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

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

4

2 回答 2

2

你已经分配了一个新的Node,你只是没有保留它。您需要将函数更改为 return 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);
}
于 2012-05-06T23:22:04.277 回答
1

您可以将std::vector对象Node或指针作为类成员:

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

于 2012-05-06T23:22:29.243 回答