While 循环与 Do While 循环
While Loop vs Do While Loop
我正在为我的 class 编写一个 C++ 程序来添加、追加、插入、显示循环列表的项目。我发现 while 循环的功能与 do-while 循环不同,因为在我看来可能会输出相同的项目。我正在寻找为什么输出与下面的代码块不同的解释,谢谢。如果您有地方我可以修改代码以增强它,请让我知道再次尝试构建尽可能多的信息谢谢。
Link 至完整代码:Pastebin
while(temp != head)
{
cout << temp->data << " ";
temp = temp->next;
}
Output: Nothing
do
{
cout << temp->data << " ";
temp = temp->next;
}while(temp != head);
Output: 10 20
while
循环在进入循环体之前评估其条件。因此,while
循环可能 运行 0 次迭代。
一个do..while
循环在离开主体后评估其条件。因此,do..while
循环总是 运行 至少 1 次迭代。
在这种情况下使用 while
循环将不起作用,因为条件 (temp != head)
在第一次迭代之前总是为假。如果列表为空,head
将是 NULL
,因此 temp
将被设置为 NULL
,因此 (NULL != NULL)
将为假。否则,head
将不会是 NULL
,并且 temp
将被设置为指向与 head
指向相同的 Node
,因此 (temp != head)
仍然是假的。
然而,使用 do..while
循环,条件 (temp != head)
只有在列表中的最后一个 Node
被迭代后才会为假。
因此,在这种情况下,使用 do..while
循环是可行的方法。
但是,您的代码未考虑空列表的可能性(head
为 NULL),因此您需要添加该检查以避免取消引用 NULL
指针,例如:
void displayData()
{
if (head) // <-- add this!
{
Node* temp = head;
do
{
cout << temp->data << " ";
temp = temp->next;
}
while (temp != head);
}
}
此外,您的 appendNode()
可以简化为:
void appendNode(int newVal)
{
Node** temp = &head;
if (head) {
do {
temp = &((*temp)->next);
}
while (*temp != head);
}
*temp = new Node;
(*temp)->data = newVal;
(*temp)->next = head;
}
while 循环不会 运行 因为您将 temp 设置为指向 head 就在 while 条件之前导致错误条件。
在 do while 循环代码 运行s 之前检查条件,这就是您看到不同结果的原因。
do
{
cout << temp->data << " ";
temp = temp->next;
}while(temp != head);
与
相同
cout << temp->data << " ";
temp = temp->next;
while(temp != head)
{
cout << temp->data << " ";
temp = temp->next;
}
其他建议:
您可以删除第 24 行,因为稍后在代码中 newNode->next 被赋予一个新值。
while
循环先检查条件,然后执行语句,而 do while
循环将至少执行一次语句,然后检查条件。
我正在为我的 class 编写一个 C++ 程序来添加、追加、插入、显示循环列表的项目。我发现 while 循环的功能与 do-while 循环不同,因为在我看来可能会输出相同的项目。我正在寻找为什么输出与下面的代码块不同的解释,谢谢。如果您有地方我可以修改代码以增强它,请让我知道再次尝试构建尽可能多的信息谢谢。
Link 至完整代码:Pastebin
while(temp != head)
{
cout << temp->data << " ";
temp = temp->next;
}
Output: Nothing
do
{
cout << temp->data << " ";
temp = temp->next;
}while(temp != head);
Output: 10 20
while
循环在进入循环体之前评估其条件。因此,while
循环可能 运行 0 次迭代。
一个do..while
循环在离开主体后评估其条件。因此,do..while
循环总是 运行 至少 1 次迭代。
在这种情况下使用 while
循环将不起作用,因为条件 (temp != head)
在第一次迭代之前总是为假。如果列表为空,head
将是 NULL
,因此 temp
将被设置为 NULL
,因此 (NULL != NULL)
将为假。否则,head
将不会是 NULL
,并且 temp
将被设置为指向与 head
指向相同的 Node
,因此 (temp != head)
仍然是假的。
然而,使用 do..while
循环,条件 (temp != head)
只有在列表中的最后一个 Node
被迭代后才会为假。
因此,在这种情况下,使用 do..while
循环是可行的方法。
但是,您的代码未考虑空列表的可能性(head
为 NULL),因此您需要添加该检查以避免取消引用 NULL
指针,例如:
void displayData()
{
if (head) // <-- add this!
{
Node* temp = head;
do
{
cout << temp->data << " ";
temp = temp->next;
}
while (temp != head);
}
}
此外,您的 appendNode()
可以简化为:
void appendNode(int newVal)
{
Node** temp = &head;
if (head) {
do {
temp = &((*temp)->next);
}
while (*temp != head);
}
*temp = new Node;
(*temp)->data = newVal;
(*temp)->next = head;
}
while 循环不会 运行 因为您将 temp 设置为指向 head 就在 while 条件之前导致错误条件。
在 do while 循环代码 运行s 之前检查条件,这就是您看到不同结果的原因。
do
{
cout << temp->data << " ";
temp = temp->next;
}while(temp != head);
与
相同cout << temp->data << " ";
temp = temp->next;
while(temp != head)
{
cout << temp->data << " ";
temp = temp->next;
}
其他建议: 您可以删除第 24 行,因为稍后在代码中 newNode->next 被赋予一个新值。
while
循环先检查条件,然后执行语句,而 do while
循环将至少执行一次语句,然后检查条件。