C 二叉搜索树节点删除错误

C 二叉搜索树节点删除错误,c,pointers,binary-tree,binary-search-tree,C,Pointers,Binary Tree,Binary Search Tree,我已经创建了二进制搜索树,并将指向要删除的节点的指针输入到我的*p中 delete方法应该是删除由*p指向的节点,并且应该将带有addtree的子树添加到我的根目录中*pBaum是指向我的根的指针 然而,每次我声明时,我都会在addtree上收到一条名为“冲突类型”的错误消息 Baum = addtree(Baum, p->right); 我还收到一条警告“赋值从整数生成指针而不进行强制转换” My struct包含指向子树的左右指针和指向内容的指针 struct tnode { int

我已经创建了二进制搜索树,并将指向要删除的节点的指针输入到我的
*p

delete方法应该是删除由
*p
指向的节点,并且应该将带有
addtree
的子树添加到我的根目录中
*pBaum
是指向我的根的指针

然而,每次我声明时,我都会在
addtree
上收到一条名为“冲突类型”的错误消息

Baum = addtree(Baum, p->right);
我还收到一条警告“赋值从整数生成指针而不进行强制转换”

My struct包含指向子树的左右指针和指向内容的指针

struct tnode
{
int content;
struct tnode *left; /* linker Teilbaum */
struct tnode *right; /* rechter Teilbaum */
};

// Deletes the node where *p is pointing at

struct tnode  *deletenode(struct tnode *p, struct tnode *pBaum)
{
   struct tnode *Baum = pBaum;

    if ((p->left == NULL) && (p->right == NULL))
    {
      free(p);
    }
    if ((p->left == NULL) && (p->right != NULL))
    {
      Baum = addtree(Baum, p->right);
      free(p);

    }
    if ((p->right == NULL) && (p->left !=NULL))
    {
      Baum = addtree(Baum, p->left);
      free(p);
    }
    if ((p->left != NULL) && (p->right !=NULL))
    {
      Baum = addtree(Baum, p->right);
      Baum = addtree(Baum, p->left);
      free(p);
    }
  return Baum;
}

// Adds the Subtrees to my root

struct tnode *addtree(struct tnode *top, struct tnode *p)
{
if (p == NULL)
    return top;
else
return addtree(addtree(addelement(top, p->content),p-> right),   p->left);

// Adds a node to my Tree

struct tnode *addelement(struct tnode *p, int i)
{
int cond;
if (p == NULL)
{
    p = talloc(); /* make a new node */ p->content = i;
    p->left =p->right =NULL;
}
else if (p->content == i)
{
    return p;
}
else if (i < p->content) /* goes into left subtree */ p->left =addelement(p->left, i);
else /* goes into right subtree */ p->right = addelement(p->right, i);
return p;
}

// Looks for the node which is supposed to get deleted and returns a pointer to it 

struct tnode *searchnode(struct tnode *p, int nodtodelete)
{
if (p == NULL)
{
    printf("Baum ist leer oder Element nicht vorhanden \n");
    return NULL;
}
if ( p -> content == nodtodelete)
{
    return p;
}
if (p->content < nodtodelete)
{
    return searchnode (p->right, nodtodelete);
}
if (p->content > nodtodelete)
{
    return searchnode(p->left, nodtodelete);
}
}
}

int main()
{
struct tnode *Baum = NULL;
struct tnode *tmpPos = NULL;
Baum = addelement (Baum, 32);
Baum = addelement(Baum, 50);
Baum = addelement(Baum, 60);
tmpPos = searchnode(Baum,50);
Baum = deletenode(tmpPos, Baum);
}
structNode
{
智力内容;
结构tnode*左;/*链接器Teilbaum*/
结构tnode*右;/*rechter Teilbaum*/
};
//删除*p指向的节点
struct tnode*deletenode(struct tnode*p,struct tnode*pBaum)
{
结构tnode*Baum=pBaum;
如果((p->left==NULL)和&(p->right==NULL))
{
自由基(p);
}
如果((p->left==NULL)和&(p->right!=NULL))
{
Baum=addtree(Baum,p->right);
自由基(p);
}
如果((p->right==NULL)和&(p->left!=NULL))
{
Baum=addtree(Baum,p->left);
自由基(p);
}
如果((p->left!=NULL)和&(p->right!=NULL))
{
Baum=addtree(Baum,p->right);
Baum=addtree(Baum,p->left);
自由基(p);
}
返回波姆;
}
//将子树添加到我的根目录
struct tnode*addtree(struct tnode*top,struct tnode*p)
{
if(p==NULL)
返回顶部;
其他的
返回addtree(addtree(addelement(top,p->content),p->right),p->left);
//将节点添加到我的树中
struct tnode*addelement(struct tnode*p,int i)
{
int-cond;
if(p==NULL)
{
p=talloc();/*创建一个新节点*/p->content=i;
p->left=p->right=NULL;
}
否则如果(p->content==i)
{
返回p;
}
否则如果(icontent)/*进入左子树*/p->left=addelement(p->left,i);
else/*进入右子树*/p->right=addelement(p->right,i);
返回p;
}
//查找应该删除的节点并返回指向该节点的指针
struct tnode*searchnode(struct tnode*p,int nodtodele)
{
if(p==NULL)
{
printf(“Baum ist leer order Element nicht vorhanden\n”);
返回NULL;
}
如果(p->content==nodtodelet)
{
返回p;
}
如果(p->contentright,nodtodelet);
}
如果(p->content>NodeToDelete)
{
返回searchnode(p->left,NodeToDelete);
}
}
}
int main()
{
struct tnode*Baum=NULL;
struct tnode*tmpPos=NULL;
Baum=加法(Baum,32);
Baum=加法(Baum,50);
Baum=加法(Baum,60);
tmpPos=searchnode(Baum,50);
Baum=删除节点(tmpPos,Baum);
}

在代码中调用函数之前,您是否声明了函数?我在文件顶部声明addtree和addelement函数,冲突类型的错误消失。

我不确定这是否是因为您只包含了部分代码,但您的addtree函数不完整:

struct tnode *addtree(struct tnode *top, struct tnode *p)
{
if (p == NULL)
    return top;
else
return addtree(addtree(addelement(top, p->content),p-> right),   p->left);
此函数需要以括号结束:

struct tnode *addtree(struct tnode *top, struct tnode *p)
{
    if(p == NULL)
        return top;
    return addtree(addtree(addelement(top, p->content), p->right), p->left);
}

为了使编译器不会抱怨在非void函数中没有返回值,最好也去掉else。

实际的错误消息是什么?错误:“addtree”的类型冲突否,完整的错误消息,包括文件名和行号以及错误的其余部分。阅读、组织代码,更具体地说problem@RobinSchmidt我不想发布整个代码。如果你想,我可以“不,准备一个,显示有问题的行为/错误。”。