Первая ошибка
head=temp->next;
Поскольку head
является локальным параметром, это назначение изменяет этот локальный параметр. Вам нужно изменить указатель, переданный функции, поэтому ваш код должен быть:
void delete_from_key(node **head, int key)
//...
*head=temp->next;
//...
2-й жук
new = new->next;
Вид той же проблемы. new
является локальной переменной. Вы изменяете локальную переменную, вы не меняете указатель в списке.
Если search_key
действительно возвращает указатель на узел до найденного ключа, который вам нужен
temp = new->next;
new->next = new->next->next;
free(temp);