我已经创建了此示例代码,但是我无法使其正常工作。我想从父节点创建子级,这样每个子级都有一个父级,每个子级都有一个指向其父级的指针。第一父级的指针是null指针。现在的问题是,如果我在树分支的尽头,我该如何逐步返回第一个父树,并写下历史记录?
为了简单起见,在此示例中,我创建了带有一条简单路径的线性图。
我发现,如果我想第二次取消引用某个节点的父节点,那么我已经得到了伪造的结果,而且我无法达到第一个父节点的目的。因此,我只能取消引用当前节点的父级。这是为什么?我已经看到在链接列表中人们存储了每个指针,但是我想避免这种情况。目标是,每个节点都存储在list<Node>
中,并且每个节点仅存储其父指针,因此从每个节点中我们都可以追溯到第一个父节点。
#include <iostream>
#include <list>
using namespace std;
struct Node
{
int node;
Node *parent;
};
void create (Node parent, list<Node>& graph)
{
if (graph.size() < 10)
{
Node nn;
nn.node = parent.node+1;
nn.parent = &parent;
graph.push_back(nn);
create(nn, graph);
}
}
int main()
{
list<Node> graph;
Node parent;
parent.node = 0;
parent.parent = nullptr;
graph.push_back(parent);
create(parent, graph);
for (auto i : graph)
{
cout << i.node << " ";
}
cout << endl << endl;
auto it = graph.begin();
advance(it, 3);
cout << (*it).node << endl;
cout << (*(*(*it).parent).parent).node;
return 0;
}
Node
,它应该看起来像这样:void create(Node* parent, list<Node>& graph)
{
if (graph.size() < 10)
{
Node* nn = new Node;
nn->node = parent->node + 1;
nn->parent = parent;
graph.push_back(*nn);
create(nn, graph);
}
}
但是,这将导致几个问题:
在此行
graph.push_back(*nn);
中,我们取消引用nn
,这会导致不必要地复制int
和Node*
(结构属性)值。由于我们没有在任何地方保存
nn
值,所以导致内存泄漏,因此我们以后不能删除其内容。
Node*
而不是Node
的列表:list<Node*> graph;
这样,我们可以遍历列表并稍后删除动态分配的Node
:
for (auto i : graph)
delete i;
而不是复制int
和Node*
值,我们只是将Node* nn
推送到列表:
graph.push_back(nn);
请注意,it
现在是指向指针的指针,因此需要双重解引用:cout << (**it).node << endl; cout << (*(*(**it).parent).parent).node;