2015-10-19 136 views
0

我正在尋找從我的隊列中刪除集合節點。假設我按名稱-ID搜索選擇節點。我知道如何從隊列的前面刪除某些東西,但是對於如何在用戶設置點(例如中途)刪除某些東西感到困惑。如何從隊列中刪除集合節點

我的功能:

void retrieveAndRemove(linkedPtr*hd, int size){ 
linkedPtr temp = *hd; 


    if (hd == NULL){ 
    printf("List is empty!"); 

    } 
    while(temp != NULL){ 
     if (temp->status == IN_RESTAURANT && temp->size == size){ 

      //HERE is where I am stuck, how do i now re-arrange the que 
      //Such that the node gets removed and the next node is linked 
      free(temp); 
      return; 

     } 
     temp = temp->next; 
    } 

} 
+0

記住列表解析中的前一個節點指針,例如'* prev'。然後使用'prev-> next = temp-> next'將你要刪除的節點的鏈接複製並在* free'temp(temp)之前執行*。確保你處理了被刪除的第一個節點,你知道怎麼做,在這種情況下,'prev == NULL'(因爲這是你初始化本地變量的方式)。 while循環中的最後一條指令將是'prev = temp'。 –

+0

根據定義,您不能從除隊列末尾之外的任何地方移除節點。你應該把它描述成一個'列表',而不是:) –

回答

1

當你需要從一個鏈表你需要跟蹤前一個節點的中間刪除一個節點。這將允許您重置鏈接列表中的鏈接。

起始狀態:

      Node to be removed 
          | 
          v 
+-------+    +-------+    +-------+ 
| node1 | -- next --> | node2 | -- next --> | node3 | 
+-------+    +-------+    +-------+ 

結束狀態:

+-------+          +-------+ 
| node1 |    -- next -->   | node3 | 
+-------+          +-------+ 

這是你的函數的修訂版本,應該工作。

// This wont work for the case when the head needs to be removed. 
// void retrieveAndRemove(linkedPtr*hd, int size) { 

void retrieveAndRemove(linkedPtr** hd, int size) { 

    linkedPtr prev = **hd; 
    linkedPtr cur = prev; 

    if (hd == NULL){ 
     printf("List is empty!"); 
     return; 
    } 

    // Take care of the case where the item to be removed is at the head. 
    if (cur->status == IN_RESTAURANT && cur->size == size) { 
     *hd = cur->next; 
     free(cur); 
    } 

    // Take care of the case where the item to be removed is in the middle. 
    while(cur != NULL) { 
     if (cur->status == IN_RESTAURANT && cur->size == size){ 

     // Fix the links. 
     prev->next = cur->next; 
     free(cur); 
     return; 
     } 
     prev = cur; 
     cur = cur->next; 
    } 
}