数据结构课程设计家谱的实现与设计.docx
《数据结构课程设计家谱的实现与设计.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计家谱的实现与设计.docx(26页珍藏版)》请在冰豆网上搜索。
数据结构课程设计家谱的实现与设计
课程设计报告
课程设计名称:
数据结构课程设计
系:
三系
学生姓名:
朱强
班级:
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;ip->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