Stammbaum mit Pointer Datenstruktur
-
Hallo,
ich würde gerne ein Programm erstellen, dass alle männlichen Vorfahren einer Person (als Parameter) mit cout ausgibt. Gegeben habe ich dafür folgendes Struct:struct person { String name; person * mutter; person * ehepartner; };Den Vater der jeweiligen Person p kann ich ja mit p->mutter->ehepartner erhalten.
Aber wie ich den ganzen Stammbaum durchlaufen soll habe ich keine Ahnung.Danke für eure Hilfe
-
[cpp]
//ungetestet
void pv(person* ich,person* mutter,bool maennlich=0)
{
if(mutter)
{
pv(mutter,mutter->mutter,false);
if(mutter->ehepartner)
{
cout<<mutter->ehepartner->name<<'\n';
pv(mutter->ehepartner,mutter->ehepartner->mutter,true);
}
}
}
[cpp]
-
also erst mal gibts bei so was immer 2 möglichkeiten:
das ganze iterativ oder rekursiv lösen...einmal in etwa so:
person *aktuelle_person = X; while (aktuelle_person) { std::cout << aktuelle_person->Name; if(!aktuelle_person->mutter) break; aktuelle_person = aktuelle_person->mutter->ehepartner; };und einmal halt:
void ausgabe(const person *aktuelle_person) { if(!aktuelle_person) return; std::cout << aktuelle_person->Name; if(!aktuelle_person->mutter) return; ausgabe(aktuelle_person->mutter->ehepartner); }ist beides ungetestet und wirst noch bissl was ändern müssen - aber ansonsten sollte es dir zeigen, wie in etwa das gehen sollte...
bb
-
sp1nnaker schrieb:
ich würde gerne ein Programm erstellen, dass alle männlichen Vorfahren einer Person (als Parameter) mit cout ausgibt. Gegeben habe ich dafür folgendes Struct:
struct person { String name; person * mutter; person * ehepartner; };Den Vater der jeweiligen Person p kann ich ja mit p->mutter->ehepartner erhalten.
Achja? Was ist mit nichtehelichen Kindern oder wenn der Vater der Ex-Mann ist und die Mutter neu geheiratet hat?

Warum hast Du nicht einfach "vater" statt "ehepartner" geschrieben? Die Vater/Mutter-Eigenschaft ändert sich wenigstens nicht -- zumindest die biologische Version davon.
-
vrmtl weil es eine aufgabenstellung ist...
-
unskilled schrieb:
also erst mal gibts bei so was immer 2 möglichkeiten:
das ganze iterativ oder rekursiv lösen...einmal in etwa so:
person *aktuelle_person = X; while (aktuelle_person) { std::cout << aktuelle_person->Name; if(!aktuelle_person->mutter) break; aktuelle_person = aktuelle_person->mutter->ehepartner; };und einmal halt:
void ausgabe(const person *aktuelle_person) { if(!aktuelle_person) return; std::cout << aktuelle_person->Name; if(!aktuelle_person->mutter) return; ausgabe(aktuelle_person->mutter->ehepartner); }ist beides ungetestet und wirst noch bissl was ändern müssen - aber ansonsten sollte es dir zeigen, wie in etwa das gehen sollte...
bb
Du gehst nur die männlichen Vorfahren hoch, verschweigst aber der Mutter Vater und der Großmutter Vater und die meisten männlichen Vorfahren?
Diese Kette hätte ich auch szuerst iterativ gemacht.
Aber will ichs richtig machen, muß ich ja alle Papa-Vorfahren und Mama-Vorfahren verfolgen, und damit es noch ein wenig schieriger wird, sollen nur die männlichen ausgegeben werden.
Als ich die Aufgabe las und dazu die völlig unduchsichtige Datenstruktur, dachte ich, mich will einer veräppeln. Aber naja, Profs machen sowas öfters.
-
volkard schrieb:
...
huch -.-
stimmt...
wenn ich jz ganz eiskalt sage, dass ich ihm nicht die komplettlösung geben wollte, glaubt mir das vrmtl (zu recht ^^) niemand
bb
-
Danke, jetzt hab ichs:
void pv(person * p) { if(p->mutter != NULL) { pv(p->mutter); if(p->mutter->ehepartner != NULL) { cout << p->mutter->ehepartner->name << '\n'; pv(p->mutter->ehepartner); } } }und läuft perfekt.
-
sp1nnaker schrieb:
und läuft perfekt.
Ich hab nur kurz einen Blick drauf geworfen, aber irgendwie fehlt mir da der Zweig für p->ehepartner.
-
jencas schrieb:
sp1nnaker schrieb:
und läuft perfekt.
Ich hab nur kurz einen Blick drauf geworfen, aber irgendwie fehlt mir da der Zweig für p->ehepartner.
p->mutter->ehepartner und p->mutter werden rekurriert. ist doch ok.
die eltern meines mannes sind aber nicht meine vorfahren.