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;
}
```