2015-02-23 46 views
0

我正在創建一個項目,其中創建了一個雙界限指針列表,刪除了多個元素,並仍能夠讀取列表。我有一個雙重有界的指針列表,但在刪除元素和保持列表雙重界限時遇到了問題。這會在嘗試打印列表時導致問題。 下面是我在while循環中放置的IF語句,以幫助刪除不需要的元素。我不斷收到分段錯誤(核心轉儲)。從雙重界限的指針列表中刪除元素

if ((black2 != black)||(white2 != white)) { 
     dump = help; 
     help = help ->next; 
     dump -> before = temp; 
     temp -> next = help; 
     help ->before = temp; 
     delete dump; 
    }//if 
    else { temp = help; 
      help = help->next; 
      help ->before = temp; }//else 
+0

是否有任何理由不使用['deque'](http://en.cppreference.com/w/cpp/container/deque)? – luk32 2015-02-23 17:10:49

+2

您是否諮詢過雙*鏈接列表的示例?有很多,包括一些StackOverflow。 – 2015-02-23 17:14:21

+1

您需要在代碼中提供更多上下文,以便人們更好地爲您提供幫助。 – 2015-02-23 17:15:16

回答

0

適當地保持雙向鏈表,你應該這樣做:

void remove(X *elt) { 
    X* before = elt->before; 
    X* after = elt->next; 
    if (before != NULL) { // assuming first element points to NULL 
     before->next = after; 
    } 
    else { 
     first = after; // assuming first is a pointer to first element of list 
    } 
    if (after != NULL) { // assuming last element points to NULL 
     after->before = before; 
    } 
    else { 
     last = before; // assuming last is a pointer to last element 
    } 
    delete elt; 
} 

通過這種方式,可以確保圍繞當前元素正確地指向對方處理除去特殊情況第一或最後元件。

但是你已經有標準模板庫

0

一個邏輯問題上std::list模板在你的代碼行dump->before = temp。 它的作用是將前一個節點指針dump設置爲temp,而不是將temp定義爲前一個節點。

正確的行應爲temp = dump->before

PS:你的代碼是正確的假設要刪除的節點不是第一個或最後一個節點(你有沒有與虛擬節點填充)。如果需要,您應該引入這些案例的檢查。