数据结构 无向图的存储和遍历

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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

{

输入某连通分量的遍历的起始顶点

输出该连通分量的遍历的结果

}

}

是否继续,若是则继续操作,若否则结束程序

}

相关文档
最新文档