所以这个新节点应该在最后一个节点之后插入。我无法弄清楚为什么没有发生这种情况。注意:在调用此函数之前,该列表包含多个元素(大约5个),因此现在它只需要适用于该情况。最后一个节点应指向顶部节点,顶部> prev指针应指向最后一个节点。我哪里出错了?我假设它的方式是错误的,因为最后一个节点在调用print函数时从不打印
void CircularDLL::insertAfterLast (int id, string name, string email, int age)
{
Node* N=new Node;
N->stId=id;
N->stName=name;
N->stEmail=email;
N->stAge=age;
Node* Q=top;
while(Q->next!=top)//get to the last node
{
Q=Q->next;
}
cout<<"Q next is top now"<<endl;
Q->next=N;
N->prev=Q;
N->next=top;
top->prev=N;
}
答案 0 :(得分:3)
此代码存在一些问题。首先,如果你要频繁地执行“insertAfterLast”,你应该使用“top-&gt; prev”来获取指向恒定时间内最后一个元素的指针;否则建立一个列表将需要二次(O(n ^ 2))时间。其次,在从头开始实现循环链表的任何实际项目中几乎肯定是一个坏主意 - 相反,你想要坚持使用成熟的符合STL标准的容器,如std::deque或Boost circular_buffer。
假设你确实想要这样做,并且你不关心空列表,那么上面的函数似乎已经完全正确了。很可能问题是你开始之前的初始列表是不正确的,或者更有可能的是,当你遍历列表以在最后打印它时,你正在跳过最后一个元素。迭代循环链表的正确方法是这样的(改编自Wikipedia):
Node* Q = top;
do {
cout << Q->stId << endl;
Q = Q->next;
} while (Q != top);