家谱管理系统数据结构.docx
《家谱管理系统数据结构.docx》由会员分享,可在线阅读,更多相关《家谱管理系统数据结构.docx(12页珍藏版)》请在冰豆网上搜索。
![家谱管理系统数据结构.docx](https://file1.bdocx.com/fileroot1/2022-10/28/c5ba62dc-a775-4b70-b82f-91917c2b9d2f/c5ba62dc-a775-4b70-b82f-91917c2b9d2f1.gif)
家谱管理系统数据结构
#include
#include
#include
#include
#defineMAXS100
#defineElemtypechar
typedefstructBiTNode
{
intmark;
intlevel;
charname[50];
charbirthday[50];
charaddress[MAXS];Elemtypedata;
structBiTNode*lc,*rc;}BiTNode,*BiTree;
charnametemp[50];〃姓名
charbirthdaytemp[50];〃生日
charaddresstemp[MAXS];〃地址
charch;
intleveltemp;
intNth;
charsearchdata[50];
charsearchname[50];
intcount;
BiTreetemp;
BiTreeCreateBiTree(FILE*fp);
voidPrintlnfo(BiTreeT);
voidPreOrderTS(BiTreeT);
voidShowNth(BiTreeT);
voidSearchByName(BiTreeT);
voidSearchByBirthday(BiTreeT);
voidAddChild(BiTreeT);
voidDeleteByName(BiTreeT);
voidsearchmenu();
voidmenu();
voidinsystem();
voidclosefile();
#include"my.h"
voidSearchByName(BiTreeT)〃按照姓名查询,输出成员信息
if(T)
if(T->lc)
if(T->lc->rc)
{
temp=T->lc->rc;
while(temp)
{
if(strcmp(temp->name,searchname)==O)
{
count++;
printf("\n此人的信息为:
\n");
Printlnfo(temp);
printf("此人父兄的信息为:
\n");
PrintInfo(T);
if(temp->lc->rc)
{
printf("此人孩子的信息为:
\n");
temp=temp->lc->rc;
while(temp)
{
PrintInfo(temp);
temp=temp->rc;
}
}
return;
}
else
temp=temp->rc;
SearchByName(T->lc);
SearchByName(T->rc);
}
else
{
printf("请先建立家庭关系\n");
return;
}
}
voidSearchByBirthday(BiTreeT)〃按照出生日期查询成员名单
if(T)
{
if(strcmp(T->birthday,searchdata)==O)
{
Printinfo(T);
count++;
}
}
}
voidAddChild(BiTreeT)〃某成员添加孩子
{
if(T)
{if(strcmp(T->name,searchname)==O)
{
count++;
temp=(BiTree)malloc(sizeof(BiTNode));
printf("请输入添加孩子的姓名:
\n");
scanf("%s",temp->name);
printf("请输入添加孩子的出生年月:
(格式形如:
2010-1-1)\n");
scanf("%s",temp->birthday);
printf("请输入添加孩子的家庭住址:
\n");
scanf("%s",temp->address);
temp->level=T->level+1;
temp->rc=T->lc->rc;
temp->lc=NULL;
T->lc->rc=temp;
printf("孩子添加成功\n");
return;
}
AddChild(T->lc);AddChild(T->rc);
}
else
{
printf("请先建立家庭关系\n");return;
}
}
voidDeleteByName(BiTreeT)//删除某成员(若其还有后代,则一并删除)
{
if(T)if(strcmp(T->name,searchname)==O)
count++;
T=NULL;
return;
}
DeleteByName(T->lc);
DeleteByName(T->rc);
}
}
BiTreeCreateBiTree(FILE*fp)
{
if(!
feof(fp))
{
BiTreeT;
T=(BiTree)malloc(sizeof(BiTNode));
fscanf(fp,"%s%s%s\n",nametemp,birthdaytemp,addresstemp);
fscanf(fp,"%d",&leveltemp);
if((strcmp(nametemp,"n")==0)&&(strcmp(birthdaytemp,"n")==O)&&(strcmp(addresstemp,"n")==O))
{
T=NULL;
returnT;
}
else
{
strcpy(T->name,nametemp);
strcpy(T->birthday,birthdaytemp);
strcpy(T->address,addresstemp);
T->level=leveltemp+1;printf("读取成功\n");
T->lc=CreateBiTree(fp);
T->rc=CreateBiTree(fp);
returnT;
}
}
else
returnNULL;
}
#include"my.h"
voidmain()
{
BiTreeT;
intchoice;
FILE*fp;
T=NULL;
fp=fopen("F:
\\family.txt","r");
insystem();
while
(1)
{
system("cls");
menu();
printf("请根据菜单进行选择所
system("pause");
break;
case4:
searchmenu();
printf(”请输入选择:
\n");
system("pause");break;
case5:
PreOrderTS(T);system("pause");break;
case6:
closefile();
case7:
printf("请输入需要查询第几代人:
");
count=0;
scanf("%d",&Nth);
ShowNth(T);
if(count==0)
printf("第%d代尚未有人。
\n",Nth);
system("pause");
break;
case8:
printf("请输入要查询人的姓名:
");
scanf("%s",searchname);
if(strcmp(T->name,searchname)==0)
{
printf("此人为家谱的祖先,其信息为:
\n");
printf("%-10s%-10s%-10s\n",T->name,T->birthday,T->address);
printf("他兄弟的信息为:
\n");
printf("%-10s%-10s%-10s%\n",T->lc->name,T->lc->birthday,T->lc->address);
temp=T->lc;
if(temp->rc)
{
printf("他孩子的信息为:
\n");
temp=temp->rc;
while(temp)
{printf("%-10s%-10s%-10s\n",temp->name,temp->birthday,temp->address);temp=temp->rc;
}
}
}
else
{
count=0;
SearchByName(T);
if(count==0)
printf(”对不起,不能检测这个人的信息\n");
}
system("pause");
break;
case9:
printf("请输入要查询人的生日:
");
count=0;
scanf("%s",searchdata);
SearchByBirthday(T);
if(count==0)
printf("%s没有人过生日。
\n",searchdata);
system("pause");
break;
default:
---\n");
printf("\n---输入错误
break;
}
printf("\n\n");
printf("按任意键继续!
");getch();
}
}
#include"my.h"voidinsystem(){
printf("\t\t1>建立家族关系(并保存)\n");
\n");
\n");
\n");
\n");
printf("\t\t2>添加家族成员
printf("\t\t3>删除家族成员
printf("\t\t4>查询家族成员
printf("\t\t5>显示家族关系
printf("\t\t6>退出系统\n");
printf("\t\t7>按姓名查询\n");
printf("\t\t8>按出生日期查询\n");
}
voidPrintlnfo(BiTreeT)
{
printf("%1Os%10s%10s\n",T->name,T->birthday,T->address);
}
voidPreOrderTS(BiTreeT)〃递归先序遍历(检查建树是否正确)
{
if(T)
{
PrintInfo(T);
PreOrderTS(T->lc);PreOrderTS(T->rc);
}
}
voidShowNth(BiTreeT)//显示第n代所有人的信息
{
if(T)
{
if(T->level==Nth)
{
PrintInfo(T);
count++;
}
ShowNth(T->lc);
ShowNth(T->rc);
}
}
voidclosefile()
{
printf("按任意键退出\n");
exit(0);
}