Когда вы принимаете аргумент с *
, вы фактически принимаете адрес к чему-либо (это называется указателем).Если вы принимаете аргумент с **
, вы принимаете указатель на указатель.
Итак, это:
void insert_in_sorted_list(Node *lst, char x)
Принимает указатель на Node
и это:
void insert_in_sorted_list(Node **lst, char x)
принимает указатель на указатель на Node
.
Ваша реализация будет работать, если у нас уже есть список, который мы не добавляем впередняя или задняя часть списка.Но подумайте, что может произойти, если вам нужно изменить первый элемент в списке.Если пользователь имеет указатель на первый узел в списке и передает его функции, а новый узел должен быть вставлен перед первым узлом, функция может правильно вставить его перед первым узлом, но когда пользователь смотритв списке после использования этой функции они по-прежнему будут иметь указатель на тот же Node
(больше не должен быть первым) и не будут знать, что перед ним существует узел.Таким образом, пользователю необходимо будет передать указатель на указатель на первый узел, чтобы можно было изменить указатель на первый Node
.
Обновление кода для принятия указателя на указатель на Node
, теперь вам нужно получить доступ к указателю на узел с помощью *lst
вместо просто lst
void insert_in_sorted_list(Node ** lst, char x)
Еще одна вещь, чтобы рассмотреть, что если у пользователя есть пустой список, ничего не будет вставлено.
Рассмотрим, что произойдет, если мы доберемся до последнего узла, т.е. lst->next
равен NULL, когда мы попытаемся получить доступ к lst->next->value
, у нас будет какое-то исключение NULL-указателя.Даже если мы не вставим этот код в конец другого узла?