2014-11-19 3 views
0

Я пытаюсь понять удаление узлов из связанных списков, поэтому я сделал функцию Node *deleteNode(int item. Node *head), показанную ниже. Он удаляет узел, но не тот, который я указал в моей основной функции. Если я начинаю со связанного lsit (1,2,3,4,5,6), он возвращает список (1,3,4,5,6). Поэтому по какой-то причине он всегда удаляет 2-й узел. Какая ошибка в моей функции deleteNode вызывает это?Удаление узла из связанного списка в C

+5

Вы пытались использовать отладчик? Hint '=' не то же самое, что '==' – clcto

+0

спасибо @clcto – user3195991

+0

Кроме того, в 'deleteNode' вы никогда не изменяете' head'. Итак, что происходит, когда вы пытаетесь удалить заголовок своего списка? Вы вернете ту же «голову», что и раньше (узел, который вы только что удалили). Вам нужно обработать случай, когда вы удалите заголовок списка. – JS1

ответ

0

Вам нужно действительно подумать о том, как работает ваш список, чтобы удалить узел. Я бы определенно рассмотрел возможность удаления нескольких фрагментов из вашего deleteNode, чтобы он стал более плавным. Пожалуйста, обратите внимание на следующее:

Node *deleteNode(int item, Node *head){ 
    Node * current = head, *pTemp = NULL, *pPrev = NULL; 

while((current->link->info != item) && ((current -> link != NULL)) //You want to traverse the list until you find the item. 
{  
    pPrev = current; // Assign previous pointer which is null to head of list and so on. 
    current = current->link // Assign current pointer to next node. 
} 

if (current->link-> info == item) 
{ 
    pTemp = current; // Assign temp pointer to current pointer 
    current = pTemp->link; // set current to next pointer 
    pPrev->link = current; // set previous pointer to current 
    free (pTemp) 
} 
else 
{ 
// Did not find at all in list. 
} 

return head; 

}

Это все обобщается и на лету, пожалуйста отладки кода и написать на бумаге структуру вашего списка.

0

С помощью связанных списков и поиска с указателями и узлами очень важно, чтобы вы знали, какой указатель указывает на что и каков общий макет ваших связанных списков. Когда я пытаюсь объяснить это кому-то, я часто рисую картину на своей доске. Просто нарисуйте небольшую диаграмму с помощью некоторых узлов и указателей, соединяющих их. Таким образом вы очень быстро видите, какие указатели вы должны перенаправить на другие узлы, чтобы удалить узел из списка.

вкратце: с рисунком очень ясно, что делать, а кодирование не является на самом деле, если вы знаете, что делать.

Смежные вопросы