二分探索木からノードを削除する機能を実装しています。関数のプロトタイプが設定されており、変更できません。学校の課題です。私のコード:
typedef struct tBSTNode {
char Key;
struct tBSTNode * LPtr;
struct tBSTNode * RPtr;
} *tBSTNodePtr;
void BSTDelete (tBSTNodePtr *RootPtr, char K) {
tBSTNodePtr *tmp;
if (*RootPtr != NULL) {
if (K < (*RootPtr)->Key)
BSTDelete(&(* RootPtr)->LPtr, K);
else if (K > (*RootPtr)->Key)
BSTDelete(&(* RootPtr)->RPtr, K);
else {
if ((* RootPtr)->LPtr == NULL) {
/* there is only right branch or none*/
tmp = RootPtr;
*RootPtr = (* RootPtr)->RPtr;
free(*tmp);
*tmp = NULL;
}
else if ((* RootPtr)->RPtr == NULL) {
/* there is only left branch or none*/
tmp = RootPtr;
*RootPtr = (* RootPtr)->LPtr;
free(*tmp);
*tmp = NULL;
}
else
/* there are both branches, but that is for another topic*/
}
}
}
このコードは、削除するノードに接続されているブランチがない場合に備えて正しく機能します。*tmp = NULL;に問題があると思います。行と私は自分のアドレスをブランチの残りの部分に失っていますが、一方で、この行が含まれていない場合は SEGFAULT を取得しており、その理由を理解しようとしています.
編集:
わかりました、今私は間違いがどこにあったかを知っています。ばかげた間違いです。tBSTNodePtr tmp;を使用するべきでした。tBSTNodePtr *tmp;の代わりに