在创建无向图的时候,我们除了使用邻接矩阵外,还可以使用邻接表来创建。
对于下面一个例子:
共有abcd四个顶点,和六条边。
我们可以使用类似于邻接矩阵和链表的结合体->(邻接表)
邻接表结构分为:
邻接表表头、邻接表表节点两个部分组成。
表头索引代表顶点索引,顶点指向的那一横列,都是和a有边的顶点。
所以第一行,a->b,b->c,c->d,可以隐含的转换为:
a->b、a->c、a->d,即<a,b>、<a,c>、<a,d>三条边。
#include<stdio.h>
#include<malloc.h>
#define MAX 100
typedef struct ArcNode{//邻接表单元
int adjvex; //adjvex代表该单元所指顶点的序号。
struct ArcNode *nextarc;
}ArcNode;
typedef struct VNode{ //邻接表表头
char vertex; //表头顶点
ArcNode *firstarc; //表头所指的第一个单元,也就是一个边。
}VNode;
typedef VNode AdjList[MAX]; //邻接表
typedef struct ALGraph{
AdjList adjlist;
int vexnum,arcnum;
}ALGraph;
int LocateVerTex(ALGraph *G,int v) //查找顶点v在邻接表中的索引位置。
{
int k;
for(k=0;k<G->vexnum;k++)
if(v == G->adjlist[k].vertex)
return k;
return -1;
}
void CreateALGraph(ALGraph *G)
{
int i,j,k,weight;
char v1,v2;
ArcNode *tmp;
printf("请输入顶点数和边数:\n");
scanf("%d %d",&(G->vexnum),&(G->arcnum));
getchar();
printf("请输入{%d}个顶点:\n",G->vexnum);
for(i=0;i<G->vexnum;i++){
scanf("%c",&(G->adjlist[i]));
G->adjlist[i].firstarc = NULL;
}
getchar();
printf("请输入{%d}条边,格式{v1 v2 权重}\n",G->arcnum);
for(k=0;k<G->arcnum;k++){
scanf("%c %c %d",&v1,&v2,&weight);
getchar();
i = LocateVerTex(G,v1);
j = LocateVerTex(G,v2);
if(i==-1||j==-1){
printf("失败.\n");
k = k - 1;
continue;
}
else{
tmp = (ArcNode*)malloc(sizeof(ArcNode));
tmp->adjvex = j;
tmp->nextarc = G->adjlist[i].firstarc; //头插法
G->adjlist[i].firstarc = tmp; //给i这个下标顶点操作,和j是一条边。
tmp = (ArcNode*)malloc(sizeof(ArcNode));
tmp->adjvex = i;
tmp->nextarc = G->adjlist[j].firstarc; //头插法
G->adjlist[j].firstarc = tmp; //给j这个下标顶点操作,和i是一条边。
printf("成功.\n");
}
}
}
int main()
{
ALGraph G;
CreateALGraph(&G);
return 0;
}