2013-11-25 109 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);'? –