您好我的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;
答案 0 :(得分:0)
行int ans = tmp->next;
似乎是问题的根源。这是尝试在节点中取next
指针,将其转换为int
,然后返回它。您(几乎可以肯定)想要的是从节点检索数据并返回该数据,例如int ans = tmp->num;
。
当然,这并不是说代码是完美的(例如,它似乎没有任何检查的尝试,更不用说处理错误了),但至少在这种改变的情况下,它有一定的机会正常工作在某些(理想)情况下。
答案 1 :(得分:0)
如果堆栈为空或具有未定义的行为,通常这样的函数会抛出异常。如果堆栈为空,我使用了返回值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类型时,还有另一种方法,即当它返回任何内容时,只需删除顶部的元素。
答案 2 :(得分:0)
正如我在comment中所提到的,你应该把它分成两个独立的功能。一个用于获取值,另一个用于弹出(删除)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.");
}
答案 3 :(得分:-1)
首先,您尝试删除tmp
节点,但顶级节点仍然存在且值必须返回为ans或top-> next或在此情况下top-> num。当节点tmp
是参数时,为什么要在函数中初始化节点tmp
?为什么node *& top应该在函数参数中而不是tmp
。
value = top-> num没有解决问题,因为他希望链接列表顶部的指针不是通过函数参数输入的随机节点。要解决此问题,Node * tmp
应该等于top,然后value应该等于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