邻接表采用链表的方式对每个结点的邻接点进行存储,每个顶点所带领的一个链表主要由表头结点和边结点构成。
表头结点结构:
边结点结构:
例如:
代码如下:
#include<stdio.h>
#define maxvertex 20
typedef struct ArcNode //边结点
{
int adjvex; //邻接点域
struct ArcNode *nextarc; //链域
int qz; //权重
}ArcNode;
typedef struct VerNode //表头结点
{
char data; //数据域
ArcNode *firstarc; //链域
}VerNode,AdjList[maxvertex];
typedef struct
{
AdjList V;
int vertex; //顶点数
int arc; //边数
}Graph;
void CreateGraph(Graph *G)
{
int v1,v2;
printf("请分别输入顶点数和边数:\n");
scanf("%d %d",&G->vertex,&G->arc);
getchar();
for(int i=0;i<G->vertex;i++) //初始化表头结点数组
{
printf("请输入%d号顶点:",i);
scanf("%c",&(G->V[i].data));
getchar();
G->V[i].firstarc=NULL;
}
for(int j=0;j<G->arc;j++)
{
printf("请输入边的序号(序号从0开始):");
scanf("%d %d",&v1,&v2);
ArcNode *p1; //生成边结点
p1=(ArcNode*)malloc(sizeof(ArcNode));
printf("请输入该边的权重:");
scanf("%d",&p1->qz);
getchar();
p1->adjvex=v2;
p1->nextarc=G->V[v1].firstarc;
G->V[v1].firstarc=p1;
//设置对称点
ArcNode *p2;
p2=(ArcNode*)malloc(sizeof(ArcNode));
p2->adjvex=v1;
p2->nextarc=G->V[v2].firstarc;
G->V[v2].firstarc=p2;
}
//打印图G
int flag=0;
for(int k=0;k<G->vertex;k++)
{
printf("第%d号顶点的邻接点:",k);
ArcNode *q;
q=(ArcNode*)malloc(sizeof(ArcNode));
q=G->V[k].firstarc;
while(q)
{
printf("%d ",q->adjvex);
q=q->nextarc;
}
printf("\n");
}
}
int main()
{
Graph G;
CreateGraph(&G);
}
运行结果: