数据结构与算法专题实验报告2.docx
- 文档编号:12629578
- 上传时间:2023-04-21
- 格式:DOCX
- 页数:10
- 大小:285.12KB
数据结构与算法专题实验报告2.docx
《数据结构与算法专题实验报告2.docx》由会员分享,可在线阅读,更多相关《数据结构与算法专题实验报告2.docx(10页珍藏版)》请在冰豆网上搜索。
数据结构与算法专题实验报告2
数据结构论文
最短路径
1题目:
创建一个具有n(n≥1)个顶点的无向图的邻接矩阵,并对其按照“深度优先搜索”和“广度优先搜索”方法进行遍历。
2目标:
1.编写C程序予以实现。
2.程序要求能输入图的顶点数、边数以及边的关系,并自动生成邻接矩阵。
3.结果输出邻接矩阵和遍历的路径。
4.熟悉无向图的两种遍历算法。
3设计思想:
考虑用一个n维数组来存放无向图,若两个结点之间有边,则n维数组对应下标的那个元素值为1,否则为0;
在输入图的顶点数和边数时我充分考虑了边界条件,顶点数G.vexnum在[0,MAXV]范围内,边数在[0,G.vexnum*(G.vexnum-1)/2]范围内,在这个范围内,程序继续向下执行,否则返回重新输入;
输出邻接矩阵的实质是输出n维数组,我用两重循环来实现;
深度优先遍历我采用迪杰特斯拉算法,不过要在此算法中间加一个判断,所有的结点是否都已经遍历过,如果是就退出,如果不是,则按顺序从序号小的开始向大的寻找,找到一个没有遍历过的结点继续调用深度优先遍历算法;
广度优先遍历我采用了非递归算法,其实质和深度优先遍历算法相同;
在主函数中直接调用CreatGraph(G),DispMatrix(G),DepthDisp(G,v),WidthDisp(G)函数即可。
4算法描述:
step1:
设置无向图最多的顶点数//这个设置为了更好的输出邻接矩阵;
step2:
定义无向图的数据结构;
step3:
实现生成无向图函数CreatGraph(G)
a.输入顶点数n,判断它是否在允许的范围内,不在则返回重新输入;
b.输入无向图的边数G.arcnum,判断它是否在允许的范围内,不在则返回重新输入;
c.输入边,for语句(k=1toG.arcnum){输入两顶点v,w,判断v!
=w&0 step4: 实现输出邻接矩阵函数DispMatrix(Graph&G),双重for循环实现输出无向图的邻接矩阵; step5: 实现深度优先遍历的递归算法函数DepthDisp(Graph&G,intv) a.从v开始遍历,设置计数器num=0,并置顶点v已访问; b.for语句(i=1toG.vexnum)判断G.arcs[v][i]! =0&&visited[i]==0,如果是递归调用深度优先遍历的递归算法函数DepthDisp(G,i),如果不是则退出; c.用for和if语句判断是否所有的顶点都已经遍历完, ifnum for(i=1toG.vexnum) if(visited[i]==1)i++ 如果不是,则继续调用深度优先遍历的递归算法函数DepthDisp(G,i); step6: 实现广度优先遍历的非递归算法函数WidthDisp(Graph&G) a.输入广度优先遍历的出发点m,判断0 b.for(i=1toG.vexnum) {判断第i个顶点与第m之间是否有边,有边则输出,k++,判断k=G.vexnum,等于,则退出,遍历完毕,不等于,转到与m有边的顶点继续遍历,要是有边的都已经遍历过,继续找一个没有遍历的顶点,继续;} step7: 主函数直接调用CreatGraph(G),DispMatrix(G),DepthDisp(G,v),WidthDisp(G)函数即可; 5程序流程图: 1.创建无向图函数的流程图如下: 2.深度优先遍历函数实现的流程图如下: 3.实现广度优先遍历的流程图如下: 6源程序 //二,不带权值的无向图的遍历: #include #defineMAXV20//定义顶点的最大个数 structGraph//定义无向图的数据结构 {intvexs[MAXV]; intarcs[MAXV][MAXV]; intvexnum,arcnum; }; staticintvisited[MAXV]; voidCreatGraph(Graph&G)//实现创建无向图的函数 {inti,j,k,v,w; cout<<"请输入顶点数: "; cin>>G.vexnum; while(G.vexnum>MAXV) {cout<<"图的顶点数超限,请重新输入: ";//纠错功能 cin>>G.vexnum;} cout<<"请输入边数: "; cin>>G.arcnum; while(G.arcnum>G.vexnum*(G.vexnum-1)/2)//V个顶点最多V(V-1)/2个顶点 {cout<<"图的边数超限,请重新输入: "; cin>>G.arcnum;} for(i=0;i<=G.vexnum;i++) for(j=0;j<=G.vexnum;j++) G.arcs[i][j]=0; for(k=1;k<=G.arcnum;k++) {cout<<"请输入第"< "; cin>>v>>w; G.arcs[v][w]=G.arcs[w][v]=1;//无向图 } } voidDispMatrix(Graph&G)//输出邻接矩阵 {inti,j; cout<<"邻接矩阵为: "< for(i=1;i<=G.vexnum;++i) cout<<""< cout< for(i=1;i<=G.vexnum;++i)//默认第i个顶点的序号为i {cout< for(j=1;j<=G.vexnum;++j) cout< cout< } } voidDepthDisp(Graph&G,intv)//深度优先遍历的递归算法 {inti; intnum=0; cout< visited[v]=1; num++; for(i=1;i<=G.vexnum;i++) if(G.arcs[v][i]! =0&&visited[i]==0) DepthDisp(G,i); if(num { for(i=1;i<=G.vexnum;i++) if(visited[i]==1)i++; elseDepthDisp(G,i); } } voidWidthDisp(Graph&G)//广度优先遍历的非递归算法 {inti,j=0,k=0,l,m,n=1,flag=1; inta[MAXV]; for(i=0;i a[i]=0; cout<<"请输入广度优先遍历的出发顶点: "; cin>>m; while(m<0||m>G.vexnum) {cout<<"输入的顶点不存在! 请重新输入: ";//纠错功能 cin>>m;} cout<<"广度优先遍历的序列为: "; cout< a[k]=m; while(flag) {for(i=1;i<=G.vexnum;i++) {if(G.arcs[m][i]! =0) {for(l=0;l<=k;) {if(i! =a[l]) l++; else break;} if(l>k) {cout< k++; a[k]=i; n++;} } } if(n! =G.vexnum)//判断是否所有的顶点都已经遍历过,如果没有则继续寻找没有遍历的顶点继续遍历 m=a[++j]; else flag=0; } cout< } voidmain() {GraphG;//生成一个图 inti,v; cout<<"首先生成无向图: "< CreatGraph(G); DispMatrix(G); for(i=0;i visited[i]=0; cout<<"请输入深度优先遍历的出发顶点: "; cin>>v; DepthDisp(G,v);//调用三个函数 cout< WidthDisp(G); } 第二部分体会与建议 1体会与收获: 通过实验,我学会了很多原来在上数据结构理论课时所无法学到的知识,比如说怎样把一个程序尽可能地去完善,让它具有健壮性,以前,我总觉得数据结构上的东西比较抽象,不知道怎样去运用,现在我知道了而且也会用简单的数据结构编写程序,在编写图的遍历时我一开始就遇到了困难,用DIJ算法时发现它对非连通图无法完全遍历,结果我又是看书,又是调试,不过最后还是成功了这是让我最欣慰的。 2建议与意见: 觉得在计算机专业的课程安排上应该多一些实践环节,比如C语言,C++面向对象程序设计,数据结构,等等。 作为我们计算机专业的学生来说要的就是实际操作的经验和在实际问题中处理问题的能力,这些能力从哪里来,就是从这些实验环节中获取。 我觉得学校应该尽量多点时间把实验室开放,这样才能把大家的积极性调动起来,也可以组建一些对编程有极大兴趣的小组搞一些小的项目,来提高我们解决实际问题的能力。 在这次过程中,我有好几道题都是有漏洞的,我觉得我们的理论课堂应当多涉及一些关于怎样消除程序当中的BUG的问题,我觉得这对提高我们编程的能力很有帮助,而且我们也希望多了解此类的知识。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 算法 专题 实验 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)