在c中将节点添加到树中

时间:2014-12-28 18:37:36

标签: c tree add

此功能有什么问题(进程停止工作)

void ajout_el(Tree **head,int key) {
if(!(*head)) {
   (*head)->key=key;
   (*head)->left=(*head)->right=NULL;
}
else {
    if(key>(*head)->key) ajout_el(&(*head)->right,key);
    else ajout_el(&(*head)->left,key);
}}

这是主要功能

int main() {
Tree *arb=NULL;
int i;
for(i=1;i<=10;i++) ajout_el(&arb,i);
return 0;}

2 个答案:

答案 0 :(得分:5)

当前的问题是第一个插入将取消引用NULL指针:

if(!(*head)) {
   (*head)->key=key; /* (*head) is guaranteed to be NULL here - you've just checked! */
   (*head)->left=(*head)->right=NULL;
}

您需要为*head分配一些内存。请参阅man malloc

一旦你开始分配内存,你就需要考虑如何释放它以避免memory leaks。删除树的递归函数是一种很好的开始方式。

为了将来参考,解决这类问题的一个好方法是在调试器中运行程序。调试器将显示崩溃的确切行,并使您能够在崩溃时检查程序的状态。这通常可以更容易地看出出现了什么问题。

答案 1 :(得分:1)

您忘记为新节点分配内存。应该有

void ajout_el( Tree **head, int key ) 
{
    if( !*head ) 
    {
        *head = malloc( sizeof( Tree ) )
        ( *head )->key = key;
        ( *head )->left = ( *head )->right = NULL;
    }
    else 
    {
        if( key > ( *head )->key ) ajout_el( &( *head )->right, key );
        else ajout_el( &( *head )->left, key );
    }
}

同样的方式可以看起来释放所有已分配内存的函数。例如

void FreeTree( Tree *head ) 
{
    if ( head ) 
    {
        if ( head->left )  FreeTree( head->left );
        if ( head->right ) FreeTree( head->right );
        free( head );
    }
}

或者

void FreeTree( Tree **head ) 
{
    if ( *head ) 
    {
        if ( ( *head )->left )  FreeTree( &( *head )->left );
        if ( ( *head )->right ) FreeTree( &( *head )->right );
        free( *head );
        *head = NULL;
    }
}