2016-03-04 90 views
-1

我試圖編寫一些代碼從圓形雙向鏈表中刪除一個節點。我已經寫了下面的函數,它主要作品:刪除一個圓形雙向鏈表中的節點

bool Circular::remove(int index) 
{ 
    if (head == NULL) 
     return false; 
    Node* current; 
    current = head; 
    if (index > 0) 
    { 
     for (int i = 0; i < index; i++) 
     { 
      current = current->next; 
     } 
    } 
    else if (index < 0) 
    { 
     for (int i = 0; i < abs(index); i++) 
     { 
      current = current->prev; 
     } 
    } 
    if (current == head) 
    { 
     head = current->next; 
    } 
    else if (current == tail) 
    { 
     tail = current->prev; 
    } 
    current->prev->next = current->next; 
    current->next->prev = current->prev; 
    return true; 
} 

我唯一的問題是,當我通過數字1到索引數量也不會刪除正確的值。相反,它總是刪除尾部。如果你認爲我的代碼在其他地方有問題,那麼我也會研究它。

+2

通過鏈接列表工作的好方法是筆和紙。繪製節點。繪製所有的鏈接。一個接一個,並且一次只有一個地方沒有鏈接點,請將鏈接更改爲所需的配置。編碼你必須採取的步驟。還花一些時間學習使用系統的調試器。當您可以一行一行地觀看程序時,加快解決問題的時間。 – user4581301

+0

你能給出一個顯示錯誤的完整測試用例嗎? – mindriot

+1

另外,你的'remove'方法泄漏內存;它會丟棄指針但不會刪除該節點。 – mindriot

回答

0

我想我已經知道了。主要是我使用的功能去除頭...

Node* temp = head; 
head = head->next; 
head->prev = tail; 
tail->next = head; 
delete temp; 
return true; 

...並去除尾:

Node* temp = tail; 
tail = tail->prev; 
tail->next = head; 
head->prev = tail; 
delete temp; 
return true; 

顯然就在頭移動和尾巴是不夠的,實際刪除那些節點。