【问题标题】:Pop function on Linked list stack链表堆栈上的弹出功能
【发布时间】:2014-12-18 05:42:20
【问题描述】:

您好,我的 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 pop(Node*& top)?看起来top 的值应该由您的函数更改。
  • @roi hoyli 显示如何定义节点。
  • @VladfromMoscow 我更新了外观
  • @VladfromMoscow 我怀疑这是真正的问题。
  • @roi hoyli 以及如果堆栈为空返回什么?

标签: c++ pointers linked-list stack


【解决方案1】:

int ans = tmp->next; 行似乎是问题的根源。这是试图获取节点中的next 指针,将其转换为int,然后返回它。您(几乎可以肯定)想要的是从节点检索数据并将其返回,例如 int ans = tmp->num;

当然,这并不是说代码在其他方面是完美的(例如,它似乎没有任何检查错误的尝试,更不用说处理错误了),但至少有了这个改变,它有一定的机会正常工作在某些(理想)情况下。

【讨论】:

    【解决方案2】:

    通常,如果堆栈为空或具有未定义的行为,此类函数会引发异常。我使用返回值 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 时,还有另一种方法,即它什么都不返回,只是简单地删除顶部的元素。

    【讨论】:

      【解决方案3】:

      正如我在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.");
      }
      

      【讨论】:

        【解决方案4】:

        首先,您尝试删除tmp 节点,但顶部节点仍然存在,并且值必须以ans 或top->next 或在这种情况下top->num 的形式返回。当节点tmp是参数时,为什么要在函数中初始化节点tmp?为什么 node * &top 应该在函数参数中而不是tmp

        value = top->num 并没有解决问题,因为他想要的是链表顶部的指针,而不是通过函数参数输入的随机节点。要解决这个问题,Node * tmp 应该等于 top,然后 value 应该等于 tmp->num。否则所有其他问题都已修复。

        //编辑

        忽略 //edit 之前的所有内容,因为所有这些都是关于他的问题的问题,我现在已经知道了。我已经编译了这段代码,它完全适合我。

        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

        【讨论】:

        • 我认为您的答案需要更多格式,这样很难理解您的观点。
        • 我会修复格式问题,我真的不明白他的问题他是想删除列表末尾还是删除最后一个节点的数量并将其作为ans返回?
        • 好的,我已经解决了所有问题,如果您认为仍然存在错误,请详细解释您为什么这么认为
        • 我知道我迟到了三年,但答案是完全错误的。它会泄漏内存并且具有错误的复杂性。
        • 此解决方案 (1) 从错误的堆栈末端弹出 (2) 分配节点而不是删除它们,以及 (3) 泄漏内存。除此之外,它工作正常;)
        猜你喜欢
        • 2014-12-19
        • 2018-03-08
        • 2012-10-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多