2013-04-17 2 views
0

정렬 된 연결된 목록이 있고 사용자가 nameToSearch에 전달하는 모든 내용을 삭제하는 함수를 만들려고합니다. 하지만 난 계속 오류가 발생합니다. 아래는 내가 지금까지단일 정렬 된 연결 목록에서 요소 제거 C++

void deleteProduct(NodePtr head, char* nameToSearch) 
    { 
     NodePtr nodeUnderEdit = findNodeByName(head, nameToSearch); 
     if (nodeUnderEdit == NULL) 
     { 
      cout<<"\n ERROR: Product not found \n"; 
     } 
     else 
     { 

      delete nodeUnderEdit; 
      nodeUnderEdit = nodeUnderEdit->next; 

     } 

    } 
+1

리스트가 단독으로 링크되어있는 경우,'find'는 발견 된 요소 바로 앞에 * 요소에 대한 포인터를 리턴해야합니다. –

+0

nodeUnderEdit이 바로 그'delete' 연산자 바로 다음 (아주 짧게)을 가리키고 있는지 생각해보십시오. – WhozCraig

+0

@KerrekSB +1 또는 해당 노드를 참조하는 포인터의 * 주소 *를 반환하고 수정하십시오. – WhozCraig

답변

6
delete nodeUnderEdit; 
    nodeUnderEdit = nodeUnderEdit->next; 

먼저 nodeUnderEdit 삭제하면 다음 nodeUnderEdit->next가 손실 될 수있는 것입니다. 먼저 nodeUnderEdit 다음 노드가 nodeUnderEdit->next에 연결되어 있는지 확인한 다음 제거 작업을 수행해야합니다.

+0

그래서 nodeUnderEdit-> next를 저장하고 nodeUnderEdit에 temp를 다시 할당하는 임시 변수가 필요합니다. 권리? – user1896464

+0

@ user1896464 nodeUnderEdit 앞에있는 노드를 기억해야합니다. A라고 가정하고, 먼저 A-> next = nodeUnderEdit-> 다음으로 nodeUnderEdit를 안전하게 삭제할 수 있습니다. – taocp

+0

그게 무슨 일을하려고하지만 그럴 수 없기 때문에 나는 이전에 단일 링크 된 목록에, 이전에 저장할 수있는 방법으로 오르고 힘든 시간을 보내고있다. – user1896464

2

항상 단일 링크 된 목록에는 문제가 있습니다.

링크 된 목록에서 현재 노드를 삭제하려면 이전의 노드 (직접 액세스 권한이없는 노드)의 포인터를 수정해야하기 때문에 문제가 발생합니다.

이것을 처리하는 한 가지 방법은 센티넬 (목록의 끝으로 인식하는 값을 포함하는 최종 노드)이있는 목록을 사용하는 것입니다. 이 경우 다음 값 노드의 값을 현재 노드로 복사 한 다음 목록에서 다음 노드를 삭제할 수 있습니다.

+0

나는 @Nathans뿐만 아니라이 대답을 좋아한다. 즉각적인 문제보다 더 나아 간다. – Skurmedel

1

단일 링크 된 목록에서 항목을 제거하려면 포인터를 이전 레코드에서 다음 레코드를 가리 키도록 변경해야합니다. "findNodeByName"이 일치하는 이름의 노드를 찾는 것만으로는 충분하지 않습니다. 정렬 순서에서 노드 이전을 찾아야 만 삭제할 레코드의 다음 포인트에 대한 해당 레코드의 다음 포인터를 설정해야합니다. 이전 레코드의 다음 포인터를 업데이트 한 후에 만 ​​검색 한 레코드를 삭제할 수 있습니다.