使用循环遍历链表
我正在阅读关于链表的几个基本操作,我看到主要使用两种类型的循环
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);
这种变化使for
和while
循环相同。
问:实际上,“不”。 没有任何实质性差异; 他们都做同样的工作。
您始终可以使用等效的“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循环。