用c语言设计一个基于DOS菜单的应用程序。内容如下: 1. 无向图的基本操作及应用 ① 创建无向图的邻接矩阵 ② 创建无向图的邻接表 ③ 无向图的深度优先遍历 ④ 无向图的广度优先遍历
时间: 2024-02-24 21:53:05 浏览: 70
好的,我会尽力回答你的问题。
首先,你想要设计一个基于DOS菜单的应用程序,可以使用C语言来实现。下面是一个简单的框架:
```c
#include <stdio.h>
#include <conio.h>
int main() {
int choice;
while (1) {
clrscr(); // 清屏
printf("1. 创建无向图的邻接矩阵\n");
printf("2. 创建无向图的邻接表\n");
printf("3. 无向图的深度优先遍历\n");
printf("4. 无向图的广度优先遍历\n");
printf("5. 退出\n");
printf("\n请输入选项:");
scanf("%d", &choice);
switch (choice) {
case 1:
// 创建无向图的邻接矩阵
break;
case 2:
// 创建无向图的邻接表
break;
case 3:
// 无向图的深度优先遍历
break;
case 4:
// 无向图的广度优先遍历
break;
case 5:
// 退出程序
return 0;
default:
printf("\n无效选项,请重新输入!");
break;
}
printf("\n按任意键继续...");
getch(); // 等待键盘输入
}
return 0;
}
```
接下来,我们可以分别实现每个选项的功能。
1. 创建无向图的邻接矩阵
```c
#define MAX_VERTEX_NUM 100
int G[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; // 邻接矩阵
int n; // 顶点数
void createGraph() {
printf("\n请输入顶点数:");
scanf("%d", &n);
printf("\n请输入边数:");
scanf("%d", &m);
// 初始化邻接矩阵
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
G[i][j] = 0;
}
}
// 输入边的信息
for (int i = 0; i < m; i++) {
int u, v;
printf("\n请输入第%d条边的两个端点:", i + 1);
scanf("%d%d", &u, &v);
G[u][v] = G[v][u] = 1; // 在邻接矩阵中标记边的存在
}
}
```
2. 创建无向图的邻接表
```c
#define MAX_VERTEX_NUM 100
typedef struct ArcNode {
int adjvex; // 邻接点的序号
struct ArcNode *next; // 指向下一个邻接点的指针
} ArcNode;
typedef struct VNode {
int data; // 顶点的数据
ArcNode *first; // 指向第一个邻接点的指针
} VNode;
VNode adjList[MAX_VERTEX_NUM]; // 邻接表
int n, m; // 顶点数和边数
void createGraph() {
printf("\n请输入顶点数:");
scanf("%d", &n);
printf("\n请输入边数:");
scanf("%d", &m);
// 初始化邻接表
for (int i = 0; i < n; i++) {
adjList[i].data = i;
adjList[i].first = NULL;
}
// 输入边的信息
for (int i = 0; i < m; i++) {
int u, v;
printf("\n请输入第%d条边的两个端点:", i + 1);
scanf("%d%d", &u, &v);
// 创建新的邻接点
ArcNode *p = (ArcNode *)malloc(sizeof(ArcNode));
p->adjvex = v;
p->next = adjList[u].first;
adjList[u].first = p;
p = (ArcNode *)malloc(sizeof(ArcNode));
p->adjvex = u;
p->next = adjList[v].first;
adjList[v].first = p;
}
}
```
3. 无向图的深度优先遍历
```c
#define MAX_VERTEX_NUM 100
int G[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; // 邻接矩阵
int visited[MAX_VERTEX_NUM]; // 标记是否访问过
int n; // 顶点数
void DFS(int v) {
visited[v] = 1; // 标记为已访问
printf("%d ", v); // 输出顶点的值
// 遍历所有邻接点
for (int i = 0; i < n; i++) {
if (G[v][i] && !visited[i]) {
DFS(i);
}
}
}
void DFSTraverse() {
// 初始化visited数组
for (int i = 0; i < n; i++) {
visited[i] = 0;
}
// 从未访问的顶点开始遍历
for (int i = 0; i < n; i++) {
if (!visited[i]) {
DFS(i);
}
}
}
```
4. 无向图的广度优先遍历
```c
#define MAX_VERTEX_NUM 100
int G[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; // 邻接矩阵
int visited[MAX_VERTEX_NUM]; // 标记是否访问过
int n; // 顶点数
void BFS(int v) {
int queue[MAX_VERTEX_NUM];
int front = 0, rear = 0;
visited[v] = 1; // 标记为已访问
printf("%d ", v); // 输出顶点的值
queue[rear++] = v; // 入队
// 遍历所有邻接点
while (front != rear) {
int u = queue[front++]; // 出队
for (int i = 0; i < n; i++) {
if (G[u][i] && !visited[i]) {
visited[i] = 1;
printf("%d ", i);
queue[rear++] = i; // 入队
}
}
}
}
void BFSTraverse() {
// 初始化visited数组
for (int i = 0; i < n; i++) {
visited[i] = 0;
}
// 从未访问的顶点开始遍历
for (int i = 0; i < n; i++) {
if (!visited[i]) {
BFS(i);
}
}
}
```
以上代码可能存在一些错误,需要根据实际情况进行调整。希望能对你有所帮助!
阅读全文