您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > 数据结构课程设计报告(图的遍历)
中南大学课程设计报告题目数据结构课程设计学生姓名指导教师漆华妹学院信息科学与工程学院专业班级学号完成时间2011年07月目录第一章、需求分析·············································································2第二章、概要设计·············································································22.1设定图的抽象数据类型·····························································································22.2设定队列的抽象数据类型··························································································32.3本程序包含的功能模块·····························································································3第三章、详细设计····························································································33.1顶点、边和图的类型································································································63.2队列类型···············································································································83.3主程序和其他伪码算法·····························································································9第四章、调试分析····························································································9第五章、用户手册····························································································9第六章、测试结果···························································································10第七章、心得体会···························································································10附:源程序代码·································································································112图遍历的演示题目:试设计一个程序,演示在连通的无向图上访问全部结点的操作第一章、需求分析1、以邻接多重表为存储结构;2、实现连通和非连通的无向图的深度优先和广度优先遍历;3、要求利用栈实现无向图的深度优先遍历;4、以用户指定的结点为起点,分别输出每种遍历下的结点访问序列和生成树的边集;5、用凹入表打印生成树;6、求出从一个结点到另外一个结点,但不经过另外一个指定结点的所有简单路径;6、本程序用C语言编写,在C-Free3.5环境下通过。第二章、概要设计1、设定图的抽象数据类型:ADTGraph{数据对象V:V是具有相同特性的数据元素的集合,称为点集.数据关系R:R={VR}VR={(v,w)|v,w属于V,(v,w)表示v和w之间存在的路径}基本操作P:CreatGraph(&G,V,VR)初始条件:V是图的顶点集,VR是图中弧的集合.操作结果:按V和VR是定义构造图G.DestroyGraph(&G)初始条件:图G存在操作结果:销毁图GLocateVex(G,u)初始条件:图G存在,u和G中顶点有相同的特征操作结果:若图G中存在顶点u,则返回该顶点在图中的位置;否则返回其他信息GetVex(G,v)初始条件:图G存在,v是G中顶点操作结果:返回v的值FirstAjvex(G,v)初始条件:图G存在,v是G中顶点操作结果:返回v的第一个邻接顶点,若顶在图中没有邻接顶点,则返回为空NextAjvex(G,v,w)初始条件:图G存在,v是G中顶点,w是v的邻接顶点操作结果:返回v的下一个邻接顶点,若w是v的最后一个邻接顶点,则返回空DeleteVexx(&G,v)初始条件:图G存在,v是G中顶点操作结果:删除顶点v已经其相关的弧DFSTraverse(G,visit())初始条件:图G存在,visit的顶点的应用函数3操作结果:对图进行深度优先遍历,在遍历过程中对每个结点调用visit函数一次,一旦visit失败,则操作失败BFSTraverse(G,visit())初始条件:图G存在,visit的顶点的应用函数操作结果:对图进行广度优先遍历,在遍历过程中对每个结点调用visit函数一次,一旦visit失败,则操作失败}ADTGraph2、设定队列的抽象数据类型:ADTQueue{数据对象:D={ai|ai属于Elemset,i=1,2….,n,n=0}数据关系:R1={ai-1,ai|ai-1,ai属于D,i=1,2,…,n}约定ai为端为队列头,an为队列尾基本操作:InitQueue(&Q)操作结果:构造一个空队列QDestryoQueue(&Q)初始条件:队列Q已存在。操作结果:队列Q被销毁,不再存在。EnQueue(&Q,e)初始条件:队列Q已经存在操作结果:插入元素e为Q的新的队尾元素DeQueue(&Q,&E)初始条件:Q为非空队列操作结果:删除Q的队尾元素,并用e返回其值QueueEmpty(Q)初始条件:队列已经存在操作结果:若队列为空,则返回TRUE,否则返回FLASE}ADTQueue3、本程序包含四个模块:1)主程序模块voidmain(){手动构造一个图;进行深度优先遍历图;进行广度优先遍历图;};2)手动构造一个图-自己输入图的顶点和边生成一个图;3)进行深度优先遍历图-打出遍历的结点序列和边集;4)进行广度优先遍历图-打出遍历的结点序列和边集;第三章、详细设计1、顶点,边和图类型#defineMAX_INFO10/*相关信息字符串的最大长度+1*/4#defineMAX_VERTEX_NUM20/*图中顶点数的最大值*/intvisited[MAX_VERTEX_NUM];/*全局变量,访问标志数组*/typedefcharInfoType;/*相关信息类型*/typedefcharVertexType;/*字符类型*/typedefenum{unvisited,visited}VisitIf;typedefstructEBox/*边结点类型*/{intmark;/*访问标记*/intivex,jvex;/*该边依附的两个顶点位置*/structEBox*ilink,*jlink;/*分别指向依附这两个顶点的下一条边*/}EBox;typedefstructVexBox/*顶点结点类型*/{chardata[MAX_LEN];EBox*fistedge;/*指向第一条依附该顶点的边*/}VexBox;typedefstruct{VexBoxlist[MAX_VERTEX_NUM];intvexnum,edgenum;/*无向图当前顶点数和边数*/}AMLGraph;图的基本操作如下:intLocateVex(AMLGraphG,VertexTypeu);//查G和u有相同特征的顶点,若存在则返回该顶点在无向图中位置;否则返回-1。VertexType&GetVex(AMLGraphG,intv);//以v返回邻接多重表中序号为i的顶点。intFirstAdjVex(AMLGraphG,VertexTypev);//返回v的第一个邻接顶点的序号。若顶点在G中没有邻接顶点,则返回-1。intNextAdjVex(AMLGraphG,VertexTypev,VertexTypew);//返回v的(相对于w的)下一个邻接顶点的序号若w是v的最后一个邻接点,则返回-1。voidCreateGraph(AMLGraph&G);//采用邻接多重表存储结构,构造无向图G。StatusDeleteArc(AMLGraph&G,VertexTypev,VertexTypew);//在G中删除边v,w。StatusDeleteVex(AMLGraph&G,VertexTypev);//在G中删除顶点v及其相关的边。voidDestroyGraph(AMLGraph&G);//销毁一个图voidDisplay(AMLGraphG);//输出无向图的邻接多重表G。voidDFSTraverse(AMLGraphG,VertexTypestart,int(*visit)(VertexType));//从start顶点起,(利用栈非递归)深度优先遍历图G。5voidBFSTraverse(AMLGraphG,VertexTypestart,int(*Visit)(VertexType));//从start顶点起,广度优先遍历图G。voidMarkUnvizited(AMLGraphG);//置边的访问标记为未被访问。其中部分操作的算法如下:voidCreateGraph(AMLGraph*p)/*创建无向图*/{inti,j,k;EBox*q;printf(\n\t\t\t请输入图的结点个数和边的个数:);/*输入图的结点数和边数*/scanf(%d,%d,&p-vexnum,&p-edgenum);for(i=1;i=p-vexnum;i++){printf(\n\t\t\t请输入结点%d的名称:,i);/*输入顶点数据信息*/scanf(%s,p-list[i].data);p-list[i].fistedge=NULL;/*初始化指针*/}for(k=0;kp-edgenum;k++)/*输入各边并构造多重链表*/{printf(\n\t\t\t请输入互相有关联的两个结点:);scanf(%d,%d,&i,&j);q=(EBox*)malloc(sizeof(EBox));q-mark=0;/*对边结点赋值*/q-ivex=i;q-ilink=p-list[i].fistedge;q-jvex=j;q-jlink=p-list[j].fistedge;p-list[i].fistedge=p-list[j].fistedge=q;/*完成边在链头的插入*/}printf(\n);}voidDFS(AMLGraph*p,intv){/*对第v个顶点的深度优先遍历*/intw;EBox*q;visited[v]=1;/*标记已访问结点*/printf(%s,p-list[v].data);for(q=p-list[v].fistedge;q!=NULL;){if(q-ivex==v){w=q-jvex;q=q-jlink;}else6{w=q-ivex;q=q-ilink;}if(!visited[w])DFS(
本文标题:数据结构课程设计报告(图的遍历)
链接地址:https://www.777doc.com/doc-6055903 .html