C всегда проходит по значению, поэтому изменение параметра не влияет на вызывающего.
void foo(int i) {
i = 1234; // No effect on caller.
}
void foo(int *p) {
p = NULL; // No effect on caller.
}
Если вы хотите изменить переменную (например, head
) вызывающей стороны, вам нужно передать указатель на нее. (Вы все еще можете изменить то, на что ссылается указатель.)
int deletenode(struct node **head, int n) {
...
}
deletenode(&head, N);
Теперь вы можете просто заменить каждый экземпляр head
в своем коде на (*head)
, чтобы учесть новое соглашение о вызовах, но это упустило бы возможность для упрощения. Имея указатель на struct node *
, нам не нужно обрабатывать head
(a struct node *
) и prev_node->next
(a struct node *
) по-разному.
int delete_node_n(struct node **ptr, unsigned n) {
// Make `ptr` point to the pointer we want to modify.
// This will either be the `head` variable
// or the `next` field of some node.
while (1) {
if (!*ptr)
return 0;
if (!n)
break;
ptr = &( (*ptr)->next );
--n;
}
struct node *to_free = *ptr;
*ptr = (*ptr)->next;
free(to_free);
return 1;
}