我的一个列表副本的大小在我的堆栈中打印错误

时间:2014-02-13 08:20:42

标签: c++ linked-list stack

首先,此列表的最大大小为30,并且每个列表中创建的项目数存储在num_items中,这是通过我在其他地方使用的推送和弹出方法递增和递减但我想知道是否需要保留这里也跟踪num_items。我将展示我期待的输出以及我得到的输出:

enter image description here

我现在将展示复制我的堆栈的代码:

void operator=(const Stack& s)
    {
        if (s.top == NULL)
            top = NULL;
        else
        {
            top = new Node;
            top->data = s.top->data;
            Node* newP = top;

                for(Node* curr = s.top->link; curr != NULL; curr = curr->link)
                {
                    if(num_items != MAX_SIZE)
                    {
                    newP->link = new Node;
                    newP = newP->link;
                    newP->data = curr->data;
                    }
                }
        }
    }

提供输出的代码是:

Stack<int> s2(s1); // s2 declared as a copy of s1
    cout << "*declare s2 as a copy of s1 (stack s2(s1))\ns2=" << s2 << endl;
    cout << "s2.Size()=" << s2.Size() << endl;
    cout << "s2.IsEmpty()=" << ((s2.IsEmpty()) ? "T" : "F") << endl;
    cout << "s2.IsFull()=" << ((s2.IsFull()) ? "T" : "F") << endl;
    cout << "s2.Peek()=" << s2.Peek() << endl;
    cout << endl;

编辑:

在代码中初始化num_items = 0;后,我将在下面显示

        void operator=(const Stack& s)
    {
        if (s.top == NULL)
            top = NULL;
        else
        {
            top = new Node;
            top->data = s.top->data;
            Node* newP = top;

                for(Node* curr = s.top->link; curr != NULL; curr = curr->link)
                {
                    num_items = 0;
                    if(num_items != MAX_SIZE)
                    {
                    newP->link = new Node;
                    newP = newP->link;
                    newP->data = curr->data;
                    num_items++;
                    }
                }
        }
    }

我得到的输出结果为1,我将在图像中再次显示整个输出:

enter image description here

第二次编辑:

我现在已将代码修改为以下内容:

void operator=(const Stack& s)
    {
        if (s.top == NULL)
            top = NULL;
        else
        {
            top = new Node;
            top->data = s.top->data;
            Node* newP = top;
                num_items = 0;
                for(Node* curr = s.top->link; curr = NULL; curr = curr->link)

                {

                    if(num_items != MAX_SIZE)
                    cout<< num_items;
                    {
                    newP->link = new Node;
                    newP = newP->link;
                    newP->data = curr->data;
                    ++num_items;
                    }
                }
        }
    }

有了这个,虽然我的大小只计算到9而不是10,我认为因为我的循环跳过0或“NULL”而是,但必须有办法让它停止这样做。

2 个答案:

答案 0 :(得分:1)

最好复制单个列表,同时保持Node **存储指向需要设置到下一个Node *的变量:

void operator=( const Stack& rhs ){ // or return Stack&
  // call this->clear() to avoid memory leak
  if( rhs.top == NULL ){ top = NULL; return /* *this */; }
  Node** store = &top;
  for( Node* curr = rhs.top; curr != NULL; curr = curr->link ){
    Node* newNode = new Node;
    num_items++;
    newNode->data = curr->data;
    *store = newNode;
    store = &newNode->link;
  }
  return /* *this */;
}

除非注意删除任何现有条目,否则此赋值运算符将产生内存泄漏。也许已经有一个clear()方法?

<强>后来: 可以使用这些构造函数:

Stack() : num_items(0), top(NULL) {}
Stack( const Stack& other ) {
  *this = other;
}

这个明确的方法应该在指明的地方使用:

void clear(){
  Node* curr = top;
  while( curr != NULL ){
    Node* next = curr->link;
    delete curr;
    curr = next;
  }
}

答案 1 :(得分:0)

Stack<int> s2(s1);

这会调用默认的复制构造函数而不是operator =。但是,由于复制逻辑是在operator =中实现的,因此节点永远不会复制到s2中。

您需要编写一个复制构造函数并将逻辑从operator =移到其中:

Stack(const Stack & other)
{
    // Copy other stack here
}