你好,我从pop函数返回变量时遇到问题。如果你能帮助我,我会很高兴的。该函数接收到一个指向列表顶部的指针,应该返回答案,但我对指向列表的指针有问题,并对答案进行积分。
功能代码-
int pop(Node* top)
{
Node* tmp = top;
int ans = tmp->next;
top = top->next;
delete tmp;
return ans;
}
节点-
struct Node
{
int num;
Node* next;
}
Node* top = new Node;
行int ans = tmp->next;
似乎是问题的根源。这是试图获取节点中的next
指针,将其转换为int
并返回它。您(几乎可以肯定)想要的是从节点中检索数据并返回它,使用类似int ans = tmp->num;
的东西。
当然,这并不是说代码在其他方面是完美的(例如,它似乎缺乏任何检查错误的尝试,更不用说处理错误了),但至少有了这种变化,它在某些(理想)情况下有可能正确工作。
如果堆栈为空或有未定义的行为,通常这样的函数会抛出异常。当堆栈为空时,我使用了返回值0。
int pop( Node * &top )
{
int value = 0;
if ( top )
{
value = top->num;
Node *tmp = top;
top = top->next;
delete tmp;
}
return value;
}
当函数poo具有void类型时,还有另一种方法,即它只返回顶部的元素,而不返回任何内容。
正如我在评论中提到的,您应该将其拆分为两个单独的函数。一个用于获取值,另一个用于弹出(删除)Node
void pop(Node*& top) { // Note the reference. You want to change the current top node.
// ^
if ( top ) {
Node *tmp = top;
top = top->next;
delete tmp;
}
}
int& top(Node* top) {
if ( top ) {
return top->num;
}
// Throw an appropriate exception if the stack is empty
throw std::out_of_range("Stack is empty.");
}
首先,您试图删除tmp
节点,但顶部节点仍然存在,并且必须将值返回为ans或top->next,或者在这种情况下返回top->num。当节点tmp
是一个参数时,为什么要在函数中初始化节点tmp
?为什么节点*&top在函数参数中,而不是tmp
。
value=top->num并没有解决这个问题,因为他希望指针来自链表的顶部,而不是通过函数参数输入的随机节点。为了解决这个问题,Node * tmp
应该等于top,然后值应该等于tmp->num。否则,所有其他问题都已解决。
//编辑
忽略//编辑之前的所有内容,因为所有这些都是关于他的问题,我现在已经知道了。我已经编译了这个代码,它完全适用于我。
struct Node
{
int data;
Node *next;
};
int pop(Node *head)
{
while(head->next != NULL)
{
head = head->next;
}
int value;
Node *tmp;
tmp = new Node;
value = head->data;
tmp = head;
delete tmp;
return value;
}
已编译代码链接-http://ideone.com/7EgBhf