代码之家  ›  专栏  ›  技术社区  ›  user366312

我可以用while或for循环打印列表吗?

  •  0
  • user366312  · 技术社区  · 4 年前
    #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

    1 回复  |  直到 4 年前
        1
  •  1
  •   alfC    4 年前

    do-while 或者 for 循环。 但是 更自然是因为它能检查身体状况 之后

    您有一个循环的数据结构,并且(可能)希望打印每个元素一次。 只绕了一圈。 do{...move circulator}while(compare with head)

    CGAL实现了“循环器”并做到了这一点,它从“head”开始做一些事情并增加循环器,直到它再次成为head。 看到了吗 https://doc.cgal.org/latest/Circulator/classCirculator.html (滚动至示例)。

    空虚 一开始,但也许你想要。 (在我看来,循环缓冲区永远不会是空的,但我接受其他观点。)


    while 您有:

            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;
    

    主要优势 对于 是初始化,但还是不值得。 当然,您可以在循环之外执行该步骤,但随后会有重复的代码等。

    (不推荐,甚至可能有bug)

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

    所以,你看到了, 做一会儿 正是这种数据结构所需要的!和 (或 while-only 不要 想要。