2016-04-14 1 views
1

У меня есть кусок кода, как это (реализующей Tree)Почему эта функция должна быть вызвана по ссылке?

struct Node 
{ 
    int val; 
    struct node* left,*right; 
    Node(int x){ 
    val=x; 
    left=right=NULL; 
    } 
}; 

void insert(Node* &h,int val){ 
    if(h==NULL){ 
    h=new Node(val); 
    return; 
    } 
    if(h->val > val){ 
    insert(h->left,val); 
    } 
    else { 
    insert(h->right,val); 
    } 
} 

void temp(Node* h,int val){  // Node* h doesn't seem to work but 
            // Node*& h does!!! 
    insert(h,val); 
} 

int main() { 

struct Node* R=NULL; 
for(int i=0;i<5;i++){ 
    cin>>x; 
    temp(R,x); 
} 
    return 0; 
} 

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

Мой вопрос:: - Почему адрес должен быть передан по ссылке в указанной строке?

Моя точка: Я посылаю адрес корня из основной в функции темп, а затем функция температуры посылает этот адрес в функцию вставки на Reference вставить функцию, которая меняется его постоянно, так почему бы не адрес корня меняется здесь? И если это ошибка, которая меняет здесь адрес?

+0

«пройти по ссылке» означает, что функция может изменить исходное значение. В противном случае это невозможно. –

+0

- это 'траверс', который должен быть' temp' –

+0

@ M.M Извините, что.Edited !!! – Dofenshmirtz

ответ

0

Потому что в противном случае параметр будет передан по значению. Таким образом, main R, или что-то другое, является корневым узлом дерева, затем останется полностью неизменным после возвращения temp()/insert().

Если было изначально NULL, оно все равно будет NULL после того, как temp() вернет, даже, предположительно, новый узел был вставлен в качестве корневого узла. Все, что произошло, - это копия значения параметра, обновленная, вместо реального корневого узла, утечка памяти.

+0

Но как насчет прохождения по эталонному параметру вставить funcion !!! Я прохожу мимо ссылки. Что это значит? – Dofenshmirtz

+0

Он меняет значение 'h' в temp(). Вот к чему это относится. Он не меняет значение «R» в main(), потому что он передается значением temp(), а параметр «h» в temp() передается ссылкой на insert(), поэтому insert() изменяет temp() . Большая сделка. –

+0

Вы сэр мой герой <3 – Dofenshmirtz

0

Эта программа вызовет ошибку сегментации из-за того, что функция temp принимает h в качестве ссылки на указатель.

Измените подпись функции temp на void temp(Node* &h, int val), и она будет работать.

Функция вставки выделяет память для ч, но функция температуры проходит временную переменную внутри созданного компилятором к функции вставки

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

  • Нет связанных вопросов^_^