家谱管理系统含源代码
家谱系统

《数据结构的课程设计》报告题目:家谱管理系统设计与实现班级:1612401学号:*********姓名:***指导老师:**完成日期:2014.1.3目录一.需求分析.二.程序主要功能.三.程序运行平台.四.程序类说明.五.运行分析六.存在的不足与对策.七.体验感悟八.程序源代码.需求分析实现具有下列功能的家谱管理系统。
程序主要功能(1)输入文件以存放最初家谱中各成员的信息,成员的信息中均应包含以下内容:姓名、出生日期、婚否、地址、健在否、死亡日期(若其已死亡),也可附加其它信息、但不是必需的。
(2)实现数据的存盘和读盘。
(3)以图形方式显示家谱。
(4)显示第n 代所有人的信息。
(5)按照姓名查询,输出成员信息(包括其本人、父亲、孩子的信息)。
(6)按照出生日期查询成员名单。
(7)输入两人姓名,确定其关系。
(8)某成员添加孩子。
(9)删除某成员(若其还有后代,则一并删除)。
(10)修改某成员信息。
(11)按出生日期对家谱中所有人排序。
(12)打开一家谱时,提示当天生日的健在成员。
(13)要求建立至少30个成员的数据,以较为直观的方式显示结果,并提供文稿形式以便检查。
(14)界面要求:有合理的提示,每个功能可以设立菜单,根据提示,可以完成相关的功能要求。
(15)存储结构:根据系统功能要求自行设计,但是要求相关数据要存储在数据文件中。
测试数据:要求使用1、全部合法数据;2、局部非法数据。
进行程序测试,以保证程序的稳定。
程序运行平台该程序是用VC++6.0制做的,使用Microsoft Visual C++ 6.0运行该程序,具体操作是:打开Microsoft Visual C++ 6.0,菜单栏里点文件→打开工作区→找到“图书管理系统.dsw”这个文件→打开,或者在资源管理器中双击该文件,此时,VC++6.0会自动打开,并载入该系统相关资源,点击Run命令菜单或者或用快捷键Ctrl+F5运行该程序。
家谱管理系统的源代码

