C 从btree删除-未分配要释放的指针

C 从btree删除-未分配要释放的指针,c,pointers,tree,binary-tree,C,Pointers,Tree,Binary Tree,我收到一个“未分配释放的指针”错误。现在我知道这个节点实际上存在于我的树中(假设我的插入和搜索工作正常),但是当我删除一个节点时,我得到了一个错误。如能对此有所了解,将不胜感激 int set_delete(set_t *set, int del_val) { /* TODO: readd delete child nodes */ struct tree_node *node; node = set->root; *node = tree_search

我收到一个“未分配释放的指针”错误。现在我知道这个节点实际上存在于我的树中(假设我的插入和搜索工作正常),但是当我删除一个节点时,我得到了一个错误。如能对此有所了解,将不胜感激

int set_delete(set_t *set, int del_val)
{
    /* TODO: readd delete child nodes */

    struct tree_node *node;

    node = set->root;
    *node = tree_search(&node, del_val);

    if (node != NULL) {
        free(node);
        return 1;
    }


    return 0;   
}

struct tree_node tree_search(struct tree_node **node, int search_val) {
    if(!(*node)) {
        return **node;
    }

    if ((*node)->val == search_val) {
        return **node;
    } else if ((*node)->val > search_val) {
        tree_search(&(*node)->left, search_val);
    } else if ((*node)->val < search_val) {
        tree_search(&(*node)->right, search_val);
    }

    return **node;

}
int set\u delete(set\u t*set,int del\u val)
{
/*TODO:读取并删除子节点*/
结构树节点*node;
node=set->root;
*节点=树搜索(&node,del_val);
如果(节点!=NULL){
自由(节点);
返回1;
}
返回0;
}
结构树节点树搜索(结构树节点**节点,整数搜索值){
如果(!(*节点)){
返回**节点;
}
如果((*节点)->val==搜索值){
返回**节点;
}else if((*节点)->val>search_val){
树搜索(&(*节点)->左,搜索值);
}else if((*节点)->val右,搜索值);
}
返回**节点;
}

正如Nik Bougalis和Joachim Pileborg所指出的,问题在于tree_搜索的返回值。您必须返回一个指向该节点的指针,以便可以使用free删除它,当然前提是它最初是使用malloc分配的

struct tree_node * tree_search( struct tree_node *node, int search_val)
{
      if( node == 0 )
      {
         return 0; // not found
      }
      if( node->val == search_val)
      {
         return node; // found
      }
      if( node->val > search_val)
      {
          return tree_search( node->left, search_val); // search left tree
      }
      return tree_search( node->right, search_val); // search right tree
}

提示:您正在返回一个节点的副本。该副本位于堆栈上,从未使用
malloc
分配,因此您不能将其传递给
free
。首先,您不会将其分配给
*节点
树搜索中的任何位置,因此传递指向指针的指针没有任何用处。其次,不返回指针,而是按值返回。第三,函数中有两个分支,您不需要更改节点或其指向的对象。小结:你的搜索功能有很大缺陷。