0

ルート ポインターを使用してバイナリ ツリーを作成しました。

グローバルに宣言したので、すべての関数でルート ポインターを変更することになっているのではないでしょうか。どうすればこれを達成できますか?

ありがとう

// 疑似コード (別の場所で宣言された左、右のポインター)

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
}
4

1 に答える 1

3

これはroot、コードで に有効なアドレスを割り当てていないためです。

有効なノードを指す必要があります。

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

また、C++ では、「グローバル変数」を使用する場合は、名前のない名前空間を使用する必要があります。利点は、グローバル変数によって簡単に導入できる名前の競合を防ぐことです。

namespace
{
  Node * root = NULL;
}

C でコーディングしている場合は、ここで終了します。しかし、C++ を使用しているので、もう 1 つ必要があります。

特に相互に依存する変数が多数ある場合は、グローバル変数の使用を避けるために最善を尽くす必要があります。通常、シングルトン クラスを作成できます。

しかし、シングルトンを使用するのはそれほど複雑ではないと思います。関数に追加の入力パラメーターを追加して、操作するノードを示すだけです。

// @param1(node) can be root or whatever node you want
Node * BST::BuildTree(Node *node, int label)
{
  node->left = changed;
  node->right = changed;
}
于 2012-04-23T02:30:41.470 に答える