2012-05-06 195 views
2

我正在使用不相交集合和聯合/查找操作製作C++迷宮程序。C++分配節點指針

我有一個MakeSet(int x)函數,它爲迷宮中的每個整數元素x創建一個新的節點。 (即針對4x4迷宮的1 to 16)。因此,最初每個元素都在其自己的集合中。

我MakeSet看起來像這樣

void Maze::MakeSet(int x) 
{ 
    Node *root = new Node; 
    root->label = x; 
    root->parent = NULL; 
} 

但在我要叫MakeSet多次所有元素進入自己的一套最初CreateMaze()函數。因此,根將不斷被覆蓋。我如何動態分配許多不同的節點?我應該讓它們在數組中分開嗎?

+3

你的代碼真的是這樣嗎?它分配一個新的節點,然後失去對它的所有引用... –

回答

2

您已經分配Node,你只是不保持它。您需要更改函數以返回Node*,並將結果存儲在數組或向量中。

Node* Maze::MakeSet(int x) { 
    Node *root = new Node; 
    root->label = x; 
    root->parent = NULL; 
    return root; 
} 

Node *nodes[16]; 
for (int i = 0 ; i != 16 ; i++) { 
    nodes[i] = Maze::MakeSet(i); 
} 

一個更好的辦法是做Node初始化在構造

Node::Node(int x) : label(x), parent(NULL) { 
} 

您現在可以創建所有集合在一個循環,並存儲指向它們放入數組:

Node *nodes[16]; 
for (int i = 0 ; i != 16 ; i++) { 
    nodes[i] = new Node(i); 
} 
+0

所以當我做一個聯盟(int label1,int label2)時,我必須進入它們各自的陣列位置,對吧?那我怎麼連接這兩個節點呢? – CyberShot

+0

@Cyber​​Shot將成員函數添加到'Node'以實現兩個常用操作 - 一個實例成員'getRoot'和一個靜態成員'union'來實現set union。 'getRoot'將遍歷鏈到根,並將所有節點的父節點設置爲在搜索中找到的最終根。順便說一下,將'parent'設置爲'this'比'NULL'更常見。 – dasblinkenlight

+0

謝謝,但又一個簡單的問題。一旦我通過數組獲取節點,Node * s = getNode(item1);任何後續的union()都不會在數組中改變s?因爲它只返回一個副本。我如何使它實際上改變節點[]數組中的指針?即如何讓getNode()返回對節點[]數組中的節點的引用而不是傳值?即BTNode ** s =&getNode(item1);然後* s-> parent = x;實際上在全局節點中改變s [] array – CyberShot

1

您可以將std::vectorNode對象或指針作爲類成員使用:

class Maze 
{ 
    std::vector<Node> nodes; 
}; 

或者,如果你一定要

class Maze 
{ 
    std::vector<Node*> nodes; 
} 

,並添加創建的節點:

void Maze::MakeSet(int x) 
{ 
    Node *root = new Node; 
    root->label = x; 
    root->parent = NULL; 
    nodes.push_back(root); 
} 

請注意,你必須實現一個析構函數清理內存,當你」重做。這也意味着您應該有一個Maze的複製構造函數和賦值運算符。