如何创建指针链?我想创建具有指向其他对象的指针的对象,该对象具有指针。这有可能吗?

问题描述 投票:0回答:1

我已经创建了此示例代码,但是我无法使其正常工作。我想从父节点创建子级,这样每个子级都有一个父级,每个子级都有一个指向其父级的指针。第一父级的指针是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;
}
c++ pointers linked-list chain
1个回答
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,这会导致不必要地复制intNode*(结构属性)值。

    由于我们没有在任何地方保存nn值,所以导致内存泄漏,因此我们以后不能删除其内容。
  • 最好保留Node*而不是Node的列表:
  • list<Node*> graph;

    这样,我们可以遍历列表并稍后删除动态分配的Node

    for (auto i : graph)
        delete i;
    

    而不是复制intNode*值,我们只是将Node* nn推送到列表:

    graph.push_back(nn);
    


    请注意,it现在是指向指针的指针,因此需要双重解引用:
    cout << (**it).node << endl; cout << (*(*(**it).parent).parent).node;
  • © www.soinside.com 2019 - 2024. All rights reserved.