因为之前的一篇博客图的十字链表存储结构的实现及其遍历是图的邻接表存储结构的延伸,所以这里只是简单的谈一下。
邻接表存储结构的定义:
#define MaxVex 20
typedef char VertexType ; // 顶点的类型
typedef int EdgeType ; // 边的类型
typedef struct EdgeNode // 边表结点
{
int adjvex ; // 该弧指向的顶点的位置
struct EdgeNode * nextarc ; // 指向下一条弧的指针
} EdgeNode ;
typedef struct VertexNode // 顶点表结点
{
VertexType data ; // 顶点信息
EdgeNode * firstarc ; // 指向第一条依附该顶点的弧的指针
} VertexNode , AdjList[MaxVex] ;
typedef struct ALGraph // 图的类型的定义
{
AdjList vertices ;
int vexnum ; // 顶点数
int arcnum ; // 边数目
} ALGraph ;
这里的图的类型是一个无向图,在实现的过程中无向图与有向图是没有什么区别的,只是无向图中的边当做有向图中的两条弧来使用而已,即A顶点与B顶点相连,那么在无向图中A到B有一条边,B到A有一条边。但是在有向图中必须要加以区分,到底是A到B的弧还是B到A的弧,或者说是A到B与B到A各有一条弧。
下面邻接表存储结构的图的创建中可以看到这一点的区别:
// 创建图
void CreateGraph( ALGraph * G )
{
InitGraph( G ) ; // 初始化图
printf("请输入结点信息:") ;
for( int i = 0 ; i < G->vexnum ; i++ )
{
scanf("%c" , &G->vertices[i].data ) ;
G->vertices[i].firstarc = NULL ;
}
printf("请输入弧信息:") ;
int index ; // 该弧的其实顶点的下标
for( i = 0 ; i < G->arcnum ; i++ )
{
EdgeNode * edge = (EdgeNode*)malloc(sizeof(EdgeNode)) ;
scanf("%d %d" , &index , &edge->adjvex ) ;
edge->nextarc = NULL ;
EdgeNode * p = G->vertices[index].firstarc ;
if( p == NULL )
{
G->vertices[index].firstarc = edge ;