0

テンプレートの使用方法を学ぶために、独自のテンプレート キュー クラスを作成しようとしています。この種の質問が頻繁に寄せられることがわかりました。多くの回答を読みましたが、何が間違っているのかまだわかりません。

template <class type>
struct Node{
    type data;
    Node *next;
};

template <class type>
class LinkedListQueue{
public:
    LinkedListQueue();
    void push(type new_data);
    void pop();
    type front();
    void print();

private:
    Node<type> *head;
    Node<type> *tail;
};

template <class type>
LinkedListQueue<type>::LinkedListQueue(){
    this->head = NULL;
    this->tail = NULL;
}

template <class type>
void LinkedListQueue<type>::push(type new_data){
    Node<type> *newNode;
    newNode->data = new_data;
    newNode->next = NULL;

    if(this->head == NULL){
        this->head = newNode;
        this->tail = newNode;
    }else{
        this->tail->next = newNode;
        this->tail = newNode;
    }
}

template <class type>
void LinkedListQueue<type>::pop(){
    if(this->head != NULL){
        this->head = this->head->next;
        if(this->head == NULL){
            this->tail == NULL;
        }
    }else{
    cout << "Queue is Empty" << endl;
    }
}

template <class type>
type LinkedListQueue<type>::front(){
    return(this->head->data);
}

int main() {
    LinkedListQueue<int> newQueue;
    newQueue.push(5);
    newQueue.push(4);
    cout << newQueue.front() << endl;
    newQueue.pop();
    cout << newQueue.front() << endl;
}

問題がどこにあるかを判断するのに苦労しています。pop と最後の front 呼び出しをコメントアウトすると、最初の front() 呼び出しが正しく出力されます。ただし、ポップとフロントのコメントを外すと、すべてが壊れます。pop() をデバッグしようとすると、リストにノードが 1 つしかないように見えます。

どんな助けでも大歓迎です。

4

2 に答える 2

0

新しいノードを割り当てていません。データを保存するだけです。

Node<type> *newNode; //<=== indeterminate pointer
newNode->data = new_data;
newNode->next = NULL;

どういうわけか、あなたは常に新しい要素を押し込んでいるので、それを割り当て、設定し、そしてそれがどこに行くのかを理解します。また、データのconst-refを取得し、nextをNULLに設定するノードのコンストラクターを作成します。これにより、コードが大幅に単純になります(実際にはより効率的になります)。

Node<type> *newNode = new Node<type>(new_data);

ノードテンプレートは次のようになります。

template <class type>
struct Node
{
    Node(const type& value) 
        : data(value), next(NULL) {};
    type data;
    Node *next;
};

最後に、pop()ノードを削除するのではなく、ポインタをいじくりまわすだけです。あなたもそれに対処したいかもしれません。

template <class type>
void LinkedListQueue<type>::pop()
{
    if(this->head != NULL)
    {
        Node<type>* victim = this->head;
        this->head = this->head->next;
        if(this->head == NULL)
            this->tail == NULL;
        delete victim; // <=== note: deleting node.
    }
    else
    {
        cout << "Queue is Empty" << endl;
    }
}
于 2013-01-29T10:11:19.477 に答える
0

ここに大きな問題があります:

Node<type> *newNode;
newNode->data = new_data;

ポインタを宣言し、メモリを割り当てずに直接アクセスを開始します。これは、ポインタが一見ランダムな場所を指していることを意味します。未定義の動作につながり、奇妙なことが起こることが予想されます。

また、ノードにメモリを割り当てると、関数内のノードを解放しないため、メモリリークが発生しますpop

于 2013-01-29T10:11:33.727 に答える