2016-10-30 2 views
0

Я пытаюсь реализовать операцию вставки в двоичном дереве поиска (BST). У меня есть функция с именем insert и push. При каждом значении для вставки вызывается функция insert().If root это Null (изначально) он будет вставлен. Если root не является нулевым, то из insert() будет вызвана другая функция push(). Но для меня root всегда остается null. Я использовал строку «Я здесь», чтобы проверить и каждый раз, когда я пытаюсь вставить новые данные, эта строка печатается. Вот как я знаю, что root остается NULL. В чем проблема?Почему root всегда имеет значение null в двоичном дереве

#include<stdio.h> 
struct node { 

    int data; 
    struct node* left; 
    struct node *right; 
}; 
void insert(struct node *root,int value); 
void push(struct node *temp,struct node *newNode); 
struct node *root; 
int main(){ 
    root = NULL; 
    int option,value; 
    for(;;){ 
     printf("Please select an option from below : \n"); 
     printf("1 for insert\n"); 
     printf("2 for search\n"); 
     printf("please enter your option : "); 
     scanf("%d",&option); 
     printf("\n"); 
     switch(option){ 
      case 1: 
       printf("you choose to insert\n"); 
       printf("input your value :"); 
       scanf("%d",&value); 
       insert(root,value); 
       printf("\n"); 
       break; 
      default: 
       break; 

     } 
    } 
} 

void insert(struct node *root,int value){ 
    struct node *newNode = (struct node*)malloc(sizeof(struct node)); 
    struct node *temp = (struct node*)malloc(sizeof(struct node)); 

    newNode->data = value; 
    newNode->left = NULL; 
    newNode->right = NULL; 
    temp = root; 
    if(root==NULL){ 
     printf("i am here"); 
     root = newNode; // enter first node 
    }else{ 

     push(temp,newNode); 
    } 
} 
void push(struct node *temp,struct node *newNode){ 
    printf("others"); 
    if(temp==NULL){ 
     temp = newNode; 
    }else{ 
     if(temp->data > newNode->data){ 
       push(temp->left,newNode); 
     }else{ 
      push(temp->right,newNode); 
     } 
    } 

} 
+3

'root = newNode;' и 'temp = newNode;' не изменяют свои значения в вызывающей функции. –

ответ

2

Программа имеет две переменные с именем root. Первая - глобальная переменная, другая - локальная для функции insert. Вот почему глобальная переменная не может быть изменена в функции insert.

Вы можете изменить интерфейс, как

struct node* insert(struct node *root,int value); 

и использовать функцию таким образом:

root = insert(root,value); 

Несколько других методов существует, чтобы изменить глобальную переменную, например, используйте этот интерфейс:

void insert(struct node **root,int value); 
+0

thnx для вашего ответа..Я думаю, мне нужно больше узнать об этой теме :) –

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