使用push时队列程序中的分段错误

时间:2015-03-28 04:35:14

标签: c++ queue push

当我尝试将元素推入队列时,我遇到了分段错误,我不是一个使用队列的专家,所以我不知道问题出在哪里。 我一直在寻找这个问题的解决方案,即使人们遇到类似的问题我也没有帮助我解决我的问题。 这是代码:

(我在Dev-c ++ 5.9.2中使用了调试选项,它告诉我行“temp-> link = NULL;”导致问题,但我不知道如何修复它)

#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; <========== This is where is get the error
            if (back == NULL) {
                  back = temp;
                  front = temp;
            } else {
                  front->link = temp; <===== here too
              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;
}

3 个答案:

答案 0 :(得分:2)

添加新内容时必须知道 节点到您构建的列表,您需要分配一个动态 新节点的位置,然后将其添加到列表-queue - ;

第二件事:当后面指向链接中的某个节点时 你需要在后面指向的节点上创建新节点, 然后使后指针指向新节点。

新功能(pushBack)bacomes:

void Queue::pushBack ( int d ) {
Node* temp = new Node;
temp->data = d;
temp->link = NULL;

        if (back == NULL) {
            back = temp;
            front = temp;
        }
        else {
            temp->link = back;
            back = temp;
        }

}

答案 1 :(得分:1)

您正在创建指向节点的指针,但尚未创建节点。 (其他人都说过的话)

更改

Node* temp; - 堆叠内存

Node *temp = new Node() - 堆内存

答案 2 :(得分:0)

  

我不是一个使用队列的专家所以我不知道问题在哪里

请注意,问题与队列无关:问题在于理解语言的工作原理。

正如Thornkey指出的那样,你的pushBack函数中有temp var。它是一个指针,但它会指向随机数据,直到你告诉它指向什么。当你按照指针时,它可以去任何地方并获得段错误或打破程序的其他部分。