0

課題として、循環型二重連結リストを作成することになっています。ただし、リストを印刷しようとすると、常に最後の要素が除外され、その理由がわかりません。イテレータについて私が理解していることから、すべてが機能しているはずですが、何かが印刷されているため、リストが短く印刷されています。

主なものは次のとおりです。

int main(void)
{
    cdll mycdll(3,'X');
    cout << "mycdll: " << mycdll << endl;
    cout << mycdll << endl;
    return EXIT_SUCCESS;
}

オブジェクトはこれで作成されます:

cdll::cdll(size_t n_elements, datatype datum) 
        :m_size(0), head(nullptr), tail(nullptr)
{
    if(n_elements <= 0)
        throw out_of_range("Empty cdll");
    for(size_t i = 0; i < n_elements; ++i)
        push_front(datum);
}

そして、これが私が印刷する場所です:

ostream& operator<<(ostream& sout, const cdll& x) 
{
    cdll::iterator p = x.begin(); // gets x.h
    sout << "(";

    while(p != x.end())
    {
         sout << *p;
         if(p->next != x.end())
            sout << ",";
         ++p; // advances iterator using next
    }
        sout << ")\n";
        return sout;
}

そして、それが役立つ場合、これは pushBack() です

void cdll::push_front(datatype datum) 
{
    node* temp = new node(datum, tail, head);
    m_size++;
    if (!empty())
   { // was a nonempty cdll
        head->prev = temp;
        tail->next = temp;
        head = temp;

    }
    else 
    {
        head = tail = temp;
    }
}

私が得る出力はmycdll(X,X,)で、期待していmycdll(X,X,X)ます。のイテレータに問題がありますprint()。何か案は?

4

1 に答える 1

0

end() がテールを​​返すと仮定すると、 do{ }while(); while() の代わりに; 問題を修正する必要があります。

そうしないと、最後に while() 条件が失敗し、 p がこのアイテムを指しているため、常に最後のアイテムを見逃すことになります。

于 2013-05-04T02:46:22.837 に答える