有时希望复制一下原有的多重邻接表进行分析,该多重邻接表数据结构代码可参照网址http://blog.csdn.net/hyymeishi/article/details/50481378,有微小出入。邻接表结构如下:
typedef struct MulAdjGraph
{
VertexNode *adjmulist; // 多重邻接表
int ivexNum,iarcNum; // 无向图的当前顶点数和边数
int MaxVertexNum; // 表中最大的节点数量
MulAdjGraph(): ivexNum(0), iarcNum(0),MaxVertexNum(0) {}
MulAdjGraph(MulAdjGraph&);//拷贝构造函数
void ArcCopy(MulAdjGraph &G,int v);//拷贝构造函数递归部分,赋值边
}MulAdjGraph;
代码实现部分需要基础函数MarkUnvizited(G);在以上提供的网站中有该函数,不详细介绍
void MulAdjGraph::ArcCopy( MulAdjGraph &G,int v )
{
int j;
ArcType *p;
ArcType *pArc;
G.adjmulist[v].isVisited = true;
p = G.adjmulist[v].firstarc;
while(p)
{
if (!p->isVisited_A)
{
if ( p->ivex==v )
{
pArc = new ArcType;
j = p->jvex;
pArc->ivex = v;//赋值,权值,访问属性暂时不用
pArc->jvex = j;
pArc->ilink = adjmulist[v].firstarc;// 插在表头
adjmulist[v].firstarc = pArc;
pArc->jlink = adjmulist[j].firstarc;// 插在表头
adjmulist[j].firstarc = pArc;
}
else
{
pArc = new ArcType;
j = p->ivex;
pArc->ivex = j;//赋值,权值,访问属性暂时不用
pArc->jvex = v;
pArc->ilink = adjmulist[j].firstarc;// 插在表头
adjmulist[j].firstarc = pArc;
pArc->jlink = adjmulist[v].firstarc;// 插在表头
adjmulist[v].firstarc = pArc;
}
p->isVisited_A = true;
if(!G.adjmulist[j].isVisited)
this->ArcCopy(G,j);
}
p = p->ivex==v?p->ilink:p->jlink;
}
}
MulAdjGraph::MulAdjGraph( MulAdjGraph &G )
{
int i,j,k;
ivexNum = G.ivexNum;
iarcNum = G.iarcNum;
MaxVertexNum = G.MaxVertexNum;
adjmulist = new VertexNode[MaxVertexNum];
for(i=0;i!=G.ivexNum;++i) // 构造顶点向量
{
adjmulist[i].data = G.adjmulist[i].data;
adjmulist[i].firstarc = NULL;
G.adjmulist[i].isVisited= false;//置初值
}
MarkUnvizited(G); // 置边的访问标记为未被访问
for(i=0;i<G.ivexNum;++i)
if( !G.adjmulist[i].isVisited )
this->ArcCopy(G,i);
}
其调用可参照http://blog.csdn.net/lwbeyond/article/details/6202256,实验部分截图