赞
踩
- #include <stdio.h>
- #include <stdlib.h>
- #define VertexMax 100 //最大顶点数为100
-
- typedef char VertexType; //每个顶点数据类型为字符型
-
- typedef struct
- {
- VertexType Vertex[VertexMax];//存放顶点元素的一维数组
- int AdjMatrix[VertexMax][VertexMax];//邻接矩阵二维数组
- int vexnum,arcnum;//图的顶点数和边数
- }MGraph;
-
- int LocateVex(MGraph *G,VertexType v)//查找元素v在一维数组 Vertex[] 中的下标,并返回下标
- {
- int i;
-
- for(i=0;i<G->vexnum;i++)
- {
- if(v==G->Vertex[i])
- {
- return i;
- }
- }
-
- printf("No Such Vertex!\n");
- return -1;
- }
-
- //无向图
- void CreateUDG(MGraph *G)
- {
- int i,j;
-
- printf("输入顶点个数和边数:\n");
- printf("顶点数 n=");
- scanf("%d",&G->vexnum);
- printf("边 数 e=");
- scanf("%d",&G->arcnum);
- printf("\n");
-
- printf("\n");
-
-
- printf("输入顶点元素(无需空格隔开):");
- scanf("%s",G->Vertex);
- printf("\n");
-
- for(i=0;i<G->vexnum;i++)
- for(j=0;j<G->vexnum;j++)
- {
- G->AdjMatrix[i][j]=0;
- }
-
-
- int n,m;
- VertexType v1,v2;
-
- printf("请输入边的信息:\n");
- for(i=0;i<G->arcnum;i++)
- {
- scanf(" %c%c",&v1,&v2);
- n=LocateVex(G,v1);
- m=LocateVex(G,v2);
-
- if(n==-1||m==-1)
- {
- printf("NO This Vertex!\n");
- return;
- }
-
- G->AdjMatrix[n][m]=1;
- G->AdjMatrix[m][n]=1;
- }
-
- }
-
- void print(MGraph G)
- {
- int i,j;
- printf("\n-------------------------------");
- printf("\n 邻接矩阵:\n\n");
-
- printf("\t ");
- for(i=0;i<G.vexnum;i++)
- printf(" %c",G.Vertex[i]);
- printf("\n");
-
- for(i=0;i<G.vexnum;i++)
- {
- printf("\t%c",G.Vertex[i]);
-
- for(j=0;j<G.vexnum;j++)
- {
- printf(" %d",G.AdjMatrix[i][j]);
- }
- printf("\n");
- }
- }
-
- /*深度优先遍历DFS*/
- int visited[VertexMax];//定义"标志"数组为全局变量
-
- void DFS(MGraph *G,int i)
- {
- int j;
-
- //1.处理起始点
- printf("%c",G->Vertex[i]);//1.输出起始结点
- visited[i]=1;//2.将已访问的结点标志成1
-
- //2.由起始点开始,对后续结点进行操作
- for(j=0;j<G->vexnum;j++)//依次搜索vi的邻接点
- {
- if(G->AdjMatrix[i][j]==1&&visited[j]==0)//当满足有边且未被访问过时,递归调用去查找该邻接点
- {
- DFS(G,j);//注意此处的G已经是指针类型,不需要再&G
- }
- }
-
- }
-
- void DFSTraverse(MGraph *G)
- {
- int i;
-
- //初始化"标志"数组为0,代表未访问
- for(i=0;i<G->vexnum;i++)
- {
- visited[i]=0;
- }
-
- for(i=0;i<G->vexnum;i++)
- {
- if(visited[i]==0)
- {
- DFS(G,i);//注意此处的G已经是指着类型,不需要再&G
- }
- }
-
- }
-
- int main()
- {
- MGraph G;
- CreateUDG(&G);
- print(G);
-
- printf("\n\n深度优先遍历:");
- DFSTraverse(&G);
-
- return 0;
- }
-
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。