C ++在有向图中创建指向节点的指针数组

时间:2018-09-04 03:36:47

标签: c++

我正在尝试创建一个由指向节点的指针数组表示的有向图,但是我正在努力将节点添加到图的每个索引中。这是我所拥有的:

struct Node {
    int index;                 
    list<Node*> outgoingNodes; 
};

struct Graph {
    Node* nodePointers; // Array of pointers to nodes in graph
    int N;              // Number of nodes in graph       
};

这是我创建图表的方式:

Graph* graph = new Graph();
graph->N = 7;
graph->nodePointers = new Node[graph->N];

然后我尝试通过以下方式将节点添加到图中的索引0中,但出现错误:“操作数类型为'Node'和'Node *'”:

Node* a = new Node();
a->index = 0;
graph->nodePointers[0] = a;

不更改任何一个结构,如何将节点正确添加到图形的节点指针数组的索引中?

感谢您的帮助!

3 个答案:

答案 0 :(得分:2)

Node* nodePointers是指向Node数组的指针。如果要使用Node指针数组,则需要将其声明为Node** nodePointers,并使用new Node*[graph->N]分配该数组:

struct Graph {
    Node** nodePointers; // Array of pointers to nodes in graph
    int N;              // Number of nodes in graph       
};

int main() {
    Graph* graph = new Graph();
    graph->N = 7;
    graph->nodePointers = new Node*[graph->N];
    ...
}

答案 1 :(得分:2)

第一:

struct Node {
    int index;                 
    list<Node*> outgoingNodes; 
};

尽管正确,但没有明显的原因它是无效的。几乎总是比列表更喜欢向量。它很容易使用,但是占用的内存更少,并且在几乎所有可能的用例上都可以更快地工作:

struct Node {
    int index;                 
    std::vector<Node*> outgoingNodes; 
};

接下来,代码:

struct Graph {
    Node* nodePointers; // Array of pointers to nodes in graph
    int N;              // Number of nodes in graph       
};

持有一个Node对象块,而不是指向节点的指针。最好的方法是使用指针向量:

struct Graph {
    std::vector<std::unique_ptr<Node>> nodePointers; // pointers to nodes in graph

};

这样,解除分配和内存管理将是自动的。

然后您的用法示例变为:

// are you sure graph has to be on the heap?
auto graph = std:: make_unique<Graph>();
graph->nodePointers.resize(7);

然后您可以通过以下方式将节点添加到图中的索引0:

graph->nodePointers[0] = std::make_unique<Node>();
graph->nodePointers[0]->index = 0;


这是更好的方法,但是如果您坚持:

  

不更改任何一个结构,如何正确添加一个   节点进入图的节点指针数组的索引中?

然后,您应该注意“图形的数组”不是由指针组成的,而是由节点组成的。因此添加节点的方式有所不同:

// you can still allocate the graph on the heap, but the following way is safer
Graph graph;
graph.N = 7;
graph.nodePointers = new Node[graph.N];

但是现在nodePointers是一个错误的名词,因为它应该被命名为节点(而不是指针)。

然后通过以下方式将节点添加到图形的索引0中(到此为止,它已经被构造):

graph->nodePointers[0].index = 0;

添加边缘看起来不错:

graph->nodePointers[0].outgoingNodes.push_back(&graph->nodePointets[2]);

答案 2 :(得分:0)

在第graph->nodePointers[0] = a;行将其更改为graph->nodePointers[0] = *a;,它将起作用。

现在让我解释一下,假设您想要一个int数组,然后可以将其声明为int x[10] or int *x=new int(10)。在第二种情况下,x显示的是一个指向int对象而不是int指针的指针。希望您能找到解决方法。