C++ 如何清理最小生成树
我正在从事一个使用MST并使用prim算法的项目: 在完成代码和测试后,我试图清理和释放我计算的prim函数,但我用指向不同指针的指针类使代码复杂化 这里是我的代码和解除分配代码的逻辑:C++ 如何清理最小生成树,c++,C++,我正在从事一个使用MST并使用prim算法的项目: 在完成代码和测试后,我试图清理和释放我计算的prim函数,但我用指向不同指针的指针类使代码复杂化 这里是我的代码和解除分配代码的逻辑: Adj_Node *curr_element; Adj_Node *next_element; for (int i = 0; i < n_nodes; i++) { curr_element = array_elements[i].head_list;
Adj_Node *curr_element;
Adj_Node *next_element;
for (int i = 0; i < n_nodes; i++)
{
curr_element = array_elements[i].head_list;
while (curr_element != nullptr)
{
std::cout << curr_element.dest_node << "\t";
next_element = curr_element[i].next_node;
delete curr_element;
curr_element = next_element;
}
}
基本上,array_元素是头列表的数组,头列表是下一个节点的数组。
我按照本教程学习Adj_列表*:
如果您能帮助我如何释放这个元素,它与教程中的元素相同,我将非常感激(对于给定的教程,基本上是一个函数clean)。提前谢谢你的帮助
伊迪丝:
谢谢你回答我的问题。我想我忘了提到我使用的是类,而不是教程代码中的结构到不同的文件中,比如adj_node adj_list。问题是我试图释放两个指针,比如(0,1);(1;0),当我运行代码时,它会从执行程序中转移。我不确定原因
这就是我要添加的内容,所以可能有一些东西可以澄清我如何分配内存
Adj_Node *new_node = new Adj_Node(v, w);
// Store head_list of array_heap elements into head_list
new_node->next_node = array_elements[u].head_list;
// And store array_heap to node
array_elements[u].head_list = new_node;
// Since graph is undirected, add an edge from dest to src also
new_node = new Adj_Node(u, w);
new_node->next_node = array_elements[v].head_list;
array_elements[v].head_list = new_node;
我认为问题在于我创建了一个linkedlist数组元素[v]。headlist->array元素[v]。headlist-array元素[v],但我不确定。很高兴知道您的想法。当节点形成一个连接图时,将有多个节点引用它们。如果在图中走重叠路径“边删除边删除”,将导致在节点上尝试多次删除,这将导致分段错误(当尝试删除已删除的节点时) 您有几个选择:
std::vector
可以很好地实现这一点。(这是我的建议)
std::shared_ptr
)创建节点,并在节点中复制它们以引用“相邻节点”。在清理时遍历路径时,可以清除对它们的引用。在重置所有引用之前,不会删除节点
有关悬挂引用和智能指针的更多信息,请参阅:
- 本文件:
- 本文:
- 斯科特·迈耶的书:
std::
容器替换你自制的容器。很难说你到底犯了什么错误以及如何修复它。但是,一般来说,您需要确定谁是任何数据的所有者,谁是数据的公正用户。定义后,您可以首先清理“用户”数据结构,只需放弃指向已使用对象的指针,然后清理拥有的数据结构,删除指向的对象。在通过链从数组元素[i]中删除所有对象之后。head\u list
,它成为一个悬空引用,您需要将数组元素[i]设置为空。head\u list
为空ptr。我已经对我的问题进行了更改,感谢您回答我的问题,我尝试了您的解决方案@Den Jason,但只适用于由于某种原因不相关的元素,例如(0,1)(2,3)。当我创建一个连接的网络时,比如(0,1)(1,2),代码删除会从执行程序中退出。请告诉我你的想法。我想我不允许使用容器选项。
Adj_Node *new_node = new Adj_Node(v, w);
// Store head_list of array_heap elements into head_list
new_node->next_node = array_elements[u].head_list;
// And store array_heap to node
array_elements[u].head_list = new_node;
// Since graph is undirected, add an edge from dest to src also
new_node = new Adj_Node(u, w);
new_node->next_node = array_elements[v].head_list;
array_elements[v].head_list = new_node;