繁体   English   中英

如何清理最小生成树

[英]How to clean up a Minimum Spanning Tree

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

在完成我的代码和测试之后,我试图清理和释放我计算的 prim function,但是我用一个指向不同指针的指针 class 使我的代码变得复杂。

这是我的代码与我的逻辑来释放代码:

    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/如果您能帮助我解决如何释放这个元素与本教程的元素相同,我将不胜感激(对于给定的教程,基本上是 function 清洁)。 提前谢谢你的帮助。

伊迪丝:谢谢你回答我的问题。 我想我忘了提到我正在使用类而不是教程代码中的结构到不同的文件中,例如 adj_node adj_list。 问题是我尝试释放两个指针,比如 (0,1);(1;0),当我运行代码时,它会从执行程序中退出。 我不确定原因。

这就是我要添加的内容,所以也许有一些东西可以澄清我如何分配 memory

        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],但我不确定。 很高兴知道你的想法。

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

你有几个选择:

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

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

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


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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM