数据结构 无向图的存储和遍历
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《数据结构》实验报告
◎实验题目:无向图的存储和遍历
◎实验目的:1、掌握使用Visual C++6.0上机调试程序的基本方法;
2、掌握图的邻接表存储结构和深度优先遍历的非递归算法。
3、提高自己分析问题和解决问题的能力,在实践中理解教材上的理论。
◎实验内容:建立有10个顶点的无向图的邻接表存储结构,然后对其进行深度优先遍历,该无向图可以是无向连通图或无向非连通图。
一、需求分析
1、输入的形式和输入值的范围:根据提示,首先输入图的所有边建立邻接表存储结构,然后输入遍历的起始顶点对图或非连通图的某一连通分量进行遍历。
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 CA AF HG HJ IJ IG
该图为非连通图,各连通分量中的顶点为:
< A F C E B > < D > < G I J H >
输入第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链成一个单链表,这个单链表就称为顶点Vi的邻接表,再将所有邻接表的表头放到数组中,就构成了图的邻接表,邻接表表示中的两种结点结构如下所示。
一种顶点表的结点结构,它由顶点域(vertex)和指向第一条邻接边的指针域(firstedge)构成,另一种是边表(即邻接表)结点,它由邻接点域(adjvex)和指向下一条邻接边的指针域(next)构成。
2、无向图的建立
输入顶点后,将顶点信息存入顶点表的顶点域。在输入边的信息后,如输入的一条边为XY,则生成新的边表结点,将其插入到顶点X的边表头部,同理,生成新的边表结点,将其插入到顶点Y的边表头部。最终完成图的建立。
3、图的深度优先遍历
设p为指向边表结点的指针,首先访问图的指定的起始顶点V,从V出发访问一个与V 邻接的p所指的顶点,并将其压入栈中,再从p所指定点出发,访问与p所指顶点邻接且未被访问的顶点,以后从该顶点出发。重复上述过程,知道找不到存在未访问过的邻接顶点为止。之后执行出栈操作,退回到尚有未访问过的邻接点的顶点,从该顶点出发,重复之前所述的操作,知道所有被访问过的顶点的邻接点都已被访问为止。
下图中的深度优先遍历结果为ABDCEHJIGF,AFCEHGIJDB等。
4、本程序的基本操作和模块:
确定顶点所对应的下标的函数:locate(ALGraph &G,char ch)
建立图的邻接表存储结构的函数:Create(ALGraph &G,SeqStack &s)
深度优先遍历的函数:DFS(ALGraph &G,int v,SeqStack &s,int visited[],int tag)
判断图是否连通的函数:Judge(ALGraph &G,int visited[],SeqStack &s)
确定非连通图连通分量值的函数:Get(ALGraph &G,int visited[],SeqStack &s)
主函数:main( )
函数的调用关系如下图所示:
三详细设计
(一)元素类型、结点类型
1、邻接表的表示形式描述
typedef struct node //边表结点
{
int adjvex; //邻接点域
struct node *next; //指向下一个邻接点的指针域}EdgeNode;
typedef struct vnode //顶点表结点
{
char vertex; //顶点域
EdgeNode *firstedge; //边表头指针
}VertexNode;
typedef VertexNode AdjList[10]; //AdjList是邻接表类型
typedef struct //以邻接表方式存储的图类型
{
AdjList adjlist; //邻接表
int e; //图的边数
}ALGraph;
2、顺序栈的类型描述
typedef struct //存放访问过的结点的栈
{
EdgeNode *pin[10]; //存放边表结点的指针
int top; //栈顶指针
}SeqStack;
(二)每个模块的分析
1、主程序模块
main()
{
①定义数组visited[10],用于记录遍历过程中结点是否已访问过
②定义邻接表存储结构的图,定义栈
③while(1)
{
建立图的邻接表存储结构
判断图是否连通
◎如果图为连通图则执行以下操作
{
输入图的遍历的起始顶点
进行深度优先遍历
}
◎如果图为非连通图则执行以下操作
{
确定非连通图连通分量值
for(j=0;j { 输入某连通分量的遍历的起始顶点 输出该连通分量的遍历的结果 } } 是否继续,若是则继续操作,若否则结束程序 }