Функция list_add не обязательно добавляет новый узел в начало списка - она просто добавляет новый узел, который будет расположен до p
.
Аргумент p
может косвенно указывать на узел в начале списка или любой другой узел в списке.
Этот код затем создает новый узел с полем next
, на которое указывает p
.
Обновлено:
Этот код использует уловку указатель-указатель-узел, которая очень полезна при работе со связанными списками.Если вы видите связанные списки в первый раз, это может сбить с толку.Но вы должны потратить время, чтобы понять это, потому что это отличный пример силы указателей.
В коде p
указывает на указатель, который затем указывает на узел.Это означает, что p
может косвенно указывать на первый узел в списке:
![pointer to pointer usage in a linked list](https://i.stack.imgur.com/xsmmq.png)
..., что означает, что add_node
вставит новый узел в начало списка,Но p
может также косвенно указывать на другие узлы в списке:
![more pointer to pointer usage](https://i.stack.imgur.com/UtWxc.png)
В этом втором примере add_node
вставит новый узел между первым и вторым узлами всписок.