用c语言设计一个基于DOS菜单的应用程序。内容如下: 有向网的基本操作及应用 ① 创建有向网的邻接矩阵 ② 创建有向网的邻接表 ③ 关键路径 ④ 单源最短路径问题
时间: 2023-07-15 19:15:23 浏览: 63
好的,以下是一个简单的基于DOS菜单的应用程序,实现了有向网的基本操作及应用:
```c
#include <stdio.h>
#include <conio.h>
#define MAX_VERTEX_NUM 20 // 最大顶点数
#define INFINITY 65535 // 无穷大
// 定义边结构体
typedef struct {
int weight; // 权值
int tail; // 弧尾
int head; // 弧头
} Arc;
// 定义顶点结构体
typedef struct {
char name; // 顶点名称
} Vertex;
// 定义邻接矩阵结构体
typedef struct {
Vertex vexs[MAX_VERTEX_NUM]; // 顶点数组
Arc arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; // 边数组
int vex_num; // 顶点数
int arc_num; // 弧数
} MGraph;
// 定义邻接表结构体
typedef struct ArcNode {
int adjvex; // 邻接点序号
int weight; // 权值
struct ArcNode *next; // 指向下一条弧的指针
} ArcNode;
typedef struct VNode {
Vertex data; // 顶点信息
ArcNode *firstarc; // 指向第一条依附该顶点的弧的指针
} VNode, AdjList[MAX_VERTEX_NUM];
typedef struct {
AdjList adjlist; // 邻接表
int vex_num; // 顶点数
int arc_num; // 弧数
} ALGraph;
// 打印菜单
void print_menu() {
printf("请选择操作:\n");
printf("1. 创建有向网的邻接矩阵\n");
printf("2. 创建有向网的邻接表\n");
printf("3. 求关键路径\n");
printf("4. 求单源最短路径问题\n");
printf("0. 退出程序\n");
}
// 创建有向网的邻接矩阵
void create_mgraph(MGraph *G) {
int i, j, k, weight;
printf("请输入顶点数和弧数:\n");
scanf("%d%d", &G->vex_num, &G->arc_num);
printf("请输入顶点名称:\n");
for (i = 0; i < G->vex_num; i++) {
scanf(" %c", &G->vexs[i].name);
}
for (i = 0; i < G->vex_num; i++) {
for (j = 0; j < G->vex_num; j++) {
G->arcs[i][j].weight = INFINITY;
}
}
printf("请输入弧的信息(起点、终点、权值):\n");
for (k = 0; k < G->arc_num; k++) {
scanf("%d%d%d", &i, &j, &weight);
G->arcs[i][j].weight = weight;
G->arcs[i][j].tail = i;
G->arcs[i][j].head = j;
}
}
// 创建有向网的邻接表
void create_algraph(ALGraph *G) {
int i, j, k, weight;
ArcNode *arc;
printf("请输入顶点数和弧数:\n");
scanf("%d%d", &G->vex_num, &G->arc_num);
printf("请输入顶点名称:\n");
for (i = 0; i < G->vex_num; i++) {
scanf(" %c", &G->adjlist[i].data.name);
G->adjlist[i].firstarc = NULL;
}
printf("请输入弧的信息(起点、终点、权值):\n");
for (k = 0; k < G->arc_num; k++) {
scanf("%d%d%d", &i, &j, &weight);
arc = (ArcNode *)malloc(sizeof(ArcNode));
arc->adjvex = j;
arc->weight = weight;
arc->next = G->adjlist[i].firstarc;
G->adjlist[i].firstarc = arc;
}
}
// 求关键路径
void critical_path(MGraph G) {
// TODO: 实现求关键路径的算法
printf("暂未实现求关键路径的算法!\n");
}
// 求单源最短路径问题
void shortest_path(ALGraph G) {
// TODO: 实现求单源最短路径问题的算法
printf("暂未实现求单源最短路径问题的算法!\n");
}
int main() {
MGraph G;
ALGraph H;
int choice;
while (1) {
print_menu();
choice = getch() - '0';
switch (choice) {
case 1:
create_mgraph(&G);
printf("邻接矩阵:\n");
for (int i = 0; i < G.vex_num; i++) {
for (int j = 0; j < G.vex_num; j++) {
if (G.arcs[i][j].weight == INFINITY) {
printf("∞ ");
} else {
printf("%d ", G.arcs[i][j].weight);
}
}
printf("\n");
}
break;
case 2:
create_algraph(&H);
printf("邻接表:\n");
for (int i = 0; i < H.vex_num; i++) {
printf("%c -> ", H.adjlist[i].data.name);
ArcNode *arc = H.adjlist[i].firstarc;
while (arc != NULL) {
printf("%c(%d) ", H.adjlist[arc->adjvex].data.name, arc->weight);
arc = arc->next;
}
printf("\n");
}
break;
case 3:
critical_path(G);
break;
case 4:
shortest_path(H);
break;
case 0:
printf("程序已退出!\n");
return 0;
default:
printf("请输入正确的选项!\n");
}
printf("\n");
}
return 0;
}
```
该程序通过 `print_menu()` 函数打印菜单,使用 `getch()` 获取用户输入的选项,然后根据选项调用相应的函数实现对应功能。其中, `create_mgraph()` 和 `create_algraph()` 函数分别用于创建有向网的邻接矩阵和邻接表, `critical_path()` 和 `shortest_path()` 函数分别用于求关键路径和单源最短路径问题。这里为了简化程序,只是输出了相关信息,没有实现具体的算法。