C++ 我的名单加起来不正确
到目前为止,我已经问了很多关于同一代码的问题,但这肯定是最后一个错误,这次我所要求的只是指导,看看我是否在修复它的正确轨道上。我将在下面显示我得到的输出: 我将再次显示我期望收到的输出 现在我想发生的是,当s2设置为0时,我相信C++ 我的名单加起来不正确,c++,data-structures,linked-list,stack,C++,Data Structures,Linked List,Stack,到目前为止,我已经问了很多关于同一代码的问题,但这肯定是最后一个错误,这次我所要求的只是指导,看看我是否在修复它的正确轨道上。我将在下面显示我得到的输出: 我将再次显示我期望收到的输出 现在我想发生的是,当s2设置为0时,我相信s1=s1+s2部分没有认识到s2是空的,因为它以0开头?但是总的来说,s2堆栈在应该是空的时候并不是空的,我真的不明白当它被设置为NULL时会是什么样子 我将显示将列表添加到一起的功能: Stack operator+(const Stack& s) con
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
为空,因此我相信问题可能在这段代码或以前的代码中的某个地方,我还将在下面显示我的运算符=
函数:
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;
}
}
}
}
编辑:我把整个程序贴在下面,希望它能把问题弄清楚
问题不在
s2
中,问题在操作员+
中。让我们在操作符中放入一些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;
}
在第一个循环的末尾,所有元素都在t中,但顺序错误,并且不清楚如何重新排列它们。在第二个循环结束时,事情显然已经偏离了轨道。
operator=
不应该返回void
@chris问题是它绝对必须返回,这是我们需要使用的函数。您已经问了足够多的问题来了解a是什么。您要求我们做很多额外的工作来重现错误。@Beta我很抱歉,我将发布文章以便查看结果better@Beta,我希望这有助于清楚地显示错误。谢谢,这对我来说确实很清楚,我假设我的push和pop方法的编码不正确,我想不出还有什么事情会让你大发雷霆output@BreonThibodeaux:然后测试推送和弹出方法。在你尝试建立它们之前先测试它们。每个优秀的开发人员都知道这一点,但我还没有听说有教授教授这一点。如果您知道这些方法的实际功能,那么上面的输出是完全合乎逻辑的。
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