admin管理员组

文章数量:1532357

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++)

本文标签: 信息输入家谱