课程设计论文图的遍历.docx
- 文档编号:26759777
- 上传时间:2023-06-22
- 格式:DOCX
- 页数:28
- 大小:154.29KB
课程设计论文图的遍历.docx
《课程设计论文图的遍历.docx》由会员分享,可在线阅读,更多相关《课程设计论文图的遍历.docx(28页珍藏版)》请在冰豆网上搜索。
课程设计论文图的遍历
课程设计论文图的遍历
内蒙古科技大学
本科生课程设计论文
题目:
C++课程设计
-------图的遍历
学生姓名:
齐枫
学号:
1076807407
专业:
计算机10级
班级:
(4)班
指导教师:
2012年6月18日~2011年7月4日
内蒙古科技大学课程设计任务书
课程名称
数据结构课程设计
设计题目
图的遍历
指导教师
时间
2012-00-00
一、教学要求
1.掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力
2.初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能
3.提高综合运用所学的理论知识和方法独立分析和解决问题的能力
4.训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风
二、设计资料及参数
每个学生在教师提供的课程设计题目中任意选择一题,独立完成,题目选定后不可更换。
图的遍历
以数组表示法或邻接表表示图,在此基础上实现对图的遍历。
要求设计类(或类模板)来描述图,包含必要的构造函数和析构函数,以及其他能够完成如下功能的成员函数:
v输入图、输出图
v求图中顶点V的第一个邻接点
v求图中顶点V的下一个邻接点
v深度优先遍历图
v广度优先遍历图
并设计主函数测试该类(或类模板)。
三、设计要求及成果
1.分析课程设计题目的要求
2.写出详细设计说明
3.编写程序代码,调试程序使其能正确运行
4.设计完成的软件要便于操作和使用
5.设计完成后提交课程设计报告
四、进度安排
资料查阅与讨论(1天)
系统分析(2天)
系统的开发与测试(5天)
编写课程设计说明书和验收(2天)
五、评分标准
1.根据平时上机考勤、表现和进度,教师将每天点名和检查
2.根据课程设计完成情况,必须有可运行的软件。
3.根据课程设计报告的质量,如有雷同,则所有雷同的所有人均判为不及格。
4.根据答辩的情况,应能够以清晰的思路和准确、简练的语言叙述自己的设计和回答教师的提问
六、建议参考资料
1.《数据结构(C语言版)》严蔚敏、吴伟民主编清华大学出版社2004.11
2.《数据结构课程设计案例精编(用C/C++描述)》,李建学等编著,清华大学出版社2007.2
3.《数据结构:
用面向对象方法与C++语言描述》,殷人昆主编, 清华大学出版社2007.6
一、前言
1.1课程设计的目的与意义………………………………………………4
1.2对课程设计功能的需求分析…………………………………………4
二、算法思想…………………………………………………………………5
三、数据结构…………………………………………………………………5
四、模块划分…………………………………………………………………6
node*creategraph()//建立邻接表,完成无向图的输入
voidDepthFirstSearch(node*list)//深度优先搜索
voidBreadthFirstSearth(node*list)//广度优先搜索
voidPathSearth(node*list)//路径搜索
voidAdjacencyListDelete(node*list)//释放邻接表的空间
AdjacencyListDelete(list);//释放邻接表空间
五、系统的概要设计
1、系统功能模块图…………………………………………………………9
六、源程序……………………………………………………………………10
七、程序的调试分析以及测试结果
1、程序的调试测试结果…………………………………………………………20
八、附录
1、附录一
心得……………………………………………………………………………21
2、参考文献…………………………………………………………………22
一、前言
1.1课程设计的目的与意义
上学期我们对《数据结构》这门课程进行了学习。
这门课程是一门实践性非常强的课程,为了让大家更好地理解与运用所学知识,提高动手能力,我们进行了此次课程设计实习。
这次课程设计不但要求我们掌握《数据结构》中的各方面知识,还要求我们具备一定的C++语言基础和编程能力。
通过实践我们掌握《数据结构》中的知识。
对于《图的遍历》这一课题来说,所要求我们掌握的数据结构知识主要有:
图的存储结构、队列的基本运算实现、图的深度优先遍历算法实现、图的广度优先遍历算法实现。
对于我们学生来讲,此次课程设计是为了让我们训练自己的实际设计能力,通过设计实践,去真正获得此项目管理和团队协作等方面的基本训练和工作经验。
通过课程设计的一系列训练,我们能提高如何综合运用所学知识解决实际问题的能力,以及获得此项目管理和团队协作等等众多方面的具体经验,增强对相关课程具体内容的理解和掌握能力,培养对整体课程知识综合运用和融会贯通能力。
1.2对课程设计功能的需求分析
图的遍历并不需要是一个过于复杂的工作环境,一般来说:
最合适的才是最好的。
软件设计必须符合我们使用实际情况的需要。
根据要求,图的遍历主要功能如下:
1、用户可以随时建立一个有向图或无向图;
2、用户可以根据自己的需要,对图进行深度遍历或广度遍历;
3、用户可以根据自己的需要对图进行修改;
4、在整个程序中,用户可以不断的按照不同的方式对图进行遍历,若不继续,用户也可以随时跳出程序,同时,如果用户输入的序号错误,程序会提示用户重新输入序号;
二、算法思想
本课题本人所采用的是邻接表的方式存储图,实现图的深度、广度两种遍历,并将每种遍历结果输出来。
并且能寻找路径。
2.1.1图的邻接矩阵的建立
对任意给定的图(顶点数和边数自定),,根据邻接表的存储结构建立图的邻接表。
2.1.2图的遍历的实现
邻接表是图的一种链式存储结构,在邻接表中,对图中的每一个顶点建立一个单链表,通常以顺序结构存储,以便随机访问任意一顶点。
图的深度遍历,假设初始状态是图中所有顶点都未曾被访问,则深度优先遍历可从图中的某个顶点v出发,访问此顶点,依次从v的未被访问的邻接点出发深度优先遍历图,直至图中和v有路径想通的顶点都被访问到;若此时图中尚有未被访问的节点,则另选图中一个未被访问的顶点做起始点,直至所有节点都被访问。
图的广度优先遍历,是以v为起始点,由近及远,依次访问和v有路径相通且路径长度为1、2、…的顶点。
三、数据结构
#definettrue
#defineffalse
#include
structnode//定义一个结构作为节点类型
{
intdata;
boolsign;//标志位,用来标示是否遍历过
node*next;
};
四、模块划分
node*creategraph()//建立邻接表,完成无向图的输入
};
0
4
1
0
2
1
3
2
4
3
表4.1邻接表的建立
voidDepthFirstSearch(node*list)//深度优先搜索
真
非零零
图4.2深度优先遍历流程图
voidBreadthFirstSearth(node*list)//广度优先搜索
真
表4.3图的广度遍历
voidPathSearth(node*list)//路径搜索
voidAdjacencyListDelete(node*list)//释放邻接表的空间
AdjacencyListDelete(list);//释放邻接表空间
五、系统的概要设计
main()/*包含一些调用和控制语句*/
图5.1系统功能模块图
六、部分源程序
#definettrue
#defineffalse
#include
structnode//定义一个结构作为节点类型
{
intdata;
boolsign;//标志位,用来标示是否遍历过
node*next;
};
node*creategraph()//建立邻接表,完成无向图的输入
{
intl,m,n;
boolg;
cout<<"请输入节点数:
";
cin>>n;
node*adjacencylist=newnode[n+1];//动态分配节点数组内存
adjacencylist[0].data=n;//0地址存放的为节点数
adjacencylist[0].next=NULL;
for(inti=1;i<=n;i++)//给各顶点域赋初值
{
adjacencylist[i].data=0;
adjacencylist[i].next=NULL;
adjacencylist[i].sign=f;//表示未遍历
}
cout<<"请依次输入各条边的始点和尾点:
(以0表示结束)"< cin>>l; if(l! =0)//判断输入边是否结束 g=t; while(g==t) { cin>>m; if((l>0)&&(l<=n)&&(m>0)&&(m<=n))//判断输入顶点是否正确 { node*p,*q,*top; p=(node*)new(node);//分配边的一个顶点内存 p->data=m; p->next=NULL; if(adjacencylist[l].next==NULL)//为每个节点创建邻接链表 adjacencylist[l].next=p; else { top=adjacencylist[l].next; while(top->next! =NULL) top=top->next; top->next=p; } adjacencylist[l].data++;//统计邻接点的个数 q=(node*)new(node);//分配边的另一个顶点内存 q->data=l; q->next=NULL; if(adjacencylist[m].next==NULL)//构建邻接表 adjacencylist[m].next=q; else { top=adjacencylist[m].next; while(top->next! =NULL) top=top->next; top->next=q; } adjacencylist[m].data++;//统计邻接点的个数 } else cout<<"边"< "< cin>>l; if(l==0)//边的输入结束 g=f; } returnadjacencylist;//返回邻接表 }; voidDepthFirstSearch(node*list)//深度优先搜索 { intm,n=list[0].data,k,*a=newint[n];//设置一个数组用于存放节点 node*p; cout<<"采用深度优先搜索: "< cout<<"请输入搜索起始节点: "; cin>>k; for(inti=0;i { a[i]=k; list[k].sign=t; if(i==n-1) break; m=0; while(list[k].sign==t) { p=list[k].next; while(p! =NULL)//找出list[k]链表中的未遍历节点 { k=p->data; p=p->next; if(list[k].sign==f) break; } m++; if(list[k].sign! =f)//判断是否是p=NULL跳出while循环的 { if(i { cout<<"该图为非连通图! "< break; } else k=a[i-m];//回溯 } } } for(i=1;i<=n;i++)//恢复原邻接表 list[i].sign=f; cout<<"深度优先搜索遍历顺序为: "; for(i=0;i cout< cout< deletea;//释放动态数组内存 }; voidBreadthFirstSearth(node*list)//广度优先搜索 { intm,r,k,n=list[0].data,*a=newint[n+1];//设置数组存放节点 node*p; cout<<"采用广度优先搜索: "< cout<<"请输入搜索起始节点: "; cin>>k; a[0]=n; a[1]=k; list[k].sign=t;//标识遍历的第一个节点 m=0; r=1; while(m! =r) { m++; p=list[a[m]].next; while(p! =NULL) { k=p->data; if(list[k].sign==f) { r++; a[r]=k;//遍历到的节点存入数组 list[k].sign=t;//标识已经遍历过的节点 } p=p->next; } } for(inti=1;i<=n;i++)//恢复原邻接表 list[i].sign=f; cout<<"广度优先搜索遍历顺序为: "; for(i=1;i<=n;i++)//输出遍历 cout< cout< deletea;//释放动态数组内存 }; voidPathSearth(node*list)//路径搜索 { int*a,c,d,m,k,n=list[0].data; cout<<"请输入起始点: "; cin>>k; cout<<"请输入尾节点: "; cin>>c; cout<<"请输入要找的路径长度: "; cin>>d; d=d+1; if(d>n) cout<<"不存在这样的简单路径! "< else { a=newint[d];//动态分配数组内存存放路径上的节点 for(inti=0;i a[i]=0; a[0]=k; node*p; intx; list[a[0]].sign=t; i=1; while(a[d-1]! =c) { while(i { x=1; p=list[a[i-1]].next; while(p! =NULL) { m=p->data; if(i==d-1&&m==a[0]&&a[0]==c)//路径存在且为回路 { cout<<"该路径为一条回路! "< a[i]=m; i++; break; } if(list[m].sign==f) { if(a[i]! =0) { if(x==0)//是否为已经判断过的错误路径 { a[i]=m; list[a[i]].sign=t;//标识走过节点 i++; break; } if(a[i]==m)//设置错误路径标识 x=0; } else { a[i]=m; list[a[i]].sign=t;//标识走过节点 i++; break; } } p=p->next; } if(p==NULL) { a[i]=0; i--;//由此节点往下的路径不存在,回溯 list[a[i]].sign=f;//还原标识符 } if(i==0)//无法回溯,路径不存在,跳出循环 { cout<<"不存在这样的简单路径! "< break; } } if(i==0)//无法回溯,路径不存在,跳出循环 break; if(a[d-1]! =c)//路径不是所要找的 { i--;//回溯 if(i>=0) list[a[i]].sign=f;//还原标识符 } } if(a[d-1]==c)//判断路径是否找到并输出 { cout<<"从节点"< "; for(i=0;i cout<";
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 课程设计 论文 遍历