当前位置首页 > 学术论文 > 毕业论文
搜柄,搜必应! 快速导航 | 使用教程  [会员中心]

家谱管理系统

文档格式:DOCX| 26 页|大小 133.37KB|积分 20|2022-10-09 发布|文档ID:159428854
第1页
下载文档到电脑,查找使用更方便 还剩页未读,继续阅读>>
1 / 26
此文档下载收益归作者所有 下载文档
  • 版权提示
  • 文本预览
  • 常见问题
  • 洛阳理工学院课程设计报告课程名称 数__据_结__构__课__程__设_计 设计题目 家__谱_管__理__系__统 专 业 计__算_机__科__学__与__技_术 班 级 B_1_5_0_4_0_5 学 号 B_1_5_0_8_0_8_2_2 姓 名 宋__士_龙 完成日期 2_0_1_6__年___1_2_月___3_0_日 课程设计任务书设计题目:家谱管理系统设计内容与要求:【问题描述】:实现具有下列功能的家谱管理系统1) .输入文件以存放最初家谱中各成员的信息,成员的信息中均应包含以下内容:姓名、出生日期、婚否、地址、健在否、死亡日期(若其已死亡) ,也可附加其它信息、但不是必需的2) .实现数据的存盘和读盘3) .显示家谱4) .按照出生日期查询成员名单5) .按照姓名查询,输出成员信息(包括其本人、父亲、孩子的信息) 6) .修改某成员信息基本要求】:界面要求:有合理的提示,每个功能可以设立菜单,根据提示,可以完成相关的功 能要求存储结构:学生自己根据系统功能要求自己设计,但是要求相关数据要存储在数据 文件中测试数据:要求使用1、全部合法数据;2、局部非法数据。

    进行程序测试,以保证 程序的稳定测试数据及测试结果请在上交的资料中写明指导教师: 年 月 日课程设计评语成绩:指导教师: 洛阳理工学院课程设计报告、算法思想本程序是一个管理家谱的系统,通过这个系统可以对家族成员进行创建、显示、查找 、修改、以及保存家谱和读取家谱功能该系统分为以下几个模块,分别是:创建家谱,显 示家谱、按姓名和生日查找家庭成员、修改家谱、存盘、读盘以及退出系统本程序用到的 存储形式为多叉树,因为家谱中每个人既有父母又有孩子,而且孩子的个数并不确定,所以 用多叉树来存储最为合适用多叉树来存储,就用用到多叉树的递归创建及递归遍历因为 是多叉树,所以遍历时用广度优先搜索合适本函数最主要的思想就是递归调用,每个子函 数中都会用到递归定义结构体时给定指针数组的最大容量,来规定家谱中最多可以存多少 人定义一个家族树的指针变量用来当每个子函数的参数,从而将其返回到主函数中以下时算法思想流程图:、模块划分1. int mai n():主函数2. void CreatTree(TreeNode *Tree)创建家族树3. void OutPutAII(TreeNode *Tree):显示家谱4. void Menue(TreeNode *Tree):主菜单5. void SubMenue1(TreeNode * Tree)副菜单(修改选项菜单)6. void Change(TreeNode * Tree)修改家谱7. TreeNode * SearchTree(TreeNode *Tree,char name[],int length)按照姓名查找家 谱成员8. TreeNode * SearchTree1(TreeNode *Tree,char birth[],int length)按照生日查找家 谱成员9. void OutPutMessage(TreeNode * Tree,char name[],int length)输出按姓名查找到 的家谱成员10. void OutPutMessage1(TreeNode * Tree,char birth[],int length):输出按生日查找 到的家谱成员11. void SaveFamily(TreeNode *root):保存家谱12. void ReadFamily(TreeNode **root):读取家谱三、数据结构typedef struct TreeNode{int ChildNum; //记录这个人拥有几个儿女char Name[20];〃记录这个人的姓名char birthday[20];〃 生日int marriage;//婚否(1表示结婚,0表示没结婚)int death;//生死(1表示活着,0表示过世)char Kind;//标示节点的种类有女 G男Bchar address[100];〃 住址char livemassage[50];〃死亡日期(如果其已经死亡)struct TreeNode *NextNode[20]; // 记录这个人的儿女struct TreeNode *Pare nt; //记录这个节点的父节点}TreeNode,*tree;四、测试第一组数据为:爷爷,奶奶,爸爸,妈妈,我,二叔,二婶,姐姐,三叔,三婶,弟弟一共 三代11个人。

    其中爷爷是根节点,奶奶为爷爷的配偶,同时也是爷爷的第一个后继节点 爸爸,二叔,三叔为爷爷的子女爸爸的配偶是妈妈,爸爸的子女是我二叔的 配偶是二婶,子女是姐姐三叔的的配偶是三婶,三叔的的子女是弟弟进入程序之后,首先进行创建家谱,然后进行存盘,之后进行修改和查询等 步骤退出程序在进入程序时,进行读盘之后在进行其他操作,程序完成之后 退出即可5图1家族树- □ X是否懂在【1-淫在.0-去世}: 0是否選在【1-達在.0-去世}: 0 是否強圧门-鰹圧・0-壬世〕:0 是否雯在(1-退在“ 0-去世}: 0是否惟在5-選在.0-去抵}: 1是否禮在(1-退在.0-去世}: 1是否惟在5-遵在.0-去世}: 1是善嚏在口僅在.俨去世H】是否傕在U-鰹在.0-去世}: 1眉善嚏在口雙在.0-去世h】是否憶击【1-淫在・0-去世}: 1是否惟在5-聲在.0-去世}: 1是否塔在[1-蜚在.o-去世}: 1 I第一组数据测试截图为:■ ! CA,U5eTs\fldimin\D«kTQp\licech5ng.rx^—-一 ***--一n*—一-*** *** *** *+*--一***--一一一-姓容:爷爷 出生日期:1944. 09. 20 姦庭住址:山东省苗诉市 性别:枣子姓弟:奶奶 展否傩冉逞冉"卜主世A 0更1个子女的姓名;爸爸 出生日期:19阪臨肺 竦肛時丘:山东省临诉市 性尊扭男 第E个子女的娃窑:二叔 出生日期:1970. 08. 05康庭世址:山东省临折市 性别E刿 痔$$子女的姓名;三叔出生日期-19?人盹,14吃寡锤住址:山东省味沂市性别E男—-甘耳*M十甘*— ■比甘■ —" ■*車#"・**卑・十甘* —■-甘甘■■—姓名:誉爸 出主日ffl; 1966.05. 0& 憲庭住址:山东卷曲沂市 性别;B男衰子 姓窑:妈妈 是否健在U-健在.0■去世h 1語1个子女的姓名;我 出生日期;1的& 10”餡 羸庭住址;山东省临沂市 性别B男_ _甘**口—*« " ■*好™电*卑・十曲*—■ m—也淖-—姓名:我 出生日期:1轴反1机昂 鼠露住址「山东省临折市 性别:bB至今没有配偶和子女 林常* —脚常—杠術_- 审林— *** 林*——H1尊*——姓茗:二扭 由生日期:MTO.QB.% 妄庭住址I山朿省■柿沂血 性别:日男妻子姓名;二婶 是否琏在□-健在.0■去世):1第1■+■子女的姓宕:姐姐 出生日期= 1991. 02. 14康庭住址:山东省临沂市 性别G女 W**-—啊席 ~_杠宰_~ **#— *** W** 林* 黔黑辭子/生日纵妄庭住址性孙肢 »** »* «* *« *=t* *** 3** «*—*« 姓容:三叔 出生臼期:1977. 02. 14\8 家庭住址:山东省临沂市 性别:E男妄子胖富:一.轉 是否傩右订佢在.卜去世h 1毎1个子女的姓名;第弟出生Sffi:200L &3.. 25冢啦件工:山东省临祈市性别E男 ***--一 丰 n *** *** 4** «*--一*** 张软拼音半:第总 出^13^:2001.03.25……姦霍住址:山帝省1話诉帀 性别:E更"W T'lBhU I I V JTT . xT1^ T® J y~^VJI I图2显示家谱G C^U5ers\jadminM>«ktop\kecheng.exe — □**********欢迎注用家族管匡集^E*t«******丄釉入家谱信息建立前 E:辎出垂个京谱信息 口長出三m期査我其人 D:按姓名査找.茶人 E:鴨改英今扎的信息 F;徉盘&芳盘 H;退出整平程序D请输入你要資找的人的蛀容: 弟弟 * * * * * • * * * « 您所要找的人己经找到信息如下所示:姓容:弟站岀生日期:M0L.O3.25隸庭注址:山东省■笞沂市 性捌:B男 是否惟在[1-锻在.0-去世):1母亲姓名:三殍愛亲姓名;三叔弟弟至今还宜百配偶和菖于图3按照姓名查找家族成员■ u C™\User5i\jsdmin\De5ktop\kechef>g.Me — □独*輯戦料*欢迎使用家族管理.泵统****5MfM*生A :输入感谱信息連宣榕B;祐出萤牛富谱倍息心後出土三期言我基人D:按姓老査找菜人E:時改某牛人拘信总F:存盘G;读盘出退出整个程序***** 眼存專谱 *****输入文件呂及尿存位匿{eg; E:\\Mampl«. txt): D;讥JIAF「txt 新現丈件成功.艾件歷茸務径为t D A\JIAPtr. txt图4存盘第二组数据为:图4王家家族树第二组数据测试截屏为:■ C :\Users\admin\De5ktop\kecheng.exe—甘半特__谓选揉你的蜿作__+«+— 4 * *-~~A!修 改牛人的信 ft * * # 申 • *~— *——*——*——B:舷 反婕母 虧 荷 息 —*——*——*—*—*——*——-—*—--? C:楼 改子女的信.B—* 瞎—*—*—―* — *-—*---*—D: Jg 出-*——*--一車——*—*—*—单 图5修改家族成员的信息洛阳理工学院课程设计报告rf C:\ysei3\admin\Desktop\kecheng.eKe ~ □ X ***** 请选择你的垠作**** -- 审一- 嘟 廉 A!修改个人箭信.息 * 4 *-- * 讯 一-* ■-•■=*==4*=-一:弦改父母的植,息土~一工三三=*一一*—*==二#B 一_-承_- * 书---C ;楼改子女的信患—*—芳一-*—*—-*—— 一一—一獻 D!退 出-* *—*—-一獻 * *—=*~* * 薜学改的强如仆訴就林9然后軽Z塚是否姜熔改性别:如果需荽菠轲入’1‘不幣要僅改捉辎;Cb烘后披Ent打键進经 0潸输入修改的出生日期:如果不需要閤改就输入黙后按E讥戢镇讎蛭 0蕾输入幡改的家庭砸址:如果不釉要侈陵就输入撤后按Ent«■锂錐逵 0亍人信息修改成功 请按Enter!«jffi建操作 I徹戟拼音半: 图6修改某个人的具体信息■ CAUl^\3di¥iu1i\[>^kVdpM£At I论小牛曲芒*4**K**44欢迎匣用家族管理系统**********土输入家谱佶息理立树&输出整金需谱信息□按出生日聊査找吏人D:按胖名査找某人E:德改桑个人的信息F:存盘G;读盘H:退出整亍甩产您所要找的人己经找到信息如下听示:妊容:王吐二出生日翩:2帕&竊腥住址:洛阳 性别曲男图7按照生日查找某人6洛阳理工学院课程设计报告24■ C ;\05ers'Madmin\De5ktopMtecheng.exe**********我迎便用家族普理系E7t*******^**E:爺岀整牛疙谱洁息C:按出生日期查找某人D:按姓容査找某人E:烁盘茅牛人的信总F:存吏:G:谟盘氐退出整牛程序***** 读慰家谱 *祕**救.人丈件容及其蹄径,以便从中读耽笨谱: 文件名喪瓦路径伽:D:\\mh«p1b. tit): E:\\JIA- tit图8读盘五、源程序#i nclude #i nclude #in elude #ifdef WIN32#define CLEAR system("cls")#define TipForSaveFilePosition printf("\t\t 输入文件名及保存位置 (eg: D:\W\example.txt):")#define TipForReadFilePosition printf("\t\t 文件名及其路径(eg: D:\W\example.txt):")#else#define CLEAR system("clear")#define TipForSaveFilePosition printf("\t\t 输入文件名及保存位置(eg: /home/xiong/example.txt): ")#define TipForReadFilePosition printf("\t\t 文件名及其路径(eg: /home/xiong/example.txt):")#en dif#define maxFileNameLen 50 //保存的文件名的最大长度int FLAG=0;int a=1;typedef struct TreeNode{int ChildNum; //记录这个人拥有几个儿女char Name[20];〃记录这个人的姓名char birthday[20];〃 生日int marriage;//婚否(1表示结婚,0表示没结婚)int death;//生死(1表示活着,0表示过世)char Kind;〃标示节点的种类有女 G男Bchar address[100];〃 住址char livemassage[50];〃死亡日期(如果其已经死亡)struct TreeNode *NextNode[20]; // 记录这个人的儿女struct TreeNode *Pare nt; //记录这个节点的父节点}TreeNode,*tree;void CreatTree(TreeNode *Tree);void OutPutAII(TreeNode *Tree);void Me nue(TreeNode *Tree);void SubMe nu e1(TreeNode * Tree);void SubMe nu e2(TreeNode *Tree);void Chan ge(TreeNode * Tree);void AddNew(TreeNode * Tree);TreeNode * SearchTree(TreeNode *Tree,char n ame[],i nt len gth);TreeNode * SearchTree1(TreeNode *Tree,char birth[],i nt len gth);void OutPutMessage(TreeNode * Tree,char n ame[],i nt len gth);void OutPutMessage1(TreeNode * Tree,char birth[],int length);void SaveFamily(TreeNode *root);void ReadFamily(TreeNode **root);int main()〃 主函数{TreeNode *Tree;//TreeNode **Tree1;//Tree仁&(*Tree);Tree=(TreeNode *)malloc(sizeof(TreeNode));Tree->Pare nt =NULL;strcpy(Tree->Name,"0");Menu e(Tree);return 0;}void Menue(TreeNode *Tree)// 输出主菜单{/*TreeNode **Tree1;Tree1= &Tree;*/char c;char n ame[20];char birth[20];while(1){system("cls");prin tf("\t");prin tf("\n\n\t\t********** 欢迎使用家族管理系统 ********** n\n");prin tf("\n\t\t A:输入家谱信息建立树 ”);prin tf("\n\t\tB:输出整个家谱信息");prin tf("\n\t\tC:按出生日期查找某人");prin tf("\n\t\tD:按姓名查找某人");prin tf("\n\t\tE:修改某个人的信息");prin tf("\n\t\tF:存盘 ");prin tf("\n\t\tG:读盘 ");prin tf("\n\t\t c=getchar(); switch(c){case 'A':H:退出整个程序\n\t")TreeNode * NewNode;NewNode=(TreeNode *)malloc(sizeof(TreeNode));printf("\n\t 请输入姓名:");sca nf("%s",Tree->Name);printf("\n\t请输入性别女G男B:");getchar();sca nf("%c", &(Tree->Ki nd));Tree->Pare nt=NewNode;Tree->Pare nt=NULL;〃CreatTree(Tree); //printf("\n\t 家谱图已经建立成功 \n\n");printf("\n\n\t 请按 Enter 键继续操作 ");getchar();break;case 'B':if(strcmp(Tree->Name,"0")==0){printf("\n\t家谱图的多叉树尚未建立请先建立树 \n");getchar();break;}printf("\n\n\t整个家谱的主要信息如下 :");OutPutAII(Tree);getchar();break;case C:if(strcmp(Tree->birthday,"O")==O){printf("\n\t家谱图的多叉树尚未建立请先建立树 \n");getchar();break;}printf("\n\t请输入你要查找的出生日期 :”);scan f("%s",birth);OutPutMessage1(SearchTree1(Tree,birth,20),birth,20); printf("\n\n\t-----*----*----*----*----*----*----*----*----*----*----\n\t"); getchar();break;case 'D':if(strcmp(Tree->Name,"O")==O){printf("\n\t家谱图的多叉树尚未建立请先建立树 \n”);getchar();break;}printf("\n\t请输入你要查找的人的姓名 :\n\t");sca nf("%s", name);OutPutMessage(SearchTree(Tree, name,20), name,20); printf("\n\n\t-----*----*----*----*----*----*----*----*----*----*----\n\t"); getchar();break;case 'E':if(strcmp(Tree->Name,"0")==0){printf("\n\t家谱图的多叉树尚未建立请先建立树 \n”);getchar();break;}Chan ge(Tree);getchar();break;case 'F':if(strcmp(Tree->Name,"0")==0){printf("\n\t家谱图的多叉树尚未建立请先建立树 \n”);getchar();break;}SaveFamily(Tree);getchar();break;case 'G':/*if(strcmp(Tree->Name,"O")==O){printf("\n\t家谱图的多叉树尚未建立请先建立树 \n”);getchar();break;}*/ReadFamily( &Tree); getchar();break;case 'H':printf("\n\n\t 本次服务到此结束--■"printf("\n\t ------ 欢迎下次使用 ");printf("\n\t 谢谢 ------\n\n");break;case '\n':break;default:printf("\n\n\t ---对不起!你的选择不在服务范围之内1 "printf("\n\t ---请您再次选择所需的服务项 ! -----");printf("\n\t getchar(); break; 谢谢 \n\t");}if (c=='H'||c=='f) break;getchar();}}void CreatTree(TreeNode *Node) // 创建树int i;TreeNode *NewNode;NewNode=(TreeNode *)malloc(sizeof(TreeNode));Node->NextNode[0]=NewNode;Node->NextNode[0]=NULL;printf("\n\t请输入出生日期:”);scan f("%s",Node->birthday);printf("\n\t 请输入家庭住址:");getchar();scan f("%s",Node->address);printf("\n\t请输入是否建在(1-是或0-否):”);scan f("%d", &(Node->death));if(Node->death==0){printf("\n\t请输入去世日期:”);sca nf("%s",Node->livemassage);}else if(Node->death=='1')printf("\n\t 仍然建在");printf("\n\t请输入%s的配偶的姓名(输入0代表没结婚):",Node->Name); scan f("%s",NewNode->Name);if(strcmp(NewNode->Name,"0")!=0){printf("\t请输入配偶的出生日期:");scan f("%s",NewNode->birthday);printf("\n\t 请输入家庭住址:”);getchar();scan f("%s",NewNode->address);printf("\n\t请输入是否建在(1-是或0-否):”);scan f("%d",&(NewNode->death));if(NewNode->death==0){printf("\n\t请输入去世日期:”);sca nf("%s",NewNode->livemassage);}else if(NewNode->death=='1')printf("\n\t 仍然建在");}printf("\n\t请输入%s的子女的数目(当子女输入 0时便停止输入该成员有关信息):",Node->Name);scan f("%d", &(Node->ChildNum));if((Node->ChildNum)==0&&strcmp(NewNode->Name,"0")==0)return ;if(Node->K in d=='G'||Node->Ki nd=='g')NewNode->Ki nd='B';elseNewNode->Ki nd='G';NewNode->ChildNum=0;NewNode->NextNode[0]=NULL;Node->NextNode[0]=NewNode;Node->NextNode[0]->Parent=Node;〃 孩子的父母for(i=1;i<=Node->ChildNum;i++){NewNode=(TreeNode *)malloc(sizeof(TreeNode));a++;printf("\n\t 请输入 %s 的第 %d 子女的名字:",Node->Name,i);sca nf("%s",NewNode->Name);printf("\n\t请输入%s的第%d子女的性别女 G男B:",Node->Name,i);getchar();sca nf("%c",&NewNode->Ki nd);NewNode->ChildNum=-1;NewNode->Pare nt=Node;Node->NextNode[i]=NewNode;CreatTree(Node->NextNode[i]); // 从子女的数目开始}}void OutPutAII(TreeNode *Tree){int i, flag=O;prin tf("\n\t--- **** *** *** *** *** *** *** *** *** ");printf("\n\t 姓名:%s 出生日期:%s 家庭住址:%s 性另 U: %c",Tree->Name,Tree->birthday,Tree->address,Tree->Ki nd);if (Tree->K in d=='G'||Tree->Ki nd=='g'){flag=1;printf(” 女");}elseprintf("男");printf("\t是否健在(1-健在,0-去世):");if(Tree->death==1) pri ntf("1");else if(Tree->death==0) pri ntf("0");if (!(Tree->NextNode[0])){printf("\n\t至今没有配偶和子女\n");return;}if(flag==1)printf("\n\t 丈夫姓名:%s",Tree->NextNode[0]->Name);elseprintf("\n\t 妻子姓名:%s",Tree->NextNode[0]->Name);printf("\t是否健在(1-健在,0-去世):");if(Tree->death==1) pri ntf("1");else if(Tree->death==0) pri ntf("0");for(i=1;i<=Tree->ChildNum;i++){printf("\n\t 第%d个子女的姓名:%s 出生日期:%s 家庭住址:%s 性别 %c",i,Tree->NextNode[i]->Name,Tree->NextNode[i]->birthday,Tree->NextNode[i]->address,Tre e->NextNode[i]->Ki nd);if (Tree->NextNode[i]->Ki nd=='G'||Tree->NextNode[i]->Ki nd=='g')printf("女");elseprintf("男");printf("\t是否健在(1-健在,0-去世):");if(Tree->death==1) prin tf("1");else if(Tree->death==0) prin tf("0");}prin tf("\n\t");for(i=1;i<=Tree->ChildNum;i++){OutPutAII(Tree->NextNode[i]);}TreeNode * SearchTree(TreeNode *Tree,char n ame[],i nt len gth){int i;TreeNode *NewNode;if(strcmp(Tree->Name, name)==0){if(le ngth==0)FLAG=1;elseFLAG=0;return Tree;}if(Tree->NextNode[0]==NULL)return NULL;for(i=0;i<=Tree->ChildNum;i++){if (i==0)NewNode=SearchTree(Tree->NextNode[i], name,0); elseNewNode=SearchTree(Tree->NextNode[i], name,20); if (NewNode!=NULL)return NewNode;}return NULL;}void OutPutMessage(TreeNode * Tree,char n ame[],i nt len gth){int flag=0,i;TreeNode *NewNode;if(Tree==NULL){printf("\n\n\t**** 该家谱图中没有%s这个人的信息请确认是否输入错误*****\n", name);return;}printf("\n\n\t您所要找的人已经找到信息如下所示 :");prin tf("\n\n\t 姓名 :%s 出生日期 :%s 家庭住址: %s 性另 U :%c", name,Tree->birthday,Tree->address,Tree->K in d);if (Tree->K in d=='G'||Tree->Ki nd=='g'){flag=1; II标记他(她)的性别printf("女");}elseprintf(” 男”);printf("\t是否健在(1-健在,0-去世):");if(Tree->death==1) pri ntf("1");else if(Tree->death==0) pri ntf("0");NewNode=Tree->Pare nt;if (FLAG==1){if(flag==1){printf("\n\n\t她是嫁入此家族的所以亲生父母信息不在家谱内包括 ");printf("\n\t 丈夫姓名:%s",NewNode->Name);}else{printf("\n\n\t他是入赘此家族的所以亲生父母信息不在家谱内包括 ");printf("\n\t 妻子姓名:%s",NewNode->Name);}if ((NewNode->ChildNum)>0) //判断他(她)是否有孩子{printf("\n\t的孩子的信息如下:");//输出他(她)的孩子的信息for(i=1;i<=NewNode->ChildNum;i++){printf("\n\t 姓名:%s 性别:",NewNode->NextNode[i]->Name);if (NewNode->NextNode[i]->Ki nd=='G'||NewNode->Ki nd=='g')printf("女");elseprintf("男");printf("\t是否健在(1-健在,0-去世):”);if(Tree->death==1) prin tf("1");else if(Tree->death==0) prin tf("0");}}return;}if(NewNode==NULL)〃判断它是不是根节点如果是的话就没有父母兄弟信息printf("\n\t是这个家谱图里最年长的人 ”,name);else{if (NewNode->Ki nd=='G'||NewNode->Ki nd=='g') // 判断父亲节点是父亲还是母亲{printf("\n\t母亲姓名:%s",NewNode->Name);〃输出他(她)的父母亲的信息 printf("\n\t 父亲姓名:%s",NewNode->NextNode[0]->Name);}else{printf("\n\t 母亲姓名:%s",NewNode->NextNode[0]->Name); printf("\n\t 父亲姓名:%s",NewNode->Name);}if(Tree->NextNode[0]!=NULL)// 判断他(她)是否有配偶{if(flag==1)//输出他(她)的配偶的信息printf("\n\t 丈夫姓名:%s",Tree->NextNode[0]->Name);elseprintf("\n\t 妻子姓名:%s",Tree->NextNode[0]->Name);if (Tree->ChildNum>0) //判断他(她)是否有孩子{printf("\n\t的孩子的信息如下:");//输出他(她)的孩子的信息 for(i=1;i<=Tree->ChildNum;i++){printf("\n\t 姓名:%s 性别:",Tree->NextNode[i]->Name); if (Tree->NextNode[i]->K in d=='G'||Tree->Ki nd=='g')printf("女");elseprintf("男");printf("\t是否健在(1-健在,0-去世):");if(Tree->death==1) prin tf("1");else if(Tree->death==0) prin tf("0");}}elseprintf("\n\t%s 至今还没有孩子",name);}elseprintf("\n\t%s至今还没有配偶和孩子 \n",Tree->Name);}}TreeNode * SearchTree1(TreeNode *Tree,char birth[],i nt len gth){int i;TreeNode *NewNode;if(strcmp(Tree->birthday,birth)==0){if(le ngth==O)FLAG=1;elseFLAG=0;return Tree;}if(Tree->NextNode[0]==NULL)return NULL;for(i=0;i<=Tree->ChildNum;i++){if (i==0)NewNode=SearchTree1(Tree->NextNode[i],birth,0); elseNewNode=SearchTree1(Tree->NextNode[i],birth,20); if (NewNode!=NULL)return NewNode;}return NULL;}void OutPutMessage1(TreeNode * Tree,char birth[],int length){int flag=0,i;TreeNode *NewNode;if(Tree==NULL){printf("\n\n\t****该家谱图中没有出生日期为 %s这个人的信息请确认是否输入错误*****\n",birth);return;}printf("\n\n\t您所要找的人已经找到信息如下所示 :");prin tf("\n\n\t 姓名 :%s 出生日期 :%s 家庭住址: %s 性另 U :%c",Tree->Name,Tree->birthday,Tree->address,Tree->K in d);if (Tree->K in d=='G'||Tree->Ki nd=='g'){flag=1; II标记他(她)的性别printf("女");}elseprintf("男");}void Change(TreeNode * Tree) II 修改某个人的信息{char n ame[20];TreeNode * NewNode;printf("\n\t请输入你要修改的人的姓名 :\n\t");sea nf("%s", name);NewNode=SearchTree(Tree, name,20);if(NewNode==NULL){printf("\n\n\t**** 该家谱图中没有%s这个人的信息请确认是否输入错误*****、n", name);return;}else{SubMe nu e1(NewNode);}}void SubMenue1(TreeNode * Tree) // 输出副菜单{char c;int flag,i;char n ame[20];char birth[20];char address1[50];char Pare nt[2][20];TreeNode * NewNode; getchar();while(1){");system("cls"); prin tf("\t"); prin tf("\n\n\t*****-- 请选择你的操作---****printf("\n\t---*---*---*---A:修改个人的信息****** ");printf("\n\t---*---*---*---B:修改父母的信息■****** ");printf("\n\t---*---*---*---C:修改子女的信息****** ");printf("\n\t---*---*---*---D:退出-*---*---*---*---*---*---*---*---*——\n\t");c=getchar();switch(c){case 'A': printf("\n\n\t请输入修改的姓名:如果不需要修改就输入‘ 0'然后按Enter键继续\n\t"); sca nf("%s", name);if(strcmp( name,"0")!=0)strcpy(Tree->Name, name);printf("\n\n\t是否要修改性别:如果需要就输入'1'不需要修改就输入'0'然后按Enter键 继续 \n\t");scan f("%d", &flag);if (flag==1){if(Tree->Ki nd=='G'||Tree->Ki nd=='g')Tree->Ki nd='B:else Tree->Ki nd='G:}printf("\n\n\t请输入修改的出生日期:如果不需要修改就输入’0'然后按Enter键继 续 \n\t");scan f("%s",birth);if(strcmp(birth,"0")!=0)strcpy(Tree->birthday,birth);printf("\n\n\t请输入修改的家庭地址:如果不需要修改就输入‘ 0'然后按Enter键继续 \n\t");scan f("%s",address1);if(strcmp(address1,"0")!=0)strcpy(Tree->address,address1);printf("\n\n\t个人信息修改成功 ");break;case 'B':if(Tree->Parent==NULL) //判断是不是头节点{printf("\n\t是这个家谱图里最顶端的人没有父母信息 !",name);break;}if (FLAG==1) //判断是不是入赘或加入此间的{if(Tree->K in d=='G'||Tree->Ki nd=='g'){printf("\n\n\t她是嫁入此间的所以父母信息不在家谱内包括 ”);}else{printf("\n\n\t他是入赘此间的所以父母信息不在家谱内包括 ”);}break;}if(Tree->Pare nt->K in d=='G'||Tree->Pare nt->Ki nd=='g'){strcpy(Parent[0],"母亲"); strcpy(Parent[1],"父亲");else{strcpy(Parent[O],"父亲”);strcpy(Parent[1],"母亲");}printf("\n\n\t请输入%s要修改的姓名:如果不需要修改就输入‘ 0'然后按Enter键继续\n\t",Pare nt[0]);sca nf("%s", name);if(strcmp( name,"0")!=0)strcpy(Tree->Pare nt->Name, name);printf("\n\n\t请输入%s要修改的姓名:如果不需要修改就输入‘ 0'然后按Enter键继续\n\t",Pare nt[1]);sca nf("%s", name);if(strcmp( name,"0")!=0)strcpy(Tree->Pare nt->NextNode[0]->Name ,n ame);printf("\n\n\t 父母的信息修改成功 ");break;case C:if(Tree->ChildNum==0){printf("\n\n\t至今还没有子女”);break;}if (Tree->Parent !=NULL)if (strcmp(Tree->Name,Tree->Pare nt->NextNode[0]->Name)==0)〃 如果他是入赘或者是嫁入的就需用配偶节点完成修改{Tree=Tree->Pare nt;}for(i=1;i<=Tree->ChildNum;i++){printf("\n\n\t请输入%s修改的姓名:如果不需要修改就输入‘ 0'然后按Enter 键继续 \n\t",Tree->NextNode[i]->Name);sca nf("%s", name);if(strcmp( name,"0")!=0)strcpy(Tree->NextNode[i]->Name, name);printf("\n\n\t是否要修改性别:如果需要就输入'1'不需要修改就输入’0'然后按Enter键继续\n\t");scan f("%d", &flag);if (flag==1){if(Tree->NextNode[i]->Ki nd=='G'||Tree->NextNode[i]->Ki nd=='g')Tree->NextNode[i]->Ki nd='B';else Tree->NextNode[i]->Ki nd='G';}}printf("\n\n\t 子女的信息修改成功 ”);break;case 'D':printf("\n\n\t 本项服务到此结束 ");break;case '\n':break;default:printf("\n\n\t 对不起!你的选择不在服务范围之内 ! ");printf("\n\t 请您再次选择所需的服务项 ! ");printf("\n\t 谢谢合作! \n\t");break;}if (c=='D'||c=='d')break;printf("\n\n\t 请按 Enter 键继续操作 ");getchar();getchar();}}void SaveFamily(TreeNode *root)〃 保存家谱至指定文件{char saveFileName[maxFileNameLe n];FILE* fp;TreeNode *queue[50], *head;int i, front, rear;//队列的头指针,尾指针printf(” ***** 保存家谱 *****\n\n");〃if(root==NULL)if(root == NULL){printf("\t\t家谱中无成员,无法保存! \n");return;}TipForSaveFilePosition;〃文件及其绝对路径格式scan f("%s", saveFileName);,原内容将被覆getchar();fp = fope n( saveFileName, "w");〃 不存在则新建。

    存在,则从文件起始位置写if(fp == NULL){printf("\t\t新建文件失败! \n"); return ;}elseprintf("\t\t新建文件成功,文件及其路径为: %s\n", saveFileName);/*利用宽度优先搜索遍历家族多叉树 */fwrite(root, sizeof(TreeNode), 1, fp); // 将根结点存入文件(二进制形式) front = rear = 0;//初始化空队queue[rear++] = root;// 根结点进队while(front != rear)// 队列不为空{head = queue[front++];〃 队头元素出队if (head->NextNode[0] != NULL){fwrite(head->NextNode[0], sizeof(TreeNode), 1, fp);}for(i=1; i<=head->ChildNum; i++){fwri。

    点击阅读更多内容
    卖家[上传人]:桂梅
    资质:实名认证