このタイプの問題で助けが必要になる可能性のあるこの質問の将来の視聴者のために: 2つの関数 (InsertNode() と InTree()) を組み合わせて修正しました。これが悪い習慣であるかどうかはわかりません。それが実際に問題を解決するのか、それとも単にそれを隠すだけなのか、あなたたちは知っていますが、うまくいっているようです...
このWebサイト(および他のWebサイト)でさまざまな回答を調べましたが、役に立たなかった解決策が得られました(試してみて機能しなかった、またはプログラムと変わらなかった)。挿入関数 (私はそれを分離しましたが、これが問題のあるコードだと思います) には、プログラムがクラッシュする原因となるバグがどこかにあります。
NP InTree(NP Node,NP Root)
{
if (Root == NULL)
{
Root=Node;
return Root;
}
else
{
if (Node->Input < Root->Input)
{
return InTree(Node,Root->Left);
}
else if (Node->Input > Root->Input)
{
return InTree(Node,Root->Right);
}
else
{
puts("Duplicate");
return NULL;
}
}
}
void InsertNode(int I, TP Tree)
{
NP Node;
Node=(NP)malloc(sizeof(struct AVLNode));
InitializeNode(Node);
Node->Input=I;
Node->Height=0;
Node->Left=NULL;
Node->Right=NULL;
InTree(Node,Tree->Root);
Tree->Size++;
}
NP はノード ポインタ、TP はツリー ポインタです。
Node 変数は、InsertNode() を通じて送信される初期化されたノードです。
void InitializeTree(TP Tree)
{
Tree->Root=NULL;
Tree->Size=0;
}
void InitializeNode(NP Node)
{
Node->Input=0;
Node->Height=0;
}
上記は、必要な場合に備えて、私の Initialize 関数です。
ツリーのメモリは、関数が呼び出される前にメイン クラスに割り当てられます。
私がテストで確認した主な問題は、Root が Node と等しくなると、それが null のままになることです。
問題を乗り越える方法はありますか?