представление орграфа структурами

0

Я хотел бы создать орграф. Каждый Edge имеет информацию об destination Node origin Node. Кроме того, каждый узел имеет информацию о списке incomingEdges и outgoingEdges.

У меня есть граф adjacencyMatrix [] [], и я хочу прочитать матрицу и создать новый график.

вот код;

  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 к вектору указателя, объявленного в структуре?

  • 0
    Какой у вас вопрос?
  • 0
    извините, вопрос обновлен. Как я могу push_back на вектор указателя, объявленного в структуре?
Теги:
graph
graph-theory

1 ответ

1

Когда вы выполните:

    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 уничтожается в конце блока, что делает его довольно бесполезным (и код в любом случае не компилируется, поскольку вы пытаетесь нажать объект, где ожидается указатель)

Поскольку ваш вектор ожидает указателя, вы должны использовать динамически выделенный 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>>.

  • 0
    Кроме того, я бы рекомендовал определить конструктор класса Edge, который принимает два параметра, то есть два узла, источник и пункт назначения. Довольно бессмысленно создавать Edge без узлов. Что ж, конструктор может даже вызвать push_back на двух узлах, что делает код в блоке if довольно простым, то есть в основном new Edge(nodei,nodej) . Просто мои два цента.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню