Кто-то знает, почему в моем коде есть ошибка сегментации?
Я реализую 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 ответ
Решение