2013-06-04 78 views
4

這個函數獲得一個指向該列表的「虛擬」項(第一項)和struct輸入「節點」添加...Ç - 添加新項列表

但它進入一個無限循環...最新錯誤?

void listAdd(Node* dummy, Node tmpNode) { 

    Node* toAdd = (Node*)malloc(sizeof(Node)); 
    *toAdd = tmpNode; 
    Node *tmp1,*tmp2; 
    tmp1 = dummy; 
    tmp2 = (*dummy).next; 

    while (tmp1 != NULL){ 

      if (((*tmp1).info.id < (*toAdd).info.id && (*tmp2).info.id > (*toAdd).info.id) || (tmp2==NULL)) { 
        (*toAdd).next = (*tmp1).next; 
        (*tmp1).next = toAdd; 
        return; 
      } 

      tmp1 = (*tmp1).next; 
      tmp2 = (*tmp2).next; 
    } 
} 
+1

你爲什麼遍歷整個列表來添加'tmpNode'到列表中?通常,當你有一個鏈表,並且你想添加一個節點時,你可以在前面添加它。這樣更有效率。順便說一下,「虛擬」不是一個好名字。像「頭」這樣的東西會更好。 –

+7

可讀性提升:'(* tmp1).info'爲'tmp1-> info'等。 – 2013-06-04 12:31:00

+0

Thenx爲您的答案。我通過它的ID字段將節點添加到他的位置 - 它需要按這種方式排序。 – user2451694

回答

2

編輯: 我得到這個(這是在工作中緩慢的一天)擡出了一點,所以我重寫功能使用(恕我直言)更清晰的變量名,減少多餘的變量,並添加了基本錯誤處理。下面的例子支持插入,而前面的例子假設簡單地追加到列表的末尾,這是不正確地閱讀問題的結果(如果您好奇,請參閱編輯)。

void listAdd(Node* currentNode, Node toAdd) 
{ 
    Node * newNode = malloc(sizeof(Node)); 
    if(!newNode){ 
     //ERROR HANDLING 
    } 
    * newNode = toAdd; 
    newNode->next = NULL; 
    while (currentNode) 
    { 
     if(!currentNode->next) 
     //We've got to the end of the list without finding a place to insert the node. 
     //NULL pointer always evaluates to false in C regardless of the underlying value. 
     { 
      currentNode->next = newNode; 
      return; 
     } 
     //Test each member of the list to find out whether to insert or skip. 
     if((newNode->info.id > currentNode->info.id) && (newNode->info.id <= currentNode->next->info.id)){ 
      newNode->next = currentNode->next; 
      currentNode->next = newNode; 
      return; 
     } 
     else currentNode = currentNode->next; 
    } 
} 

如前文中已經提到的那樣。解引用指向結構成員的指針使用相當漂亮的->表示法,它具有相當好的圖像。還要注意的是,NULL總會被評估爲假,除非你想要發生一些不好的事情(最好是段錯誤,最壞的情況是有些接管你的機器),你需要確保你寫入正確的內存區域,所以您必須始終檢查malloc返回!NULL

note:在C中,永遠不會投出malloc()調用的返回值,因爲這可以掩蓋奇怪和危險的行爲。在C++中,你需要必須轉換結果,所以如果你希望程序編譯爲有效的C和C++,你需要考慮你要冒犯誰。詳細信息請參見Do I cast the result of malloc?

+2

更好地將'tmp2 == NULL'上的測試移至'if'的開頭,並將其與您的修補程序分開處理。如果元素被插入到中間,那麼他對'toAdd-> next'的賦值是正確的。我其實不確定你的修復。請注意'tmp2 == tmp1-> next'。 –

+0

@BryanOlivier好點。我沒有考慮在列表中間添加,只是結束。現在就解決這個問題。 – ldrumm

+0

thenx爲你的答案 - 但代碼假設將項目添加到列表的middel中,所以「toAdd」的「下一個」字段假設爲他下面項目的「下一個」字段。如果我的評論不夠清楚,請告訴我。 – user2451694