バイナリツリーをテストするプログラムを作成しました。プログラムを実行すると、プログラムがクラッシュするようです(btree.exeが機能しなくなり、Windowsが解決策をチェックしています...)。戻り値0の後のsegfault。
デバッガで実行し、break_tree()の原因と思われる関数にブレークポイントを設定すると、期待通りに実行されてメイン関数に返されたように見えます。 Mainはプログラムから返されますが、カーソルはdestroy_tree()にジャンプし、カーソルは自己内部で反復してループします。
最小コードサンプルは以下のとおりですので、即座に実行できます。私のコンパイラはMinGWで、私のデバッガはgdbです(私はCode :: Blocksを使用しています)。
#include <iostream>
using namespace std;
struct node
{
int key_value;
node *left;
node *right;
};
class Btree
{
public:
Btree();
~Btree();
void insert(int key);
void destroy_tree();
private:
node *root;
void destroy_tree(node *leaf);
void insert(int key, node *leaf);
};
Btree::Btree()
{
root = NULL;
}
Btree::~Btree()
{
destroy_tree();
}
void Btree::destroy_tree()
{
destroy_tree(root);
cout<<"tree destroyed\n"<<endl;
}
void Btree::destroy_tree(node *leaf)
{
if(leaf!=NULL)
{
destroy_tree(leaf->left);
destroy_tree(leaf->right);
delete leaf;
}
}
void Btree::insert(int key, node *leaf)
{
if(key < leaf->key_value)
{
if(leaf->left!=NULL)
insert(key, leaf->left);
else
{
leaf->left = new node;
leaf->left->key_value = key;
leaf->left->left = NULL;
leaf->left->right = NULL;
}
}
else if (key >= leaf->key_value)
{
if(leaf->right!=NULL)
insert(key, leaf->right);
else
{
leaf->right = new node;
leaf->right->key_value = key;
leaf->right->left = NULL;
leaf->right->right = NULL;
}
}
}
void Btree::insert(int key)
{
if(root!=NULL)
{
insert(key, root);
}
else
{
root = new node;
root->key_value = key;
root->left = NULL;
root->right = NULL;
}
}
int main()
{
Btree tree;
int i;
tree.insert(1);
tree.destroy_tree();
return 0;
}
これ以外にも、これらの問題をデバッグするために、Code :: Blocks組み込みデバッガからDDDに切り替える予定です。私は、DDDがポインタのアドレスを表示するのではなく、視覚的にオブジェクトへのポインタを表示できると聞きました。これらのタイプの問題(データ構造とアルゴリズムの問題)を解決するのにスイッチが役立つと思いますか?
おかげでそれを実行しようとしないので、それがNULLであることを確認したときに、メインリターン – Steve
クール。とにかく、すべてをNULLにリセットすることをお勧めしますが、それは良いプログラミングの練習です。 – PaV