家谱管理系统 -数据结构大作业_第1页
家谱管理系统 -数据结构大作业_第2页
家谱管理系统 -数据结构大作业_第3页
家谱管理系统 -数据结构大作业_第4页
家谱管理系统 -数据结构大作业_第5页
已阅读5页,还剩29页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

/*家谱管理系统

任务:实现具有下列功能的家谱管理系统

功能要求:

1).输入文件以存放最初家谱中各成员的信息,成员的信息中均应包含以

下内容:

姓名、诞生日期、婚否、地址、健在否、死亡日期(若其已死亡),也可

附加其它信息、但不是必需的。

2).实现数据的存盘和读盘。

3).以图形方式显示家谱。

4).显示第n代全部人的信息。

5).依据姓名查询,输出成员信息(包括其本人、父亲、孩子的信息)。

6).依据诞生日期查询成员名单。

7).输入两人姓名,确定其关系。

8).某成员添加孩子。

9).删除某成员(若其还有后代,则一并删除)。

10).修改某成员信息。

11).按诞生日期对家谱中全部人排序。

12).打开一家谱时,提示当天生日的健在成员。

要求:建立至少30个成员的数据,以较为直观的方式显示结果,并供应

文稿形式以便检查。

界面要求:有合理的提示,每个功能可以设立菜单,依据提示,可以完成

相关的功能要求。

存储结构:学生自己依据系统功能要求自己设计,但是要求相关数据要存

储在数据文件中。

测试数据:要求运用1、全部合法数据;2、局部非法数据。进行程序测

试,以保证程序的稳定。

测试数据与测试结果请在上交的资料中写明;

*/

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

#include<time.h>

#include"map.h"

#defineMAXN100

#defineMAXMEM100

#defineElemtypechar

〃树

typedefstructBiTNode

{

intmark;//标记

intlevel;

charname[50];//姓名

charbirthday[50];//生日

charaddress[MAXN];//fttil:

boolmarriage;//蜡否(true表示结婚,false表示没结婚)

boollive;〃建在(true表示活着,false表示过世)

boolsex;//性别(tme表示男,false表示女)

charlivemassage[50];//死亡日期(假如其已经死亡)

Elemtypedata;//

structBiTNode*lc,*rc;

}BiTNode,*BiTree;

//树的相关操作

charnametemp[50];〃姓名

charbirthdaytemp[50];//生日

charaddresstemp[MAXN];//住址

boolmarriagetemp;//婚否(true表示结婚,fa:se表示没结婚)

boollivetemp;〃建在(true表示或者,false表示过世)

boolsextemp;

charlivemassagetemp[MAXN];//5EC日期(假如其已经死亡)

charch;//额外运用

intleveltemp;//人的代数

intNth;〃显示第n代人时要用

charsearchdata[50];

charsearchname[50];

else

T=(BiTree)malloc(sizeof(BiTNode));

//fscanf(in,"%s%s%s%d%d",nametemp,birthdaytemp,addresste

mp,&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,&s

extemp);

T->marriage=marriagetemp;

T->live=livetemp;

T->level=leveltemp;

T->sex=sextemp;

//printf("%s%s%s%d%d\n",nametemp,birthdaytemp,ad

dresstemp,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);

voidPrintlnfofBiTreeT)

(

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(、健在\n”);

if(!T->live)

printf("\t去世于:%s\rT,T->livemassage);

}

voidPreOrderTraverse_recursion(BiTreeT)//递归先序遍历(检查建

树是否正确)

{

//printf("PreOrderTraverse_recursion\n");

if(T)

{

/*printf("%-10s诞生

zf:%-10s%-10s",T->nanie,T->birthday,T->address);

if(T->marriage)

printf("\t已婚叱

if(!T->marriage)

printf(、未婚叱

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);*/

Printlnfo(T);

PreOrderTraverse_recursion(T->lc);

PreOrderTraverse_recursion(T->rc);

voidShowFamilyTreefBiTreeT)〃以图形的方式显示家谱

inti,lev;

BiTreep;

P=T;

if(T)

{

lev=T->level;

for(i=0;i<lev;i++)

printf("\t");

printf("%-5s',p->name);

if(p->lc)

|

p=T->lc;

printfO*★%5s%\n",p->name);

if(p->rc)

{

p=p->rc;

ShowFamilyTree(p);

}

}

else

printff1味婚)\n”);

}

