邻接表(Adjacency List)是图的一种顺序存储和链式存储相结合的存储方式。对于图中的每个顶点i,将所有邻接于i的顶点链接成一个单向链表,这个单向链表就称为顶点i的邻接表,再将所有邻接表的表头放到一个数组中,由此就构成了图的邻接表。
下面给出邻接表的结构声明
#define MaxVertexNum 100 //最大顶点数为100
enum GraphType {DG,UG,DN,UN} ; //图的类型
typedef struct Node{ //边表结点
int AdjV; //邻接点域
struct Node *Next; //指针域
//如果需要表示边上的权值信息,可以增加一个数据域Weight
} EdgeNode;
typedef struct VNode{ //顶点表结点
char Vertex; //顶点域
EdgeNode *FirstEdge; //边表头指针
} VertexNode;
typedef struct ALGraph{
VertexNode AdjList[MaxVertexNum]; //邻接表
int Visited[MaxVertexNum]; //记录访问过的顶点
int n,e; //顶点数和边数
enum GraphType GType; //图的类型
}* ALGraph;
以有向图为例,给出邻接表的构造算法
ALGraph CreateALGraph()
{
ALGraph G;
EdgeNode *edge;
G = (ALGraph)malloc(sizeof(struct ALGraph));
G->GType = DG;
printf("输入顶点数和边数(用空格隔开):\n");
scanf("%d %d",&G->n,&G->e);
getchar();
printf("输入顶点信息(用空格隔开):\n");
for(int i = 0; i < G->n; i++){
scanf("%c",&G->AdjList[i].Vertex); //录入信息
getchar();
G->AdjList[i].FirstEdge = NULL; //顶点的边表设置为空
}
printf("输入边的两个端点(用空格隔开):\n");
for(int i,j,k = 0; k < G->e; k++){
scanf("%d %d", &i,&j);
edge = (EdgeNode*)malloc(sizeof(EdgeNode)); //生成新的边表结点
edge->AdjV = j; //录入邻接点序号
edge->Next = G->AdjList[i].FirstEdge; //新的边表结点插入顶点i的头部
G->AdjList[i].FirstEdge = edge;
}
return G;
}