家谱管理系统 数据结构大作业规程指导.docx
《家谱管理系统 数据结构大作业规程指导.docx》由会员分享,可在线阅读,更多相关《家谱管理系统 数据结构大作业规程指导.docx(28页珍藏版)》请在冰豆网上搜索。
家谱管理系统数据结构大作业规程指导
/*家谱管理系统
任务:
实现具有下列功能的家谱管理系统
功能要求:
1).输入文件以存放最初家谱中各成员的信息,成员的信息中均应包含以下内容:
姓名、出生日期、婚否、地址、健在否、死亡日期(若其已死亡),也可附加其它信息、但不是必需的。
2).实现数据的存盘和读盘。
3).以图形方式显示家谱。
4).显示第n代所有人的信息。
5).按照姓名查询,输出成员信息(包括其本人、父亲、孩子的信息)。
6).按照出生日期查询成员名单。
7).输入两人姓名,确定其关系。
8).某成员添加孩子。
9).删除某成员(若其还有后代,则一并删除)。
10).修改某成员信息。
11).按出生日期对家谱中所有人排序。
12).打开一家谱时,提示当天生日的健在成员。
要求:
建立至少30个成员的数据,以较为直观的方式显示结果,并提供文稿形式以便检查。
界面要求:
有合理的提示,每个功能可以设立菜单,根据提示,可以完成相关的功能要求。
存储结构:
学生自己根据系统功能要求自己设计,但是要求相关数据要存储在数据文件中。
测试数据:
要求使用1、全部合法数据;2、局部非法数据。
进行程序测试,以保证程序的稳定。
测试数据及测试结果请在上交的资料中写明;
*/
#include
#include
#include
#include
#include"map.h"
#defineMAXN100
#defineMAXMEM100
#defineElemtypechar
==============================
//树
typedefstructBiTNode
{
intmark;//标记
intlevel;
charname[50];//姓名
charbirthday[50];//生日
charaddress[MAXN];//住址
boolmarriage;//婚否(true表示结婚,false表示没结婚)
boollive;//建在(true表示活着,false表示过世)
boolsex;//性别(true表示男,false表示女)
charlivemassage[50];//死亡日期(如果其已经死亡)
Elemtypedata;//
structBiTNode*lc,*rc;
}BiTNode,*BiTree;
//树的相关操作
charnametemp[50];//姓名
charbirthdaytemp[50];//生日
charaddresstemp[MAXN];//住址
boolmarriagetemp;//婚否(true表示结婚,false表示没结婚)
boollivetemp;//建在(true表示或者,false表示过世)
boolsextemp;
charlivemassagetemp[MAXN];//死亡日期(如果其已经死亡)
charch;//额外使用
intleveltemp;//人的代数
intNth;//显示第n代人时要用
charsearchdata[50];
charsearchname[50];
intcount;//计数
intchoice;//各种选择
intuse;
BiTreetemp;
structBiTNodeList
{
BiTreedata;
BiTNodeList*next;
};
BiTNodeList*List;
//-----------
voidCreatBiTree(BiTree&T,FILE*in)//建立双链二叉树
{
fscanf(in,"%c",&ch);
//printf("%c\n",ch);
if(ch=='@')
{
T=NULL;
fscanf(in,"%c",&ch);
}
else
{
T=(BiTree)malloc(sizeof(BiTNode));
//fscanf(in,"%s%s%s%d%d",nametemp,birthdaytemp,addresstemp,&marriagetemp,&livetemp);
fscanf(in,"%s",nametemp);
strcpy(T->name,nametemp);
fscanf(in,"%s",birthdaytemp);
strcpy(T->birthday,birthdaytemp);
fscanf(in,"%s",addresstemp);
strcpy(T->address,addresstemp);
fscanf(in,"%d%d%d%d",&marriagetemp,&livetemp,&leveltemp,&sextemp);
T->marriage=marriagetemp;
T->live=livetemp;
T->level=leveltemp;
T->sex=sextemp;
//printf("%s%s%s%d%d\n",nametemp,birthdaytemp,addresstemp,marriagetemp,livetemp);
if(!
livetemp)
{
fscanf(in,"%s",livemassagetemp);
//printf("%s\n",livemassagetemp);
}
if(!
T->live)
strcpy(T->livemassage,livemassagetemp);
fscanf(in,"%c",&ch);
CreatBiTree(T->lc,in);
CreatBiTree(T->rc,in);
}
}
voidPrintInfo(BiTreeT)
{
printf("%-10s出生于:
%-10s%-10s",T->name,T->birthday,T->address);
if(T->marriage)
printf("\t已婚");
if(!
T->marriage)
printf("\t未婚");
if(T->sex)
printf("\t男");
if(!
T->sex)
printf("\t女");
if(T->live)
printf("\t健在\n");
if(!
T->live)
printf("\t去世于:
%s\n",T->livemassage);
}
voidPreOrderTraverse_recursion(BiTreeT)//递归先序遍历(检查建树是否正确)
{
//printf("PreOrderTraverse_recursion\n");
if(T)
{
/*printf("%-10s出生于:
%-10s%-10s",T->name,T->birthday,T->address);
if(T->marriage)
printf("\t已婚");
if(!
T->marriage)
printf("\t未婚");
if(T->sex)
printf("\t男");
if(!
T->sex)
printf("\t女");
if(T->live)
printf("\t健在\n");
if(!
T->live)
printf("\t去世于:
%s\n",T->livemassage);*/
PrintInfo(T);
PreOrderTraverse_recursion(T->lc);
PreOrderTraverse_recursion(T->rc);
}
}
voidShowFamilyTree(BiTreeT)//以图形的方式显示家谱
{
inti,lev;
BiTreep;
p=T;
if(T)
{
lev=T->level;
for(i=0;iprintf("\t");
printf("%-5s",p->name);
if(p->lc)
{
p=T->lc;
printf("★*★%5s%\n",p->name);
if(p->rc)
{
p=p->rc;
ShowFamilyTree(p);
}
}
else
printf("(未婚)\n");
}
if(T->rc)
{
p=T->rc;
ShowFamilyTree(p);
}
}
voidShowNth(BiTreeT)//显示第n代所有人的信息
{
if(T)
{
if(T->level==Nth)
{
PrintInfo(T);
//printf("%-10s%-10s%-10s%5d%5d%5d\n",T->name,T->birthday,T->address,T->marriage,T->live,T->sex);
count++;
}
ShowNth(T->lc);
ShowNth(T->rc);
}
}
voidSearchByName(BiTreeT)//按照姓名查询,输出成员信息(包括其本人、父亲、孩子的信息)。
不能查询祖先信息
{
if(T)
{
if(T->lc)
{
if(T->lc->rc)
{
temp=T->lc->rc;
while(temp)
{
if(strcmp(temp->name,searchname)==0)
{
count++;
printf("\n此人的信息为:
\n");
PrintInfo(temp);
//printf("%-10s%-10s%-10s%5d%5d%5d\n\n",temp->name,temp->birthday,temp->address,temp->marriage,temp->live,temp->sex);
printf("此人父母的信息为:
\n");
PrintInfo(T);
PrintInfo(T->lc);
//printf("%-10s%-10s%-10s%5d%5d%5d\n",T->name,T->birthday,T->address,T->marriage,T->live,T->sex);
//printf("%-10s%-10s%-10s%5d%5d%5d\n\n",T->lc->name,T->lc->birthday,T->lc->address,T->lc->marriage,T->lc->live,T->lc->sex);
if(!
temp->livemassage)
printf("此人还没有妻室\n");
else
{
printf("此人妻子的信息为:
\n");
PrintInfo(temp->lc);
//printf("%-10s%-10s%-10s%5d%5d%5d\n\n",temp->lc->name,temp->lc->birthday,temp->lc->address,temp->lc->marriage,temp->lc->live,temp->lc->sex);
if(temp->lc->rc)
{
printf("此人孩子的信息为:
\n");
temp=temp->lc->rc;
while(temp)
{
PrintInfo(temp);
//printf("%-10s%-10s%-10s%5d%5d%5d\n",temp->name,temp->birthday,temp->address,temp->marriage,temp->live,temp->sex);
temp=temp->rc;
}
}
}
return;
}
else
temp=temp->rc;
}
}
}
SearchByName(T->lc);
SearchByName(T->rc);
}
}
voidSearchByBirthday(BiTreeT)//按照出生日期查询成员名单
{
if(T)
{
if(strcmp(T->birthday,searchdata)==0)
{
PrintInfo(T);
//printf("%-10s%-10s%-10s%5d%5d%5d\n",T->name,T->birthday,T->address,T->marriage,T->live,T->sex);
count++;
}
SearchByBirthday(T->lc);
SearchByBirthday(T->rc);
}
}
voidAddChild(BiTree&T)//某成员添加孩子
{
if(T)
{
if(strcmp(T->name,searchname)==0)
{
count++;
if(!
T->lc)
{
printf("该成员还没有结婚,不能添加孩子\n");
return;
}
if(!
T->sex)
{
printf("不能为该家谱中的女性添加孩子\n");
return;
}
else
{
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);
printf("请输入添加孩子的婚姻状况0/1(0表示未婚,1表示已婚)\n");
scanf("%d",&temp->marriage);
printf("请输入添加孩子的在世情况0/1(0表示去世,1表示在世)\n");
scanf("%d",&temp->live);
if(!
temp->live)
{
printf("请输入添加孩子的去世时间(格式形如:
2010-1-1)\n");
scanf("%s",temp->livemassage);
}
printf("请输入添加孩子的性别0/1(0表示女,1表示男)\n");
scanf("%d",&temp->sex);
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);
}
}
voidAddWife(BiTree&T)//某成员添加妻子
{
if(T)
{
if(strcmp(T->name,searchname)==0)
{
count++;
if(T->lc)
{
printf("该成员已有妻子,可以通过修改的方式替换该妻子\n");
return;
}
else
{
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);
printf("请输入添加妻子的婚姻状况0/1(0表示未婚,1表示已婚)\n");
scanf("%d",&temp->marriage);
printf("请输入添加妻子的在世情况(0表示去世,1表示在世)\n");
scanf("%d",&temp->live);
if(!
temp->live)
{
printf("请输入添加妻子的去世时间(格式形如:
2010-1-1)\n");
scanf("%s",temp->livemassage);
}
printf("请输入添加妻子的性别0/1(0表示女,1表示男)\n");
scanf("%d",&temp->sex);
temp->level=T->level;
temp->lc=NULL;
temp->rc=NULL;
T->lc=temp;
T->marriage=true;
printf("妻子添加成功\n");
return;
}
}
AddWife(T->lc);
AddWife(T->rc);
}
}
voidDeleteByName(BiTree&T)//删除某成员(若其还有后代,则一并删除)
{
//printf("PreOrderTraverse_recursion\n");
if(T)
{
if(strcmp(T->name,searchname)==0)
{
count++;
T=NULL;
return;
}
//printf("%-10s%-10s%-10s%5d%5d%5d\n",T->name,T->birthday,T->address,T->marriage,T->live,T->sex);
DeleteByName(T->lc);
DeleteByName(T->rc);
}
}
voidFixLevel(BiTreeT)
{
if(T)
{
if(strcmp(T->name,searchname)==0)
{
count=T->level;
}
FixLevel(T->lc);
FixLevel(T->rc);
}
}
voidFixRelation(BiTreeT)//输入两人姓名,确定其关系
{
intlevo,levt;
charlevone[50],levtwo[50];
printf("请输入第一个人的姓名\n");
scanf("%s",searchname);
strcpy(levone,searchname);
FixLevel(T);
levo=count;
if(levo==-1)
{
printf("家谱无此人,请从新进入\n");
return;
}
printf("请输入第二个人的姓名\n");
scanf("%s",searchname);
strcpy(levtwo,searchname);
FixLevel(T);
levt=count;
if(levt==-1)
{
printf("家谱无此人\n");
return;
}
if(levoprintf("%s比%s大%d辈\n",levone,levtwo,levt-levo);
elseif(levo>levt)
printf("%s比%s大%d辈\n",levtwo,levone,levo-levt);
elseif(levo==levt)
printf("%s和%s平辈\n",levone,levtwo);
}
voidShowAmend()
{
printf("1.修改姓名\n");
printf("2.修改出生年月\n");
printf("3.修改家庭住址\n");
printf("4.修改婚姻状况\n");
printf("5.修改在世情况\n");
printf("6.修改性别\n");
printf("7.返回上一级\n");
printf("请输入选项(1-7):
");
}
voidDoAmend(BiTree&T)
{
while
(1)
{
system("cls");
ShowAmend();
scanf("%d",&choice);
switch(choice)
{
case1:
printf("请输入修改后的姓名:
");
scanf("%s",T->name);
break;
case2:
printf("请输入修改后的出生年月:
");
scanf("%s",T->birthday);
break;
case3:
printf("请输入修改后的住址:
");
scanf("%s",T->address);
break;
case4:
printf("请输入修改后的婚姻状况:
");
scanf("%d",&T->marriage);
break;
case5:
printf("请输入修改后的在世情况:
");
scanf("%d",&T->live);
if(!
T->live)
{
printf("请输入本人的过世时间:
");
scanf("%s",T->livemassage);
}
break;
case6:
printf("请输入修改后的性别(1表示男,0表示女):
");
scanf("%d",&T->sex);
case7:
return;
default:
printf("输入非法,请重新输入\n");
break;
}
}
}
voidAmendInfo(BiTree&T)//修改某成员信息。
{
if(T)
{
if(strcmp(T->name,searchname)==0)
{
count++;
DoAmend(T);
return;
}
AmendInfo(T->lc);
AmendInfo(T->rc);
}
}
voidSequence(BiTreeT)//按出生日期对家谱中所有人排序。
{
if(T)
{
BiTNodeList*temp;
BiTNodeList*p;
temp=(BiTNodeList*)malloc(sizeof(BiTNodeList));
temp->data=T;
//p=List;
//while(p->)
for(p=List;(p->next!
=NULL)&&(strcmp(p->next->data->bir