数据结构课程设计家谱的实现与设计.docx
- 文档编号:422252
- 上传时间:2022-10-10
- 格式:DOCX
- 页数:26
- 大小:381.91KB
数据结构课程设计家谱的实现与设计.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;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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 家谱 实现 设计