Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 迭代删除BST_C_Iteration_Binary Search Tree - Fatal编程技术网

C 迭代删除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

我对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);

有什么建议吗?代码是否存在一些我没有看到的可见错误,或者我应该关注代码的另一部分?

如果仍然存在左子树,为什么要删除根?请遵循良好的编码实践。因为它是你的代码是任何人都很难遵循,我敢说,将难以为您理解在几周内的时间。特别是:添加评论。使用更有意义的变量名,单字母甚至双字母变量,如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);
}