В delete
вы free
объект, потому что, как только указатель будет заменен, к нему не будет никакого доступа. Все хорошо там.
В replace
объекты изменяются только на месте. Ничто не создано или уничтожено, поэтому malloc
и free
не участвуют.
Обратите внимание, что эти функции могут вызвать ошибку переполнения стека, если список слишком длинный. Кроме того, replace
всегда возвращает свой аргумент p
, поэтому ему не нужно ничего возвращать. Оставление хвостового вызова в конце функции вместо p->next = replace( …
(почти все) устранит риск переполнения стека. Запись delete
в виде цикла также, возможно, будет несколько безопаснее.