数据结构课程设计二叉树的遍历算法分析与设计.docx
《数据结构课程设计二叉树的遍历算法分析与设计.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计二叉树的遍历算法分析与设计.docx(32页珍藏版)》请在冰豆网上搜索。
![数据结构课程设计二叉树的遍历算法分析与设计.docx](https://file1.bdocx.com/fileroot1/2023-2/3/f2fd7468-3dfc-41d3-906e-01b05db03c44/f2fd7468-3dfc-41d3-906e-01b05db03c441.gif)
数据结构课程设计二叉树的遍历算法分析与设计
数据结构课程设计--二叉树的遍历算法分析与设计
数据结构课程设计
题目二叉树的遍历算法分析与设计
学生姓名专业班级计算机12-1
指导教师职称 副教授
所在单位信息科学系
教学部主任
完成日期2014年1月10日
课程设计报告单
学号
姓名
李科锦
专业班级
计算机12-1
考核项目
评分
备注
1
平时工作态度及遵守纪律情况
(10分)
2
掌握基本理论、关键知识、基本技能的程度和阅读参考资料的水平
(10分)
3
独立工作能力、综合运用所学知识分析和解决问题能力及实际工作能力提高的程度
(20分)
4
完成课程设计说明书及软件的情况与水平(小组分工情况、规范性、整洁清楚、叙述完整性、思路清晰程度、工作量及实际运行情况和创新性)
(60分)
总评成绩
综合评定:
(优、良、中、及格、不及格)
指导教师签字:
2014年1月10日
数据结构课程设计任务书
一、任务及要求:
1.设计(研究)任务和要求
研究内容:
二叉树的遍历算法分析与设计
任务和要求:
(1)学习数据结构基础知识,掌握数据结构典型的算法的使用。
(2)对指导教师下达的题目进行系统分析。
(3)根据分析结果完成系统设计。
(4)编程:
在计算机上实现题目的代码实现。
(5)完成对该系统的测试和调试。
(6)提交课程设计报告。
要求完成课程设计报告3000字以上(约二十页)。
完成若干综合性程序设计题目,综合设计题目的语句行数的和在100行语句以上。
2.原始依据
结合数据结构课程中的基本理论和基本算法,正确分析出数据的逻辑结构,合理地选择相应的存储结构,并能设计出解决问题的有效算法。
提高程序设计和调试能力。
学生通过上机实习,验证自己设计的算法的正确性。
学会有效利用基本调试方法,迅速找出程序代码中的错误并且修改。
3.参考题目:
二、工作量
2周(10个工作日)时间
三、计划安排
第1个工作日:
查找相关资料、书籍,阅读示例文档,选择题目。
第2个工作日-第3个工作日:
设计程序结构、模块图。
第4个工作日-第9个工作日:
完成程序的编码,并且自己调试、测试。
穿插进行课程设计报告的撰写。
第10个工作日:
上交课程设计报告,由教师检查软件测试效果、检查课程设计报告,给出学生成绩。
指导教师签字:
2013年12月30日
题目一:
居民信息管理系统(以二叉树建立)算法分析与设计
1.需求分析
此系统是根据用户的需求,主要是对居民的基本信息进行登记,统计,并对居民信息进行管理。
系统除了以上功能外还要有基本的管理工作,例如添加居民信息,修改居民信息,删除居民信息等最基本的操作,还有就是通过本系统还可以统计出在在各个教育程度的人数,方便应用者更加的快捷的做出统计,提高工作效率。
2.概要设计
本系统中定义jumininfo结构体类型用于描述居民信息。
jumininfo结构体类型定义格式如下:
typedefstruct
{
charnum[18];
charname[21];
charsex[5];
charage[4];
charxueli[11];
charaddr[51];
chartel[21];
}jumininfo;
其中num用于描述居民的身份证号信息,name用于描述居民的姓名信息,sex用于描述居民的性别信息,age用于描述居民的年龄信息,xueli用于描述居民的教育程度信息,addr用于描述居民的地址信息,tel用于描述居民的联系方式信息。
本系统中定义nodetype结构体类型用于建立二叉树的节点。
nodetype结构体类型定义格式如下:
typedefstructnode
{
jumininfojumin;
structnode*L;
structnode*R;
}nodetype;
其中jumin用于存储居民个人信息,*L为指向左孩子的指针,*R为指向右孩子的指针。
3.详细设计
依据需求分析结果,居民信息管理系统系统可以分为四个模块:
居民信息查询模块、居民信息删除模块、居民信息添加模块和居民信息修改模块。
如下图所示:
图2-1居民信息管理系统模块结构
1.居民信息查询模块
居民信息查询模块主要实现的功能是居民信息的快速查询。
依据用户输入的身份证号查找对应的居民信息。
2.居民信息删除模块
居民信息删除模块主要实现的功能是对特定居民信息的删除。
3.居民信息添加模块
居民信息添加模块主要是闲的功能是对固定数量的居民信息的添加。
4.居民信息修改模块
居民信息修改模块主要实现的功能是对特定居民信息的修改。
5.系统总体流程
4.调试分析
1.程序设计及过程
一、设想将上一次单链表的课程设计所编写的成程序改写,定义成为二叉树结构类型。
结果:
失败,单链表指针指向与二叉树完全不同,使整个程序指针结构改变工作量变得很大,短时间内一人无法完成。
二、参考书本,重新定义类型结构,取单链表课程设计部分显示函数进行重新编辑。
结果:
比较成功,建立了一个以二叉树结构为基础的管理系统。
缺点:
将文件存入文件和从文件读取没有实现,二叉树的写入与单链表区别较大,已经找出将树存入文件的方法,但读取程序未能编写成功,因此在本次课程设计中未加入写入文件模块。
目前程序中未能实现的功能除了从文件读取功能外,还有查找功能。
查找功能的程序代码已经编写完成,但是实际测试中未能达到与其功能,具体问题仍然在分析和Debug中,本次课程设计不便列举。
由于查找功能的缺失,使二叉树节点信息的删除和修改功能也未实现。
但本次课程设计的主要目的是成功的建立二叉树并将其遍历,鉴于此功能已经实现,可以基本确定此次课程设计的基本目的已经达到。
5.测试结果及运行效果
进入主菜单,按数字键选择所需功能:
图5-1显示主菜单
选择录入居民信息:
当输入身份证号不是18位时:
录入成功时:
图5-3录入成功
输入“#”结束录入,返回主菜单。
选择显示居民信息:
系统自动中序遍历已建成的二叉树。
图5-4中序遍历已建成的二叉树
选择插入居民信息:
优点:
系统自动选择二叉树上合适的位置插入信息
缺点:
每次只能插入一个居民信息
题目二:
居民信息管理系统(单链表建立含各种排序)算法分析与设计
1.需求分析
与题目一相同
2.概要设计
本系统中定义jumin结构体类型用于描述居民信息。
jumin结构体类型定义格式如下:
structjumin
{
intnum;
charname[20];
charsex;
intage;
charxueli[30];
intwage;
charaddr[30];
chartel[20];
}jumin[100]
其中num用于描述居民的户籍号信息,name用于描述居民的姓名信息,sex用于描述居民的性别信息,age用于描述居民的年龄信息,xueli用于描述居民的教育程度信息,wage用于描述居民的收入信息,addr用于描述居民的地址信息,tel用于描述居民的联系方式信息。
本系统中定义rectype结构体类型用于建立链表,定义格式如下:
typedefstruct
{
intkey;
jumininfoinfo;
}rectype;
3.详细设计
3.1主函数模块
主函数模块主要提供本程序运行的基础以及供用户选择子函数功能。
3.1.1.主函数模块描述
由homepage函数显示功能菜单,由用户选择需要的功能并连接到对应的功能函数。
3.1.2.主函数模块设计实现
进入程序运行结果如下截图:
图3.1-1主函数运行结果
若用户输入1-7以外的字符,则如下图:
3.2录入居民信息子模块
录入居民信息子模块主要提供用户录入居民信息至系统指定文件并存储的功能。
3.2.1.录入居民信息子模块描述
经由main函数进入录入函数,用户根据系统提示按步骤输入居民信息。
3.2.2.录入居民信息子模块流程框图
图3.2-3录入信息模块流程框图
3.2.3.录入居民信息子模块设计实现
进入程序运行结果如下截图:
3.3修改居民信息子模块
修改居民信息子模块主要提供用户修改已录入的居民信息并存储改变的功能。
3.3.1.修改居民信息子模块描述
经由main函数进入修改函数,用户根据系统提示按步骤选择需要修改的项目并修改。
3.3.2.修改居民信息子模块流程框图
图3.3-5修改信息模块流程框图
3.3.3.修改居民信息子模块设计实现
当进入系统模块时未读取到数据库时
5秒后系统自动返回主菜单。
进入系统成功读取数据库:
3.4写入/读取信息子模块
写入/读取信息子模块主要提供用户在录入和编辑信息后将信息存入文件以便下次运行程序继续读取信息的功能。
此模块通常在后台运行,只在读取或写入文件发生错误时显示"文件打开错误!
请先录入信息列表。
系统将自动返回主菜单,请稍候...",并在5秒后自动返回主菜单。
在进入各模块时读取错误如下:
图3.4-11进入浏览模块式读取文件错误
图3.4-14进入浏览模块式读取文件错误
3.5按年龄直接插入排序子模块
按年龄直接插入排序子模块主要提供用户在存储信息后将信息按年龄由小到大顺序排序的功能。
目前还存在在每次排序完成后会在数据列表最前端插入一组空数据的BUG,且到目前为止并未修复。
图3.4-15按年龄直接插入排序子模块
3.6按户籍号直接选择排序子模块
按户籍号直接选择排序子模块主要提供用户在存储信息后将信息按户籍号由小到大顺序排序的功能。
目前还存在在每次排序完成后会在数据列表最前端插入一组空数据的BUG,且到目前为止并未修复。
图3.4-15按户籍号直接选择排序子模块
总结
课程设计终于成功的收尾了,虽然有些疲惫但是颇有收获,我巩固了所学到的知识,并动手实践,更好地理解和运用了数据结构的知识。
数据结构学了近一学期,很多知识掌握得不是很牢,通过平时的复习自己也理解了一些,但让我有更深的理解和更好的认识则是在这个课程设计。
通过本次课程设计,复习了上学期的C语言编程知识,学会了怎么去借鉴别人方法和经验,知道了如何整理材料是设计最快的完成这为以后设计毕业论文打下了基础。
此次课程设计鉴于上次的经验我选择了独立一人一组。
觉得虽然程序编写有些吃力,但是一个人完成程序时的成就感也加倍了。
由于临近期末,复习任务紧张,这次的课程设计完成的还不是很周密,还有很多可以完善的地方,但总的来说已经达到我之前预想的程序效果。
在这次课程设计中,我还帮助了其他小组课程设计的完成,见到了很多的程序错误,并帮他们改正,这也锻炼了我个人在程序debug方面的能力。
还着愉快的心情,数据结构课程设计结束了。
希望在这次课程设计中所总结的经验和教训会让我以后的课程设计更加顺利。
参考文献
[1]严蔚敏.吴伟民著.《数据结构》(C语言版).北京:
清华大学出版.1999年第一版
[2]陈一华等编.《数据结构》(C语言).北京:
电子科技大学出版社.1998年第一版
[3]谭浩强.《C语言程序设计(第二版)》.北京:
高等教育出版社.2002
附录.主要代码
题目一
#include
#include
#include
#include
#include
typedefstruct
{
charnum[18];
charname[21];
charsex[5];
charage[4];
charxueli[11];
charaddr[51];
chartel[21];
}jumininfo;
typedefstructnode
{
jumininfojumin;
structnode*L;
structnode*R;
}nodetype;
typedefnodetype*btree;
/*voidwrite(btreek,char*num)
{
FILE*fp;
if((fp=fopen("infolist.txt","a+"))==NULL)
{
printf("文件打开错误!
请先录入信息列表。
\n");
Sleep(3000);
return;
}
if(k)
{
fwrite(&k->jumin.num,sizeof(nodetype),1,fp);
if(k->L)
write(k->L,k->L->jumin.num);
if(k->R)
write(k->R,k->R->jumin.num);
}
fclose(fp);
}*/
btreebssearch(btreep,char*num)
{
while(p!
=NULL)
{
if(strcmp(num,p->jumin.num)==0)
returnp;
if(strcmp(num,p->jumin.num)<0)
p=p->L;
elsep=p->R;
}
returnp;
}
voidinsert(btree*root,char*num)
{
//FILE*fp;
btreef,p;
charname[20],sex[4],age[3],xueli[10],addr[50],tel[20];
//fp=fopen("infolist.txt","a");
f=NULL;
p=*root;
while(p)
{
if(strcmp(num,p->jumin.num)==0)
{
printf("该身份证号居民信息已存在,请重新输入!
\n");
return;
}
f=p;
p=(strcmp(num,p->jumin.num)<0)?
p->L:
p->R;
}
p=(btree)malloc(sizeof(nodetype));
strcpy(p->jumin.num,num);
printf("请输入姓名(少于10个汉字):
\n");
scanf("%s",name);
strcpy(p->jumin.name,name);
printf("请输入性别(男或女):
\n");
scanf("%s",sex);
strcpy(p->jumin.sex,sex);
printf("请输入年龄(少于3个数字):
\n");
scanf("%s",age);
strcpy(p->jumin.age,age);
printf("请输入学历(少于5个汉字):
\n");
scanf("%s",xueli);
strcpy(p->jumin.xueli,xueli);
printf("请输入家庭住址(少于25个汉字):
\n");
scanf("%s",addr);
strcpy(p->jumin.addr,addr);
printf("请输入电话号码(少于20个数字或字符):
\n");
scanf("%s",tel);
strcpy(p->jumin.tel,tel);
p->L=NULL;
p->R=NULL;
if(*root==NULL)
*root=p;
else
{
if(strcmp(num,f->jumin.num)<0)
f->L=p;
else
f->R=p;
}
//write(p,p->jumin.num);
/*while(p->L)
{
if(fwrite(&p->jumin.num,sizeof(nodetype),1,fp)!
=1)
printf("Filewriteerror!
\n");
if(p->L)
p=p->L;
else
if(p->R)
p=p->R;
}*/
//fclose(fp);
}
/*voidread(btreek,char*num)
{
FILE*fp;
if((fp=fopen("infolist.txt","a+"))==NULL)
{
printf("文件打开错误!
请先录入信息列表。
\n");
Sleep(3000);
return;
}
if((fread(&k->jumin.num,sizeof(nodetype),1,fp))!
=1)
exit(0);
insert(&k,k->jumin.num);
if(k->L)
read(k->L,k->L->jumin.num);
if(k->R)
read(k->R,k->R->jumin.num);
fclose(fp);
}*/
voidinorder(btreet)//中序遍历
{
//read(t,t->jumin.num);
if(t)
{
inorder(t->L);
printf("户籍号\t姓名\t\t性别\t\t年龄\n");
printf("\n%s\t\t%s\t\t%s\t\n",t->jumin.num,t->jumin.sex,t->jumin.age);
printf("\n学历\t\t住址\t\t电话\n");
printf("\n%s\t\t%s\t\t%s\n",t->jumin.xueli,t->jumin.addr,t->jumin.tel);
inorder(t->R);
}
}
btreecreatebtree(void)
{
btreeroot;
charnum[19];
root=NULL;
printf("\n请输入18位身份证号,输入#取消录入\n");
scanf("%s",num);
while(strcmp(num,"#")!
=0)
{
while(strlen(num)!
=18)
{
printf("错误!
输入的身份证号不是18位,请重新输入:
\n");
scanf("%s",num);
}
insert(&root,num);
printf("\n请输入18位身份证号,输入#取消录入\n");
scanf("%s",num);
}
returnroot;
}
btreeDelete(btreebt,char*num)
{
btreep,q;
if(strcmp(bt->jumin.num,num)==0)
{
if(bt->L==NULL&&bt->R==NULL)
{
free(bt);
returnNULL;
}
else
if(bt->L==NULL)
{
p=bt->R;
free(bt);
returnp;
}
else
if(bt->R==NULL)
{
p=bt->L;
free(bt);
returnp;
}
else
{
p=q=bt->R;
while(q->L!
=NULL)
q=q->L;
q->L=bt->L;
free(bt);
returnp;
}
}
else
{
if(strcmp(bt->jumin.num,num)>0&&bt->L!
=NULL)
bt->L=Delete(bt->L,num);
if(strcmp(bt->jumin.num,num)<0&&bt->R!
=NULL)
bt->R=Delete(bt->R,num);
returnbt;
}
}
voidquit()
{(略)}
voidhomepage()/*菜单函数*/
{(略)}
voidmain()
{(略)}
题目二
此处只给出排序函数,其他部分同C语言课程设计
voidinsertsort(rectyper[])//按年龄直接插入排序
{
inti,j;
intm=load();
printf("\n原来的居民信息:
\n");
display();
printf("\n\n\n\n");
for(i=1;i{
r[i].key=r[i].info.age;
}
for(i=2;i<=m;i++)
{r[m+1]=r[i];
j=i-1;
while(r[m+1].key{r[j+1]=r[j--];
r[j+1]=r[m+1];
}save(m+1);
}printf("\n排序后的居民信息:
\n");
display();}
voidselectsort(rectyper[])//按户籍号直接选择排序
{rectypex;
intm=load();
inti,j,k;
printf("\n原来的居民信息:
\n");
display();
for(i=0;i{r[i].key=r[i].info.num;};
for(i=0;i{k=i;
for(j=i+1;j<=m;j++)
if(r[j].keyk=j;
if(k!
=i)
{x=r[i];
r[i]=r[k];
r[k]=x;
}save(m+1);}
printf("\n排序后的居民信息:
\n");
display();}