Когда вы вызываете эту функцию: void deleteNode(struct Node* head, int key)
с первым аргументом, который является указателем на структуру Node
(как вы делаете дважды в вашем main
), тогда то, что функция получает в качестве первого аргумента, является копия указателя, который вы дали !
Вы, вероятно, знаете, что функция: void Increment(int n)
может делать все, что ей нравится, переданной ей n
без измененияпеременная в вызывающем модуле. Итак, если вы хотите, чтобы функция фактически изменила значение в вызывающем блоке, вы даете ей указатель:
void Increment(int* n) {
++(*n);
}
Аналогично, если вы хотите, чтобы функция изменила указатель, вам нужно передать его указатель на этот указатель . Попробуйте это:
void deleteNode(struct Node** head, int key){
Node* temp = *head;
if(temp->data==key){
*head = temp->next; // Only need to change *head if its the first one ...
}
else {
while(temp->next->data!=key){
temp = temp->next;
}
temp->next = temp->next->next; // ... else we have already changed the actual "links"
}
}
И, в main
, используйте:
deleteNode(&first, 2);
и:
deleteNode(&first, 1);
Сообщите нам, что происходит.
Примечание: Между прочим, это не «лучший из возможных кодов» - удаляя ссылку без фактического удаления указанного объекта, вы создаете утечку памяти.
Примечание 2: Кроме того, если key
не найден, ваш код будет «падать» в конец списка, когда он найдет указатель NULL next
!