我试图在二叉搜索树上创建插入函数。 我在这里看了其他问题,但他们不喜欢我的问题。
我可以编译它,但它在下面的注释行崩溃了:
void insertNode(TreeNode** r, int n) {
TreeNode* novono;
novono = createNode(n);
if (*r == NULL){ //corrected
*r = novono;
(*r) -> right = NULL;
(*r) -> left = NULL;
(*r) -> data = n;
}
if (n < ((*r) -> data))
insertNode(&((*r) -> left), n); //SEGMENTATION FAULT HERE
if (n > ((*r) -> data))
insertNode(&((*r) -> right), n); //SEGMENTATION FAULT HERE
}
这是尝试从向量中插入int的主要函数:
int main() {
#define MAX 15
TreeNode* root = NULL;
bool OK = true;
int i = 0,
n,
V[MAX] = { 50, 10, 70, 2, 1, 13, 15, 65, 69, 77, 11, 3, 80, 76, 64};
initTree(&root);
printf("Passou da inicialização");
for ( i = 0 ; i < MAX ; i++ ) {
printf("[%d] ", V[i]);
insertNode(&root, V[i]);
}
这是在插入之前执行的inicialization函数。 (我不认为这是问题,但我把它放在这里只是因为我知道你会要求它。)
void clearTree( TreeNode** r) {
if ( *r != NULL) {
printf("Clear %d\n", (*r)->data);
clearTree(&(*r)->left);
clearTree(&(*r)->right);
free(*r);
*r = NULL;
}
}
void initTree( TreeNode** r) {
if (*r != NULL)
clearTree( &(*r) );
if( *r == NULL)
printf("Limpeza com sucesso !!\n");
else
printf("Limpeza sem sucesso !!\n");
}
按要求创建节点功能:
TreeNode* createNode(int n) {
TreeNode* newNode = (TreeNode*) malloc(sizeof(TreeNode));
if ( newNode != NULL) {
newNode->data = n;
newNode->left =
newNode->right = NULL;
}
return newNode;
}
答案 0 :(得分:3)
首先看......“if(* r = NULL)”应为“if(* r == NULL)”
答案 1 :(得分:2)
第二眼看,我没有看到崩溃,但我看到内存泄漏。如果(* r == NULL)为false,请考虑使用novono在同一函数中发生的事情。我建议你忘记这段代码,并尝试从头开始重新编写它,并尽量避免指向指针 - **。
而不是:
void insertNode(TreeNode** r, int n)
我试试:
/* this error handling would be sufficient for the beginner */
void * xmalloc(size_t size) {
void * ret = malloc(size);
if (!ret) {
printf("error\n");
exit(1);
}
return ret;
}
/* returns root of the tree */
TreeNode * insertNode(TreeNode* r, int n) {
if (!r) return createNode(n);
...
return r;
}
TreeNode * createNode(int n) {
TreeNode * ret = xmalloc(sizeof(TreeNode));
ret->left = left->right = 0;
ret->data = n;
return ret;
}
而不是initTree,只需:
....
TreeNode * root = 0;
root = insertNode(root, 10);
root = insertNode(root, 12);
root = insertNode(root, 20);
root = insertNode(root, 14);
答案 2 :(得分:0)
if (n < ((*r) -> data));
insertNode(&((*r) -> left), n);
相当于:
if (n < ((*r) -> data)) {
;
}
insertNode(&((*r) -> left), n);
很可能不是你想要的。
(GCC与-Wempty-body
(包含在-Wextra
中)会向您发出警告。)