使循环链表中的最后一个节点出队

时间:2019-03-17 01:06:50

标签: c++ data-structures queue circular-queue

当我尝试在C ++中使基于循环链表的队列中的最后一个节点出队时,出现了分段错误。最后一个元素之前的其余元素已被成功删除,它只是最后一个元素,这似乎与释放有关,但是来自终端的唯一日志是Segmentation Fault:11.有人可以帮我理解为什么我会得到这种行为。我将以下完整的实现文件粘贴到下面,以防Enqueue函数或构造函数出现问题。

#include "BQUEUE.h"
#include <iostream>

using namespace std;

BQUEUE::BQUEUE(): front(nullptr) {}

BQUEUE::BQUEUE(const BQUEUE & queue){
  bqnode *temp = queue.front;
  while (temp->next != queue.front){
    Enqueue(temp->time);
    temp = temp->next;
  }
  Enqueue(temp->time);
}

BQUEUE::~BQUEUE(){
  bqnode *current = front;
  while (current->next != front)
    Dequeue();
}

void BQUEUE::Dequeue(){
  // Empty queue
  if (front == nullptr){
    return;
  } else if (front->next == front){
    front->next = nullptr;
    delete front;
    front = nullptr;
  } else {
    bqnode *temp = front, *current = front;
    while (current->next != front)
      current = current->next;
    front = front->next;
    current->next = front;
    delete temp;
  }
}

void BQUEUE::Print(){
  bqnode *temp = front;
  while (temp->next != front){
    cout << temp->time << endl;
    temp = temp->next;
  }
  cout << temp->time << endl;
}

void BQUEUE::Enqueue(int i){
  bqnode *newNode = new bqnode;
  newNode->time = i;
  if (front == nullptr){
    front = newNode;
    front->next = front;
  } else {
    newNode->next = front;
    bqnode *previous = front;
    if (previous->next == front){
      front->next = newNode;
      return;
    }
    while (previous->next != front)
      previous = previous->next;
    previous->next = newNode;
  }
}

驱动程序:

#include <iostream>
#include "BQUEUE.h"

using namespace std;

int main(){
  BQUEUE k;
  k.Enqueue(60);
  k.Dequeue(); // Segmentation fault occurs here
}

标题:

#ifndef BQUEUE_H
#define BQUEUE_H

class bqnode {
public:
  int time;
  bqnode *prev, *next;
};

class BQUEUE {
  public:
    BQUEUE();
    ~BQUEUE();
    BQUEUE(const BQUEUE &);
    void Enqueue(int);
    void Dequeue( );
    void Print( );
  private:
    bqnode *front;
  };

#endif

1 个答案:

答案 0 :(得分:2)

一个问题是这个

ReflectionUtils.findField(httpComponentsClientHttpRequestFactory.getClass(), "connectTimeout");

然后在析构函数中,您没有检查void BQUEUE::Dequeue() { // Empty queue if (front == nullptr) { return; } else if (front->next == front) { // <-- This is invoked when there is only one node remaining front->next = nullptr; delete front; front = nullptr; // <--- This is now nullptr } ... 是否为front

nullptr

然后,您访问BQUEUE::~BQUEUE() { bqnode *current = front; // <-- No check to see if front is nullptr while (current->next != front) Dequeue(); } ,这是无效的,因为current->nextcurrent。解决方法是简单地检查nullptr是否为front,如果是,则无事。

nullptr