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

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

所以这个新节点应该插入到最后一个节点之后。我不明白为什么那没有发生。注意:在调用此函数之前,该列表有多个元素(大约 5 个),所以现在它只需要在这种情况下工作。最后一个节点应该指向顶部节点,top->prev 指针应该指向最后一个节点。我哪里出错了?顺便说一句,我假设它是错误的,因为调用打印函数时最后一个节点从不打印

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;

}

最佳答案

这段代码有几个问题。首先,如果你打算频繁地执行“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);

关于c++ - 双循环链表。新节点未插入。 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5917969/

相关文章:

c - 链表还是顺序内存?

c - 链表稀疏矩阵之间的矩阵乘积

c - 标记双向链表中的当前位置

algorithm - 是否有使用指针的堆或类堆结构,换句话说,节点不在数组中?

c++ - 编写按字典顺序添加新元素的链接函数的更短/更有效的方法

c++ - 异常段错误

c++ - 没有模板重新绑定(bind)的 typedef 模板。作为模板类参数的模板使用

c++ - 将指向成员函数的指针绑定(bind)到 std::pair 并转换为 void*

c++ - 如何使用 gzip 压缩压缩包?

c - 为什么这段链表有序插入代码在 GCC CEntos 中不起作用?