16

我正在阅读有关链表的一些基本操作,我看到主要使用两种类型的循环


struct node {
   int data;
   struct node *next;
}*start=NULL,*tmp;

第一个循环的形式是

for(tmp=start;tmp->next!=NULL;tmp=tmp->next);

使用上面的循环,现在tmp指针指向列表中的最后一个节点

第二个循环的形式是

tmp=start;
while(tmp!=NULL)
{
     // do something
}

我认为他们两个都做同样的工作,但我不确定。有什么区别吗?

4

4 回答 4

19

我想你的while循环是这样的。

temp=start;
while(temp!=NULL)
{
     // do something
     temp= temp->next;
}

在您的for 循环代码中,当您退出for 循环时, temp 不指向 NULL。temp 指向链表的末尾。但是在while 循环的情况下,您的temp 在退出 while 循环后指向 NULL并且您没有 tail(除非您将 temp 分配给任何其他临时变量以更改程序的逻辑)如果您想使用它在进一步的步骤中。这是唯一的区别。除了没有太大区别。

您可以通过编写一个小程序并打印结果来检查它。我建议你这样做。

于 2012-07-13T03:09:05.013 回答
7

循环不相同。事实上,你的for循环有问题。start==NULL考虑在进入for循环之前会发生什么。

for(tmp=start;tmp->next!=NULL;tmp=tmp->next);

您分配starttmp然后取消引用一个NULL 指针tmp。我认为您想要以下内容。

for(tmp=start;tmp!=NULL;tmp=tmp->next);

这种变化使forandwhile循环相同。

于 2012-07-13T03:18:35.123 回答
0

问:实际上,“不”。没有任何实质性区别;他们都做同样的工作。

始终可以使用等效的“while()”编写“for()”循环。

于 2012-07-13T02:56:22.827 回答
0

当我需要更改链表时,我使用 while 循环。例如

while (root->next)
{
    if(0 == strcmp(root->data,root->next->data))
    {
        temp = root;
        root = root->next;
        free(temp)
    }
    else
    {
        root = root->next;
    }
}

当我需要对链表进行只读访问时,我使用 for 循环。

于 2014-09-01T08:49:08.057 回答