由结构体表示的有向图

a digraph representation by structs

本文关键字:有向图 表示 结构体      更新时间:2023-10-16

我想创建一个有向图。每个Edge都有destination Nodeorigin Node的信息。此外,每个Node都有incomingEdgesoutgoingEdges的列表信息。

我有一个邻接矩阵[][]的图,我想读取矩阵和创建一个新的图。

是代码;

  struct Node
    {
       vector<Edge *> incomingEdges;
       vector<Edge *> outgoingEdges;
    };
    struct Edge
    {
       struct Node destination;
       struct Node origin;
    };

。...

for(int i=0; i<totalNodes; i++)
{
    struct Node nodei;
}

。....

for(int i=0; i<totalNodes; i++)
{
    for (int j=0; j<totalNodes; j++)
    {
        if ( adjacencyMatrix[i][j] == 1)
        {
            struct Edge edgeij;
            edgeij.destination=nodej;
            edgeij.origin =nodei;
            nodei->outgoing.push_back(edgeij); // ???
            nodej->incoming.push_back(edgeij); // ???
        }
    }
}

我不熟悉C/c++。显然我需要一些帮助来改进它。

如何push_back到在struct中声明的指针向量?

当你这样做的时候:

    if ( adjacencyMatrix[i][j] == 1)
    {
        struct Edge edgeij;
        edgeij.destination=nodej;
        edgeij.origin =nodei;
        nodei->outgoing.push_back(edgeij); // ???
        nodej->incoming.push_back(edgeij); // ???
    }

edgeij对象在块的末尾被销毁,使得它非常无用(并且代码无论如何都无法编译,因为您试图在需要指针的地方推送对象)

因为你的vector需要一个指针,你应该使用一个动态分配的Edge:

    Edge* edgeij = new Edge;
    edgeij.destination=nodej;
    edgeij.origin =nodei;
    nodei->outgoing.push_back(edgeij);
    nodej->incoming.push_back(edgeij);
    // now, do not forget to properly delete resources allocated with new

一个更好的设计方案是完全避免原始指针,而更喜欢智能指针,例如std::vector<std::unique_ptr<Node>>