源代码:
//
// main.c
// graph.c
// 程序目的:图的邻接表存储法
// Created by zhen7216 on 2016/12/10.
// Copyright © 2016年 chenzhen. All rights reserved.
//
#include <stdio.h>
#define MaxNum 50 //图的最大顶点数为50
/*边结点结构定义*/
typedef struct enode {
int adjvex; //边结点结构定义
struct enode *next; //指针域,指向下一个边结点
} edgeNode;
/*顶点结点结构定义*/
typedef struct vnode {
char vertex[3];
edgeNode *firstEdge; //指向第一个边结点
} vexNode;
typedef vexNode adjList[MaxNum];
typedef struct {
adjList adlist; //邻接表
int n, e; //顶点数和边数
} alGraph; //alGraph是以邻接表方式存储的图类型
int Locate(alGraph *G, char vex[]) {
int i;
for(i = 0; i < G->n; i++)
if(strcmp(G->adlist[i].vertex, vex) == 0)
return i;
return 0;
}
void createalGraph(alGraph *G) {
/*建立有向图的邻接存储*/
int i, j, k;
char vex1[3], vex2[3];
edgeNode *s;
printf("输入图的顶点数和边数(用逗号分隔):\n");
scanf("%d,%d", &(G->n), &(G->e)); //保存输入的顶点数和边数
printf("输入图的顶点信息(最长2个字符):\n");
for(i = 0; i < G->n; i++) { //建立n个顶点的顶点数组
scanf("\n%s", G->adlist[i].vertex); //输入每个顶点的标识信息
G->adlist[i].firstEdge = NULL; //顶点的邻接表头指针初始化为空
}
printf("\n输入图中每条边所依附的两个顶点的标识信息:");
for(k = 0; k < G->e; k++) {
printf("\n输入第%d条边的第一个顶点:", k + 1);
scanf("%s", vex1);
printf("输入第%d条边的第二个顶点:", k + 1);
scanf("%s", vex2);
i = Locate(G, vex1);
j = Locate(G, vex2); //*i, j为顶点在顶点数组中的下标
s = (edgeNode*)malloc(sizeof(edgeNode)); //生成新的边结点s*
s->adjvex = j;
s->next = G->adlist[i].firstEdge;
G->adlist[i].firstEdge = s;
}
}
void printGraph(alGraph *G) { //打印图的顶点和边的信息
int i;
edgeNode *s;
printf("\n图中顶点个数为:%d", G->n);
printf("\n图中边数为:%d", G->e);
for(i = 0; i < G->n; i++)
printf("%s", G->adlist[i].vertex);
printf("\n图中顶点的邻接顶点为:");
for(i = 0; i < G->n; i++) {
printf("\n%s:", G->adlist[i].vertex);
s = G->adlist[i].firstEdge;
while(s) {
printf("%s", G->adlist[s->adjvex].vertex);
s = s->next;
}
}
}
int main() {
alGraph alg;
createalGraph(&alg);
printGraph(&alg);
}
运行结果: