Usando bucle para atravesar la lista enlazada

Estaba leyendo acerca de algunas operaciones básicas en la lista enlazada y vi dos tipos de bucles que se utilizan predominantemente


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

El primer bucle fue de la forma.

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

Usando el bucle anterior, ahora el puntero tmp apunta hacia el último nodo en la lista

El segundo bucle fue de la forma.

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

Creo que ambos hacen el mismo trabajo, pero no estoy seguro. ¿Hay alguna diferencia?

Supongo que tu bucle while es algo así.

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

En su código de for loop , cuando está fuera del for for , temp no está apuntando a NULL. temp está apuntando al final de la lista enlazada . Pero en el caso de while , su temperatura apunta a NULL después de salir del bucle while y no tiene cola (a menos que asigne temp a cualquier otra variable temporal para cambiar la lógica del progtwig) con usted si desea usar En los pasos posteriores. Esa es la única diferencia. Excepto que no hay mucha diferencia.

Podrías haberlo comprobado escribiendo un pequeño progtwig e imprimiendo los resultados. Te recomiendo que lo hagas

Los bucles no son idénticos. De hecho, tu for loop tiene un problema. Considere lo que sucede cuando start==NULL antes de ingresar al bucle for .

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

Se asigna start a tmp y luego se elimina la referencia a tmp , un puntero NULO . Creo que quieres lo siguiente en su lugar.

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

Ese cambio hace que los bucles for y while sean iguales.

Q: Efectivamente, “no”. No hay ninguna diferencia sustancial; Ambos hacen el mismo trabajo.

Siempre puede codificar un bucle “for ()” con un equivalente “while ()”.

Utilizo while loop cuando necesito cambiar la lista enlazada. Por ejemplo

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

Lo uso para bucle cuando necesito un acceso de solo lectura a la lista enlazada.