Utiliser la boucle pour parcourir la liste chaînée

Je lisais quelques opérations de base sur la liste chaînée et j’ai vu deux types de boucles principalement utilisés


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

La première boucle était de la forme

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

En utilisant la boucle ci-dessus, le pointeur tmp pointe maintenant vers le dernier noeud de la liste.

La seconde boucle était de la forme

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

Je pense que les deux font le même travail, mais je ne suis pas sûr. Y a-t-il une différence?

Je suppose que votre boucle while est quelque chose comme ça.

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

Dans votre code de boucle for , lorsque vous êtes hors de la boucle for , temp ne pointe pas sur NULL. temp pointe vers la fin de la liste liée . Mais dans le cas de la boucle while , votre temp pointe sur NULL après avoir quitté la boucle while et vous n’avez pas de queue (sauf si vous affectez temp à une autre variable temporaire pour changer la logique du programme) avec vous si vous souhaitez utiliser dans les étapes suivantes. C’est la seule différence. Sauf qu’il n’y a pas beaucoup de différence.

Vous auriez pu le vérifier en écrivant un petit programme et en imprimant les résultats. Je vous recommande de le faire.

Les boucles ne sont pas identiques. En fait, votre boucle for a un problème. Pensez à ce qui se passe lorsque start==NULL avant de saisir la boucle for .

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

Vous affectez start à tmp puis déréférence tmp , un pointeur NULL . Je pense que vous voulez le suivant à la place.

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

Ce changement fait la même chose pour les boucles for et while .

Q: Effectivement, “non”. Il n’y a pas de différence de fond. ils font tous les deux le même travail.

Vous pouvez toujours coder une boucle “for ()” avec un équivalent “while ()”.

J’utilise la boucle while lorsque je dois modifier la liste chaînée. Par exemple

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

J’utilise for loop lorsque j’ai besoin d’un access en lecture seule à la liste chaînée.