邻接表是图的一种链式存储结构。对于图G中每个定点Vi,把所有邻接于Vi的顶点Vj链成一个单链表,这个单链表称为顶点Vi邻接表。
邻接表有三种实现方法,分别为动态建表实现,使用STL中的vector模拟链表实现和静态建表实现。
动态建表中建立一个VNode的数组就可以访问每个顶点的邻接表。
动态建表要求对于每个读入的边数据新建一个EdgeNode对象,加到对应的VNode的邻接表里,同时,需要动态申请内存。在样例实现中,将新节点加到了链表的头部。
对于动态建立的邻接表,它的时间和空间效率比较高,但是这些内存的释放是个问题,判断任意两个顶点(Vi和Vj)之间是否有边相连效率低,需要搜索第i个和第j个链表。
#include<iostream.h>
#include<stdlib.h>
#include<algorithm>
const int maxn=100;
//数据结构
//**********************************
struct EdgeNode //邻接表结点
{
int to; //终点
int w; //权值
EdgeNode *next; //指向下一条的指针
};
struct VNode //起点表结点
{
int from; //起点
EdgeNode *first;//邻接表头指针
};
VNode Adjlist[maxn]; //整个图的邻接表
//**********************************
int main()
{
int i,j,w;
int n=10,m=10;
memset(Adjlist,NULL,sizeof(Adjlist)); //初始化邻接表为NULL
for(int t=1;t<=m;t+