我的列表类别的C SEG故障,但似乎都在检查

C++ Seg faults for my list class, but all seems in check

本文关键字:检查 故障 列表 SEG 我的      更新时间:2023-10-16

我正在编写一个像笨拙的程序一样,但是我遇到了一个问题,然后将它们配对并放入列表中,然后将它们从列表中删除。

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++;
          }
        }
      }
    }

看来,当我尝试添加或从列表中删除任何内容时,它会导致我的助攻问题和中断,或者只是出现故障。

如果我的语句和

一样简单
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

断言:

assert(0 <= index < size);

不正确。更改为:

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