2013-11-16 3 views
0

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

struct node *add(struct node *root,int data) 
{ 
    if (root==NULL) 
    { 
     root=(struct node *) malloc(sizeof(struct node)); 
     root->data=data; 
     root->left=NULL; 
     root->right=NULL; 
     return root; 
    } 
    else 
    { 
     if (data<=root->data) 
     { 
      root->left=add(root->left,data); 
     } 
     else 
     { 
      root->right=add(root->right,data); 
     } 
     return root; 
    } 

} 

Я вызываю функцию как

struct node *head=NULL; 
add(head,1); 
add(head,3); 
add(head,15); 

В моем понимании, при вызове метода Add, корень = голова, поэтому голова указывает на то же место памяти, где корень указывает и должно быть обновляется с изменением значения root соответственно.

UPDATE

head=add(head,1); 
+3

Подсказка: ваша функция тщательно возвращает что-то. Ваш код вызова полностью игнорирует это. – Mat

+0

Получил это :) Я обновил его. – Sanjana

ответ

1

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

Первоначально у вас есть head = NULL, это не указывает нигде. Когда вы вызываете функцию, вы создаете локальную переменную с именем root и копируете в нее значение указателя (NULL). Затем вы выделяете некоторое пространство и меняете root, чтобы указать там, но изменения локальной переменной будут потеряны после того, как вы покинете эту функцию, а head снаружи продолжит удерживать значение NULL. Вы фактически потеряли память, которую вы выделили, поскольку никто больше не указывает на нее (valgrind мог бы вам это сказать).

Если вы прошли &head функции вместо (тип затем будет node**, обратите внимание, что вы должны использовать *root внутри функции этот путь), изменения будут сделаны непосредственно на внешней переменной (благодаря факт c фактически передал бы адрес, где main() выделил его в стеке непосредственно функции).
Кстати, в C++, Передача значения по ссылке будет эмулировать одно и то же внутри и будет еще проще (вы сможете сохранить свой код, ссылаясь на root как есть).

В качестве альтернативы вы можете просто вернуть значение нового указателя головы из функции. Это ограничило бы вас единственным возвратным значением, хотя (в этом случае это нормально)

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