我正在阅读关于链表的一些基本操作,我看到主要使用两种类型的循环
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 :(得分: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);
此更改会使for
和while
循环相同。
答案 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循环。