2014-02-01 3 views
2

У меня есть код ds для вставки значений в двоичное дерево поиска с использованием рекурсии. Проблема в том, что корень всегда остается нулевым. После выполнения 1-й printf() печатает 10, но второй printf (после insertRec (10)) ничего не печатает, так как root имеет значение NULL.Вставка двоичного дерева поиска - корень всегда null

#include<stdio.h> 
#include<malloc.h> 

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

void insertRec(node *r, int num) 
{ 
    if(r==NULL) 
    {  
      r=(node*)malloc(sizeof(node)); 
      r->data=num; 
      r->left=NULL; 
      r->right=NULL; printf("%d ",r->data); //1st printf 

    }  
    else 
    { 
     if(num < r->data) 
      insertRec(r->left, num);    
     else 
      insertRec(r->right, num);     
    }   
}  
void display(node *x) 
{   
    if(x != NULL) 
    { 
     display(x->left); 
     printf("%d-->",x->data); 
     display(x->right);   
    } 
    else 
    return;    
} 
int main() 
{ 
    node *root=NULL; 
     insertRec(root,10); 
     if(root !=NULL) 
      printf("\ndata=%d",root->data); //2nd printf 
     insertRec(root,5); 
     insertRec(root,15); 
     insertRec(root,3); 
     insertRec(root,18); 
     display(root); 
     getch(); 
} 

ответ

2

Вы передаете root как значение, так что изменения, внесенные в root в функции вставки не отражает в основной функции, поэтому root остается в главной функции NULL. Чтобы исправить ваш код, вы need to pass Pointer to pointer. Пропустить адрес root, чтобы отразить изменение основной функции.

void insertRec(node *r, int num) 

должен быть закодирован как:

void insertRec(node **r, int num) 
{ 
    if(*r==NULL) 
    {  
     *r= malloc(sizeof(node)); 
     (*r)->data=num; 

// 

и использовать *root внутри функции вставки.

И назовите его insertRec(&root, 10); с основного.

Кроме того, если вы распределяете память динамически, вы должны бесплатно освободить выделенную память, используя явно.

Еще одна вещь учится Indenting C Programs.

+0

http://codepad.org/1xHiv4h7 –

Смежные вопросы