ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

家族关系查询

2020-01-22 13:03:38  阅读:563  来源: 互联网

标签:关系 Husbandname 查询 string Tree 家族 NULL Now Wifename


题目:

41.家族关系查询
建立家族关系数据库,实现对家族成员关闭的相关查询

设计要求:

(1)建立家族关系并能存储到文件中
(2)实现家族成员的添加
(3)可以查询家族成员的双亲、祖先、兄弟、孩子和后代等信息
(4)该家族树宽度至少5,高度至少5

数据结构:

树状采用三叉链表实现,队列采用链式队列

家族树代码

/*代码作者:小狐狸*/
/*联系QQ:1307509553*/
//使用语言: c++
//代码仍有部分缺陷,由于个人技术的原因,没有使用层次遍历实现打印所有成员信息
//打印家族树和存入文件只会存储嫡系子代的信息
//注:Findloc函数在本代码中的使用率很高,你可以使用该函数来查询某个成员在家族树中的位置(返回一个指针).
//	  代码末尾有附带部分可用函数,若需要扩展功能时将函数放置main主函数之前即可
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
using namespace std;
#define OK 1
#define ERROR -1
#define Max 200 //字符串数组最大值
typedef struct TNode{
    string Wife;//妻子的姓名,若没有妻子时为空
    string Husband;//丈夫的姓名,若没有丈夫时为空
    struct TNode *parent;//双亲指针
    struct TNode *brother;//兄弟指针
    struct TNode *children;//孩子指针,仅指向最年长的孩子
}tree,*Tree;//三叉链表
int AddChild(Tree &Now,string Husbandname,string Wifename);//添加孩子到双亲节点Now
int AddZuXian(Tree &T,string Husbandname,string Wifename);//添加祖先
void CaiDanMain();//主菜单界面
int CheckCunZai(Tree T);//判断某个节点是否有成员,有则返回OK,否则返回ERROR
int CheckFile(string file);//判断文件是否已经存在,存在返回OK,否则返回ERROR
int ChangeZuXian(Tree &T,string Husbandname,string Wifename);//修改家族的祖先
int ChangeNow(Tree &Now,string Husbandname,string Wifename);//修改当前节点的信息,应保证当前节点存在
void Findloc(Tree T,string &Husbandname,string &Wifename,Tree &Now);//通过丈夫和妻子的名字查找到对应的节点,Now为记录该节点的指针,递归循环(深度遍历)
void PrintTree(Tree T);//将家族树的嫡系信息输出
int PrintChild(Tree Now);//显示某个节点的所有孩子,Now为当前节点
int PrintParent(Tree Now);//显示当前节点的双亲信息,Now为当前节点
int PrintZuXian(Tree Now);//显示祖先,Now为当前节点
int PrintBrother(Tree Now);//显示兄弟,Now为当前节点
int PrintLater(Tree Now);//查询当前节点的所有嫡系后代的信息,不包括当前节点,Now为当前节点
int InitTree(Tree &T);//初始化家族树
int InputFile(Tree T,string file);//将家族树存入文件中
int UploadFile(Tree &T,string file);//从已有的文件中将家族树信息覆盖

