文章目录

  • head.h
  • family.cpp
  • main.cpp

head.h

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#ifndef FAMILY_H_INCLUDED
#define MAXSIZE 100#define FAMILY_H_INCLUDED
typedef struct Infomation{char name[20];char birth[20];int wedding;char add[20];int health;char death_date[20];
}Info;
//结构体
typedef struct node
{Info person;struct node *lchild,*rchild;
}Bnode,*tree;
typedef struct mode
{tree queue[MAXSIZE];int front,rear;
}Queue;void init(Queue Q);
void push(Queue *Q,tree e);
void pop(Queue *Q,tree *e);
int empty(Queue Q);
int full(Queue Q);
void newleft(tree p,Info L);
void newright(tree p,Info L);
tree creat();
void output(tree p);
void level(tree p);
void shownumlevel(tree p,int n);
tree parent(tree bt,tree p);
tree searchname(tree bt,char na[]);
void searchchild(tree p,tree child[]);
tree searchbirth(tree bt,char bir[]);
int samefather(tree bt,tree p,tree q);
void relationship(tree bt);
void add(tree *bt);
void deletename(tree *bt);
void showfamily(tree bt);
void update(tree *bt);
void transport(tree bt);
void menu();#endif

family.cpp


#include <stdio.h>
#include <stdlib.h>
#include<math.h>
#include<string.h>
#define MAXSIZE 100
#include "head.h"
using namespace std;
template<class T>//模板
T fun(T x)
{if(x!=2)throw x;elsereturn x;
}
void init(Queue Q)
{Q.front=Q.rear=0;
}void push(Queue *Q,tree e)//入队
{Q->rear=(Q->rear+1)%MAXSIZE;Q->queue[Q->front]=e;
}void pop(Queue *Q,tree *e)//出队
{Q->front=(Q->front+1)%MAXSIZE;*e=Q->queue[Q->front];
}int empty(Queue Q)//判队空
{if(Q.front==Q.rear)return 1;else return 0;
}
int full(Queue Q)//判队满
{if((Q.rear+1)%MAXSIZE==Q.front)return 1;else return 0;
}
void newleft(tree p,Info L)
{tree q;q=(tree)malloc(sizeof(Bnode));q->person=L;q->lchild=q->rchild=NULL;p->lchild=q;
}void newright(tree p,Info L)
{tree q;q=(tree)malloc(sizeof(Bnode));q->person=L;q->lchild=q->rchild=NULL;p->rchild=q;
}//打开文件操作
tree creat()
{FILE *fp;int i;Info human[11];if ((fp=fopen("E:/family.txt","r+"))==NULL){printf("不能打开家谱文件\n");}for(i=0;i<11;i++){fscanf(fp," %s %s %d %s %d",human[i].name,human[i].birth,&human[i].wedding,human[i].add,&human[i].health);fgets(human[i].death_date,20,fp);printf("%-7s%-15s%-7d%-12s%-10d%-20s\n",human[i].name,human[i].birth,human[i].wedding,human[i].add,human[i].health,human[i].death_date);}fclose(fp);tree bt;bt=(tree)malloc(sizeof(Bnode));bt->person=human[0];bt->lchild=bt->rchild=NULL;newleft(bt,human[1]);newright(bt,human[2]);newleft(bt->lchild,human[3]);newright(bt->lchild,human[4]);newleft(bt->rchild,human[5]);newright(bt->rchild,human[6]);newleft(bt->lchild->lchild,human[7]);newright(bt->lchild->lchild,human[8]);newleft(bt->rchild->rchild,human[9]);newright(bt->rchild->rchild->lchild,human[10]);return bt;
}void output(tree p)
{printf("%-7s%-15s%-7d%-12s%-10d%-20s\n",p->person.name,p->person.birth,p->person.wedding,p->person.add,p->person.health,p->person.death_date);}void level(tree p)
{tree q[20],s;int front=0,rear=0;printf(" 姓名   出生日期     婚否      地址      健在否       死亡日期\n");if(p){rear++;q[rear]=p;while(front!=rear){front=(front+1)%20;s=q[front];output(s);if((rear+1)%20!=front&&s->lchild!=NULL){rear=(rear+1)%20;q[rear]=s->lchild;}if((rear+1)%20!=front&&s->rchild!=NULL){rear=(rear+1)%20;q[rear]=s->rchild;}}}
}void shownumlevel(tree p,int n)
{static int d=0;d++;if(p){if(d==n){output(p);}shownumlevel(p->lchild,n);shownumlevel(p->rchild,n);}d--;
}tree parent(tree bt,tree p)
{tree lresult,rresult;if(!bt||bt==p)return NULL;if(bt->lchild==p||bt->rchild==p)return bt;else{lresult=parent(bt->lchild,p);rresult=parent(bt->rchild,p);return lresult?lresult:(rresult?rresult:NULL);}
}tree searchname(tree bt,char na[])
{tree lresult,rresult;if(!bt){return NULL;}if(strcmp(bt->person.name,na)==0)return bt;else{lresult=searchname(bt->lchild,na);rresult=searchname(bt->rchild,na);return lresult?lresult:(rresult?rresult:NULL);}
}void searchchild(tree p,tree child[])
{child[0]=child[1]=NULL;if(p->lchild!=NULL)child[0]=p->lchild;if(p->rchild!=NULL)child[1]=p->rchild;
}//case 6
//void search(tree bt)
//{//    char na[20];
//    tree Parent,node,child[2];
//    printf("请输入查找人姓名:\n");
//    scanf("%s",na);
//    node=searchname(bt,na);
//    Parent=parent(bt,node);
//    searchchild(node,child);
//    if(node==NULL)
//    {//        printf("查找失败\n");
//        return;
//    }
//    else
//    {//        printf("查找信息为:\n");
//        printf("姓名   出生日期     婚否      地址      健在否       死亡日期\n");
//        output(node);
//    }
//    if(Parent==NULL)
//    {//        printf("没有父亲\n");
//    }
//    else
//        {//            printf("他的父亲的信息为:\n");
//            output(Parent);
//        }
//    if(child[0]!=NULL)
//    {//        printf("他的孩子的信息为:\n");
//        output(child[0]);
//    }
//    if(child[1]!=NULL)
//    {//        printf("他的孩子的信息为:\n");
//        output(child[1]);
//    }
//    else
//    {//        printf("没有孩子\n");
//    }
//}tree searchbirth(tree bt,char bir[])
{tree lresult,rresult;if(!bt){return NULL;}if(strcmp(bt->person.birth,bir)==0)return bt;else{lresult=searchbirth(bt->lchild,bir);rresult=searchbirth(bt->rchild,bir);return lresult?lresult:(rresult?rresult:NULL);}
}
//case 7
//void outbirth(tree bt)
//{//    tree p;
//    char bir[20];
//    printf("请输入查找人生日:\n");
//    scanf("%s",bir);
//    p=searchbirth(bt,bir);
//    if(p==NULL)
//    {//        printf("查找失败\n");
//        return;
//    }
//    else
//    {//        printf("查找人信息为:\n");
//        printf("姓名   出生日期     婚否      地址      健在否       死亡日期\n");
//        output(p);
//    }
//
//}int samefather(tree bt,tree p,tree q)
{tree f1,f2;f1=parent(bt,p);f2=parent(bt,q);if(f1==f2){return 1;}else return 0;
}void relationship(tree bt)
{char name1[20],name2[20];tree s1,s2 ,f1,f2;printf("请输入第一个人姓名:\n");scanf("%s",name1);printf("请输入第二个人姓名:\n");scanf("%s",name2);s1=searchname(bt,name1);s2=searchname(bt,name2);f1=parent(bt,s1);f2=parent(bt,s2);if(samefather(bt,s1,s2)==1)printf("他们是亲兄弟\n");else if(samefather(bt,f1,f2)==1)printf("他们是堂兄弟\n");else if(s1->lchild==s2||s1->rchild==s2)printf("%s是%s的孩子\n",s2->person.name,s1->person.name);else if(s2->lchild==s1||s2->rchild==s1)printf("%s是%s的孩子\n",s1->person.name,s2->person.name);elseprintf("两个人关系太远了\n");
}void add(tree *bt)
{char na[20];tree p;Info newchild;printf("请输入拥有新孩子的父母的名字:\n");scanf("%s",na);p=searchname(*bt,na);if(p->lchild==NULL){printf("请输入新孩子的信息:\n");scanf("%s %s %d %s %d",newchild.name,newchild.birth,&newchild.wedding,newchild.add,&newchild.health);gets(newchild.death_date);newleft(p,newchild);}else if(p->rchild==NULL){printf("请输入新孩子的信息:\n");scanf("%s %s %d %s %d",newchild.name,newchild.birth,&newchild.wedding,newchild.add,&newchild.health);gets(newchild.death_date);newright(p,newchild);}else{printf("添加失败!\n");}
}void deletename(tree *bt)
{char na[20];tree p,f;printf("请输入想删除的人的姓名,删除之后他的后代也将一并删除!\n");scanf("%s",na);p=searchname(*bt,na);f=parent(*bt,p);if(f!=NULL){if(f->lchild==p){f->lchild=NULL;free(p);}if(f->rchild==p){f->rchild=NULL;free(p);}}else{*bt=NULL;}
}void showfamily(tree bt)
{if(bt!=NULL){printf("%s",bt->person.name);if(bt->lchild||bt->rchild){printf("(");showfamily(bt->lchild);if(bt->rchild){printf(",");}showfamily(bt->rchild);printf(")");}}
}void update(tree *bt)
{char na[20];tree p;printf("请输入你想修改的孩子的姓名:\n");scanf("%s",na);p=searchname(*bt,na);if(p==NULL){printf("修改失败\n");}else{printf("请输入修改后的信息: \n");scanf("%s%s%d%s%d",p->person.name,p->person.birth,&p->person.wedding,p->person.add,&p->person.health);gets(p->person.death_date);}}
char birthday[20][20];
int x=0;
void transport(tree bt)
{if(bt){// strcpy(birthday[x++],bt->person.birth);transport(bt->lchild);transport(bt->rchild);}
}void menu()
{printf("\n1.从文件读取家族信息并显示\n");printf("2.保存家族信息并存盘\n");printf("3.显示家谱图\n");printf("4.层次遍历家谱图\n");printf("5.显示第n代人的所有信息\n");printf("6.输入两人姓名,确定其关系\n");printf("7.给某成员添加孩子\n");printf("8.删除某成员(若其还有后代,则一并删除)\n");printf("9.修改某成员信息\n");printf("10.退出系统\n");
}

main.cpp

#include <stdio.h>
#include <stdlib.h>
#include<math.h>
#include<string.h>
#define MAXSIZE 100
#include "head.h"
#include "family.cpp"
using namespace std;
int main()
{tree bt;int i,n;FILE *fp;Info human[11];printf("欢迎来到家谱管理系统\n");menu();while(scanf("%d",&i)>0){switch(i){case 1:{//创建 bt=creat();transport(bt);menu();printf("\n请输入你的选择:\n");break;}case 2:{if ((fp=fopen("E:/family.txt","r+"))==NULL){printf("不能打开家谱文件\n");}for(i=0;i<11;i++){fscanf(fp," %s,%s,%d,%s,%d",human[i].name,human[i].birth,&human[i].wedding,human[i].add,&human[i].health);fgets(human[i].death_date,20,fp);}fclose(fp);menu();printf("\n请输入你的选择:\n");break;}case 3://显示家谱图 printf("(");showfamily(bt);printf(")\n");menu();printf("\n请输入你的选择:\n");break;case 4://层次 level(bt);menu();printf("\n请输入你的选择:\n");break;case 5:printf("你想找第几代的信息?\n");//n是你输入的 scanf("%d",&n);shownumlevel(bt,n);menu();printf("\n请输入你的选择:\n");break;
//         case 6:
//                search(bt);
//                menu();
//                printf("\n请输入你的选择:\n");
//                break;
//         case 7:
//                outbirth(bt);
//                menu();
//                printf("\n请输入你的选择:\n");
//                break;case 6:relationship(bt);menu();printf("\n请输入你的选择:\n");break;case 7:add(&bt);printf("(");showfamily(bt);printf(")\n");level(bt);menu();printf("\n请输入你的选择:\n");break;case 8:deletename(&bt);printf("(");showfamily(bt);printf(")\n");level(bt);menu();printf("\n 请输入你的选择:\n");break;case 9:update(&bt);
//                menu();
//                printf("\n请输入你的选择:\n");
//                break;
//                printf("(");showfamily(bt);printf(")\n");level(bt);menu();printf("\n请输入你的选择:\n");break;case 10:printf("感谢使用!\n");return 0;default:printf("输入错误,请重新输入:\n");menu();printf("\n请输入你的选择:\n");break;}}return 0;
}

C语言实现家谱管理系统相关推荐

  1. C语言家谱管理程序,C语言二叉树家谱管理系统.doc

    C语言二叉树家谱管理系统 摘 要 本文设计了一个对数据输入,输出,储存,查找的多功能软件,本文需要保存家族的基本信息,包括姓名及它们的关系,但是由于家族信息很巨大而且关系很复杂所以采用二叉树来表示它们 ...

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

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

  3. C语言版家谱管理系统

    代码如下: #define _CRT_SECURE_NO_WARNINGS 1 #pragma warning(disable:6031) #pragma warning(disable:6011) ...

  4. 用c语言如何以图形方式显示家谱,数据结构_家谱管理系统

    C语言 家谱管理系统 /*7.家谱管理系统 (4) 任务:实现具有下列功能的家谱管理系统 功能要求: 1). 输入文件以存放最初家谱中各成员的信息,成员的信息中均应包含以下内容: 姓名.出生日期.婚否 ...

  5. c语言二叉树族谱管理系统,数据结构课程设计报告(用二叉树实现家谱管理系统).doc...

    数据结构课程设计 题目:用二叉树实现家谱管理系统 姓名:郭志超 学号:031010151554042 完成日期:2005.7.3 一.需求分析 ??建立输入文件以存放最初家谱中各成员的信息. ??成员 ...

  6. 二叉树的应用:利用C语言编写简单的家谱管理系统

    /*采用树型结构实现如下系统功能: 1)输入文件以存放最初家谱中各成员的信息. 成员的信息中均应包含以下内容: 姓名.出生日期.婚否.地址.健在否.死亡日期(若其已死亡)也可附加其它信息.但不是必需的 ...

  7. C语言家谱管理程序,C语言实现家谱管理

    C语言上实现家谱管理系统 #include #include #include #include #define OK 1 #define ERROR -1 #define STACK_INIT_SI ...

  8. 家谱宗族网站源码_家谱管理系统(源代码)

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

  9. C语言家族谱管理系统

    C语言家族谱管理系统 1.家族谱建立 每个成员包含(姓名(关键字.不重复).性别.妻子.出生日期.死亡日期(可空)) 简化设计,使用二叉树表示,假定每个成员最多2个孩子 女儿的孩子不进家谱 2.家族谱 ...

最新文章

  1. 也许,这是东半球最叼的Java内存模型
  2. fiddler使用AutoResponder更改请求的返回结果
  3. Scala进阶之路-面向对象编程之类的成员详解
  4. python多级字典嵌套_python – 如何拆分字符串并形成多级嵌套字典?
  5. Android 解决: Failed to resolve: com.android.support:appcompat-v7:28.+ 错误
  6. Storm概念学习系列之storm的特性
  7. linux超级工具,linux运维超级工具--sysdig
  8. Web工程师必备的43款可视化工具
  9. 芯唐语音识别_大联大品佳推出基于新唐科技ISD9160+Cyberon算法的语音识别方案
  10. 分账和无协议商户数据有误的处理过程
  11. 计算机英语 TCP IP什意思,TCP/IP是什么意思?
  12. 蓝桥杯基础练习字母图形
  13. python中修饰器_python 中的修饰器
  14. 7、创建ROS msg和srv
  15. 凯利公式计算器安卓_华为MatePad Pro 5G评测:一屏双任务打破安卓平板生态限制...
  16. GIS案例学习笔记-多边形内部缓冲区地理模型
  17. 大型破碎设备之颚式破碎机简介
  18. 常用的表格正则验证 + 省份选择 JS JQ
  19. IDEA更改启动界面背景图片
  20. 条件概率,乘法定理,全概率公式

热门文章

  1. 计算机二级c语言小抄,2017年电大 全国计算机等级考试二级c语言题库新版小条小抄.doc...
  2. 编写一个菜单驱动程序的雏形。该程序显示一个提供4个选项的菜单——每个选项用一个字母标记。如果用户使用有效选项之外的字母进行响应,程序将提示用户输入一个有效的字母,直到用户这样做为止。
  3. 高中计算机水平测试成绩查询入口,高中学业水平测试成绩查询入口
  4. 1+3,U盘4分区也很简单
  5. 5G的哀伤,消费者追捧4G手机,5G手机销量暴跌
  6. qq空间html倒计时,用JavaScript做一个秒杀倒计时效果
  7. 七巧板图像识别 java_一种基于图像处理的七巧板图形识别方法.doc
  8. 汇编语言标志位:SF、CF、PF、AF、DF、ZF、TF、IF、OF
  9. Jmeter之HTTP请求详解
  10. 前端面试笔试题总结【持续更新~】