2016-11-27 6 views
1

リンクリストに基づいてC++でキューコンテナを実装しようとしています。私はスタックを実装するために同じ構造を使用し、それは正常に働いた。C++でリンクリストを使用したキュー実装

しかし、今私は方法 "エンキュー"に問題がある。私はポインタが私の弱点であることを知っているが、正確に何が問題なのか理解できない。

#include <iostream> 

template <class N> 
class node { 
public: 
    N data; 
    node* next; 
}; 

template <class Q> 
class my_queue { 
protected: 
    node<Q>* m_head; 
    unsigned int m_size; 

public: 
    my_queue() { 
    m_head = NULL; 
    m_size = 0; 
    } 

    void enqueue(Q value) { 

    node<Q>* newel = new node<Q>; // creating the new element 
    node<Q>* last = m_head; // find the last element in the queue 

    while(last != NULL) { 
     last = last->next; 
    } 

    newel->data = value; 
    newel->next = last->next; 
    last->next = newel; 

    m_size++; 
    } 

    void print() { 
    node<Q>* element = m_head; // element == each element in the list 
    while(element != NULL) { 
     std::cout << element->data << std::endl; 
     element = element->next; 
    } 
    } 

}; 

私はこれをコンパイルする場合:

main() { 
    my_queue<int> q; 
    q.enqueue(1); 
    q.enqueue(2); 
    q.enqueue(3); 
    q.enqueue(4); 
    q.enqueue(5); 
    q.print(); 

    return 0; 
} 

私はエラーを取得していないが、私はそれを実行したとき、私は「セグメンテーションフォールト」を取得します。機能におけるこのループ後

+0

最初の要素を挿入すると、 'last'は割り当てられなかった' m_head'になりますので、 'last-> next = newel'を実行することはできません。 – Polb

+0

それはソリューションの一部でした! – vgratian

答えて

2

while(last != NULL) { 
    last = last->next; 
} 

NULLに常に等しくなるlastポインタ。だから、関数は、関数は、両面に基づいてそれを実装した方がよいキューをより効率的にするために、次のよう

void enqueue(const Q &value) 
{ 
    node<Q> *newel = new node<Q> { value, nullptr }; 

    if (m_head == nullptr) 
    { 
     m_head = newel; 
    } 
    else 
    { 
     node<Q> *last = m_head; // find the last element in the queue 

     while (last->next != nullptr) last = last->next; 

     last->next = newel; 
    } 

    m_size++; 
} 

を書き換えることができ

newel->next = last->next; 
last->next = newel; 

によるこれらの記述に未定義の動作をしていますリスト。

+0

素晴らしい、ありがとう:) おかげで、改訂されたコードを追加する前に、私はあなたのコメントを読んだ後にまったく同じ方法で書き直しました:) – vgratian

+0

両面のリストはどういう意味ですか? – 0x499602D2

+0

@ 0x499602D2テールポインタを持つ単一リンクリストです。したがって、新しいノードをリストの任意の側に追加することができます。 –

関連する問題