使用循环遍历链表

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


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

第一个循环就是这种forms

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

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

第二个循环是forms

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

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

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

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

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

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

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

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

您将start指定为tmp ,然后取消引用tmp即NULL指针 。 我想你想要以下内容。

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

这种变化使forwhile循环相同。

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

始终可以使用等效的“while()”对“for()”循环进行编码。

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

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

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