2012-11-09 67 views
0

我寫一個程序,它是有點像驚奇,但我有一個問題,使得對和他們將在列表中,然後把他們從名單。C++賽格故障我的列表類,但一切似乎在檢查

List.cc 
    #include <iostream> 
    #include <cassert> 
    #include <cstdlib> 
    #include "list.h" 

    using namespace std; 

    List::Node::Node() 
    { 
    prev = next = NULL; 
    } 

    List:: List() 
    { 
    front = new Node() 
    rear = new Node() 
    front->next = rear; 
    rear->prev = front; 

    currentIndex=0; 
    current = front->next; 
    size=0; 
    } 

    List::~List() 
    { 
    _setCurrentIndex(0); 
    while(current) 
     { 
     Node *temp = current; 
     current = current -> next; 
     delete temp; 
     } 
    //not showing deep copy function b/c it isn't important for this program 
    void List::add(const ElementType & item, size_t index) 
    { 
    assert(0<=index && index <= size); 
    _setCurrentIndex(index); 
    size++; 

    Node *born = new Node; 
    born->data = item; 
    born->prev = current->prev; 
    born->prev->next = current; 
    born->prev = born; 
    current = born; 
    } 

    void List::removeAt(size_t index) 
    { 
    assert(0<=index<=getSize()); 
    _setCurrentIndex(index); 

    Node *old = current; 
    current->prev->next = current->next; 
    current->next->prev = current->prev; 
    delete old; 
    size--; 
    } 

    void List::remove(const ElementType & item) 
    { 
    for(size_t i=0; i<size; i++) 
     { 
     _setCurrentIndex(i); 
     if(find(item)<getSize()) 
     { 
     Node *tempOld = current; 
     current->next->prev = current->prev; 
     current->prev->next = current->next; 
     current = current->next; 

     delete tempOld; 
     size--; 
     } 
     } 
    } 

    size_t List::find(const ElementType & item) const 
    { 
    for(size_t i=0; i<size; i++) 
     { 
     _setCurrentIndex(i) 
     if(get(i) == item) 
     return i; 
     } 
    return getSize(); 
    } 

    List::ElementType List::get(size_t index) const 
    { 
    assert(0 <= index < size); 
    _setCurrentIndex(index); 
    assert(current->next != NULL); 
    return current->data; 
    } 

    size_t List::getSize() const 
    { 
    return size; 
    } 

    void List::output(std::ostream & ostr) const 
    { 
    for(size_t i=0; i<size; i++) 
     { 
     _setCurrentIndex(i); 
     ostr << current->data << " "; 
     } 
    ostr << endl; 
    } 

    void List:: _setCurrentIndex(size_t index) const 
    { 
    int x; 
    if(currentIndex > index) 
     x = currentIndex - index; 
    else 
     x = index-currentIndex; 

    if(index < (sizez_t)x) 
     { 
     current = front->next; 
     curentIndex=0; 
     while(currentIndex != index) 
     { 
     current = current->next; 
     currentIndex++; 
     } 
     } 
    else if((size-index) < (size_t)x) 
     { 
     current = rear; 
     currentIndex = size; 
     while(currentIndex != index) 
     { 
     current = current->prev; 
     currentIndex--; 
     } 
     } 
    else 
     { 
     if(currentIndex > index) 
     { 
     while(currentIndex!=index) 
     { 
      current = current->prev; 
      currentIndex--; 
     } 
     } 
     else 
     { 
     while(currentIndex!=index) 
      { 
      current = current->next; 
      currentIndex++; 
      } 
     } 
     } 
    } 

看來,當我嘗試添加或刪除從我的名單什麼它導致我asserition問題,因此中止或者它只是賽格故障。

如果我把作爲

List history; 
Pair p1 = Pair(1,1) 
history.add(p1,0) 

導致簡單的聲明:

scramble: list.cc:154: Pair List::get(size_t) const: assertion 0 <= index <size failed 
aborted 
+2

作爲程序員,您在得到分段錯誤時的第一反應應該是在調試器中運行您的程序。它將幫助您找到崩潰的位置,並讓您檢查變量以幫助您查看可能導致崩潰的原因。 –

+0

作爲斷言狀態下,表達式'0 <=索引

回答

2

斷言:

assert(0 <= index < size); 
不正確的

。更改爲:

assert(0 <= index && index < size);