奋斗的小猫 发表于 2015-12-21 14:35:01

数据结构程序设计之家谱管理系统

求一个关于家谱管理系统的代码,要求对家谱管理进行简单的模拟。以实现查看祖先和子孙个人信息,插入家族成员,删除家族成员等功能。。。。。拜托各位大神了,帮忙写一下代码。。。

野狼wolf 发表于 2015-12-21 14:35:02

#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;
        int top = 0;
        while (p || top > 0) {
                while (p) {
                        if (p->name == name) {
                                t = p;
                        }
                        s[++ top] = p;
                        p = p->lchild;
                }
                p = s;
                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';
                }
        }
}

莫欺少年穷 发表于 2015-12-23 20:24:21

野狼wolf 发表于 2015-12-25 16:06:07

这个就是你看一下
页: [1]
查看完整版本: 数据结构程序设计之家谱管理系统