邻接矩阵和邻接表的相互转化

#include <iostream>
#define MaxNum 100
using namespace std;
//邻接矩阵
typedef struct{
	int Vex[MaxNum];	//顶点 
	int edge[MaxNum][MaxNum];	//边 
	int arcnum,vexnum;	//边和顶点个数 
}MGraph;	
//邻接表 
typedef struct ArcNode{
	int adjvex;	 
	struct ArcNode *next; 
}ArcNode;	//边结点
typedef struct VNode{
	int data;	//顶点信息 
	ArcNode *firstarc;	//指向的第一条边 
}VNode,AdjList[MaxNum];	//邻接链表头节点
typedef struct{
	AdjList adjlist;
	int arcnum,vexnum; 
}ALGraph;	//邻接表 

//邻接矩阵转邻接表 
void TurnToALG(MGraph MG,ALGraph *&ALG)
{
	int i,j;
	ArcNode *p; 
	for(i=0;i<MG.vexnum;i++)
		ALG->adjlist[i].firstarc=NULL;	//邻接表初始化
	for(i=0;i<MG.vexnum;i++)
		for(j=MG.vexnum;j>=0;j--){
			if(MG.edge[i][j]!=0)	//存在边 
			{
				p=(ArcNode*)malloc(sizeof(ArcNode));
				p->adjvex=j;
				p->next=ALG->adjlist[i].firstarc;	//头插法建立链表 
				ALG->adjlist[i].firstarc=p;
			}
		}	
}
//邻接表转邻接矩阵
void TurnToMG(MGraph &MG,ALGraph *ALG)
{
	int i,j;
	for(i=0;i<ALG->vexnum;i++)
		for(j=0;j<ALG->vexnum;j++)
			MG.edge[i][j]=0;	//初始化 
	for(i=0;i<ALG->vexnum;i++){
		ArcNode *p;
		p=ALG->adjlist[i].firstarc;
		while(p!=NULL)
		{
			j=p->adjvex;
			MG.edge[i][j]=1;
			p=p->next;
		}
	}
} 

猜你喜欢

转载自blog.csdn.net/KK_2018/article/details/111612413