数据结构老师布置了一道图的题(下图),这道题对于刚接触图理论知识并且还没完全搞懂的我属实有难度,花了将近半天才终于搞懂里面的弯弯绕绕!
#include<stdio.h>
#include<malloc.h>
#define INF 32767
#define MAXV 20
typedef char InfoType;//顶点信息必须是char类型,否则输入的数据全部变成G->adjlist[0].info
typedef struct ANode {
int adjvex;
int weight;
struct ANode* nextarc;
}ArcNode;
typedef struct VNode {
InfoType info;
ArcNode* firstarc;
}VNode;
typedef struct {
VNode adjlist[MAXV];
int n, e;
}AdjGraph;
void CreateAdj(AdjGraph*& G) {
int n, e;
ArcNode* p;
G = (AdjGraph*)malloc(sizeof(AdjGraph));
scanf("%d %d", &n, &e);
for (int i = 0; i < n; i++) {
G->adjlist[i].firstarc = NULL;
}
G->n = n; G->e = e;
char c = getchar();//接收换行符
for (int i = 0; i < G->n; i++) {
scanf("%c", &G->adjlist[i].info);
}
int i = 0, j = 0;
c = getchar();//接收换行符
for (int k = 0; k < G->e; k++) {
scanf("%c%c", &i,&j);
//两个for循环使用头插法,保证不落下任何边
for (int m = 0; m < G->n; m++) {
if (G->adjlist[m].info == i) {
p = (ArcNode*)malloc(sizeof(ArcNode));
p->adjvex = j-48;
p->nextarc = G->adjlist[m].firstarc;
G->adjlist[m].firstarc = p;
break;
}
}
for (int m = 0; m < G->n; m++) {
if (G->adjlist[m].info == j) {
p = (ArcNode*)malloc(sizeof(ArcNode));
p->adjvex =i-48;//转为数字(i为字符,转为数字会比以整数输入的多了58)
p->nextarc = G->adjlist[m].firstarc;
G->adjlist[m].firstarc = p;
break;
}
}
c = getchar();//接收换行符
}
}
void DispAdj(AdjGraph* G) {
int i; ArcNode* p;
for (i = 0; i < G->n; i++) {
printf("%c", G->adjlist[i].info);
printf("->");
p = G->adjlist[i].firstarc;
while (p != NULL) {
printf("%d", p->adjvex);
printf("->");
p = p->nextarc;
}
printf("NULL");
printf("\n");
}
}
int main() {
AdjGraph* G;
CreateAdj(G);
DispAdj(G);
}