2014-11-19 5 views
0

링크 된 목록에서 노드를 삭제하는 것을 이해하고 있으므로 아래에 표시된 함수 Node *deleteNode(int item. Node *head)을 만들었습니다. 그것은 노드를 삭제하지만, 주 기능에서 지정한 노드는 삭제하지 않습니다. 링크 된 (1,2,3,4,5,6)으로 시작하면 (1,3,4,5,6)의 목록을 반환합니다. 따라서 어떤 이유로 든 제 2 노드를 항상 삭제합니다. 이 문제를 일으키는 내 deleteNode 함수의 오류는 무엇입니까?C에서 링크 된 목록에서 노드 삭제하기

+5

디버거를 사용해 보셨습니까? 힌트'='는'=='와 동일하지 않습니다. – 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

링크 된 목록을 사용하고 포인터와 노드를 어렴풋으로 사용하면 어떤 포인터가 무엇을 가리키고 링크 된 목록의 일반 레이아웃이 무엇인지 파악하는 것이 매우 중요합니다. 누군가에게 설명하려고 할 때 종종 화이트 보드에 그림을 그립니다. 일부 노드와 노드를 연결하는 포인터가있는 작은 다이어그램을 그립니다. 이렇게하면 목록에서 노드를 제거하기 위해 다른 노드로 리디렉션해야하는 포인터를 매우 빠르게 볼 수 있습니다.

간단히 말해서 무엇을 해야할지 명확히하기 위해 그림을 그려야하고 코딩은 실제로 어렵지 않습니다.

관련 문제