1、数据结构实验报告实验题目:无向图的存储和遍历实验目的:1、掌握使用 Visual C+6.0 上机调试程序的基本方法;2、掌握图的邻接表存储结构和深度优先遍历的非递归算法。3、提高自己分析问题和解决问题的能力,在实践中理解教材上的理论。实验内容:建立有 10 个顶点的无向图的邻接表存储结构,然后对其进行深度优先遍历,该无向图可以是无向连通图或无向非连通图。一、需求分析1、输入的形式和输入值的范围:根据提示,首先输入图的所有边建立邻接表存储结构,然后输入遍历的起始顶点对图或非连通图的某一连通分量进行遍历。2、输出的形式:输出对该图是连通图或非连通图的判断结果,若是非连通图则输出各连通分量的顶点,
2、之后输出队连通图或非连通图的某一连通分量的遍历结果。3、程序所能达到的功能:输入图的所有边后,建立图的邻接表存储结构,判断该图是连通图或非连通图,最后对图进行遍历。4、测试数据:输入 10 个顶点(空格分隔):A B C D E F G H I J输入边的信息(格式为 x y) :AB AC AF CE BD DC HG GI IJ HJ EH该图为连通图,请输入遍历的起始顶点 :A遍历结果为:A F C D B E H J I G是否继续?(是,输入 1;否,输入 0):1输入 10 个顶点(空格分隔):A B C D E F G H I J输入边的信息(格式为 xy):AB AC CE C
3、A AF HG HJ IJ IG该图为非连通图,各连通分量中的顶点为 :输入第 1 个连通分量起始顶点:F第 1 个连通分量的遍历结果为:F A C E B输入第 2 个连通分量起始顶点:I第 2 个连通分量的遍历结果为:I G H J输入第 3 个连通分量起始顶点:D第 3 个连通分量的遍历结果为:D是否继续?(是,输入 1;否,输入 0):0谢谢使用!Press any key to continue二 概要设计1、邻接表是图的一种顺序存储与链式存储结构结合的存储方法。邻接表表示法类似于树的孩子链表表示法。就是对图 G 中的每个顶点 Vi,将所有邻接于 Vi 的顶点 Vj 链成一个单链表,
4、这个单链表就称为顶点 Vi 的邻接表,再将所有邻接表的表头放到数组中,就构成了图的邻接表,邻接表表示中的两种结点结构如下所示。一种顶点表的结点结构,它由顶点域(vertex)和指向第一条邻接边的指针域(firstedge)构成,另一种是边表(即邻接表)结点,它由邻接点域(adjvex)和指向下一条邻接边的指针域(next)构成。2、无向图的建立输入顶点后,将顶点信息存入顶点表的顶点域。在输入边的信息后,如输入的一条边为 XY,则生成新的边表结点,将其插入到顶点 X 的边表头部,同理,生成新的边表结点,将其插入到顶点 Y 的边表头部。最终完成图的建立。3、图的深度优先遍历设 p 为指向边表结点的
5、指针,首先访问图的指定的起始顶点 V,从 V 出发访问一个与V 邻接的 p 所指的顶点,并将其压入栈中,再从 p 所指定点出发,访问与 p 所指顶点邻接且未被访问的顶点,以后从该顶点出发。重复上述过程,知道找不到存在未访问过的邻接顶点为止。之后执行出栈操作,退回到尚有未访问过的邻接点的顶点,从该顶点出发,重复之前所述的操作,知道所有被访问过的顶点的邻接点都已被访问为止。下图中的深度优先遍历结果为 ABDCEHJIGF,AFCEHGIJDB 等。4、本程序的基本操作和模块:确定顶点所对应的下标的函数:locate(ALGraph /邻接点域struct node *next; /指向下一个邻接点
6、的指针域EdgeNode;typedef struct vnode /顶点表结点char vertex; /顶点域EdgeNode *firstedge; /边表头指针VertexNode;typedef VertexNode AdjList10; /AdjList 是邻接表类型typedef struct /以邻接表方式存储的图类型AdjList adjlist; /邻接表int e; /图的边数ALGraph;2、顺序栈的类型描述typedef struct /存放访问过的结点的栈EdgeNode *pin10; /存放边表结点的指针int top; /栈顶指针SeqStack;(2)每个
7、模块的分析1、主程序模块main()定义数组 visited10,用于记录遍历过程中结点是否已访问过定义邻接表存储结构的图,定义栈while(1)建立图的邻接表存储结构判断图是否连通如果图为连通图则执行以下操作输入图的遍历的起始顶点进行深度优先遍历 如果图为非连通图则执行以下操作确定非连通图连通分量值 for(j=0;j 输入第 1 个连通分量起始顶点:F第 1 个连通分量的遍历结果为:F A C E B输入第 2 个连通分量起始顶点:I第 2 个连通分量的遍历结果为:I G H J输入第 3 个连通分量起始顶点:D第 3 个连通分量的遍历结果为:D是否继续?(是,输入 1;否,输入 0):0
8、谢谢使用!Press any key to continue由上测试结果分析得,该程序功能满足题目要求。3、调试过程中遇到的问题及解决方法本次实验的错误的主要发生在输入边的信息上,对于直接输入字符型的边的信息,出现过很多错误,在参考了 C 程序设计的教材后,对字符串的输入的部分进行了复习,最后修改正确。另外,因为程序修改后,对边或顶点的输入都为字符的形式,忽略了吸收回车,在运行过程中出现了错误,因为以前也犯过这样的错误,所以很快意识到并改正。还有在函数中将输入的顶点转化成字符,以及求非连通图的连通分量时,出现了相应的返回值与实际值相差 1 的情况,这个问题在认真地分析程序后修改正确。4、运行界面五、实验总结本次实验提前作了预习,初次编写的程序由于照搬教材上的程序使运行界面显得很不人性化,在实验课上经过老师的指点后认识到了这个问题,在课下对程序进行了认真的修改,增加了一些函数,使程序更加完善。我在 11 月 17 日完成了本次实验。本次实验中在输入和输出中遇到了一些问题主要是由于 C 语言的部分知识生疏,在参考了 C 语言的教材后,最后修改正确。在本次实验中我对图的邻接表存储结构和深度优先遍历的非递归算法有了更加深刻的认识。提高自己分析问题和解决问题的能力,在实践中理解教材上的理论。我很感谢老师对我的指点。在这次实验中收获了很多。教师评语:实验成绩:指导教师签名:批阅日期: