Esta é uma boa maneira de remover um nó de uma lista vinculada de forma simples:
void remove_if(node ** head, remove_fn rm) {
for (node** curr = head; *curr; ) {
node * entry = *curr;
if (rm(entry)) {
*curr = entry->next;
free(entry);
}
else
curr = &entry->next;
}
}