65,210
社区成员
发帖
与我相关
我的任务
分享
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTEX_NUM 20//最大顶点的个数
int Visited[MAX_VERTEX_NUM];
typedef struct ArcCell{
int adj;
char* info;//弧的相关信息
}ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
typedef struct{
char vex[MAX_VERTEX_NUM];//顶点向量
AdjMatrix arcs;//邻接矩阵
int vexnum,arcnum;//顶点数,弧数
}MGraph;
int LocateVex(MGraph G,char v1)//查找v1在图G中的位置
{
int i=0;
for(;i <G.vexnum;i++)
if(G.vex[i]==v1)
return i;
if(i>=G.vexnum)
cout <<"ERROR!" << endl;
return -1;
}
void CreatUDG(MGraph &G)//采用数组表示法构造无向图G
{
cout <<"请输入您要创建的无向图的顶点的个数:";
cin>>G.vexnum;
cout <<"请输入您要创建的无向图的弧的个数:";
cin>>G.arcnum;
int i=0;
int j=0;
for(;i <G.vexnum;i++)//构造顶点数组
{
cout <<"请输入第" <<i+1 <<"个顶点:";
cin>>G.vex[i];
}
for(i=0;i <G.vexnum;i++)//初始化邻接矩阵
{
for(;j <G.vexnum;j++)
{
G.arcs[i][j].adj=0;
G.arcs[i][j].info=NULL;
}
}
char v1,v2;
for(int k=0;k <G.arcnum;k++)
{
cout <<"请输入第" <<k+1 <<"条弧的两个顶点:" <<endl;
cout <<"顶点1:";
cin>>v1;
cout <<"顶点2:";
cin>>v2;
i=LocateVex(G,v1);//确定v1在图G中的位置
j=LocateVex(G,v2);//确定v2在图G中的位置
G.arcs[i][j].adj=1;
G.arcs[j][i]=G.arcs[i][j];
}
cout <<"创建无向图成功!" <<endl;
}
int FirstAdjVex(MGraph G, int v)//得到v的第一个邻接顶点
{
for(int i=0;i <G.vexnum;i++)
{
if(G.arcs[v][i].adj)
{
return i;
}
}
return -1;
}
int NextAdjVex(MGraph G, int v,int nTemp)
{
for(int i=nTemp+1;i <G.vexnum;i++)
{
if(G.arcs[v][i].adj)
{
return i;
}
}
return -1;
}
void DFS(MGraph G,int v1)
{
Visited[v1]=true;
cout <<G.vex[v1];
int nTemp;
for(nTemp=FirstAdjVex(G,v1);nTemp>=0;nTemp=NextAdjVex(G,v1,nTemp))
if(!Visited[nTemp])
DFS(G,nTemp);
}
void DFSTraverse(MGraph G)//深度优先遍历函数
{
int v1 = 0;
for(;v1 <G.vexnum;v1++)
Visited[v1]=0;//初始化方问标志
for(v1=0;v1 <G.vexnum;v1++)
if(!Visited[v1])
DFS(G,v1);
}
void main()
{
MGraph G;
CreatUDG(G);//创建无向图G
DFSTraverse(G);//对图G作深度优先遍历
}