Проблема здесь:
*val = temp -> data;
Val имеет значение NULL, поэтому попытка разыменования приведет к ошибке сегментации.
Если вы измените тип val на int вместо указатель на int. Затем вызовите remove_left следующим образом:
int main(int argc, char const *argv[])
{ int val = 0;
Node *head = NULL;
Node *tail = NULL;
for (int i = 0; i < 10; ++i){
push_right(&head, &tail,i);
push_left(&head, &tail,i);
}
remove_left(&head, &tail, &val);
print_all(head);
return 0;
}
Это должно работать.