收藏 分销(赏)

家谱标准管理系统数据结构大作业.doc

上传人:丰**** 文档编号:3024619 上传时间:2024-06-13 格式:DOC 页数:27 大小:62.04KB 下载积分:10 金币
下载 相关 举报
家谱标准管理系统数据结构大作业.doc_第1页
第1页 / 共27页
家谱标准管理系统数据结构大作业.doc_第2页
第2页 / 共27页


点击查看更多>>
资源描述
/* 家谱管理系统 任务:实现含有下列功效家谱管理系统 功效要求: 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" #define MAXN 100 #define MAXMEM 100 #define Elemtype char ============================== //树 typedef struct BiTNode { int mark;//标识 int level; char name[50];//姓名 char birthday[50];//生日 char address[MAXN];//住址 bool marriage;//婚否(true表示结婚,false表示没结婚) bool live;//建在(true表示活着,false表示过世) bool sex;//性别(true表示男,false表示女) char livemassage[50];//死亡日期(假如其已经死亡) Elemtype data;// struct BiTNode *lc,*rc; }BiTNode,*BiTree; //树相关操作 char nametemp[50];//姓名 char birthdaytemp[50];//生日 char addresstemp[MAXN];//住址 bool marriagetemp;//婚否(true表示结婚,false表示没结婚) bool livetemp;//建在(true表示或,false表示过世) bool sextemp; char livemassagetemp[MAXN];//死亡日期(假如其已经死亡) char ch;//额外使用 int leveltemp;//人代数 int Nth;//显示第n代人时要用 char searchdata[50]; char searchname[50]; int count;//计数 int choice;//多种选择 int use; BiTree temp; struct BiTNodeList { BiTree data; BiTNodeList *next; }; BiTNodeList *List; //----------- void CreatBiTree(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); } } void PrintInfo(BiTree 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); } void PreOrderTraverse_recursion(BiTree T)//递归 先序遍历(检验建树是否正确) { //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); } } void ShowFamilyTree(BiTree T)//以图形方法显示家谱 { int i,lev; BiTree p; 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; printf("★*★ %5s%\n",p->name); if(p->rc) { p = p->rc; ShowFamilyTree(p); } } else printf(" (未婚)\n"); } if(T->rc) { p = T->rc; ShowFamilyTree(p); } } void ShowNth(BiTree T)//显示第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); } } void SearchByName(BiTree T)//根据姓名查询,输出组员信息(包含其本人、父亲、孩子信息)。不能查询祖先信息 { 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); } } void SearchByBirthday(BiTree T)//根据出生日期查询组员名单 { 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); } } void AddChild(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("请输入添加孩子出生年月(格式形如: -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("请输入添加孩子逝世时间(格式形如: -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); } } void AddWife(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("请输入添加妻子出生年月(格式形如: -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("请输入添加妻子逝世时间(格式形如: -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); } } void DeleteByName(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); } } 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 levone[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 < levt) printf("%s 比 %s 大 %d 辈\n",levone,levtwo,levt-levo); else if(levo > levt) printf("%s 比 %s 大 %d 辈\n",levtwo,levone,levo-levt); else if(levo == levt) printf("%s 和 %s 平辈\n",levone,levtwo); } void ShowAmend() { printf("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("请输入修改后出生年月: "); 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表示男,0表示女): "); scanf("%d",&T->sex); case 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); AmendInfo(T->rc); } } void Sequence(BiTree T)//按出生日期对家谱中全部些人排序。 { 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->birthday,temp->data->birthday)<0); p=p->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("\t\t\t\t排序结果\n\n"); PrintLine(); printf("\n"); while(p->next != NULL) { printf(" "); PrintInfo(p->next->data); //printf("\t%-10s%-10s%-10s%5d%5d%5d\n",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(); } void LocateTime() { time_t t=time(0); strftime(birthdaytemp,64,"%Y-%m-%d",localtime(&t)); } void BirthToday(BiTree T)//打开一家谱时,提醒当日生日健在组员。 { if(T) { if(strcmp(T->birthday,birthdaytemp) == 0) { count++; printf("%s\n",T->name); } BirthToday(T->lc); BirthToday(T->rc); } } void ShowMenu() { PrintBat(); printf("\n"); PrintLine(); printf("\n"); printf("\t\t\t欢迎进入家谱管理系统\n\n"); printf(" 1.显示今天生日组员 2.显示家谱\n")
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服