家谱的实现与设计

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

课程设计报告

课程设计名称:数据结构课程设计系:三系

学生姓名:朱强

班级: 13软件

学号: 20130311227 成绩:

指导教师:刘杰

开课时间:2014-2015学年一学期

设计题目一:家谱的实现与设计

一、实习目的

通过学习,了解并初步掌握设计、实现较大系统的完整过程,包括系统分析、编码设计、编码集成以及调试分析,熟练掌握数据结构的选择、设计、实现、以及操作方法,为进一步的开发应用打好基础。

二、问题描述

家谱的设计主要是实现对家庭成员信息的建立、查找、插入、修改、删除等功能。可。基本功能如下:

(1)家谱祖先数据的录入(树的根结点)。

(2)家庭成员的添加:即添加某一人的儿女,儿女的数目由控制台端给出,然后输入相应的儿女姓名(此处儿女的姓名不能重名)。

(3)家庭成员的修改:可以修改某一成员的姓名。

(4)员的查询:查询某一成员在家族中的辈分(第几代),并能查询此成员的所有子女及这一辈的所有成员。

(5)家庭成员的删除:删除此成员时,若其有后代,将删除其所有后代成员。

三、需求分析

该程序所做的工作是对家族成员的的管理,为家族成员对各代成员的姓名,性别及子女情况的记录、查询提供方便。此程序规定:

1.在姓名录入时,姓名为10个字母以内的字符串;性别以M/F表示;

2.程序的输出信息主要为:输出家族成员在家族中的辈分(第几代),并能查询此成员的所有子女及这一辈的所有成员。

3.程序的功能主要包括:家谱祖先数据的录入、家庭成员的添加、家庭成员的修改、员的查询、家庭成员的删除;

四、概要设计

系统用到的数据有:

char name[MAX];

c har sex; /

i nt generation;

1)typedef struct node{ } //定义data存储结构

2)typedef struct ft{ } //创建结构体

3)ft *search(ft *p,char ch[]) // 搜索指针函数

4)ft *parent(ft *p,ft *q,int *flag) //通过parent函数得到双亲结点。

用flag标志,-1为左孩子,1为右孩子

5)int generation(ft *p,char ch[]) // 获得搜索到的成员的代目的返回值6)void saves(ft *p,char b[],char c,int d) //建立家谱孩子结点创建结点并对l赋值保存

7)void InitTree() //初始化

8)void Add() //添加

9)void Search() //查询

10)void Change() //修改

11)void Delete() //删除

12)int main() //主函数

各程序模块之间的调用关系:

主函数12)可以调用7)至11)。

五、详细设计

#include

#include

#include

#include

#define MAX 10

typedef struct node{ //定义data存储结构

c har name[MAX]; //姓名

c har sex; //性别

i nt generation;//代目

}node;

typedef struct ft{ //创建结构体

s truct node l; //家谱中直系家属

s truct ft *lchild;//用来指向兄弟

s truct ft *rchild;//用来指向孩子

}ft;

ft *root; //root是结构体ft的指针

ft *search(ft *p,char ch[]) // 搜索指针函数

{

f t *q;

i f(p==NULL)

return NULL;//没有家谱,头指针下为空

i f(strcmp(p->,ch)==0)

return p;//家谱不为空,头指针下有这个人

i f(p->lchild)

{

q=search(p->lchild,ch);//在兄弟中找

if(q)

return q;//找到

}

i f(p->rchild)

{

q=search(p->rchild,ch); //在孩子中找

if(q!=NULL)

return q;

}

return NULL;//没有找到

}

ft *parent(ft *p,ft *q,int *flag) //通过parent函数得到双亲结点。用flag 标志,-1为左孩子,1为右孩子

{

i f(p==NULL)

return NULL; //没有家谱,头指针下为空

i f(p->rchild==NULL)

{

*flag=0;

return NULL;

}

e lse

{

if(p->lchild==q)

{

*flag=1;

return p;

}

else

{

if(p->rchild==q)

{

*flag=-1;

return p;

}

else

{

if(p->lchild!=NULL)

{

parent(p->lchild,q,*&flag);

}

if(p->rchild!=NULL)

{

parent(p->rchild,q,*&flag);

}

}

相关文档
最新文档