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(); } }; }
这里,使用do while打印列表的元素 在当前设置中,我可以使用while或for循环打印列表吗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
和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;
}