我可以使用 while 或 for 循环来打印列表吗?
Can I use a while or for loop to print the list?
#include <iostream>
#include <string.h>
namespace forward_circular_linked_list {
typedef struct Node {
std::string data;
Node *nextNode;
}Node;
class ForwardCircularLinkedList {
private:
Node *head;
public:
ForwardCircularLinkedList() : head(nullptr) {}
void AddItem(std::string data) {
Node * newNode = new Node();
newNode->data = data;
if(head == nullptr)
{
head = newNode;
newNode->nextNode = head;
} else{
Node * copyOfHead = head;
while(copyOfHead->nextNode != head)
{
copyOfHead = copyOfHead->nextNode;
}
copyOfHead->nextNode = newNode;// process last node
newNode->nextNode = head;
}
}
void print()
{
Node * copyOfHead = head;
do
{
std::cout<<copyOfHead->data;
copyOfHead = copyOfHead->nextNode;
}while(copyOfHead != head);
}
public:
static void Test() {
ForwardCircularLinkedList list;
list.AddItem("Hello");
list.AddItem(" ");
list.AddItem("World");
list.AddItem("!");
list.print();
}
};
}
此处,do-while 用于打印列表的元素。
在当前设置下,我可以使用 while 或 for 循环来打印列表吗?
注意:我正在考虑将do-while
和while
作为不同的循环结构。
是的,您可以使用 do-while
或 for
循环。
但是 do-while
更自然,因为它在代码主体 之后检查条件 。
你有一个循环数据结构,并且(大概)你想打印每个元素一次。
只做一轮盘旋。
do{...move circulator}while(compare with head)
逻辑正确。
CGAL 实现了“循环器”并且正是这样做的,它从“头”开始做一些事情并增加循环器直到它再次成为头。
请参阅 https://doc.cgal.org/latest/Circulator/classCirculator.html(滚动到示例)。
请注意,该示例还会在开始时检查 emptyness,但您可能需要这样做。
(在我看来,循环缓冲区永远不会为空,但我接受其他意见。)
while
你有:
Node * copyOfHead = head;
do
{
std::cout<<copyOfHead->data;
copyOfHead = copyOfHead->nextNode;
}while(copyOfHead != head);
有了for
你就可以拥有
Node * copyOfHead = head;
for(;;){
std::cout<<copyOfHead->data;
copyOfHead = copyOfHead->nextNode;
if(copyOfHead == head) break;
}
或
for(Node * copyOfHead = head;;){
std::cout<<copyOfHead->data;
copyOfHead = copyOfHead->nextNode;
if(copyOfHead == head) break;
}
或
for(Node * copyOfHead = head; ; copyOfHead = copyOfHead->nextNode){
std::cout<<copyOfHead->data;
if(copyOfHead->nextNode == head) break;
}
或(利用循环体的计算结果为 bool:true)
for(
Node * copyOfHead = head;
std::cout<<copyOfHead->data;
copyOfHead = copyOfHead->nextNode
) if(copyOfHead->nextNode == head) break;
for
的主要优点是初始化,但仍然不值得。
您当然可以执行循环外的步骤,但是您会重复代码等。
(不推荐,甚至可能有错误)
Node * copyOfHead = head;
std::cout<<copyOfHead->data;
copyOfHead = copyOfHead->nextNode;
for(; copyOfHead != head ;copyOfHead = copyOfHead->nextNode){
std::cout<<copyOfHead->data;
}
所以,你有,do-while
正是你想要的这种数据结构! for
(或while-only
)正是您不想要的。
#include <iostream>
#include <string.h>
namespace forward_circular_linked_list {
typedef struct Node {
std::string data;
Node *nextNode;
}Node;
class ForwardCircularLinkedList {
private:
Node *head;
public:
ForwardCircularLinkedList() : head(nullptr) {}
void AddItem(std::string data) {
Node * newNode = new Node();
newNode->data = data;
if(head == nullptr)
{
head = newNode;
newNode->nextNode = head;
} else{
Node * copyOfHead = head;
while(copyOfHead->nextNode != head)
{
copyOfHead = copyOfHead->nextNode;
}
copyOfHead->nextNode = newNode;// process last node
newNode->nextNode = head;
}
}
void print()
{
Node * copyOfHead = head;
do
{
std::cout<<copyOfHead->data;
copyOfHead = copyOfHead->nextNode;
}while(copyOfHead != head);
}
public:
static void Test() {
ForwardCircularLinkedList list;
list.AddItem("Hello");
list.AddItem(" ");
list.AddItem("World");
list.AddItem("!");
list.print();
}
};
}
此处,do-while 用于打印列表的元素。
在当前设置下,我可以使用 while 或 for 循环来打印列表吗?
注意:我正在考虑将do-while
和while
作为不同的循环结构。
是的,您可以使用 do-while
或 for
循环。
但是 do-while
更自然,因为它在代码主体 之后检查条件 。
你有一个循环数据结构,并且(大概)你想打印每个元素一次。
只做一轮盘旋。
do{...move circulator}while(compare with head)
逻辑正确。
CGAL 实现了“循环器”并且正是这样做的,它从“头”开始做一些事情并增加循环器直到它再次成为头。 请参阅 https://doc.cgal.org/latest/Circulator/classCirculator.html(滚动到示例)。
请注意,该示例还会在开始时检查 emptyness,但您可能需要这样做。 (在我看来,循环缓冲区永远不会为空,但我接受其他意见。)
while
你有:
Node * copyOfHead = head;
do
{
std::cout<<copyOfHead->data;
copyOfHead = copyOfHead->nextNode;
}while(copyOfHead != head);
有了for
你就可以拥有
Node * copyOfHead = head;
for(;;){
std::cout<<copyOfHead->data;
copyOfHead = copyOfHead->nextNode;
if(copyOfHead == head) break;
}
或
for(Node * copyOfHead = head;;){
std::cout<<copyOfHead->data;
copyOfHead = copyOfHead->nextNode;
if(copyOfHead == head) break;
}
或
for(Node * copyOfHead = head; ; copyOfHead = copyOfHead->nextNode){
std::cout<<copyOfHead->data;
if(copyOfHead->nextNode == head) break;
}
或(利用循环体的计算结果为 bool:true)
for(
Node * copyOfHead = head;
std::cout<<copyOfHead->data;
copyOfHead = copyOfHead->nextNode
) if(copyOfHead->nextNode == head) break;
for
的主要优点是初始化,但仍然不值得。
您当然可以执行循环外的步骤,但是您会重复代码等。
(不推荐,甚至可能有错误)
Node * copyOfHead = head;
std::cout<<copyOfHead->data;
copyOfHead = copyOfHead->nextNode;
for(; copyOfHead != head ;copyOfHead = copyOfHead->nextNode){
std::cout<<copyOfHead->data;
}
所以,你有,do-while
正是你想要的这种数据结构! for
(或while-only
)正是您不想要的。