实现队列类,分段错误

Implementing a Queue Class, Segmentation Fault?

本文关键字:分段 错误 队列 实现      更新时间:2023-10-16

我试图实现队列类(使用节点结构和队列类)。我有一个分割错误,我的眼睛失败了,我似乎找不到它。我的pushBack不能工作,我很确定popFront可能也不能工作。我只是希望有人能在正确的方向上给我一个好的推动!

同样,如果你还没能弄清楚。我对 c++ 还是个新手。

#include <iostream>
using namespace std;
struct Node {
    int data;
    Node* link;
};
class Queue {
public:
    Queue(); 
    ~Queue(); 
    void pushBack(int d);
    bool popFront(); 
    bool isEmpty(); 
    void displayQueue();
private:
    Node* back;
    Node* front;
};
Queue::Queue() {
    back = NULL;
    front = NULL;
}
Queue::~Queue() {
    while (!isEmpty()) {
        popFront();
    }
}
void Queue::pushBack(int d) {
    Node* temp;
    if (temp == NULL) {
        return;
    } else {
            temp->link = NULL;
            if (back == NULL) {
                  back = temp;
                  front = temp;
            } else {
                  front->link = temp;
              front = temp;
            }
      }
}

bool Queue::popFront() {
    if (front == NULL) {
        return false;
    } else {
        Node* removeNode;
        removeNode = front;
        if (back == front) {
            back = NULL;
            front = NULL;
        } else {
            Node* previousFront = back;
            while (previousFront->link != front) {
                previousFront = previousFront->link;
            }
            front = previousFront;
            front->link = NULL;
        }
        delete removeNode;
        return true;
    }
}
bool Queue::isEmpty() {
    return (back == NULL);    
}
void Queue::displayQueue() {
    if (isEmpty()) {
        cout << "Queue is empty!" << endl;
    } else {
        Node *current;
        current = back;
        cout << endl << "-- BACK --  ";
        while (current != NULL) {
        cout << current->data << "  ";
            current = current->link;
        }
        cout << "-- FRONT --" << endl << endl;
    }
}
int main(){
    Queue q;
    q.displayQueue();
    q.pushBack(20);
    q.pushBack(30);
    q.displayQueue();
    q.pushBack(40);
    q.pushBack(12);
    q.displayQueue();
    q.popFront();
    q.displayQueue();
    return 0;
}

至少有一个主要问题,在pushBack中,您使用temp而没有初始化它:

 void Queue::pushBack(int d) 
 {
   Node* temp;
    if (temp == NULL) {
        ^^^^

在打开警告的情况下编译会对您有所帮助,使用-Wall标志和gcc会给您以下警告:

warning: 'temp' is used uninitialized in this function [-Wuninitialized]
 if (temp == NULL) {
 ^

像这样使用一个未初始化的自动变量是未定义的行为,这意味着你的程序的行为是不可预测的。另请参阅c++标准在c++ 1y中使用不确定值和未定义行为方面有变化吗?供参考。

你可能想要做的是这样的事情:

   Node* temp = new Node();
   temp->data = d ;

虽然为Node设置constructor会更好。

不能这样设置变量:temp->link = NULL;