2014-03-19 202 views
0

我試圖讓我的刪除功能爲雙向鏈接列表工作。我覺得我的代碼是正確的,但它一直在打破。我相信當我刪除節點時它有事要做,但我不確定編譯器是否一直在使用throw.cpp?所以我不太確定最新的錯誤。這裏是我的代碼:刪除雙列表上的功能

ItemType remove(int index) 
    { 
    ItemType name; 
    Node* temp; 
    Node* current; 
    int pos = 0; 
    int endpos = size - 1; 

    if (index >= 0 && index <= size) 
    { 
     if (index == 0) 
     { 
      temp = head; 
      delete head; 
      head = temp->next; 
      size--; 
      name = temp->info; 
      return name; 
     } 
     else if (index == size - 1) 
     { 
      temp = tail; 
      delete tail; 
      tail = temp->prev; 
      size--; 
      name = temp->info; 
      return name; 
     } 
     else if (index <= size/2) 
     { 
      current = head; 
      while (pos != index) 
      { 
       current = current->next; 
       pos++; 
      } 
     } 
     else if (index > size/2) 
     {   
      current = tail; 
      while (endpos != index) 
      { 
       current = current->prev; 
       endpos--; 
      } 
     } 
    } 

    temp = current; 
    current->prev->next = current->next; 
    current->next->prev = current->prev; 
    delete current; 
    size--; 
    name = temp->info; 
    return name; 


    } 

如果任何人都可以看到什麼可能是甜的問題。

回答

1

什麼是錯誤?

有些建議,在刪除頭尾時,先刪除舊的頭/尾指針。因此,代碼

temp = head; 
delete head; 
head = temp->next; 

應改爲

temp = head; 
head = temp->next; 
delete temp; 

做的尾巴一樣。這是因爲當您撥打delete head時,指向與head相同位置的temp現在具有垃圾值,因此您不能只在隨後的命令中使用temp->next

此外,當致電name = temp->info時,確保它在變量被刪除之前。

+0

這是完美的,謝謝。我是否需要將任何內容分配給NULL,例如,如果我有一個列表,並最終一次刪除整個列表中的一個節點? – DrackBlagon

+0

當列表被全部刪除時,將'head'和'tail'設置爲'NULL'也是一件好事。 – rcs

+0

很酷,這是我最終做的和它的工作,再次感謝。 – DrackBlagon

0

這裏有一些修改

,而不是這個

if (index >= 0 && index <= size) 

使用

if (index >= 0 && index < size) 

更新指針這就是爲什麼這個會崩潰之前,您要刪除的節點。所以首先你需要更新頭指針然後刪除溫度。像這樣

temp = head; 
head = head->next; 
delete temp; 

相同,而刪除尾指針也適用

temp = tail; 
tail = tail->next; 
delete temp; 

這裏刪除臨時並非當前

temp = current; 
current->prev->next = current->next; 
current->next->prev = current->prev; 
delete temp; 

,並使用

name = current->info;