2014-12-28 3 views
1

Что проблема с этой функцией (отросток перестает работать)Добавить узел в дерево с

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

ли сообщение об ошибке? – Codor

+0

Нет, процесс просто перестает работать – aaa

+0

Я предлагаю вам запустить ваш процесс в valgrind, это поможет вам найти, какая строка вызывает ошибку сегментации. –

ответ

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. Рекурсивная функция для удаления дерева была бы хорошим началом.

Для дальнейшего использования хороший способ устранения таких проблем - запустить программу в отладчике. Отладчик будет показывать точную строку сбоя и позволит вам изучить состояние программы в момент сбоя. Это часто делает намного легче понять, что происходит не так.

+0

есть, поэтому сделаю. –

+0

Исправлено, только что добавлено (* head) = (Дерево *) malloc (sizeof (Дерево)); Спасибо. – aaa

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; 
    } 
} 
Смежные вопросы