邻接表由一个一维数组(顶点表)和一个单链表(边表)组成。
顶点表由数据域和指针域组成,数据域存储顶点信息,指针域指向第一个邻接点。
边表由adjvex和next两个域组成,若需要权值信息可增加weight域,adjvex存储某顶点的邻接点在顶点表中的下表,next则存储指向边表中下一个结点的指针。
基本如下图所示:
代码(来源于《大话数据结构》):
AdjLinkGraph.h
#pragma once #define MAXVEX 20 typedef char VertexType; //顶点类型应由用户定义 typedef int EdgeType; //边上的权值类型应由用户定义 typedef struct EdgeNode //边表结点 { int adjvex; //邻接点域,存储该顶点对应的下标 EdgeType weight; //用于存储权值,对于非网图可以不需要 struct EdgeNode *next; //链域,指向下一个邻接点 }EdgeNode; typedef struct VertexNode //顶点表结点 { VertexType data; //顶点域 EdgeNode *firstedge; //边表头指针 }VertextNode, AdjList[MAXVEX]; typedef struct { AdjList adjList; int numVertexes, numEdges; //图中当前顶点数和边数 }GraphAdjList; void CreateALGraph(GraphAdjList *G);
AdjLinkGraph.cpp
#include "stdafx.h" #include "adjLinkGraph.h" #include <cstdlib> void CreateALGraph(GraphAdjList *G) { int i, j, k; EdgeNode *e; printf("输入顶点数和边数: "); scanf_s("%d,%d", &G->numVertexes, &G->numEdges); for (i = 0; i < G->numVertexes; i++) { printf("输入顶点数据: "); scanf_s("%d", &G->adjList[i].data); G->adjList[i].firstedge = NULL; } for (k = 0; k < G->numEdges; k++) { printf("输入边(vi,vj)上的顶点序号: "); scanf_s("%d,%d", &i, &j); e = (EdgeNode *)malloc(sizeof(EdgeNode)); e->adjvex = j; e->next = G->adjList[i].firstedge; G->adjList[i].firstedge = e; //不断更新firstedge,用e->next链接更新过的firstedge e = (EdgeNode *)malloc(sizeof(EdgeNode)); e->adjvex = i; e->next = G->adjList[i].firstedge; G->adjList[j].firstedge = e; } }
调用:
// AdjecentTable.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include "adjLinkGraph.h" int main() { GraphAdjList G; CreateALGraph(&G); printf("邻接表创建成功!"); return 0; }