邻接表是图的一种链式存储结构。在邻接表中,对图中的每个定点建立一个单链表,第i个单链表中的结点表示依附于定点vi的边。每个结点由三个域构成,表节点,头结点,还有存储图的。
如果像构建下图的一个图的结构
那么程序如下:
#include<stdio.h>
#include<stdlib.h>
#define MAXNUM 100
typedef struct node //边表节点
{
int adjvex;
struct node* next;
}EdgeNode;
typedef struct //顶点表节点
{
char vertex;
EdgeNode* firstedge;
}VertexNode;
typedef struct
{
VertexNode adjlist[MAXNUM];
int n,e;
}ALGraph;
void create(ALGraph* G)
{
int i,j,k,w,v;
EdgeNode *s;
printf("读入顶点数和边数");
scanf("%d,%d",&G->n,&G->e);
for (i=0;i<G->n;i++)
{
fflush(stdin);
printf("建立顶点表");
G->adjlist[i].vertex=getchar();
G->adjlist[i].firstedge=NULL;
}
printf("建立边表\n");
for (k=0;k<G->e;k++)
{
printf("读入(vi-vj)的顶点对序号");
scanf("%d,%d",&i,&j);
s=(EdgeNode*)malloc(sizeof(EdgeNode));
s->adjvex=j;
s->next=G->adjlist[i].firstedge; //插入表头
G->adjlist[i].firstedge=s;
s=(EdgeNode*)malloc(sizeof(EdgeNode));
s->adjvex=i;
s->next=G->adjlist[j].firstedge;
G->adjlist[j].firstedge=s;
}
}
int main()
{
int i;
ALGraph* G= (ALGraph*)malloc(sizeof(ALGraph));
create(G);
for (i=0;i< G->n;i++)
{
printf("%d->",i);
while(G->adjlist[i].firstedge!=NULL)
{
printf("%d->",G->adjlist[i].firstedge->adjvex);
G->adjlist[i].firstedge=G->adjlist[i].firstedge->next;
}
printf("\n");
}
}