邻接表:
下图为一个无向图的邻接表结构
在图中 data和firstedge在顶点表中,data存储顶点的信息firstedge指向边表的第一个结点。
边表结点由adjvex与next两个域组成,其中adjvex用于存储某顶点的邻接点在顶点表的下标。next则存储指向边表中下一个结点的指针。
对于带权值的网图,可以在边表结点定义增加一个weight的数据域用于存储权值信息。
对于结点定义的代码:
typedef struct Ding//顶点表结点
{
char data;//顶点信息
struct bian *firstedge;//边表头指针
}ding[100];
typedef struct bian
{
int biao;
int weight;//储存权值
struct bian *next;
}bian;
typedef struct{
ding adjlist;
int numv;//顶点数
int nume;//边数
}Data;
创建邻接表:
void creat(Data *G)
{
int i,j,k;
bian *e;//用于创建边结点时
printf("输入顶点数与边数:");
scanf("%d %d",&G->numv,&G->nume);
printf("输入顶点信息");
for(i=0;i<G->numv;i++){
scanf("%d",&G->adjlist[i].data);
G->adjlist[i].firstedge=NULL;
}
for(k=0;k<G->nume;k++){
printf("输入边上的顶点序号:");
scanf("%d %d",&i,&j);//输入连接边的两个结点
e=(bian *)malloc(sizeof(bian));//申请内存
e->biao=j;//边结点序号为j
e->next=G->adjlist[i].firstedge;//头插法插入
G->adjlist[i].firstedge=e;
e=(bian *)malloc(sizeof(bian));
e->biao=i;
e->next=G->adjlist[j].firstedge;
G->adjlist[j].firstedge=e;
}
}