Mit Schleife zum Durchlaufen durch verknüpfte Liste
War ich beim Lesen über ein paar grundlegende Operationen auf verketteten Liste, und ich sah zwei Arten von Schleifen verwendet wird überwiegend
struct node {
int data;
struct node *next;
}*start=NULL,*tmp;
Die erste Schleife der form
for(tmp=start;tmp->next!=NULL;tmp=tmp->next);
Mithilfe der obigen Schleife, jetzt die tmp
Zeiger zeigt auf den letzten Knoten in der Liste
Die zweite Schleife der form
tmp=start;
while(tmp!=NULL)
{
//do something
}
Ich denke, dass beide die gleiche Arbeit tun, aber ich bin mir nicht sicher. Gibt es da einen Unterschied?
- Sie fehlt
tmp=tmp->next;
in der while-Schleife // do something
abdeckt.- Q: Ist die "for-Schleife" idiom entspricht dem entsprechenden "while-Schleife"? A: Ja. Q: Ist das Beispiel sinnlos, weil dieser "for () - Schleife" passiert zu haben, ein Fehler? A: ja auch 🙂
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich nehme an, deine while-Schleife ist so etwas wie dieses.
In Ihrem code of for-Schleife, Wenn Sie aus der for-Schleife, temp ist nicht auf NULL. temp zeigt auf das Ende der verlinkten Liste. Aber im Fall von while-Schleife, Ihre temp zeigt auf NULL, nach dem beenden der while-Schleife und Sie nicht haben Schwanz(es sei denn, Sie weisen temp auf sonstige temporäre variable zum ändern der Logik des Programms) mit, wenn Sie wollen, um es in die weiteren Schritte. Das ist der einzige Unterschied. Außer, dass es nicht viel Unterschied.
Könnten Sie überprüft haben, es durch das schreiben ein kleines Programm und drucken Sie die Ergebnisse. Ich empfehle Ihnen, tun Sie es.
Die loops sind nicht identisch. In der Tat, Ihre
for
loop hat ein problem. Überlegen Sie, was passiert, wennstart==NULL
bevor Sie in diefor
Schleife.Weisen Sie
start
zutmp
und dann dereferenzierentmp
, ein NULL-Zeiger. Ich denke, Sie wollen im folgenden statt.Ändern, dass macht die
for
undwhile
Schleifen die gleichen.Q: Effektiv "Nein". Es gibt keinen inhaltlichen Unterschied, sondern beide die gleiche Arbeit tun.
Können Sie immer code ein "for()" Schleife " mit einer entsprechenden "while()".
tmp == NULL
. Im Gegensatz dazu, die nur Weg mit der for-Schleife zu beenden ist, wenntmp->next == NULL
. So wie es scheint, nur die for-Schleife eine chance hat, zu verlassentmp
zeigt auf den letzten Knoten. Das heißt, jede for-Schleife ist ein äquivalentes while-Schleife (und Umgekehrt), so dass Sie könnte machen Ihrer Verhaltensweisen die gleichen.tmp->next!=NULL
false ist, so wird es beendet, wenntmp->next
ist NULL, was ist wenn die tmp zeigt auf den letzten Knoten. Die while-Schleife wird beendet, wenntmp!=NULL
false ist, so wird es beendet, wenntmp
NULL ist, so tmp ist nicht nur ein Zeiger auf den letzten Knoten (es ist nicht auf alles). Beachten Sie, dass der Körper der for-Schleife wird nie ausgeführt mit tmp zeigt auf den letzten Knoten, denn das ist, wenn die Schleife verlassen.Ich verwende while-Schleife, wenn ich die Notwendigkeit der Veränderung der verlinkten Liste. Für z.B.
Benutze ich die for-Schleife, wenn ich eine nur-lese-Zugriff auf verknüpfte Liste.