数据结构课程设计家谱的实现与设计.docx

上传人:b****1 文档编号:422252 上传时间:2022-10-10 格式:DOCX 页数:26 大小:381.91KB
下载 相关 举报
数据结构课程设计家谱的实现与设计.docx_第1页
第1页 / 共26页
数据结构课程设计家谱的实现与设计.docx_第2页
第2页 / 共26页
数据结构课程设计家谱的实现与设计.docx_第3页
第3页 / 共26页
数据结构课程设计家谱的实现与设计.docx_第4页
第4页 / 共26页
数据结构课程设计家谱的实现与设计.docx_第5页
第5页 / 共26页
点击查看更多>>
下载资源
资源描述

数据结构课程设计家谱的实现与设计.docx

《数据结构课程设计家谱的实现与设计.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计家谱的实现与设计.docx(26页珍藏版)》请在冰豆网上搜索。

数据结构课程设计家谱的实现与设计.docx

数据结构课程设计家谱的实现与设计

课程设计报告

 

课程设计名称:

数据结构课程设计

系:

三系

学生姓名:

朱强

班级:

13软件

学号:

20130311227

成绩:

指导教师:

刘杰

开课时间:

2014-2015学年一学期

设计题目一:

家谱的实现与设计

一、实习目的

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

二、问题描述

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

可。

基本功能如下:

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

(2)家庭成员的添加:

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

(3)家庭成员的修改:

可以修改某一成员的姓名。

(4)员的查询:

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

(5)家庭成员的删除:

删除此成员时,若其有后代,将删除其所有后代成员。

三、需求分析

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

此程序规定:

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

2.程序的输出信息主要为:

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

3.程序的功能主要包括:

家谱祖先数据的录入、家庭成员的添加、家庭成员的修改、员的查询、家庭成员的删除;

四、概要设计

系统用到的数据有:

charname[MAX];

charsex;/

intgeneration;

1)typedefstructnode{}//定义data存储结构

2)typedefstructft{}//创建结构体

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

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

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

5)intgeneration(ft*p,charch[])//获得搜索到的成员的代目的返回值

6)voidsaves(ft*p,charb[],charc,intd)//建立家谱孩子结点创建结点并对l赋值保存

7)voidInitTree()//初始化

8)voidAdd()//添加

9)voidSearch()//查询

10)voidChange()//修改

11)voidDelete()//删除

12)intmain()//主函数

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

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

五、详细设计

#include

#include

#include

#include

#defineMAX10

typedefstructnode{//定义data存储结构

charname[MAX];//姓名

charsex;//性别

intgeneration;//代目

}node;

typedefstructft{//创建结构体

structnodel;//家谱中直系家属

structft*lchild;//用来指向兄弟

structft*rchild;//用来指向孩子

}ft;

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

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

{

ft*q;

if(p==NULL)

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

if(strcmp(p->l.name,ch)==0)

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

if(p->lchild)

{

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

if(q)

returnq;//找到

}

if(p->rchild)

{

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

if(q!

=NULL)

returnq;

}

returnNULL;//没有找到

}

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

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

{

if(p==NULL)

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

if(p->rchild==NULL)

{

*flag=0;

returnNULL;

}

else

{

if(p->lchild==q)

{

*flag=1;

returnp;

}

else

{

if(p->rchild==q)

{

*flag=-1;

returnp;

}

else

{

if(p->lchild!

=NULL)

{

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

}

if(p->rchild!

=NULL)

{

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

}

}

}

}

}

intgeneration(ft*p,charch[])//获得搜索到的成员的代目的返回值

{

ft*q;

if(p==NULL)

returnNULL;

if(strcmpi(p->l.name,ch)==0)

returnp->l.generation;//家谱不为空,头指针下有这个人

if(p->lchild)

{

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

if(q)returnq->l.generation;//找到

}

if(p->rchild)

{

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

if(q!

=NULL)

returnq->l.generation;

}

returnNULL;

}

voidsaves(ft*p,charb[],charc,intd)//建立家谱孩子结点创建结点并对l赋值保存

{

for(inti=0;i

p->l.name[i]=b[i];

p->l.sex=c;

p->l.generation=d;

}

voiddisp(ft*n)//搜索到数据的输出

{

ft*t=NULL;

printf("此人姓名:

%s性别%c为第%d代\n",n->l.name,n->l.sex,n->l.generation);

printf("\n");

printf("此人的子女:

");//子女输出

if(n->rchild==NULL)

{

printf("此人无子女!

");

}

else

{

if(n->rchild->lchild==NULL)

{printf("姓名:

%s性别:

%c\t",n->rchild->l.name,n->rchild->l.sex);}

else

{

printf("姓名:

%s性别:

%c\t",n->rchild->l.name,n->rchild->l.sex);

t=n->rchild->lchild;

while(t!

=NULL)

{

printf("姓名:

%s性别:

%c\t",t->l.name,t->l.sex);

t=t->lchild;

}

}

}

printf("\n");

printf("\n");

printf("此人的同辈成员:

");//同辈输出

if(n->lchild==NULL)

{

printf("此人无同辈成员!

");

}

else

{

if(n->lchild->lchild==NULL)

{printf("姓名:

%s性别:

%c\t",n->lchild->l.name,n->lchild->l.sex);}

else

{

printf("姓名:

%s性别:

%c\t",n->lchild->l.name,n->lchild->l.sex);

t=n->lchild->lchild;

while(t!

=NULL)

{

printf("姓名:

%s性别:

%c\t",t->l.name,t->l.sex);

t=t->lchild;

}

}

}

printf("\n");

}

voidInitTree()//初始化

{

charb[MAX],c;

inta;

printf("请输入始祖的姓名性别:

\n");

printf("输入姓名(不超过10个字符)\n");

printf("性别:

[M/F(男/女)]\n");

printf("格式:

XXM(姓名为XX性别男)\n");

free(root);//释放root(ft)空间

root=(ft*)malloc(sizeof(ft));//创建一个ft结构体大小的空间然后强制转换为ft*类型的指针然后赋值给root,这时root指向一个structdictree结构体大小的新空间

scanf("%s%c",&b,&c);a=1;//输入姓名,性别

root->rchild=NULL;//清空左右孩子

root->lchild=NULL;

saves(root,b,c,a);//存入结构

printf("家谱重构成功!

\n");

}

voidManu()

{

printf("*********************************************\n");

printf("*****请选择对家谱的操作:

    *****\n");

printf("*****0.退出 *****\n");

printf("***** 1.添加 *****\n");

printf("*****2.查找 *****\n");

printf("*****3.修改 *****\n");

printf("*****4.删除 *****\n");

printf("*****5.重构*****\n");

printf("*********************************************\n");

}

voidAdd()//添加

{

ft*n,*m,*t=NULL;

charb[MAX],c,d[MAX];

inti;

printf("请输入要添加子女的上一辈的姓名:

\n");//判断是否有重名

s

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 考试认证 > 从业资格考试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1