#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();

}

}

//修改某个人的信息

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)

{

case 'A':

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("本程序结束,欢迎下次使用。\n");

exit(0);

break;

case '\n':

break;

default:

printf("您输入错误,请重新输入。\n");

getchar();

break;

}

getchar();

}

}

//创建树

void CreatTree(TreeNode *Node)

{

int i;

TreeNode *NewNode;

NewNode=(TreeNode *)malloc(sizeof(TreeNode));

Node->NextNode[0]=NewNode;

// Node->NextNode[0]=NULL;

printf("请输入%s的子女的数目:\n",Node->Name);

scanf("%d",&(Node->Num));

printf("请输入%s的配偶的姓名:\n",Node->Name);

scanf("%s",NewNode->Name);

if((Node->Num)==0&&strcmp(NewNode->Name,"0")==0)

return ;

if (Node->Kind=='F'||Node->Kind=='f')//自动填写其配偶的性别

NewNode->Kind='M';

else

NewNode->Kind='F';

NewNode->Num=0;

NewNode->NextNode[0]=NULL;

Node->NextNode[0]=NewNode;

Node->NextNode[0]->Parent=Node;

for(i=1;i<=Node->Num;i++)

{

NewNode=(TreeNode *)malloc(sizeof(TreeNode));

printf("请输入%s的第%d子女的名字\n",Node->Name,i);

scanf("%s",NewNode->Name);

printf("请输入%s的第%d子女的性别女F男M:\n",Node->Name,i);

getchar();

scanf("%c",&NewNode->Kind);

NewNode->Num=0;

NewNode->Parent=Node;

Node->NextNode[i]=NewNode;

CreatTree(Node->NextNode[i]);

}

}

//遍历并输出树中的内容

void OutPutAll(TreeNode *Tree)

{

int i, flag=0;//flag记录节点的性别

printf("%s 性别:",Tree->Name);

if (Tree->Kind=='F'||Tree->Kind=='f')

{

flag=1;

printf("女\n");

}

else

printf("男\n");

if (!(Tree->NextNode[0]))

printf("至今没有配偶和子女\n");

return;

}

if(flag==1)//flag=1 表示性别为女

printf("丈夫的姓名:%s\n",Tree->NextNode[0]->Name);

else

printf("妻子的姓名:%s\n",Tree->NextNode[0]->Name);

for(i=1;i<=Tree->Num;i++)

{

printf("第%d个子女的姓名

别:",i,Tree->NextNode[i]->Name,Tree->NextNode[i]->Kind);

if (Tree->NextNode[i]->Kind=='F'||Tree->NextNode[i]->Kind=='f')

printf("女\n");

else

printf("男\n");

}

for(i=1;i<=Tree->Num;i++)

{

OutPutAll(Tree->NextNode[i]);

}

}

//在树中经过遍历查找某个人

TreeNode * SearchTree(TreeNode *Tree,char name[],int length)

{

int i;

TreeNode *NewNode;

if(strcmp(Tree->Name,name)==0)

{

if(length==0)

MATEFLAG=1;

else

MATEFLAG=0;

return Tree;

}

if(Tree->NextNode[0]==NULL)

return NULL;

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)

return NewNode;

}

return NULL;

}

//输出已经查找到的人的信息

void OutPutMessage(TreeNode * Tree,char name[],int length)

