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() 返回 tail,do{ }while(); 而不是 while(); 应该解决问题。

否则,您将始终错过最后一项,因为 while() 条件将在尾部失败,并且 p 指向该项目。

于 2013-05-04T02:46:22.837 回答