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);
    }
}   

Online Demo


此外,您的 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;
}

Online Demo

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 循环将至少执行一次语句,然后检查条件。