Вы хотите удалить узел, на который указывает head
;у вас есть несколько проблем:
1) вы передаете копию указателя head
- функция не может изменить исходный указатель head
, с которым была вызвана функция, поэтому последняя строка функцииhead=temp
ничего не делает на самом деле.Когда функция вернет все, что вы указали на первый узел в списке, теперь будет указывать на освобожденную память.По сути, вы потеряли список.
2) когда вы захватываете head->next->data
, вы не получаете нужный элемент данных, потому что head->next
был перезаписан.
3) free(head)
также освободит temp
, поскольку оно указывает на то же, что и head
.temp
бессмысленно.
Некоторые примечания в коде:
deleteFirstNode(struct node * head)
{
struct node* temp=head;
temp->next=head->next->next; // note: this overwrites head->next
temp->data=head->next->data; // so this gets what used to be
// head->next->next->data
free(head); // this frees `temp` (which is an alias for `head`)
// - so whats the point of `temp`?
head=temp; // this is pointless in more ways than one
}
Итак, вот предлагаемая (не проверенная) альтернативная версия deleteFirstNode()
:
deleteFirstNode(struct node ** head)
{
struct node* temp = *head; // temp points to the node we want to free
struct node* next = temp->next; // next points to what will be the new
// first node
free(temp);
*head=next;
}
Вам придется вызывать функцию, передав указатель на указатель головы:
struct node* head_pointer;
// ...
deleteFirstNode(&head_pointer);
Еще один момент, который следует учитывать:
- , если указатель вашей головы равен
NULL
deleteFirstNode()
не будет работать.Вы должны заставить его справиться с этим делом.