int main()
{
    Tree T;
    InitTree(T);//初始化
    while(1)
    {
        //fox存储用户输入的选项变量,初始值为0
        CaiDanMain();//主菜单显示
        int fox=0;//选项的选择
        cout<<"请选择: ";
        cin>>fox;
        if(CheckCunZai(T)==ERROR&&(fox>3&&fox<13))//若祖先不存在时先输入
        {
            cout<<"请先添加祖先!"<<endl;
            continue;
        }
        switch(fox)
        {
            case 0:return 0;//退出系统
            case 1://选择已有文件覆盖当前家族树
                {

                    while(1){
                        //truth1变量值为1时表示文件导入成功,并退出循环;值为0时文件导入失败,显示提示信息。初始值为0
                        string file;
                        cout<<"请输入需要导入的家族姓氏: ";
                        cin>>file;
                        int truth1=0;
                        truth1=UploadFile(T,file);
                        if(truth1==OK)//从文件中导入家族树成功时
                        {
                            cout<<"导入成功!"<<endl;
                            break;
                        }
                        else
                        {
                            //truth2值为1时,继续输入家族姓氏;值为0时退出,初始值为1
                            cout<<"导入失败!退出按0,重新输入家族姓氏按1"<<endl;
                            int truth2=1;
                            cin>>truth2;
                            if(truth2==0) break;
                        }
                    }
                }
                break;
            case 2://将当前家族树存入文件中
                {
                    //flag值为1时,重新输入家族姓氏;值为0时退出,初始值为1
                    string file;
                    int flag=1;
                    while(1)
                    {
                    cout<<"请输入家族姓氏作为文件名: ";
                    cin>>file;
                    if(CheckFile(file)==OK)//文件名存在时
                    {
                        cout<<"该家族姓氏已存在,退出按0,重新输入家族姓氏按1"<<endl;
                        cin>>flag;
                        if(flag==0)
                            break;
                        else continue;
                    }
                    if(CheckFile(file)==ERROR) break;
                    }
                    if(flag==0)//退出操作
                        break;
                    if(CheckFile(file)==ERROR)//文件名不存在时
                    {
                        InputFile(T,file);//将家族树导入文件
                        cout<<"操作成功!"<<endl;
                    }
                }
                break;
            case 3://添加祖先
                {
                    if(CheckCunZai(T)==OK)//若祖先已存在时
                    {
                        cout<<"祖先已存在!"<<endl;
                    }
                    else//不存在时,输入祖先信息
                    {
                        string Husbandname,Wifename;
                        cout<<"祖父(祖先): ";
                        cin>>Husbandname;
                        cout<<"祖母(祖先): ";
                        cin>>Wifename;
                        AddZuXian(T,Husbandname,Wifename);
                    }

                }
                break;
            case 4://添加家族新成员
                {
                    //flag1值为0时退出,为非0值时输入后代信息,初始值为0
                    int flag1=0;//若值为0时->退出此操作
                    string Fathername,Mothername,Husbandname,Wifename;
                    while(1)//当输入的父亲和母亲找到时退出循环
                    {
                        //flag2值为0时退出,为非0值时重新输入双亲信息,初始值为1
                        cout<<"父亲: ";
                        cin>>Fathername;
                        cout<<"母亲: ";
                        cin>>Mothername;
                        Tree truth=NULL;//为NULL时->显示提示信息,不为NULL时->输入成员信息
                        Findloc(T,Fathername,Mothername,truth);
                        if(truth==NULL)
                        {
                            int flag2=1;
                            cout<<"未找到双亲,退出按0,重新输入双亲按1"<<endl;
                            cin>>flag2;
                            if(flag2==0) break;
                            else continue;
                        }
                        else
                        {
                            cout<<"查找成功!可输入成员信息"<<endl;
                            flag1=1;//查找成功时赋值为1,执行输入成员信息
                            break;
                        }
                    }
                    if(flag1==0) break;//若为退出时,返回主界面
                    Tree Now;//临时指针
                    cout<<"丈夫: ";
                    cin>>Husbandname;
                    cout<<"妻子: ";
                    cin>>Wifename;
                    Findloc(T,Fathername,Mothername,Now);//寻找双亲的节点
                    AddChild(Now,Husbandname,Wifename);//添加孩子
                    while(1)
                    {
                        int flag3;//值为0时退出循环
                        cout<<"输入其兄弟按1,退出系统按0"<<endl;
                        cin>>flag3;
                        if(flag3==0)
                            break;
                        cout<<"丈夫: ";
                        cin>>Husbandname;
                        cout<<"妻子: ";
                        cin>>Wifename;
                        AddChild(Now,Husbandname,Wifename);//直接使用双亲节点
                    }
                }
                break;
            case 5://修改家族祖先
                {
                    string Husbandname,Wifename;
                    cout<<"祖父(祖先): ";
                    cin>>Husbandname;
                    cout<<"祖母(祖先): ";
                    cin>>Wifename;
                    ChangeZuXian(T,Husbandname,Wifename);
                    cout<<"修改成功!"<<endl;
                }
                break;
            case 6://修改某个家族成员
                {
                    //flag值为0时退出,值为1时重新输入成员信息并查找该成员,初始值为1
                    string Husbandname,Wifename;
                    int flag=1;
                    while(1){
                        //truth值为NULL时不存在该成员,不为NULL时成功找到成员信息,初始值为NULL
                        cout<<"丈夫(旧): ";
                        cin>>Husbandname;
                        cout<<"妻子(旧): ";
                        cin>>Wifename;
                        Tree truth=NULL;
                        Findloc(T,Husbandname,Wifename,truth);
                        if(truth)//存在该成员时
                        {
                            cout<<"查找成功!"<<endl;
                            break;
                        }
                        else//不存在该成员时
                        {
                            cout<<"查找失败,退出按0,重新输入按1!"<<endl;
                            cin>>flag;
                            if(flag==0) break;
                        }
                    }
                    if(flag==0)break;//退出操作
                    Tree Now;//临时指针
                    Findloc(T,Husbandname,Wifename,Now);
                    cout<<"丈夫(新): ";
                    cin>>Husbandname;
                    cout<<"妻子(新): ";
                    cin>>Wifename;
                    ChangeNow(Now,Husbandname,Wifename);
                }
                break;
            case 7://显示家族的祖先
                {
                    PrintZuXian(T);
                }
                break;
            case 8://显示某个成员的双亲
                {
                    //Now为NULL时,无成员信息;不为NULL时,有成员信息,初始值为NULL
                    string Husbandname,Wifename;
                    cout<<"丈夫: ";
                    cin>>Husbandname;
                    cout<<"妻子: ";
                    cin>>Wifename;
                    Tree Now=NULL;//临时指针
                    Findloc(T,Husbandname,Wifename,Now);
                    if(Now)
                        PrintParent(Now);
                    else cout<<"该成员信息不存在,无法找出双亲!"<<endl;;
                }
                break;
            case 9://显示兄弟
                {
                    while(1){
                        //Now为NULL时,无成员信息;不为NULL时,有成员信息,初始值为NULL
                        string Husbandname,Wifename;
                        cout<<"丈夫: ";
                        cin>>Husbandname;
                        cout<<"妻子: ";
                        cin>>Wifename;
                        Tree Now=NULL;//临时指针
                        Findloc(T,Husbandname,Wifename,Now);
                        if(Now)//找到信息时
                        {
                            PrintBrother(Now);
                            break;
                        }
                        else//未找到成员信息时
                        {
                            //truth值为0时退出,非0时重新输入成员信息。初始值为1
                            cout<<"无该成员信息,退出按0,重新输入信息按1"<<endl;
                            int truth=1;
                            cin>>truth;
                            if(truth==0)
                                break;
                        }
                    }
                }
                break;
            case 10://显示孩子
                {
                    while(1)
                        {
                        //Now为NULL时,无成员信息;不为NULL时,有成员信息,初始值为NULL
                        string Husbandname,Wifename,Sonname,SonWifename;
                        cout<<"丈夫: ";
                        cin>>Husbandname;
                        cout<<"妻子: ";
                        cin>>Wifename;
                        Tree Now=NULL;//临时指针
                        Findloc(T,Husbandname,Wifename,Now);//找到节点位置
                        if(Now)//找到节点时
                        {
                            if(PrintChild(Now)==ERROR)
                            {
                                cout<<"该成员无孩子!,退出按0,重新输入信息按1"<<endl;
                                int truth=0;
                                cin>>truth;
                                if(truth==0)
                                    break;
                            }
                            else break;
                        }
                        else//未找到成员信息时
                        {
                            cout<<"无该成员信息,退出按0,重新输入信息按1"<<endl;
                            int truth=0;
                            cin>>truth;
                            if(truth==0)
                                break;
                        }
                    }
                }
                break;
            case 11://显示所有后代
                {
                    while(1)
                    {
                        //Now为NULL时,无成员信息;不为NULL时,有成员信息,初始值为NULL
                        string Husbandname,Wifename;
                        cout<<"丈夫: ";
                        cin>>Husbandname;
                        cout<<"妻子: ";
                        cin>>Wifename;
                        Tree Now=NULL;
                        Findloc(T,Husbandname,Wifename,Now);
                        if(Now)//存在时
                        {
                            PrintLater(Now);
                            break;
                        }
                        else//不存在该成员时
                        {
                            cout<<"无该成员信息,退出按0,重新输入信息按1"<<endl;
                            int truth=0;
                            cin>>truth;
                            if(truth==0)
                                break;
                        }
                    }
                }
                break;
            case 12://显示家族树
                {

                    PrintTree(T);
                }
                break;
            case 13://清屏操作
                {
                    system("cls");
                }
                break;
            default:break;
        }
    }
    return 0;
}
int AddChild(Tree &Now,string Husbandname,string Wifename)//添加孩子到双亲节点Now
{
    if(Now->children==NULL)//没有孩子时
    {
        Tree p;//创建新的节点
        p=new TNode;
        p->brother=NULL;
        p->children=NULL;
        p->Husband=Husbandname;
        p->Wife=Wifename;
        p->parent=Now;
        Now->children=p;
    }
    else//有孩子时
    {
        Tree now;
        now=Now->children;//指向主孩子
        while(now->brother!=NULL)//在兄弟中进行循环操作
            now=now->brother;
        Tree p;//创建新的节点
        p=new TNode;
        p->brother=NULL;
        p->children=NULL;
        p->Husband=Husbandname;
        p->Wife=Wifename;
        p->parent=Now;
        now->brother=p;//now此时为末位的兄弟节点
    }
    return OK;
}
int AddZuXian(Tree &T,string Husbandname,string Wifename)//添加祖先
{
    Tree t;
    t=T;
    t->Husband=Husbandname;
    t->Wife=Wifename;
    t->brother=NULL;
    t->parent=NULL;
    t->children=NULL;
    return OK;
}

