使用循环遍历链表

时间:2012-07-13 02:53:38

标签: c

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


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 个答案:

答案 0 :(得分:12)

我认为你的while循环是这样的。

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

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

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

答案 1 :(得分:5)

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

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

您将start分配给tmp,然后取消引用tmp一个空指针。我想你想要以下内容。

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

此更改会使forwhile循环相同。

答案 2 :(得分:1)

问:有效地,“不”。没有任何实质性差异;他们都做同样的工作。

您可以始终使用等效的“while()”代码“for()”循环。

答案 3 :(得分: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循环。