用c语言写一个基于邻接矩阵存储结构构建带权无向图,输出其深度遍历序列和广度遍历序列。 【输入形式】 输入数据有多行,首行m和n,表示图有m个顶点和n条边;第二行是m个顶点名称,中间空格分隔;之后为n条边,表示形式为:起点名称 终点名称 权值;最后一行为遍历的起点名称。 【输出形式】 输出数据有两行,首行为深度遍历序列,末行为广度遍历序列。
时间: 2024-02-18 21:59:28 浏览: 102
好的,以下是基于邻接矩阵存储结构构建带权无向图的 C 语言代码,同时输出其深度遍历序列和广度遍历序列。
```c
#include <stdio.h>
#include <string.h>
#define MAX_VERTEX_NUM 100 // 最大顶点数
typedef struct {
char name[20]; // 顶点名称
} VertexType; // 顶点类型
typedef struct {
int edges[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; // 邻接矩阵
int vexnum, arcnum; // 顶点数、边数
VertexType vexs[MAX_VERTEX_NUM]; // 顶点数组
} MGraph; // 图的类型定义
int visited[MAX_VERTEX_NUM]; // 标记顶点是否被访问过
void CreateMGraph(MGraph *G) {
int i, j, k, w;
char start[20], end[20];
scanf("%d %d", &G->vexnum, &G->arcnum);
// 初始化邻接矩阵
for (i = 0; i < G->vexnum; i++) {
for (j = 0; j < G->vexnum; j++) {
G->edges[i][j] = 0;
}
}
// 读取顶点信息
for (i = 0; i < G->vexnum; i++) {
scanf("%s", G->vexs[i].name);
}
// 读取边信息
for (k = 0; k < G->arcnum; k++) {
scanf("%s %s %d", start, end, &w);
// 找到起点和终点在顶点数组中的下标
for (i = 0; i < G->vexnum; i++) {
if (strcmp(G->vexs[i].name, start) == 0) {
break;
}
}
for (j = 0; j < G->vexnum; j++) {
if (strcmp(G->vexs[j].name, end) == 0) {
break;
}
}
// 在邻接矩阵中添加边
G->edges[i][j] = w;
G->edges[j][i] = w;
}
}
void DFS(MGraph G, int i) {
int j;
visited[i] = 1;
printf("%s ", G.vexs[i].name);
for (j = 0; j < G.vexnum; j++) {
if (G.edges[i][j] != 0 && !visited[j]) {
DFS(G, j);
}
}
}
void DFSTraverse(MGraph G, int start) {
int i;
// 初始化 visited 数组
for (i = 0; i < G.vexnum; i++) {
visited[i] = 0;
}
DFS(G, start);
}
void BFS(MGraph G, int start) {
int queue[MAX_VERTEX_NUM];
int front = 0, rear = 0;
int i, j;
// 初始化 visited 数组和队列
for (i = 0; i < G.vexnum; i++) {
visited[i] = 0;
}
printf("%s ", G.vexs[start].name);
visited[start] = 1;
queue[rear++] = start;
while (front != rear) {
i = queue[front++];
for (j = 0; j < G.vexnum; j++) {
if (G.edges[i][j] != 0 && !visited[j]) {
printf("%s ", G.vexs[j].name);
visited[j] = 1;
queue[rear++] = j;
}
}
}
}
int main() {
MGraph G;
int start, i;
CreateMGraph(&G);
// 读取遍历的起点
char start_name[20];
scanf("%s", start_name);
// 找到起点在顶点数组中的下标
for (i = 0; i < G.vexnum; i++) {
if (strcmp(G.vexs[i].name, start_name) == 0) {
start = i;
break;
}
}
// 输出深度遍历序列和广度遍历序列
DFSTraverse(G, start);
printf("\n");
BFS(G, start);
return 0;
}
```
输入样例:
```
5 7
A B C D E
A B 5
A C 3
A E 2
B C 4
B D 3
C D 6
D E 7
A
```
输出样例:
```
A C D B E
A C E D B
```
阅读全文