if(T->rc)

{

p=T->rc;

ShowFamilyTree(p);

voidShowNth(BiTreeT)//显示第n代全部人的信息

if(T)

if(T->level==Nth)

{

PrintlnfoiT);

//printff"%-1Os%-1Os%-10s%5d%5d%5d\n",T->name,T->birthd

ay,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);

Printlnfo(temp);

//printf("%-10s%-10s%-10s%5d%5d%5d\n\n",temp->name,tem

p->birthday,temp->address,temp->marriage,temp->live,temp->se

x);

printf(”此人父母的信息为:\n");

Printlnfo(T);

PrintInfo(T->lc);

//printf("%-1Os%-1Os%-10s%5d%5d%5d\n",T->name,T->birthd

ay,T->address,T->marriage,T->live,T->sex);

//printf("%-10s%-10s%-10s%5d%5d%5d\n\n",T->lc->name,T->l

c->birthday,T->lc->address,T->lc->marriage,T->lc->live,T->lc->se

x);

if(!temp->livemassage)

printf(”此人还没有妻室\n”);

else

{

printf("此人妻子的信息为:\n");

Printlnfo(temp->lc);

//printff'%-1Os%-1Os%-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)

(

Printlnfo(temp);

//printff'%-1Os%-1Os%-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)

Printlnfo(T);

//printf("%-10s%-10s%-10s%5d%5d%5d\n",T->name,T->birthd

ay,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)

{

prints该成员还没有结婚,不能添加孩子\n”);

return;

}

if(!T->sex)

{

printf(”不能为该家谱中的女性添加孩子\n”);

return;

}

else

