C++实现的二叉树---家谱图

#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** 家谱管理系统 **"< > 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'; } } }
  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值