for (int i = 0; i < G->VexNum; i++) { //读取课程名称和学分 fscanf(fp, "%s%d", G->Vertics[i].Date, &G->Vertics[i].Credit); //根据先修课程建立邻接表结点 while ('\n' != fgetc(fp)) { char str[4]; int pos; fscanf(fp, "%s", str); pos = Locate(str); //判断课程是不是没有 if (pos < 0 || pos > G->VexNum) { //判断课程是否有错误 printf("%s请输入正确的先决条件!\n", G->Vertics[i].Date); exit(EXIT_FAILURE); } //更新弧节点 注意是pos指向i的弧 ArcNode* p = (ArcNode*)malloc(sizeof(ArcNode)); p->AdjVex = i; p->Next = G->Vertics[pos].FirstArc; G->Vertics[pos].FirstArc = p; G->ArcNum++; } }之后怎么输出课程先修条件

时间: 2024-01-25 12:02:35 浏览: 21
在建立好有向图的邻接表结构之后,如果需要输出课程的先修条件,可以采用以下方法: 1. 遍历每个顶点,即每个课程,对于每个顶点i,遍历它的邻接表,即所有指向它的弧节点,找到每个弧节点指向的顶点,即该课程的先修课程,输出该先修课程的名称即可。 2. 具体地,对于每个顶点i,可以使用以下代码: ``` printf("%s的先修课程有:", G->Vertics[i].Date); ArcNode* p = G->Vertics[i].FirstArc; while (p) { printf("%s ", G->Vertics[p->AdjVex].Date); p = p->Next; } printf("\n"); ``` 其中,G->Vertics[i].Date表示第i个顶点的课程名称,G->Vertics[p->AdjVex].Date表示弧节点p指向的顶点的课程名称。遍历邻接表可以使用一个指向弧节点的指针p,初始值为该顶点的FirstArc字段,每次更新为p->Next。 这样,就可以输出每个课程的先修课程列表了。
相关问题

void MiniSpanTree_Prim(AMGraph* G, int u) { int k = 0; k = LocateVex(G, u); for (int j = 0; j < G->vexnum; j++) { if (j != k) closedge[j] = { u,G->arcs[k][j] }; } closedge[k].lowcost = 0; for (int i = 0; i < G->vexnum; i++) { k = Min(closedge); int u0 = closedge[k].adjvex; int v0 = G->vexs[k]; printf("%d %d", u0, v0); closedge[k].lowcost = 0; for (int j = 0; j < G->vexnum; j++) { if (G->arcs[i][j] < closedge[j].lowcost) { closedge[i] = { G->vexs[k],G->arcs[i][j] }; } } } }

以下是将该段代码转换为C语言的代码: ```c void MiniSpanTree_Prim(AMGraph* G, int u) { int k = 0; k = LocateVex(G, u); for (int j = 0; j < G->vexnum; j++) { if (j != k) { closedge[j].adjvex = u; closedge[j].lowcost = G->arcs[k][j]; } } closedge[k].lowcost = 0; for (int i = 0; i < G->vexnum; i++) { k = Min(closedge); int u0 = closedge[k].adjvex; int v0 = G->vexs[k]; printf("%d %d", u0, v0); closedge[k].lowcost = 0; for (int j = 0; j < G->vexnum; j++) { if (G->arcs[i][j] < closedge[j].lowcost) { closedge[j].adjvex = G->vexs[k]; closedge[j].lowcost = G->arcs[i][j]; } } } } ```

优化这段代码#define _CRT_SECURE_NO_WARNINGS #pragma warning(disable:4996) #include<stdio.h> #include<stdlib.h> #define MAX_VERTEX_NUM 20// 邻接矩阵无向图结构体 #define inf 32768 typedef char VertexData; typedef struct { char vertex[MAX_VERTEX_NUM]; // 顶点表 int arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; // 邻接矩阵 int vexnum, arcnum; // 顶点数 } AdjMatrix;// 初始化无向图 int LocateVertes(AdjMatrix* G, char v) //顶点位置 { int j = 0, k; for (k = 0; k < G->vexnum; k++) if (G->vertex[k] == v) { j = k; break; } return j; } void CreateUDG(AdjMatrix* G) //无向图 { int i; int j; int k; char v1, v2; scanf("%d,%d", &G->vexnum, &G->arcnum); getchar(); for (i = 0; i < G->vexnum; i++) for (j = 0; j < G->vexnum; j++) G->arcs[i][j] = 0; for (i = 0; i < G->vexnum; i++) scanf("%c", &G->vertex[i]); getchar(); for (k = 0; k < G->arcnum; k++) { scanf("%c,%c", &v1, &v2); getchar(); i = LocateVertes(G, v1); i = LocateVertes(G, v2); G->arcs[i][j] = 1; } for (i = 0; i < G->vexnum; i++) { for (j = 0; j < G->vexnum; j++) printf("%d", G->arcs[i][j]); printf("\n"); } } int main() { AdjMatrix G; CreateUDG(&G); return 0; }

1. 代码格式化 代码格式化可以使代码更加清晰易读,建议使用代码编辑器自带的格式化工具或使用在线格式化工具进行格式化。 2. 函数分离 可以将 `LocateVertes` 函数和 `CreateUDG` 函数分离到不同的文件中,使代码结构更加清晰。 3. 输入处理 在输入顶点和边时,建议使用循环读入输入,而不是使用 `getchar()`,这样可以避免输入错误导致程序出错。 4. 变量名修改 变量名需要更改,使其符合编程规范。例如,`v1` 和 `v2` 可以改为 `vertex1` 和 `vertex2`。 5. 注释添加 在关键部分添加注释,可以使代码更加易读,方便其他开发人员阅读和修改代码。 修改后的代码如下: ```c #define _CRT_SECURE_NO_WARNINGS #pragma warning(disable:4996) #include<stdio.h> #include<stdlib.h> #define MAX_VERTEX_NUM 20 #define INF 32768 typedef char VertexData; typedef struct { char vertex[MAX_VERTEX_NUM]; // 顶点表 int arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; // 邻接矩阵 int vexnum, arcnum; // 顶点数 } AdjMatrix; // 顶点位置 int locateVertex(AdjMatrix* G, char v) { int i; for (i = 0; i < G->vexnum; i++) { if (G->vertex[i] == v) { return i; } } return -1; } // 初始化无向图 void createUDG(AdjMatrix* G) { int i; int j; int k; char vertex1, vertex2; scanf("%d,%d", &G->vexnum, &G->arcnum); // 读取顶点 for (i = 0; i < G->vexnum; i++) { scanf(" %c", &G->vertex[i]); } // 初始化邻接矩阵 for (i = 0; i < G->vexnum; i++) { for (j = 0; j < G->vexnum; j++) { G->arcs[i][j] = INF; } } // 读取边 for (k = 0; k < G->arcnum; k++) { scanf(" %c,%c", &vertex1, &vertex2); i = locateVertex(G, vertex1); j = locateVertex(G, vertex2); G->arcs[i][j] = 1; G->arcs[j][i] = 1; // 无向图,需要将两个方向都设置为1 } for (i = 0; i < G->vexnum; i++) { for (j = 0; j < G->vexnum; j++) { printf("%d", G->arcs[i][j]); } printf("\n"); } } int main() { AdjMatrix G; createUDG(&G); return 0; } ```

相关推荐

#include<stdio.h> #include<stdlib.h> Typedef struct Graph{ Char* vexs; Int** arcs; Int vexnum,arcnum; )Graph; Graph* initGraph(int vexnum){ Graph* G=(Graph*)malloc(sizeof(Graph)) G->vexs=(char*)malloc(sizeof (char)*vexnum) G->arcs=(int**)malloc(sizeof (int*)*vexnum) For(int i=0;i<vexnum;I++) { G->arcs[i]= (int*)malloc(sizeof (int)*vexnum)} G->vexnum=Vexnum; G->arcnum=0; Return G } Int createGraph(Graph* G,char* vexs,int* arcs) {for(i=0;i<G->vexnum;i++) G->vexs[i]=vexs[i]; For((j=0;j<G->vexnum;j++) G->arcs[i][j]=*(arcs+i*vexnum+j ) If(G->arcs[i][j]!=0) G->arcnum++; } G->arcnum/=2; } Void DFS(Graph* G,int *visit,int index){ Printf("%c",G->vexs[index]) Visit[index]=1; For(int i=0;i<G->vexnum;i++) If(G->arcs[index][i]==1&&visit[index]!=1) DFS(G,visit,i) } Void BFS(Graph* G,int *visit ,int index){ Printf("%c",&G->vexs[index]) Visit[index]=1; Queue* initQueue(); enQueue(Q,index); while(!isEmpty(Q)) int i=deQueue(); For(int j=0;j<G->vexnum;J++) If(G->arcs[i][j]==1&&!visit[j]) Printf("%c",G->vexs[j]) Visit[j]=1; enQueue(Q,j);} } #define MAXSIZE 5 Typedef struct Queue{ Int front Int rear Int data[MAXSIZE] }Queue; Queue* Q InitQueue() { Queue* Q=(Queue*)malloc(sizeof(QUeue)); Queue->front=Queue->rear=0; Return Q; } Int enQueue(Queue* Q, int data) If (isFull(Q)){ Return 0} Else Q->data[Q->rear]=data; Q->rear=(Q->rear+1)%MAXSIZE } Int deQueue(Queue* Q) If (isempty(Q)){ Return 0} Else Int data=Q->data[Q->front]; Q->front=(Q->front+1)%MAXSIZE Return data; } Void printfQueue(Queue* Q){ Int length=(Q->rea-Q->front+MAXSIZE)%MAXSIZE For(int i=0;i<length;i++) Printf("%d->",Q->data[Q->front]) Q->front=(Q->front+1)%MAXSIZE; Int main(){ Graph* G=initGraph(5); Int arcs[5][5]={ 0,1,1,1,0, 0,1,1,1,0, 0,1,1,1,0, 0,1,1,1,0, 0,1,1,1,0, }; CreateGraph(*G,"ABCDE",(int*)arcs); Int* visit=(int*)malloc(sizeof(int)*G->vexnum); For(int i=0;i<G->vexnum;i++) Visit[i]=0; DFS(G,visit,0); BFS(G,visit,0) }修改正确并转化为c语言代码

最新推荐

recommend-type

Java课程设计-java web 网上商城,后台商品管理(前后端源码+数据库+文档) .zip

项目规划与设计: 确定系统需求,包括商品管理的功能(如添加商品、编辑商品、删除商品、查看商品列表等)。 设计数据库模型,包括商品表、类别表、库存表等。 确定系统的技术栈,如使用Spring MVC作为MVC框架、Hibernate或MyBatis作为ORM框架、Spring Security进行权限控制等。 环境搭建: 搭建开发环境,包括安装JDK、配置Servlet容器(如Tomcat)、配置数据库(如MySQL)等。 创建一个Maven项目,添加所需的依赖库。 数据库设计与创建: 根据设计好的数据库模型,在数据库中创建相应的表结构。 后端开发: 创建Java实体类,对应数据库中的表结构。 编写数据访问层(DAO)代码,实现对商品信息的增删改查操作。 编写服务层(Service)代码,实现业务逻辑,如商品管理的各种操作。 开发控制器层(Controller),实现与前端页面的交互,接收请求并调用相应的服务进行处理。 前端开发: 使用HTML、CSS和JavaScript等前端技术,设计并实现商品管理页面的界面。 通过Ajax技术,实现前后端的数据交互,如异步加载商品列表、实
recommend-type

母线电容计算 .xmcd

变频器 母线电容计算 mathcad
recommend-type

2022年中国大学生计算机设计大赛国赛优秀作品点评微课与教学辅助&数媒静态设计专业组视频

2022年中国大学生计算机设计大赛国赛优秀作品点评微课与教学辅助&数媒静态设计专业组视频提取方式是百度网盘分享地址
recommend-type

输出月份英文名pta.doc

如果您想要在程序中输出月份的英文名称,并且提到了“pta”,但这里的“pta”与月份名称的输出没有直接关系(除非您是在特定的上下文中使用它作为一个变量名或标识符)。不过,我将直接给出如何输出月份英文名称的代码示例。 在Python中,您可以使用一个列表(list)或字典(dictionary)来存储月份的英文名称,并根据需要输出它们。以下是一个简单的示例: python # 使用列表存储月份的英文名称 months = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"] # 假设我们要输出第5个月份(即May) month_index = 4 # 注意列表索引从0开始,所以5月份是索引4 print(months[month_index]) # 输出: May # 或者,如果您想要通过月份的数字(1-12)来输出名称,可以稍作调整 def get_mo
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

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

用matlab绘制高斯色噪声情况下的频率估计CRLB,其中w(n)是零均值高斯色噪声,w(n)=0.8*w(n-1)+e(n),e(n)服从零均值方差为se的高斯分布

以下是用matlab绘制高斯色噪声情况下频率估计CRLB的代码: ```matlab % 参数设置 N = 100; % 信号长度 se = 0.5; % 噪声方差 w = zeros(N,1); % 高斯色噪声 w(1) = randn(1)*sqrt(se); for n = 2:N w(n) = 0.8*w(n-1) + randn(1)*sqrt(se); end % 计算频率估计CRLB fs = 1; % 采样频率 df = 0.01; % 频率分辨率 f = 0:df:fs/2; % 频率范围 M = length(f); CRLB = zeros(M,1); for
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。奥利维尔,"站在巨人的肩膀上"这句话对你来说完全有意义了。从科学上讲,你知道在这篇论文的(许多)错误中,你是我可以依