admin管理员组文章数量:1565772
2024年2月29日发(作者:)
家谱管理系统一一C语言(数据结构)
目的和要求:树形结构是一种非常重要的非线性结构,它用于描述数据元素之间的层次关系,人类家谱是树形结构的典型体现,通过此项训练让学生掌握树形结构的知识;使学生重点掌握树与二叉树的转换,二叉树的存储和遍历,和二叉树相关的一些运算;要求完成家谱信息的录入和保存,任意成员的查找及某一成员祖先、子孙、兄弟、堂兄弟的查找。
排答疑和辅导。
完整代码:
#include
#include
#include
intMATEFLAG=0;//是否入赘或嫁入这家的,1表示为是,0表示否
typedefstructTreeNode//树节点定义
{
intNum;//保存此人儿女个数
charName[20];//保存此人姓名
charKind;〃保存此人性别,男M,女F
structTreeNode*NextNode[20];〃保存此人的儿女,NextNode[0]里存放配偶的地址
structTreeNode*Parent;//保存此节点的父节点
}TreeNode;
voidCreatTree(TreeNode*Tree);〃创建树
voidOutPutAII(TreeNode*Tree);//输出树
TreeNode*SearchTree(TreeNode*Tree,charname[],intlength);
voidMainMenu(TreeNode*Tree);
voidSubMenue1(TreeNode*Tree);
voidSubMenue2(TreeNode*Tree);
voidChange(TreeNode*Tree);
voidAddNew(TreeNode*Tree);
voidOutPutMessage(TreeNode*Tree,charname[],intIength);
//主函数
voidmain()
{
TreeNode*Tree;//产生根节点
Tree=(TreeNode*)maIIoc(sizeof(TreeNode));
Tree->Parent=NULL;
MainMenu(Tree);//显示主菜单
}
//添加新的成员
voidAddNew(TreeNode*Tree)
{
SubMenue2(Tree);〃添加新成员界面
}
//显示添加家庭信息的界面
voidSubMenue2(TreeNode*Tree)
{
charc;
intnum;
charname[20];
TreeNode*NewNode;getchar();
while(1)
{
请选择你的操作添加某个人的子女的信息添加某个人配偶的信息退出
请选择相应功能:
c=getchar();
switch(c)
{
case'A'://添加子女信息请输入那个人的名字
Tree=SearchTree(Tree,name,20);〃在家谱里查找这个人if(Tree==NULL)
{
该家谱图中没有%$这个人的信息请确认是否输入错误
break;
}
if(Tree->Parent==NULL&&Tree->NextNode[0]==NULL||Tree->Parent!=NULL&&Tree->Name!=Tree->Parent->NextNode[0]->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));请输入添加人员姓名
请输入添加人员性别女F男
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;
子女的信息添加成功
break;
case'B':
请输入那个人的名字
Tree=SearchTree(Tree,name,20);
if(Tree->Parent!=NULL&&strcmp(Tree->Name,Tree->Parent->NextNode[0]->Name)==0||Tree->NextNode[0]!=NULL)
{
已经有了配偶
break;
}
if(Tree==NULL)
{
该家谱图中没有%$这个人的信息请确认
break;
}
NewNode=(TreeNode*)malloc(sizeof(TreeNode));
请输入添加人员姓名
请输入添加人员性别女F男
NewNode->Parent=Tree;
Tree->NextNode[0]=NewNode;
break;
case'C':
本项服务到此结束
break;
case'':
break;
default:
对不起!你的选择错误
break;
}
if(c=='C'||c=='c')
break;
请按Enter键继续操作
getchar();
getchar();
}
}
//修改某个人的信息
voidChange(TreeNode*Tree)
{
charname[20];
TreeNode*NewNode;请输入你要修改的人的信息
NewNode=SearchTree(Tree,name,20);if(NewNode==NULL)
{
该家谱图中没有%$这个人的信息请确认是否输入错误
return;
}
else
{
SubMenue1(NewNode);
}
}
//输出副菜单
voidSubMenue1(TreeNode*Tree)
{
charc;
intflag,i;
charname[20];
charParent[2][20];
TreeNode*NewNode;getchar();
while(1)
{
请选择你的操作
修改个人的信息
修改父母的信息修改兄弟姐妹的信息修改子女的信息修改配偶的信息退出
c=getchar();
switch(c)
{
case'A':
请输入修改的姓名:如果不需要修改就输入'0'然后按Enter键继续
Tree->NextNode[i]->Kind='M';
elseTree->NextNode[i]->Kind='F';
}
}子女的信息修改成功
break;
case'E':
if(Tree->Parent!=NULL)
{
if
(Tree->NextNode[0]==NULL&&strcmp(Tree->Name,Tree->Parent->NextNode[0]->Name)!=0)
{
至今还没有配偶
break;
}
if(strcmp(Tree->Name,Tree->Parent->NextNode[0]->Name)==0)
{
请输入%$修改的姓名:如果不需要修改就输入'0'然后按
Enter键继续
strcpy(Tree->Parent->Name,name);
}
else
{
请输入%$修改的姓名:如果不需要修改就输入'0'然后按
Enter键继续
strcpy(Tree->NextNode[0]->Name,name);
}
}
else
{
if(Tree->NextNode[0]==NULL)
至今还没有配偶
else
{
请输入%$修改的姓名:如果不需要修改就输入'0'然后按
Enter键继续
strcpy(Tree->NextNode[0]->Name,name);}
配偶的信息修改成功
break;
case'F':本项服务到此结束
break;
case'':
break;
default:
对不起!你的选择错误
break;
}
if(c=='F'||c=='f')
break;
请按Enter键继续操作
getchar();
getchar();
}
}
//输出主菜单
voidMainMenu(TreeNode*Tree)
{
charc;〃用于接受用户输入的选项
charname[20];
while(1)
{
清屏
★★★★★★★★★★★★★欢迎进入家谱管理系统^★★★★★★★★
★★
♦♦菜单♦♦
输入家谱信息
查找家族成员
添加家族成员
输出家谱信息
修改成员信息退出
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
请选择相应的功能:
c=getchar();
switch(c)
{
caseT:TreeNode*NewNode;NewNode=(TreeNode*)malloc(sizeof(TreeNode));//建立新节点请输入姓名给节点姓名赋值请输入性别(女F,男if(flag==1)//flag=1表示性别为女
丈夫的姓名
else
妻子的姓名
for(i=1;i<=Tree->Num;i++)
{
第%4个子女的姓名
别
if(Tree->NextNode[i]->Kind=='F'||Tree->NextNode[i]->Kind=='f')
女
else
男
}for(i=1;i<=Tree->Num;i++)
{
OutPutAll(Tree->NextNode[i]);
}
}//在树中经过遍历查TreeNode*SearchTree(TreeNode*Tree,charname[],intlength){inti;
TreeNode*NewNode;if(strcmp(Tree->Name,name)==0){
if(length==0)
MATEFLAG=1;
else
MATEFLAG=0;
找某个人
returnTree;
}if(Tree->NextNode[0]==NULL)returnNULL;
for(i=0;i<=Tree->Num;i++):%s性
if(i==0)NewNode=SearchTree(Tree->NextNode[i],name,0);
else
NewNode=SearchTree(Tree->NextNode[i],name,20);
if(NewNode!=NULL)
returnNewNode;
}
returnNULL;
}//输出已经查找到的人的信息
voidOutPutMessage(TreeNode*Tree,charname[],intlength)
{
intflag=0,i;//flag标记性别
TreeNode*NewNode;
if(Tree==NULL)
{
该家谱图中没有%s这个人
return;
}
您找的人信息如下
性别
if(Tree->Kind=='F'||Tree->Kind=='f')
{
flag=1;//标记的性别女
}
else
男
NewNode=Tree->Parent;〃父母信息放到NewNode里
if(MATEFLAG==1)〃此人为这家人的伴侣
{
if(flag==1)〃性别为女
{
她是嫁入这家的,所以父母信息不在家谱内包括丈夫的姓名
}
else//性别为男
{
他是入赘这家的所以父母信息不在家谱内包括妻子的姓名
}
if((NewNode->Num)>0)//判断他(她)是否有孩子{
孩子的信息如下//输出他(她)的孩子的信息for(i=1;i<=NewNode-
>Num;i++)
{
性别
女
else
男
}
}
return;
}
if(NewNode==NULL)//判断它是不是根节点如果是的话就没有父母兄弟信息
是这个家谱图里最顶端的人
else{
if(NewNode->Kind=='F'||NewNode->Kind=='f')//判断父亲节点是父亲还是母亲{//输出他(她)的父母亲的信息
母亲的姓名
父亲的姓名
}
else
{
母亲的姓名
父亲的姓名
}
if(NewNode->Num>1)//判断他(她)是否有兄弟姐妹
{//输出他(她)的兄弟姐妹的信息
的兄弟姐妹信息如下
for(i=1;i<=NewNode->Num;i++)
{if(NewNode->NextNode[i])
性别
if(NewNode->NextNode[i]->Kind=='F'||Tree->Kind=='f')女
else
男
}
}
else
没有兄弟姐妹
}
if(Tree->NextNode[0]!=NULL)
//判断他(她)是否有配偶{
(她
)的配偶的信息if(flag==1)
丈夫的姓名
else
妻子的姓名
//判断他(她)是否有孩子{if(Tree->Num>0)
输出他(她)的孩子的信息
孩子的信息如下
{
if(Tree->NextNode[i]->Kind=='F'||Tree->Kind=='f')性别
女
else
else
至今还没有孩子
}
else
至今还没有配偶和孩子
}
//输出他
for(i=1;i<=Tree->Num;i++)
版权声明:本文标题:家谱管理系统(含源代码) 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/xitong/1709191584a221758.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论