/*
Name: 家谱
Description: 本项目对家谱管理进行简单的模拟,以实现查看祖先和子孙个人信息、插入家族成员、删除家族成员等功能。
*/
#include<string>
#include<iostream>
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 Create(Person &L); //创建家谱
Person()
{
root = NULL;
}
private:
Node *root;
};
//===============创建家谱=======================
void Person::Create(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);
}
}
//========================主函数============================
int 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.Create(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';
}
}
return 0;
}