双循环链表.新节点未插入.c++
Doubly-Circular Linked list. New node not inserting. C++
所以这个新节点应该插入到最后一个节点之后。我不明白为什么没有发生。注意:在调用这个函数之前,列表有多个元素(大约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;
}
这段代码有几个问题。首先,如果你要经常做"insertAfterLast",你应该使用"top->prev"在常量时间内获得指向最后一个元素的指针;否则,构建一个列表将需要二次(O(n^2))时间。其次,在任何实际项目中,从头开始实现循环链表几乎肯定是一个坏主意——相反,您希望坚持使用成熟的兼容stl的容器,如std::deque或Boost的circular_buffer。
假设您确实想这样做,并且您不关心空列表,那么上面的函数似乎已经完全正确。最有可能的问题是,在开始之前的初始列表是不正确的,或者更有可能的是,当您遍历列表以在最后打印它时,您跳过了最后一个元素。遍历循环链表的正确方法是这样的(改编自维基百科):
Node* Q = top;
do {
cout << Q->stId << endl;
Q = Q->next;
} while (Q != top);
相关文章:
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 预处理器:插入结构名称中的前一个行号
- 在未初始化映射的情况下,将值插入到映射的映射中
- 如何在c++中只将键插入到bimap的一侧
- 如何将结构插入到集合中并打印集合的成员
- C++json插入数组
- Visual Studio 2019:插入多个C++风格的单行注释
- nlohmann-json将一个数组插入到另一个数组中
- 有效地使用std::unordered_map来插入或增加键的值
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- 正在插入动态数组
- 插入或删除时获取usb的dos_name
- 叮叮当当在修复时插入多个"覆盖"说明符
- 链表c++插入,所有情况都已检查,但没有任何工作
- 将重物插入std::map
- C++17 - 使用自定义分配器的节点提取/重新插入 - 适用于 clang++/libc++,但不适用于 libstd
- 在数字之间插入 + 或 - 符号以使其等于整数
- 在字符串中插入空格
- 重载运算符的范围是什么?它是否会影响作为类成员的集合的插入函数?