#include〈iostream。
h> #include〈string。
h>#include〈fstream.h〉#include〈stdlib。
h〉struct per{int data;char name[20];char brith[20];char marry;char address[20];char live;char dietime[20]; char parent[20];int generation;int child[10];int numberchild;per(){for(int i=0;i〈20;i++)name[i]=’\0';for(i=0;i<20;i++)brith[i]=’\0';for(i=0;i<20;i++)address[i]='\0';for(i=0;i<20;i++)dietime[i]=’\0';for(i=0;i〈10;i++)child[i]=0;for(i=0;i〈20;i++)parent[i]='\0';live='\0’;marry=’\0’;data=—10;generation=0;numberchild=0;}};void setupinfo(per person[]);void display(per person[],int&);void displayhome(per person[],int&);void displayinfo(per person[],int&);void namesearch(per person[],int&);void birtfdaysearch(per person[],int&);void addchild(per person[],int&);void editmember(per person[],int&);void sortbirthday(per person[],int&);void main(){per person[36];int count=0;fstream inputFile(”person。
数据结构家谱管理系统

数据结构家谱管理系统公司内部档案编码:[OPPTR-OPPT28-OPPTL98-OPPNN08]宁波大红鹰学院信息工程学院课程设计报告项目名称:家谱查询系统项目组长:白钰琦项目成员:徐程凯、徐海域、项鸿伟班级名称:10计科1班专业名称:计算机科学与技术完成时间: 2012年12月1日信息工程学院制目录一、案例描述...................................................1、总体描述................................................2、模块描述................................................二、设计思路...................................................三、程序设计...................................................1、数据结构描述............................................2、主函数及其流程图........................................3、源程序..................................................四、调试与分析.................................................1、主菜单..................................................2、显示家谱信息............................................3、显示家谱中第n代人所有信息..............................4、按姓名查找某人并相应输出................................5、按出生日期查找家谱成员信息..............................6、为家谱中成员添加孩子信息................................7、为家谱中成员添加妻子信息................................8、删除家谱中成员及其后代信息..............................9、修改家谱中成员信息......................................10、确定家谱中两个成员关系.................................11、按出生年月排序家谱.....................................五、设计总结...................................................1、完成情况................................................2、心得体会................................................一、案例描述1、总体描述家谱管理系统是查询家谱信息必不可少的一部分,利用家谱管理系统可以清楚的查询到家族成员的详细信息。
数据结构_家谱管理系统方案

宁波大红鹰学院信息工程学院课程设计报项目名称:家谱查询系统项目组长:白钰琦项目成员:徐程凯、徐海域、项鸿伟班级名称:10计科1班专业名称:计算机科学与技术完成时间:2012年12月1日信息工程学院制一、..................................... 案例描述-3 -1总体描述............................. -3 -2、模块描述........................... -4 -二、..................................... 设计思路-5 -三、..................................... 程序设计-5 -1、数据结构描述......................... -5 -2、主函数及其流程图...................... -6 -3、源程序........................... -7 -四、...................................... 调试与分析-7 -1、主菜单............................ -12 -2、显示家谱信息......................... -13 -3、显示家谱中第n代人所有信息................. -13 -4、按姓名查找某人并相应输出................... -13 -5、按出生日期查找家谱成员信息......... 错误!未定义书签。
6、为家谱中成员添加孩子信息.................. -14 -7、为家谱中成员添加妻子信息............ 错误!未定义书签。
8删除家谱中成员及其后代信息............ 错误!未定义书签。
9、修改家谱中成员信息......................................... -15 ................................................................................... -10、确定家谱中两个成员关系 ........... 错误!未定义书签。
数据结构课程设计论文及代码—家谱系统的设计与实现

项目名称:家谱系统的设计与实现学生姓名:学号:班级:指导教师:2011年12月23日目录1系统需求分析 (1)1.1问题分析 (1)1.2任务意义 (1)2 设数据结构设计及用法说明 (2)3 详细设计和编码 (3)3.1初始化 (3)3.2功能选择 (4)3.3信息输入 (7)3.4信息输出 (7)3.5信息存盘 (8)3.6信息清盘 (9)3.7信息查询 (10)4 实验结果 (13)4.1菜单函数功能测试 (13)4.2输入功能函数测试 (13)4.3输出功能函数测试 (13)4.4清盘功能函数测试 (13)4.5存盘功能函数测试 (14)4.6查询功能函数测试 (15)致谢 (17)参考文献 (18)附录:源代码 (19)武汉长江工商学院-1系统需求分析1.1 问题分析从课程设计的题目要求可以知道,我需要设计一个对数据输入,输出,储存,查找的多功能软件,我选择用二叉树来保存家族的基本信息,包括姓名及它们的关系,但是由于家族信息很巨大而且关系很复杂所以采用二叉树来储存它们的信息及输出它们的关系。
并且具有保存文件的功能,以便下次直接使用先前存入的信息。
1.2 任务意义家谱的功能是查询家族每个人的信息,并且输出它们的信息,还要具有查询输出功能。
这样复习了一下查询。
插入。
删除函数的应用。
并复习了上学期c语言的文件储存及调用功能,子函数和递归调用功能,熟练运用这些函数。
2系统数据结构设计及用法说明采用文件保存信息,并且从文件中输出原先保存的信息,用结构体fnode来储存家族的信息,采用递归的方法从fam中创建一个空二叉树,然后初始化二叉树。
采用InputFam函数添加信息,OutputFam函数输出信息,DelAll函数删除家族的全部记录,SaveFile函数保存添加的信息,FindNode函数查找节点。
图2 数据存储结构图相应的存储结构代码为:typedef struct fnode{char father[NAMEWIDTH];char wife[NAMEWIDTH];char son[NAMEWIDTH];char brother[NAMEWIDTH];}FamType;typedef struct tnode{char name[NAMEWIDTH];struct tnode *lchild,*rchild;}BTree;3 详细设计和编码3.1初始化图3-1为初始化函数的流程图,主要是对二叉树中数据域置空,对二叉树中的数据进行初始化。
(完整word版)数据结构家谱图代码

//main.cpp# include <stdio.h># include <string.h># include <stdlib.h># include <conio.h># include <windows.h># include "Head.h"void main(){HANDLE consolehwnd;//字体颜色的改变consolehwnd = GetStdHandle(STD_OUTPUT_HANDLE);//字体颜色的改变int chose,i;BinTree T;T=NULL;while(1){SetConsoleTextAttribute(consolehwnd,FOREGROUND_INTENSITY+FOREGROUND_RED);//字体颜色的改变printf("***************家谱信息功能表*************\n");SetConsoleTextAttribute(consolehwnd,FOREGROUND_INTENSITY+FOREGROUND_BLUE|F OREGROUND_GREEN);printf("1:新建一个根节点\n");printf("2:以添加成员节点构造家谱图\n");printf("3:家谱树的层次显示\n");printf("4家谱树保存到文件!\n");printf("5:家谱树读入文件!\n");printf(":家谱信息的删除\n");printf("6:结束程序\n");SetConsoleTextAttribute(consolehwnd,FOREGROUND_INTENSITY+FOREGROUND_RED);//字体颜色的改变printf("************按以上功能表进行操作*************\n");SetConsoleTextAttribute(consolehwnd,FOREGROUND_INTENSITY+FOREGROUND_BLUE+F OREGROUND_GREEN+FOREGROUND_RED);for(i=1;i<=100;){printf("请输入你在功能表上的选项:") ;scanf("%d",&chose);if(1<=chose<=11)break;elseprintf("你输入的选项不正确,请重新输入!\n");}switch(chose){case 1:system("cls"); //在控制台程序使用清屏函数InPut(T); //录入个人信息printf("按任意键返回"); //等待程序system("pause");system("cls");break;case 2:system("cls");Addchild(T); //比较兄弟岁数后再添加system("pause");system("cls");break;case 3:system("cls");LevelOutput(T);system("pause");system("cls");break;case 4:system("cls");KCreatTree(T); //将家谱信息保存到文件中system("pause");system("cls");break;case 5:system("cls");LCreateTree(T); //从文件中读出家谱成员的信息system("pause");system("cls");break;case 6:system("cls");exit(0);system("pause");system("cls");break;default:fflush(stdin);printf("你输入的选项不正确!\n");printf("请从新输入菜单的选项!\n");system("pause");system("cls");}}}//Head.h# include <stdio.h># include <string.h># include <stdlib.h># include <conio.h># include <windows.h># define QUEUESIZE 100typedef struct Data //出生日期结构体{int day;int month;int year;}dataly;typedef struct BiTNode //个人资料信息{char live[15]; //建在(T表示活着,F表示过世)char name[20]; //姓名char sex[15]; //性别char marriage[15]; //是否已婚(Y为已婚,N为未婚)char birthadd[20]; //出生地char address[15]; //家庭地址char profession[20]; //职业char fathername[20]; //父亲姓名int generation; //辈分int message; //接点孩子的个数int hight; //升高int age; //年龄dataly birthday; //出生日期dataly dieday; //死亡日期(如果其已经死亡)struct BiTNode *brother; //兄弟struct BiTNode *child; //孩子struct BiTNode *parent; //父母}BiTNode,*BinTree;typedef BinTree QElemType;/*typedef struct{int front;int rear;QElemType elem[QUEUESIZE];}SqQueue;*/typedef struct QNode{QElemType data;struct QNode *next;}QNode,*QueuePtr;typedef struct{QueuePtr front,rear;}LinkQueue;int JudgeTime(BinTree);int Comepare(BinTree);void InPut(BinTree &T);BinTree LevelFind(BinTree &T,BinTree a);void CreatfTree(BinTree &T);void Addchild(BinTree &T);void OutPut(BinTree T);void LevelOutput(BinTree T);void PreOrderD(BinTree T);void KCreatTree(BinTree &s);void KeepTTFile(BinTree T,FILE *fp);void PrinfTree(BinTree p,FILE *fp);void LAddchild(BinTree &T,LinkQueue &S,FILE *fp);void LCreateTree(BinTree &T);//function.cpp# include "Head.h"//********************************************************* //********************************************************* void InitQueue(LinkQueue &Q){if(!(Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode)))){exit(0);}Q.front->next=NULL;return;}int QueueEmpty(LinkQueue Q){return(Q.front->next==NULL);}int GetHead(LinkQueue Q,QElemType &e){if(Q.front==Q.rear){return 0;}e=Q.front->next->data;return 1;}void EnQueue(LinkQueue &Q,QElemType e){QueuePtr p;if(!(p=(QueuePtr)malloc(sizeof(QNode)))) {exit(0);}p->data=e;p->next=NULL;Q.rear->next=p;Q.rear=p;return;}int DeQueue(LinkQueue &Q,QElemType &e){QueuePtr p;if(Q.front==Q.rear)return 0;p=Q.front->next;e=p->data;Q.front->next=p->next;if(Q.rear==p)Q.rear=Q.front;free(p);return 1;}void QueueTraverse(LinkQueue Q){QueuePtr p;p=Q.front->next;while(p){printf("%d",p->data);p=p->next;}printf("\n");return;}//**************************************************************************** //**************************************************************************** int JudgeTime(BinTree p) //判断输入的出生日期是否正确{if(p->birthday.year>2013||p->birthday.year<=0){printf("你输入的年份错误,请重新输入!\n");return 0;}if(12<p->birthday.month||p->birthday.month<1){printf("你输入的年份错误,请重新输入!\n");return 0;}if(p->birthday.month==1||p->birthday.month==3||p->birthday.month==5||p->bi rthday.month==7||p->birthday.month==8||p->birthday.month==10||p->birthday.month==12) {if(31<p->birthday.day||p->birthday.day<1){printf("你输入的日期错误,请重新输入!\n");return 0;}}if(p->birthday.month=='4'||p->birthday.month=='6'||p->birthday.month=='11' ){if(30<p->birthday.day||p->birthday.day<1){printf("你输入的日期错误,请重新输入!\n");return 0;}}if(p->birthday.year%400==0||p->birthday.year%4==0&&p->birthday.year%100!=0 ){if(p->birthday.month==2){if(29<p->birthday.day||p->birthday.day<1){printf("你输入的日期错误!\n");return 0;}}}else{if(p->birthday.month==2){if(28<p->birthday.day||p->birthday.day<1){printf("你输入的日期错误!\n");return 0;}}}return 1;}//*************************************************************************** //*************************************************************************** int Comepare(BinTree q) //判断出生日期和死亡日期是否错误{if(q->dieday.year<q->birthday.year){printf("你输入的死亡年份日期错误,请重新输入!\n");return 0;}if(q->dieday.year==q->birthday.year){if(q->dieday.month<q->birthday.month){printf("你输入的月份死亡日期错误,请重新输入!\n");return 0;}}if(q->dieday.year==q->birthday.year){if(q->dieday.month==q->birthday.month){if(q->dieday.day<q->birthday.day){printf("你输入的天数死亡日期错误,请重新输入!\n");return 0;}}}return 1;}//**************************************************************************** //**************************************************************************** void InPut(BinTree &T){int i;T=(BinTree)malloc(sizeof(BiTNode));T->brother=NULL;T->child=NULL;T->parent=NULL;printf("*******请输入你入录人信息********\n");printf("请输入姓名:\n");scanf("%s",T->name);for(i=0;i<=100;i++){printf("请输入性别:(男(m)或女(f))\n");scanf("%s",T->sex);if(strcmp(T->sex,"m")||strcmp(T->sex,"f")||strcmp(T->sex,"M")||strcmp(T->s ex,"F"))break;}T->generation=1;T->message=0;printf("请输入身高:\n");scanf("%d",&T->hight);printf("请输入家庭住址:\n");scanf("%s",T->address);printf("请输入出生地:\n");scanf("%s",T->birthadd);printf("请输入职业:\n");scanf("%s",T->profession);strcpy(T->fathername,"0");for(i=1;i<=3;i++){printf("请输入出生日期\n");printf("请输入年:\n"); //判断出生日期是否正确,如果不正确,请重新输入scanf("%d",&(T->birthday.year));printf("请输入月:\n");scanf("%d",&(T->birthday.month));printf("请输入日:\n");scanf("%d",&(T->birthday.day));int t=JudgeTime(T);if(t)break;}for(i=0;i<=100;i++){printf("请输入此人是否健在:(健在(l或L),过逝(d或D))\n");scanf("%s",T->live);if(strcmp(T->live,"l")==0||strcmp(T->live,"d")==0||strcmp(T->live,"L")==0| |strcmp(T->live,"D")==0)break;}if(strcmp(T->live,"d")==0||strcmp(T->live,"D")==0){for(i=1;i<=3;i++){printf("请输入死亡日期\n");printf("请输入年:\n");scanf("%d",&T->dieday.year);printf("请输入月:\n");scanf("%d",&T->dieday.month);printf("请输入日:\n");scanf("%d",&(T->dieday.day));if(Comepare(T))break;}}if(strcmp(T->live,"d")==0||strcmp(T->live,"D")==0){T->age=(T->dieday.year-T->birthday.year);}else{T->age=(2012-T->birthday.year);}printf("你已成功入录此人的信息\n");}//**************************************************************************** ****//**************************************************************************** ****BinTree LevelFind(BinTree &T,char Name[15]){BinTree e;if(T==NULL){printf("没有找到你输入的信息\n");return NULL;}else{LinkQueue S;InitQueue(S); //初始化队列EnQueue(S,T);while( !QueueEmpty(S)){DeQueue(S,e);if(strcmp(e->name,Name)==0){return e;}else{if(e->brother!=NULL)EnQueue(S,e->brother);if(e->child!=NULL)EnQueue(S,e->child);}}printf("没有找到你输入的信息\n");return NULL;}}//***********************************************************************//*********************************************************************** void CreatfTree(BinTree &T) //按层次遍历生成此家谱{BinTree p;LinkQueue S;InitQueue(S); //构造一个空队列T=(BinTree)malloc(sizeof(BiTNode));printf("请输入家谱成员的信息!\n");InPut(T);EnQueue(S,T); //T进入队列中while(!QueueEmpty(S)){DeQueue(S,p);if(p->message==0){continue;}else{int i=0,x=1;i=p->message;BinTree p1,p2;p2=p1=(BinTree)malloc(sizeof(BiTNode));printf("请输入%s第%d个孩子的信息:\n",p->name,x);InPut(p1);p1->parent=p;i--; //结点的孩子数EnQueue(S,p1);while(i!=0){x=x+1;BinTree p3;p3=(BinTree)malloc(sizeof(BiTNode));printf("请输入%s第%d个孩子的信息:\n",p->name,x);InPut(p3);p1->brother=p3;p3->parent=p;p1=p3; //将p3的地址保存起来,以便下次连接它的兄弟EnQueue(S,p3);i--;}p->child=p2;}}}//*************************************************************************** //*************************************************************************** void OutPut(BinTree T){printf("*******输出个人信息********\n");printf("\n姓名:%s",T->name);printf("\n性别:%s",T->sex);printf("\n年龄:");printf("%d",T->age);printf("\n辈分:");printf("%d",T->generation);printf("\n身高:");printf("%d",T->hight);printf("\n孩子的个数:");printf("%d",T->message);printf("\n家庭住址:");printf("%s",T->address);printf("\n出生地:");printf("%s",T->birthadd);printf("\n职业:");printf("%s",T->profession);printf("\n父亲姓名:");printf("%s",T->fathername);if (strcmp(T->live,"d")==0||strcmp(T->live,"D")==0 ){printf("\n死亡日期:");printf("%d ",T->dieday.year);printf("%d ",T->dieday.month);printf("%d \n",T->dieday.day);}printf("\n出生日期:%d %d %d\n",T->birthday.year,T->birthday.month,T->birthday.day);}//*************************************************************************** //*************************************************************************** void LevelOutput(BinTree T){BinTree e;e=(BinTree)malloc(sizeof(BiTNode));e=T;if(T==NULL){printf("此家谱图为空,没有信息可以输出!\n");return;}else{LinkQueue S;InitQueue(S); //初始化队列EnQueue(S,e);while( !QueueEmpty(S)){DeQueue(S,e);OutPut(e);if(e->brother!=NULL)EnQueue(S,e->brother);if(e->child!=NULL)EnQueue(S,e->child);}return;}}//************************************************************************** //************************************************************************** void PreOrderD(BinTree T){if(T){T->generation++;PreOrderD(T->brother);PreOrderD(T->child);}}//*************************************************************************** //*************************************************************************** void Addchild(BinTree &T) //比较兄弟岁数后再添加{char Name[15];BinTree Tree,p,t,t1;int c,i,j=1;if(T==NULL){T=(BinTree)malloc(sizeof(BiTNode));printf("家谱不存在,则新建家谱树\n");printf("请输入整个家谱图的信息:\n");CreatfTree(T);//调用创建家谱图}else{while(j){printf("请输入你的选项(1~2):\n");printf("1:添加新成员作为整个家谱的祖先\n");printf("2:添加新成员作为某一成员的孩子\n");for(i=0;i<=3;i++){printf("选项为:");scanf("%d",&c);if(c==1||c==2){break;}elseprintf("你输入的选项有错,请重新输入!\n");}switch(c){case 1:Tree=(BinTree)malloc(sizeof(BiTNode));InPut(Tree);//输入增加节点的信息Tree->child=T;Tree->message++;T->parent=Tree;strcpy(T->fathername,Tree->name) ;PreOrderD(T);//递归函数将整个家族的辈分增加T=Tree;//将指针返回j=0;break;case 2:printf("请输入所添加成员的父亲姓名:\n你有3次机会\n");i=1;while((i++)!=4){scanf("%s",Name);p=LevelFind(T,Name);//将要插入的结点的父亲的指针找出来if(p==NULL){printf("父亲姓名输入错误\n你还有%d次机会\n请从新输入:\n",i-1);if (i==4) {return;}continue;}else{break;}}printf("请输入所添加成员的信息\n");Tree=(BinTree)malloc(sizeof(BiTNode));InPut(Tree); //输入增加节点的信息strcpy(Tree->fathername,p->name);Tree->generation=p->generation+1; //辈分加1if(p->child!=NULL){t1=p;t=p->child;while(t){if(Tree->age<=t->age){if(t->brother==NULL){t->brother=Tree;Tree->parent=p;p->message++; //辈分加1j=0;break;}if (Tree->age<=t->age&&Tree->age>=t->brother->age){Tree->brother=t->brother;t->brother=Tree;Tree->parent=p;p->message++;j=0;break;}t1=t;t=t->brother;continue;}else{Tree->brother=t;t1->child=Tree;Tree->parent=p;p->message++;j=0;break;}}}else{p->child=Tree;Tree->parent=p;p->message++;j=0;break;}break;default:printf("\n\n\t对不起,你的选择不在服务范围之内!\n");printf("\n请再次选择你所要的操作:\n");continue;}}}}//**************************************************************************** ****************//**************************************************************************** ****************void KeepTTFile(BinTree T,FILE *fp) //将树的信息保存到文件中{fprintf(fp,"%s ",T->name);fprintf(fp,"%s ",T->sex);fprintf(fp,"%d ",T->age);fprintf(fp,"%d ",T->generation);fprintf(fp,"%d ",T->hight);fprintf(fp,"%d ",T->message);fprintf(fp,"%s ",T->address);fprintf(fp,"%s ",T->birthadd);fprintf(fp,"%s ",T->profession);fprintf(fp,"%s ",T->fathername);fprintf(fp,"%s ",T->live);if (strcmp(T->live,"d")==0||strcmp(T->live,"D")==0){fprintf(fp,"%d ",T->dieday.year);fprintf(fp,"%d ",T->dieday.month);fprintf(fp,"%d ",T->dieday.day);}fprintf(fp," %d %d %d\n",T->birthday.year,T->birthday.month,T->birthday.da y);}//**************************************************************************** ******************//**************************************************************************** ******************void KCreatTree(BinTree &s) //层次遍历将家谱树保存在文件中{LinkQueue S;BinTree a,p;if (s==NULL){printf("家谱图的信息为空,不用保存到文件中!\n请重新构建家谱图·····\n");return;}FILE *fp;fp=fopen("familytree","wb+");if(fp==NULL){printf("Can not open file\n");exit (0);}InitQueue(S);EnQueue(S,s);while (!QueueEmpty(S)){DeQueue(S,a);KeepTTFile(a,fp);if (a->child!=NULL){EnQueue(S,a->child);p=a->child;while (p->brother!=NULL){EnQueue(S,p->brother); //将一个父亲的所以兄弟都压到队列中,层次保存文件p=p->brother;}}}fclose(fp);printf("家谱信息已成功保存到文件中!\n");return;}//**************************************************************************** ******************//**************************************************************************** ******************void PrinfTree(BinTree T,FILE *fp){fscanf(fp,"%s ",T->name);fflush(stdin);fscanf(fp,"%s ",T->sex);fflush(stdin);fscanf(fp,"%d ",&T->age);fflush(stdin);fscanf(fp,"%d ",&T->generation);fflush(stdin);fscanf(fp,"%d ",&T->hight);fflush(stdin);fscanf(fp,"%d ",&T->message);fflush(stdin);fscanf(fp,"%s ",T->address);fflush(stdin);fscanf(fp,"%s ",T->birthadd);fflush(stdin);fscanf(fp,"%s ",T->profession);fflush(stdin);fscanf(fp,"%s ",T->fathername);fflush(stdin);fscanf(fp,"%s ",T->live);if (strcmp(T->live,"D")==0||strcmp(T->live,"d")==0){fscanf(fp,"%d ",&T->dieday.year);fflush(stdin);fscanf(fp,"%d ",&T->dieday.month);fflush(stdin);fscanf(fp,"%d ",&T->dieday.day);fflush(stdin);}fscanf(fp,"%d %d %d\n",&T->birthday.year,&T->birthday.month,&T->birthday.d ay);fflush(stdin);}//**************************************************************************** *************************//**************************************************************************** **************************void LAddchild(BinTree &T,LinkQueue &S,FILE *fp) //按层次遍历将孩子存储在文件{int i=0;i=T->message;BinTree p1,p2;p2=p1=(BinTree)malloc(sizeof(BiTNode));p1->child=NULL;p1->brother=NULL;p1->parent=T;T->child=p2;i--; //结点的孩子数PrinfTree(p1,fp); //将T结点的信息读入到文件中EnQueue(S,p1);while(i!=0){BinTree p3;p3=(BinTree)malloc(sizeof(BiTNode));p3->parent=T;p3->child=NULL;p3->brother=NULL;p1->brother=p3;p1=p3; //将p3的地址保存起来,以便下次连接它的兄弟PrinfTree(p3,fp);EnQueue(S,p3);i--;}}//**************************************************************************** ***********//**************************************************************************** ***********void LCreateTree(BinTree &T) //从文件中读入成员信息按层次遍历生成家谱{BinTree p;T=(BinTree)malloc(sizeof(BiTNode));T->brother=NULL; //将T的孩子和兄弟初始化为空;T->child=NULL;T->parent=NULL;LinkQueue S;InitQueue(S); //构造一个空队列printf("从文件中读入家谱的成员\n");FILE *fp;fp=fopen("familytree","rb+");if(fp==NULL){printf("Can not open file\n");exit (0);}PrinfTree(T,fp); //将T结点的信息读入到文件中EnQueue(S,T); //T进入队列中while(!QueueEmpty(S)){DeQueue(S,p);if(p->message==0){continue;}else{LAddchild(p,S,fp);}}fclose(fp);printf("家谱信息已从文件中成功读出!\n");return;}。
家谱管理系统设计报告

目录第一章绪论............................................... 错误!未定义书签。
第二章需求分析........................................... 错误!未定义书签。
题目..................................................... 错误!未定义书签。
设计任务................................................. 错误!未定义书签。
数据测试................................................. 错误!未定义书签。
第三章概要设计........................................... 错误!未定义书签。
设计思想............................................. 错误!未定义书签。
实现方法............................................. 错误!未定义书签。
第四章详细设计........................................... 错误!未定义书签。
功能构想................................................. 错误!未定义书签。
界面设计................................................. 错误!未定义书签。
增加成员................................................. 错误!未定义书签。
添加子女............................................ 错误!未定义书签。
添加配偶............................................ 错误!未定义书签。
家谱管理系统数据结构

{ #include<stdio.h> #include<string.h> #include<stdlib.h> #include<conio.h> #define MAXS 100 #define Elemtype char typedef struct BiTNode {int mark; int level; char name[50]; char birthday[50]; char address[MAXS]; Elemtype data; struct BiTNode*lc,*rc; }BiTNode,*BiTree; char nametemp[50];〃 姓名 char birthdaytemp[50];〃 生日 char addresstemp[MAXS];〃 地址 char ch; int leveltemp; int Nth;char searchdata[50]; char searchname[50]; int count; BiTree temp;BiTree CreateBiTree(FILE *fp); void Printlnfo(BiTree T); void PreOrderTS(BiTree T); void ShowNth(BiTree T); void SearchByName(BiTree T); void SearchByBirthday(BiTree T); void AddChild(BiTree T); void DeleteByName(BiTree T); void searchmenu(); void menu(); void insystem(); void closefile(); #include"my.h"void SearchByName(BiTree T)〃按照姓名查询,输出成员信息if(T)if(T->lc) {{{if(T->lc->rc){temp=T->lc->rc;while(temp){if(strcmp(temp->name,searchname)==O){count++;printf("\n此人的信息为:\n");Printlnfo(temp);printf("此人父兄的信息为:\n");PrintInfo (T);if(temp->lc->rc){printf("此人孩子的信息为:\n");temp=temp->lc->rc;while(temp){PrintInfo(temp);temp=temp->rc;}}return;}elsetemp=temp->rc;SearchByName(T->lc);SearchByName(T->rc);}else{printf("请先建立家庭关系\n");return;}}void SearchByBirthday(BiTree T)〃按照出生日期查询成员名单if(T){{if(strcmp(T->birthday,searchdata)==O) {Printinfo (T); count++; }}}void AddChild(BiTree T)〃 某成员添加孩子 {if(T){ if(strcmp(T->name,searchname)==O) {count++;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); 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); } else {printf("请先建立家庭关系\n"); return;} }void DeleteByName(BiTree T)//删除某成员(若其还有后代,则一并删除) {if(T) if(strcmp(T->name,searchname)==O ){count++;T=NULL;return;}DeleteByName(T->lc);DeleteByName(T->rc);}}BiTree CreateBiTree(FILE *fp){if(!feof(fp)){BiTree T;T=(BiTree)malloc(sizeof(BiTNode));fscanf(fp,"%s %s %s\n",nametemp,birthdaytemp,addresstemp);fscanf(fp,"%d",&leveltemp);if((strcmp(nametemp,"n")==0)&&(strcmp(birthdaytemp,"n")==O)&&(strcmp(addresstemp,"n")==O)){T=NULL;return T;}else{strcpy(T->name,nametemp);strcpy(T->birthday,birthdaytemp);strcpy(T->address,addresstemp);T->level=leveltemp+1; printf("读取成功\n");T->lc=CreateBiTree(fp);T->rc=CreateBiTree(fp);return T;}}elsereturn NULL;}#include"my.h"void main(){BiTree T;int choice;FILE *fp;T=NULL;fp=fopen("F:\\family.txt","r"); insystem(); while(1) {system("cls"); menu();printf("请根据菜单进行选择所system("pause"); break; case 4:searchmenu();需操作;---\n\n");择:");T=CreateBiTree(fp);父母的姓名 \n");:\n");while(scanf("%d", &choice)!=1) {fflush(stdin); printf("\n---输入错误printf("请重新输入正确选 } fflush(stdin); switch(choice) {case 1:system("pause");break; case 2:count=0;printf("请输入要添加孩子scanf("%s",searchname); AddChild (T); if(count==0)printf("没有这个人system("pause");break;count=0;printf("请输入要删除成员的姓名:"); scanf("%s",searchname); DeleteByName(T); if(count==0)printf("没有这个人\n");printf(”请输入选择:\n");system("pause"); break;case 5:PreOrderTS(T);system("pause"); break;case 6: closefile();case 7:printf("请输入需要查询第几代人:");count=0;scanf("%d",&Nth);ShowNth(T);if(count==0)printf("第%d 代尚未有人。
家谱管理系统(含源代码)

家谱管理系统——C语言(数据结构)目的和要求:树形结构是一种非常重要的非线性结构,它用于描述数据元素之间的层次关系,人类家谱是树形结构的典型体现,通过此项训练让学生掌握树形结构的知识;使学生重点掌握树与二叉树的转换,二叉树的存储和遍历,和二叉树相关的一些运算;要求完成家谱信息的录入和保存,任意成员的查找及某一成员祖先、子孙、兄弟、堂兄弟的查找。
排答疑和辅导。
完整代码:#include <stdio.h>#include <stdlib.h>#include <string.h>int MATEFLAG=0; //是否入赘或嫁入这家的,1表示为是,0表示否typedef struct TreeNode//树节点定义{int Num; //保存此人儿女个数char Name[20]; //保存此人姓名char Kind; //保存此人性别,男M,女Fstruct TreeNode * NextNode[20]; //保存此人的儿女,NextNode[0]里存放配偶的地址struct TreeNode * Parent; //保存此节点的父节点}TreeNode;void CreatTree(TreeNode *Tree);//创建树void OutPutAll(TreeNode *Tree);//输出树TreeNode * SearchTree(TreeNode *Tree,char name[],int length);void MainMenu(TreeNode *Tree);void SubMenue1(TreeNode * Tree);void SubMenue2(TreeNode *Tree);void Change(TreeNode * Tree);void AddNew(TreeNode * Tree);void OutPutMessage(TreeNode * Tree,char name[],int length);//主函数void main(){TreeNode *Tree;//产生根节点Tree=(TreeNode *)malloc(sizeof(TreeNode));Tree->Parent =NULL;strcpy(Tree->Name,"0");MainMenu(Tree);//显示主菜单}//添加新的成员void AddNew(TreeNode * Tree){SubMenue2(Tree);//添加新成员界面}//显示添加家庭信息的界面void SubMenue2(TreeNode *Tree){char c;int num;char name[20];TreeNode * NewNode;getchar();while(1){system("cls");printf("请选择你的操作\n");printf("A:添加某个人的子女的信息\n");printf("B:添加某个人配偶的信息\n");printf("C:退出\n");printf("请选择相应功能:\n");c=getchar();switch(c){case 'A': //添加子女信息printf("请输入那个人的名字:\n");scanf("%s",name);Tree=SearchTree(Tree,name,20);//在家谱里查找这个人if(Tree==NULL){printf("该家谱图中没有%s这个人的信息请确认是否输入错误\n",name);break;}if(Tree->Parent==NULL&&Tree->NextNode[0]==NULL||Tree->Parent!=NULL&&Tree->N ame!=Tree->Parent->NextNode[0]->Name){printf("至今还没有配偶请先添加配偶\n",Tree->Name);break;}if(Tree->Parent==NULL&&(Tree->Num>20||Tree->Num<0))Tree->Num=0;if(MATEFLAG==1)Tree=Tree->Parent;NewNode=(TreeNode *)malloc(sizeof(TreeNode));printf("请输入添加人员姓名:\n");scanf("%s",NewNode->Name);printf("请输入添加人员性别女F男M:\n");scanf("%1s",&NewNode->Kind);num=Tree->Num;NewNode->NextNode[0]=(TreeNode *)malloc(sizeof(TreeNode));NewNode->NextNode[0]=NULL;NewNode->Num=0;NewNode->Parent=Tree;Tree->NextNode[num+1]=NewNode;Tree->Num=Tree->Num+1;printf("子女的信息添加成功\n");break;case 'B':printf("请输入那个人的名字:\n");scanf("%s",name);Tree=SearchTree(Tree,name,20);if(Tree->Parent!=NULL&&strcmp(Tree->Name,Tree->Parent->NextNode[0]->Name)==0||Tree->NextNode[0]!=NULL){printf("已经有了配偶\n");break;}if(Tree==NULL){printf("该家谱图中没有%s这个人的信息请确认\n",name);break;}NewNode=(TreeNode *)malloc(sizeof(TreeNode));printf("请输入添加人员姓名:\n");scanf("%s",NewNode->Name);printf("请输入添加人员性别女F男M:\n");scanf("%1s",&NewNode->Kind);NewNode->Parent=Tree;Tree->NextNode[0]=NewNode;break;case 'C':printf("本项服务到此结束\n");break;case '\n':break;default:printf("对不起!你的选择错误\n");break;}if (c=='C'||c=='c')break;printf("请按Enter键继续操作\n");getchar();}}//修改某个人的信息void Change(TreeNode * Tree){char name[20];TreeNode * NewNode;printf("请输入你要修改的人的信息:\n");scanf("%s",name);NewNode=SearchTree(Tree,name,20);if(NewNode==NULL){printf("该家谱图中没有%s这个人的信息请确认是否输入错误\n",name);return;}else{SubMenue1(NewNode);}}//输出副菜单void SubMenue1(TreeNode * Tree){char c;int flag,i;char name[20];char Parent[2][20];TreeNode * NewNode;getchar();while(1){system("cls");printf("请选择你的操作\n");printf("A:修改个人的信息\n");printf("B:修改父母的信息\n");printf("C:修改兄弟姐妹的信息\n");printf("D:修改子女的信息\n");printf("E:修改配偶的信息\n");printf("F:退出\n");c=getchar();switch(c){printf("请输入修改的姓名:如果不需要修改就输入'0'然后按Enter键继续\n"); scanf("%s",name);if(strcmp(name,"0")!=0)strcpy(Tree->Name,name);printf("是否要修改性别:如果需要就输入'1'不需要修改就输入'0'然后按Enter键继续\n");scanf("%d",&flag);if (flag==1){if(Tree->Kind=='F'||Tree->Kind=='f')Tree->Kind='M';else Tree->Kind='F';}printf("个人信息修改成功\n");break;case 'B':if(Tree->Parent==NULL) //判断是不是头节点{printf("是这个家谱图里最顶端的人没有父母信息!\n",name);break;}if (MATEFLAG==1) //判断是不是入赘或加入此间的{if(Tree->Kind=='F'||Tree->Kind=='f'){printf("她是嫁入此间的所以父母信息不在家谱内包括\n");}else{printf("他是入赘此间的所以父母信息不在家谱内包括\n");}break;}if(Tree->Parent->Kind=='F'||Tree->Parent->Kind=='f'){strcpy(Parent[0],"母亲");strcpy(Parent[1],"父亲");}else{strcpy(Parent[0],"父亲");strcpy(Parent[1],"母亲");}printf("请输入%s要修改的姓名:如果不需要修改就输入'0'然后按Enter键继续\n",Parent[0]);scanf("%s",name);if(strcmp(name,"0")!=0)strcpy(Tree->Parent->Name,name);printf("请输入%s要修改的姓名:如果不需要修改就输入'0'然后按Enter键继续\n",Parent[1]);scanf("%s",name);if(strcmp(name,"0")!=0)strcpy(Tree->Parent->NextNode[0]->Name,name);printf("父母的信息修改成功\n");break;case 'C':NewNode=Tree->Parent;if(NewNode==NULL) //判断是不是头节点{printf("是这个家谱图里最顶端的人没有兄弟姐妹信息!\n",name);break;}if (MATEFLAG==1) //判断是不是入赘或嫁入这家的{if(Tree->Kind=='F'||Tree->Kind=='f'){printf("她是嫁入此间的所以兄弟姐妹信息不在家谱内包括\n");}else{printf("他是入赘此间的所以兄弟姐妹信息不在家谱内包括\n");}break;}if(NewNode->Num==1){printf("没有兄弟姐妹\n");break;}else{for(i=1;i<=NewNode->Num;i++){if(NewNode->NextNode[i]->Name!=Tree->Name){printf("请输入%s修改的姓名:如果不需要修改就输入'0'然后按Enter键继续\n",NewNode->NextNode[i]->Name);scanf("%s",name);if(strcmp(name,"0")!=0)strcpy(NewNode->NextNode[i]->Name,name);printf("是否要修改性别:如果需要就输入'1'不需要修改就输入'0'然后按Enter键继续\n");scanf("%d",&flag);if (flag==1){if(NewNode->NextNode[i]->Kind=='G'||NewNode->NextNode[i]->Kind=='g') NewNode->NextNode[i]->Kind='B';else NewNode->NextNode[i]->Kind='G';}}}}printf("兄弟姐妹的信息修改成功\n");break;case 'D':if(Tree->Num==0){printf("至今还没有子女\n");break;}if (Tree->Parent !=NULL)if (strcmp(Tree->Name,Tree->Parent->NextNode[0]->Name)==0) //如果他是入赘或者是嫁入的就需用配偶节点完成修改{Tree=Tree->Parent;}for(i=1;i<=Tree->Num;i++){printf("请输入%s修改的姓名:如果不需要修改就输入'0'然后按Enter键继续\n",Tree->NextNode[i]->Name);scanf("%s",name);if(strcmp(name,"0")!=0)strcpy(Tree->NextNode[i]->Name,name);printf("是否要修改性别:如果需要就输入'1'不需要修改就输入'0'然后按Enter键继续\n");scanf("%d",&flag);if (flag==1){if(Tree->NextNode[i]->Kind=='F'||Tree->NextNode[i]->Kind=='f')Tree->NextNode[i]->Kind='M';else Tree->NextNode[i]->Kind='F';}}printf("子女的信息修改成功\n");break;case 'E':if(Tree->Parent!=NULL){if(Tree->NextNode[0]==NULL&&strcmp(Tree->Name,Tree->Parent->NextNode[0]->Name)!=0){printf("至今还没有配偶\n");break;}if (strcmp(Tree->Name,Tree->Parent->NextNode[0]->Name)==0){printf("\n\n\t请输入%s修改的姓名:如果不需要修改就输入'0'然后按Enter键继续\n\t",Tree->Parent->Name);scanf("%s",name);if(strcmp(name,"0")!=0)strcpy(Tree->Parent->Name,name);}else{printf("\n\n\t请输入%s修改的姓名:如果不需要修改就输入'0'然后按Enter键继续\n\t",Tree->NextNode[0]->Name);scanf("%s",name);if(strcmp(name,"0")!=0)strcpy(Tree->NextNode[0]->Name,name);}}else{if(Tree->NextNode[0]==NULL)printf("至今还没有配偶\n");else{printf("\n\n\t请输入%s修改的姓名:如果不需要修改就输入'0'然后按Enter键继续\n\t",Tree->NextNode[0]->Name);scanf("%s",name);if(strcmp(name,"0")!=0)strcpy(Tree->NextNode[0]->Name,name);}}printf("配偶的信息修改成功\n");break;case 'F':printf("本项服务到此结束\n");break;case '\n':break;default:printf("对不起!你的选择错误\n");break;}if (c=='F'||c=='f')break;printf("请按Enter键继续操作\n");getchar();getchar();}}//输出主菜单void MainMenu(TreeNode *Tree){char c;//用于接受用户输入的选项char name[20];while(1){system("cls");//清屏printf("★★★★★★★★★★★★★欢迎进入家谱管理系统★★★★★★★★★★★\n\n\n");printf(" ◆◆菜单◆◆ \n\n");printf(" ●输入家谱信息---------------------1\n");printf(" ●查找家族成员---------------------2\n");printf(" ●添加家族成员---------------------3\n");printf(" ●输出家谱信息---------------------4\n");printf(" ●修改成员信息---------------------5\n");printf(" ●退出-----------------------------6\n");printf("\n\n★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★\n");printf("请选择相应的功能:\n");c=getchar();switch(c){case '1': TreeNode * NewNode; NewNode=(TreeNode *)malloc(sizeof(TreeNode));//建立新节点printf("请输入姓名:"); scanf("%s",Tree->Name);//给节点姓名赋值printf("请输入性别(女F,男M):"); getchar();//给性别赋值scanf("%c",&(Tree->Kind)); // Tree->Parent=NewNode; Tree->Parent=NULL; CreatTree(Tree); printf("家谱图已经建立成功\n"); printf("请按Enter键继续操作\n"); getchar(); break; case '2': if(strcmp(Tree->Name,"0")==0) { printf("家谱图还未建立请先建立\n"); getchar(); break; } printf("请输入你要查找的人的姓名:\n"); scanf("%s",name); OutPutMessage(SearchTree(Tree,name,20),name,20); getchar(); break; case '3': if(strcmp(Tree->Name,"0")==0) { printf("家谱图还未建立请先建立\n"); getchar(); break; } AddNew(Tree); getchar(); break; case '4': if(strcmp(Tree->Name,"0")==0) { printf("家谱图还未建立请先建立\n"); getchar(); break; }printf("整个家谱的主要信息如下:\n");OutPutAll(Tree);getchar();break;case '5':if(strcmp(Tree->Name,"0")==0){printf("家谱图还未建立请先建立\n");getchar();break;}Change(Tree);getchar();break;case '6':printf("本程序结束,欢迎下次使用。
家谱管理系统(含源代码)x

家谱管理系统——C语言(数据结构)目的和要求:树形结构是一种非常重要的非线性结构,它用于描述数据元素之间的层次关系,人类家谱是树形结构的典型体现,通过此项训练让学生掌握树形结构的知识;使学生重点掌握树与二叉树的转换,二叉树的存储和遍历,和二叉树相关的一些运算;要求完成家谱信息的录入和保存,任意成员的查找及某一成员祖先、子孙、兄弟、堂兄弟的查找。
排答疑和辅导。
完整代码:#in clude<stdio.h>#in clude<stdlib.h>#in clude<stri ng.h>intMATEFLAG=O;〃是否入赘或嫁入这家的,1表示为是,0表示否tRpedefstructTreeNode// 树节点定义{intNum;//保存此人儿女个数charName[20];〃保存此人姓名charKind;//保存此人性别,男 M,女FstructTreeNodeRNeRtNode[20];〃保存此人的儿女,NeRtNode[0]里存放配偶的地址structTreeNodeRParent;〃保存此节点的父节点}TreeNode;voidCreatTree(TreeNodeRTree);// 创建树 voidOutPutAII(TreeNodeRTree);// 输出树TreeNodeRSearchTree(TreeNodeRTree,charname[],i ntle ngth);voidMai nMenu (TreeNodeRTree);voidSubMe nue1(TreeNodeRTree);voidSubMe nue2(TreeNodeRTree);voidCha nge(TreeNodeRTree);voidAddNew(TreeNodeRTree); voidOutPutMessage(TreeNodeRTree,charname[],i ntle ngth);//主函数voidmai n(){TreeNodeRTree;// 产生根节点Tree=(TreeNodeR)malloc(sizeof(TreeNode));Tree->Pare nt=NULL;strcpR(Tree->Name,"0");MainMenu(Tree);// 显示主菜单}//添加新的成员voidAddNew(TreeNodeRTree){SubMenue2(Tree);〃添加新成员界面}//显示添加家庭信息的界面voidSubMe nue2(TreeNodeRTree){charc;intnum;char name[20];TreeNodeRNewNode;getchar();while(1)sRstem("cls");printf(”请选择你的操作\n”);printf("A:添加某个人的子女的信息\n");printf("B:添加某个人配偶的信息\n");printf("C:退出 \n”);printf(”请选择相应功能:\n");c=getchar();switch(c){case'A'://添加子女信息printf(”请输入那个人的名字:\n");sca nf("%s", name);Tree=SearchTree(Tree ,n ame,20);〃在家谱里查找这个人if(Tree==NULL){printf("该家谱图中没有%s这个人的信息请确认是否输入错误\n",name);break;}if(Tree->Pare nt==NULL&&Tree->NeRtNode[0]==NULL||Tree->Pare nt!=NULL&& Tree->N ame!=Tree->Pare nt->NeRtNode[0]->Name){printf(”至今还没有配偶请先添加配偶\n",Tree->Name);break;}if(Tree->Pare nt==NULL&&(Tree->Num>20||Tree->Num<0))Tree->Num=0;if(MATEFLAG==1)Tree=Tree->Pare nt;NewNode=(TreeNodeR)malloc(sizeof(TreeNode));printf(”请输入添加人员姓名:\n");sca nf("%s",NewNode->Name);printf(”请输入添加人员性别女F男M:\n");sca nf("%1s",&NewNode->Ki nd);num=Tree->Num;NewNode->NeRtNode[0]=(TreeNodeR)malloc(sizeof(TreeNode));NewNode->NeRtNode[0]=NULL;NewNode->Num=0;NewNode->Pare nt=Tree;Tree->NeRtNode[ num+1]=NewNode;Tree->Num=Tree->Num+1;printf(”子女的信息添加成功\n");break;case'B':printf(”请输入那个人的名字:\n");sca nf("%s", name);Tree=SearchTree(Tree ,n ame,20);if(Tree->Pare nt!=NULL&&strcmp(Tree->Name,Tree->Pare nt->NeRtNode[0]->Name)==0||T ree->NeRtNode[0]!=NULL)printf(”已经有了配偶\n”);break;}if(Tree==NULL){printf("该家谱图中没有%s这个人的信息请确认\n",name); break;}NewNode=(TreeNodeR)malloc(sizeof(TreeNode));printf(”请输入添加人员姓名:\n");sca nf("%s",NewNode->Name);printf(”请输入添加人员性别女F男M:\n");sca nf("%1s",&NewNode->Ki nd);NewNode->Pare nt=Tree;Tree->NeRtNode[0]=NewNode;break;case'C':printf(”本项服务到此结束\n");break;case'\n':break;default:printf("对不起!你的选择错误\n");break;}if(c==C||c=='c')break;printf(”请按Enter键继续操作\n");getchar();getchar();}}//修改某个人的信息voidCha nge(TreeNodeRTree){char name[20];TreeNodeRNewNode;printf(”请输入你要修改的人的信息:\n");sca nf("%s", name);NewNode=SearchTree(Tree ,n ame,20);if(NewNode==NULL){printf("该家谱图中没有%s这个人的信息请确认是否输入错误 return;\n ”, name); }else{SubMe nu e1(NewNode);}}//输出副菜单voidSubMe nue1(TreeNodeRTree){charc;in tflag,i;char name[20];charPare nt[2][20];TreeNodeRNewNode;getchar();while(1){sRstem("cls");printf(”请选择你的操作\n”);printf("A:修改个人的信息\n");printf("B:修改父母的信息\n”);printf("C:修改兄弟姐妹的信息\n");printf("D:修改子女的信息\n");printf("E:修改配偶的信息\n”);printf("F:退出 \n");c=getchar();switch(c){case'A':printf(”请输入修改的姓名:如果不需要修改就输入'0'然后按Enter键继续\n"); sca nf("%s", name);if(strcmp( name,"0")!=0)strcpR(Tree->Name, name);printf(”是否要修改性别:如果需要就输入'1'不需要修改就输入'0'然后按Enter键继续\n");sca nf("%d", &flag);if(flag==1){if(Tree->K in d=='F'||Tree->Ki nd=='f)Tree->Ki nd='M';elseTree->K in d='F';}printf(”个人信息修改成功\n");break;case'B':if(Tree->Pare nt==NULL)〃判断是不是头节点{printf(”是这个家谱图里最顶端的人没有父母信息!\n",name);break;}if(MATEFLAG==1)〃判断是不是入赘或加入此间的{if(Tree->K in d=='F'||Tree->Ki nd=='f)printf(”她是嫁入此间的所以父母信息不在家谱内包括\n");}else{printf(”他是入赘此间的所以父母信息不在家谱内包括\n");}break;}if(Tree->Pare nt->K in d=='F'||Tree->Pare nt->K in d=='f){strcpR(Parent[O],"母亲");strcpR(Parent[1],"父亲");}else{strcpR(Parent[O],"父亲");strcpR(Parent[1],"母亲");}printf(”请输入%s要修改的姓名:如果不需要修改就输入'0'然后按Enter键继续\n",Pare nt[O]);sca nf("%s", name);if(strcmp( name,"O")!=O)strcpR(Tree->Pare nt->Name, name);printf(”请输入%s要修改的姓名:如果不需要修改就输入'0'然后按Enter键继续\n",Pare nt[1]);sca nf("%s", name);if(strcmp( name,"0")!=0)strcpR(Tree->Pare nt->NeRtNode[0]->Name, name);printf(”父母的信息修改成功\n");break;case'C':NewNode=Tree->Pare nt;if(NewNode==NULL)〃判断是不是头节点{printf(”是这个家谱图里最顶端的人没有兄弟姐妹信息!\n",name);break;}if(MATEFLAG==1)〃判断是不是入赘或嫁入这家的{if(Tree->K in d=='F'||Tree->Ki nd=='f){printf(”她是嫁入此间的所以兄弟姐妹信息不在家谱内包括\n");}else{printf(”他是入赘此间的所以兄弟姐妹信息不在家谱内包括\n");break;}if(NewNode->Num==1){printf(”没有兄弟姐妹\n”);break;}else{for(i=1;i<=NewNode->Num;i++){if(NewNode->NeRtNode[i]->Name!=Tree->Name){printf(”请输入%s修改的姓名:如果不需要修改就输入'0'然后按Enter 键继续 \n”,NewNode->NeRtNode[i]->Name);sea nf("%s", name);if(strcmp( name,"O")!=O) strcpR(NewNode->NeRtNode[i]->Name, name); printf(”是否要修改性别:如果需要就输入'1'不需要修改就输入'0'然后按Enter键继续\n");sca nf("%d", &flag);if(flag==1){if(NewNode->NeRtNode[i]->K in d=='G'||NewNode->NeRtNode[i]->Ki nd=='g') NewNode->NeRtNode[i]->Ki nd='B: elseNewNode->NeRtNode[i]->Ki nd='G'; }}}}printf(”兄弟姐妹的信息修改成功\n");break;case'D':if(Tree->Num==O){printf(”至今还没有子女\n");break;}if(Tree->Pare nt!=NULL)if(strcmp(Tree->Name,Tree->Pare nt->NeRtNode[0]->Name)==0)〃如果他是入赘或者是嫁入的就需用配偶节点完成修改{Tree=Tree->Pare nt;}for(i=1;i<=Tree_>Num;i++){printf(”请输入%s修改的姓名:如果不需要修改就输入'0'然后按Enter键继续\n",Tree->NeRtNode[i]->Name);sca nf("%s", name);if(strcmp( name,"0")!=0)printf(”是否要修改性别:如果需要就输入'1'不需要修改就输入'0'然后按Enter 键继续 \n");sca nf("%d", &flag);if(flag==1){if(Tree->NeRtNode[i]->Ki nd=='F'||Tree->NeRtNode[i]->Ki nd=='f)Tree->NeRtNode[i]->Ki nd='M';elseTree->NeRtNode[i]->Kin d='F';}}printf(”子女的信息修改成功\n");break;case'E':if(Tree->Pare nt!=NULL){if(Tree->NeRtNode[0]==NULL&&strcmp(Tree->Name,Tree->Pare nt->NeRtNode[0]->Name)!=0) {printf(”至今还没有配偶\n”);break;}if(strcmp(Tree->Name,Tree->Pare nt->NeRtNode[0]->Name)==0){printf("\n\n\t请输入%s修改的姓名:如果不需要修改就输入'0'然后按Enter 键继续 \n\t",Tree->Parent->Name);sca nf("%s", name);if(strcmp( name,"0")!=0)strcpR(Tree->Pare nt->Name, name);}else{printf("\n\n\t请输入%s修改的姓名:如果不需要修改就输入'0'然后按Enter 键继续 \n\t",Tree->NeRtNode[0]->Name);sca nf("%s", name);if(strcmp( name,"0")!=0)strcpR(Tree->NeRtNode[0]->Name, name);}}else{if(Tree->NeRtNode[0]==NULL)printf("至今还没有配偶\n”);else{printf("\n\n\t请输入%s修改的姓名:如果不需要修改就输入'0'然后按Enter 键继续 \n\t",Tree->NeRtNode[0]->Name);sca nf("%s", name);if(strcmp( name,"0")!=0)}}printf(”配偶的信息修改成功\n");break;case'F':printf(”本项服务到此结束\n");break;case'\n':break;default:printf("对不起!你的选择错误\n");break;}if(c=='F'||c=='f)break;printf(”请按Enter键继续操作\n");getchar();getchar();}}//输出主菜单voidMai nMen u(TreeNodeRTree){chare;//用于接受用户输入的选项char name[20];while(1){sRstem("cls");〃清屏printf(” ★★★★★★★★★★★★★欢迎进入家谱管理系统★★★★★★★★★★★ \n\n\n");printf(” ♦♦菜单・・ \n\n”);printf(”输入家谱信息 ----------- 1\n");printf(”查找家族成员 ----------- 2\n");printf(”添加家族成员 ----------- 3\n");printf("输出家谱信息 ------------ 4\n");printf("修改成员信息 ------------ 5\n");printf(” 退出 ---------------- 6\n");printf("\n\n ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ \n");printf(”请选择相应的功能:\n");c=getchar();switch(c){case'1':TreeNodeRNewNode;NewNode=(TreeNodeR)malloc(sizeof(TreeNode));〃建立新节点printf("请输入姓名:");scanf("%s",Tree->Name);〃给节点姓名赋值printf(”请输入性别(女F男M):");getchar();// 给性另U 赋值scanf("%c",&(Tree->Kind));//Tree->Parent=NewNode;Tree- >Parent=NULL;CreatTree(Tree);printf("家谱图已经建立成功 \n”);printf(” 请按 Enter 键继续操作 \n");getchar();break;case'2':if(strcmp(Tree->Name,"0")==0){pri ntf("家谱图还未建立请先建立\n");getchar();break;}pri ntf(" 请输入你要查找的人的姓名:\n");scanf("%s",name);OutPutMessage(SearchTree(Tree,name,20),name,20);getchar();break;c ase'3':if(strcmp(Tree->Name,"0")==0){pri ntf(" 家谱图还未建立请先建立\n");getchar();break;}AddNew(Tree);getchar();break;case'4':if(strcmp(Tree- >Name,"0")==0) {printf("家谱图还未建立请先建立 \n");getchar();break;}printf(”整个家谱的主要信息如下:\n");OutPutAll(Tree);getchar();break; case'5': if(strcmp(Tree->Name,"0")==0){printf(”家谱图还未建立请先建立 \n");getchar();break;}Chan ge(Tree);getchar(); break; case'6': printf(”本程序结束,欢迎下次使用。
数据结构课设-家谱管理系统

数据结构课程设计——家谱管理系统一、问题描述问题名称:电子家谱问题内容:用树形的形式表示某家族的家谱,每个树结点表示一个家族成员,成员基本信息如下,具体属性自行确定。
1、姓名2、性别3、出生地4、配偶5、电话6、家庭住址7、职业8、简历9、其他系统实现功能:1、家谱信息1.1、输入1.2、修改1.3、删除2、查询2.1、某家谱成员的所有子孙的集合2.2、某家谱成员的所有祖先的集合2.3、某家谱成员的所有同辈成员的集合2.4、求某家谱成员的所有上一辈成员的集合2.5、给出两个家谱成员,确定他们的关系2.6、其他查询3、统计功能3.1、统计家谱成员的总人数3.2、统计从事某种职业的人数3.3、综合统计其他功能要求:1、用文件保存家谱信息2、图形方式显示家谱2二、系统总体设计(模块结构图)建立家谱读取文件保存家谱添加结点修改结点删除结点程序入口输出家谱统计基本查询关系查询祖先列表两人关系三、算法和数据结构设计数据结构的设计:使用兄弟孩子父亲表示法数据结构由如下的结构体组成1.1、日期的结构struct Date{int year; //年int month; //月int day; //日};1.2、成员信息的结构struct Info{char name[max_char_num];//姓名char birthplace[max_char_num];//出生地点Date birthdate;//结构date定义的出生日期Date deathdate;//结构date定义的死亡日期char sex[max_char_num];//性别char wife_or_husband[max_char_num];//配偶char phone[max_array_num];//电话char address[max_char_num];//家庭住址char resume[max_char_num];//简历//其他信息如下int height;//高度char occupation[max_char_num];//职业3char education[max_char_num];//受教育程度char top_headship[max_char_num];//最高职位char parentname[max_char_num];//父亲姓名,用于添加节点时用int Depth;//二叉树深度,输出二叉树时用};1.3、结点的结构typedef struct CSNode{Info data; //个人信息类型结构CSNode *firstchild,*nextsibling,*parent; //csnode的第一个孩子节点,下一个兄弟节点,双亲节点}*person;数据结构设计体会:使用树的按层遍历的方法找出某人的祖先的集合,但在从文件重建家谱的部分又碰到了困难,如何保存文件可是既节省空间又节省重建家谱的时间。
家谱管理系统

家谱管理系统一、需求分析本系统实现以下功能:1). 输入文件以存放最初家谱中各成员的信息。
成员的信息中均应包含以下内容:姓名、出生日期、婚否、地址、健在否、死亡日期(若其已死亡)也可附加其它信息、但不是必需的。
2). 实现数据的存盘和读盘。
3). 以图形方式显示家谱。
4). 显示第n 代所有人的信息。
5). 按照姓名查询,输出成员信息(包括其本人、父亲、孩子的信息)。
6). 按照出生日期查询成员名单。
7). 输入两人姓名,确定其关系。
8). 某成员添加孩子。
9). 删除某成员(若其还有后代,则一并删除)。
10).修改某成员信息。
11).按出生日期对家谱中所有人排序。
12).打开一家谱时,提示当天生日的健在成员。
测试要求:1).建立至少30个成员的数据,以较为直观的方式显示结果,并提供文稿形式以便检查。
2).对界面的要求是:有合理的提示,每个功能可以设立菜单,根据提示,可以完成相关的功能要求。
二、设计概要1、抽象数据类型兄弟孩子树的定义如下:ADT CSNode{数据对象:person是兄弟孩子树中的每一个节点,T是整个树的统一体数据关系:R1={<person i-1,person i>|<person i-1,person i>表示person i-1和person i之间有血缘关系}基本操作:CSNode *CreatTree(fstream &outfile);初始条件:已经打开了文本文件PersonInfo.txt操作结果:创建一个兄弟孩子树T,并把从文件中的数据送到树中,关闭文件。
void CreatParent_step(CSNode *parent);初始条件:兄弟孩子树T已经存在操作结果:对所有的孩子节点添加指向父亲的指针void InOrderTraverse(CSNode *T);初始条件:兄弟孩子树T已经存在操作结果:对T进行中序遍历。
bool Today_Brithday(CSNode *T);初始条件:兄弟孩子树T已经存在操作结果:根据计算机系统的时间判断几天是否有人过生日,并显示他们的名字。
家谱管理系统设计与实现

课程设计报告课程名称《数据结构》课题名称排序综合专业班级学号姓名联系方式指导教师20 11 年12 月21 日目录1. 问题陈述 (3)2.设计方法阐述 (3)2.1总体规划 (3)2.2功能构想 (4)2.2.1增加成员 (4)2.2.2修改成员资料 (5)2.2.3删除成员 (6)2.2.4打开家谱 (7)2.2.5新建家谱 (8)2.2.6保存家谱 (10)2.2.7查看某代信息 (11)2.2.8按姓名查找 (12)2.2.9按生日查找 (12)2.2.10查看成员关系 (13)2.2.11按出生日期排序 (14)2.3板块整合 (15)2.4调试分析 (19)3.总结 (19)4. 测试结果 (20)1.问题陈述家谱用于记录某家族历代家族成员的情况与关系。
现编制一个家谱资料管理软件,实现对一个家族所有的资料进行收集整理。
支持对家谱的存储、更新、查询、统计等操作。
并用计算机永久储存家族数据,方便随时调用。
2.设计方法阐述2.1总体规划在动手编制程序之前,先要做好程序的规划,包括程序储存数据所用的结构,数据类型等等,只有确定了数据类型和数据结构,才能在此基础上进行各种算法的设计和程序的编写。
首先是考虑数据类型。
在家谱中,家族成员是最基本的组成部分,对于家族管理中,已经不能再进行细分了,所以选定家族成员作为数据的基本类型,并在程序中定义COperationFamilytree 类。
其中COperationFamilytree 类的各种属性可以根据需要进行添加或删除,从日常生活应用的角度出发,制定了COperationFamilytree 类中包含了一下属性:char name[MAX_CHARNUM]; //姓名Date birthday; //出生日期In tsex; //性别char addr[MAX_CHARNUM]; //基本资料int live; //健在否Date deathday; //死亡日期int ChildNums(Person pNode) ; //返回pNode孩子数intInSiblingPos(Person pNode); //返回pNode在其兄弟中的排行为方便计算机进行比较,在familytree类的某些属性中用数字代替了某些不会改变的字符串,譬如性别(1代表男,0代表女)、判断是否健在(1为是,0为否)。
家谱管理系统 -数据结构大作业

家谱管理系统 -数据结构大作业家谱管理系统数据结构大作业在当今数字化的时代,信息管理系统在各个领域都发挥着重要作用。
家谱作为家族历史和传承的重要记录,也需要一个高效、便捷的管理系统来保存、整理和查询相关信息。
本次数据结构大作业,我将深入探讨家谱管理系统的设计与实现。
一、需求分析家谱管理系统的主要用户包括家族成员和对家族历史感兴趣的研究者。
系统需要满足以下基本需求:1、能够存储家族成员的详细信息,如姓名、出生日期、逝世日期、籍贯、职业等。
2、支持家族关系的建立和维护,如父子、母子、夫妻等关系。
3、提供便捷的查询功能,用户可以根据姓名、出生日期、关系等条件快速找到所需的家族成员信息。
4、支持家谱的可视化展示,以清晰呈现家族成员之间的关系结构。
5、具备数据的添加、删除和修改功能,以保证家谱信息的及时更新。
二、数据结构选择为了有效地存储和管理家谱数据,我们需要选择合适的数据结构。
考虑到家谱中家族成员之间的层次关系,树结构是一个理想的选择。
在这里,我们可以使用二叉树来表示家族关系。
每个节点代表一个家族成员,节点中存储成员的相关信息。
父节点与左子节点表示父子关系,父节点与右子节点表示父女关系。
另外,为了提高查询效率,我们还可以结合哈希表来存储家族成员的信息。
通过哈希函数将成员的关键信息(如姓名)映射到哈希表中的特定位置,从而实现快速的查找和访问。
三、系统功能模块设计1、数据录入模块提供友好的用户界面,方便用户输入家族成员的信息。
对输入的数据进行合法性检查,确保信息的准确性和完整性。
2、数据存储模块利用选择的数据结构(二叉树和哈希表)将家族成员的信息进行存储。
确保数据的安全存储,防止数据丢失或损坏。
3、查询模块支持多种查询条件,如按姓名、出生日期、关系等进行查询。
快速返回查询结果,并以清晰的方式展示给用户。
4、关系维护模块允许用户添加新的家族成员,并建立其与其他成员的关系。
支持修改和删除家族成员的信息及关系。
家谱管理系统c语言课程设计

家谱管理系统c语言课程设计一、课程目标知识目标:1. 学生能理解家谱管理系统的基础知识,掌握C语言中结构体、文件操作、指针等在本项目中的应用。
2. 学生能运用C语言实现家谱的添加、删除、修改、查询等基本功能,并理解其背后的算法逻辑。
3. 学生能掌握简单的数据结构设计,如链表,以及其在管理大量数据时的优势。
技能目标:1. 学生通过课程学习,能够独立设计并编写一个简单的家谱管理系统,展示基本的编程能力。
2. 学生能够运用所学知识,解决家谱管理中的实际问题,如数据存储、读取和操作。
3. 学生能够进行基本的程序调试,优化程序性能,提高代码的可读性和维护性。
情感态度价值观目标:1. 培养学生对计算机编程的兴趣,激发其探究精神和创新意识。
2. 学生能够通过团队协作,体验合作学习的重要性,培养沟通和协作的能力。
3. 学生通过实际项目的开发,增强自信心,认识到学习C语言的实际意义和价值。
课程性质分析:本课程为实践性较强的课程设计,旨在通过实际项目的开发,让学生将所学的C语言知识应用到实际问题中,提高学生的编程能力和问题解决能力。
学生特点分析:考虑到学生已经具备C语言基础知识,但实际应用能力有待提高,课程设计将注重理论与实践的结合,逐步引导学生从理解到应用。
教学要求:1. 教学过程中应注重启发式教学,引导学生主动探究问题,培养学生的独立思考能力。
2. 教师应关注学生的学习进度,提供及时反馈,帮助学生解决编程过程中遇到的问题。
3. 课程结束后,组织学生进行项目展示和评价,鼓励学生相互学习,共同提高。
二、教学内容1. 家谱管理系统需求分析:讲解家谱管理系统的基本功能需求,分析项目所需的C语言知识点。
- 课本关联章节:C语言基础知识、结构体、文件操作。
2. 数据结构设计:介绍链表等数据结构在家谱管理系统中的应用。
- 课本关联章节:数据结构、指针。
3. 功能模块设计:- 添加功能:实现添加家庭成员信息的功能。
- 删除功能:实现删除家庭成员信息的功能。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
家谱管理系统含源
代码
家谱管理系统——C语言(数据结构)
目的和要求:树形结构是一种非常重要的非线性结构,它用于描述数据元素之间
的层次关系,人类家谱是树形结构的典型体现,经过此项训练让学生掌握树形结
构的知识;使学生重点掌握树与二叉树的转换,二叉树的存储和遍历,和二叉树
相关的一些运算;要求完成家谱信息的录入和保存,任意成员的查找及某一成员
祖先、子孙、兄弟、堂兄弟的查找。
排答疑和辅导。
完整代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int MATEFLAG=0; //是否入赘或嫁入这家的,1表示为是,0表示否
typedef struct TreeNode//树节点定义
{
int Num; //保存此人儿女个数
char Name[20]; //保存此人姓名
char Kind; //保存此人性别,男M,女F
struct TreeNode * NextNode[20]; //保存此人的儿女,NextNode[0]里存放配偶的地址
struct TreeNode * Parent; //保存此节点的父节点
}TreeNode;
void CreatTree(TreeNode *Tree);//创立树
void OutPutAll(TreeNode *Tree);//输出树
TreeNode * SearchTree(TreeNode *Tree,char name[],int length);
void MainMenu(TreeNode *Tree);
void SubMenue1(TreeNode * Tree);
void SubMenue2(TreeNode *Tree);
void Change(TreeNode * Tree);
void AddNew(TreeNode * Tree);
void OutPutMessage(TreeNode * Tree,char name[],int length);
//主函数
void main()
{
TreeNode *Tree;//产生根节点
Tree=(TreeNode *)malloc(sizeof(TreeNode));
Tree->Parent =NULL;
strcpy(Tree->Name,"0");
MainMenu(Tree);//显示主菜单
}
//添加新的成员
void AddNew(TreeNode * Tree)
{
SubMenue2(Tree);//添加新成员界面
}
//显示添加家庭信息的界面
void SubMenue2(TreeNode *Tree)
{
char c;
int num;
char name[20];
TreeNode * NewNode;
getchar();
while(1)
{
system("cls");
printf("请选择你的操作\n");
printf("A:添加某个人的子女的信息\n"); printf("B:添加某个人配偶的信息\n"); printf("C:退出\n");
printf("请选择相应功能:\n");
c=getchar();
switch(c)
{
case 'A': //添加子女信息
printf("请输入那个人的名字:\n");
scanf("%s",name);
Tree=SearchTree(Tree,name,20);//在家谱里查找这个人
if(Tree==NULL)
{
printf("该家谱图中没有%s这个人的信息请确认是否输入错误\n",name);
break;
}
if(Tree->Parent==NULL&&Tree->NextNode[0]==NULL||Tree-
>Parent!=NULL&&Tree->N
ame!=Tree->Parent->NextNode[0]->Name)
{
printf("至今还没有配偶请先添加配偶\n",Tree->Name); break;
}
if(Tree->Parent==NULL&&(Tree->Num>20||Tree->Num<0))。