C++实现的二叉树---家谱图
2010-11-24 19:08
337 查看
#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';
}
}
}
#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';
}
}
}
相关文章推荐
- 用C++实现二叉树
- C++ 二叉树的构建,先序/中序/后序的递归/非递归实现
- 数据结构复习:几种排序算法的C++实现和二叉树的相关算法实现
- C++采用类模板实现二叉树以及谦虚遍历
- 二叉树的实现及相关操作C/C++
- C++实现二叉树(二)
- 二叉树的前序、中序、后序三种遍历的六种实现方式(递归、非递归)(C++)
- 二叉树的C++实现
- c++实现二叉树的先序遍历,中序遍历,后序遍历(递归方法)及运行实例结果
- C++二叉树的实现
- C++模板实现二叉树(六 AVL树基础与旋转)
- C++实现二叉树的插入、删除、查询、遍历
- c++实现二叉树的查找,插入,删除,深度,叶子节点数,度为1的节点数(递归方法)及运行实例结果
- C++实现二叉树的递归和非递归遍历方法
- C++:将表达式构建为二叉树实现一个简单计算器
- C++实现二叉树相关操作
- C++对二叉树的简单实现。
- C/C++面试题(三) 推断二叉树、快速排序递归实现、递归判断数组递增
- c++学习笔记—二叉树基本操作的实现
- [置顶] 二叉树的非递归前序、中序以及后序遍历C++模版类实现