#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); printf("%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); getchar(); getchar(); getchar(); }在此代码基础上完成以下要求:(1) 建立有向带权图; (2)输出有向带权图; (3)求各顶点的入度和出度,并输出
时间: 2024-03-10 19:50:25 浏览: 27
(1) 建立有向带权图:
在函数Create中,将G->E[i][j]初始化为MAXNUM,即无穷大。在函数Edge中,读入每一条边的两个端点和权值,用一个双重循环找到对应的顶点下标,将G->E[i][j]和G->E[j][i]赋值为边的权值。
完整代码如下:
```c
#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, 1, &ch2, 1, &w);
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 Print(Graph G) {
int i, j;
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;
int in, out;
for (i = 0; i < G.v; i++) {
in = 0;
out = 0;
for (j = 0; j < G.v; j++) {
if (G.E[j][i] != MAXNUM) {
in++;
}
if (G.E[i][j] != MAXNUM) {
out++;
}
}
printf("%c:\tin=%d\tout=%d\n", G.V[i], in, out);
}
}
void main() {
Graph G;
Create(&G);
Edge(&G);
Print(G);
Degree(G);
getchar();
getchar();
getchar();
}
```
(2) 输出有向带权图:
在函数Print中,用两个循环遍历G->E,如果G->E[i][j]不是无穷大,即表示i和j之间有一条边,输出这条边的权值。完整代码如下:
```c
#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, 1, &ch2, 1, &w);
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 Print(Graph G) {
int i, j;
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;
int in, out;
for (i = 0; i < G.v; i++) {
in = 0;
out = 0;
for (j = 0; j < G.v; j++) {
if (G.E[j][i] != MAXNUM) {
in++;
}
if (G.E[i][j] != MAXNUM) {
out++;
}
}
printf("%c:\tin=%d\tout=%d\n", G.V[i], in, out);
}
}
void main() {
Graph G;
Create(&G);
Edge(&G);
Print(G);
Degree(G);
getchar();
getchar();
getchar();
}
```
(3) 求各顶点的入度和出度,并输出:
在函数Degree中,用两个循环分别计算每个顶点的入度和出度,完整代码如下:
```c
#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, 1, &ch2, 1, &w);
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 Print(Graph G) {
int i, j;
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;
int in, out;
for (i = 0; i < G.v; i++) {
in = 0;
out = 0;
for (j = 0; j < G.v; j++) {
if (G.E[j][i] != MAXNUM) {
in++;
}
if (G.E[i][j] != MAXNUM) {
out++;
}
}
printf("%c:\tin=%d\tout=%d\n", G.V[i], in, out);
}
}
void main() {
Graph G;
Create(&G);
Edge(&G);
Print(G);
Degree(G);
getchar();
getchar();
getchar();
}
```