#include "iostream"
#include "string"
using namespace std;
/*******************************************************************************
树的节点类
*******************************************************************************/
class Node
{
friend class Person;
public:
Node()
{
name = '?';
lchild = NULL;
rchild = NULL;
}
private:
string name;
Node *lchild;
Node *rchild;
};
/*******************************************************************************
家谱成员类
*******************************************************************************/
class Person
{
public:
void Update(Person &L); //家谱成员改名
void Delete(Person &L); //删除部分家庭成员
void Insert(Person &L); //添加单个家庭成员
void Print(Node *p); //显示部分家庭成员
Node * Lookup(Node *p, string name); //查找某人
void Add(Person &L); //添加部分家庭成员
void Creat(Person &L); //创建家谱
Person()
{
root = NULL;
}
private:
Node *root;
};
/*******************************************************************************
创建家谱
*******************************************************************************/
void Person::Creat(Person &L)
{
cout << "请输入祖先的姓名:";
string rootname;
cin >> rootname;
Node *p = new Node;
p->name = rootname;
L.root = p;
cout << "此家谱的祖先是:" << p->name << '\n';
}
/*******************************************************************************
添加部分家庭成员
*******************************************************************************/
void Person::Add(Person &L)
{
cout << "请输入要建立家庭的人的姓名:";
string rootname;
cin >> rootname;
Node *s = Person::Lookup(L.root, rootname);
if (s) {
Node *r = s;
cout << "请输入" << s->name << "的儿女人数:";
int n;
cin >> n;
int m = n;
cout << "请依次输入" << s->name << "的儿女的姓名:";
while (m) {
Node *q = new Node;
string name;
cin >> name;
q->name = name;
if (m == n) {
s->lchild = q;
s = s->lchild;
}
else {
s->rchild = q;
s = s->rchild;
}
m --;
}
Person::Print(r);
}
else {
cout << "查无此人,请重新输入!" << '\n';
Person::Add(L);
}
}
/*******************************************************************************
查找某人
*******************************************************************************/
Node * Person::Lookup(Node *p, string name)
{
Node *t = NULL;
Node *s[100];
int top = 0;
while (p || top > 0) {
while (p) {
if (p->name == name) {
t = p;
}
s[++ top] = p;
p = p->lchild;
}
p = s[top --];
p = p->rchild;
}
return t;
}
/*******************************************************************************
显示部分家庭成员
*******************************************************************************/
void Person::Print(Node *p)
{
cout << p->name << "的第一代子孙是:" << p->lchild->name << '\t';
p = p->lchild;
while (p->rchild) {
cout << p->rchild->name << '\t';
p = p->rchild;
}
cout << '\n';
}
/*******************************************************************************
添加单个家庭成员
*******************************************************************************/
void Person::Insert(Person &L)
{
cout << "请输入要添加儿子(或女儿)的人的姓名:";
string rootname;
cin >> rootname;
Node *s = Person::Lookup(L.root, rootname);
if (s) {
Node *r = s;
cout << "请输入" << s->name << "新添加的儿子(或女儿)的姓名:" ;
Node *p = new Node;
string name;
cin >> name;
p->name = name;
if (!s->lchild) {
s->lchild = p;
}
else {
s = s->lchild;
while (s->rchild) {
s = s->rchild;
}
s->rchild = p;
}
Person::Print(r);
}
else {
cout << "查无此人,请重新输入!" << '\n';
Person::Insert(L);
}
}
/*******************************************************************************
删除部分家庭成员
*******************************************************************************/
void Person::Delete(Person &L)
{
cout << "请输入要解散家庭的人的姓名:";
string rootname;
cin >> rootname;
Node *s = Person::Lookup(L.root, rootname);
if (s) {
if (s->lchild) {
cout << "要解散家庭的人是:" << s->name << '\n';
Person::Print(s);
s->lchild = NULL;
}
else {
cout << s->name << "尚未有家庭!";
}
}
else {
cout << "查无此人,请重新输入!" << '\n';
Person::Delete(L);
}
}
/*******************************************************************************
家谱成员改名
*******************************************************************************/
void Person::Update(Person &L)
{
cout << "请输入要更改姓名的人的目前姓名:";
string rootname;
cin >> rootname;
Node *s = Person::Lookup(L.root, rootname);
if (s) {
cout << "请输入更改后的姓名:";
string name;
cin >> name;
s->name = name;
cout << rootname << "已更名为" << s->name << '\n';
}
else {
cout << "查无此人,请重新输入!" << '\n';
Person::Update(L);
}
}
/*******************************************************************************
主函数
*******************************************************************************/
void main()
{
cout<<"\n** 家谱管理系统 **"<<endl;
cout<<"==================================================="<<endl;
cout<<"** 请选择要执行的操作 : **"<<endl;
cout<<"** A --- 完善家谱 **"<<endl;
cout<<"** B --- 添加家庭成员 **"<<endl;
cout<<"** C --- 解散局部家庭 **"<<endl;
cout<<"** D --- 更改家庭成员姓名 **"<<endl;
cout<<"** E --- 退出程序 **"<<endl;
cout<<"==================================================="<<endl;
cout << "首先建立一个家谱!" << '\n';
Person L;
L.Creat(L);
char ch;
while(ch!='E')
{
cout << "\n请选择要执行的操作:";
cin >> ch;
switch(ch) {
case 'A':
{
L.Add(L);
break;
}
case 'B':
{
L.Insert(L);
break;
}
case 'C':
{
L.Delete(L);
break;
}
case 'D':
{
L.Update(L);
break;
}
case 'E':
break;
default:
cout << "请输入正确的操作!" << '\n';
}
}
}