所以这个新节点应该插入到最后一个节点之后。我不明白为什么那没有发生。注意:在调用此函数之前,该列表有多个元素(大约 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/