Вы можете запустить его через отладчик или же запустить через эту часть программного обеспечения внутри вашего черепа - оба покажут вам, что он работает нормально. Например, давайте начнем со списка:
head(47) -> [47]single_node -> [NULL]end-of-list.
Выполнение этого списка через ваши заявления:
ptr = head
устанавливает ptr
на 47.
head
не равен нулю, поэтому введите цикл.
head = head->next
устанавливает head
в NULL.
delete ptr
удалит single_node
.
ptr = head
устанавливает ptr
в NULL.
head
теперь равно NULL (0), поэтому выйдите из цикла.
Итак, вы удалили единственную запись в списке, и head
теперь имеет значение NULL. Это все, что вам нужно сделать.
Вы можете сделать аналогичную вещь с более длинным списком или пустым списком, вы обнаружите, что все в порядке (нет реальной разницы между списком из одного элемента и списком из пятидесяти элементов).
Кроме того, я не большой поклонник того, чтобы относиться к указателям как к логическим значениям - я бы лучше написал это примерно так:
for (ptr = head; head != NULL; ptr = head)
По моему мнению, это делает код лучше читаемым, и вы действительно не жертвуете производительностью (если у вас нет мертвого компилятора). Но это дело вкуса.
Ваш комментарий:
Меня беспокоит то, что я достиг последнего узла. Состояние "голова" следует проверить, что оно не равно нулю, но я не уверен, будет ли оно работать.
Это будет работать. Нулевое значение будет рассматриваться как ложное, поэтому вы обнаружите, что никогда не разыменовываете head-> next, когда head равно NULL просто потому, что вы вышли из тела цикла до этой точки (или даже не вошли в тело, если список пуст ).
Любое другое значение указателя будет считаться истиной, и вы введете или продолжите тело цикла.