C++;代码:这有什么错? 我编写了一个简单的C++程序,用邻接表实现图形。我的程序如下。我使用向量,其中每个索引是一个顶点。向量中的每个槽存储指向Edge_obj的指针,Edge_obj是邻接列表中链接列表的对象
但是当我使用print_graph()打印图的第一条边时,我得到- 0-->2087138040 我期望0-->3 以下代码有什么问题C++;代码:这有什么错? 我编写了一个简单的C++程序,用邻接表实现图形。我的程序如下。我使用向量,其中每个索引是一个顶点。向量中的每个槽存储指向Edge_obj的指针,Edge_obj是邻接列表中链接列表的对象,c++,c++11,C++,C++11,但是当我使用print_graph()打印图的第一条边时,我得到- 0-->2087138040 我期望0-->3 以下代码有什么问题 #include<iostream> #include<vector> #include <forward_list> using namespace::std; class Edge_obj { public: int V; Edge_obj* next; Edge_obj(int V, Edge
#include<iostream>
#include<vector>
#include <forward_list>
using namespace::std;
class Edge_obj {
public:
int V;
Edge_obj* next;
Edge_obj(int V, Edge_obj* next);
};
Edge_obj::Edge_obj(int V, Edge_obj* next):V(V),next(next) {}
class Graph {
public:
int V;
vector< Edge_obj* > VC;
Graph(int v);
void add_edge(int v1, int v2);
void print_graph ();
};
Graph::Graph(int v):V(v),VC(v,nullptr) {}
void Graph::add_edge(int v1, int v2) {
Edge_obj obj (v2, VC[v1]);
VC[v1] = &obj;
}
void Graph::print_graph() {
cout<<"0-->"<<VC[0]->V;
}
int main()
{
Graph oho(4);
oho.add_edge(0,1);
oho.add_edge(0,2);
oho.add_edge(0,3);
oho.print_graph();
return 0;
}
#包括
#包括
#包括
使用namespace::std;
类边_obj{
公众:
INTV;
边_obj*下一步;
边缘对象(int V,边缘对象*下一个);
};
边obj::边obj(intv,边obj*next):V(V),next(next){
类图{
公众:
INTV;
向量VC;
图形(INTV);
无效添加_边(int v1,int v2);
void print_图();
};
Graph::Graph(intv):v(v),VC(v,nullptr){
无效图::添加边(int v1,int v2){
边_obj obj(v2,VC[v1]);
VC[v1]=&obj;
}
void Graph::print_Graph(){
无法您的VC存储本地对象指针,这将导致未定义的行为
您可以尝试通过以下方式进行修复:
VC[v1] = new Edge_obj(v2, VC[v1]);
或者其他。请注意,您应该在使用后删除它。或者您可以使用智能指针,如unique\ptr
进行内存管理。感谢Ron的上述评论
问题就在这里:
void Graph::add_edge(int v1, int v2) {
Edge_obj obj (v2, VC[v1]);
VC[v1] = &obj;
}
obj是本地的,其作用域仅限于函数调用。函数调用完成后,它将被销毁,指针悬空
因此,我改进了代码,使用了不受范围限制的new和memory分配
void Graph::add_edge(int v1, int v2) {
Edge_obj* local = new Edge_obj(v2, VC[v1]);
VC[v1] = local;
}
您的VC存储本地对象指针,这会导致未定义的行为。@非常感谢!!解决了。