实现无向图邻接矩阵的创建,并实现无向图邻接矩阵方式存储的广度优先遍历的算法,转换成程序并用C语言实现; //用两个数组分别存储顶点表和邻接矩阵 #define MaxInt 32767 //表示极大值,即∞ #define MVNum 100 //最大顶点数 typedef char VerTexType; //假设顶点的数据类型为字符型 typedef int ArcType; //假设边的权值类型为整型 typedef struct{ VerTexType vexs[MVNum]; //顶点表 ArcType arcs[MVNum][MVNum]; //邻接矩阵 int vexnum,arcnum; //图的当前点数和边数 }AMGraph;
时间: 2023-06-20 18:05:26 浏览: 118
以下是C语言实现无向图邻接矩阵的创建和广度优先遍历的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define MaxInt 32767
#define MVNum 100
typedef char VerTexType;
typedef int ArcType;
typedef struct {
VerTexType vexs[MVNum];
ArcType arcs[MVNum][MVNum];
int vexnum, arcnum;
} AMGraph;
typedef struct {
int data[MVNum];
int front, rear;
} Queue;
void InitQueue(Queue *Q) {
Q->front = Q->rear = 0;
}
int QueueEmpty(Queue Q) {
if (Q.front == Q.rear) {
return 1;
} else {
return 0;
}
}
void EnQueue(Queue *Q, int x) {
Q->data[Q->rear++] = x;
}
int DeQueue(Queue *Q) {
return Q->data[Q->front++];
}
void CreateGraph(AMGraph *G) {
int i, j, k;
printf("请输入顶点数和边数:");
scanf("%d%d", &G->vexnum, &G->arcnum);
printf("请输入顶点信息:");
for (i = 0; i < G->vexnum; i++) {
scanf(" %c", &G->vexs[i]);
}
for (i = 0; i < G->vexnum; i++) {
for (j = 0; j < G->vexnum; j++) {
G->arcs[i][j] = MaxInt;
}
}
printf("请输入边的信息:\n");
for (k = 0; k < G->arcnum; k++) {
printf("请输入第%d条边的起点和终点:", k + 1);
scanf("%d%d", &i, &j);
printf("请输入第%d条边的权值:", k + 1);
scanf("%d", &G->arcs[i][j]);
G->arcs[j][i] = G->arcs[i][j]; // 无向图对称
}
}
void BFS(AMGraph G, int v, int visited[]) {
int i, u;
Queue Q;
InitQueue(&Q);
visited[v] = 1;
printf("%c ", G.vexs[v]);
EnQueue(&Q, v);
while (!QueueEmpty(Q)) {
u = DeQueue(&Q);
for (i = 0; i < G.vexnum; i++) {
if (G.arcs[u][i] != MaxInt && !visited[i]) {
visited[i] = 1;
printf("%c ", G.vexs[i]);
EnQueue(&Q, i);
}
}
}
}
void BFSTraverse(AMGraph G) {
int i;
int visited[MVNum];
for (i = 0; i < G.vexnum; i++) {
visited[i] = 0;
}
for (i = 0; i < G.vexnum; i++) {
if (!visited[i]) {
BFS(G, i, visited);
}
}
}
int main() {
AMGraph G;
CreateGraph(&G);
printf("广度优先遍历结果为:");
BFSTraverse(G);
return 0;
}
```
注意:以上代码中的 `VerTexType` 和 `ArcType` 分别表示顶点数据类型和边权值类型,但这里并没有用到它们的具体定义,因此可以根据实际情况进行修改。另外,上面的代码中使用了一个队列来实现广度优先遍历,这里我们采用了循环队列的方式来实现。
阅读全文