家谱地设计与实现_第1页
家谱地设计与实现_第2页
家谱地设计与实现_第3页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、家谱的设计与实现(树,查找)家谱的设计主要是实现对家庭成员信息的建立、查找、插入、修改、删除等功能。可。基本功能如下:(1)家谱中每个成员的信息包括:姓名、性别。( 2)家谱祖先数据的录入(树的根结点) 。( 3)家庭成员的添加:即添加某人的儿女(包括姓名和性别) ,儿女的数目由控制台端 给出,然后输入相应的儿女姓名和性别(此处所有儿女的 姓名不能重名) 。( 4 )家庭成员的修改:可以修改某一成员的姓名。( 5)家庭成员的查询:查询某一成员在家族中的辈分(第几代) ,并能查询此成员的所有子女及这一辈的所有成员。(6)家庭成员的删除:删除此成员时,若其有后代,将删除其所有后代成员。#inclu

2、de <stdio.h>#include <malloc.h>#include <string>#include <stdlib.h>#define MAX 10typedef struct node /定义 data 存储结构char nameMAX; / 姓名char sex; / 性别int generation;/ 代目node;typedef struct ftstruct node l;struct ft *brother;/ 创建结构体/ 家谱中直系家属用来指向兄弟用来指向孩子ft *root;/root 是结构体 ft 的指针st

3、ruct ft *child;/ ft;/ 搜索指针函数ft *search(ft *p,char ch)ft *q;if(p=NULL)return NULL;/ 没有家谱,头指针下为空if(strcmpi(p->,ch)=0)return p;/ 家谱不为空,头指针下有这个人if(p->brother)q=search(p->brother,ch);/ 在兄弟中找if(q)return q;/ 找到if(p->child)q=search(p->child,ch);/ 在孩子中找if(q!=NULL)return q;return NULL;/ 没

4、有找到ft *parent(ft *p,ft *q,int *flag)/ 通过 parent 函数得到双亲结点。用 flag 标志, -1为左孩子, 1 为右孩子if(p=NULL)return NULL;/ 没有家谱,头指针下为空if(p->child=NULL)flag=0;return NULL;elseif(p->brother=q)*flag=1;return p;elseif(p->child=q)*flag=-1;return p;elseif(p->brother!=NULL)parent(p->brother,q,*&flag);if(

5、p->child!=NULL)parent(p->child,q,*&flag);int generation(ft *p,char ch)ft *q;if(p=NULL) return NULL;if(strcmpi(p->,ch)=0)这个人/ 获得搜索到的成员的代目的返回值return p->l.generation;/ 家谱不为空,头指针下有if(p->brother)q=search(p->brother,ch);/在兄弟中找if(q) return q->l.generation;/ 找到if(p->child)q

6、=search(p->child,ch);/ 在孩子中找return NULL;void saves(ft *p,char b,char c,int d)/建立家谱孩子结点 创建结点并对 l 赋值 保存for(int i=0;i<MAX;i+)p->i=bi;p->l.sex=c;p->l.generation=d;void disp(ft *n) / 搜索到数据的输出ft *t=NULL;printf(" 此 人 姓 名 :%s 性 别 %c 为 第 %d 代 n",n->,n->l.sex,n->l

7、.generation);printf("n");printf(" 此人的子女 :"); / 子女输出printf(" 此人无子女 !");elseif(n->child->brother=NULL)printf(" 姓名 :%s性别 :%ct",n->child->,n->child->l.sex);elseprintf(" 姓名 :%s性别 :%ct",n->child->,n->child->l.sex);

8、t=n->child->brother;while(t!=NULL)printf(" 姓名 :%s 性别 :%ct",t->,t->l.sex); t=t->brother;printf("n");printf("n");printf(" 此人的同辈成员 :"); / 同辈输出printf(" 此人无同辈成员 !");elseif(n->brother->brother=NULL)printf(" 姓名 :%s 性别 :%ct&qu

9、ot;,n->brother->,n->brother->l.sex);elseprintf(" 姓 名 :%s 性 另 U :%ct", n->brother->l. name ,n->brother->l.sex);t=n->brother->brother;while(t!=NULL)printf(" 姓名 :%s 性另 :%ct",t->,t->l.sex); t=t->brother;printf("n");void Ini

10、tTree()/ 初始化char bMAX,c;int a;printf(" 请输入始祖的姓名 性别 :");free(root); / 释放 root ( ft ) 空间root=(ft *)malloc(sizeof(ft); /创建一个 ft 结构体大小的空间 然后强制转换为 ft *类型的指针 然后赋值给 root / 这时 root 指向一 个 struct dictree 结构体大小的新空间scanf("%s %c",&b,&c);a=1;/ 输入姓名,性别root->child=NULL; / 清空左右孩子root-&

11、gt;brother=NULL;saves(root,b,c,a);/ 存入结构printf(" 家谱重构成功 !n");void Manu()printf("*n");printf("* 请选择对家谱的操作 : *n");printf("*0. 退出*n");printf("*1.添加*n");printf("*2.查找*n");printf("*3.修改*n");printf("*4.删除*n");printf("*5.重

12、构*n");printf("*n");void Add() / 添加ft *n,*m,*t=NULL;char bMAX,c,dMAX;int i;printf(" 请输入要添加子女的上一辈的姓名 :n");/ 判断是否有重名 scanf("%s",&d);n=search(root,d);int a=generation(root,d);while(n=NULL)printf(" 此人不在家谱内 ,请重新输入姓名 :n");scanf("%s",&d);n=searc

13、h(root,d);/ 孩子信息添加if(n->child=NULL)printf(" 孩子姓名与性别输入 :n");scanf("%s %c",&b,&c);a+;m=search(root,b);if(m!=NULL)printf(" 出现重名,添加失败 !n");elsen->child=(ft *)malloc(sizeof(ft); n->child->brother=NULL; n->child->child=NULL; saves(n->child,b,c,a);

14、elsen=n->child;while(n->brother!=NULL)n=n->brother;printf(" 孩子姓名与性别输入 :n");scanf("%s %c",&b,&c);a+;m=search(root,b);!n");if(m!=NULL) printf(" 出现重名,添加失败elset=(ft *)malloc(sizeof(ft);saves(t,b,c,a);t->brother=NULL;t->child=NULL;n->brother=t;void

15、Search() / 查询ft *n;char dMAX;printf(" 输入姓名,查找相关信息 :n"scanf("%s",&d);n=search(root,d);while(n=NULL):n");printf(" 此人不存在,请再次输入scanf("%s",&d);n=search(root,d);disp(n);void Change()/ 修改char aMAX,rMAX,c;ft *n;printf(" 请输入要修改人的姓名 :");scanf("%s&

16、quot;,&a);n=search(root,a);while(n=NULL)printf(" 此人不存在 ,请重新输入姓名 :n");scanf("%s",&a);n=search(root,a);printf(" 此人存在,请输入新信息 :");scanf("%s %c",&r,&c);for(int i=0;i<MAX;i+)n->i=ri;n->l.sex=c;void Del() / 删除ft *n,*m;int flag;char dMAX

17、,aMAX;printf(" 请输入要删除人的姓名 :");scanf("%s",a);n=search(root,a);while(n=NULL)printf(" 此人不存在 ,请重新输入姓名 :n"); scanf("%s",&a);n=search(root,a);printf("n");printf(" 此人已找到 !n");printf("n");if(flag>0)删除成功 !n"); m->brother=n->brother;printf("else if(flag<0) m->child=n->brother; printf(" 删除成功 !n"); int main

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论