家谱管理系统(含源代码)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
家谱管理系统——C语言(数据结构)
目的和要求:树形结构是一种非常重要的非线性结构,它用于描述数据元素之间的层次关系,人类家谱是树形结构的典型体现,通过此项训练让学生掌握树形结构的知识;使学生重点掌握树与二叉树的转换,二叉树的存储和遍历,和二叉树相关的一些运算;要求完成家谱信息的录入和保存,任意成员的查找及某一成员祖先、子孙、兄弟、堂兄弟的查找。
排答疑和辅导。
完整代码:
#include
#include
#include
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))
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||T ree->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();
getchar();