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.