void CaiDanMain()//主菜单界面
{
    cout<<endl;
    cout<<"-----------------------------<主菜单>----------------------------------"<<endl;
    cout<<"|    0 退出系统                                                        |"<<endl;
    cout<<"|    1 选择已有家族谱覆盖当前家族树                                    |"<<endl;
    cout<<"|    2 将嫡系家族树存入文件                                            |"<<endl;
    cout<<"|    3 添加祖先                                                        |"<<endl;
    cout<<"|    4 添加家族新成员[最年长的兄弟应首先输入,无妻子时请填写无]        |"<<endl;
    cout<<"|    5 修改家族祖先                                                    |"<<endl;
    cout<<"|    6 修改某个家族成员                                                |"<<endl;
    cout<<"|    7 显示家族的祖先                                                  |"<<endl;
    cout<<"|    8 显示某个成员的双亲                                              |"<<endl;
    cout<<"|    9 显示某个成员的兄弟                                              |"<<endl;
    cout<<"|   10 显示某个成员的孩子                                              |"<<endl;
    cout<<"|   11 显示某个成员的所有嫡系后代                                      |"<<endl;
    cout<<"|   12 显示嫡系家族树信息                                              |"<<endl;
    cout<<"|   13 清屏                                                            |"<<endl;
    cout<<"------------------------------------------------------------------------"<<endl;
    cout<<endl;
}
int CheckCunZai(Tree T)//判断某个节点是否有成员,有则返回OK,否则返回ERROR
{
    Tree t;//临时指针
    t=T;
    if(t->Husband==""&&t->Wife=="")//对当前节点进行判断
    {
        return ERROR;
    }
    else return OK;
}
int CheckFile(string file)//判断文件是否已经存在,存在返回OK,否则返回ERROR
{
    //flag为文件句柄,flag=串1.find(串2)
    //flag的返回值为string::npos时则表示串2不为串1的子串
    string::size_type flag;
    flag=file.find(".txt");
    if(flag==string::npos)//不含有后缀.txt时,添加后缀
        file+=".txt";
    FILE*fp;
    char filename[Max];
    strcpy(filename,file.c_str());
    if((fp=fopen(filename,"r"))==NULL)//不存在时返回ERROR
        return ERROR;
    else return OK;
}
int ChangeZuXian(Tree &T,string Husbandname,string Wifename)//修改家族的祖先
{
    Tree t;
    t=T;
    if(t==NULL)
        return ERROR;
    t->Husband=Husbandname;
    t->Wife=Wifename;
    return OK;
}
int ChangeNow(Tree &Now,string Husbandname,string Wifename)//修改当前节点的信息,应保证当前节点存在
{
    Tree now;
    now=Now;
    now->Husband=Husbandname;
    now->Wife=Wifename;
    return OK;
}
void Findloc(Tree T,string &Husbandname,string &Wifename,Tree &Now)//通过丈夫和妻子的名字查找到对应的节点,Now为记录该节点的指针,递归循环(深度遍历)
{
    if(T==NULL)
        return;
    else
    {
        if(Husbandname==T->Husband&&Wifename==T->Wife)//若当前节点符合条件则Now指向当前节点
            Now=T;
        Findloc(T->children,Husbandname,Wifename,Now);//先对孩子进行遍历
        Findloc(T->brother,Husbandname,Wifename,Now);//后对兄弟进行遍历
    }
}
void PrintTree(Tree T)//将家族树的嫡系信息输出
{
    //time表示第几代孩子,初始值为1
    Tree childs;//临时指针
    childs=T;
    int time=1;//第几代
    while(childs)//在孩子中进行循环
    {
        //cout<<"第"<<time<<"代:"<<endl;
        if(time!=1)
            cout<<"第"<<time<<"代:"<<endl;
        else//祖先节点时
            cout<<"第1代(祖先):"<<endl;
        Tree brothers;
        brothers=childs;
       while(brothers)//在兄弟中进行循环
       {
           cout<<brothers->Husband<<"(男) ";
           cout<<brothers->Wife<<"(女)"<<endl;
           brothers=brothers->brother;
       }
       time++;
       childs=childs->children;
    }
}
int PrintChild(Tree Now)//显示某个节点的所有孩子,Now为当前节点
{
    cout<<endl;
    Tree k;
    if(Now->children==NULL)//没有孩子时,返回错误
    {
        return ERROR;
    }
    k=Now->children;
    cout<<"[孩子]"<<endl;
    while(k)//在兄弟中进行循环
    {
        cout<<k->Husband<<"(男) ";
        cout<<k->Wife<<"(女)"<<endl;
        k=k->brother;
    }
    return OK;
}
int PrintParent(Tree Now)//显示当前节点的双亲信息,Now为当前节点
{
    cout<<endl;
    Tree now;
    now=Now;
    Tree parents=NULL;//parents为指向当前节点父母的指针
    if(now->parent==NULL)//若now为祖先节点时无父亲和母亲
    {
        cout<<"当前为祖先,没有双亲!"<<endl;
        return ERROR;
    }
    else parents=now->parent;
    cout<<"[父亲] ";
    cout<<parents->Husband<<endl;
    cout<<"[母亲] ";
    cout<<parents->Wife<<endl;
    return OK;
}
int PrintZuXian(Tree Now)//显示祖先,Now为当前节点
{
    Tree k;//临时指针
    k=Now;
    while(k->parent!=NULL)//当往上循环到没有双亲的结点时为祖先
    {
        k=k->parent;
    }
    cout<<"[祖先] "<<endl;//祖先共有两个人
    cout<<k->Husband<<"(男) ";
    cout<<k->Wife<<"(女)"<<endl;
    return OK;
}
int PrintBrother(Tree Now)//显示兄弟,Now为当前节点
{
    Tree k;//临时指针
    if(Now->parent==NULL)//若为祖先时
    {
        cout<<"祖先无兄弟!"<<endl;
        return ERROR;
    }
    k=Now->parent->children;//指向主孩子
    if(k->brother!=NULL)
    {
        cout<<"[兄弟] "<<endl;
    }
    else
        {
            cout<<"无兄弟!"<<endl;
            return ERROR;
        }
    while(k)//在节点的兄弟中进行循环输出
    {
        if(k->Husband!=Now->Husband&&k->Wife!=Now->Wife)//不输出当前节点的成员信息,仅输出兄弟的信息
        {
            cout<<k->Husband<<"(男) ";
            cout<<k->Wife<<"(女)"<<endl;
        }
        k=k->brother;
    }
    return OK;
}
int PrintLater(Tree Now)//查询当前节点的所有嫡系后代的信息,不包括当前节点,Now为当前节点
{
    //time表示第几代孩子,初始值为1
    Tree k;
    if(Now->children==NULL)//无孩子时
    {
        cout<<"无后代信息"<<endl;
        return ERROR;
    }
    k=Now->children;
    int time=1;//表示第几代的孩子
    while(k)//孩子中循环
    {
        Tree p;
        p=k;
        cout<<"第"<<time<<"代:"<<endl;
        while(p)//兄弟中循环
        {
            cout<<p->Husband<<"(男) ";
            cout<<p->Wife<<"(女)"<<endl;
            p=p->brother;
        }
        time++;
        k=k->children;
    }
    return OK;
}
int InitTree(Tree &T)//初始化家族树
{
    T=new TNode;//创建头节点
    T->Husband="";//初始化为空
    T->Husband="";
    T->children=NULL;
    T->brother=NULL;
    T->parent=NULL;
    return OK;
}
int InputFile(Tree T,string file)//将嫡系家族树存入文件中
{
    //flag为文件句柄,flag=串1.find(串2)
    //若串2不为串1子串时,flag值为string::npos
    if(CheckFile(file)==OK)//文件已存在时返回错误
        return ERROR;
    string::size_type flag;
    flag=file.find(".txt");
    if(flag==string::npos)//没有后缀时添加后缀
        file+=".txt";
    FILE*fp;
    char filename[Max];
    char Husbandname[Max],Wifename[Max];
    char Fathername[Max],Mothername[Max];
    strcpy(filename,file.c_str());
    fp=fopen(filename,"w");
    Tree k;//孩子指针
    k=T;
    while(k)
    {
        Tree p;//兄弟指针
        p=k;
        while(p)
        {
            if((p->Husband!=T->Husband)&&(p->Wife!=T->Wife))//不为祖先节点时,将父母信息输入
            {
                strcpy(Fathername,(p->parent->Husband).c_str());
                strcpy(Mothername,(p->parent->Wife).c_str());
                fprintf(fp,"%s ",Fathername);
                fprintf(fp,"%s\t",Mothername);
            }
            strcpy(Husbandname,(p->Husband).c_str());
            strcpy(Wifename,(p->Wife).c_str());
            fprintf(fp,"%s ",Husbandname);//写入当前节点信息
            fprintf(fp,"%s\n",Wifename);
            p=p->brother;
        }
        k=k->children;
    }
    fprintf(fp,"#\n");//结束标志
    fclose(fp);//关闭文件
    return OK;
}
int UploadFile(Tree &T,string file)//从已有的文件中将家族树信息覆盖,若该文件不存在则返回ERROR
{
    //flag为文件句柄,flag=串1.find(串2)
    //若串2不为串1子串时,flag值为string::npos
    string::size_type flag;//判断是否含有后缀.txt
    flag=file.find(".txt");
    if(flag==string::npos)//不含后缀时添加后缀.txt
        file+=".txt";
    char filename[Max];
    strcpy(filename,file.c_str());//将file复制到filename
    FILE*fp=fopen(filename,"r");//传入参数filename为字符数组类型
    if(fp==NULL)//文件不存在时
        return ERROR;
    char ZuFu[Max],ZuMu[Max];
    fscanf(fp,"%s",ZuFu);//将祖先信息存入
    fscanf(fp,"%s",ZuMu);
    string ZuFuname(ZuFu);
    string ZuMuname(ZuMu);
    AddZuXian(T,ZuFuname,ZuMuname);
    while(1)
    {
        char Father[Max],Mother[Max];
        char Husband[Max],Wife[Max];
        fscanf(fp,"%s",Father);
        string Fathername(Father);
        if(Fathername=="#")
            break;
        fscanf(fp,"%s",Mother);
        fscanf(fp,"%s",Husband);
        fscanf(fp,"%s",Wife);
        string Mothername(Mother);
        string Husbandname(Husband);
        string Wifename(Wife);
        Tree Now;
        Findloc(T,Fathername,Mothername,Now);//找到双亲节点
        if(Now)//存在双亲节点时
            AddChild(Now,Husbandname,Wifename);
    }
    fclose(fp);
    return OK;
}
/*
int CountBrother(Tree Now,string Husbandname,string Wifename)//统计当前节点兄弟的个数
{//可用
    int sum=0;//兄弟的个数
    Tree t;
    if(Now->parent==NULL)//当前为祖先时
        return 0;
    t=Now->parent->children;
    while(t)
    {
        if(t->Husband!=Husbandname&&t->Wife!=Wifename)
            sum++;
        t=t->brother;
    }
    return sum;
}
*/
/*
int InputTree(Tree &T)//输入家族成员到家族树中
{
    string Husbandname,Wifename,Fathername,Mothername;
    int flag1=2;//默认为需要重新输入双亲
    cout<<"祖父(祖先): "<<endl;
    cin>>Husbandname;
    cout<<"祖母(祖先): "<<endl;
    AddZuXian(T,Husbandname,Wifename);//添加覆盖祖先
    cout<<"家庭成员输入前,请输入其父母的信息!"<<endl<<endl;
    while(1)//根据父亲和母亲的名字输入家庭成员
    {
        if(flag1==2){//当输入新成员时需要重新输入父母信息
            cout<<"请输入父亲:"<<endl;
            cin>>Husbandname;
            cout<<"请输入母亲:"<<endl;
            cin>>Wifename;
        }

        Tree Now=NULL;//临时节点指针
        Findloc(T,Fathername,Mothername,Now);//从家族树中寻找符合父母亲的节点,用Now保存双亲节点
        int flag2=1;
        if(Now==NULL)//若家族树中无该双亲时
        {
            cout<<endl;
            cout<<"未查询到该双亲!"<<endl;
            cout<<"-------------------------"<<endl;
            cout<<"|    0 退出输入         |"<<endl;
            cout<<"|    1 重新输入双亲     |"<<endl;
            cout<<"|    2 打印已有家族树   |"<<endl;
            cout<<"-------------------------"<<endl;
            cout<<endl;
            cin>>flag2;
            int time=1,truth=1;//time表示第几代,truth表示递归中当前节点与前者的关系
            switch(flag2)
            {
                case 0:return OK;
                case 1:
                    {
                        cout<<"父亲: ";
                        cin>>Fathername;
                        cout<<"母亲: ";
                        cin>>Mothername;
                    }
                    break;
                case 2:
                    {
                        int time=1,flag=1;
                        PrintTree(T,time,flag);
                    }
                    break;
                default:break;
            }
            if(flag2==2) continue;
        }
        else cout<<"成功找到双亲!可输入成员信息"<<endl;
        string Husband,Wife;
        cout<<endl;
        cout<<"丈夫:"<<endl;
        cin>>Husband;
        cout<<"妻子:"<<endl;
        cin>>Wife;
        if(CheckChildren(Now)==ERROR)//若没有孩子时,直接插入到父母节点之后
        {
            AddChild(Now,Husband,Wife);
        }
        if(CheckChildren(Now)==OK)//若有孩子时,插入孩子的兄弟节点的后面
        {
            AddBrother(Now->children,Husband,Wife);//传入孩子节点
        }
        cout<<endl;
        cout<<"------------------------"<<endl;
        cout<<"|    0 退出输入        |"<<endl;
        cout<<"|    1 输入兄弟        |"<<endl;
        cout<<"|    2 输入新的成员    |"<<endl;
        cout<<"------------------------"<<endl<<endl;
        cin>>flag1;
        switch(flag1)
        {
            case 0:return OK;
            case 1:
                {

                }
                break;
            case 2:
                {

                }
                break;
            default:break;
        }
    }
    return OK;
}*/
/*
int AddBrother(Tree &Now,string Husbandname,string Wifename)//添加新成员到兄弟节点之后,前提:Now应为其兄弟节点
{
    Tree now;//临时指针
    now=Now;
    while(now->brother!=NULL)//从Now节点的孩子中找到需要插入的位置,即兄弟节点的最后一个位置
        now=now->brother;
    Tree p;
    p=new TNode;//创建一个节点
    p->Husband=Husbandname;
    p->Wife=Wifename;
    p->brother=NULL;
    p->parent=Now;
    p->children=NULL;
    //双亲节点的孩子指向最年长的孩子
}
*/
/*
int CheckChildren(Tree Now)//检测某个节点是否有孩子,有则返回OK,否则返回ERROR
{//可用
    Tree now;
    now=Now->children;
    if(now->Husband!=""&&now->Wife!="")
        return OK;
    else return ERROR;
}
int CheckBrother(Tree Now)//检测某个节点是否有兄弟,有则返回OK,否则返回ERROR
{//可用
    Tree k;//临时指针
    if(Now->parent!=NULL)//不为祖先时,指向主孩子
     {
         k=Now->parent;//指向双亲
         k=k->children;//指向兄弟
     }
    else k=Now;
    if(k->brother==NULL)
        return ERROR;
    return OK;
}
*/

smallfox233 发布了1 篇原创文章 · 获赞 1 · 访问量 37 私信 关注

标签:关系,Husbandname,查询,string,Tree,家族,NULL,Now,Wifename
来源: https://blog.csdn.net/smallfox233/article/details/104069071

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有