#include <stdio.h> #define MAX 100 #define MAXNUM 100000 typedef struct { int w; int v; int e; int V[MAX]; int E[MAX][MAX]; }Graph; void Create(Graph* G) { int i, j; printf("vex_num:"); scanf_s("%d", &G->v); printf("edge_num:"); scanf_s("%d", &G->e); for (i = 0; i < G->v; i++) { getchar(); printf("<%d>num vex_data:", i + 1); scanf_s("%c", &G->V[i]); } for (i = 0; i < G->v; i++) { for (j = 0; j < G->v; j++) { G->E[i][j] = MAXNUM; } } } void Edge(Graph* G) { char ch1, ch2; int i, j, k; int p1 = 0, p2 = 0; int w; for (i = 0; i < G->e; i++) { printf("num edge_data(two vex for edge and weight):"); scanf_s("%c,%c,%d", &ch1, &ch2, &w); for (j = 0; j < G->v; j++) { for (k = 0; k < G->v; k++) { if (G->V[j] == ch1 && G->V[k]) { G->E[i][k] = w; G->E[k][i] = w; } } } } } void main() { Graph G; Create(&G); Edge(&G); }修改完善此代码以满足以下要求:(1) 建立有向带权图; (2)输出有向带权图; (3)求各顶点的入度和出度,并输出
时间: 2024-03-10 11:50:32 浏览: 67
以下是修改后的代码:
```c
#include <stdio.h>
#define MAX 100
#define MAXNUM 100000
typedef struct {
int w;
int v;
int e;
char V[MAX];
int E[MAX][MAX];
} Graph;
void Create(Graph* G) {
int i, j;
printf("vex_num:");
scanf("%d", &G->v);
printf("edge_num:");
scanf("%d", &G->e);
getchar(); // 处理输入缓冲区中的换行符
for (i = 0; i < G->v; i++) {
printf("<%d>num vex_data:", i + 1);
scanf("%c", &G->V[i]);
getchar(); // 处理输入缓冲区中的换行符
}
for (i = 0; i < G->v; i++) {
for (j = 0; j < G->v; j++) {
G->E[i][j] = MAXNUM;
}
}
}
void Edge(Graph* G) {
char ch1, ch2;
int i, j, k;
int p1 = 0, p2 = 0;
int w;
for (i = 0; i < G->e; i++) {
printf("num edge_data(two vex for edge and weight):");
scanf(" %c,%c,%d", &ch1, &ch2, &w); // 在 %c 前加一个空格,避免输入缓冲区中的换行符对输入造成影响
for (j = 0; j < G->v; j++) {
if (G->V[j] == ch1) {
p1 = j;
}
if (G->V[j] == ch2) {
p2 = j;
}
}
G->E[p1][p2] = w; // 添加有向边
}
}
void Display(Graph G) {
int i, j;
printf("\nGraph:\n");
for (i = 0; i < G.v; i++) {
printf("%c:\t", G.V[i]);
for (j = 0; j < G.v; j++) {
if (G.E[i][j] != MAXNUM) {
printf("%c(%d)\t", G.V[j], G.E[i][j]);
}
}
printf("\n");
}
}
void Degree(Graph G) {
int i, j, in_degree, out_degree;
printf("\nVertex\tIn-degree\tOut-degree\n");
for (i = 0; i < G.v; i++) {
in_degree = 0;
out_degree = 0;
for (j = 0; j < G.v; j++) {
if (G.E[j][i] != MAXNUM) {
in_degree++;
}
if (G.E[i][j] != MAXNUM) {
out_degree++;
}
}
printf("%c\t%d\t\t%d\n", G.V[i], in_degree, out_degree);
}
}
int main() {
Graph G;
Create(&G);
Edge(&G);
Display(G);
Degree(G);
return 0;
}
```
主要修改的地方包括:
1. 在 `Graph` 结构体中添加了一个字符数组 `V`,用于存储每个顶点的名称。
2. 在 `Create` 函数中,添加了输入每个顶点名称的功能,并添加了对输入缓冲区中换行符的处理。
3. 在 `Edge` 函数中,修改了输入格式,避免输入缓冲区中的换行符对输入造成影响,并添加了添加有向边的功能。
4. 添加了 `Display` 函数,用于输出有向带权图。
5. 添加了 `Degree` 函数,用于计算并输出每个顶点的入度和出度。
阅读全文