我可以使用 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 用于打印列表的元素。

在当前设置下,我可以使用 whilefor 循环来打印列表吗?

注意:我正在考虑将do-whilewhile作为不同的循环结构。

是的,您可以使用 do-whilefor 循环。 但是 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)正是您想要的。