Кто-то знает, почему в моем коде есть ошибка сегментации?

Я реализую Graph в C++, и у меня возникает ошибка сегментации, когда я пытаюсь распечатать список смежности, кто-то знает почему? Что я делаю неправильно? Извините за плохой английский.

#include <iostream>
#include <vector>
#include <list>
#include <string>

using namespace std;

class Vertex;

class Edge{
public:
    Edge(Vertex *org, Vertex *dest, int weight){
        origem = org;
        destino = dest;
        peso = weight;
    }

    Vertex* getOrigem(){return origem;}
    Vertex* getDestino(){return destino;}
    int getPeso(){return peso;}

private:
    Vertex* origem;
    Vertex* destino;
    int peso;
};

class Vertex{
public:
    Vertex(string id){
        name = id;
    }

    void addEdge(Vertex *v, int peso){
        Edge newEdge(this, v, peso);
        edges.push_back(newEdge);
    }

    void printEdges(){
        cout << name << ":" << endl;
        for (int i = 0; i < edges.size(); i++)
        {
        Edge e = edges[i];
        cout << e.getDestino()->getName() <<
            " - " << e.getPeso() << endl;
        }
        cout << endl;
    }

    string getName(){return name;}
    vector<Edge> getEdges(){return edges;}

    private:
    string name;
    vector<Edge> edges;
};

class Graph{
public:
    Graph(){
        degree = 0;
    }

    void insert(Vertex* v){
        vertices.push_back(v);
        degree++;
    }

    int getDegree(){return degree;}

    void printGraph(){
        for (int i = 0; i < vertices.size(); i++)
            vertices[i]->printEdges();
    }

    list<Vertex*> adj(Vertex* v){
        vector<Edge> edges = v->getEdges();
        cout << "oi\n";
        list<Vertex*> adj;
        int nEdges = edges.size();
        for(int i = 0; i < nEdges; i++)
            adj.push_back(edges.at(i).getDestino());
        cout << "k\n";
    }

    Vertex* getVertex(int i){return vertices.at(i);}
private:
    vector<Vertex*> vertices;
    int degree;
};


int main(){
    list<list<Vertex*> > listAdj;
    Graph g;

    Vertex v1 = Vertex("Seattle");
    Vertex v2 = Vertex("Portland");
    Vertex v3 = Vertex("Everett");
    Vertex v4 = Vertex("Lynnwood");
    Vertex v5 = Vertex("Northgate");
    Vertex v6 = Vertex("Bellevue");
    Vertex v7 = Vertex("Arlington");
    Vertex v8 = Vertex("Bellingham");


    Vertex *vp1 = &v1;
    Vertex *vp2 = &v2;
    Vertex *vp3 = &v3;
    Vertex *vp4 = &v4;
    Vertex *vp5 = &v5;
    Vertex *vp6 = &v6;
    Vertex *vp7 = &v7;
    Vertex *vp8 = &v8;


    v1.addEdge(vp2, 100);
    v1.addEdge(vp6, 20);
    v2.addEdge(vp1, 100);
    v3.addEdge(vp1, 30);
    v3.addEdge(vp4, 10);
    v3.addEdge(vp7, 20);
    v4.addEdge(vp5, 15);
    v5.addEdge(vp1, 10);
    v6.addEdge(vp1, 20);
    v8.addEdge(vp7, 45);


    g.insert(vp1);
    g.insert(vp2);
    g.insert(vp3);
    g.insert(vp4);
    g.insert(vp5);
    g.insert(vp6);
    g.insert(vp7);
    g.insert(vp8);
    cout << "Cheguei aqui" << endl;

    for(int i = 0; i < g.getDegree(); i++)
        listAdj.push_back(g.adj(g.getVertex(i)));
    int k = 0;
    cout << "Cheguei aqui" << endl;

    for(list<Vertex*> i: listAdj){
        cout << g.getVertex(k)->getName() << ":" << endl;
        list<Vertex*>::const_iterator j = i.begin();
        for(; j != i.end(); j++){
            Vertex *v = *j;
            cout << v->getName() << endl;
        }
        k++;
    }

    g.printGraph();

return 1;
}

1 ответ

Решение

Вы пропустили return adj; в конце Graph::adj(),

Другие вопросы по тегам