2014-10-04 194 views
0

有時,當我運行此代碼時,空引用異常發生在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; 
     } 
    } 

我知道,你不能引用下一個節點,如果當前節點是等於無效,但我無法確定一個解決方案。

如何防止發生此問題?

回答

0

每當數據將出現在列表中插入,Current將是無效的。當您查找插入數據的位置時,檢查Current != null是結束循環。

檢查空引用,將告訴你把數據中的第一項:

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

您也可以讓Current點到的數據應該在其之前結束,而不是節點的節點:

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 != nullCurrent已經存在相同的chech,所以你明白這個邏輯)。試試這個:

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'是否爲null,因爲Current.Next不存在。 – TheAuzzieJesus 2014-10-04 15:02:48

+0

只是跳過移動將從列表中刪除數據並導致重複的引用。 – Guffa 2014-10-04 15:03:26

+0

@TheAuzzieJesus,是的,這是真的。太好了,你明白了!我們只在檢查Current後檢查'Current.Next',因爲我們不想有空的解引用錯誤。 – Ilya 2014-10-04 15:05:26