2012-07-13 17 views
7

que estaba leyendo sobre algunas operaciones básicas en la lista enlazada y vi a dos tipos de bucles que se utilizan predominantementeEl uso de bucle para recorrer a través de lista enlazada


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

El primer bucle era de la forma

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

Uso del bucle anterior, ahora los tmp puntero apunta hacia el último nodo en la lista

El segundo bucle era de la forma

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

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

+0

te falta 'tmp = tmp-> next;' en el ciclo while – Musa

+2

@Musa: '// do something' lo cubre. – user7116

+0

P: ¿Es el idioma "for loop" equivalente al correspondiente "while loop"? A: Sí. P: ¿Este ejemplo está dañado porque este "bucle for" particular tiene un error? A: Sí, también :) – paulsm4

Respuesta

11

Supongo que su ciclo while es algo como esto.

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

En su código de bucle for, cuando usted está fuera del bucle for , temp no apunta a NULL. temp apunta al final de la lista vinculada. Pero en el caso de mientras el bucle, 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 programa) con usted si quieres usarlo en los siguientes pasos. Esa es la única diferencia. Excepto que no hay mucha diferencia.

Puede haberlo comprobado escribiendo un pequeño programa e imprimiendo los resultados. Te recomiendo que lo hagas

+0

Si cambio la variable de temperatura, ¿cambiará la lista de enlaces original? – User

+0

Solo si su variable de temperatura es un puntero. – Trent

1

P: Efectivamente, "no". No hay ninguna diferencia sustantiva; ambos hacen el mismo trabajo.

Puede siempre codificar un bucle "for()" con un equivalente "while()".

+0

Quiero saber que si al final del ciclo, el puntero "tmp" apunta al último nodo en ambos casos ?? – OneMoreError

+0

@CSSS Tal como lo ha definido actualmente, la manera ** única ** para que termine el ciclo while es cuando 'tmp == NULL'. En contraste, la forma ** solo ** para que el ciclo for termine es cuando 'tmp-> next == NULL'. Entonces parece que solo el bucle for tiene la posibilidad de dejar 'tmp' apuntando al último nodo. Dicho esto, cada ciclo for tiene un ciclo while equivalente (y viceversa), por lo que * podría * hacer que sus comportamientos sean los mismos. –

+0

El bucle for sale cuando 'tmp-> next! = NULL' es falso, por lo que sale cuando' tmp-> next' es NULL, que es cuando tmp apunta al último nodo. El ciclo while sale cuando 'tmp! = NULL' es falso, por lo que sale cuando' tmp' es NULL, por lo que tmp no apunta al último nodo (no apunta a nada). Tenga en cuenta que el cuerpo del bucle for nunca se ejecuta con tmp apuntando al último nodo, porque es cuando el bucle sale. –

5

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

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

le asignará a starttmp y luego referencia a un puntero tmp, un NULL. Creo que quieres lo siguiente en su lugar.

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

Este cambio hace que el for y while bucles de la misma.

0

Utilizo el ciclo while cuando necesito cambiar la lista enlazada. Por ej.

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

Utilizo para el bucle cuando necesito un acceso de solo lectura a la lista vinculada.

Cuestiones relacionadas