Durchqueren Sie eine einfach verkettete Liste in der Reihenfolge
Ich habe versucht zu denken, eine Weise zu durchqueren, eine einfach verkettete Liste.
Dies so weit ist, was ich getan habe:
#include <iostream>
typedef struct node {
int data; //will store information
node *next; //the reference to the next node
};
int printList(node *traverse) {
if (traverse->next == NULL) {
return -1;
}
traverse=traverse->next;
printList(traverse);
cout << traverse->data << endl;
return 0;
}
int main() {
node *head = NULL;
for (int i = 0; i < 10; i++) {
node *newEntry = new node;
newEntry->data = i;
newEntry->next = head;
head = newEntry;
}
printList(head);
return 0;
}
Kann ich nicht denken, eine Möglichkeit zum drucken der letzten Stelle(9) in printList()
Funktion. Wie würde ich in der Lage sein, dies zu erreichen?
Meine zweite Frage ist, wie kann ich die traverse gleiche in einer while-Schleife statt einer rekursiven Funktion.
Wie einige von Ihnen versucht zu beantworten, bevor, ich bin nicht auf der Suche nach Durchlaufen dieser von 9 auf 0, Das sollte traverse von 0 bis 9, Sie können finden Sie in der Ausgabe von http://codepad.org/ynEdGc9S
- Wenn dies Produktions-code dann benutzen Sie std::list. Wenn nicht, dann genießen.
- Mehr wie
std::forward_list
. - SB Touche
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es hier ein paar Dinge:
In
main()
die Weise, die Sie die Liste erstellen ist falsch. Zeichnen Sie, was Sie tun, werden Sie feststellen, dass Ihrehead
ist das Letzte Element in der Liste, D. H., es wird wahrscheinlich einen Wert von 9. (Drucken-Kopf-Wert nur vor dem Aufruf von printList um dies zu überprüfen).Lassen Sie mich erklären (Folgen Sie entlang in Ihrem code) mit der iteration i = 1:
Aktueller Stand:
head=[0]
[ ]
[1]
[1]-->[0] ; head=[0]
[1]-->[0] ; head = [1]
So können Sie sehen, was hier passiert. Der Kopf sollte noch
[0]
und seine nächsten sein sollten[1]
nicht die andere Weise herum.Können Sie erkunden und überlegen Sie sich die richtige Art, dies zu tun.
ListBox, diese ist Ausdruck der rekursiven stack und nicht der Traversierung. Traversal würde in umgekehrter Reihenfolge drucken, weil Ihre Liste ist in umgekehrter Reihenfolge (überprüfen Sie den vorhergehenden Abschnitt ^ warum).
Dies ist die richtige Art und Weise zu drucken, den link in einem traversal. Dies wird drucken Sie die Elemente der Liste in der Art, wie Sie sind.
, Wenn Sie überprüft, für die traverse->next==NULL, traverse gehalten, das Letzte element ist. Da Sie nur beendet die Rekursion durch zurückgegeben -1, das Letzte element wurde nie gedruckt.
Iterative
Fühlen Sie sich frei, Fragen zu stellen, etc.
Statt
if (traverse->next == NULL)
versuchenif (traverse == NULL)
Diese Weise das drucken des aktuellen Knotens, wenn es eine tatsächliche Knoten mit Daten. Sie dann recurse. Schließlich, am Ende werden Sie recurse in eine
NULL
Zeiger, die Sie können leicht entweichen.Als Antwort auf den zweiten Teil, könnte der code wie folgt Aussehen:
Diese wird in einer Schleife durch die Liste, drucken jedes element, bis es zu einem NULL-Knoten, was bedeutet, dass das Ende der Liste. Es ist ein ziemlich standard-iteration-Algorithmus.
Warum nicht Sie interchange diesen Aussagen?
Dies sollte geändert werden zu:
Sollte diese Arbeit. Und ändern Sie dann
zu