#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;
}
邻接矩阵的深度优先遍历
最新推荐文章于 2023-11-18 14:07:14 发布