DVL zahlenwerte in Binärbaum übergeben
-
@C91: Du benötigst dafür eine Membervariable (sofern du eine Klasse benutzen willst/sollst) oder aber eine (wenn auch nicht empfohlen) globale Variable
head
, da sie ja der Kopf für alle einzufügenden Elemente ist.
Und für die FunktioninsertElement
solltest du noch einen Parameter übergeben, an der das neue Element eingefügt werden soll (oder soll es immer am Anfang oder Ende der Liste)?PS: Warum hast du hier im Subforum C++/CLI mit .NET gepostet?
-
@Th69 darf ich dich bitten, das du mir das mal in meinem Beispiel zeigst?
Ich blicke da gerade nicht ganz durch.PS: Das hier ist ja der C++ bereich, oder nicht?
-
Schau dir mal (besonders die Bilder in) Doppelt verkettete Listen in C an.
Jetzt erst sehe ich, daß du ja in
insertElement()
mehrere Elemente (in der Schleife) hinzufügen willst - besser ist es das ersteinmal auf das Einfügen von einem Element (so wie die Funktion ja auch heißt) zu beschränken.
Und eine weitere Funktion ruft dann diese Funktion in einer Schleife passend auf (mit entsprechenden Parametern).PS: Gestern war dieses Thema noch im falschen Subforum, aber das hat wohl ein Moderator inzwischen korrekt verschoben.
-
Also die Liste funktioniert schon mal.
Nun habe ich beim ausgeben des Baumes ein Problem:
Ausgelöste Ausnahme: Lesezugriffsverletzung "head" war "0xCDCDCDCD".
Der Fehler entsteht in folgender Zeile:
void display(node* head){ if (head != z){ display(head->l); // Hier markiert er den Fehler. cout << "Wert: " << head->key << "Wert: " << head->info << endl; display(head->r); } }
-
Vermutlich das gleiche Problem wie gestern:
head
ist nicht initialisiert. Du solltest dir angewöhnen, Zeiger auf Gültigkeit zu überprüfen, bevor du sie benutzt.
Falls es einen Anwendungsfall gibt, in dem ein Zeigernullptr
sein darf:void f( SomeType* some_pointer ) { if( some_pointer ) { some_pointer->something(); } }
falls nicht:
void f( SomeType* some_pointer ) { std::assert( some_pointer, "some_pointer in f() must not be null" ); some_pointer->something(); }
-
Head und z habe ich ganz oben:
node* z, *head;
-
@C91
Und welchen Wert haben sie?
-
Ändert nichts am Fehler.
-
@C91
Wer seine Zeiger nicht initialisiert darf sich auch nicht wundern, dass sie einem um die Ohren fliegen. Der MSVC Compiler ist sogar noch so nett und initialisiert sie mit 0xCDCDCDCD, damit man sieht, dass man selbst die Initialisierung vergessen hat.
-
Ich habe beide initialisiert:
node* head = NULL; node* z = NULL;
??
-
Und wie sieht dein Quelltext jetzt aus?
-
head und z ist global:
node* head = NULL; node* z = NULL;
In der Main habe rufe ich die Funktion auf und übergebe head:
displayTree(head);
Hier nochmal die Funktion:
void display(node* head){ if (head != z){ display(head->l); // Fehler ist noch immer hier. cout << "Wert: " << head->key << "Wert: " << head->info << endl; display(head->r); } }
-
Welchen Wert haben
head
undz
an der Stelle?
Btw:
Der Ausschnitt, den du zeigst, hilft nicht weiter. Erst schreibst du, dass dudisplayTree
aufrufst und sagst dann, dass der Fehler indisplay
auftritt. Wie ist da der Zusammenhang?
-
@DocShoe Ich habe es geändert, dait es lesbarer ist. Ist aber noch immer die gleiche Funktion.
-
@C91
Du musst dir auch helfen lassen. Ich habe dir zwei konkrete Fragen gestellt, von denen du keine beantwortet hast. Stattdessen Quelltextauszüge, die doch irgendwie doch nicht das sind, was du tatsächlich versuchst.
-
Ich kann den gesamten Code hier nicht posten. Das ist ja das Problem.
-
Was head bedeuten soll, ist klar. Aber wofür steht z?
Jedenfalls wirst du zwischen der Initialisierung (beide auf 0) und demdisplay
irgendwo eine der beiden Variablen geändert haben (vermutlich z), da deinif (head != z)
offenbar wahr ist. Wenn head noch nullptr ist, darfst du nicht aufhead->irgendwas
zugreifen.Wenn dein Code übrigens wirklich C++ sein soll, dann solltest du
nullptr
stattNULL
verwenden und deine DVL in einer Klasse implementieren. Und vermeide die globalen Variablen, die machen alles nur kompliziert.Versuche, erstmal nur Code für eine DVL zu schreiben. Und dann zu testen!
PS: in C++ nimmst du einfach std::list, das ist schon eine fertige DVL (allerdings möchte die Aufgabe vermutlich, dass du das selbst machst).
-
O.K., danke.
-
@wob ich könnte dir den code per PN zusenden. Das würde noch gehen.
-
@C91 sagte in DVL zahlenwerte in Binärbaum übergeben:
@wob ich könnte dir den code per PN zusenden. Das würde noch gehen.
Private Kommunikation mit Problemanalyse und -lösung nur gegen Geld. Und: hier kein Interesse.