In the function MoveHeader: removed two if, as the condition is always true.
if (old->_prev == NULL) {
  headers->_begin = header;
}
else if (headers->_begin == header) {
  if (header->_next != NULL) { /* This is always true and has been removed. */
    headers->_begin = header->_next;
  }
}

If headers->_begin == header && headers->_next == NULL, this is the case when there is only one element in the list (headers->_end == header)
If there is only one element in the list, old->_prev == NULL, so it would go through the first if.

if (old->_next == NULL) {
  headers->_end = header;
}
else if (headers->_end == header) {
  if (header->_prev != NULL) { /* This is always true and has been removed. */
    headers->_end = header->_prev;
  }
}

If headers->_end == header and header->_prev == NULL, this is the case when there is only one element in the list (headers->_begin == header)
If there is only one element in the list, old->_next == NULL, so it would go through the first if.