java实现家庭关系图_左孩子右兄弟二叉树实现家族家谱
/*
Name: 家譜
Description: 本項目對家譜管理進行簡單的模擬,以實現查看祖先和子孫個人信息、插入家族成員、刪除家族成員等功能。
*/
#include
#include
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 <
}
//================添加部分家庭成員====================
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 << "的第一代子孫是:" <lchild->name << '\t';
p = p->lchild;
while(p->rchild)
{
cout << p->rchild->name <
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 << "要解散家庭的人是:" <name <
Person::Print(s);
s->lchild = NULL;
}
else
{
cout << s->name << "尚未有家庭!";
}
}
else
{
cout << "查無此人,請重新輸入!" <
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 << "查無此人,請重新輸入!" <
Person::Update(L);
}
}
//========================主函數============================
int main()
{
cout<
cout<
cout<
cout<
cout<
cout<
cout<
cout<
cout<
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;
}
總結
以上是生活随笔為你收集整理的java实现家庭关系图_左孩子右兄弟二叉树实现家族家谱的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: 2023年东大学机械专硕考研上岸经验分享
 - 下一篇: 如何搭建属于自己的网站博客?(手把手教你