首页 > 解决方案 > 如何清理最小生成树

问题描述

我正在开发一个使用 prim 算法使用 MST 的项目:

在完成我的代码和测试之后,我试图清理和释放我计算的 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;
        }
    }

这是我的课程中的一些变量:

Adj_List * array_elements; Adj_Node *head_list; Adj_Node *next_node;

基本上,array_elements 是一个头列表数组,头列表是下一个节点的数组。我遵循了 Adj_List * 的本教程:https ://www.geeksforgeeks.org/prims-mst-for-adjacency-list-representation-greedy-algo-6/ 如果你能帮助我如何解除分配这个元素与本教程的元素相同,我将不胜感激(基本上是给定教程的函数 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;

我认为问题在于我创建了一个链表 array_elements[v].headlist->array_elements[v].headlist-array_elements[v],但我不确定。很高兴知道你的想法。

标签: c++

解决方案


当节点形成一个连通图时,会有多个节点对它们有多个引用。如果您在“边走边删除”的图表上行走重叠路径,您将导致在节点上尝试多次删除,这将导致分段错误(当尝试删除已删除的节点时)。

你有几个选择:

  1. 在构建图表时维护一个节点列表 - 它拥有节点的所有权并负责在清理时删除它们。Astd::vector可以是一个很好的候选人。(这个选项是我的推荐

  2. 在清理时遍历节点并建立一个列表,避免重复。当所有路径都走完后,删除列表中的所有内容。

  3. 使用智能指针 ( std::shared_ptr) 创建节点并将它们复制到节点中以引用“相邻节点”。在清理路径时可以清除对它们的引用。在重置所有引用之前,不会删除节点。


有关悬空引用和智能指针的更多信息,请查看:


推荐阅读