1

所以这个新节点应该插入到最后一个节点之后。我无法弄清楚为什么没有发生这种情况。注意:该列表在调用此函数之前有多个元素(大约 5 个),因此到目前为止它只适用于这种情况。最后一个节点应该指向顶部节点,top->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;

}
4

1 回答 1

3

这段代码有一些问题。首先,如果你要经常做“insertAfterLast”,你应该使用“top->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);
于 2011-05-06T23:37:06.583 回答