В этой функции
/*following createList prints out only 1st element, why?*/
node* createList(node* root , int a){
if(root == NULL) root = new node(a);
else createList(root->next , a);
return root;
}
ее параметр root является локальной переменной функции, которая содержит копию значения аргумента, переданного функции. Таким образом, изменение копии не влияет на исходный аргумент.
В противоположность вышеуказанной функции в этой функции
/*following createList prints out fine */
node* createList(node* root , int a){
if(root == NULL) root = new node(a);
else root->next = createList(root->next , a);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
return root;
}
существует присвоение исходного аргумента с новым значением.
Для большей наглядности рассмотрим очень простую программу
#include <iostream>
int f( int x )
{
x *= 10;
return x;
}
int main()
{
int x = 10;
std::cout << "Before call of f: " << x << '\n';
f( x );
std::cout << "After call of f: " << x << '\n';
x = f( x );
std::cout << "After call of f: " << x << '\n';
return 0;
}
Ее вывод
Before call of f: 10
After call of f: 10
After call of f: 100
После первого вызова функции f
переменная x
значение main не было изменено, поскольку функция обрабатывает копию своего аргумента.
После второго вызова функции переменная x
была изменена, поскольку она была переназначена новым значением.