直接上源代码: tu.h文件 typedef enum{FALSE,TRUE} Boolean; Boolean visited[Max_Vertex_Num]; typedef struct { int vexs[Max_Vertex_Num]; //顶点表 int edges[Max_Vertex_Num][Max_Vertex_Num]; //邻接矩阵,可看作边表 int n,e; //图中的顶点数n和边数e }MGraph; //用邻接矩阵表示的图的类型 void CreatMGraph(MGraph *G); void DFSM(MGraph *G,int i); void DFS(MGraph *G); void BFS(MGraph *G,int k); tu.c文件 #include"tu.h" void CreatMGraph(MGraph *G) { int i,j,k; printf("请分别输入图的顶点个数和边的条数:/n"); scanf("%d%d",&G->n,&G->e); //输入顶点数和边数 printf("请输入顶点信息:"); for(i=0;i<G->n;i++) scanf("%d",&G->vexs[i]); //读入顶点信息,建立顶点表 for(i=0;i<G->n;i++) for(j=0;j<G->n;j++) G->edges[i][j]=0; //初始化邻接矩阵 printf("请输入边所依附的顶点的序号构建无向图的邻接矩阵/n"); for(k=0;k<G->e;k++) { //读入e条边,建立邻接矩阵 scanf("%d%d",&i,&j); //输入边(Vi,Vj)的顶点序号 G->edges[i][j]=1; G->edges[j][i]=1; } } //深度优先搜索函数 void DFSM(MGraph *G,int i) { //以Vi为出发点对邻接矩阵表示的图G进行DFS搜索,邻接矩阵是0,1矩阵 int j; printf("%d",G->vexs[i]); //访问顶点Vi visited[i]=TRUE; //置已访问标志 for(j=0;j<G->n;j++) //依次搜索Vi的邻接点 if(G->edges[i][j]==1 && ! visited[j]) DFSM(G,j); //(Vi,Vj)∈E,且Vj未访问过,故Vj为新出发点 } void DFS(MGraph *G) { int i; for(i=0;i<G->n;i++) visited[i]=FALSE; //标志向量初始化 for(i=0;i<G->n;i++) if(!visited[i]) //Vi未访问过 DFSM(G,i); //以Vi开始DFS搜索 } //广度优先遍历搜索函数 void BFS(MGraph *G,int k) { //以k开始对用邻接矩阵表示的图G进行广度优先搜索 int i,j,f=0,r=0; int queue[Max_Vertex_Num]; //定义队列 for(i=0;i<G->n;i++) visited[i]=FALSE; //标志向量初始化 for(i=0;i<G->n;i++) queue[i]=-1; //队列初始化 printf("%d",G->vexs[k]); //访问初始点k visited[k]=TRUE; queue[r]=k; //k已访问,将其入队。注意,实际上是将其序号入队 while(queue[f]!=-1) { //队非空则执行 i=queue[f]; f=f+1; //f出队 for(j=0;j<G->n;j++) //依次访问i的邻接点j if(G->edges[i][j]==1 && !visited[j]) { //j未访问 printf("%d",G->vexs[j]); //访问j visited[j]=TRUE; r=r+1; queue[r]=j; //访问过j入队 } } } main.c文件 #include<stdio.h> #include<stdlib.h> #include"tu.c" //主函数 int main(void) { int i; MGraph * G; G=(MGraph *)malloc(sizeof(MGraph)); //为图G申请内存空间 CreatMGraph(G); //建立邻接矩阵 printf("深度优先搜索结果为:"); DFS(G); //深度优先遍历 printf("/n"); printf("广度优先搜索结果为: "); BFS(G,3); //以序号为3的顶点开始广度优先遍历 printf("/n"); return 0; } 实验结果截图为: