#include<stdio.h> #include<stdlib.h> #include<limits.h> #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFINITY 10000 // 整数最大值 #define MAX_VERTEX_NUM 20 // 最大顶点个数 #define DG 1 // 有向图 #define DN 2 // 有向网 #define UDG 3 // 无向图 #define UDN 4 // 无向网 typedef int GraphKind; typedef int VRType; // 顶点关系类型 typedef int VertexType; // 顶点向量类型 // typedef enum {DG, DN, UDG, UDN} GraphKind; // {有向图,有向网,无向图,无向网} typedef struct ArcCell { VRType adj; // 对无权图,用1或0表示相邻否;对带权图,则为权值类型。 }ArcCell, AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; typedef struct { VertexType vexs[MAX_VERTEX_NUM]; // 顶点向量 AdjMatrix arcs; // 邻接矩阵 int vexnum; // 图的当前顶点数 int arcnum; // 图的当前弧数 GraphKind kind; // 图的种类标志 bool visited[MAX_VERTEX_NUM]; // 访问数组 }MGraph; /* 确定顶点在G中的位置*/ int LocateVex(MGraph G, VertexType v) { int m = 0; while(v != G.vexs[m]){ m++; } return m--; } /* 采用邻接矩阵构造无向网G */ int CreateUDN(MGraph *G) { VertexType v1, v2; VRType w; int i, j, k; printf("请输入图的当前顶点数和弧数: "); scanf("%d,%d",&(G->vexnum), &(G->arcnum)); for(i = 0; i < G->vexnum; i++) scanf("%d",&G->vexs[i]); // 构造顶点向量 for(i = 0; i < G->vexnum; i++) for(j = 0; j < G->vexnum; j++) G->arcs[i][j].adj = INFINITY; // 初始化邻接矩阵 for(k = 0; k < G->arcnum; k++) { printf("请输入顶点i、顶点j和权值: "); scanf("%d,%d,%d",&v1, &v2, &w); i = LocateVex(*G, v1); j = LocateVex(*G, v2); G->arcs[i][j].adj = w; G->arcs[j][i] = G->arcs[i][j]; } return OK; } /* 采用邻接矩阵构造无向图G */ int CreateUDG(MGraph *G) { VertexType v1, v2; VRType w; int i, j, k; printf("请输入图的当前顶点数和弧数: "); scanf("%d,%d",&G->vexnum, &G->arcnum); for(i = 0; i < G->vexnum; i++) scanf("%d",&G->vexs[i]); // 构造顶点向量 for(i = 0; i < G->vexnum; i++) for(j = 0; j < G->vexnum; j++) G->arcs[i][j].adj = 0; // 初始化邻接矩阵 for(k = 0; k < G->arcnum; k++) { printf("请输入顶点i、顶点j: "); scanf("%d,%d",&v1, &v2); i = LocateVex(*G, v1); j = LocateVex(*G, v2); G->arcs[i][j].adj = 1; G->arcs[j][i] = G->arcs[i][j]; } for(i = 0; i < G->vexnum; i++){ for(j = 0; j < G->vexnum; j++) printf("%d ",G->arcs[i][j].adj); printf(" "); } return OK; } /* 采用邻接矩阵构造有向网G */ int CreateDN(MGraph *G) { VertexType v1, v2; VRType w; int i, j, k; printf("请输入图的当前顶点数和弧数: "); scanf("%d,%d",&G->vexnum, &G->arcnum); for(i = 0; i < G->vexnum; i++) scanf("%d",&G->vexs[i]); // 构造顶点向量 for(i = 0; i < G->vexnum; i++) for(j = 0; j < G->vexnum; j++) G->arcs[i][j].adj = INFINITY; // 初始化邻接矩阵 for(k = 0; k < G->arcnum; k++) { printf("请输入弧尾、弧头和权值: "); scanf("%d,%d,%d",&v1, &v2, &w); i = LocateVex(*G, v1); j = LocateVex(*G, v2); G->arcs[i][j].adj = w; } return OK; } /* 采用邻接矩阵构造有向图G */ int CreateDG(MGraph *G) { VertexType v1, v2; VRType w; int i, j, k; printf("请输入图的当前顶点数和弧数: "); scanf("%d,%d",&G->vexnum, &G->arcnum); for(i = 0; i < G->vexnum; i++) scanf("%d",&G->vexs[i]); // 构造顶点向量 for(i = 0; i < G->vexnum; i++) for(j = 0; j < G->vexnum; j++) G->arcs[i][j].adj = 0; // 初始化邻接矩阵 for(k = 0; k < G->arcnum; k++) { printf("请输入弧尾、弧头: "); scanf("%d,%d",&v1, &v2); i = LocateVex(*G, v1); j = LocateVex(*G, v2); G->arcs[i][j].adj = 1; } return OK; } /* 采用邻接矩阵构造图G*/ int CreateGraph(MGraph *G) { printf("请输入图的类型: "); scanf("%d", &((*G).kind)); switch((*G).kind) { case DG: return CreateDG(G); // 构造有向图G case DN: return CreateDN(G); // 构造有向网G case UDG: return CreateUDG(G); // 构造无向图G case UDN: return CreateUDN(G); // 构造无向网G default: return ERROR; } } // CreateGraph /* 访问结点*/ void visit(MGraph *G, int i) { printf ("%d->",G->vexs[i]); G->visited[i] = true; } /* */ void DFStraverse(MGraph *G,int i){ visit(G, i); for (int j=0; j < G->vexnum; ++j) { if (!G->visited[j] && G->arcs[i][j].adj!=0) DFStraverse(G,j); } } int main(){ MGraph G; CreateGraph(&G); DFStraverse(&G, 4); return 0; }