2

すべてのノード (または頂点) がリストにまとめられた単純なグラフを作成しています。各ノードには、最初のリスト内の他の複数のノードを指し、これらのエッジを呼び出すことができるポインターのリストがあります。たとえば、単純なグラフがA -> BありA -> C、Nodeがエッジ Aへのポインターのリストを持っているBとします。C

グラフを作成するときは、まずノードを作成し、そのノードに関連するもの (重みやその他の属性) を入力します。次に、そのノードをすべてのノードの「マスター」リストに追加します。その後、そのノード (リストの最後のオブジェクト) のアドレスを関数に渡して、任意の親ノードに追加します。

AddChildNode(&MasterListOfNodes.back(), NameOfParent)

以下は、子ノードを親に追加するためのコードです

void GraphReader::AddChildNode(Vertex * const aChildVertex, const string aParent)
{
    for(list<Vertex>::iterator it = MasterListOfNodes.begin(); it != MasterListOfNodes.end(); it++)
    {
        if(it -> getName().compare(aParent) == 0)
        {
            it -> addEdge(aChildVertex);
            break;
        }
    }
}

addEdge は単に新しい子を親の「エッジ」リストに追加します。

const void Vertex::addEdge(Vertex * aEdge) {mEdges.push_back(aEdge);}

私が抱えている問題は、エッジのリストが、リスト自体内の実際のオブジェクトではなく、リスト オブジェクトのコピーを指していることです。

VS とルート ノードとエッジの出力

注: ルート ノードのアドレス (コマンド プロンプト出力) は、次のように検出されました。

for (list<Vertex>::iterator it = MasterListOfNodes.begin(); it != MasterListOfNodes.end(); it++)
{
    cout << "Name: " << it->getName() << " | Address: {" << &(*it) << "}" << endl;
}

マスター ノードを指すエッジのリストを作成するにはどうすればよいですか?

4

1 に答える 1

0

使用する場合:list<Vertex>リスト データ構造は、頂点がメモリに格納される方法を管理します。

使用する必要があるのは次のとおりです。list<Vertex *>

例:

int main ()
{
    Vertex * a = new Vertex (..);

    list<Vertex*> v ();

    v.add(a);

    if (a == v[0])
    {
        // both points at the same Vertex in memory
    }

    return 0;
}
于 2013-03-29T14:40:35.980 に答える