Что касается функции insert_at_head
, вы должны помнить, что в C все аргументы передаются значением . Это означает, что значение скопировано в переменную аргумента. Внутри функции, если вы изменяете переменную аргумента (например, присваиваете ей), то вы изменяете только копию, а не оригинал.
Если вы хотите изменить исходное значение, вам нужно эмулировать передать по ссылке , что можно сделать с помощью оператора адресации &
, чтобы передать указатель на значение. Если вы хотите сделать это для переменной, которая является указателем, вы получите указатель на указатель.
Вот простой пример:
#include <stdio.h>
// Define two global variables
int a = 10;
int b = 20;
void change1(int *x)
{
x = &b; // Make x point to b
}
void change2(int **x)
{
*x = &b; // Make *x point to b
}
int main(void)
{
// Define a pointer variable, and make it point to the global variable a
int *pointer_to_a = &a;
// Will print the value of a, i.e. 10
printf("*pointer_to_a = %d\n", *pointer_to_a);
// Try to change where pointer_to_a is pointing
change1(pointer_to_a);
// Here pointer_to_a is *still* pointing to a, it wasn't changed, will print the value 10
printf("*pointer_to_a = %d\n", *pointer_to_a);
// Do another attempt to change where pointer_to_a is pointing
change2(&pointer_to_a);
// Now pointer_to_a is no longer pointing to a, it points to b and 20 will be printed
printf("*pointer_to_a = %d\n", *pointer_to_a);
}
Возвращение к insert_at_head
функция (о функциональности которой мы можем только догадываться) Я предполагаю, что она добавит в начало связанного списка. Это будет сделано путем изменения того, куда указывает заголовок списка.
Как видно из приведенного выше примера, если мы не передадим указатель на указатель, назначения заголовку будут потеряны после завершения функции. И это решается использованием указателя на указатель и передачей указателя заголовка с использованием оператора адреса &
при вызове функции.