2014-10-04 2 views
0

간혹이 코드를 실행하면 null 참조 예외가 Current.Next.Data = Hold.Data;에서 발생합니다.삽입 정렬 중복 링크 목록 문제

private void InsertionSort() 
    { 
     for (Node FirstUnsorted = _Head.Next; FirstUnsorted != null; FirstUnsorted = FirstUnsorted.Next) 
     { 
      Node Hold = FirstUnsorted; 
      Node Current; 

      for (Current = FirstUnsorted.Prev; Current != null && Current.Data.CompareTo(Hold.Data) > 0; Current = Current.Prev) 
       Current.Next.Data = Current.Data; 

      Current.Next.Data = Hold.Data; 
     } 
    } 

현재 노드가 null 인 경우 다음 노드를 참조 할 수 없다는 것을 알고 있지만 솔루션을 결정할 수 없습니다.

어떻게하면이 문제가 발생하지 않도록 할 수 있습니까?

답변

0

데이터가 목록에 처음 삽입 될 때마다 Current은 null이됩니다. 체크 Current != null은 데이터를 삽입 할 장소를 찾을 때 루프를 끝내고 있습니다.

첫 번째 항목의 데이터를 넣어 당신을 말할 것이다 null 참조에 대한

확인 : 또한 데이터가 전에 노드 대신에 끝날 경우, 노드에 Current 점을하도록 할 수 있습니다

if (Current == null) { 
    _Head.Next.Data = Hold.Data; 
} else { 
    Current.Next.Data = Hold.Data; 
} 

:

for (Current = FirstUnsorted; Current.Prev != null && Current.Prev.Data.CompareTo(Hold.Data) > 0; Current = Current.Prev) { 
    Current.Data = Current.Prev.Data; 
} 
Current.Data = Hold.Data; 

사이드 참고 : 당신은 자연적인 것 대신 올바른 위치에 노드를 삽입하는 것입니다 때 corret 장소에 데이터를 삽입 할 목록에 주위 데이터를 셔플하고 있습니다. 삽입을 위해 데이터를 이동해야하는 배열 인 것처럼 링크 된 목록을 사용하고 있습니다.

0

Current.Next != null을 확인해야합니다 (이 논리는 Current에 이미 존재합니다). 이것을 시도하십시오 :

private void InsertionSort() 
    { 
     for (Node FirstUnsorted = _Head.Next; FirstUnsorted != null; FirstUnsorted = FirstUnsorted.Next) 
     { 
      Node Hold = FirstUnsorted; 
      Node Current; 

      for (Current = FirstUnsorted.Prev; Current != null && Current.Next != null && Current.Data.CompareTo(Hold.Data) > 0; Current = Current.Prev) 
       Current.Next.Data = Current.Data; 

      if (Current.Next != null) 
       Current.Next.Data = Hold.Data; 
     } 
    } 
+0

'Current'가 null 인 경우 Current.Next가 존재하지 않으므로 'Current.Next'가 null인지 여부를 확인할 수 없습니다. – TheAuzzieJesus

+0

이동을 건너 뛰면 목록의 데이터가 삭제되고 중복 참조가 발생합니다. – Guffa

+0

@ TheAuzzieJesus, 네, 맞습니다. 좋아, 너는 그것을 이해한다! 우리는'Current'를 체크 한 후에 만'Current.Next'를 체크합니다. 왜냐하면 우리는 널 참조 해제 오류를 원하지 않기 때문입니다. – Ilya