{

int flag=0,i;//flag标记性别

TreeNode *NewNode;

if(Tree==NULL)

{

printf("该家谱图中没有%s这个人\n",name);

return;

}

printf("您找的人信息如下:\n");

printf("%s 性别:",name);

if (Tree->Kind=='F'||Tree->Kind=='f')

{

flag=1; //标记的性别 printf("女\n");

}

else

printf("男\n");

NewNode=Tree->Parent;//父母信息放到NewNode里

if (MATEFLAG==1)//此人为这家人的伴侣

{

if(flag==1)//性别为女

{

printf("她是嫁入这家的,所以父母信息不在家谱内包括\n");

printf("丈夫的姓名:%s\n",NewNode->Name);

}

else //性别为男

{

printf("他是入赘这家的所以父母信息不在家谱内包括\n");

printf("妻子的姓名:%s\n",NewNode->Name);

}

if ((NewNode->Num)>0) //判断他(她)是否有孩子 {

printf("孩子的信息如下:\n"); //输出他(她)的孩子的信息 for(i=1;i<=NewNode->Num;i++)

{

printf("%s 性别:",NewNode->NextNode[i]->Name);

if (NewNode->NextNode[i]->Kind=='F'||NewNode->Kind=='f') printf("女\n");

else

printf("男\n");

}

}

return;

}

if(NewNode==NULL) //判断它是不是根节点如果是的话就没有父母兄弟信息

printf("是这个家谱图里最顶端的人!\n",name);

else

{

if (NewNode->Kind=='F'||NewNode->Kind=='f') //判断父亲节点是父亲还是母亲

{ //输出他(她)的父母亲的信息

printf("母亲的姓名:%s\n",NewNode->Name);

printf("父亲的姓名:%s\n",NewNode->NextNode[0]->Name);

}

else

{

printf("母亲的姓名:%s\n",NewNode->NextNode[0]->Name);

printf("父亲的姓名:%s\n",NewNode->Name);

}

if (NewNode->Num>1) //判断他(她)是否有兄弟姐妹

{ //输出他(她)的兄弟姐妹的信息

printf("%s的兄弟姐妹信息如下:\n",name);

for(i=1;i<=NewNode->Num;i++)

{

if(NewNode->NextNode[i])

printf("%s 性别:",NewNode->NextNode[i]->Name,NewNode->NextNode[i]->Name);

if (NewNode->NextNode[i]->Kind=='F'||Tree->Kind=='f')

printf("女\n");

else

printf("男\n");

}

}

else

printf("%s没有兄弟姐妹!\n",Tree->Name);

}

if(Tree->NextNode[0]!=NULL) //判断他(她)是否有配偶 { //输出他(她)的配偶的信息

if(flag==1)

printf("丈夫的姓名:%s",Tree->NextNode[0]->Name);

else

printf("妻子的姓名:%s",Tree->NextNode[0]->Name);

if (Tree->Num>0) //判断他(她)是否有孩子 {

printf("孩子的信息如下:\n"); //输出他(她)的孩子的信息 for(i=1;i<=Tree->Num;i++)

{

printf("%s 性别:",Tree->NextNode[i]->Name);

if (Tree->NextNode[i]->Kind=='F'||Tree->Kind=='f')

printf("女\n");

else

printf("男\n");

}

}

else

printf("%s至今还没有孩子\n",name);

}

else

printf("%s至今还没有配偶和孩子\n",Tree->Name);

}

