用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()` 函数分别用于求关键路径和单源最短路径问题。这里为了简化程序,只是输出了相关信息,没有实现具体的算法。

相关推荐

最新推荐

recommend-type

C语言实现图的邻接矩阵存储操作

主要为大家详细介绍了C语言实现图的邻接矩阵存储操作,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
recommend-type

Python根据已知邻接矩阵绘制无向图操作示例

主要介绍了Python根据已知邻接矩阵绘制无向图操作,涉及Python使用networkx、matplotlib进行数值运算与图形绘制相关操作技巧,需要的朋友可以参考下
recommend-type

基于Selenium的Java爬虫实战(内含谷歌浏览器Chrom和Chromedriver版本116.0.5808.0)

资源包括: 1.Java爬虫实战代码 2.selenium学习笔记 3.代码演示视频 4.谷歌浏览器chrom116.0.5808.0 chrome-linux64.zip chrome-mac-arm64.zip chrome-mac-x64.zip chrome-win32.zip chrome-win64.zip 5.谷歌浏览器驱动器Chromedriver116.0.5808.0 chromedriver-linux64.zip chromedriver-mac-arm64.zip chromedriver-mac-x64.zip chromedriver-win32.zip chromedriver-win64.zip 特别说明:Chrome 为测试版(不会自动更新) 仅适用于自动测试。若要进行常规浏览,请使用可自动更新的标准版 Chrome。)
recommend-type

2024消费趋势报告.pdf

2024消费趋势报告.pdf
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

MATLAB正态分布协方差分析:揭示正态分布变量之间的协方差

![MATLAB正态分布协方差分析:揭示正态分布变量之间的协方差](https://site.cdn.mengte.online/official/2021/11/20211128213137293.png) # 1. 正态分布概述 正态分布,又称高斯分布,是统计学中最重要的连续概率分布之一。它广泛应用于自然科学、社会科学和工程领域。 正态分布的概率密度函数为: ``` f(x) = (1 / (σ√(2π))) * exp(-(x - μ)² / (2σ²)) ``` 其中: - μ:正态分布的均值 - σ:正态分布的标准差 - π:圆周率 正态分布具有以下特性: - 对称性:
recommend-type

我正在开发一款个人碳足迹计算app,如何撰写其需求分析文档,请给我一个范例

为了更全面、清晰地定义个人碳足迹计算app的需求,需求分析文档应该包含以下内容: 1.项目简介:对该app项目的概述及目标进行说明。 2.用户分析:包括目标用户群、用户需求、行为等。 3.功能需求:对app的基本功能进行定义,如用户登录、数据录入、数据统计等。 4.非功能需求:对使用app的性能和质量等进行定义,如界面设计、数据安全、可扩展性等。 5.运行环境:包括app的开发环境和使用环境。 下面是一个范例: 需求分析文档 1. 项目简介 该app项目旨在为用户提供一款方便、易用、可定制的个人碳足迹计算平台,以促进环保和可持续性发展。 2. 用户分析 目标用户群:全球关
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。
recommend-type

"互动学习:行动中的多样性与论文攻读经历"

多样性她- 事实上SCI NCES你的时间表ECOLEDO C Tora SC和NCESPOUR l’Ingén学习互动,互动学习以行动为中心的强化学习学会互动,互动学习,以行动为中心的强化学习计算机科学博士论文于2021年9月28日在Villeneuve d'Asq公开支持马修·瑟林评审团主席法布里斯·勒菲弗尔阿维尼翁大学教授论文指导奥利维尔·皮耶昆谷歌研究教授:智囊团论文联合主任菲利普·普雷教授,大学。里尔/CRISTAL/因里亚报告员奥利维耶·西格德索邦大学报告员卢多维奇·德诺耶教授,Facebook /索邦大学审查员越南圣迈IMT Atlantic高级讲师邀请弗洛里安·斯特鲁布博士,Deepmind对于那些及时看到自己错误的人...3谢谢你首先,我要感谢我的两位博士生导师Olivier和Philippe。奥利维尔,"站在巨人的肩膀上"这句话对你来说完全有意义了。从科学上讲,你知道在这篇论文的(许多)错误中,你是我可以依