1. c语言编写按键盘输入的数据建立图的邻接矩阵存储。 2. 编写图的深度优先遍历程序。 3. 编写图的广度优先遍历程序。 4. 设计一个选择菜单实现上述的各种基本操作 。
时间: 2024-01-24 08:16:50 浏览: 62
以下是一个简单的实现,仅供参考:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 50
// 图的邻接矩阵存储结构
typedef struct {
int vertex[MAX_SIZE]; // 顶点数组
int edge[MAX_SIZE][MAX_SIZE]; // 邻接矩阵,edge[i][j]为1表示i和j之间有边,为0表示没有边
int vertex_num; // 顶点数目
int edge_num; // 边数目
} Graph;
// 初始化图
void init_graph(Graph *g) {
int i, j;
for (i = 0; i < MAX_SIZE; i++) {
g->vertex[i] = 0;
for (j = 0; j < MAX_SIZE; j++) {
g->edge[i][j] = 0;
}
}
g->vertex_num = 0;
g->edge_num = 0;
}
// 添加边
void add_edge(Graph *g, int u, int v) {
g->edge[u][v] = 1;
g->edge[v][u] = 1;
g->edge_num++;
}
// 深度优先遍历
void dfs(Graph *g, int v, int *visited) {
int i;
visited[v] = 1;
printf("%d ", v);
for (i = 0; i < g->vertex_num; i++) {
if (g->edge[v][i] && !visited[i]) {
dfs(g, i, visited);
}
}
}
// 广度优先遍历
void bfs(Graph *g, int v, int *visited, int *queue) {
int front = 0, rear = 0;
visited[v] = 1;
printf("%d ", v);
queue[rear++] = v;
while (front < rear) {
int u = queue[front++];
int i;
for (i = 0; i < g->vertex_num; i++) {
if (g->edge[u][i] && !visited[i]) {
visited[i] = 1;
printf("%d ", i);
queue[rear++] = i;
}
}
}
}
int main() {
Graph g;
init_graph(&g);
int choice, u, v, i;
int visited[MAX_SIZE] = {0};
int queue[MAX_SIZE];
while (1) {
printf("1. 添加边\n");
printf("2. 深度优先遍历\n");
printf("3. 广度优先遍历\n");
printf("4. 退出\n");
scanf("%d", &choice);
switch (choice) {
case 1:
printf("请输入边的两个顶点u,v(0<=u,v<%d):", MAX_SIZE);
scanf("%d %d", &u, &v);
add_edge(&g, u, v);
break;
case 2:
printf("请输入遍历起点:");
scanf("%d", &u);
dfs(&g, u, visited);
printf("\n");
for (i = 0; i < MAX_SIZE; i++) {
visited[i] = 0;
}
break;
case 3:
printf("请输入遍历起点:");
scanf("%d", &u);
bfs(&g, u, visited, queue);
printf("\n");
for (i = 0; i < MAX_SIZE; i++) {
visited[i] = 0;
}
break;
case 4:
exit(0);
default:
printf("输入有误,请重新输入!\n");
}
}
return 0;
}
```
在主函数中,通过一个无限循环,实现了一个简单的选择菜单,可以让用户选择添加边、深度优先遍历、广度优先遍历和退出等操作。其中,深度优先遍历和广度优先遍历使用了递归和队列的方式实现。注意,在遍历之前需要将visited数组初始化为0,表示所有顶点都未被访问过。
阅读全文