![](https://i-blog.csdnimg.cn/blog_migrate/824d8296bd815a1e62f9fefa0e734602.png)
算法思路:
1. 写出邻接表定义
2.输入顶点和边界点的个数,循环将所有顶点赋值,将所有顶点的firstarc边界点指向为null
3.for循环所有边节点, cin输入两个顶点v1v2(因为每一条边对应两个结点),使用LocateVex函数定位两个顶点所在的位置。生成边界点p1,结合上图 比如p1是连接V0到V3的 那p1->adjvex=3也就是j,再用头插法将p1插在V1后的边链中,即p1->nextarc=G.vertices[i].firstarc; 再让G指向p1:G.vertices[i]=p1;
同理 V3的边结点中增加边界点(边界点值为V1,如果是无向图则更简单一些,不如这一步)即:p2=new ArcNode; p2->adjvex=i; p2->nextarc=G.vertices[j].firstarc;G.vertices[j].firstarc=p2;
#define MAXNUM 100
typedef struct ArcNode{
int adjvex;
struct ArcNode *nextarc;
OtherInfo info;
}ArcNode
typedef struct Vnode{
VerTexType data;
ArcNode *firstarc;
}Vnode,AdjList[MAXNUM]
typedef struct{
AdjList vertices;
int vexnum,arcnum;
}ALGraph;
Status createGraph(ALGraph &G){
cin>>G.vexnum>>G.arcnum;
for(i=0;i<G.vexnum;i++){
cin>>G.vertices[i].data;
G.vertices[i].firstarc=null;
}
for(k=0;i<G.arcnum;k++){
cin>>v1>>v2;
i=Locate(G,v1);
j=Locate(G,v2);
p1=new ArcNode;
p1->adjvex=j;
p1->nextarc=G.vertices.[i].firstarc;
G.vertices.[i].firstarc=p1;
p2=new ArcNode;
p2->adjvex=i;
p2->nextarc=G.vertices.[j].firstarc;
G.vertices.[i].firstarc=p2;
}
return OK;
}