利用邻接矩阵存储一张图,分别采用图的深度优先搜索和广度优先搜索遍历该图,并输出遍历结果。
主程序:
#include <stdio.h>
#include <stdlib.h>
#define MAXVEX 100 //最大顶点数
#define INFINITY 65535 //用65535来代表无穷大
int visited[MAXVEX]={0};
typedef struct
{
char vexs[MAXVEX]; //顶点表
int arc[MAXVEX][MAXVEX]; //邻接矩阵,可看作边
int numVertexes, numEdges; //图中当前的顶点数和边数
}Graph;
void CreateGraph(Graph *g)
{ int i,j,k,w,t;
printf("输入顶点数,边数和t(中间用空格):");
scanf("%d %d %d", &(g->numVertexes), &(g->numEdges),&t);
printf("\n");
for(i=1;i<=g->numVertexes;i++)
{
getchar();
printf("输入第%d顶点信息vexs[%d]=",i,i);
scanf("%c",&(g->vexs[i]));
}
printf("\n");
for(i=1;i<=g->numVertexes;i++)
for(j=1;j<=g->numVertexes;j++)
if (t>2) g->arc[i][j] = INFINITY;
else g->arc[i][j]=0;
for(k=1;k<=g->numEdges;k++)
{
printf("输入i j(中间用空格):");
scanf("%d %d",&i,&j);
if(i>g->numVertexes ||j>g->numVertexes) exit(0);
if(t>2)
{
printf("输入w:");
scanf("%d",&w);
g->arc[i][j]=w;
if(t==3) g->arc[j][i]=w;
}
else
{ g->arc[i][j]=1;
if (t==1) g->arc[j][i]=1;
}
}
printf("\n");
printf("输出邻接矩阵:\n");
for(i=1;i<=g->numVertexes ;i++)
{
for(j=1;j<=g->numVertexes ;j++)
{
printf("%8d",g->arc[i][j]);
if(t>2&&g->arc[i][j]==65535)
g->arc[i][j]=0;
else if(t>2&&g->arc[i][j]!=65535)
g->arc[i][j]=1;
}
printf("\n");
}
}
void dfs (Graph g,int i) //广度优先搜索,从顶点i开始遍历
{
int j;
printf("%d->",i); //输出访问顶点
visited[i]=1; //全局数组访问标记置1表示已经访问
for(j=1; j<=g.numVertexes; j++)
if ((g.arc[i][j]==1)&&(!visited[j]))
dfs (g,j);
}
void bfs (Graph g,int i)
{
int visited[MAXVEX]={0};
int q[g.numVertexes+1] ;
int f,r,j ;
f=r=0 ;
printf("%d->",i);
visited[i]=1 ;
r++;
q[r]=i ;
while (f<r)
{ f++; i=q[f] ;
for (j=1; j<=g.numVertexes; j++)
if ((g.arc[i][j]==1)&&(!visited[j]))
{ printf("%d->",j); ; visited[j]=1 ; r++; q[r]=j ; }
}
}
int main()
{
Graph g;
int i;
printf("t为1~4,分别表示无向图、有向图、带权无向图、带权有向图\n");
CreateGraph(&g);
printf("\n输入i:");
scanf("%d",&i);
printf("\n深度优先搜索遍历:");
dfs (g,i);
printf("NULL\n");
printf("广度优先搜索遍历:");
bfs (g,i);
printf("NULL\n");
return 0;
}
输入输出示例:
1.无向图
t为1~4,分别表示无向图、有向图、带权无向图、带权有向图
输入顶点数,边数和t(中间用空格):8 10 1
输入第1顶点信息vexs[1]=1
输入第2顶点信息vexs[2]=2
输入第3顶点信息vexs[3]=3
输入第4顶点信息vexs[4]=4
输入第5顶点信息vexs[5]=5
输入第6顶点信息vexs[6]=6
输入第7顶点信息vexs[7]=7
输入第8顶点信息vexs[8]=8
输入i j(中间用空格):1 2
输入i j(中间用空格):1 3
输入i j(中间用空格):2 4
输入i j(中间用空格):2 5
输入i j(中间用空格):3 6
输入i j(中间用空格):3 7
输入i j(中间用空格):4 8
输入i j(中间用空格):5 8
输入i j(中间用空格):6 8
输入i j(中间用空格):7 8
输出邻接矩阵:
0 1 1 0 0 0 0 0
1 0 0 1 1 0 0 0
1 0 0 0 0 1 1 0
0 1 0 0 0 0 0 1
0 1 0 0 0 0 0 1
0 0 1 0 0 0 0 1
0 0 1 0 0 0 0 1
0 0 0 1 1 1 1 0
输入i:1
深度优先搜索遍历:1->2->4->8->5->6->3->7->NULL
广度优先搜索遍历:1->2->3->4->5->6->7->8->NULL
--------------------------------
Process exited after 74.92 seconds with return value 0
请按任意键继续. . .
2.带权无向图
t为1~4,分别表示无向图、有向图、带权无向图、带权有向图
输入顶点数,边数和t(中间用空格):5 8 3
输入第1顶点信息vexs[1]=1
输入第2顶点信息vexs[2]=2
输入第3顶点信息vexs[3]=3
输入第4顶点信息vexs[4]=4
输入第5顶点信息vexs[5]=5
输入i j(中间用空格):1 2
输入w:6
输入i j(中间用空格):1 3
输入w:1
输入i j(中间用空格):1 5
输入w:3
输入i j(中间用空格):2 5
输入w:9
输入i j(中间用空格):2 4
输入w:8
输入i j(中间用空格):4 5
输入w:7
输入i j(中间用空格):4 3
输入w:2
输入i j(中间用空格):3 5
输入w:4
输出邻接矩阵:
65535 6 1 65535 3
6 65535 65535 8 9
1 65535 65535 2 4
65535 8 2 65535 7
3 9 4 7 65535
输入i:3
深度优先搜索遍历:3->1->2->4->5->NULL
广度优先搜索遍历:3->1->4->5->2->NULL
--------------------------------
Process exited after 42.63 seconds with return value 0
请按任意键继续. . .