实现图的邻接矩阵存储,将邻接矩阵转为邻接表。
前期提要
本代码的邻接矩阵的顶点设为v0、v1、v2、v3、v4、v5,从v0开始。
代码实现
#include<stdio.h>
#include<malloc.h>
typedef int InfoType;
#define MAXV 100 //最大顶点个数
#define INF 32767 //INF表示无穷大
//以下定义邻接矩阵类型
typedef struct
{
int no;//顶点编号
InfoType info;//顶点其他信息
}VertexType;//顶点类型
typedef struct
{//图的定义
int edges[MAXV][MAXV]; //邻接矩阵
int n;//顶点数
int e;//边数
VertexType vex[MAXV];//存放顶点信息
}MGraph;//图的邻接矩阵类型
//以下定义邻接表类型
typedef struct ANode
{//边的节点结构类型
int adjvex;//该边的终点位置
struct ANode *nextarc;//指向下一条边的指针
InfoType info;//该边的相关信息,这里用来存放权值
}ArcNode;
typedef int Vertex;
typedef struct Vnode
{//邻接表头节点的类型
Vertex data;//顶点信息
ArcNode *firstarc;//指向第一条边
}VNode;
typedef VNode AdjList[MAXV];//AdjList是邻接表类型
typedef struct
{
AdjList adjlist;//邻接3表
int n;//顶点数
int e;//边数
}ALGraph;//图的邻接表类型
//带权图的算法
void MatToList1(MGraph g,ALGraph *&G)
{//将邻接矩阵g转换成邻接表G
int i,j;
ArcNode *p;
G=(ALGraph *)malloc(sizeof(ALGraph));
for(i=0;i<g.n;i++)//给邻接表中所有头节点的指针域置初值
G->adjlist[i].firstarc=NULL;
for(i=0;i<g.n;i++)
for(j=g.n-1;j>=0;j--)
if(g.edges[i][j]!=0&&g.edges[i][j]!=INF)
{
p=(ArcNode *)malloc(sizeof(ArcNode));
p->adjvex=j;
p->info=g.edges[i][j];
p->nextarc=G->adjlist[i].firstarc;
G->adjlist[i].firstarc=p;
}
G->n=g.n;G->e=g.e;
}
void DisMat1(MGraph g)
{
int i,j;
for(i=0;i<g.n;i++)
{
for(j=0;j<g.n;j++)
if(g.edges[i][j]==INF)
printf("%3s","∞");
else
printf("%3d",g.edges[i][j]);
printf("\n");
}
}
void DispAdj1(ALGraph *G)
{
int i;
ArcNode *p;
for(i=0;i<G->n;i++)
{
p=G->adjlist[i].firstarc;
printf("%3d:",i);
while(p!=NULL)
{
printf("%3d(%d)",p->adjvex,p->info);
p=p->nextarc;
}
printf("\n");
}
}
void main()
{
int i,j;
MGraph g,g1;
ALGraph *G;
int A[MAXV][6]={{INF,5,INF,7,INF,INF},{INF,INF,4,INF,INF,INF},{8,INF,INF,INF,INF,9},{INF,INF,5,INF,INF,6},
{INF,INF,INF,5,INF,INF},{3,INF,INF,INF,1,INF}};
g.n=6;g.e=10;
for(i=0;i<g.n;i++)
for(j=0;j<g.n;j++)
g.edges[i][j]=A[i][j];
printf("有向图G的邻接矩阵:\n");
DisMat1(g);
G=(ALGraph *)malloc(sizeof(ALGraph));
printf("图G的邻接矩阵转换成邻接表:\n");
MatToList1(g,G);
DispAdj1(G);
}
输出