2015-06-01 39 views
-5

我正在C++中实现一个Graph,当我尝试打印邻接列表时,我遇到了分段错误,有人知道为什么?我究竟做错了什么?对不起,英文不好。有人知道为什么我的代码中存在这种分段错误?

#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()结束。

相关问题