2016-02-28 80 views
0

我有一個關於在單個鏈表中給定位置插入元素的問題。其實問題只是插入中間部分, 這是我的插入功能;在給定的位置插入節點C++

void SimpleList::insert (const ItemType & item, int position){   
    Node* prev = NULL; 
    Node* curr = NULL; 
    Node* newNode = new Node(); 
    newNode->data = item; 

    int tempPos = 0; 

    curr = head; 

    if(head != NULL){ 
     while(curr->next != NULL && tempPos != position) 
     { 
      prev = curr; 
      curr = curr->next; 
      tempPos++; 
     } 
     if(position==1) 
     { 
      newNode->next=head; 
      head=newNode; 
      size++; 

     } 
     else if(curr->next == NULL) 
     { 

      curr->next = newNode; 
      last = newNode; 
      newNode->next= NULL; 
      size++; 
     } 
     else 
     { 
      prev->next = newNode; 
      newNode->next = curr; 
      size++; 
     } 
    } 
    else { 
     last = head = newNode; 
     last->next = NULL; 
     size++; 
    } 
} 

和我的測試代碼的輸出是;

 
after insert into empty list: should be 34 
34 
after insert at beginning: should be 45, 34 
45 34 
after inserts in middle: should be 45, 72, 56, 34 
45 34 56 72 
after insert at end: should be 45, 72, 56, 34, 67 
45 34 56 72 67 

我該如何解決這個問題? 謝謝大家的幫助。

+0

首先嚐試首先在紙上找出全部內容,然後嘗試使用您在紙上創建的算法重新實現該功能。然後,如果您在學習如何使用調試器時遇到問題,請逐行逐行查看代碼,以瞭解其功能。 –

+1

此外,請嘗試創建一個可以向我們展示的[最小,完整和可驗證示例](http://stackoverflow.com/help/mcve),其中包括如何調用函數以及使用什麼值。 –

+0

您是否一直在使用您的索引基礎?位置0和位置1將通過其外觀插入列表頭部,這是一個奇怪的設計決定。 – Rook

回答

0

我想你的問題是一個家庭作業問題。我會用功課回答指南迴答:

https://meta.stackexchange.com/questions/10811/how-do-i-ask-and-answer-homework-questions

while循環取決於兩件事情。

  • 鏈表的長度,它設置一個先前/ CURR的值
  • 位置參數值

對IF-ELSEIF-else語句之後取決於設定的while循環的結果prev/curr的值和位置參數值。

你必須確保while循環是正確的,之後,if-elseif-else語句是正確的。

爲了確保while循環和下面的IF-ELSEIF-else語句是正確的,想想自己是否是正確的在

  • 鏈表的長度全部組合,設定分組/ CURR的值
  • 位置參數值

一個鏈表的長度可以是0,1,... 位置參數值可以是0,1,...

當長度= 1時,位置= 0,while循環沒有迭代,並且程序執行else if(curr->next == NULL),所得到的鏈接列表具有新節點之後原始的第一個節點。

當長度= 1時,位置= 1,while循環不重複,且程序執行if(position==1),所得鏈表有新的節點是原始第一節點之前。

當長度= 2,位置= 0時,while循環沒有迭代,程序執行elseprev=NULL,所以prev->next會導致分段錯誤。

當長度= 2,位置= 1時,while循環迭代一次,程序執行if(position==1)。得到的鏈表具有新的節點,之前的原始的第一個節點。

當長度= 2,位置= 2時,while循環迭代一次,程序執行else if(curr->next == NULL)。得到的鏈表具有新的節點原始的第二個節點。

上面的例子顯示了while循環和下面的if-elseif-else語句導致鏈接列表可能不是正確的情況。

要解決該問題,請考慮如何設計while循環和if-elseif-else語句,以便對於鏈接列表長度和位置參數值的所有組合,程序將插入新節點處於正確的位置。

我不太確定位置參數值是在開始插入,在中間插入,還是在末尾插入。在查看我的答案後,您可能必須自行驗證鏈接列表狀態。

while循環和if-elseif-else語句中的代碼針對鏈接列表長度和位置參數值的所有組合運行。設計代碼時,確保代碼適用於所有組合。