2012-07-13 12 views
7

Stavo leggendo su alcune operazioni di base sulla lista collegata e ho visto due tipi di loop in uso prevalentementeUtilizzando ciclo di attraversare attraverso la lista collegata


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

Il primo giro è stato di forma

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

Uso ciclo precedente, adesso i tmp punta il puntatore verso l'ultimo nodo nell'elenco

Il secondo ciclo è stato di forma

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

Penso che entrambi fanno lo stesso lavoro, ma non sono sicuro. C'è qualche differenza?

+0

ti manca 'tmp = tmp-> successivo;' nel ciclo while – Musa

+2

@Musa: '// fa qualcosa 'lo copre. – user7116

+0

Q: L'idioma "for loop" è equivalente al "ciclo while" corrispondente? A: Sì. D: Questo esempio è difettoso perché questo particolare "ciclo for()" ha un bug in esso? A: Sì anche :) – paulsm4

risposta

11

Suppongo che il tuo ciclo temporale sia qualcosa del genere.

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

Nel codice di ciclo for, quando si è fuori del ciclo for , temperatura non punta a NULL. temp sta puntando alla fine dell'elenco collegato. Ma nel caso di mentre il ciclo, il tuo temp punta a NULL dopo aver chiuso il ciclo while e non hai coda (a meno che non si assegni a qualsiasi altra variabile temporanea per modificare la logica del programma) con te se lo vuoi usare nei passaggi successivi. Questa è l'unica differenza. Tranne che non c'è molta differenza.

È possibile averlo controllato scrivendo un piccolo programma e stampando i risultati. Ti raccomando di farlo.

+0

Se cambio la variabile temporanea, cambierà la lista collegata originale? – User

+0

Solo se la variabile temporanea è un puntatore. – Trent

1

Q: Effettivamente, "no". Non c'è alcuna differenza sostanziale; entrambi fanno lo stesso lavoro.

È possibile sempre codice un ciclo "for()" con un equivalente "while()".

+0

i Voglio sapere che se alla fine del ciclo, il puntatore "tmp" punta all'ultimo nodo in entrambi i casi ?? – OneMoreError

+0

@CSSS Come lo hai attualmente definito, il ** solo ** modo per terminare il ciclo while è quando 'tmp == NULL'. Al contrario, il ** solo ** modo per il ciclo for da terminare è quando 'tmp-> next == NULL'. Quindi sembra che solo il ciclo for abbia la possibilità di lasciare 'tmp' puntare sull'ultimo nodo. Detto questo, ogni ciclo for ha un ciclo while equivalente (e viceversa), quindi * potresti * rendere i loro comportamenti uguali. –

+0

Il ciclo for si chiude quando 'tmp-> next! = NULL' è falso, quindi esce quando' tmp-> next' è NULL, che è quando tmp sta puntando all'ultimo nodo. Il ciclo while termina quando 'tmp! = NULL' è falso, quindi esce quando' tmp' è NULL, quindi tmp non punta all'ultimo nodo (non punta a nulla). Si noti che il corpo del ciclo for non viene mai eseguito con il comando tmp che punta all'ultimo nodo, perché è il momento in cui il ciclo termina. –

5

I loop non sono identici. In effetti, il tuo ciclo for ha un problema. Considera cosa succede quando start==NULL prima di entrare nel ciclo for.

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

si assegna start-tmp e quindi dereference puntatore tmp, un NULL. Penso che tu voglia il seguente invece.

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

Questo cambiamento rende la for e while loop lo stesso.

0

Uso il ciclo while quando è necessario modificare l'elenco collegato. Ad es.

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

Io uso per il ciclo quando ho bisogno di un accesso di sola lettura alla lista collegata.

Problemi correlati