B
Hallo,
habe ein kleines Programm für Binärbaumerstellung, das einfache Löschen funktioniert noch nicht. Habe das Problem eines Ausnahmefehlers bei der Verbindung Eltern-Enkel-Knoten.
Hoffe, jemand könnte mir helfen und im Voraus schon vielen Dank.
struct satz{
char name[15];
int position;
};
struct knoten{
satz markierung;knoten *links;
knoten *rechts;knoten *oben;
};
extern knoten *wurzel = new knoten;
extern int indexpos = 1;
int eingabe(knoten* k);
int einfuegen(knoten*& baum, knoten* neu);
int loescheKnoten(knoten* k);
int loesche1(knoten* k);
int initKnoten(knoten* k, char m[15]){
strcpy(k->markierung.name,m);
k->markierung.position=indexpos;
k->links=NULL;k->rechts=NULL;
k-oben=NULL;
return 0;}
int main(){
char wahl;
knoten* wurzel = new knoten;
initKnoten(wurzel,"");
strcpy(wurzel->markierung.name,"Wurzel_leer");
do{
cout << endl;
cout << " Eingabe ... e" << endl;
cout << " Loeschen ... l" << endl;
cout << " Ende ... q" << endl;
cout << " Waehlen Sie! ";
cin >> wahl;
switch(wahl){
case 'e' : eingabe(wurzel);break;
case 'l' : loescheKnoten(wurzel);break;
default : cout << "Programmende.";
}
}
while(wahl !='q');
return 0;
}
int eingabe(knoten* k){
char key[15];
cout << endl << "Namen eingeben ... ";
cout.flush(); gets(key);
if(strcmp(k->markierung.name,"Wurzel_leer") == 0) initKnoten(k,key);
else{
knoten *neu = new knoten;
initKnoten(neu,key);
einfuegen(k,neu);
}
indexpos++;
return 0;
}
int einfuegen(knoten*& baum, knoten* neu){
if(baum==NULL){ baum = neu;}
else{
if(strcmp(neu->markierung.name,baum->markierung.name)<0){
einfuegen(baum->links,neu);}
else { einfuegen(baum->rechts,neu);}
}
return 0;
}
int loescheKnoten(knoten* k){
loesche1(k); //loeschen eines Knotens mit einem Nachfolger
return 0;
}
int loesche1(knoten* k){
char key[15];
cout << endl << "Namen eingeben ... ";
cout.flush();gets(key);
knoten* enkel = new knoten;
initKnoten(enkel,key);
if(k->links == NULL) enkel = k->links;
else enkel = k->rechts;
//if(k->oben==NULL) //Pruefen, ob k evtl Wurzel
//enkel = k;return;
//ab hier klar, dass Elternknoten von k ist vorhanden
knoten* eltern = k->oben;
//Verbinde Elternknoten zum Enkel
if(eltern->links == k) //!!! Ausnahmefehler !!!
eltern->links=enkel;
else eltern->rechts=enkel;
//Verbinde Enkel zum elternknoten
if(enkel!=NULL) enkel->oben = eltern;
return 0;
}