链接列表堆栈上的弹出功能

时间:2014-10-22 17:08:59

标签: c++ pointers linked-list stack

您好我的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;

4 个答案:

答案 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