2013-12-16 92 views
0

我需要一個函數,根據它的位置從鏈接列表中搜索一個項目,將信息保存在一個變量中並刪除它。例如,我想刪除列表中的第五個項目,並將其內容保存到int &數字;和字符串&文本;我的列表僅在一個方向上鍊接。 我想我已經設法做到了這一發現,但將其刪除有點困難。刪除單向鏈表中的項目

private: 
    struct List_cell{ 
     unsigned number; 
     string text; 
     List_cell *next; 
    }; 
    List_cell *list_first_; 

bool LinkedList::find_and_remove(unsigned& position, unsigned& count, unsigned& found_number, string& found_text){ 
List_cell *current = list_first_; 

if(current == nullptr){ 
    return false; 
} 
else{ 
    while(current != nullptr){ 
     count++; 
     current = current->next; 
     if(count == position){ 
      found_number = current->number; 
      found_text = current->text; 
          //here should be the deleting i think 
      return true; 
     } 
    } 
} 
return false; 
} 

我是否正確地做了一切,並有任何建議如何做刪除?

+0

:所有的問題都可以通過間接的附加層來解決那麼,你應該記住鏈接到你想要刪除的對象。通過代碼,您可以在檢查之前鬆開您想要更改的鏈接... –

+2

我建議您先寫出紙張上所需的步驟,然後(重新)編碼解決方案。在編碼之後,在調試器中逐行執行代碼,以確保其正常工作。 –

回答

0

編程引理:

bool LinkedList::find_and_remove(unsigned& position, 
            unsigned& count, 
            unsigned& found_number, 
            string& found_text) 
{ 
    List_cell **work = &list_first_; 
    while(*work != nullptr) { 
     if (++count == position) { 
      List_cell *tmp = *work; 
      *work = (*work)->next; 
      found_number = tmp->number; 
      found_test = tmp->text; 
      delete tmp; 
      return true; 
     } 
     work = &(*work)->next; 
    } 
    return false; 
} 
+0

哦..我不認爲它的作品。當我使用它似乎alwys刪除第一!這是真的工作還是我做錯了什麼? – user2933157

+0

哎呀......對不起。忘了一條線。當我編寫代碼時沒有測試它會發生什麼:) – Speed8ump

+0

現在工作謝謝! – user2933157

0

你已經找到刪除的節點,所以現在你需要的是之前後連接節點到節點。所以,你需要一個指向該節點的指針。

您需要修改代碼

if head is null, return false 
initialize counter to 0 
create two pointers: p as head and q as head->next 
while q != null do 
    if counter == position do <- q is pointing to the node you need to remove 
     store the info from q 
     p->next = q->next <- this is where the node gets removed 
     return true 
    q = q->next 
    p = p->next 
return false 

或者做遞歸:(並不總是建議,但需要較少的代碼)

deleteNode(head, position): 
    if head == null 
     return null 
    if position == 0: 
     return head->next 
    head->next = deleteNode(head->next, position - 1) 
    return head 
0

您將需要存儲next指針刪除節點之前的節點,並將其附加到刪除的單元格之後的節點。

所以,你需要一個較早的指針

List_cell* previous; 

而在while循環

count++; 
previous = current; 
current = current->next; 
if(count == position){ 
    found_number = current->number; 
    found_text = current->text; 
    previous->next = current->next; 
    delete current; 
    return true; 
}