C++ 如何清理最小生成树

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;

我正在从事一个使用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;
        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;