我的列表添加错误

时间:2014-02-14 01:48:34

标签: c++ data-structures linked-list stack

到目前为止,我一直在问这个相同代码的很多问题,但这绝对是最后一个错误,我这次要求的只是指导,看看我是否正在修正它。我将展示我得到的输出:

enter image description here

我将再次展示我期待收到的输出

enter image description here

现在我认为发生了什么,当s2设置为0时,我相信s1 = s1 + s2部分没有认识到s2是空的,因为它从0开始?但总的来说,s2堆栈应该是空的,我真的不明白它是如何设置为NULL的。

我将展示将我的列表添加到一起的功能:

Stack operator+(const Stack& s) const
    {
        // copy the first list
        Stack t = *this;
        Stack u = *this;
        Node *n = s.top;

        // iterate through the second list and copy each element to the new list
        while (n != NULL && !t.IsFull())
        {
            t.Push(n->data);
            n = n->link;
        }
        n = t.top;
        while(n != NULL && !t.IsEmpty())
        {
            u.Push(n->data);
            t.Pop();
            n = t.top;
        }

        return u;
    }

在上面的代码中,我尝试返回t而导致*s1 = s1 + s2为NULL,因此我认为问题可能出现在此代码或之前的代码中,我还会显示operator=功能如下:

void operator=(const Stack& s)
    {
        if (s.top == NULL){
            num_items = 0;
            top = NULL;}
        else
        {
            top = new Node;
            top->data = s.top->data;
            Node* newP = top;
                num_items = 1;
                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;
                    ++num_items;
                    }
                }
        }
    }

编辑:我发布了下面的整个程序,希望它能解决问题

http://ideone.com/KaJWFQ

1 个答案:

答案 0 :(得分:0)

问题不在s2,问题出在operator+。让我们在运算符中放入一些cout语句,看看发生了什么:

Stack operator+(const Stack& s) const
{
  // copy the first list
  Stack t = *this;
  Stack u = *this;
  Node *n = s.top;

  // iterate through the second list and copy each element to the new list
  while (n != NULL && !t.IsFull())
  {
    t.Push(n->data);
    n = n->link;
  }

  cout << "end of first while loop, t is " << t << endl;

  cout << "entering second while loop, u is " << u << endl;

  n = t.top;
  while(n != NULL && !t.IsEmpty())
  {
    u.Push(n->data);
    t.Pop();
    n = t.top;
  }

  cout << "end of second while loop, u is " << u << endl;

  return u;
}

假设*this为{1 2 3}且s为{4 5 6}。人们可能希望“添加它们会导致{1 2 3 4 5 6},但练习的结果是:

end of first while loop, t is 6 5 4 1 2 3
entering second while loop, u is 1 2 3 
end of second while loop, u is 3 2 1 4 5 6 1 2 3

在第一个循环结束时,所有元素都在t中,但顺序错误,并且不清楚如何重新排列它们。在第二轮循环结束时,事情显然已经脱轨了。