We would try to be clever and compare the *data instead of the *elt.
Somethink like this might be of more general use:
/* Unlink arbitrary element from the list that contains data */
void llist_unlink_data(llist_t **head, void *data)
{
llist_t *elt;
for (elt = *head; elt; elt = elt->link) {
if (elt->data == data) {
llist_unlink(elt);
return;
}
}
}