队列类的取消排队方法"Aborted (core dumped)"错误

"Aborted (core dumped)" error in dequeue method of queue class

本文关键字:core dumped 错误 Aborted 队列 取消 排队 方法      更新时间:2023-10-16

这个队列类的脱口字方法无法正常工作,我不确定为什么。当我运行它时,它说" *错误中的错误":d double free或Droblastion(fasttop):0x0000000000018DFE50 * > ",然后进行回溯,然后"中止(core dustped)"。

首先,我直接删除底部节点,但我认为这可能是问题,所以我切换了以另一种方式删除它们。

这是Dequeue方法:

int Queue::dequeue() {
  if (isEmpty()) {
    cout << "ERROR: Can't dequeue from empty Queue"<< endl;
    return -1;
  } else {
    Node* n = top;
    if (n == NULL){
      bottom = top;
      return 0;
    }
    if (n->next == NULL){
      delete n;
      bottom = top;
      return 0;
    }
    while(n->next->next != NULL){
      n = n->next;
    }
    bottom = n;
    n = n->next;
    delete n;
    return 0;
  }
}

这是整个文件:

  #include <iostream>
  using namespace std;
  struct Node {
      int data;
      Node *next;
  };
  class Queue {
  public:
      Queue(); //constructor
      ~Queue(); //destructor
      void enqueue(int d); //enqueues node onto top of Queue
      int dequeue(); //dequeues bottom node off of Queue -- returns integer dequeued
      bool isEmpty(); //checks if Queue is empty
      void print(); //print contents of Queue from top to bottom
  private:
      Node* top; //points to top node in Queue
      Node* bottom; //points to bottom node in Queue
  };
  Queue::Queue() {
      top = NULL;
      bottom = NULL;
  }
  Queue::~Queue() {
    while (!isEmpty())
      dequeue();
  }
  void Queue::enqueue(int d) {
    Node* temp = new Node;
    temp->data = d;
    temp->next = top;
    top = temp;
    if (temp->next == NULL){
      delete bottom;
      bottom = temp;
    }
  }
  int Queue::dequeue() {
    if (isEmpty()) {
      cout << "ERROR: Can't dequeue from empty Queue"<< endl;
      return -1; //error
    } else {
      Node* n = top;
      if (n == NULL){
        bottom = top;
        return 0;
      }
      if (n->next == NULL){
        delete n;
        bottom = top;
        return 0;
      }
      while(n->next->next != NULL){
        n = n->next;
      }
      bottom = n;
      n = n->next;
      delete n;
      return 0;
    }
  }
  bool Queue::isEmpty() {
    return (top==NULL);
  }
  //Print Queue from top to bottom
  void Queue::print(){
    Node* n = top;
    while(n != NULL){
      cout << n->data << endl;
      n = n->next;
    }
    cout << endl;
  }
  int main(){
      Queue* s = new Queue();
      s->print();
      s->enqueue(20);
      s->enqueue(30);
      s->print();
      s->enqueue(40);
      s->enqueue(12);
      s->print();
      s->dequeue();
      s->print();
      s->dequeue();
      s->print();
      s->dequeue();
      delete s;
      return 0;
  }

每当删除节点时,都需要更新所有指向删除节点的指示。您需要在两个地方进行此操作。

首先,在n->next == NULL情况下,Queue只有一个节点。调用delete n后,top仍指向现在已删除的节点,并且您需要在更改bottom的值之前更新top(null或nullptr)。

在列表中有多个节点的最后一个情况下,您删除了最后一个节点,但是上一个节点的next指针仍指向它。在n = n->next表达式之后,您需要设置bottom->next以指向n->next现在指向的节点(因为nQueue中的最后一个节点,为null)。