(Irrelevant aside.)  I have in the past worked with a convention of (for each type T) <code> T* deleteT(T*) </code>, so that the natural idiom for free is <code> p = deleteT(p); </code>
This included cases where the natural action of deleting a node in a datastructure was to return "the rest of the structure, with that node gone", so you didn't get back NULL from deleteT.
There are a handful of different ways to deal with de-allocation; but any given product should generally pick one and stick to it, rather than having some types that do it one way, some another.