2015-04-07 68 views
3

我在寫一個簡單的C++程序來實現使用鄰接表的圖形。我的計劃在下面。我正在使用向量,其中每個索引都是頂點。矢量中的每個槽存儲指向Edge_obj的指針,Edge_obj是鄰接列表中鏈接列表的對象。C++代碼:這是什麼問題?

但是,當我打印使用print_graph圖形的第一邊緣()我的Get-

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_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; 

} 
+4

您的VC存儲本地對象指針,這會導致未定義的行爲。 –

+0

@RonTang非常感謝!解決了。 –

+0

不客氣,維琪見我的回答。 –

回答

1

您的VC存儲本地對象指針,這會導致未定義的行爲。

您可以嘗試通過這種方式來解決:

VC[v1] = new Edge_obj(v2, VC[v1]); 

或別的東西。請注意,你應該使用delete它。或者你可以使用智能指針如unique_ptr進行內存管理。

1

非常感謝Ron的評論。

的問題在這裏:

void Graph::add_edge(int v1, int v2) { 
    Edge_obj obj (v2, VC[v1]); 
    VC[v1] = &obj; 
} 

obj是當地的,其範圍僅限於函數調用。函數調用完成後,它將被銷燬而使指針懸空。

因此,我通過使用不受範圍限制的新內存分配來改進代碼。

void Graph::add_edge(int v1, int v2) { 
    Edge_obj* local = new Edge_obj(v2, VC[v1]); 
    VC[v1] = local; 
}