С помощью этой комбинации
if(temp->data%2 == 1)
и
deleteKey(*(&head),temp->data);
вы удаляете узел, который просматриваете в данный момент. Включая фактическую
delete temp;
внутри deleteKey
.
Но затем вы получаете доступ к только что удаленной памяти, здесь
temp = temp->next;
внутри evenOdd
.
После этого все ставки отключены.
Но наблюдаемая проблема возникает здесь, внутри deleteKey
:
prev->next=temp->next;
, где используется prev
со значением, идентичным temp
.
Т.е. он не меняет темп и, в особенности, не указывает на указатель, который указывает на темп.
Для этого вам необходимо отслеживать указатель, указывающий на узел, который вы хотите удалить, и изменять ТА.
Именование ваших переменных означает, что вы знаете концепцию и пытаетесь сделать это здесь
{prev = temp; break;}
Но очевидно, что это не может получить указатель.
Вам нужно обновить это prev
все а затем что-то вроде этого должно быть в вашем коде удаления
{prev->next = temp->next; break;} /* prev->next currently points to temp, but prev!= temp */
/* update the "next" pointing to current node so that it points to the next one */
Вы можете найти другие мои ответы полезными для анализа таких проблем с пуитнером:
Трюки для анализа указателя и структуры указатель-указатель в C?