无向图的深度优先遍历序列
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include
#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 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 visited[v] = 0; // 访问标志数组初始化 for (v=0; 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 { 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 {for(j=0;j printf("%d ",G.arcs[i][j].adj); printf("\n");} printf("当前图的深度优先遍历序列为\n"); DFSTraverse(G); }