此功能有什么问题(进程停止工作)
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;}
答案 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;
}
}