t=0; }while(t==1); } } if (ch==\else { root=new Node; //申请结点内存空间 SetNode(root); //设置结点内容 root->child=Creat( ); //该结点的孩子 root->brother=Creat( ); // 该结点的兄弟 } return root; //返回结点 } void FamilyTree::Release(Node *root) // 析构函数调用 { if(root!=NULL) { Release(root->child); //释放左孩子 Release(root->brother); //释放右兄弟 delete root; } } void FamilyTree::SetNode(Node *root) //设置结点信息 { Numberofpeople++; cout<<\请输入家庭成员的基本信息 \cout<<\姓名: \cin>>root->data.name; cout<<\出生地: \cin>>root->data.birthPlace; cout<<\生日 (数字、年月日以空格或者回车间隔) :\while(1) { cin>>root->data.birthDay; if(cin.fail()) { cout<<\输入有错!!请重新输入生日 (数字):\cin.clear(); //输入错误则能重新输入 cin.sync(); //清空流 } else break; } //isdigit 异常处理生日输入 ,若参数 c 为阿拉伯数字 0~9,则返回非 0 值,否则返回 NULL 。 /*int i; for(i=0;root->data.birthDay[i]!=0;++i) { if(isdigit(root->data.birthDay[i])==0) { cout<<\输入不明确,请重新输入! !\break; } }*/ cout<<\性别: \cin>>root->data.sex; cout<<\学历: \cin>>root->data.education; cout<<\工作: \cin>>root->data.job; cout<<\父亲: \cin>>root->data.father; cout<<\配偶(有多任配偶则以 “,”或者 “、”间隔):\cin>>root->data.spouse; cout<<\是否健在( y 是, n 否):\cin>>root->data.life; if(toupper(root->data.life)!='Y') //异常处理 { if(toupper(root->data.life)!='N'){ int t=1; do { cout<<\输入不明确,请重新输入! !\cout<<\是否健在( y 是, n 否):\cin>>root->data.life; if((toupper(root->data.life)=='Y')||(toupper(root->data.life)=='N')) t=0; }while(t==1); } } if(toupper(root->data.life)=='Y') LifePeopele++; } void FamilyTree::PreOrder(Node *root) //前序递归遍历输出家谱 { if(root==NULL) return; else { cout<data.name<<'\\t'; PreOrder(root->child); PreOrder(root->brother); } } void FamilyTree::InOrder(Node *root) // 中序递归遍历输出家谱 { if(root==NULL) return; else { InOrder(root->child); cout<data.name<<'\\t'; InOrder(root->brother); } } void FamilyTree::PostOrder(Node *root) // 后序递归遍历输出家谱 { if(root==NULL) return; else { PostOrder(root->child); PostOrder(root->brother); cout<data.name<<'\\t'; } 29 30 } int FamilyTree::Generation(Node *root) //这个家族共有几代人 { int l; //l 左孩子 if(root==NULL) // 这个家族为空 ,返回 0 return 0; else { l=Generation(root->child); // 左孩子的 return l+1; } } //int numberofpeople=0; int FamilyTree::NumberOfPeople( ) //家族的总人数 { if(root==NULL) //家族人数为 0 return 0; /*else { if(root!=NULL) numberofpeople++; NumberOfPeople(root->child); NumberOfPeople(root->brother); } return numberofpeople;*/ else return Numberofpeople; } //int count=0; int FamilyTree::LifeNum( ) //健在人数 { if(root==NULL) //-1 表示这个家族不存在 return -1; /*else { if(toupper(root->data.life)=='Y') count++; LifeNum(root->child); LifeNum(root->brother); } return count;*/ return LifePeopele; } void FamilyTree::PrintMessage(Node *root ) //输出基本信息 { if(root==NULL) return ; else { cout<<\姓名: \cout<<\性别: \cout<<\配偶: \cout<<\出生地: \cout<<\生 日 : \hDay.month<<\cout<<\父亲: \cout<<\学历: \cout<<\工作: \cout<<\是否健在: \if(toupper(root->data.life)=='Y') cout<<\是\else cout<<\否\} } int message=0; //判断是否查找成功 int FamilyTree::Message(Node *root,string Name) //显示该成员的基本信 息 { if(root==NULL) return message; else { if(root->data.name==Name) { message=1; PrintMessage(root ); } else { Message(root->child,Name); Message(root->brother,Name); } } return message; } Node* FamilyTree::PreFindFather(Node *root,string FatherName) //给定