【问题标题】:Doubly-Circular Linked list. New node not inserting. C++双循环链表。新节点未插入。 C++
【发布时间】:2011-05-06 23:17:13
【问题描述】:

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

}

【问题讨论】:

  • 你能发布你的打印功能吗?也许这是不正确的。
  • 如果是循环双链表,为什么不使用top-&gt;prev到达最后一个节点呢?

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


【解决方案1】:

此代码有一些问题。首先,如果你要经常做“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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 2011-07-21
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 2019-04-26
    相关资源
    最近更新 更多