1、 #include #include#include #define TRUE 1#define FALSE 0#define OK 1#define ERROR 0typedef int Status; #define MAX_NAME 5 /* 顶点字符串的最大长度*/typedef int VRType;typedef char VertexTypeMAX_NAME;#define MAX_VERTEX_NUM 20 /* 最大顶点个数 */typedef struct ArcNodeint adjvex; /* 该弧所指向的顶点的位置 */struct ArcNode *nextarc
2、; /* 指向下一条弧的指针 */ArcNode; /* 表结点 */typedef structVertexType data; /* 顶点信息 */ArcNode *firstarc; /* 第一个表结点的地址,指向第一条依附该顶点的弧(或边)的指针 */VNode,AdjListMAX_VERTEX_NUM; typedef structAdjList vertices;int vexnum,arcnum; /* 图的当前顶点数和弧数 */ALGraph;int LocateVex(ALGraph G,VertexType u) /* 若 G中存在顶点 u,则返回该顶点在图中位置;否则返
3、回-1 */int i;for(i=0;iadjvex;elsereturn -1;int NextAdjVex(ALGraph G,int v,int w) ArcNode *p;p=G.verticesv.firstarc;while(pif(!p|!p-nextarc) return -1;else return p-nextarc-adjvex; Status CreateGraph(ALGraph *G)int i,j,k;VertexType va,vb;ArcNode *p;printf(“请输入图的顶点数,边数: “);scanf(“%d,%d“,printf(“请输入%d 个
4、顶点的值(adjvex=j;p-nextarc=(*G).verticesi.firstarc; /* 插在表头 */(*G).verticesi.firstarc=p;/* 因为无向图,产生第二个表结点 */p=(ArcNode*)malloc(sizeof(ArcNode);p-adjvex=i;p-nextarc=(*G).verticesj.firstarc; /* 插在表头 */(*G).verticesj.firstarc=p;return OK;int visitedMAX_VERTEX_NUM; /* 访问标志数组(全局量) */void(*VisitFunc)(char* v
5、); /* 函数变量(全局量) */void DFS(ALGraph G,int v) int w;visitedv=TRUE; VisitFunc(G.verticesv.data);for(w=FirstAdjVex(G,v);w=0;w=NextAdjVex(G,v,w)if(!visitedw) DFS(G,w);void DFSTraverse(ALGraph G,void(*Visit)(char*) int v;VisitFunc=Visit;for(v=0;vG.vexnum;+v)visitedv=FALSE;for(v=0;vG.vexnum;+v)if(!visitedv) DFS(G,v);void Output(char *i)printf(“%s “,i);void main()ALGraph g;CreateGraph(printf(“深度优先遍历的结果:n“);DFSTraverse(g,Output);