家谱管理系统php,家谱管理系统(含源代码).docx相关推荐

  1. 家族查询系统c语言源程序,家谱管理系统(含源代码).docx

    家谱管理系统(含源代码) 家谱管理系统--C语言(数据结构)目的和要求:树形结构是一种非常重要的非线性结构,它用于描述数据元素之间的层次关系,人类家谱是树形结构的典型体现,通过此项训练让学生掌握树形结 ...

  2. 学生管理系统c语言代码实验报告,C语言学生信息管理系统实验报告(含源代码).doc...

    实 验 四:结构体 实验目的: 1.更加灵活的使用数组作为函数参数: 2.初步掌握开发一个小型实用系统的基本方法: 3.初步掌握书写程序设计开发文档的能力. 实验内容: 程序一:学生信息管理系统 编写 ...

  3. 家谱管理系统的设计与实现.c(含源代码)

    1.问题描述: 家谱管理系统是一个可以记录家族成员信息.家谱关系的系统.使用C语言可以实现一个基本的家谱管理系统,可以包括以下功能: 实现对某家族成员信息的管理,包含建立.查找.插入.修改.删除等功能 ...

  4. 学生成绩管理系统html代码,学生成绩管理系统(含源代码)30.doc

    学生成绩管理系统(含源代码)30 西安邮电学院 高级语言课程设计报告 题 目: 学 生 成 绩 管 理 系 统 系部名称 : 电子信息与工程系 专业名称 : 电子科学与技术 班 级 : 科技0701 ...

  5. java 家谱管理系统_家谱管理系统

    [实例简介] 用JAVA写了一个简易的家谱管理系统,里面有所有的实现代码与过程 [实例截图] [核心代码] 家谱管理系统 ├── JM │   └── MyJob │   ├── Bookface.j ...

  6. 西柏办公用品管理系统(含源代码)

    原文地址:http://www.ceapet.com/topic22.html 基于浏览器的多用户网络版办公用品管理系统,支持物品管理.库存期间管理.库存月结.库存事务管理.安全库存管理,提供库存数量 ...

  7. 基于java,swing图书管理系统源码下载(含数据库脚本) 附下载

    资源简介 1.执行数据库脚本文件 生成数据库 2. 修改  ibraryManager\src\com\wsy\dao\DAO.java 文件中的 数据库密码为你本机 3. 运行该程序后,输入 账号: ...

  8. 校运动会c语言程序编写,校运动会管理系统报告C语言(含完整代码)

    <校运动会管理系统报告C语言(含完整代码)>由会员分享,可在线阅读,更多相关<校运动会管理系统报告C语言(含完整代码)(20页珍藏版)>请在人人文库网上搜索. 1.目 录陈一. ...

  9. 宾馆管理系统mysql_宾馆管理系统(含源码和数据库文件)

    [实例简介] 因毕业设计而开发的一个C/S模式下的宾馆管理系统.开发环境为VS2010,SQL2005,开发语言为C#.资源中包含源代码和数据库文件(sql2005的mdf数据库文件).使用时需要安装 ...

最新文章

  1. delphi 数据 上移 下移_脑图-数据库查询优化器的艺术
  2. 怎样写出无法维护的代码
  3. 用户态/内核态、用户栈/内核栈
  4. hyperworks2018安装教程
  5. cad指定服务器名称,配置网络许可服务器 | AutoCAD 2022 | Autodesk Knowledge Network
  6. 浮点数的运算精度丢失
  7. 一个深度学习痴呆选手对AlexNet网络架构的一些理解
  8. VirtualBox中的虚拟网络环境设置
  9. Egret Wing 项目结构
  10. wo-27s管理员账户和密码_某数据监测与分析系统可被撞库出登录密码
  11. 《算法竞赛入门经典》(第二版)代码及详细解释(持续更新!)
  12. qlist 嵌套_QList内存释放
  13. 线程经典实例——吃苹果问题
  14. 如何将Mac磁盘映像转换为其他格式?
  15. 蓝桥杯练习系统-基础练习34道题解答答案全汇总(c/c++)
  16. 显示器 RUIGE瑞鸽高清显示器TL-S1700HD
  17. Freemarker模板框架页面css样式等不起效
  18. zabbix系列:修改默认的snmp端口161
  19. 闭环管理中断裂的一环
  20. 熊工巧匠 | Boxes.py 之小白也能学会的激光切割创意盒子玩法

热门文章

  1. 【数据结构初阶】:栈和队列的实现(用C语言实现,附图详解和附源码)
  2. PS制作android图标
  3. 提高团队成员的工作积极性/团队凝聚力
  4. 学习使用php实现生成模糊图片的方法类整理
  5. 福田中心区文化馆航拍看楼体全景VR解读
  6. Hazelcast Jet Processor
  7. 【JS基础】JavaScript中的void 0
  8. 红帽子系统如何安装到服务器,Redhat(红帽子)安装使用及服务器应用FAQ.doc
  9. 为什么转置512x512矩阵,会比513x513矩阵慢很多?
  10. Linux下通过已连上无线的真机使虚拟机可上网