数据结构实验—图的建立与遍历
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验十图的建立与遍历
1.实验目的
(1)掌握图的含义。
(2)掌握用邻接矩阵和邻接链表的方法描述图的存储结构。
(3)理解并掌握深度优先遍历方法和广度优先遍历方法的存储结构。2.实验内容
(1)建立无向图的邻接矩阵,并实现插入、删除边的功能。
(2)建立有向图的邻接表,并实现插入、删除边的功能。
(3)实现该图的深度优先遍历与广度优先遍历。
3.实验要求
(1)根据实验内容编写程序,上机调试并获得运行结果
(2)撰写实验报告
4.准备工作
本次实验将建立如图所示有向图和无向图,并会根据此进行插入,删除,遍历操作
5.关键操作与算法
(1)建立邻接矩阵
算法思想;
建立邻接矩阵即用一维数存储图中的顶点信息,用二维数组(矩阵)存储图中各顶点之间的邻接关系。假设图G(V,E)有n个确定的顶点,即V={V,V,…,Vn-1},则表示G 中各顶点相邻关系的是一个n*n的矩阵,矩阵的元素值为
若G是带权图(网),则邻接矩阵可定义为
其中,w表示边(v,v)或<v,V>上的权值;∞表示一个计算机允许的、大于所有边上权值的数,代表此路不通;若v1=v1,则A[i][j]的值取0。
算法如下;
1.void CreateMGragh(GraphMatrix *g)
2.{
3.int i, j, k, t;
4.float w;//权值
5. printf("请输入无向网的顶点个数(不超过%d个): ",MAXVEX);
6. scanf("%d",&g->vexNum);
7. printf("\n请输入各顶点信息: \n");
8. getchar();//吞掉上一步的回车
9.for(i = 0; i < g->vexNum; i++)
10. gets(g->vexs[i]);//输入各个顶点信息
11.for (i = 0; i < g->vexNum; i++)
12.for (j = 0; j < g->vexNum; j++)
13. {
14. g->arcs[i][j] = 0;//初始化邻接矩阵
15. }
16. printf("\n");
17. printf("请输入图的边数(不超过%d
个): ",(g->vexNum * (g->vexNum - 1))/2);
18. scanf("%d",&k); //边的数目,这里的后面不用加getchar(),因为后面的一个输入的
是一个整型类型
19.for(t = 0; t < k; t++)
20. {
21. printf("\n请输入第%d条边的相关信息(起始顶点(序号从0开始) 终止顶点权值,
如0 3 10.3)\n",t + 1);
22. scanf("%d%d%f",&i,&j,&w);
23. g->arcs[i][j] = w; //无向网的权是对称的
24. g->arcs[j][i] = w;
25. }
26.}
(2)创建邻接表
算法步骤;
邻接表(Adjacency List)是图的另一种存储方式,它是一种将顺序存储与链式存储相合的存储方法。该方法是为图中每个顶点都建立一个单链表,即对于图G中的每个顶点v,将v1的所有邻接点v都链在一个单链表里,该单链表称为顶点v1的邻接表(链式存储构),再将所有顶点的邻接表表头集中放到一个一维数组(顺序存储结构)中,两者一起就成了图的邻接表结构。
算法如下;
1.void CreateALGragh(GraphList *g)
2.{
3.int i,j,k;
4. EdgeNode *s;
5.float w;
6. printf("请输入有向网的顶点个数,(不超过%d个): ",MAXVEX);
7. scanf("%d",&g->VexNum);
8. printf("请输入各个顶点的信息:\n");
9. getchar();
10.for(i = 0; i
11. {
12. gets(g->vexs[i].vertex);
13. g->vexs[i].firstarc = NULL;//这里vex[i].firstarc的点是因为vex[i]为结
构体,所以引用它其中的内容使需要用"."运算符
14. }
15. printf("\n");
16. printf("请输入图的边数(不超过%d个): ",g->VexNum * (g->VexNum - 1));
17. scanf("%d",&g->EdgeNum);
18.for(k = 0;k < g->EdgeNum; k++)
19. {
20. printf("\n请输入第%d条边的相关信息(起始顶点(序号从0开始) 终止顶点权
值,如0 3 10.3)\n",k + 1);
21. scanf("%d%d%f",&i,&j,&w);
22. s = (EdgeNode*)(malloc(sizeof(EdgeNode)));
23. s->endvex = j;
24. s->next = g->vexs[i].firstarc;
25. s->weight = w;
26. g->vexs[i].firstarc = s;
27. }
28.}
(3)无向网深度优先遍历
算法过程;
假设初始状态是未被访问过的图中所有顶点,则深度优先搜索可从图中某个顶点v出发,首先访问该顶点,然后从v的所有未被访问的邻接点中选择某一个邻接点w访问,然后再从w的所有未被访问的邻接点中选择某一个邻接点x访问,依此类推,直至图中所有和有路径相通的顶点都被访问过为止;若此时图中仍有顶点未被访问,则另选图中一个未曾被访问的顶点作为起始点,重复上述过程,直至图中所有顶点都被访问过为止。
算法如下;
1.void MUDGDFS(GraphMatrix *g, int v,int visited[])//visited数组是用来判断某节点
是否被访问过的判断基准
2.{
3. DataType w;
4. visited[v] = TRUE;
5. printf("%d\t", v);
6.for(w = MUDGFirstAdjacent(g, v); w != ERROR; w = MUDGNextAdjacent(g, v,
w))
7. {
8.if(visited[w] != TRUE) //该顶点没有被访问过
9. MUDGDFS(g,w,visited);
10. }
11.}