2016-11-18 5 views
0

이중 링크 목록에서 노드를 삭제하는 함수를 작성하려고합니다. 하지만 nodeToDelete도 머리 인 첫 번째 조건에 스택합니다. 그 코드를 무료로 사용할 때 (nodeToDelete) free nodeToDeleteBut nodeToDelete-> nextNode;C++의 이중 링크 목록에서 노드를 비울 수 없습니다.

어떤 도움이 필요합니까?

편집 ->https://s22.postimg.org/dff43kn9d/slide.jpg

편집


void deleteNode(node *&head, int value) 

감사합니다 내 코드를 수정 삭제로도 스크린 샷을 볼 일을 해달라고.

void deleteNode(node *head, int value) 
{ 
    node* nodeToDelete = head; 

    while(nodeToDelete != NULL) 
    { 
     if(nodeToDelete->value == value) 
     { 
      if(nodeToDelete == head) 
      { 
       head = nodeToDelete->nextNode; 
       head->previousNode = NULL; 
       delete nodeToDelete; 
       return; 
      } 

     } 

     nodeToDelete = nodeToDelete->nextNode; 
    } 
} 
+2

미안해 ... 정말 나쁜입니다. 'malloc'과'free'는 C++의 비표준 레이아웃 클래스 타입에서는 작동하지 않습니다. – NathanOliver

+0

디버거 사용 방법과 한 줄씩 코드를 단계별로 실행하는 방법을 배우십시오. –

+0

오, MAN !! 고맙습니다 !!! 나는 메모리 할당을 위해 새로운 것을 사용한다. 무료로 삭제 insted을 사용해야합니다. – pZCZ

답변

1

머리 -> 값의 일치,이 함수 내 머리를 변경하는 경우


,하지만 다른 곳에서 머리를 변경하지 않습니다. 이제 호출자는 삭제 된 노드에 대한 유효하지 않은 포인터를 가지며 실제 노드를 찾을 방법이 없습니다. 이 잘못된 포인터가 나중에 호출이 실패하게됩니다.

또한 head-> value가 일치하지 않으면 목록을 검색하지만 머리가 아니기 때문에 나중에 아무 것도하지 않습니다. else 절은 없습니다.

+0

댓글을 주셔서 감사합니다. 나는 내 코드를 고쳤다. 필자가 말한대로 머리를 건네 주면 기능과 작업에 &를 추가하십시오. – pZCZ

2

순서가 잘못되었습니다. 노드와 포인터가있는 간단한 스케치를 그리고 여기에 내가 찾은 것이 있습니다 :

먼저 두 개의 포인터, 즉 노드와 삭제하려는 노드의 nodeToDelete로 시작합니다. 그런 다음 헤드를 다음 노드로 향하게하고 노드를 가리키는 포인터를 무효화하고 nodeToDelete를 삭제합니다. 지금까지 아무런 문제가 없습니다.

하지만이 줄은 nodeToDelete = nodeToDelete->nextNode;입니다.

nodeToDelete가 해제되었으므로 더 이상 사용할 수 없으므로 논리 자체가 작동하지 않습니다.

내가 따라 할 수있는 논리가 생각 : 다음 노드로

  1. 포인트 헤드.

당신이 이전해야합니다이 방법 nodeToDelete 삭제를 머리에 nodeToDelete-> 이전

  • 만들기 nodeToDelete-> 다음 지점으로

  • 확인 머리 -> 이전 점 다음을 가리키고, 다음으로 이전을 가리키고 그 사이를 가리 킵니다. 같은

    뭔가 :

    head = nodeToDelete->next; 
    head->previous = nodeToDelete->previous; 
    nodeToDelete->next = head; 
    delete(nodeToDelete); 
    

    while(nodeToDelete != NULL)

    이 필요하지 않습니다, 당신은 당신이 원하는 경우 if 확인하지만,이 반복하는 것은 좋은 생각이 아니다.

    내가했던 영광스러운 그림이 여기있다. 조금만 도움이 될지 모르겠다. 수동 메모리 할당을해야 할 경우 당신은 정말 ++ C에서`new`와`delete`를 사용한다

    enter image description here