2013-11-25 108 views
0

我的链表结构是删除在二叉搜索树用C

typedef struct ll 
{ 
int data; 
struct ll *left; 
struct ll *right; 
}node; 

我删除功能

void delete(node **parent,node **root,int n) 
{ 
if((*root)==NULL) //if tree is empty then return 
{ 
    printf("No tree\n"); 
    return; 
} 
else 
{ 
    if(((*root)->data)==n) 
    { 
    free(*root); 
    return; // if head is the node to be deleted 
    } 
    else if(((*root)->data)<n) 
    { 
    (*parent)=(*root); 
    (*root)=(*root)->right; 
    } 
    else(((*root)->data)>n); 
    { 
    (*parent)=(*root); 
    (*root)=(*root)->left; 
    } 
    while((*root)!=NULL) 
    { 
    if(((*root)->data)==n) 
    {  
    break; 
    } 
    (*parent)=(*root); 
    if(((*root)->data)>n) 
    (*root)=(*root)->left; 
    else 
    (*root)=(*root)->right; 
    } 
} 
if(((*root)->left)==NULL && ((*root)->left)==NULL) //both children are NULL 
{ 
    del_a(parent,root); 
} 
else if(((*root)->left)==NULL && ((*root)->left)!=NULL)// only one child is NULL 
{ 
    del_b(parent,root); 
} 
else if(((*root)->left)!=NULL && ((*root)->left)==NULL)// only one child is NULL 
{ 
    del_b(parent,root); 
} 
else 
{ 
del_c(parent,root); //No child is NULL 
} 
} 

del_a(node **parent,node **root) 
{ 
if((*parent)->left==(*root)) 
{ 
    free(*root); 
    (*parent)->left=NULL; 
} 
else 
{ 
    free(*root); 
    (*parent)->right=NULL; 
} 
} 

del_b(node **parent,node **root) 
{ 
if(((*parent)->left)==(*root)) 
{ 
    if(((*root)->left)==NULL) 
    { 
    (*parent)->left=(*root)->right; 
    free(*root); 
    } 
    else 
    { 
    (*parent)->left=(*root)->left; 
    free(*root); 
    } 
} 
else 
{ 
    if(((*root)->left)==NULL) 
    { 
    (*parent)->right=(*root)->right; 
    free(*root); 
    } 
    else 
    { 
    (*parent)->right=(*root)->left; 
    free(*root); 
    } 
} 
} 

del_c(node **parent,node **root) 
{ 
node *temp=(*root)->right; 
node *prt=(*root); 
while((temp->left)!=NULL) 
{ 
    prt=temp; 
    temp=temp->left; 
} 

    (*root)->data=temp->data; 

if((temp->right)==NULL) 
{ 
    del_a(&prt,&temp); 
} 
else 
{ 
    del_b(&prt,&temp); 
} 

} 

我传递的参数(如果head是第一个节点)

delete(NULL,&head,n); 

该程序将n删除,但然后立即崩溃LY。问题是什么?

+1

“立即崩溃”意味着什么? Seg故障? –

+0

我正在使用Windows控制台运行程序。它说'程序停止执行',然后提示关闭 – srk

回答

2

当您的地址为NULL时,您正在使用parent。你也必须得到分段错误。

+0

,那么我应该如何传递参数? – srk

+0

'parent'不能为'NULL'。你有'父'定义,所以你可以调用你这样的功能:'删除(&父,头,N);'? –