收藏 分销(赏)

课程设计论文图的遍历.doc

上传人:可**** 文档编号:9629417 上传时间:2025-04-01 格式:DOC 页数:22 大小:227KB 下载积分:8 金币
下载 相关 举报
课程设计论文图的遍历.doc_第1页
第1页 / 共22页
课程设计论文图的遍历.doc_第2页
第2页 / 共22页


点击查看更多>>
资源描述
内蒙古科技大学课程设计论文 内蒙古科技大学 本科生课程设计论文 题 目:C++课程设计 -------图的遍历 学生姓名:王刚 学 号:0967111207 专 业:计算机09级 班 级:(2)班 指导教师:丁雨 2011年6月13日~2011年6月24日 内蒙古科技大学课程设计任务书 课程名称 数据结构课程设计 设计题目 图的遍历 指导教师 丁雨 时间 2011-6-23 一、教学要求 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()//建立邻接表,完成无向图的输入 void DepthFirstSearch(node *list)//深度优先搜索 void BreadthFirstSearth(node *list)//广度优先搜索 void PathSearth(node *list)//路径搜索 void AdjacencyListDelete(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、…的顶点。 三、数据结构 #define t true #define f false #include<iostream.h> struct node//定义一个结构作为节点类型 { int data; bool sign;//标志位,用来标示是否遍历过 node *next; }; 四、模块划分 node* creategraph()//建立邻接表,完成无向图的输入 }; 0 4 1 0 2 1 3 2 4 3 输入节点数 动态分配节点数组内存 边 边 表4.1邻接表的建立 void DepthFirstSearch(node *list)//深度优先搜索 void DepthFirstSearch(node *list) cin>>k; a[i]=k list[k].sign=t; i++ list[k].sign==t k=p->data; 真 p=p->next; i++ 非零 零 if(list[k].sign!=f) 结束程序 图4.2 深度优先遍历流程图 void BreadthFirstSearth(node *list)//广度优先搜索 BreadthFirstSearthth 搜索起始节点 cin>>k; list[k].sign=t; p=list[a[m]].next; 真 if(list[k].sign==f) r++; 标记 p=p->next; I++ 程序结束 for(int i=1;i<=n;i++)//恢复原邻接表 list[i].sign=f; 表4.3图的广度遍历 void PathSearth(node *list)//路径搜索 void AdjacencyListDelete(node *list)//释放邻接表的空间 AdjacencyListDelete(list);//释放邻接表空间 五、系统的概要设计 main() /*包含一些调用和控制语句*/ 进入菜单选择 用户登录 图信息的录入 路径收索 广度优先遍历图 深度优先遍历图 退出程序 图5.1系统功能模块图 六、部分源程序 #define t true #define f false #include<iostream.h> struct node//定义一个结构作为节点类型 { int data; bool sign;//标志位,用来标示是否遍历过 node *next; }; node* creategraph()//建立邻接表,完成无向图的输入 { int l,m,n; bool g; cout<<"请输入节点数: "; cin>>n; node *adjacencylist=new node[n+1];//动态分配节点数组内存 adjacencylist[0].data=n;//0地址存放的为节点数 adjacencylist[0].next=NULL; for(int i=1;i<=n;i++)//给各顶点域赋初值 { adjacencylist[i].data=0; adjacencylist[i].next=NULL; adjacencylist[i].sign=f;//表示未遍历 } cout<<"请依次输入各条边的始点和尾点:(以0表示结束)"<<endl; 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<<"边"<<l<<"--"<<m<<"输入错误!"<<endl;//错误输入标识 cin>>l; if(l==0)//边的输入结束 g=f; } return adjacencylist;//返回邻接表 }; void DepthFirstSearch(node *list)//深度优先搜索 { int m,n=list[0].data,k,*a=new int[n];//设置一个数组用于存放节点 node *p; cout<<"采用深度优先搜索:"<<endl; cout<<"请输入搜索起始节点:"; cin>>k; for(int i=0;i<n;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<m)//无节点可回溯 { cout<<"该图为非连通图!"<<endl; break; } else k=a[i-m]; //回溯 } } } for(i=1;i<=n;i++)//恢复原邻接表 list[i].sign=f; cout<<"深度优先搜索遍历顺序为:"; for(i=0;i<n;i++)//输出遍历结果 cout<<a[i]<<" "; cout<<endl; delete a;//释放动态数组内存 }; void BreadthFirstSearth(node *list)//广度优先搜索 { int m,r,k,n=list[0].data,*a=new int[n+1];//设置数组存放节点 node *p; cout<<"采用广度优先搜索:"<<endl; 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(int i=1;i<=n;i++)//恢复原邻接表 list[i].sign=f; cout<<"广度优先搜索遍历顺序为: "; for(i=1;i<=n;i++)//输出遍历 cout<<a[i]<<" "; cout<<endl; delete a;//释放动态数组内存 }; void PathSearth(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<<"不存在这样的简单路径!"<<endl; else { a=new int[d];//动态分配数组内存存放路径上的节点 for(int i=0;i<d;i++) a[i]=0; a[0]=k; node *p; int x; list[a[0]].sign=t; i=1; while(a[d-1]!=c) { while(i<d) { 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<<"该路径为一条回路!"<<endl; 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<<"不存在这样的简单路径!"<<endl; 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<<"从节点"<<k<<"到节点"<<c<<"的一条路径为:"; for(i=0;i<d-1;i++)//输出路径 cout<<a[i]<<"--> "; cout<<a[d-1]<<endl; } delete a; } for(int i=1;i<=n;i++)//恢复原邻接表 list[i].sign=f; }; void AdjacencyListDelete(node *list)//释放邻接表的空间 { node *p,*q; int n=list[0].data; for(int i=1;i<=n;i++) { p=list[i].next; while(p!=NULL) { q=p->next; delete p;//释放链表节点空间 p=q; } } delete list;//释放邻接表空间 }; void main() { node *list; list=creategraph();//以邻接表的形式建立一个无向图 char a,b; cout<<"请选择遍历方法:(d:深度优先搜索;b:广度优先搜索)"; for(int i=1;i<2;i++) { cin>>a; switch(a) { case 'd': case 'D': DepthFirstSearch(list); cout<<"是否采用广度优先搜索重新遍历?(y:是;n:否)"; cin>>b; if((b=='y')||(b=='Y')) BreadthFirstSearth(list); break; case 'b': case 'B': BreadthFirstSearth(list); cout<<"是否采用深度优先搜索重新遍历?(y:是;n:否)"; cin>>b; if((b=='y')||(b=='Y')) DepthFirstSearch(list); break; default: cout<<"输入错误!请重新输入!"<<endl; i--; } } while(1) { cout<<"是否搜索路径?(y:是;n:否)"; cin>>a; if((a=='y')||(a=='Y')) PathSearth(list); else if((a=='n')||(a=='N')) break; else cout<<"输入错误!"<<endl; } AdjacencyListDelete(list);//释放邻接表空间 } 七、程序的调试分析以及测试结果 7.1程序的调试分析 程序的调试是一个很重要的方面,本题目有个创建邻接表函数这是个基础,如果这里出了差错当然后面的模块也就无法进行了。所以在调试程序的时候,我是先进行了对创建邻接表的函数进行调试。再确保无误的情况下在进行了后面模块的调试,在调试中间经常会出现一些小问题,这是我会经常的采用“隔离”的方法进行逐步的排查。最后还得对整个程序进行总体的调试,不断完善一些细节方面,并对输入的参数进行多方面的改变,以确保程序的正确性。 在整个程序运行无误的基础上,在尽力对一些函数进行优化,加强程序的可读性,方便性。 经过这次课程设计让我收获了不少东西,只要有以下几个方面。 1)对于基于C++语言的数据结构,C++语言的掌握情况是能否学好这么课程的一个重要因素,所以在进行课程设计的时候又对C++语言进行了部分复习。 2)在调试过程中懂得了,学习的严谨性,特别对于编程题目。“差之毫厘,谬之千里”。当然这也不仅仅在学习方面,生活中也是样。 3)在这个项目中也提醒了自己在平时除了自己的专业知识外应该积累更多的知识,技能。只有这样在进行各项事情的过程中才能更加顺利。 4)“理论联系实践”,实践是建立在学习的基础之上,而又在其中不断的学习的过程。平时上课听讲觉得容易接受,淡然无味,但在实现算法的时候才发现原来一切并非如此。数据结构这门课程比较抽象而且如果自己只是看看书的话根本就不能够学好的,而且数据结构这门课程也应用的非常广泛,特别是在计算机许多语言中都能够看到数据结构的思想。 八、附录 5.1、课程设计心得体会 心得体会 通过这近一个星期的数据结构课程设计实践,我学到了很多东西。本次课程设计对我来说正是一个提高自己能力的机会,我好好的抓住机会,努力做好每一步,完善每一步。 自己的C语言知识和数据结构知识得到了巩固,编程能力也有了一定的提高。同时也学会了解决问题的方法。总结起来,自己主要有以下几点体会: 1.必须牢固掌握基础知识。由于C语言是大一所学知识,有所遗忘,且未掌握好上学期所学的《数据结构》这门课,所以在实践之初感到棘手。不知如何下手,但在后来的实习过程中自己通过看书和课外资料,并请教其他同学,慢慢地对C语言和数据结构知识有所熟悉,这时才逐渐有了思路。所以,这次课程之后,我告诫自己:今后一定要牢固掌握好专业基础知识。 2.必须培养严谨的态度。自己在编程时经常因为一些类似于“少了分号”的小错误而导致错误,不够认真细致,这给自己带来了许多麻烦。编程是一件十分严谨的事情,容不得马虎。所以在今后自己一定要培养严谨的态度。我想这不仅是对于程序设计,做任何事都应如此。 3.这次课程设计也让我充分认识到《数据结构》这门课的重要性。它给我们一个思想和大纲,让我们在编程时容易找到思路,不至于无章可循。同时它也有广泛的实际应用。 在实践过程中,我和组员分工合作,勇于提出问题,解决难题,在实践中,我遇到了许多困难,但都一一克服了。最终我圆满的完成此次课程设计,学到了很多东西。同时,程序还存在着一些缺陷,就是不能输出原图,存在一些局限性,不过我会继续努力思考,完善程序,做到最好。 此次试验,老师对我的指导是至关重要的,在此我非常感谢老师,从他那我学到了很多有关c语言的知识,为以后的学习打下了一定的基础。 总的来说,本次课程设计,不仅我的知识面有所提高,另外我的综合素质也有所提高,,比如说:团队精神、提问能力、思考能力等等。这次课程设计为我以后更好的学习和使用c语言打下了基础。 参考文献 1.《数据结构 (C语言版)》严蔚敏、吴伟民 主编 清华大学出版社 2004.11 2.《数据结构课程设计案例精编(用C/C++描述)》,李建学 等 编著,清华大学出版社 2007.2 3.《数据结构:用面向对象方法与C++语言描述》,殷人昆 主编, 清华大学出版社 2007.6 22
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 学术论文 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服