Hallo zusammen,
ich möchte ein Element im binären Baum löschen das zwei Nachfolger hat. Leider funktioniert es nicht ganz. Hier ist der link:
http://openbook.rheinwerk-verlag.de/c_v ... 102c324f2f
Ich glaube der Fehler ist in dieser Funktion
void suche_ersatz(int *neuwert, KNOTEN **zeiger)
Ich möchte z.B. die Zahl 40 löschen aber irgendwie funktioniert es nicht. Hier ist mein Baum:
Löschen eines Elements im binären Baum
Löschen eines Elements im binären Baum
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
- cloidnerux
- Moderator
- Beiträge: 3123
- Registriert: Fr Sep 26, 2008 4:37 pm
- Wohnort: Ram (Gibts wirklich)
Re: Löschen eines Elements im binären Baum
Redundanz macht wiederholen unnötig.
quod erat expectandum
quod erat expectandum
Re: Löschen eines Elements im binären Baum
Entschuldigung, hier der Code:
In dieser Funktion: void suche_ersatz(int *neuwert, KNOTEN **zeiger) möchte ich das der Wert 42, den Platz von 40 einnimmt und anschließend soll der Wert 42 gelöscht werden, aber auf dem Platz den die Zahl 42 einnehmen sollte kommt eine ganz andere Zahl heraus z.B.2000144914. Ich glaube der Fehler ist in dieser Funktion ist.
So sollte es grafisch aussehen:
Code: Alles auswählen
void loesche(KNOTEN **zeiger, int such) //Mit dieser Funktion wird der Wert gesucht zum löschen
{
if((*zeiger) == NULL)
printf("Baum ist leer\n");
else if((*zeiger)->wert == such) /* Gefunden! */
loesche_knoten(zeiger);
else if((*zeiger)->wert >= such)
loesche(&((*zeiger)->links),such);
else
loesche(&((*zeiger)->rechts),such);
}
Code: Alles auswählen
void loesche_knoten(KNOTEN **zeiger) //Hier wird ermittelt wie viel Nachfolger der Knoten hat
{
KNOTEN *temp;
int tempwert;
if(globale_wurzel == *zeiger) {
printf("Kann die Wurzel nicht loeschen!!\n");
return;
}
if((*zeiger)!=NULL) { /* Blatt! */
if((*zeiger)->links==NULL && (*zeiger)->rechts==NULL) {
free(*zeiger);
*zeiger=NULL;
}
else if((*zeiger)->links==NULL) {
/* Nur rechter Nachfolger */
temp = *zeiger;
*zeiger=(*zeiger)->rechts;
free(temp);
}
else if((*zeiger)->rechts==NULL) {
/* Nur linker Nachfolger */
temp = *zeiger;
*zeiger=(*zeiger)->links;
free(temp);
}
else { /* 2 Nachfolger, wir suchen Ersatzelement */
suche_ersatz(&tempwert, &((*zeiger)->rechts));
(*zeiger)->wert=tempwert;
}
}
}
Code: Alles auswählen
//Hier sollte der Knoten gelöscht werden der zwei Nachfolger hat z.B. 40
void suche_ersatz(int *neuwert, KNOTEN **zeiger)
{
KNOTEN *temp;
if(*zeiger != NULL) {
if((*zeiger)->links==NULL) {
neuwert=(*zeiger)->wert;
temp=*zeiger;
*zeiger=(*zeiger)->rechts;
free(temp);
}
else
suche_ersatz(neuwert, &((*zeiger)->links));
}
}
So sollte es grafisch aussehen:
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
- Xin
- nur zu Besuch hier
- Beiträge: 8859
- Registriert: Fr Jul 04, 2008 11:10 pm
- Wohnort: /home/xin
- Kontaktdaten:
Re: Löschen eines Elements im binären Baum
Code: Alles auswählen
void suche_ersatz(int *neuwert, KNOTEN **zeiger)
{
KNOTEN *temp;
if(*zeiger != NULL) {
if((*zeiger)->links==NULL) {
neuwert=(*zeiger)->wert;
Wenn das so kompiliert (und eine Warnung ignoriert wird), dann wird neuwert überschrieben, also die Adresse, wo der neue Wert hingeschrieben werden soll. Es wird an die Adresse, wo der neue Wert hingeschrieben werden soll, aber nix geschrieben.
Ich habe das Buch von Jürgen Wolf nicht und was ich von Jürgen Wolf habe, ist okay. Aber das C von A bis Z wird regelmäßig verrissen. Und ich könnte mir vorstellen, dass das eine der Gründe ist, denn eine Funktion "suche_ersatz", die gleichzeitig Knoten löscht, erscheint mir auch nicht ganz koscher.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.
Re: Löschen eines Elements im binären Baum
Der Fehler hätte auffallen sollen, aber irgendwie habe ich ihn doch nicht gefunden. Vielen Dank Xin, du hast mir wieder sehr geholfen.