图的邻接表表示法是一种链式的存储方式,为图中的每一个顶点建立单链表用来表示边或者弧,
这种用来表示点点之间关系的表成为边表或者弧表,相应的结点称为边结点,可以在每一个单链表前面设置头结点用于存放图中的顶点结点,
这种表被称为表头结点表,相应的结点被称为表头结点,通常情况下,表头结点采用顺序存储结构方式存储,这样方便随机访问结点,
表头结点由2个域组成的,一个数据域一个指针域,数据域用于存放顶点信息,而指针域用于指向边表结点的第一个结点,
边表也由2个域组成,一个是邻接结点域,一个是指针域,其中邻接结点域用于表示相应表头顶点与邻接点的位置,而指针域用来指向下一个弧或边的节点
下面我来用C语言实现无向无权图
#define _CRT_SECURE_NO_WARNINGS
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
typedef char VertexType[4];//顶点最多3个字符
typedef int VRType;
#define MaxSize 50
//边结点的类型定义
typedef struct ArcNode
{
int adjvex;//弧指向顶点的位置
struct ArcNode *nextarc;//指向下一个相连接的顶点
}ArcNode;
//头结点的类型定义
typedef struct VNode
{
VertexType data;//存储顶点信息
ArcNode*firstarc;//用于指向第一个与该结点相连接的顶点
}Vnode,AdjList[MaxSize];
//图的类型定义
typedef struct
{
AdjList vextex;//顶点的信息
int vexnum, arcnum;//表示图的顶点和边的数目,
}AdjGraph;
void DisplayGraph(AdjGraph G);
void CreateGraph(AdjGraph*G);
int LocateVertex(AdjGraph G, VertexType v);
int main()
{
AdjGraph G;
printf("采用邻接表创建无向图:\n");
CreateGraph(&G);
printf("输出图:\n");
DisplayGraph(G);
system("pause");
return 0;
}
void CreateGraph(AdjGraph*G)//采用邻接表存储结构创建无向图
{
int i, j, k;
VertexType v1, v2;//定义2个顶点
ArcNode*p;
printf("请输入图的顶点数,边数(空格分隔):");
scanf("%d%d",&(G->vexnum),&(G->arcnum));
printf("请输入%d个顶点的值\n", G->vexnum);
for (i = 0; i < G->vexnum; i++)//将顶点存储在头结点中
{
scanf("%s", G->vextex[i].data);
G->vextex[i].firstarc = NULL;//将相关联的顶点值设为空
}
printf("请输入弧尾和弧头用空格来间隔:\n");
for (k = 0; k < G->arcnum; k++)//建立边链表
{
scanf("%s%s", v1, v2);
i = LocateVertex(*G, v1);
j = LocateVertex(*G, v2);
//以j为弧头,i为弧尾创建邻接表
p = (ArcNode*)malloc(sizeof(ArcNode));
p->adjvex = j;
p->nextarc = G->vextex[i].firstarc;
G->vextex[i].firstarc = p;
//以i为弧头,j为弧尾创建邻接表
p = (ArcNode*)malloc(sizeof(ArcNode));
p->adjvex = i;
p->nextarc = G->vextex[j].firstarc;
G->vextex[j].firstarc = p;
}
}
int LocateVertex(AdjGraph G, VertexType v)//定位图中顶点的位置
{
int i;
for (i = 0; i < G.vexnum; i++)
if (strcmp(G.vextex[i].data, v) == 0)
return i;
return -1;
}
void DisplayGraph(AdjGraph G)//输出图的邻接表
{
int i, j;
ArcNode *p;
printf("%d个顶点:\n ", G.vexnum);
for (i = 0; i < G.vexnum; i++)
printf("%s ", G.vextex[i].data);
printf("\n");
printf("邻接表:\n");
for (i = 0; i < G.vexnum; i++)
{
p = G.vextex[i].firstarc;
j = 0;
while (p!=NULL)
{
if (j == 0)
printf("%s->%s", G.vextex[i].data, G.vextex[p->adjvex].data);
else
printf("->%s ", G.vextex[p->adjvex].data);
j++;
p = p->nextarc;
}
printf("\n");
}
}