C++ 我可以使用while或for循环打印列表吗? #包括 #包括 命名空间前向\u循环\u链接\u列表{ 类型定义结构节点{ std::字符串数据; 节点*nextNode; }节点; 类转发循环链接列表{ 私人: 节点*头; 公众: ForwardCircularLinkedList():head(nullptr){} void AddItem(标准::字符串数据){ Node*newNode=newNode(); 新建节点->数据=数据; if(head==nullptr) { 头=新节点; newNode->nextNode=head; }否则{ 节点*copyOfHead=头部; while(复制头->下一个节点!=头) { copyOfHead=copyOfHead->nextNode; } copyOfHead->nextNode=newNode;//处理最后一个节点 newNode->nextNode=head; } } 作废打印() { 节点*copyOfHead=头部; 做 { std::coutnextNode; }while(copyOfHead!=head); } 公众: 静态孔隙试验(){ 转发循环链接列表; list.AddItem(“你好”); 列表.增补项(“”); 列表。增补项(“世界”); 列表。添加项(“!”); list.print(); } }; }

C++ 我可以使用while或for循环打印列表吗? #包括 #包括 命名空间前向\u循环\u链接\u列表{ 类型定义结构节点{ std::字符串数据; 节点*nextNode; }节点; 类转发循环链接列表{ 私人: 节点*头; 公众: ForwardCircularLinkedList():head(nullptr){} void AddItem(标准::字符串数据){ Node*newNode=newNode(); 新建节点->数据=数据; if(head==nullptr) { 头=新节点; newNode->nextNode=head; }否则{ 节点*copyOfHead=头部; while(复制头->下一个节点!=头) { copyOfHead=copyOfHead->nextNode; } copyOfHead->nextNode=newNode;//处理最后一个节点 newNode->nextNode=head; } } 作废打印() { 节点*copyOfHead=头部; 做 { std::coutnextNode; }while(copyOfHead!=head); } 公众: 静态孔隙试验(){ 转发循环链接列表; list.AddItem(“你好”); 列表.增补项(“”); 列表。增补项(“世界”); 列表。添加项(“!”); list.print(); } }; },c++,circular-list,C++,Circular List,这里,使用do while打印列表的元素 在当前设置中,我可以使用while或for循环打印列表吗 注意:我认为do while和while是不同的循环结构。是的,您可以使用do while或进行循环。 但是do-while更自然,因为它在代码体之后检查条件 您有一个循环数据结构,并且(大概)希望打印每个元素一次。 只做一圈的盘旋。 do{…move circulator}while(与头部比较)具有正确的逻辑 CGAL实现了“循环器”,并且正是这样做的,它从“head”开始做一些事情并增加循环

这里,使用do while打印列表的元素

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


注意:我认为
do while
while
是不同的循环结构。

是的,您可以使用
do while
进行循环。
但是
do-while
更自然,因为它在代码体之后检查条件

您有一个循环数据结构,并且(大概)希望打印每个元素一次。 只做一圈的盘旋。
do{…move circulator}while(与头部比较)
具有正确的逻辑

CGAL实现了“循环器”,并且正是这样做的,它从“head”开始做一些事情并增加循环器,直到它再次成为head。 请参阅(滚动至示例)

请注意,该示例也会在开始时检查是否为空,但您可能需要这样做。 (在我看来,循环缓冲区从来都不是空的,但我接受其他观点。)


使用
您有:

#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
正是这种数据结构所需要的!而
for
(或
而只有
)正是您不想要的。

如果列表为空,您当前的打印实际上会失败,仅供参考。@JerryJeremiah,这是一个循环缓冲,缠绕一次后应该停止。@alfC抱歉-我误读了这个问题。您能告诉我如何通过保持代码的其他部分不变来使用while循环吗?我正在考虑将
do while
while
作为不同的循环结构。另一方面,你认为他们是一样的。因此产生了混淆。对不起,如果混淆的话,我一直在说
do while
while only
对于这个问题与
对于
有相同的缺点。
        Node * copyOfHead = head;

        do
        {
            std::cout<<copyOfHead->data;
            copyOfHead = copyOfHead->nextNode;
        }while(copyOfHead != head);
        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;
        }
        for(
            Node * copyOfHead = head;
            std::cout<<copyOfHead->data;
            copyOfHead = copyOfHead->nextNode
        ) if(copyOfHead->nextNode == head) break;
        Node * copyOfHead = head;
        std::cout<<copyOfHead->data;
        copyOfHead = copyOfHead->nextNode;

        for(; copyOfHead != head ;copyOfHead = copyOfHead->nextNode){
            std::cout<<copyOfHead->data;
        }