#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#define MAX_LENGTH 10
struct personal
{
char
name[MAX_LENGTH];
personal *bigson ;
personal *littleson;
personal *parent;
};
personal *temp,*head=(personal *)malloc(sizeof(personal));
int thelevel=0;
/**
*初始化
*/
void initial(personal *head)
{
head->parent=NULL;
head->bigson=NULL;
head->littleson=NULL;
(head->name)[0]=NULL;
}
/**
*结char数组赋值
*/
void set(char *a,char b[])
{
for(int i=0;b[i]!=NULL;i++){
a[i]=b[i];
}
a[i]='\0';
}
/**
*判断两个字符串是否相等
*/
bool checkeq(char a[],char b[])
{
for(int i=0;b[i]!=NULL;i++){
if(a[i]!=b[i]){
return false;
}
}
if(a[i]!=NULL){
return false;
}
return true;
}
/**
*先序遍历,找到名字为name的人
*/
void findperson(personal *root,char name[],int num)
{
num++;
if(root!=NULL){
if(checkeq(root->name,name)){
thelevel=num;
temp=root;
}else{
findperson(root->bigson,name,num);
findperson(root->littleson,name,num);
}
}
}
/**
*打印家谱信息
*/
void printinfo(personal *root)
{
if(root!=NULL){
printf("%s ",root->name);
printinfo(root->bigson);
printinfo(root->littleson);
}
}
/**
*将家庭信息保存进结构体中
*/
bool push(char fa[],char son[])
{
temp=NULL;
personal *sonone;
sonone=(personal *)malloc(sizeof(personal));
initial(sonone);
set(sonone->name,son);
if(checkeq(head->name,"")){
set(head->name,fa);
sonone->parent=head;
head->bigson=sonone;
printf("
%s
已经加入家谱\n",fa);
printf("
%s
已经加入家谱\n",son);
return true;
}else{
findperson(head,fa,0);
if(temp->name==NULL){
free (sonone);
printf("输入的父亲不存在\n");
return false;
}else if(temp->bigson!=NULL && temp->littleson!=NULL){
free (sonone);
printf("儿子字数已满\n");
return false;
}else if(temp->bigson==NULL){
sonone->parent=temp;
temp->bigson=sonone;
printf("
%s
已经加入家谱\n",son);
return true;
}else{
sonone->parent=temp;
temp->littleson=sonone;
printf("
%s
已经加入家谱\n",son);
return true;
}
return true;
}
return true;
}
/**
*输入家庭信息
*/
void inputinfo()
{
char father[MAX_LENGTH],sonone[MAX_LENGTH],sontwo[MAX_LENGTH];
printf("
****************************************************\n");
printf("
*
格式为:侯超
儿子1
儿子2
*\n");
printf("
*
侯超为父亲名字,后两个名字为儿子名字
*\n");
printf("
*
不存在的儿子用0代替,输入两个-1结束
*\n");
printf("
****************************************************\n");
while(scanf("%s%s",father,sonone)){
if(checkeq(father,sonone) && checkeq(sonone,"-1")){
break;
}else{
scanf("%s",sontwo);
if(sonone!="0"){
if(push(father,sonone)){
if(sontwo!="0"){
push(father,sontwo);
}
}
}
}
}
}
/**
*输出家庭信息
*/
void outputinfo()
{
if(head->name==""){
printf("信息为空\n");
}else{
printf("家族信息:\n");
printinfo(head);
printf("\n");
printf("打印完毕\n");
}
}
/**
*输入某人的所有儿子
*/
void checkson()
{
char name[MAX_LENGTH];
printf("请输入名字\n");
scanf("%s",name);
temp=NULL;
findperson(head,name,0);
if(temp==NULL){
printf("此人不在家谱中\n");
return;
}else if(temp->littleson==NULL && temp->bigson==NULL){
printf("此人没有儿子\n");
return;
}else if(temp->littleson!=NULL){
printf("儿子为:\n");
printf("
%s",temp->littleson->name);
}
if(temp->bigson!=NULL){
printf("
%s",temp->bigson->name);
}
printf("\n");
}
/**
*输入某人的双亲
*/
void checkparent()
{
char name[MAX_LENGTH];
printf("请输入名字\n");
scanf("%s",name);
temp=NULL;
findperson(head,name,0);
if(temp==NULL){
printf("此人不在家谱里\n");
}else if(temp->parent==NULL){
printf("此人没有双亲\n");
}else{
printf("双亲为:\n");
printf("
%s\n",temp->parent->name);
}
}
/**
*遍历,找到兄弟
*/
void findba(personal *root,int num,char name[])
{
num++;
if(root!=NULL){
if(num==thelevel){
if(!checkeq(root->name,name)){
printf("%s ",root->name);
}
}else if(num<thelevel){
findba(root->bigson,num,name);
findba(root->littleson,num,name);
}
}
}
/**
*找到某人的兄弟
*/
void showbor()
{
char name[MAX_LENGTH];
printf("请输入名字:\n");
scanf("%s",name);
temp=NULL;
thelevel=0;
findperson(head,name,0);
if(temp==NULL){
printf("此人不在家谱里\n");
}else if(temp->parent==NULL){
printf("此人没有兄弟\n");
}
printf("兄弟为:\n");
printf("
");
findba(head,0,name);
printf("\n");
}
/**
*遍历找到祖先
*/
void findan(personal *root,int num)
{
num++;
if(root!=NULL){
if(num<thelevel){
printf("%s ",root->name);
findan(root->bigson,num);
findan(root->littleson,num);
}
}
}
/**
*找到某人的祖先
*/
void showan()
{
char name[MAX_LENGTH];
printf("请输入名字:\n");
scanf("%s",name);
temp=NULL;
thelevel=0;
findperson(head,name,0);
if(temp==NULL){
printf("此人不在家谱中\n");
}else if(temp->parent==NULL){
printf("此人没有祖先\n");
}
printf("祖先为:\n");
printf("
\n");
findan(head,0);
printf("\n");
}
int main()
{
int inputcase;
initial(head);
while(1){
printf("
****************************************************\n");
printf("
*
菜单
*\n");
printf("
*
1
输入家庭信息
*\n");
printf("
*
2
输出家庭信息
*\n");
printf("
*
3
查看某人的儿子
*\n");
printf("
*
4
查看某人的双亲
*\n");
printf("
*
5
查看某人的所有兄弟
*\n");
printf("
*
6
查看某人的所有祖先
*\n");
printf("
*
0
退出
*\n");
printf("
****************************************************\n");
scanf("%d",&inputcase);
if(inputcase==0){
break;
}
switch(inputcase){
case 1:
inputinfo();
break;
case 2:
outputinfo();
break;
case 3:
checkson();
break;
case 4:
checkparent();
break;
case 5:
showbor();
break;
case 6:
showan();
break;
default:
printf("输入错误\n");
}
}
return 0;
}