2

キュークラスを実装しようとしています(ノード構造体とキュークラスを使用)。セグメンテーション違反が発生し、目が失敗しているので、見つけられないようです。私は機能しませんし、おそらく機能しない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;
}
4

2 に答える 2

0

初期化せずpushBackに使用している場合、少なくとも1つの大きな問題があります。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 ++ 1yでの不確定な値の使用と未定義の動作に関して、C ++標準は変更されましたか?も参照してください。参考のために。

あなたがおそらくやろうとしていたことは、次のようなものでした。

   Node* temp = new Node();

   temp->data = d ;

constructorforを設定するNode方が良いでしょうが。

于 2013-03-17T02:55:23.617 に答える
0

次のような変数を設定することはできません。temp->link = NULL;

于 2013-03-17T03:01:30.200 に答える