ich hab eine Problem und zwar habe ich in einem Binärbaum Knoten gespeichert, in diesen Knoten sind wieder Artikel gespeichert die ich aus einer Datei einlese.
Nun soll ich beim Löschen des Knoten den Inhalt als Zeiger zurück geben. Wenn ich den Knoten aber per free() frei gebe ist der Zeiger nicht mehr existent. Kann mir jemand erklären wie ich das Problem umgehen kann? Soll ich die Löschen Methode dann Iterativ Programmieren?
Hier einmal der Code des Aufbau der Struktur die vom Baum verwaltet werden:
Code: Alles auswählen
typedef struct node {
struct artikel *artikel;
struct node *left;
struct node *right;
} node;
Code: Alles auswählen
void loesche_knoten(node **zeiger) {
node *temp;
if ((*zeiger) != NULL) {
if ((*zeiger)->left == NULL && (*zeiger)->right == NULL) { //Fall 1 Blattknoten
free(*zeiger);
*zeiger = NULL;
} else if ((*zeiger)->left == NULL) { //Fall 2 ein untergeordnetes Element
temp = *zeiger;
*zeiger = (*zeiger)->right;
free(temp);
} else if ((*zeiger)->right == NULL) { //Fall 2 ein untergeordnetes Element
temp = *zeiger;
*zeiger = (*zeiger)->left;
free(temp);
} else { //Fall 3 im linken Teilbaum den größten Wert
temp = (*zeiger)->left;
node *hilfsZeiger = NULL;
while (temp->right != NULL) {
hilfsZeiger = temp;
temp = temp->right;
}
hilfsZeiger->right = temp->left;
temp->left = (*zeiger)->left;
temp->right = (*zeiger)->right;
free(*zeiger);
*zeiger = temp;
}
}
}
void loesche(node **zeiger, int such) {
if ((*zeiger) == NULL) {
printf("Knoten nicht gefunden!\n");
}
// Knoten wurde Gefunden
else if ((*zeiger)->artikel->artikelnr == such) {
loesche_knoten(zeiger);
} else if ((*zeiger)->artikel->artikelnr >= such)
loesche(&((*zeiger)->left), such);
else
loesche(&((*zeiger)->right), such);
}
void entfernen(baum *b, int nr) {
loesche(&b->root, nr);
}