Listing 1

// Delete a Node from a singly linked list.
void DeleteNode(LIST_NODE* pNodeToDelete) {
   LIST_NODE** ppPrev = &gpRoot;
   LIST_NODE* pNode = gpRoot;
   // Pre: Node must not be NULL
   assert(pNodeToDelete != NULL);
   while (pNode != NULL) {
      if (pNode == pNodeToDelete) {
         *ppPrev = pNode->pNext;
         free(pNode);
         // Post: Node is deleted
         assert(!zNodeExists(pNode));
         return;
      }
      ppPrev = &(*ppPrev)->pNext;
      pNode = pNode ->pNext;
   }
   // Pre: Node must exist in list. We reach this point
   // only if Node is not present or the list is empty
   assert(0);
}