多重邻接表的复制:利用拷贝构造函数实现

有时希望复制一下原有的多重邻接表进行分析,该多重邻接表数据结构代码可参照网址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,实验部分截图






  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值