Белая доска это. Или измените пример кода, чтобы сделать это:
for(i=1;i<=10;i++) {
curr = (node *)malloc(sizeof(node));
curr->left = curr->right = NULL;
curr->val = rand();
printf("before: %d\n", root);
insert(&root, curr);
printf("after: %d\n", root);
}
// printout(root);
Напечатанный результат выглядит так:
до: 0
после: 3871888
до: 3871888
после: 3871888
до: 3871888
после: 3871888
Почему это?
Потому что он меняет указатель, который вы передаете ему.
Как работает вставка: Вставка пересекает дерево. Сначала он посещает текущий узел. Затем левый узел (через рекурсию). Затем правый узел (через рекурсию). Если речь идет о пустом узле (NULL), он заменяет этот узел элементом.
Для этого он разыменовывает внешний указатель и присваивает значение указателя «item» этому внутреннему указателю.
В общем случае указатель похож на int или char. Вы передаете указатель по значению. Если вы разыменовываете его, вы можете изменить все, на что он указывает, но не сам указатель. Если вы передаете указатель на указатель, внутренний указатель может быть изменен, но внешний указатель не может.
Вот еще пример кода указателя для пережевывания:
#include <cstdio>
#include <cstdlib>
void some_func(int* value)
{
*value = 12;
}
int main(int argc, char* argv[])
{
int a = 5;
printf("%d\n", a); // prints 5
some_func(&a);
printf("%d\n", a); // prints 12
int b = 7;
int* c = &b;
printf("%d\n", b); // prints 7
printf("%d\n", c); // prints 2029440 (some random memory address)
some_func(c);
printf("%d\n", b); // prints 12
printf("%d\n", c); // prints 2029440 (the same value as before)
}
И
#include <cstdio>
#include <cstdlib>
void some_other_func(int** other_value)
{
*other_value = NULL;
}
int main(int argc, char* argv[])
{
int b = 7;
int* c = &b;
printf("%d\n", c); // prints 4718288 (some random memory address)
some_other_func(&c);
printf("%d\n", c); // prints 0
}
Последнее, но не менее важное:
#include <cstdio>
#include <cstdlib>
void some_third_func(int* third_value)
{
*third_value = 12;
int** lets_modify_third_value = &third_value;
*lets_modify_third_value = NULL;
}
int main(int argc, char* argv[])
{
int b = 7;
int* c = &b;
printf("%d\n", b); // prints 7
printf("%d\n", c); // prints 1637380 (some random memory address)
some_third_func(c);
printf("%d\n", b); // prints 12
printf("%d\n", c); // prints 1637380 (same as before. Note that the pointer was passed by value, so "third_value" was just a COPY of the address)
}