C++声明双链表,使用两个 for 循环双向遍历列表并打印
C++ declaring double-linked list, traverse list both ways with two for-loops and print
刚从C++开始(请温柔一点(。我有一些代码,我必须:
- 添加元素*以制作双向链表
- 将 insert_before(( 和 insert_after(( 方法添加到元素
- 使用两个单独的 for 循环列出双向遍历
- 在每个循环内打印操作编号
法典
我尝试了以下方法:
#include <cstdio>
struct Element {
Element* next{};
Element* previous{};
void insert_after(Element* new_element) {
new_element -> previous = this;
new_element -> next = this -> next;
this -> next = new_element;
}
void insert_before(Element* new_element) {
new_element -> previous = this -> previous;
new_element -> next = this;
this -> previous = new_element;
}
char prefix[2];
short operating_number;
};
int main() {
Element trooper1, trooper2, trooper3, trooper4;
trooper1.prefix[0] = 'T';
trooper1.prefix[1] = 'K';
trooper1.operating_number = 421;
trooper1.insert_after(&trooper2);
trooper2.prefix[0] = 'F';
trooper2.prefix[1] = 'N';
trooper2.operating_number = 2187;
trooper2.insert_before(&trooper3);
trooper3.prefix[0] = 'L';
trooper3.prefix[1] = 'S';
trooper3.operating_number = 005;
trooper3.insert_before(&trooper4);
trooper4.prefix[0] = 'F';
trooper4.prefix[1] = 'K';
trooper4.operating_number = 2602;
for (Element *cursor = &trooper1; cursor; cursor = cursor -> next) {
printf("stormtrooper %c%c-%dn",
cursor->prefix[0],
cursor->prefix[1],
cursor->operating_number);
}
for (Element *cursor = &trooper3; cursor; cursor = cursor -> previous) {
printf("stormtrooper %c%c-%dn",
cursor->prefix[0],
cursor->prefix[1],
cursor->operating_number);
}
}
这是非常基本的,我知道。但我开始学习了。 代码编译正确,但我得到以下输出:
/home/facundo/Escritorio/C++Projects/cmake-build-debug/C__Projects
stormtrooper TK-421
stormtrooper FN-2187
stormtrooper LS-5
stormtrooper FK-2602
stormtrooper TK-421
Process finished with exit code 0
我真的不明白为什么它只打印那个(我想应该有 8 行输出(。 我期待一个输出可以打印这样的元素:
骑兵1
骑兵4
骑兵3
骑兵2
骑兵2
骑兵3
骑兵4
骑兵1
一些帮助将不胜感激。感谢您抽出宝贵时间。
在insert
函数中,您没有正确链接所有指针:
void insert_after(Element* new_element) {
new_element -> previous = this;
new_element -> next = this -> next;
this -> next = new_element;
if (new_element -> next) // this check needed
// to correctly link the next -> previous
new_element -> next -> previous = new_element;
}
和
void insert_before(Element* new_element) {
new_element -> previous = this -> previous;
new_element -> next = this;
this -> previous = new_element;
if (new_element -> previous) // this check needed
// to correctly link the previous -> next
new_element -> previous -> next = new_element;
}
另外,在第二个for
循环中,请注意trooper2
是列表中的最后一个Element
,而不是trooper3
,因此您需要从那里开始反向查看所有Element
。
这是一个演示。
相关文章:
- 如何在C++中从两个单独的for循环中添加两个数组
- 为什么我的for循环不能正确获取argv
- 在基于范围的for循环中使用结构化绑定声明
- 通过for循环使用用户输入填充列表
- 使用for循环检查数组中的重复项
- 在for循环中使用auto vs decltype(vec.size())来处理字符串的向量
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- 正在使用for循环创建QScatterSerie
- Python中的for循环与C++有何不同
- 在更改for循环的第三部分后,未使用for循环结果
- 在 for 循环中查找问题时遇到困难
- 嵌套for循环C++的问题(初学者)
- 如何用for循环在c++中生成单词三角形
- 如何在for循环中包含两个索引值的测试条件
- 带有多个独立参数的C++For循环
- C++ Python 循环"for i, num in enumerate(list):"版本
- C 多循环 for () 基础知识
- 没有条件值的 FOR 循环"for (int i = 1; ; i++)"无法正常工作
- 为用户提供循环for循环的选项
- 打破循环for循环