赞
踩
实验内容:
(1)实现图的邻接矩阵表示,并创建图;
(2)对邻接矩阵表示的图实现深度优先遍历;
深度优先遍历的基本思想:
① 选择一个起始点出发,并访问之;
②一次从起始点的未访问过的邻接点出发,深度遍历图,直到图中与起始点有路径相通的顶点都被访问过为止;
③如此时图中尚有顶点未被访问过,则另选图中一个未访问过的顶点作起始点, 重复上述过程,直到所有顶点被访问过为止。
C语言代码如下:
- #include<stdio.h>
- #define MaxSize 100
- typedef struct
- {
- int n,e; //顶点数、边数
- int link[MaxSize][MaxSize]; //两顶点之间连接
- char vexs[MaxSize]; //顶点的名称
- }MGraph;
-
-
- void CreateGraph(MGraph *G)
- {
- int i,j,k;
- printf("请输入顶点数和边数:");
- scanf("%d%d",&(G->n),&(G->e));
- for(i=0;i<G->n;i++) //初始化邻接矩阵 ,全部置零
- {
- for(j=0;j<G->n;j++)
- {
- G->link[i][j]=0;
- }
- }
-
- printf("\n请输入每个顶点的名称:\n");
- fflush(stdin);
- for(i=0;i<G->n;i++)
- {
- scanf("%c",&G->vexs[i]);
- fflush(stdin); //清除缓冲区
- }
- printf("\n请输入边的信息:");
- for(k=0;k<G->e;k++) //输入邻接矩阵
- {
- scanf("%d,%d",&i,&j);
- G->link[i][j]=1;
- }
- printf("输出的邻接矩阵如下:");
- for(i=0;i<G->n;i++) //打印邻接矩阵
- {
- printf("\n");
- for(j=0;j<G->n;j++)
- printf("%8d",G->link[i][j]) ;
- }
- }
- int visited[MaxSize];
- void dfs(MGraph *G,int i)
- {
- int j;
- printf("%c",G->vexs[i]);
- visited[i]=1;
- for(j=0;j<G->n;j++)
- {
- if(G->link[i][j]==1&&visited[j]==0)
- {
- dfs(G,j);
- }
- }
- }
- void DFSTraverse(MGraph *G)
- {
- int i;
- for(i=0;i<G->n;i++)
- {
- visited[i]=0; //全部标记为未访问
- }
- for(i=0;i<G->n;i++)
- {
- if(visited[i]==0)
- {
- dfs(G,i);
- }
- }
- }
- int main()
- {
- MGraph G;
- CreateGraph(&G);
- printf("\n\n深度优先遍历序列:");
- DFSTraverse(&G);
- return 0;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。