在链表堆栈上弹出函数



你好,我从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