ツリー構造を書き、ツリー内のノードを探すための基本的な検索機能を作成しました。ツリー自体は、センチネルノードを使用してすべての端(ルートの親、葉の子)をマークし、検索はノードを介して単純に繰り返され、マッチまたはセンチネルノードにヒットします。検索機能は、ツリーのインスタンス上で呼び出すと正常に機能しますが、ツリーが別のクラスのデータメンバーである場合には機能しません。次のコードでは、 "t.search(1)"は機能しますが、 "embedded_tree.t.search(1)"は無限ループに陥ります。クラスメンバ関数は正常に動作しますが、別のクラスのデータメンバとして呼び出されると無限ループに陥ります
embedded_tree.t.search()の呼び出しが行われたとき、 "& sentinel"の内容はセンチネルノードを正しく指していますが、新しいポインタのようですroot、sentinel.parent、およびsentinel.childの内容と等価ではありません。ここから私は立ち往生し、それを呼び出す方法がわからないので、&のセンチネルは、ツリーの構築時に作成されたポインタと一致します。
#include <iostream>
struct NODE {
int key;
NODE* parent;
NODE* child;
NODE() : key(0), parent(NULL), child(NULL) {};
};
struct TREE {
NODE sentinel;
NODE* root;
TREE()
{
sentinel = *new NODE;
sentinel.parent = &sentinel;
sentinel.child = &sentinel;
root = &sentinel;
}
NODE* search(int k)
{
NODE* x = root;
while (x != &sentinel)
{
if (x->key == k) return x;
x = x->child;
}
return &sentinel;
}
};
struct A {
TREE t;
A() : t(*new TREE()) {};
};
int main()
{
TREE t;
t.search(1);
A embedded_tree;
embedded_tree.t.search(1);
}
'sentinel = * new NODE;'は良い考えではありません。 – alain
't(* new TREE())' - なぜあなたはこれをやっていますか?必要な場合を除いてポインタを割り当てずにポインタを使用しない限り、 'new'は使用しません(ヒント:ここでは必要ではなく、メモリリークを引き起こします)。 –
'embedded_tree.t.search(1);'関数呼び出しをトレースすると、デバッガはあなたに何を伝えますか? –