《家谱管理系统数据结构大作业2.pdf》由会员分享,可在线阅读,更多相关《家谱管理系统数据结构大作业2.pdf(18页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、./*家谱管理系统任务:实现具有下列功能的家谱管理系统功能要求:1).输入文件以存放最初家谱中各成员的信息,成员的信息中均应包含以下内容:姓名、出生日期、婚否、地址、健在否、死亡日期(若其已死亡),也可附加其它信息、但不是必需的。2).实现数据的存盘和读盘。3).以图形方式显示家谱。4).显示第 n 代所有人的信息。5).按照姓名查询,输出成员信息(包括其本人、父亲、孩子的信息)6).按照出生日期查询成员名单。7).输入两人姓名,确定其关系。8).某成员添加孩子。9).删除某成员(若其还有后代,则一并删除)10).修改某成员信息。11).按出生日期对家谱中所有人排序。12).打开一家谱时,提示
2、当天生日的健在成员。要求:建立至少 30 个成员的数据,以较为直观的方式显示结果,并提供文稿形式以便检查。界面要求:有合理的提示,每个功能可以设立菜单,根据提示,可以完成相关的功能要求。存储结构:学生自己根据系统功能要求自己设计,但是要求相关数据要存储在数据文件中。测试数据:要求使用稳定。测试数据及测试结果请在上交的资料中写明;*/#include#include#include#include#includemap.h#define MAXN 100#define MAXMEM 100#define Elemtype char=/树typedef struct BiTNodeint mark
3、;/标记int level;char name50;/姓名char birthday50;/生日char addressMAXN;/住址1、全部合法数据;2、局部非法数据。进行程序测试,以保证程序的。.bool marriage;/婚否(true 表示结婚,false 表示没结婚)bool live;/建在(true 表示活着,false 表示过世)bool sex;/性别(true 表示男,false 表示女)char livemassage50;/死亡日期(如果其已经死亡)Elemtype data;/struct BiTNode*lc,*rc;BiTNode,*BiTree;/树的相关操
4、作char nametemp50;/姓名char birthdaytemp50;/生日char addresstempMAXN;/住址bool marriagetemp;/婚否(true 表示结婚,false 表示没结婚)bool livetemp;/建在(true 表示或者,false 表示过世)bool sextemp;char livemassagetempMAXN;/死亡日期(如果其已经死亡)char ch;/额外使用int leveltemp;/人的代数int Nth;/显示第 n 代人时要用char searchdata50;char searchname50;int count;
5、/计数int choice;/各种选择int use;BiTree temp;struct BiTNodeListBiTree data;BiTNodeList*next;BiTNodeList*List;/-void CreatBiTree(BiTree&T,FILE*in)/建立双链二叉树fscanf(in,%c,&ch);/printf(%cn,ch);if(ch=).T=NULL;fscanf(in,%c,&ch);elseT=(BiTree)malloc(sizeof(BiTNode);/fscanf(in,%s%s%s%d%d,nametemp,birthdaytemp,addre
6、sstemp,&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-
7、level=leveltemp;T-sex=sextemp;/printf(%smp);if(!livetemp)fscanf(in,%s,livemassagetemp);/printf(%sn,livemassagetemp);if(!T-live)strcpy(T-livemassage,livemassagetemp);fscanf(in,%c,&ch);CreatBiTree(T-lc,in);CreatBiTree(T-rc,in);void PrintInfo(BiTree T)printf(%-10s 出生于:%-10s%-10s,T-name,T-birthday,T-add
8、ress);if(T-marriage)printf(t已婚);if(!T-marriage)printf(t未婚);if(T-sex)%s%s%d%dn,nametemp,birthdaytemp,addresstemp,marriagetemp,livete.printf(t男);if(!T-sex)printf(t女);if(T-live)printf(t健在n);if(!T-live)printf(t去世于:%sn,T-livemassage);void PreOrderTraverse_recursion(BiTree T)/递归先序遍历(检查建树是否正确)/printf(PreOr
9、derTraverse_recursionn);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去世于:%sn,T-livemassage);*/PrintInfo(T);PreOrderTraverse_recursion(T-lc);PreOrd
10、erTraverse_recursion(T-rc);void ShowFamilyTree(BiTree T)/以图形的方式显示家谱int i,lev;BiTree p;p=T;if(T)lev=T-level;for(i=0;iname);if(p-lc)p=T-lc;printf(%5s%n,p-name);if(p-rc)p=p-rc;ShowFamilyTree(p);elseprintf(if(T-rc)p=T-rc;ShowFamilyTree(p);void ShowNth(BiTree T)/显示第 n 代所有人的信息if(T)if(T-level=Nth)PrintInfo
11、(T);/printf(%-10s%-10s%-10s%5d%5d%5dn,T-name,T-birthday,T-address,T-marriage,T-live,T-sex);count+;ShowNth(T-lc);ShowNth(T-rc);void SearchByName(BiTree T)/按照姓名查询,输出成员信息(包括其本人、父亲、孩子的信息)。不能查询祖先信息if(T)(未婚)n);.if(T-lc)if(T-lc-rc)temp=T-lc-rc;while(temp)if(strcmp(temp-name,searchname)=0)count+;printf(n此人的
12、信息为:n);PrintInfo(temp);/printf(%-10s%-10s%-10s%5d%5d%5dnn,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%5dn,T-name,T-birthday,T-address,T-marriage,T-live,T-sex);/printf(%-10s%-10s%-10s%5d%5d%5dnn,T
13、-lc-name,T-lc-birthday,T-lc-address,T-lc-marriage,T-lc-live,T-lc-sex);if(!temp-livemassage)printf(此人还没有妻室n);elseprintf(此人妻子的信息为:n);PrintInfo(temp-lc);/printf(%-10s%-10s%-10s%5d%5d%5dnn,temp-lc-name,temp-lc-birthday,temp-lc-address,temp-lc-marriage,temp-lc-live,temp-lc-sex);if(temp-lc-rc)printf(此人孩子的
14、信息为:n);temp=temp-lc-rc;while(temp)PrintInfo(temp);/printf(%-10s%-10s%-10s%5d%5d%5dn,temp-name,temp-birthday,temp-address,temp-marriage,temp-live,temp-sex);.temp=temp-rc;return;elsetemp=temp-rc;SearchByName(T-lc);SearchByName(T-rc);void SearchByBirthday(BiTree T)/按照出生日期查询成员名单if(T)if(strcmp(T-birthday
15、,searchdata)=0)PrintInfo(T);/printf(%-10s%-10s%-10s%5d%5d%5dn,T-name,T-birthday,T-address,T-marriage,T-live,T-sex);count+;SearchByBirthday(T-lc);SearchByBirthday(T-rc);void AddChild(BiTree&T)/某成员添加孩子if(T)if(strcmp(T-name,searchname)=0)count+;if(!T-lc).printf(该成员还没有结婚,不能添加孩子return;if(!T-sex)printf(不能
16、为该家谱中的女性添加孩子return;elsetemp=(BiTree)malloc(sizeof(BiTNode);printf(请输入添加孩子的姓名n);scanf(%s,temp-name);printf(请输入添加孩子的出生年月scanf(%s,temp-birthday);printf(请输入添加孩子的家庭住址scanf(%s,temp-address);printf(请输入添加孩子的婚姻状况scanf(%d,&temp-marriage);printf(请输入添加孩子的在世情况scanf(%d,&temp-live);if(!temp-live)printf(请输入添加孩子的去世时
17、间scanf(%s,temp-livemassage);printf(请输入添加孩子的性别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);void AddWife(BiTree&T)/某成员添加妻子if(T)n);n);n);(格式形如:2010-1-1)n);0/1(0 表示未婚,1 表示已婚)n);0/1(0 表示去世,1 表示在世)n);(格式形如:2010-1-1)
18、n);0/1(0 表示女,1 表示男)n);.if(strcmp(T-name,searchname)=0)count+;if(T-lc)printf(该成员已有妻子,可以通过修改的方式替换该妻子return;elsetemp=(BiTree)malloc(sizeof(BiTNode);printf(请输入添加妻子的姓名n);scanf(%s,temp-name);printf(请输入添加妻子的出生年月scanf(%s,temp-birthday);printf(请输入添加妻子的家庭住址scanf(%s,temp-address);printf(请输入添加妻子的婚姻状况scanf(%d,&t
19、emp-marriage);printf(请输入添加妻子的在世情况scanf(%d,&temp-live);if(!temp-live)printf(请输入添加妻子的去世时间scanf(%s,temp-livemassage);printf(请输入添加妻子的性别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);void DeleteByName(BiTree&T)
20、/删除某成员(若其还有后代,则一并删除)0/1(0 表示女,1 表示男)n);(格式形如:2010-1-1)n);(0 表示去世,1 表示在世)n);0/1(0 表示未婚,1 表示已婚)n);n);(格式形如:2010-1-1)n);n);./printf(PreOrderTraverse_recursionn);if(T)if(strcmp(T-name,searchname)=0)count+;T=NULL;return;/printf(%-10s%-10s%-10s%5d%5d%5dn,T-name,T-birthday,T-address,T-marriage,T-live,T-sex
21、);DeleteByName(T-lc);DeleteByName(T-rc);void FixLevel(BiTree T)if(T)if(strcmp(T-name,searchname)=0)count=T-level;FixLevel(T-lc);FixLevel(T-rc);void FixRelation(BiTree T)/输入两人姓名,确定其关系int levo,levt;char levone50,levtwo50;printf(请输入第一个人的姓名n);scanf(%s,searchname);strcpy(levone,searchname);FixLevel(T);le
22、vo=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(levo levt)printf(%s比%s 大%d 辈 n,levtwo,levone,levo-levt);else if(levo=levt)printf(%s和%s 平辈n,levone,levtwo);void ShowAmend()pr
23、intf(1.修改姓名 n);printf(2.修改出生年月 n);printf(3.修改家庭住址 n);printf(4.修改婚姻状况 n);printf(5.修改在世情况 n);printf(6.修改性别 n);printf(7.返回上一级 n);printf(请输入选项(1-7):);void DoAmend(BiTree&T)while(1)system(cls);ShowAmend();scanf(%d,&choice);switch(choice)case 1:printf(请输入修改后的姓名:);scanf(%s,T-name);break;.case 2:printf(请输入修
24、改后的出生年月:);scanf(%s,T-birthday);break;case 3:printf(请输入修改后的住址:);scanf(%s,T-address);break;case 4:printf(请输入修改后的婚姻状况:);scanf(%d,&T-marriage);break;case 5:printf(请输入修改后的在世情况:);scanf(%d,&T-live);if(!T-live)printf(请输入本人的过世时间:);scanf(%s,T-livemassage);break;case 6:printf(请输入修改后的性别(1 表示男,scanf(%d,&T-sex);c
25、ase 7:return;default:printf(输入非法,请重新输入n);break;void AmendInfo(BiTree&T)/修改某成员信息。if(T)if(strcmp(T-name,searchname)=0)count+;DoAmend(T);return;AmendInfo(T-lc);.0 表示女):);.AmendInfo(T-rc);void Sequence(BiTree T)/按出生日期对家谱中所有人排序。if(T)BiTNodeList*temp;BiTNodeList*p;temp=(BiTNodeList*)malloc(sizeof(BiTNodeL
26、ist);temp-data=T;/p=List;/while(p-)for(p=List;(p-next!=NULL)&(strcmp(p-next-data-birthday,temp-data-birthday)next);temp-next=p-next;p-next=temp;Sequence(T-lc);Sequence(T-rc);void PrintSequence(BiTree T)BiTNodeList*p;p=List;Sequence(T);printf(ttttPrintLine();printf(n);while(p-next!=NULL)printf();Prin
27、tInfo(p-next-data);/printf(t%-10s%-10s%-10s%5d%5d%5dn,p-next-data-name,p-next-data-birthday,p-next-data-address,p-next-data-marriage,p-next-data-live,p-next-data-sex);p=p-next;printf(n);PrintLine();排序结果 nn);.void LocateTime()time_t t=time(0);strftime(birthdaytemp,64,%Y-%m-%d,localtime(&t);void Birth
28、Today(BiTree T)/打开一家谱时,提示当天生日的健在成员。if(T)if(strcmp(T-birthday,birthdaytemp)=0)count+;printf(%sn,T-name);BirthToday(T-lc);BirthToday(T-rc);void ShowMenu()PrintBat();printf(n);PrintLine();printf(n);printf(tttprintf(printf(printf(printf(printf(printf(printf(n);PrintLine();printf(n);printf(int main(void)
29、int choice;FILE*in;in=fopen(7.out,r);已经从文件读入初始家谱信息,请输入您的操作(1-12):);欢迎进入家谱管理系统nn);1.显示今天生日成员3.显示第 n 代所有人的信息5.按出生日期查找成员7.为成员添加妻子9.修改成员信息11.按出生年月排序家谱成员2.显示家谱 n);4.按姓名查找成员n);6.为成员添加孩子n);8.删除成员 n);10.确定两个人的关系n);12.退出程序 n);.BiTree T;CreatBiTree(T,in);/PreOrderTraverse_recursion(T);while(1)system(cls);Show
30、Menu();scanf(%d,&choice);getchar();system(cls);switch(choice)case 1:LocateTime();count=0;BirthToday(T);if(count=0)printf(今天家谱中没有成员过生日system(pause);break;case 2:ShowFamilyTree(T);system(pause);break;case 3:printf(请输入需要查询第几代人:);count=0;scanf(%d,&Nth);ShowNth(T);if(count=0)printf(第%d 代尚未有人。n,Nth);syste
31、m(pause);break;case 4:printf(请输入要查询人的姓名:);scanf(%s,searchname);if(strcmp(T-name,searchname)=0)printf(此人为家谱的祖先,其信息为:n);printf(%-10s%-10s%-10s%5d%5d%5dn,T-name,T-birthday,T-address,T-marriage,T-live,T-sex);printf(他妻子的信息为:n);n);.printf(%-10s%-10s%-10s%5d%5d%5dn,T-lc-name,T-lc-birthday,T-lc-address,T-lc
32、-marriage,T-lc-live,T-lc-sex);temp=T-lc;if(temp-rc)printf(他孩子的信息为:n);temp=temp-rc;while(temp)printf(%-10s%-10s%-10s%5d%5d%5dn,temp-name,temp-birthday,temp-address,temp-marriage,temp-live,temp-sex);temp=temp-rc;elsecount=0;SearchByName(T);if(count=0)printf(对不起,不能检测这个人的信息system(pause);break;case 5:pri
33、ntf(请输入要查询人的生日:);count=0;scanf(%s,searchdata);SearchByBirthday(T);if(count=0)printf(%s没有人过生日。n,searchdata);system(pause);break;case 6:count=0;printf(请输入要添加孩子成员的姓名scanf(%s,searchname);AddChild(T);if(count=0)printf(没有这个人 n);system(pause);break;case 7:);n);.count=0;printf(请输入要添加妻子成员的姓名scanf(%s,searchna
34、me);AddWife(T);if(count=0)printf(没有这个人 n);system(pause);break;case 8:count=0;printf(请输入要删除成员的姓名:);scanf(%s,searchname);DeleteByName(T);if(count=0)printf(没有这个人 n);system(pause);break;case 9:count=0;printf(请输入要修改人的姓名:);scanf(%s,searchname);AmendInfo(T);if(count=0)printf(没有这个人 n);system(pause);break;case 10:FixRelation(T);system(pause);break;case 11:count=0;List=(BiTNodeList*)(malloc(sizeof(BiTNodeList);List-next=NULL;PrintSequence(T);system(pause);break;case 12:return;system(pause);break;default:printf(输入数据有误,请重新输入break;n);:);.