{

temp=(BiTree)malloc(sizeof(BiTNode));

printf(”请输入添加孩子的姓名\n");

scan:("%sM,temp->name);

printf(”请输入添加孩子的诞生年月(格式形如:

2010-l-l)\n");

scani("%s",temp->birthday);

printf(”请输入添加孩子的家庭住址\n”);

scan:("%sn,temp->address);

printf(”请输入添加孩子的婚姻状况0/1(0表示未婚,

1表示已婚)\n”);

scan:("%d",&temp->marriage);

printf(”请输入添加孩子的在世状况0/1(0表示去世,

1表示在世世口");

scanf("%d",&temp->live);

if(!temp->live)

printf(”请输入添加孩子的去世时间(格式形如:

2010-l-l)\n");

scanf("%s",temp->livemassage);

printf(”请输入添加孩子的性别0/1(0表示女,1表示

男)\n");

scanf("%d",&temp->sex);

temp->level=T->level+l;

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”);

scani("%sM,temp->name);

printf(”请输入添加妻子的诞生年月(格式形如:

2010-l-l)\n");

scani("%s",temp->birthday);

printf(”请输入添加妻子的家庭住址\n”);

scan:("%sM,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-l-l)\n");

scanf("%s",temp->livemassage);

printf(”请输入添加妻子的性别0/1(0表示女,1表示

男八n”);

scani("%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->birthd

ay,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);

strcpyflevone,searchname);

FixLevel(T);

levo=count;

if(levo==-1)

{

printf("家谱无此人,请从新进入\n");

return;

}

printf("请输入其次个人的姓名\n");

scanf("%s",searchname);

strcpyflevtwo,searchname);

FixLevel(T);

levt=count;

if(levt==-1)

(

printf("家谱无此人\n”);

return;

}

if(levo<levt)

printf("%s比%s大%d\n",1evone,1evtwo,1evt-1evo);

elseif(levo>levt)

printf("%s比%s大%d^\n",levtwo,levone,levo-levt);

elseif(levo==levt)

printf("%s和%sJf|g\n",levone,levtwo);

}

voidShowAmendO

{

printf”,修改姓名\n”);

printf(”2.修改诞生年月\n”);

printf(”3.修改家庭住址\n”);

printf(”4.修改婚姻状况\n”);

printf("5.修改在世状况\n”);

printf(”6.修改性别性”);

printf".返回上一级\rT);

printf(”请输入选项(1・7):");

)

voidDoAmend(BiTree&T)

{

while(l)

{

systemf'cls");

ShowAmendO;

scanf("%d",&choice);

switch(choice)

case1:

printf(“请输入修改后的姓名:”);

scanf("%s',,T->name);

break;

case2:

printf(”请输入修改后的诞生年月:");

scanf("%sM,T->birthday);

break;

case3:

printf(”请输入修改后的住址:");

scanf("%sM,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表示男,。表示女):");

scani("%d",&T->sex);

case7:

return;

default:

printf("输入非法,请重新输入\n”);

break;

voidAmendInfo(BiTree&T)〃修改某成员信息。

{

if⑴

if(strcmp(T->name,searchname)==0)

count++;

DoAmend(T);

return;

}

AmendInfo(T->lc);

AmendInfo(T->rc);

}

}

voidSequence(BiTreeT)〃按诞生日期对家谱中全部人排序。

(

if(T)

{

BiTNodeListxtemp;

BiTNodeList*p;

temp=(BiTNodeList*)malloc(sizeof(BiTNodeList));

temp->data=T;

//P=List;

//while(p->)

for(p=List;

(p->next!=NULL)&&(strcmp(p->next->data->birthday,temp->data

->birthday)<0);p=p->next);

temp->next=p->next;

p->next=temp;

Sequence(T->lc);

Sequence(T->rc);

)

voidPrintSequence(BiTreeT)

{

BiTNodeL运t*p;

p=List;

Sequence(T);

printf(”\t\t\t\t排序结果\n\rT);

PrintLineQ;

printf("\n");

while(p->next!=NULL)

{

printff"");

Printlnfo(p->next->data);

//printff'\t%-1Os%-10s%-10s%5d%5d%5d\n",p->next->data->n

ame,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");

PrintLineQ;

}

voidLocateTimeQ

{

time_tt=time(O);

strftime(birthdaytemp,64,"%Y-%m-%d",localtime(&t));

voidBirthToday(BiTreeT)〃打开一家谱时,提示当天生日的健在成员。

(

if(T)

{

if(strcmp(T->birthday,birthdaytemp)==0)

(

count++;

printf("%s\n",T->name);

}

BirthToday(T->lc);

BirthToday(T->rc);

voidShowMenuf)

PrintBatO;

printf("\n");

PrintLineQ;

printf("\n");

printf(”\t\t\t欢迎进入家谱管理系统\n\n”);

printf("1.显示今日生日成员2.显示家谱

\n");

printf("3.显示第n代全部人的信息4.按姓名查

找成员\n”);

printf("5.按诞生日期查找成员6.为成员添加

孩子\n”);

printf("7.为成员添加妻子8.删除成员

\n");

printff"9.修改成员信息10.确定两个

人的关系\n”);

printff'11.按诞生年月排序家谱成员12.退出程序

\n");

printf("\n");

PrintLineQ;

printfCAn");

printfl"已经从文件读入初始家谱信息,请输入您的操作(1-12):

”);

}

intmain(void)

{

intchoice;

FILE*in;

in=fopen("7.out","r");

BiTreeT;

CreatBiTree(T,in);

//PreOrderTraverse_recursion(T);

whilefl)

{

systemf'cls");

ShowMenuf);

scanf("%d",&choice);

getchar();

systemf'cls");

switch(choice)

case1:

LocateTimeQ;

count=0;

BirthTodayfT);

if(count==0)

printf("今日家谱中没有成员过生日\n");

systemf'pause");

break;

case2:

ShowFamilyTree(T);

systemf'pause");

break;

case3:

printf(”请输入须要查询第几代人:”);

count=0;

scanz("%d",&Nth);

ShowNth(T);

iffcount==0)

printf("第%d代尚未有人。\n",Nth);

systemf'pause");

break;

case4:

printf(”请输入要查询人的姓名:");

scanfC^s',,searchname);

if(strcmp(T->name,searchname)==0)

{

printf(”此人为家谱的祖先淇信息为:\n");

printff'%-1Os%-1Os%-10s%5d%5d%5d\n",T->name,T->birthday,

T->address,T->marriage,T->live,T->sex);

printf(”他妻子的信息为:\n”);

printff'%-10s%-10s%-10s%5d%5d%5d\n",T->lc->name,T->lc->bi

rthday,T->lc->address,T->lc->marriage,T->lc->live,T->lc->sex);

temp=T->lc;

if(temp->rc)

(

printf("他孩子的信息为:'n");

temp=temp->rc;

while(temp)

{

printf("%-lOs%-1Os%-10s%5d%5d%5d\n",temp->name,temp->bi

rthday,te

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论