家谱管理系统数据结构大作业之欧阳科创编.docx

上传人:b****4 文档编号:24829409 上传时间:2023-06-01 格式:DOCX 页数:21 大小:18.52KB
下载 相关 举报
家谱管理系统数据结构大作业之欧阳科创编.docx_第1页
第1页 / 共21页
家谱管理系统数据结构大作业之欧阳科创编.docx_第2页
第2页 / 共21页
家谱管理系统数据结构大作业之欧阳科创编.docx_第3页
第3页 / 共21页
家谱管理系统数据结构大作业之欧阳科创编.docx_第4页
第4页 / 共21页
家谱管理系统数据结构大作业之欧阳科创编.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

家谱管理系统数据结构大作业之欧阳科创编.docx

《家谱管理系统数据结构大作业之欧阳科创编.docx》由会员分享,可在线阅读,更多相关《家谱管理系统数据结构大作业之欧阳科创编.docx(21页珍藏版)》请在冰豆网上搜索。

家谱管理系统数据结构大作业之欧阳科创编.docx

家谱管理系统数据结构大作业之欧阳科创编

/*家谱管理系统

时间:

2021.02.05

创作:

欧阳科

任务:

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

功能要求:

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;i

printf("\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(levo

printf("%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)

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 党团工作 > 其它

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1