二叉搜索树(C),插入函数中的分段错误

时间:2014-02-02 19:48:18

标签: c binary-search-tree

我试图在二叉搜索树上创建插入函数。 我在这里看了其他问题,但他们不喜欢我的问题。

我可以编译它,但它在下面的注释行崩溃了:

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;
}

3 个答案:

答案 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中)会向您发出警告。)