list_insert (list_end (list), elem);
}
-/* Removes ELEM from its list. Undefined behavior if ELEM is not
- in a list. */
+/* Removes ELEM from its list and returns the element that
+ followed it. Undefined behavior if ELEM is not in a list. */
list_elem *
list_remove (list_elem *elem)
{
ASSERT (is_interior (elem));
elem->prev->next = elem->next;
elem->next->prev = elem->prev;
- return elem;
+ return elem->next;
}
/* Removes the front element from LIST and returns it.
list_elem *
list_pop_front (struct list *list)
{
- ASSERT (list != NULL);
- return list_remove (list_front (list));
+ list_elem *front = list_front (list);
+ list_remove (front);
+ return front;
}
/* Removes the back element from LIST and returns it.
list_elem *
list_pop_back (struct list *list)
{
- ASSERT (list != NULL);
- return list_remove (list_back (list));
+ list_elem *back = list_back (list);
+ list_remove (back);
+ return back;
}
/* Returns the front element in LIST.