用c语言写,请基于邻接矩阵存储结构构建带权无向图,输出其深度遍历序列和广度遍历序列。 【输入形式】 输入数据有多行,首行m和n,表示图有m个顶点和n条边;第二行是m个顶点名称,中间空格分隔;之后为n条边,表示形式为:起点名称 终点名称 权值;最后一行为遍历的起点名称。 【输出形式】 输出数据有两行,首行为深度遍历序列,末行为广度遍历序列。
时间: 2024-02-06 14:12:04 浏览: 70
数据结构-c语言-带main函数-图7.2-图的存储结构-图的邻接矩阵的创建-有向图。
5星 · 资源好评率100%
好的,我会尽力回答你的问题。首先,我们来看一下如何构建一个带权无向图的邻接矩阵存储结构。
假设我们有m个顶点和n条边,那么我们可以用一个m*m的矩阵来表示这个图。矩阵中每个元素的值表示该边的权值,如果没有边相连,则该元素的值为0。
接下来,我们可以用一个一维数组来存储顶点的名称。假设顶点的名称为字符串类型,那么我们可以用一个char类型的二维数组来存储这些字符串,如下所示:
```c
char vertex[m][20]; // 假设每个顶点的名称不超过20个字符
```
接着,我们可以用一个结构体来表示每条边的信息,包括起点、终点和权值,如下所示:
```c
struct Edge {
int start; // 起点在vertex数组中的下标
int end; // 终点在vertex数组中的下标
int weight; // 权值
};
```
最后,我们可以用一个二维数组来表示邻接矩阵,如下所示:
```c
int matrix[m][m];
```
构建好邻接矩阵存储结构之后,我们就可以开始进行深度遍历和广度遍历了。下面是C语言的代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXV 100 // 最大顶点数
#define INF 0x3f3f3f // 无穷大
char vertex[MAXV][20]; // 顶点名称
int matrix[MAXV][MAXV]; // 邻接矩阵
int visited[MAXV]; // 标记数组,用于深度遍历
int queue[MAXV]; // 队列,用于广度遍历
int front = 0; // 队首指针
int rear = 0; // 队尾指针
struct Edge {
int start; // 起点在vertex数组中的下标
int end; // 终点在vertex数组中的下标
int weight; // 权值
};
void createGraph(int m, int n) {
// 输入顶点名称
for (int i = 0; i < m; i++) {
scanf("%s", vertex[i]);
}
// 初始化邻接矩阵
memset(matrix, INF, sizeof(matrix));
// 输入边的信息
for (int i = 0; i < n; i++) {
char start[20], end[20];
int weight;
scanf("%s %s %d", start, end, &weight);
int u = -1, v = -1;
for (int j = 0; j < m; j++) {
if (strcmp(start, vertex[j]) == 0) {
u = j;
}
if (strcmp(end, vertex[j]) == 0) {
v = j;
}
if (u != -1 && v != -1) {
break;
}
}
matrix[u][v] = matrix[v][u] = weight;
}
}
void dfs(int u) {
visited[u] = 1;
printf("%s ", vertex[u]);
for (int v = 0; v < MAXV; v++) {
if (matrix[u][v] != INF && visited[v] == 0) {
dfs(v);
}
}
}
void bfs(int u, int m) {
printf("%s ", vertex[u]);
visited[u] = 1;
queue[rear++] = u;
while (front != rear) {
int v = queue[front++];
for (int w = 0; w < m; w++) {
if (matrix[v][w] != INF && visited[w] == 0) {
printf("%s ", vertex[w]);
visited[w] = 1;
queue[rear++] = w;
}
}
}
}
int main() {
int m, n;
scanf("%d %d", &m, &n);
createGraph(m, n);
memset(visited, 0, sizeof(visited));
char start[20];
scanf("%s", start);
int u = -1;
for (int i = 0; i < m; i++) {
if (strcmp(start, vertex[i]) == 0) {
u = i;
break;
}
}
printf("深度遍历序列:");
dfs(u);
printf("\n");
memset(visited, 0, sizeof(visited));
front = rear = 0;
printf("广度遍历序列:");
bfs(u, m);
printf("\n");
return 0;
}
```
注意,这里我们使用了一个INF常量来表示无穷大,以便在初始化邻接矩阵时能够将所有元素都赋为无穷大。另外,我们使用了一个标记数组visited来标记某个顶点是否已经被访问过。在深度遍历和广度遍历中,我们需要对visited进行初始化,并在访问完某个顶点后将其标记为已访问。
阅读全文