Вы, кажется, не освободили хвостовой узел.
curr->next=NULL;
free(curr->next);
Вы не сможете освободить curr-> next, если вы уже сделали его NULL.
Моя реализация:
void remove_tail(node_t *l) {
if (l == NULL) return;
if (l->next == NULL) {
free(l);
l = NULL;
return;
}
node_t *prev = l;
node_t *curr = l->next;
while (curr->next != NULL) {
prev = curr;
curr = curr->next;
}
prev->next = NULL;
free(curr);
}