2012-04-23 7 views
0

私はルートポインタを使ってバイナリツリーを構築しました。ポインタをグローバルにするC++

私はglobalyを宣言しているので、すべての関数でルートポインタを変更する必要はありませんか?これをどのように達成するのですか?

//擬似コード

おかげで(左は、右のポインタは、他の場所で宣言された)

Node * root = new Node; 


Node * BST::BuildTree(int label) 
{ 
     root->left = changed; 
     root->right = changed; 
} 

Node * BST::GetNode(int label) 
{ 


    BTNode *ptr = root; 

    cout << root->right; //This gives me a seg fault since root is still NULL and not changed 
} 
+0

「ルート」をどこに割り当てるかわかりません。実際、私が言うことができる限り、 'BuildTree'も壊れるはずです。その理由は、' root'が 'Node'を指し示すことはありません。 – cHao

+0

私はそれを修正したと思う –

+0

グローバル変数を使用する必要はほとんどありません。特にC言語では、関数を参照する変数があるので、自由にルートを変更できます。 – paxdiablo

答えて

3

あなたのコードでは、rootに有効なアドレスを割り当てていないためです。それは有効なノードを指している必要があります

:あなたは、「グローバル変数」を使用したいとき

void BST::CreateRoot() 
{ 
    root = new (std::nothrow) Node; 
} 

そして、C++で、あなたはunnamed namespaceを使用する必要があります。利点は、グローバル変数によって簡単に導入される名前の競合を防ぐことです。

namespace 
{ 
    Node * root = NULL; 
} 

C言語でコーディングする場合は、ここで終わります。しかし、C++を使用しているので、もっと多くのことがあります。

特にお互いに依存するものがたくさんある場合は、avoid using global variablesにお試しください。通常、シングルトンクラスを作成できます。

しかし、あなたのケースはシングルトンを使用するのが難しいとは思いません。関数に余分な入力パラメーターを追加するだけで、どのノードを操作するかを指定できます。

// @param1(node) can be root or whatever node you want 
Node * BST::BuildTree(Node *node, int label) 
{ 
    node->left = changed; 
    node->right = changed; 
}