2012-03-05 5 views
1
template <class T> 
bool LinkedList<T>::remove(const T object){ 
    Node<T> *cur = head; 
    while(cur->next != NULL){ 
    if(cur->next->value == object){ 
     Node<T>* temp = cur->next->next; 
     delete cur->next; 
     cur->next = temp; 
     s--; 
     return true; 
    } 
    cur = cur->next; 
    } 
    return false; 
} 

할당 후 개체가 삭제됩니다. 값을 인쇄 할 때 노드가 손상된 것 같습니다. 링크 된 목록에서 항목을 제거하는 가장 좋은 방법입니까?목록을 손상시키지 않고 링크 된 목록에서 노드를 삭제하는 방법은 무엇입니까?

+0

을 아마 관련이없는이 머리가 아닌 제거 할 개체를 가정합니다. –

+0

노드의 소멸자가 '영리한'일을하는지 또는 '값을 출력하는지'를 표시해야 할 필요가있을 것입니다 (실제로 '객체'가 목록의 첫 번째 항목이되는 것을 처리하지 않습니다.) '코드. btw : 뭐야? – John3136

+1

목록의 머리 부분을 처리하는 데 더 많은 작업이 필요합니다. 개체가 머리 일 때 작업하지 않는 것 외에 목록이 비어 머리가 NULL 인 경우 더욱 극적인 방식으로 실패합니다. –

답변

2

노드 소멸자는 단지 "다음으로 삭제"입니다.

Oooops. 각 노드가 소멸자에서 다음 노드를 삭제하면 해당 지점의 전체 목록이 삭제됩니다.

Node<T>* temp = cur->next->next; // the node temp points to is clearly after cur 
    delete cur->next; // deletes everything after cur 
    cur->next = temp; // temp no longer points to a valid node 
+0

나쁨. 먼지가'delete cur-> next에서 안정화 된 후, 삭제하고자하는 노드부터리스트의 끝까지 모든 노드를 삭제하면,'temp'는 이제 해제 된 메모리를 가리키고,'cur-> next = temp;' 따라서 와일드 포인터를 할당하고있다. 해제 된 메모리가 재사용 될 때까지 약간의 작업이 이루어지며, Undefined Behavior Land를 벗어납니다. –

+0

하하 오하이오의 손바닥. 노드에서 다음에 삭제를 꺼 냈고 모든 메모리 누수가 0으로 수정되었습니다. 또한 첫 번째 요소를 확인하지 않은 버그가 수정되었습니다. 감사. – carboncomputed

0

작업 버전은 더 같을 것이다 :

template <class T> 
bool LinkedList<T>::remove(const T object) { 

    // Iterate through the list. 
    for(Node<T> **cur = &head;; cur = &((*cur)->next)) { 
     // Check for list end. 
     if(!*cur) 
      return false; 
     // Check for match. 
     if((*cur)->value == object) 
      break; 
    } 

    // Knock out the node. 
    Node<T> *temp = (*cur)->next; 
    delete *cur; 
    *cur = temp; 

    // No idea what s does. 
    --s; 

    return true; 
} 
관련 문제