在只考虑直系亲属并且只考虑四代以内亲属的情况下,一个家族的族谱实际上就是一个倒立的二叉树。
我们的任务是:
1.利用树状结构保存4代家庭直系亲属;
2.能够利用程序计算任意两个家庭成员之间的关系,并给出正式名称;
能够采取合适的格式输出全部家谱树信息
这样问题就变得简单了起来

利用二叉树来进行存储,之后查找到输入两人所在树的层数便可得到两人辈分大小,再利用特定函数将以这二人为根节点的子树挖出来,在辈分低的树上对辈分高的结点进行编码,根据对应编码表便可得到两人关系。

#include<stdio.h>
#include<stdlib.h>
#include<queue>
#include<stack>
#include<iostream>
#include<algorithm>
using namespace std;
char q[10];
typedef struct tree
{char name[20];tree *left;tree *right;
}tree;
struct wenjian
{char a[20];
}d[50];
void guodu(wenjian d[50])
{FILE *fp;int i=0;if((fp=fopen("D:\\name123.txt","r"))==NULL){printf("FILE open error");exit(0);}while(!feof(fp)){fgets(d[i].a,50,fp)==NULLprintf("%s\n",d[i].a);i++;}fclose(fp);
}
tree *creattree(int &len,wenjain d[50])
{tree *T;T=(tree *)malloc(sizeof(tree));if(d[len].a[0]=='*')return NULL;else{strcpy(T->name,d[len].a);T->left=creattree(len+1,d);T->right=creattree(len+1,d);}return T;
}
void returnlevel(tree *T,char b[20],int s,int &flag)
{if(T){if(strcmp(T->name,b)==0)flag=s;returnlevel(T->left,b,s+1,flag);returnlevel(T->right,b,s+1,flag);}
}
void find(tree *T,char b[20],tree *&z)
{if(T){if(strcmp(T->name,b)==0){z=T;}find(T->left,b,z);find(T->right,b,z);}
}
void code(tree *t,tree *v,int len)
{static char a[10];if(strcmp(t->name,v->name)==0){for(int i=0;i<len;i++){q[i]=a[i];}}else{if(t->left!=NULL){a[len]='0';code(t->left,v,len+1);}if(t->right!=NULL){a[len]='1';code(t->right,v,len+1);}}}
void prints(tree *T)
{if(T){printf("%s ",T->name);prints(T->left);prints(T->right);}
}
void print(tree *T,char b[20],char c[20])
{for(int i=0;i<20;i++)q[i]=0;int x=-1,y=-1;tree *m,*n;m=(tree *)malloc(sizeof(tree));n=(tree *)malloc(sizeof(tree));returnlevel(T,b,0,x);returnlevel(T,c,0,y);if(x==-1||y==-1)printf("error,您的输入有误请重新输入\n");find(T,b,m);find(T,c,n);if(x>y){code(n,m,0);if(strcmp(q,"0")==0)printf("%s是%s的父亲\n",b,c);if(strcmp(q,"00")==0)printf("%s是%s的爷爷\n",b,c);if(strcmp(q,"000")==0)printf("%s是%s的太爷爷\n",b,c);if(strcmp(q,"001")==0)printf("%s是%s的太奶奶\n",b,c);if(strcmp(q,"01")==0)printf("%s是%s的奶奶\n",b,c);if(strcmp(q,"010")==0)printf("%s是%s的外太爷爷\n",b,c);if(strcmp(q,"011")==0)printf("%s是%s的外太奶奶\n",b,c);if(strcmp(q,"1")==0)printf("%s是%s的母亲\n",b,c);if(strcmp(q,"10")==0)printf("%s是%s的姥爷\n",b,c);if(strcmp(q,"11")==0)printf("%s是%s的姥姥\n",b,c);if(strcmp(q,"100")==0)printf("%s是%s的太姥爷\n",b,c);if(strcmp(q,"101")==0)printf("%s是%s的太姥姥\n",b,c);if(strcmp(q,"110")==0)printf("%s是%s的外太姥爷\n",b,c);if(strcmp(q,"111")==0)printf("%s是%s的外太姥姥\n",b,c);}else if(x<y){code(m,n,0);if(strcmp(q,"0")==0)printf("%s是%s的父亲\n",c,b);if(strcmp(q,"00")==0)printf("%s是%s的爷爷\n",c,b);if(strcmp(q,"000")==0)printf("%s是%s的太爷爷\n",c,b);if(strcmp(q,"001")==0)printf("%s是%s的太奶奶\n",c,b);if(strcmp(q,"01")==0)printf("%s是%s的奶奶\n",c,b);if(strcmp(q,"010")==0)printf("%s是%s的外太爷爷\n",c,b);if(strcmp(q,"011")==0)printf("%s是%s的外太奶奶\n",c,b);if(strcmp(q,"1")==0)printf("%s是%s的母亲\n",c,b);if(strcmp(q,"10")==0)printf("%s是%s的姥爷\n",c,b);if(strcmp(q,"11")==0)printf("%s是%s的姥姥\n",c,b);if(strcmp(q,"100")==0)printf("%s是%s的太姥爷\n",c,b);if(strcmp(q,"101")==0)printf("%s是%s的太姥姥\n",c,b);if(strcmp(q,"110")==0)printf("%s是%s的外太姥爷\n",c,b);if(strcmp(q,"111")==0)printf("%s是%s的外太姥姥\n",c,b);}else{printf("本程序仅支持计算直系亲属关系,您的输入有误请重新进行输入\n");}
}
int main()
{printf("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");printf("++                                                        ++\n");printf("++                                                        ++\n");printf("++                 家庭成员关系计算器                     ++\n");printf("++                                                        ++\n");printf("++                                                        ++\n");printf("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");printf("++                   若想退出系统请按0                    ++\n");printf("           请输入您想查询的两个人,不分先后顺序             \n");tree *T;wenjian d[50];guodu(d);T=creattree(0,d);while(1){printf("           请输入您想查询的两个人,不分先后顺序             \n");char b[20],c[20];scanf("%s",b);if(b[0]=='0')break;scanf("%s",c);print(T,b,c);}return 0;
}
测试样例:王一 王二 王四 王八 * * 王九 * * 王五 王十 * * 王十一 * * 王三 王六 王十二 * * 王十三 * * 王七 王十四 * * 王十五 * *

