Это освобождает все узлы в списке, а также то, на что они указывают от своих a
членов (но не * b
членов).
Рекурсивные вызовы сначала проходят через узлы списка, пока не достигнут узла, элемент head->next
которого равен NULL
.
В каждом рекурсивном вызове head
указывает на текущий элемент. После возврата рекурсивного вызова он освобождает то, на что указывает head->a
, а затем освобождает текущий элемент с помощью free(head);
.
Тест if (head->next)
является избыточным, поскольку free_list()
проверяет, вызывается ли он по нулевому указателю с помощью if (head)
.
Большинство людей пишут такие циклы итеративно, а не рекурсивно, поскольку вы можете получить переполнение стека при попытке освободить действительно длинный список.
while (head) {
free(head->a);
listint_s *temp = head;
head = head->next;
free(temp);
}