2013-04-09 100 views
1

我的添加函數顯然有一個問題,因爲它是首先解除引用,第一個指向沒有,因爲這一點。我只是不知道如何解決它,以便它不是空指針。訪問衝突讀取位置0xC0000005 C++

struct Node 
    { 
     int data; 
     Node *next; 
    }; 

    class LinkedList 
    { 
     Node *first; 
     Node *last; 
     int count; 
     public: 

     LinkedList() 
     { 
      first = NULL; 
      last = NULL; 
      count = 0; 
     } 


     void Add(int item) 
     { 
      if (first == NULL) 
      { 
       first->data = item; 
       last->data = item; 
       last->next = NULL; 
       first->next = last; 
       count = 1; 
      } 
      else 
      { 
       Node *newNode = new Node; 
       newNode->data = last->data; 
       newNode->next = last; 
       last->data = item; 
       last->next = NULL; 
       count ++; 
      } 
     } 
+0

如果你不希望'first'爲空,那麼將它指向某個東西。你已經知道如何創建一個'Node'(如'else'塊所示),所以:'first = new Node;'。 – jamesdlin 2013-04-09 02:53:22

+5

你的條件說'如果第一個是空的,那麼先用'。這是不正確的。如果它爲null,則不能使用「first」。 – 2013-04-09 02:54:06

+0

你可以通過爲它分配內存來使它不爲NULL,就像你在else情況下一樣('Node * newNode = new Node;')。 – MatthewD 2013-04-09 02:57:00

回答

3
if (first == NULL) 
{ 
    /* if first is NULL dereference it. Hooray! */ 
    first->data = item; 
    ... 
+0

我認爲OP可能已經知道(「它是首先取消引用並且第一個沒有指向任何東西」),但不知道如何修復它。 – jamesdlin 2013-04-09 02:58:02

+0

只是簡單地說'first = new Node;'? – kccqzy 2013-04-09 03:00:24

+0

@BdkFivehunna無論是否爲NULL,你都需要一個'new Node'。 – 2013-04-09 03:00:37

6

您在ifelse之間有很多共同點的代碼。

 if (first == NULL) 
     { 
      first->data = item; 
      last->data = item; 
      last->next = NULL; 
      first->next = last; 
      count = 1; 
     } 
     else 
     { 
      Node *newNode = new Node; 
      newNode->data = last->data; 
      newNode->next = last; 
      last->data = item; 
      last->next = NULL; 
      count ++; 
     } 

if,你增加count01。在else,你增加它。

count總是遞增。所以你不需要輸入兩遍。

 if (first == NULL) 
     { 
      first->data = item; 
      last->data = item; 
      last->next = NULL; 
      first->next = last; 
     } 
     else 
     { 
      Node *newNode = new Node; 
      newNode->data = last->data; 
      newNode->next = last; 
      last->data = item; 
      last->next = NULL; 
     } 
     count ++; 

你也在他們都設置last->dataitem

而你正在設置last->nextNULL在他們兩個。

 if (first == NULL) 
     { 
      first->data = item; 
      first->next = last; 
     } 
     else 
     { 
      Node *newNode = new Node; 
      newNode->data = last->data; 
      newNode->next = last; 
     } 
     last->data = item; 
     last->next = NULL; 
     count ++; 

當它是第一個新節點時,您也忘了創建一個new Node

 if (first == NULL) 
     { 
      Node *newNode = new Node; // Added 
      first = newNode;   // Added 
      last = newNode;    // Added 
      first->data = item; 
      first->next = last; 
     } 
     else 
     { 
      Node *newNode = new Node; 
      newNode->data = last->data; 
      newNode->next = last; 
     } 
     last->data = item; 
     last->next = NULL; 
     count ++; 

first->data = itemif是多餘的。 firstlast相同,並且last->data = item已經發生。

 if (first == NULL) 
     { 
      Node *newNode = new Node; 
      first = newNode; 
      last = newNode; 
      // Removed 
      first->next = last; 
     } 
     else 
     { 
      Node *newNode = new Node; 
      newNode->data = last->data; 
      newNode->next = last; 
     } 
     last->data = item; 
     last->next = NULL; 
     count ++; 

而且,由於firstnewNode相同的值if,我們可以交替使用的變量名。現在

 if (first == NULL) 
     { 
      Node *newNode = new Node; 
      first = newNode;   // These two pointers are equal! 
      last = newNode; 
      newNode->next = last;  // (same pointer) 
     } 
     else 
     { 
      Node *newNode = new Node; 
      newNode->data = last->data; 
      newNode->next = last; 
     } 
     last->data = item; 
     last->next = NULL; 
     count ++; 

幾乎所有else也是你if。它可以全部被搬出。

 Node *newNode = new Node; 
     if (first == NULL) 
     { 
      first = newNode; 
      last = newNode; 
     } 
     else 
     { 
      newNode->data = last->data; 
     } 
     newNode->next = last; 
     last->data = item; 
     last->next = NULL; 
     count ++; 

這段代碼現在也應該可以理解了。教訓:Don't Repeat Yourself。 :)

+1

優秀的文章,大量的細節和良好的解釋,所以OP可以沿着。 +1 – 2013-04-09 04:58:32

0

看一看linked list

有一些細節,開始first == NULL,當你需要創建第一,把它插入到鏈表,把它掛起來,請聯繫文章的一些算法用。

我會說最簡單的是帶有一個頭節點(而不是first *)的單鏈表,它可以指向自己,但是有很多方法來實現鏈表,並且取決於你選擇如何連接元素。

這取決於你在做什麼後,但如果你只是需要一些工作,那麼你可以從boost intrusive circular slist algorithms拿起,你只需定義你自己的結構與數據和下一個指針,告訴它如何訪問下一個並使用提供的算法來做所有的工作(鏈接和取消鏈接節點)。