C语言实现家族树的建立与操作相关推荐

  1. 赫夫曼树建立c语言源程序编译结果详细解释,哈夫曼树的建立与实现最终版(备份存档)...

    <哈夫曼树的建立与实现.doc>由会员分享,可免费在线阅读全文,更多与<哈夫曼树的建立与实现(最终版)>相关文档资源请在帮帮文库(www.woc88.com)数亿文档库存里搜索 ...

  2. C语言家族树管理系统

    C语言家族树管理系统 一.主要内容: 开发一个能够创建家族树,并能在文本显示模式下显示输出家族树的软件.设计并实现这样一个软件主要是锻炼学生通过数据结构课程设计,进一步熟悉树.查找.多维数组.文件读写 ...

  3. 数据结构c语言版胡学刚答案,哈夫曼树的建立与实现(最终版)最新版

    <哈夫曼树的建立与实现.doc>由会员分享,可免费在线阅读全文,更多与<哈夫曼树的建立与实现(最终版)>相关文档资源请在帮帮文库(www.woc88.com)数亿文档库存里搜索 ...

  4. 数据结构源码笔记(C语言):索引文件建立和查找

    //实现索引文件建立和查找算法#include<stdio.h> #include<malloc.h> #include<string.h> #include< ...

  5. 深夜爆肝:万字长文3种语言实现Huffman树(强烈建议三连)

    文章目录 一.C语言能干大事 1. C语言下Huffman树的计算过程分析 2. C语言下Huffman树的编程 二.C#语言也不赖 1. C#下Huffman类的设计 2. C#中界面设计 3. 建 ...

  6. 【数据结构(C语言)】数据结构-树

    树 文章目录 树 一.基本概念 1.树的定义 2.树的节点 3.树的性质 4.基本操作 二.二叉树 1.二叉树的特点 2.特殊二叉树 3.性质 4.存储结构 (1)二叉链表 (2)三叉链表 5.线索化 ...

  7. 用python写家族树的基本事实

    课题 写出描述谓词 GrandChild. GreatGrandparent. Ancestor.Brother.Sister, Daughter.Son. FirstCousin.BrotherIn ...

  8. linux进程家族树,Linux内核 | 进程管理

    作者:世至其美 博客地址:hqber.com 转载须注明以上信息, 更多文章,请访问个人博客:hqber.com 1. 进程和线程 1.1 定义 进程是处于运行状态的程序和相关资源的总称,是资源分配的 ...

  9. 第五章-语法分析之抽象语法树的建立

    参考博文: (1)Java的运算符 前几章讲解了将Java源文件分解为Token序列,并且也介绍了组成抽象语法树的各个实现类,那么如何根据Token序列分析出具体的树节点并最终形成一棵抽象语法树是语法 ...

最新文章

  1. (二)深入浅出图解Git,入门到精通(保姆级教程)
  2. mysql 提交_MySQL 事务提交过程
  3. houxiurong.com 关于Tomcat7部署 一台机器部署两个项目,一个用域名访问,一个用IP访问...
  4. python onenet_使用Python2.7 POST 数据到 onenet 平台
  5. 剑指offer之【数组中的逆序对】
  6. 面码份量Java_JAVA语言(28道练习题)
  7. PX4 CMakeLists.txt 文件剖析
  8. python免费教程视频-Python免费视频教程
  9. Keepalived高可用(原理、安装、启动、单实例配置、双实例双主配置实战篇)
  10. 探寻中国便携式医疗电子市场的机遇与挑战
  11. 蓝牙耳机品牌哪个音质好佩戴舒适性?2023年蓝牙耳机盘点
  12. CSS 选择器(超级详细,欢迎补充)
  13. 手机技巧:苹果手机这8个实用小技巧
  14. 五种流行虚拟化桌面优缺点PK
  15. 2023前端求职经历回顾及面试题总结
  16. 大数据与AI时代,企业爆发之道?Tesra超算网络保驾护航!
  17. 论文参考文献中括号+数字转上标
  18. 【信息资源管理】第一章:信息资源管理基础
  19. What is Deep Learning?(什么是深度学习?)
  20. python实现猜数字游戏_python如何实现猜数字游戏

热门文章

  1. php中 act什么意思,剑网三act是什么意思?详解丐帮act概念
  2. 目标检测-VOC数据集txt文件制作方法
  3. java calendar计算时间差_Java Calendar 计算时间差
  4. 牛客网刷题记录 || 结构体和类
  5. 衡水二中高考2021成绩查询,衡水二中高考(衡水二中2020清北录取)
  6. 基础(待续)-弹群协同作战
  7. 一起谈.NET技术,.NET十年(上)
  8. 一个好的软件,除了给我们带来效率,更重要的是为我们带来了快乐!
  9. 自由职业需要我们知道什么呢?
  10. 华为服务器型号H22H-05,华为h22h05服务器配置