我对带有通用参数的BST上的“迭代删除”代码有疑问。 我试图理解问题是关于代码相对于删除还是代码的另一部分。 如果要删除的节点不是根节点,则在创建的BST上执行代码可以正常工作,但如果我想删除根节点,则会删除BST的所有左子树。
struct arb *eliminanododato(struct arb *root, void *k, COMP fun,int dim)
{
struct arb *p=NULL;
struct arb *curr=root;
struct arb *y=NULL;
struct arb *x=NULL;
while(curr!=NULL && fun(curr->dato,k)!=0)
{
p=curr;
if(fun(curr->dato,k)<0)
curr=curr->Dx;
else
curr=curr->Sx;
}
if(curr==NULL)
return root;
if(curr->Sx==NULL || curr->Dx==NULL)
y=curr;
else
{
y=curr->Dx;
p=curr;
while(y->Sx!=NULL)
{
p=y;
y=y->Sx;
}
}
if(y->Sx!=NULL)
x=y->Sx;
else
x=y->Dx;
if(p==NULL)
root=x;
else if(y==p->Sx)
p->Sx=x;
else
p->Dx=x;
if(y!=curr)
{
copia_dato(curr,0,y,0,sizeof(struct arb));
}
free(y);
return(root);
}
copia_dato功能是:
void copia_dato(void *dest, int dpos, void *src, int spos, int dim)
{
void *dest_addr=(void *)dest+(dpos*dim);
void *src_addr=(void *)src+(spos*dim);
memcpy(dest_addr,src_addr, dim);
}
有什么建议吗?代码是否有一些我看不到的可见错误,或者我应该关注代码的另一部分?