当前位置:文档之家› 课程设计论文图的遍历

课程设计论文图的遍历

课程设计论文图的遍历内蒙古科技大学本科生课程设计论文题目:C++课程设计-------图的遍历学生姓名:齐枫学号:1076807407专业:计算机10级班级:(4)班指导教师:2012年6月18日~2011年7月4日内蒙古科技大学课程设计任务书一、前言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()//建立邻接表,完成无向图的输入};表4.1邻接表的建立void DepthFirstSearch(node *list)//深度优先搜索void DepthFirstSearch(node *list)cin>>k;a[i]=k图4.2 深度优先遍历流程图void BreadthFirstSearth(node *list)//广度优先搜索表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++;//统计邻接点的个数}elsecout<<"边"<<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;}elsek=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;elsecout<<"输入错误!"<<endl;}AdjacencyListDelete(list);//释放邻接表空间}七、程序的调试分析以及测试结果7.1程序的调试分析程序的调试是一个很重要的方面,本题目有个创建邻接表函数这是个基础,如果这里出了差错当然后面的模块也就无法进行了。

相关主题