对使用双while 打印元素感到困惑

Confusion about printing elements with double-while

提问人:bFur4list 提问时间:4/19/2023 最后编辑:BarmarbFur4list 更新时间:4/20/2023 访问量:48

问:

这里有两个链表“list1”和“list2”。

其中 list1 和 list2 有两个数据:data1、data2。

它们具有以下节点:(data1, data2)

  • list1:(1,1) - (2,2)
  • list2:(3,3) - (4,4) - (5,5)

(括号表示每个节点)

while (list2 != NULL)
    {
        while (list1 != NULL)
        {
            printf("list1 contains : %d, %f\n", list1->data1, list1->data2);
            list1 = list1->NextNode;
        }

        printf("list2 contains : %d, %f\n", list2->data1, list2->data1);
        list2 = list2->NextNode;
    }

起初,我预计输出为:

list1, list1, list2, list1, list1, list2, list1, list1, list2  

(我的意思是打印订单)

但是我得到了:

list1, list1, list2, list2, list2.

所以我的问题是:

  1. 为什么我的期望失败了?

  2. 我应该如何更改我的代码以使代码像我的期望一样工作?

谢谢

C while-loop 链表嵌 套循环

评论

1赞 yano 4/19/2023
在第一次通过外部循环后,您不会重置回列表的头部,因此在外部循环的第二次迭代及之后失败。list1list1 != NULL
0赞 bFur4list 4/19/2023
@yano,感谢您的建议,那么如何在没有使列表循环的情况下重置 list1 结束?
1赞 yano 4/19/2023
链表应具有指向列表中第一项的指针。这始终是任何单链表遍历的起点。因此,您需要执行类似 .如果您的头部指针,请在开始操作之前保存它的临时副本,以便可以还原它。headlist1 = head; while(list1 != NULL){ ... }link1list1 = list1->NextNode;

答:

1赞 Vlad from Moscow 4/19/2023 #1

在第一次执行内部 while 循环(其第一次和单次迭代)之后

while (list2 != NULL)
    {
        while (list1 != NULL)
        {
            printf("list1 contains : %d, %f\n", list1->data1, list1->data2);
            list1 = list1->NextNode;
        }

        printf("list2 contains : %d, %f\n", list2->data1, list2->data1);
        list2 = list2->NextNode;
    }

指针变为 等于 。那么在执行完代码后,在内部的while循环之后,指针也等于。因此,两个 while 循环只有一次迭代。list1NULLlist2NULL

如果你想得到预期的输出,比如

list1, list1, list2, list1, list1, list2, list1, list1, list2 

然后写例如。假设列表对象的类型是 Node

    while (list2 != NULL)
    {
        for ( Node *temp1 = list1; temp1 != NULL; temp1 = temp1->NextNode )
        {
            printf("list1 contains : %d, %f\n", temp1->data1, temp1->data2);
        }

        printf("list2 contains : %d, %f\n", list2->data1, list2->data1);
        list2 = list2->NextNode;
    }

评论

0赞 Barmar 4/19/2023
我没有看到任何可以解决问题的更改。
0赞 Vlad from Moscow 4/19/2023
@Barmar 对程序中发生的事情进行了解释。