双循环链表。新节点未插入。 C ++

时间:2011-05-06 23:17:13

标签: c++ linked-list doubly-linked-list circular-list

所以这个新节点应该在最后一个节点之后插入。我无法弄清楚为什么没有发生这种情况。注意:在调用此函数之前,该列表包含多个元素(大约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;

}

1 个答案:

答案 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);