2014-10-04 201 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