数据结构课程设计之简易家谱.docx
《数据结构课程设计之简易家谱.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计之简易家谱.docx(12页珍藏版)》请在冰豆网上搜索。
数据结构课程设计之简易家谱
学号:
***********
课程设计
题目
简易家谱系统
教学院
计算机学院
专业
计算机科学与技术
班级
******
姓名
******
指导教师
*****
2012
年
6
月
18
日
一概述
1.课程设计的目的
1.理解和掌握该课程中的有关基本概念,程序设计思想和方法。
2.培养综合运用所学知识独立完成课题的能力。
3.培养勇于探索、严谨推理、实事求是、有错必改,用实践来检验理论,全方位考虑问题等科学技术人员应具有的素质。
4.掌握从资料文献、科学实验中获得知识的能力,提高学生从别人经验中找到解决问题的新途径的悟性,初步培养工程意识和创新能力。
2.课程设计的要求
设计要求:
输入家族成员情况,建立树结构,统计家族成员人数,能查询家族成员辈份情况。
系统功能:
1.输入、修改与删除家谱信息功能
2.查询功能:
1)某家谱成员的所有子孙的集合
2)某家谱成员的所有祖先的集合
3)某家谱成员的所有同辈成员的集合
4)求某家谱成员的所有上一辈成员的集合
5)给出两个家谱成员,确定他们的关系
3.统计功能
1)统计家谱成员总人数
2)统计从事某种职业的人数
二总体方案设计
1.简单家谱系统整体设计思路
此次课程设计的整体思路是采用遍历算法,整个树的定义使用两个结构体来表示,一个结构体专门用于存放每一个节点的信息,另一个节点中定义了三个指针域,分别为父指针域(兄长指针域),兄弟指针域,子指针域,整个树的输入采用文件导入的方式,首先将文件导入到树中,文件包含每一个家族成员的信息,以及一个标志位flag,标志位的值为0,1,2,0表示此节点没有兄弟节点,1表示此节点至少有一个子节点,2表示此节点至少有一个兄弟节点,使用的算法是先定义一个链式队列,将文件中第一个节点的内容读取放入开辟的树的节点的空间里,然后将树节点放入队列中,此时队列不为空,以队列不为空为判断条件,进行while循环,判断flag的值,循环体中再进行文件读取,循环中进行判断,若flag为0,则继续判断队列是否为空,为空就结束循环,若不为空,则继续出队列,取标志位进行判断,若标志位为1,则生成新节点,用刚刚出列的节点的子指针域进行指向新节点,新节点的父指针域指向出列的节点,剩余的域为空,然后将新生成的节点插入到队列中,若flag为1,则进行兄弟节点的插入,继续循环,若flag不为0,则在进行判断,若为2,则继续进行兄弟节点的插入,以此类推,根据文件的读取,将树生成,本程序中所有的算法都基于以上所介绍的算法。
2.简单家谱系统的主要特点及功能
本系统的主要特点是算法简洁,易于阅读,用户交互界面良好。
主要实现功能如下:
1、查询全部的家谱成员信息;
2、查询某一个家谱成员的信息;
3、查询某一成员的所有子孙信息;
4、查询某一成员的所有祖先信息;
5、查询某一成员的所有同辈信息;
6、查询某一成员的所有上辈信息;
7、统计家谱中所有的人数;
8、统计家谱中从事某一职业的人数;
9、修改某一成员的家谱信息;
10、输入两个人的名字,求其关系;
0、退出;
系统结构图
贾府结构图:
三详细设计
4.1查询全部的家谱成员信息;
该部分程序所完成的具体功能是把贾府中所有的成员信息按照辈份依次显示出来,首先从贾无名开始,然后下一辈份的贾演、贾源等……最后是贾蓉的信息。
每个辈份之间都有间隔。
设计思想:
利用队列遍历所有的结点,在遍历的同时依次输出每个结点的值(即为家庭成员的信息)。
代码如下:
voiddisplayElemtoFamily(LINKFAMILYlfy)
{intflag=1;
LinkQueueslinkq;
initLinkQueues(linkq);
displayElem(lfy);
insertElemtype2Queues(linkq,lfy);
while(isQueuesEmpty(linkq)!
=0)
{LINKFAMILYtemp=output2LinkQueues(linkq);
if(temp->down!
=NULL)
{temp=temp->down;
if(flaginfor.grade)
{printf("\n----------------------下一辈------------------------\n");
flag=temp->infor.grade;
}
displayElem(temp);
insertElemtype2Queues(linkq,temp);
while(temp->brother!
=NULL)
{
temp=temp->brother;
displayElem(temp);
insertElemtype2Queues(linkq,temp);
}
}
}
}
4.2查询某一个家谱成员的信息;、
该部分代码所完成的具体功能是查询某一个家庭成员的信息。
首先手动输入你要查询的那个成员的名字,然后利用队列依次查找该成员的信息,如果该家谱中存在这个成员则输出该成员的有关信息;如果家谱中不存在该成员,则输出提示信息:
家谱中无此人!
设计思想:
有两个函数,一个函数(queryElemt)利用队列遍历所有的节点,在遍历的同时即可查找所输入的成员是否存在该家谱中;另外一个函数(queryElemtoFamily)用于输入你要查找的成员的名字和输出查找的结果。
代码如下:
LINKFAMILYqueryElemt(LINKFAMILYlfy,charname[])
{LinkQueueslinkq;
initLinkQueues(linkq);
if(strcmp(lfy->infor.husName,name)==0)
{returnlfy;}
insertElemtype2Queues(linkq,lfy);
while(isQueuesEmpty(linkq)!
=0)
{LINKFAMILYtemp=output2LinkQueues(linkq);
if(temp->down!
=NULL)
{temp=temp->down;
if(strcmp(temp->infor.husName,name)==0)
{returntemp;}
insertElemtype2Queues(linkq,temp);
while(temp->brother!
=NULL)
{temp=temp->brother;
if(strcmp(temp->infor.husName,name)==0)
{returntemp;}
insertElemtype2Queues(linkq,temp);
}
}
}returnNULL;
}
/*查询,通过姓名查找某一族人的详细信息*/
voidqueryElemtoFamily(LINKFAMILYlfy)
{printf("请输入你要查询的名字:
");
charname[20];
scanf("%s",name);
LINKFAMILYtemp=queryElemt(lfy,name);
if(NULL==temp)
{printf("\n家谱中无此人!
");}
else
{displayElem(temp);}
}
4.3、查询某一成员的所有子孙信息;
该部分程序所完成的具体功能是:
输入你要查找人的名字,比如贾政,它会显示出该人的所有子孙。
设计思想:
首先利用函数(queryElemt)来查找家谱中是否有这个成员,如果无,则输出提示信息(家谱中无此人);如果有,则输出其子孙信息。
代码如下:
voidsontoElem(LINKFAMILYlfy)
{printf("请输入你要查询的人的名字:
");
charname[20];
scanf("%s",name);
LINKFAMILYtemp=queryElemt(lfy,name);
if(NULL==temp)
{printf("家谱中无此人!
\n");}
else
{if(temp->down==NULL)
{printf("%s并无孩子!
",temp->infor.husName);}
else
{displayElemtoFamily(temp);}
}
}
四程序的调试与运行结果说明
五课程设计总结
本组的课程任务为简易家谱,在组长的带领下,经过我们共同的努力,本程序主要任务已基本完成。
另外本程序功能完善,具有良好的交互性,可以满足用户多种需求。
美中不足的是本系统没有采用之前我所设想的递归,我们这次改用队列来建树、查找等,这样代码少有一定的冗余,如果时间充分,我们会更加精进,争取采用代码量相对较少的递归算法,另外更加完善一些功能,包括增加日志功能,给不同级别的人员设置管理权限,比如说家谱管理员在获得本族长的同意下修改某个成员的信息,而其他成员只具备浏览的功能。
在本程序简易家谱的创作过程中,我们组员各抒己见,意见很不一致,包括是采用递归算法,还是采用队列;数据成员的结构如何定义,甚至包括成员的名字,大家的意见都不统一。
但是在探讨的过程中,我们也理解自己思维的不足,也见识了另外不同的编程思想,这也让我体会到了交流的魅力。
只有我们大家坦诚布公的把自己想法说出来,然后我们在理性的分析算法的优劣与可行性,这样就能结合大家共同的智慧,组织大家共同的力量,为共同的目标努力奋斗。
参考文献
如:
[1]谭浩强,C程序设计题解与上机指导(第二版),北京,清华大学出版社,2000年9月。
[2]严蔚敏,吴伟民,数据结构,北京,清华大学出版社,2004年6月。
[3]殷人昆,陶永雷,谢若阳等,数据结构,北京,清华大学出版社,2005年3月。
[4]沈晴霓,聂青,苏京霞,现代程序设计──C++与数据结构面向对象的方法与实现,北京,北京理工大学出版社,2002年3月。
[5]朱战立,张选平,数据结构学习指导与典型题解,西安,西安交通大学出版社,2002年7月。
[6]罗文劼,王苗,石强,数据结构习题解答与实验指导,北京,中国铁道出版社,2004年11月。
简易家谱课程设计成绩评定表
1、课程设计答辩或质疑记录
1)简易家谱树的内部结构是怎样设计的?
答:
设计时采用了两种结构体,一种为数据域定义了家谱中一个成员的全部数据信息,另一种为指针域,定义了三个指针,一个指向父节点(兄长节点),一个指向孩子节点,一个指向兄弟节点。
2)简易家谱树是如何建立的?
答:
采用了一个链式队列辅助建立的,将每个节点依次入队列,然后再出队列,使用了一个标志位来判断每个节点是否有子节点或者兄弟节点,依次遍历每一个节点完成树的建立。
3)如何查找指定成员的子孙信息
答:
通过队列来遍历成员,找到指定的成员后,然后通过down指针来依次遍历所有的子孙信息。
2、答辩情况
a)未能完全理解题目,答辩情况较差□
b)部分理解题目,答辩情况较差□
c)理解题目较清楚,问题回答基本正确□
d)理解题目透彻,问题回答流利□
3、课程设计报告
a)内容:
不完整□完整□详细□
b)方案设计:
较差□合理□非常合理□
c)实现:
未实现□部分实现□全部实现□
d)文档格式:
不规范□基本规范□规范□
考勤成绩:
,
占总成绩比例10%
答辩成绩:
,
占总成绩比例30%
课程设计论文成绩:
,
占总成绩比例60%
课程设计总成绩:
指导教师签字:
年月日