无向图的深度优先遍历序列
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include <stdio.h>
#define MAXVERTEXNUM 20
#define TRUE 1
#define FALSE 0
typedef char VertexType;
typedef int VRType;
typedef int Status;
typedef int InfoType;
typedef enum {DG,DN,UDG,UDN} GraphKind;
typedef struct ArcCell { // 弧的定义
VRType adj; // VRType是顶点关系类型。
// 对无权图,用1或0表示相邻否;
// 对带权图,则为权值类型。
InfoType *info;
} ArcCell,AdjMatrix[MAXVERTEXNUM][MAXVERTEXNUM]; typedef struct { // 图的定义
VertexType vexs[MAXVERTEXNUM]; // 顶点信息 AdjMatrix arcs; // 弧的信息
int vexnum, arcnum; // 顶点数,弧数
GraphKind kind; // 图的种类标志
} MGraph;
int visited[MAXVERTEXNUM];
int LocateVex(MGraph G, VertexType v){
int i;
for(i=0; i<G.vexnum; i++)
if(G.vexs[i]==v)
return i;
return -1;
}
void CreateMGraph(MGraph &G){ //建立无向图
int i,j,k;
char v1,v2;
printf("\n输入顶点数和边数(用逗号隔开) : ");
scanf("%d,%d",&G.vexnum, &G.arcnum);
getchar();
for (i=0 ; i< G.vexnum; ++i)
{printf("输入顶点 %d 的值 : ",i+1);
scanf("%c",&G.vexs[i]);
getchar();}
for (i=0 ; i< G.vexnum; ++i)
for(j=0 ; j< G.vexnum; ++j)
G.arcs[i][j].adj=0;
for(k=1;k<=G.arcnum;k++)
{printf("输入第 %d 条边的起始顶点和终止顶点(用逗号隔开): ",k); scanf("%c,%c",&v1,&v2);
i=LocateVex(G,v1) ; j= LocateVex(G,v2) ;
G.arcs[i][j].adj=1;
G.arcs[j][i].adj=1;
getchar();}
} //END
void DFS(MGraph G,int i);
void DFSTraverse(MGraph G)
{ // 对图 G 作深度优先遍历。
int v;
for (v=0; v<G.vexnum; ++v)
visited[v] = 0; // 访问标志数组初始化
for (v=0; v<G.vexnum; ++v)
if (!visited[v]) DFS(G, v);
// 对尚未访问的顶点调用DFS
}
void DFS(MGraph G,int i)
{int j;
printf("%3c",G.vexs[i]);
visited[i]=1;
for(j=0;j<G.vexnum;++j)
{ if(!visited[j] &&G.arcs[i][j].adj)
DFS(G,j); }
}
void main(){
int i,j;
MGraph G;
CreateMGraph(G);
printf("\n\n图的邻接矩阵显示: \n");
for(i=0;i<G.vexnum;i++)
{for(j=0;j<G.vexnum;j++)
printf("%d ",G.arcs[i][j].adj); printf("\n");}
printf("当前图的深度优先遍历序列为\n"); DFSTraverse(G);
}。