2012-06-08 61 views
1

鄰接列表上工作的鄰接表 - >有向加權圖C++指針和結構

一類看起來像這樣的,即首部:

class CGraph; 
class CMap { 
public: 
    //voided constructors and destructors 
    //functions one is: 
    void SetDirGraph(string commands); 

private: 
    CGraph* m_myMap; 
}; 

第二類:

class CNode { 
public: 
    //voided constructor and desctructor 
    int m_distance, m_vert; 
    bool m_isKnown; 
}; 

typedef struct edges { 
    int v2, weight; 
} edge; 

class CGraph { 
public: 
    CGraph(int map_size); 
    ~CGraph(void); 

    void AddMap(int v1, int v2, int weight); 
    void AddEndVert(int v2, int weight); 

private: 
    list<edge> List; 
    int size; 

public: 
    CNode* verts; 
}; 

我正在從文件中讀取頂點,並且工作正常。我的問題是我在創建基於給定代碼的鄰接列表時遇到問題。我想首先使用指向列表的指針並且它不能正常工作。我不知道如何創建指向列表的指針而不寫入它們。

void CMap::SetDirGraph(string command) { 
    istringstream buffer(command) 
    char ch; 
    int num, vert1, vert2, weight; //specify vertices and weight and number of vertices 

    buffer>>ch; //throw away first character (not needed) 
    buffer>>num // size of vertices 

    while(!buffer.eof()) { // keep reading until end of line 
     buffer>>v1;   // vertex start 
     buffer>>v2;   // vertex end 
     buffer>>weight; 

     m_myMap = new CGraph(map_size); //initialize m_myMap. 
     m_myMap->verts->m_vert = v1; // mymap->verts->vert points to first edge 
     m_myMap->AddMap(v1, v2, weight); // create list? 
     m_myMap->AddEndVert(v2, weight); //create list? push v2 and weight on my list using my list. 
    } 
} 

我試過幾種不同的方式和我一直困惑自己,在正確的方向上的任何一點將是真棒。

編輯: 如果需要製作,我還有更多的代碼,只是發佈主要內容。 我的意思是「不工作」是因爲我只是在寫上一個頂點。我不知道是否應該使用m_myMap創建一個數組(嘗試過,但仍然會寫入並獲取內存錯誤)。沒有編譯器錯誤。

+0

「不工作」 - 請更具描述性。什麼不工作,你做了什麼調試? –

+0

編輯,真的只是混淆了我如何工作我的指針不覆蓋我以前的數據。 –

回答

1

我不知道如何創建指向列表的指針而不寫入它們。

除了你的應用程序中,這個問題的答案是new運營商,我以爲你是知道的,因爲你的示例代碼中使用它。像int * a = new int(42);這樣的代碼爲堆上的int分配內存,並且當它不再需要時負責清理它。因此,您可以完全控制變量的可用時間。另一方面,在int x = 42; int * a = &x;中,x將在超出範圍時自動清除,而a將成爲指向內存塊的指針,該塊不再有有意義的數據。如果您嘗試對其進行取消引用,則會遇到未定義的行爲,如果幸運的話,您的程序將會崩潰。

如果您可以使用C++ 11標準或提供智能指針的庫,那麼您應該儘可能地自己管理指針。智能指針是一個持有分配內存的對象,當它被破壞時會自動釋放它。更具體的信息在很大程度上取決於您正在使用哪種智能指針。使用智能指針的原因是你自己做管理是單調而且容易出錯的。如果你沒有delete你已經分配的指針,你的應用程序將繼續分配更多的內存,直到它有一天爆炸(取決於你分配的內存頻率和內存量)。這被稱爲泄漏。如果您不止一次致電delete,您的計劃也將被解除。這是在您的應用程序C++ 11 shared_ptr一個例子:

class CMap 
{ 
    private: 
    std::shared_ptr<CGraph> m_myMap; 
    // etc. 
}; 

// in SetDirGraph 
m_myMap.reset(   // if the smart pointer has previously been managing 
         // memory, it will free it before allocating new 
    new CGraph(map_size) // allocate CGraph as before 
); 

除此之外,什麼希望回答你的問題,我遇到了幾個潛在的問題,關於你的代碼:

  • 肯定錯誤: 在SetDirGraph你設置m_myMap->verts->m_vert = v1m_myMap->verts是一個指針。您剛剛創建了m_myMap,因此verts未初始化,因此指向一個隨機內存塊。然後您嘗試通過m_myMap->verts->m_vert = v1解除引用。這是行不通的。您需要先創建verts,即verts = new CNode;

  • typedef struct edges { /* etc */ } edge;是C構建體,並且沒有必要在C++中typedef包裝。它的工作,和所有的,但它確實是多餘的,許多這些結構的污染只是你工作的命名空間。

  • 你真的需要擺在首位的指針?您提供的摘要不會暗示您爲什麼需要使用它們。您會希望將指針的使用量降至最低(或至少使用智能指針,參見上文)

+0

謝謝,我正在做一個完整的Dumba **。我試圖在錯誤的地方創建圖表。我最終創建了從AddMap和AddEndVert指向我的列表的指針。不過謝謝你的幫忙。一些像typedef這樣的東西不是由我寫的,而是由其他人寫的。但再次感謝! –