图的邻接矩阵与邻接表的转换
程序员文章站
2023-12-25 18:22:27
...
图的邻接矩阵与图的邻接表的转换
算法:
#include <iostream>
using namespace std;
#define INFINITY 65535
const int MaxVexNum =10;//顶点的最大个数
typedef char VerTexData;//顶点数据类型
typedef int EdgeData;//边权值的类型
typedef struct
{
VerTexData VexList1[MaxVexNum];//顶点表
EdgeData edge[MaxVexNum][MaxVexNum];//邻接矩阵
int n,e;//图中当前的顶点数和边数
}MTGraph;
typedef struct node//边节点
{
int dest;//目标节点位置
EdgeData cost;//边的权值
struct node *link;//下一边链接指针
}EdgeNode;
typedef struct//顶点结点
{
VerTexData data;//顶点数据域
EdgeNode *adj;//边链表头指针
}VerTexNode;
typedef struct//图的邻接表
{
VerTexNode VexList[MaxVexNum];//邻接表
int n,e;//图中当前的顶点个数与边数
}AdjGraph;
void CreatGraph1(MTGraph *G)//创建有向图的邻接矩阵
{
cout<<"创建邻接矩阵\n顶点个数和边个数分别为:\t";
cin>>G->n>>G->e;
cout<<"请输入节点信息:\n";
for(int i=0;i<G->n;i++)
{
cin>>&(G->VexList1[i]);
}
for(int i=0;i<G->n;i++)//初始化邻接矩阵
for(int j=0;j<G->n;j++)
{
if(i==j)G->edge[i][j]=0;
else G->edge[i][j]=INFINITY;
}
int i,j,w;
for(int k=0;k<G->e;k++)
{
cout<<"输入边(vi,vj)的下标i,下标j和权重w:\t";
cin>>i>>j>>w;
G->edge[i][j]=w;
}
}
void MatrixToList(MTGraph *g, AdjGraph &G)//邻接矩阵转为邻接表
{
CreatGraph1(g);G.n=g->n;G.e=g->e;
for(int i=0;i<g->n;i++)
{
G.VexList[i].data=g->VexList1[i];
G.VexList[i].adj=NULL;
}
for(int i=0;i<g->n;i++)
{
for(int j=0;j<g->n;j++)
{
if((g->edge[i][j]!=0)&&(g->edge[i][j]!=INFINITY))
{
EdgeNode *p=new EdgeNode;
p->dest=j;p->cost=g->edge[i][j];
p->link=G.VexList[i].adj;
G.VexList[i].adj=p;
}
}
}
}
void ShowGraph(AdjGraph G)//输出邻接表
{
cout<<"邻接矩阵转为邻接表运行结果为:\n";
for(int i=0;i<G.n;i++)
{
cout<<G.VexList[i].data;
EdgeNode *p=G.VexList[i].adj;
while(p!=NULL)
{
cout<<" -> ("<<p->dest<<","<<p->cost<<")";
p=p->link;
}
cout<<"\n";
}
}
void CreatGraph(AdjGraph &G)//创建邻接表
{
int tail,head,weight;
cout<<"创建邻接表\n输入图的顶点数和边数:\t"<<endl;
cin>>G.n>>G.e;
cout<<"输入顶点:\n";
for(int i=0;i<G.n;i++)//输入顶点信息
{
cin>>G.VexList[i].data;
G.VexList[i].adj=NULL;
}
cout<<"逐条边输入,分别输入尾,头,权重:\n";
for(int i=0;i<G.e;i++)
{
cin>>tail>>head>>weight;//逐条边输入
EdgeNode *p=new EdgeNode;
p->dest=head;p->cost=weight;
p->link=G.VexList[tail].adj;
G.VexList[tail].adj=p;
}
}
void ListToMatrix(AdjGraph &G,MTGraph *g)
{
CreatGraph(G);G.n=g->n;G.e=g->e;
for(int i=0;i<g->n;i++)
{
g->VexList1[i]=G.VexList[i].data;
for(int j=0;j<g->e;j++)
{
if(i==j) g->edge[i][j]=0;
else
g->edge[i][j]=INFINITY;
}
}
for(int i=0;i<G.n;i++)
{
EdgeNode *p=G.VexList[i].adj;
while(p!=NULL)
{
int j=p->dest;
g->edge[i][j]=p->cost;
p=p->link;
}
}
}
void ShowGraph1(MTGraph G)//输出有向图的邻接矩阵
{
cout<<"输出图的邻接矩阵为:\n";
for(int i=0;i<G.n;i++)
{
for(int j=0;j<G.n;j++)
{
cout<<G.edge[i][j]<<"\t";
if(j==G.n-1) cout<<"\n";
}
}
}
int main()
{
MTGraph g;AdjGraph G;
MatrixToList(&g,G);
ShowGraph(G);
ListToMatrix(G,&g);
ShowGraph1(g);
return 0;
}
运行结果: