我正在尝试创建一个由指向节点的指针数组表示的有向图,但是我正在努力将节点添加到图的每个索引中。这是我所拥有的:
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;
不更改任何一个结构,如何将节点正确添加到图形的节点指针数组的索引中?
感谢您的帮助!
答案 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指针的指针。希望您能找到解决方法。