用c语言写 广度遍历网 功能描述:推荐采用队列实现遍历网的功能,以用户指定的顶点为起点,输出顶点的广度优先访问序列 调用search(MGraph *MG, char V1)方法,找到遍历开始的顶点位置。 输出网的顶点信息printf("%c ", // 顶点信息); 参数说明:MG-MGraph型参数 返回值说明:无
时间: 2024-03-14 21:43:40 浏览: 51
好的,我会尽力回答你的问题。以下是用C语言实现广度优先遍历图的代码,其中使用了队列数据结构。
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTEX_NUM 50
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define INFINITY 65535
typedef int Status;
typedef char VertexType;
typedef int EdgeType;
typedef struct {
VertexType vexs[MAX_VERTEX_NUM]; // 顶点表
EdgeType arc[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; // 邻接矩阵
int vexnum, arcnum; // 图的当前顶点数和弧数
} MGraph;
typedef struct {
int data[MAX_VERTEX_NUM];
int front, rear;
} Queue;
Status InitQueue(Queue *Q) {
Q->front = 0;
Q->rear = 0;
return OK;
}
Status QueueEmpty(Queue Q) {
if (Q.front == Q.rear) {
return TRUE;
} else {
return FALSE;
}
}
Status EnQueue(Queue *Q, int e) {
if ((Q->rear + 1) % MAX_VERTEX_NUM == Q->front) {
return ERROR;
}
Q->data[Q->rear] = e;
Q->rear = (Q->rear + 1) % MAX_VERTEX_NUM;
return OK;
}
Status DeQueue(Queue *Q, int *e) {
if (Q->front == Q->rear) {
return ERROR;
}
*e = Q->data[Q->front];
Q->front = (Q->front + 1) % MAX_VERTEX_NUM;
return OK;
}
Status CreateGraph(MGraph *MG) {
printf("请输入图的顶点数和边数:\n");
scanf("%d%d", &MG->vexnum, &MG->arcnum);
printf("请输入图的顶点信息:\n");
for (int i = 0; i < MG->vexnum; i++) {
scanf(" %c", &MG->vexs[i]);
}
for (int i = 0; i < MG->vexnum; i++) {
for (int j = 0; j < MG->vexnum; j++) {
MG->arc[i][j] = INFINITY;
}
}
printf("请输入边的信息(起点 终点 权值):\n");
for (int k = 0; k < MG->arcnum; k++) {
int i, j, w;
scanf("%d%d%d", &i, &j, &w);
MG->arc[i][j] = w;
MG->arc[j][i] = w;
}
return OK;
}
int LocateVex(MGraph MG, char V) {
for (int i = 0; i < MG.vexnum; i++) {
if (MG.vexs[i] == V) {
return i;
}
}
return -1;
}
void BFS(MGraph MG, int v, int visited[]) {
Queue Q;
InitQueue(&Q);
visited[v] = TRUE;
printf("%c ", MG.vexs[v]);
EnQueue(&Q, v);
while (!QueueEmpty(Q)) {
int u;
DeQueue(&Q, &u);
for (int w = 0; w < MG.vexnum; w++) {
if (MG.arc[u][w] != INFINITY && !visited[w]) {
visited[w] = TRUE;
printf("%c ", MG.vexs[w]);
EnQueue(&Q, w);
}
}
}
}
void BFSTraverse(MGraph MG) {
int visited[MAX_VERTEX_NUM];
for (int i = 0; i < MG.vexnum; i++) {
visited[i] = FALSE;
}
for (int i = 0; i < MG.vexnum; i++) {
if (!visited[i]) {
BFS(MG, i, visited);
}
}
}
int main() {
MGraph MG;
CreateGraph(&MG);
printf("广度优先遍历序列为:\n");
BFSTraverse(MG);
return 0;
}
```
在主函数中,我们调用了 `CreateGraph()` 来创建图,然后调用 `BFSTraverse()` 来进行广度优先遍历。在 `BFSTraverse()` 函数中,我们对每一个未被访问过的顶点进行 BFS 遍历。
这里有一个辅助函数 `LocateVex()`,它根据顶点信息找到对应的顶点位置,但在本题中并没有用到。
希望能够帮到你!
阅读全文