1、DFS(Depth First Search)图的深度优先搜索#define MaxVerNum 100 /* 最大顶点数为*/typedef enum False,True boolean;#include “stdio.h“#include “stdlib.h“boolean visitedMaxVerNum;typedef struct node /* 表结点*/int adjvex;/* 邻接点域 ,一般是放顶点对应的序号或在表头向量中的下标*/char Info; /*与边(或弧)相关的信息*/struct node * next; /* 指向下一个邻接点的指针域 */ EdgeNo
2、de; typedef struct vnode /* 顶点结点*/ char vertex; /* 顶点域*/EdgeNode * firstedge; /* 边表头指针*/ VertexNode; typedef struct VertexNode adjlistMaxVerNum; /* 邻接表*/int n,e; /* 顶点数和边数*/ ALGraph; /* ALGraph 是以邻接表方式存储的图类型*/建立一个无向图的邻接表存储的算法如下:void CreateALGraph(ALGraph *G)/* 建立有向图的邻接表存储*/int i,j,k;int N,E;EdgeNode
3、 *p;printf(“请输入顶点数和边数: “);scanf(“%d %d“, printf(“n=%d,e=%dnn“,G-n,G-e);getchar();for(i=0;in;i+) /* 建立有 n 个顶点的顶点表*/printf(“请输入第%d 个顶点字符信息(共%d 个):“,i+1,G-n);scanf(“%c“, /* 读入顶点信息*/getchar();G-adjlisti.firstedge=NULL; /* 顶点的边表头指针设为空*/for(k=0;ke;k+) /* 建立边表*/printf(“请输入边 对应的顶点序号 (共%d 个):“,2*G-e);scanf(“
4、%d %d“,/* 读入边的顶点对应序号*/p=(EdgeNode *)malloc(sizeof(EdgeNode); / 生成新边表结点 p p-adjvex=j; /* 邻接点序号为 j */p-next=G-adjlisti.firstedge;/* 将结点 p 插入到顶点 Vi 的链表头部*/G-adjlisti.firstedge=p; printf(“n 图已成功创建!对应的邻接表如下:n“);for(i=0;in;i+)p=G-adjlisti.firstedge;printf(“%c-“,G-adjlisti.vertex);while(p!=NULL)printf(“ %c
5、 “,G-adjlistp-adjvex.vertex);p=p-next;printf(“n“);printf(“n“); /*CreateALGraph*/int FirstAdjVertex(ALGraph *g,int v)/找图 g 中与顶点 v 相邻的第一个顶点if(g-adjlistv.firstedge!=NULL) return (g-adjlistv.firstedge)-adjvex;else return 0;int NextAdjVertex(ALGraph *g ,int vi,int vj )/找图 g 中与 vi 相邻的,相对相邻顶点 vj 的下一个相邻顶点Ed
6、geNode *p;p=g-adjlistvi.firstedge;while( p!=NULL if(p!=NULL else return 0;void DFS(ALGraph *G,int v) /* 从第 v 个顶点出发深度优先遍历图 G */ int w;printf(“%c “,G-adjlistv.vertex);visitedv=True; /* 访问第 v 个顶点,并把访问标志置 True */for(w=FirstAdjVertex(G,v);w;w=NextAdjVertex(G,v,w)if (!visitedw) DFS(G,w); /* 对 v 尚未访问的邻接顶点 w 递归调用 DFS */void DFStraverse(ALGraph *G)/*深度优先遍历以邻接表表示的图 G,而以邻接矩阵表示时,算法完全相同*/ int i,v;for(v=0;vn;v+)visitedv=False;/*标志向量初始化*/for(i=0;in;i+)if(!visited0) DFS(G,0);/*DFS*/void main()ALGraph G;CreateALGraph(printf(“该无向图的深度优先搜索序列为:“);DFStraverse(printf(“nSuccess!n“);