/*
* 图的邻接表存储实现
*/
#include<stdio.h>
#include<stdlib.h>
//最大顶点数
#define MAXVER 30
typedef char vertexType;
//边表结点
typedef struct EdgeNode {
//存储该顶点对应的下标(从0开始)
int vertex;
//指向下一个邻接点的指针
struct EdgeNode *next;
}EdgeNode;
//顶点表结点
typedef struct VertexNode {
//存储顶点信息
vertexType data;
//边表头指针
EdgeNode *firstEdge;
}VertexNode;
typedef struct {
//存放顶点的数组
VertexNode vertexList[MAXVER];
int verNum;
int edgeNum;
}Graph;
//建立图的邻接表结构
void createGraph(Graph *G) {
printf("\n输入顶点数和边数\n");
scanf("%d,%d", &(G->verNum), &(G->edgeNum));
printf("%d %d\n",G->verNum, G->edgeNum);
getchar();
printf("\n输入各顶点\n");
for(int i = 0; i < G->verNum; i++) {
scanf("%c", &(G->vertexList[i].data));
G->vertexList[i].firstEdge = NULL;
}
for(int i = 0; i < G->verNum; i++) {
printf("%c ", G->vertexList[i].data);
}
printf("\n输入边(Vi, Vj)上顶点的序号\n");
//源顶点 目的顶点
int arc, des;
for(int k = 0; k < G->edgeNum; k++) {
scanf("%d,%d", &arc, &des);
EdgeNode *e = (EdgeNode*)malloc(sizeof(EdgeNode));
e->vertex = des;
//在表头进行插入操作
e->next = G->vertexList[arc].firstEdge;
G->vertexList[arc].firstEdge = e;
EdgeNode *ee = (EdgeNode*)malloc(sizeof(EdgeNode));
ee->vertex = arc;
ee->next = G->vertexList[des].firstEdge;
G->vertexList[des].firstEdge = ee;
}
}
void printGraph(Graph G) {
for(int i = 0; i < G.verNum; i++) {
printf("顶点:%c", G.vertexList[i].data);
printf("下标i=%d: ", i);
EdgeNode *p = G.vertexList[i].firstEdge;
while(p != NULL) {
int v = p->vertex;
printf("-->%d", v);
p = p->next;
}
printf("\n");
}
}
int main(void) {
Graph G;
createGraph(&G);
printGraph(G);
}