文章目录

  • 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. SQL优化的一些知识
  2. Egret之ProtoBuf(引用)
  3. c语言简单的模拟坐标,C语言模拟实现简单扫雷游戏
  4. Linux的Makefile简单实例教程
  5. Mac neo4j忘记密码,不删除数据处理方法
  6. flask导入flask-sqlalchemy的一个问题记录
  7. python深度学习介绍
  8. Gephi教程———数据输入
  9. tomcat版本号进行隐藏或者删除
  10. 客户端js 读取 json 数据
  11. 对抗学习在语义分割上应用
  12. 计算机无法识别ipad,ipad连接电脑没反应怎么办 ipad air连接电脑无法识别解决办法...
  13. GEE-Scholars MODIS地表温度LST时间变化趋势
  14. HARK学习(三)--文件格式
  15. 643 · 最长绝对文件路径
  16. Allegro PCB Design GXL (legacy) - 新建绘图(PCB),设置单位、坐标、栅格间距等参数
  17. 基于Arduino的草缸自动控制系统
  18. 怎么联系计算机管理员,自己家电脑怎么联系网络管理员啊~~!?
  19. 关于笔记本检测不到外接显示器的问题
  20. Chainge橙子钱包跨链技术介绍

热门文章

  1. Android涂鸦画板原理详解——从初级到高级(二)
  2. layUi框架入门篇(二)
  3. python如何做滑动平均
  4. latex调整itemize的间距大小
  5. 今天你买到票了吗 ——从铁道部12306 cn网站漫谈电子商务网站的 海量事务高速处理 系统
  6. 设置Cookie/使用Cookie
  7. Clickhouse Explain
  8. setInterval设置停止和循环 (实用)
  9. PHP多线程模拟秒杀抢单
  10. java持有对象-map-基本用法