2012-07-13 105 views
7

我读到有关链接列表上的一些基本操作,我看到了两种类型的循环遍历被主要用于使用遍历链表


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 
} 

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

+0

你错过了'TMP = TMP->未来;'while循环 – Musa 2012-07-13 03:03:41

+2

@Musa:'//做something'覆盖它。 – user7116 2012-07-13 03:11:18

+0

问:“for循环”习语是否相当于相应的“while循环”?答:是的。问:这个例子是否有缺陷,因为这个特定的“for()循环”碰巧有一个bug? - 答:是的,也是:) – paulsm4 2012-07-13 04:52:53

回答

11

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

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

在你的代码回路,当你走出的for循环,温度不指向NULL。 temp指向链表的末尾。但在情况下,while循环,你临时指向NULL你与你,如果退出while循环后你没有尾巴(除非你临时分配给任何其他临时变量来改变程序的逻辑)你想在后面的步骤中使用它。这是唯一的区别。除了没有太大的区别。

你可以写一个小程序和打印结果检查它。我建议你这样做。

+0

如果我改变temp变量,它会改变原来的链表吗? – User 2015-02-26 06:22:03

+0

只有当你的临时变量是一个指针。 – Trent 2016-04-27 23:20:44

1

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

你可以总是使用等效的“while()”编码“for()”循环。

+0

我想知道,如果在循环结束时,“tmp”指针指向最后一个节点在这两种情况下? – OneMoreError 2012-07-13 02:57:52

+0

@CSSS正如你现在所定义的那样,while循环终止的**唯一方法是'tmp == NULL'。相比之下,for循环终止的**唯一方法是'tmp-> next == NULL'。所以似乎只有for循环有可能将'tmp'指向最后一个节点。也就是说,每个for循环都有一个等价的while循环(反之亦然),所以你可以使它们的行为相同。 – 2012-07-13 03:18:26

+0

当'tmp-> next!= NULL'为false时,for循环退出,所以当'tmp-> next'为NULL时,tmp指向最后一个节点时退出。当'tmp!= NULL'为false时,while循环退出,所以当'tmp'为NULL时退出,所以tmp没有指向最后一个节点(它没有指向任何东西)。请注意,for循环的主体永远不会在tmp指向最后一个节点的情况下执行,因为那是循环退出的时候。 – 2012-07-13 03:19:23

5

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

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

分配starttmp,然后解引用tmpNULL指针。我想你想要的是以下。

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

这种变化使得forwhile循环一样。

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循环时,我需要一个只读访问链接列表。