邻接表
邻接表是一种顺序存储与链接存储相结合的存储方式。对于图中的每个顶点,将所有邻接于该顶点的顶点链成一个表,称为该顶点的表边(有向图称为出边表)。为了方便对所有边表头指针进行存取操作,可以采取顺序存储。存储边表头指针的数组和存储顶点信息的数组构成了邻接表的表头数组,称为顶点表。
C++:
struct ArcNode
{
intadjvex;
ArcNode*next;
} ;
templete<class DataType>
struct VertexNode
{
DataType vertex;
ArcNode* firstedge;
};
在图的邻接链表中,容易解决以下事情:
1. 对于无向图,顶点的度等于边表中顶点的个数。对于有向图,顶点的出度等于出边表中顶点的个数,入度等于各顶点的出边表中该顶点的个数。为了确定入度,可以建立逆邻接表。
2. 判断两顶点之间是否存在边,只需要测试顶点的出边表中是否存在相应顶点的节点
3. 要找顶点所有的邻接点,只需遍历该顶点的出边表
算法:
template <class DataType>
class ALGraph
{
public:
ALGraph(DataType a[],int n,int e);//构造函数,nnodes,e edges
~ALGraph(){};
void DFSTraverse(int v);
void BFSTraverse(int v);
private:
VertexNode adjlist[MaxSize]; //存放顶点表的数组
int vertexNum, arcNum; //图的顶点数和边数
};
构造函数:
template <class DataType>
ALGraph<DataType>::ALGraph(DataTypea[],int n,int e)
{
vertexNum=n;arcNum=e;
for(int i=0;i<vertexNum;i++)
{
adjlist[i].vertex=a[i];
adjlist[i].firstedge=null;
}
for(intk=0;k<arcNum;k++)
{
cin>>i>>j;
s=newArcnode;
s->next=adjlist[i].firstedge;
adjlist[i].firstedge=s;
}
};
深度优先遍历:
template <class DataType>
voidALGraph<DataType>::DFSTraverse(int v)
{
cout<<adjlist[v].vertex;
visited[v]=1;
p=adjlist[v].firstedge;
while (p!=null)
{
j=p->adjvex;
if(visited[j]==0)DFSTraverse(j);
p=p->next;
}
}
广度优先遍历:
template <class DataType>
void ALGraph<DataType>::BFSTraverse(int v)
{
front=rear=-1;
cout<<adjlist[v].vertex;
visited[v]=1;
Q[++rear]=v;
while(front!=rear)
{
v=Q[++front];
p=adjlist[v].firstarc;
while(p!=null)
{
j=p->adjvex;
if(visited[j]==0)
{
cout<<adjlist[j].vertex;
visited[j]=1;
Q[++rear]=j;
}
p=p->next;
}
}
}