Я попытался создать функцию, которая добавит узел в начало списка, а затем изменит переменную «head» (удерживая предыдущее начало списка), чтобы содержать новый узел.Почему не меняется список моих связанных списков?
void addToStart(node * n, node * first){
printf("[Before adding] Node: %d, First: %d\n",&(*n),&(*first));
n->next = first;
first = n;
printf("[After adding] Node: %d, First: %d\n",&(*n),&(*first));
}
int main(){
node * head = createNode(0);
printf("This is the location of head: %d\n",&(*head));
node * fred = createNode(2);
addToStart(fred,head);
traverse(head); //Displays the list starting from the given node
return 0;
}
Это выход:
This is the location of head: 10113040
[Before adding] Node: 10113072, First: 10113040
[After adding] Node: 10113072, First: 10113072
(0)[10113040]->NULL
Проблема заключается в том, что я ожидал, что функция, чтобы изменить то, что head
указывал на, но в действительности ничего не изменилось.
'first = n' изменяет параметр функции' first' в 'addToStart', но не' head' из 'main'. 'first' - это копия' head', потому что C имеет значение pass-by-value и изменяется только копия. –
По той же причине, что 'void f (int n) {n = 0; } 'не может использоваться для установки целого числа в ноль. Как и во всех вещах на C, попробуйте сначала понять ситуацию для 'int', а затем обобщить на другие типы. –
Вы правы в ситуации «int», но не указатели, ссылающиеся на переменную, а не на перенос самой переменной? Я предполагал передать переменную указателя, и изменение указателя также эффективно изменило бы исходную переменную. –