Baum- und Vektorproblem

Ozzy Ozborn

Erfahrenes Mitglied
Hi,

ich habe ein Problem mit einem Binärbaum: aus einer Datei soll man eine Formel auswählen, die dann in einen Binäürbaum eingefügt wird. Nun soll der Benutzer aber auch die Möglichkeit haben, nachdem er eine Formel ausgewählt hat, eine andere auszuwählen. Dafür wollte ich den Baum eigentlich löschen, und einen neuen anlegen:

Code:
Baum *tree = new Baum();
cin >> wert;

switch(wert) {
case 1: {delete tree;
             Baum *tree = new Baum();
             f=read.einlesen();
             tree->insert(tree, f);
             break;
} //Case1
[...]
}
Den Baum muss ich ja löschen, da die neue Formel ja nicht die gleiche Länge haben muss.
Mein Problem ist nun, dass er, wenn ich mir beim zweiten Mal den Baum inorder ausgeben lassen möchte, er mit aus dem Programm springt, mit dieser "... hat eine Fehler verursacht und wird geschlossen...". Ich kann das nur einfach nicht verstehen!
Hat jemand von Euch eine Idee dazu?

Die zweite Frage betrifft einen Vector: wie kann ich den Inhalt möglichst schnell und elegant löschen? Muss ich unbedingt dazu eine for-Schleife nehmen, und ihn mit erase löschen?

MfG, Ozzy
 
Zuletzt bearbeitet:
Sollte sicher so aussehen:
C++:
switch(wert) {
case 1: {    delete tree;
             tree = new Baum();
             //...
        }
}
mit "Baum *tree = new Baum();" innerhalb des case-Zweiges erzeugst du eine Variable, die nur innerhalb dieses case gültig ist. Falls nach dem switch-Block auf "tree" zugreifst, bekommst du einen Fehler, da ja der ganz oben zugewiesene "tree" gelöscht wurde.

Einen Vector kannst du mit der Methode "clear()" komplett löschen.

Gruß
MCoder
 
Hi,

also das klappt leider auch nicht, er meckert zwar nicht mehr, aber er fügt den Baum auch nicht richtig ein. Beim Ausgeben zeigt er dann nur irgendwelche Sonderzeichen und so...

MfG, Ozzy
 
Und left und right werden auch mit NULL initialisiert (also entweder im Destrukor
oder Konstruktor)?

Mach dir doch mal eine Ausgabe nach dem Freigeben und nach dem Einfügen:

C++:
Baum *tree = new Baum();
cin >> wert;

switch(wert) {
case 1: {delete tree;
             tree = new Baum();
             //Baum ausgeben
             f=read.einlesen();
             // f ausgeben
             tree->insert(tree, f);
             //Baum ausgeben
             break;
} //Case1

Gruß

RedWing
 
Also nach der ersten Formel:
((a&b)>c)<- Formel f
a & b > c <- inorder Ausgabe

((((!a)+(b2&(!c)))+(p&r))>c)<- Formel f
b2 & ! c <- inorder Ausgabe

Also er gibt bei der Ausgabe nach dem Löschen nichts aus (hatte extra Kommentare außenrum gemacht).
Aber wie man sieht, ändert er ja auch nicht die Größe des Baumes, sieht eher so aus, als hätte er ihn doch nicht richtig gelöscht, sondern nur Sachen eingefügt...

Habt Ihr da noch Ideen?

MfG, Ozzy
 
Aber wie man sieht, ändert er ja auch nicht die Größe des Baumes, sieht eher so aus, als hätte er ihn doch nicht richtig gelöscht, sondern nur Sachen eingefügt...

Was meinst du mit "ändern der Größe des Baums"? delete hat nur die Aufgabe
alloziierten Speicher den du irgendwann mal mit new reserviert hast wieder
freizugeben. Es tut dein Objekt nicht "reseten"...
Wenn du irgendwas rückgängig machen willst, z.B. irgendwelche Daten deines
Objektes reseten möchtest (auf NULL, 0 oder sonstige Werte), musst du das im
Destruktor selber tun...

Gruß

RedWing
 
Hallo,

kein Problem. Aber es ist schwer eine "Ferndiagnose" zu treffen.
Ich denke wichtig ist das der jeweils rechte und linke Sohn auf NULL geresetet wird...

Hast dus denn schonmal so probiert?:
Code:
Baum::~Baum(){
    if(right != NULL) delete right; 
    if(left != NULL) delete left; 
    left = NULL;
    right = NULL;
}

Gruß

RedWing
 
Zurück