c语言代码 请基于邻接矩阵存储结构构建带权无向图,输出其深度遍历序列和广度遍历序列。输入数据有多行,首行m和n,表示图有m个顶点和n条边;第二行是m个顶点名称,中间空格分隔;之后为n条边,表示形式为:起点名称 终点名称 权值;最后一行为遍历的起点名称。输出数据有两行,首行为深度遍历序列,末行为广度遍历序列。
时间: 2024-02-06 13:09:31 浏览: 113
数据结构期末课程设计题目--输出图的所有广度遍历序列(两种代码实现附课程设计说明书)
以下是基于邻接矩阵存储结构的带权无向图的C语言代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_VERTEX_NUM 100 // 最大顶点数
#define INF 0x3f3f3f3f // 定义正无穷
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;
// 建立带权无向图
void CreateGraph(MGraph *G) {
int i, j, k, w;
char v1[20], v2[20];
printf("请输入顶点数和边数:\n");
scanf("%d%d", &G->vexnum, &G->arcnum);
getchar(); // 处理输入缓冲区中的回车
printf("请输入%d个顶点的名称,中间用空格隔开:\n", G->vexnum);
for (i = 0; i < G->vexnum; i++) {
scanf("%s", G->vexs[i].name);
}
memset(G->edges, INF, sizeof(G->edges)); // 初始化邻接矩阵的边权值为正无穷
printf("请输入%d条边的信息(起点名称 终点名称 权值),中间用空格隔开:\n", G->arcnum);
for (k = 0; k < G->arcnum; k++) {
scanf("%s%s%d", v1, v2, &w);
for (i = 0; i < G->vexnum; i++) {
if (strcmp(G->vexs[i].name, v1) == 0) {
break;
}
}
for (j = 0; j < G->vexnum; j++) {
if (strcmp(G->vexs[j].name, v2) == 0) {
break;
}
}
G->edges[i][j] = w;
G->edges[j][i] = w;
}
}
// 访问顶点
void Visit(VertexType v) {
printf("%s ", v.name);
}
// 深度优先遍历(DFS)
void DFS(MGraph G, int v, int visited[]) {
int i;
Visit(G.vexs[v]);
visited[v] = 1;
for (i = 0; i < G.vexnum; i++) {
if (G.edges[v][i] != INF && !visited[i]) {
DFS(G, i, visited);
}
}
}
// 深度优先遍历(DFS)入口函数
void DFSTraverse(MGraph G, int v) {
int visited[MAX_VERTEX_NUM] = {0}; // 初始化所有顶点为未访问状态
DFS(G, v, visited);
for (int i = 0; i < G.vexnum; i++) {
if (!visited[i]) {
DFS(G, i, visited); // 处理非连通图
}
}
}
// 广度优先遍历(BFS)
void BFSTraverse(MGraph G, int v) {
int i, j;
int queue[MAX_VERTEX_NUM], front = -1, rear = -1; // 队列
int visited[MAX_VERTEX_NUM] = {0}; // 初始化所有顶点为未访问状态
Visit(G.vexs[v]);
visited[v] = 1;
queue[++rear] = v;
while (front < rear) {
i = queue[++front];
for (j = 0; j < G.vexnum; j++) {
if (G.edges[i][j] != INF && !visited[j]) {
Visit(G.vexs[j]);
visited[j] = 1;
queue[++rear] = j;
}
}
}
}
int main() {
MGraph G;
int i;
char start[20];
CreateGraph(&G);
printf("请输入遍历的起点名称:\n");
scanf("%s", start);
for (i = 0; i < G.vexnum; i++) {
if (strcmp(G.vexs[i].name, start) == 0) {
break;
}
}
printf("深度优先遍历序列:\n");
DFSTraverse(G, i);
printf("\n广度优先遍历序列:\n");
BFSTraverse(G, i);
return 0;
}
```
这个程序中,我们首先定义了一个邻接矩阵存储结构的带权无向图,然后通过输入顶点数、边数、顶点名称、边的起点、终点和权值等信息,建立了这个图。接着,我们实现了深度优先遍历(DFS)和广度优先遍历(BFS)算法,并在主函数中分别调用这两个函数,输出了深度遍历序列和广度遍历序列。
阅读全文