C 迭代删除BST
我对BST上带有泛型参数的迭代删除代码有一个问题。 我试图了解问题是在与删除相关的代码上,还是在代码的另一部分上。 如果要删除的节点不是根,则在创建的BST上执行代码可以正常工作,但如果要删除根,则删除BST的所有左子树C 迭代删除BST,c,iteration,binary-search-tree,C,Iteration,Binary Search Tree,我对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; s
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);
有什么建议吗?代码是否存在一些我没有看到的可见错误,或者我应该关注代码的另一部分?如果仍然存在左子树,为什么要删除根?请遵循良好的编码实践。因为它是你的代码是任何人都很难遵循,我敢说,将难以为您理解在几周内的时间。特别是:添加评论。使用更有意义的变量名,单字母甚至双字母变量,如x和Dx,使代码难以理解。给出有意义的函数名EliminaNodeTo??在分数命名或大小写下使用。最后,提供struct arb的定义,不要让我们猜测关键数据结构
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);
}