指针接收的malloc作为参数

时间:2016-06-14 07:03:04

标签: c malloc binary-search-tree

我正在实施二叉搜索树,但由于某些原因我无法添加节点

我的:输入是:

a.value = 5;
add_bst_node(&t,a); 

mystructures:

typedef struct BST_node{
 entity value;
 struct BST_node* left;
 struct BST_node* right;
}BST_node;

typedef struct BST_tree{
 BST_node* root;
}BST_tree;

我添加节点的代码:

void add_bst_node2(BST_node* root,entity* e){
 if(!root){
  root = (BST_node*)malloc(sizeof(BST_node));
  root->value = *e;
  root->left = NULL;
  root->right = NULL;
  return;
 }
 else if(great_than(&root->value,e))
  add_bst_node2(root->left,e);
 else
  add_bst_node2(root->right,e);
 }

 void add_bst_node(BST_tree* t,entity e){
  add_bst_node2(t->root,&e);
  printf("%d\n",t->root==NULL);
 }

有人可以解释为什么我不能添加节点?

3 个答案:

答案 0 :(得分:1)

除了没有在BST_node中传递BST_node**(即add_bst_node2())的双指针,如评论中所述,您也没有正确实现该功能。

您的实现从未真正添加节点,而是进入无限递归。

在这里你可以找到一些关于BST的清晰理论 - http://www.zentut.com/c-tutorial/c-binary-search-tree/

这是对您的代码进行的未经测试的更正。 请注意,我们将指针传递给BST_tree而不是BST_node

void add_bst_node2(BST_tree* tree,entity* e){
    if(!tree->root){
        /* If the binary search tree is empty, we just create a root node */
        tree->root = bst_create_node(e);
        return;
    }

    int is_left  = 0;
    BST_node* current_node = tree->root;
    BST_node* prev   = NULL;

    /* Traverse the tree until we find the proper position for the new node.
     * The position is denoted by 'current_node'
     */
    while(current_node != NULL) {
        prev = current_node;

        if(greater_than(&current_node->value, e)) {
            is_left = 1;
            current_node = current_node->left;
        } else {
            is_left = 0;
            current_node = current_node->right;
        }
    }

    /* We finally know the position where we should add the new node */
    if(is_left)
        prev->left = bst_create_node(e);
    else
        prev->right = bst_create_node(e);
}

我们介绍了另一个创建和初始化节点的功能......

BST_node *bst_create_node(entity *e)
{
    BST_node *n = malloc(sizeof(BST_node));

    n->value = *e;
    n->left = NULL;
    n->right = NULL;

    return n;
}

最后我们改变add_bst_node()

void add_bst_node(BST_tree* t,entity e){
    add_bst_node2(t, &e);
    printf("%d\n", t->root==NULL);
}

答案 1 :(得分:0)

从它看来,a是一个struct BST_node,value是一个变量。您必须将值传递给函数并在那里处理节点创建,或者传递整个构造节点并从现有树中指向它。

答案 2 :(得分:0)

首先是你把一个不必要的结构BST_tree.You以简单的方式做到了

                 struct node
                {
                    int value;
                    node* left;
                    node* right;
                };
                struct node* root;

我建议您尝试使用此代码

        struct node* insert(struct node* r, int data)
        {
          if(r==NULL) // BST is not created created
          {
               r = (struct node*) malloc(sizeof(struct node)); // create a new node
               r->value = data;  // insert data to new node
              // make left and right childs empty
               r->left = NULL;   
               r->right = NULL;
          }
         // if the data is less than node value then we must put this in left sub-tree
          else if(data < r->value){ 
               r->left = insert(r->left, data);
          }
         // else this will be in the right subtree
         else {
               r->right = insert(r->right, data);
          }
         return r;
   }`

`