用数组存储结构作为图的存储结构的前提下,试编制图的输入及图的广度优先搜索遍历的有关子程序;编制主程序main{}调用这些子程序,并输出遍历结果。
typedef struct{
int e_num; //边数
int v_num; //顶点个数
int links[SIZE][SIZE]; //邻接矩阵
char vexs[SIZE];
}Graph;
void create(Graph *ph){
printf("输入顶点个数:");
scanf("%d",&ph->v_num);
printf("输入边数:");
scanf("%d",&ph->e_num);
printf("顶点序列:");
scanf("%s",&ph->vexs);
for(int i=1; i<=ph->v_num; i++){
for(int j=1; j<=ph->v_num; j++){
ph->links[i][j] = 0;
}
}
for(int j = 1; j<=ph->e_num; j++){
int start,end,value;
printf("第%d条边:",j);
scanf("%d %d %d",&start,&end,&value);
ph->links[start][end] = value;
ph->links[end][start] = value;
}
}
//一次广度优先遍历
void once_bfs(Graph *ph, Queue *q, int start, int visited[]){
init_queue(q); //队列初始化
visited[start] = 1; //标记已访问
printf("%2c",ph->vexs[start-1]);
push(q,start); //入队
while(!empty(q)){ //判队列是否为空
int nod;
pop(q,&nod); //出队
for(int i=1; i<=ph->v_num; i++){
if(ph->links[nod][i] != 0 && visited[i] == 0){
visited[i] = 1;
printf("->");
printf("%2c",ph->vexs[i-1]);
push(q,i);
}
}
}
}
//一次就遍历结束的图,仅限于连通图
//对于非连通图,需要一次循环
void bfs(Graph *ph,Queue *q){
int visited[SIZE];
for(int i=1; i<=ph->v_num; i++){
visited[i] = 0;
}
for(int i=1; i<=ph->v_num; i++){
if(visited[i] == 0)
once_bfs(ph,q,i,visited);
}
}
int main(){
Graph graph;
Queue queue;
create(&graph);
bfs(&graph,&queue);
return 0;
}