Первая реализация принимает аргумент указателя на заголовок вашего связанного списка.
Вторая реализация принимает указатель на указатель на заголовок вашего связанного списка.
Можете ли вы сказать почему это может быть важно?
Вы хотите использовать второй, иначе вы потеряете любую ссылку на создаваемый новый узел.
Другими словами, первая реализация просто изменяет локальная копия head
, последняя строка head = new_node;
бессмысленна, фактически ничего не делает, потому что работает с локальным значением. Вторая реализация изменит указатель снаружи.
Первый будет вызываться так:
Node *head = NULL; // declared somewhere
pushathead( head, 1 );
А второй будет вызываться так:
Node *head = NULL;
pushathead( &head, 1 );
Использование оператора address-of здесь является большим намеком на то, что head
будет изменен, и это то, что вы хотите.