代码基于:【数据结构】【严蔚敏】【清华大学】
【邻接矩阵和邻接表相互转换算法】
问题描述:该算法的设计,要求运行结果如下所示:
图 G 的邻接矩阵:
0 1 1 0 0 0 0 0
1 0 0 1 1 0 0 0
1 0 0 0 0 1 1 0
0 1 0 0 0 0 0 1
0 1 0 0 0 0 0 1
0 0 1 0 0 0 1 0
0 0 1 0 0 1 0 0
0 0 0 1 1 0 0 0
将 g 转换为邻接表 G
图 G 的邻接表:
0: 1→2
1: 0→3→4
2: 0→5→6
3: 1→7
4: 1→7
5: 2→6
6: 2→5
7: 3→4
图 G 的邻接表:
0: 1→2
1: 0→3→4
2: 0→5→6
3: 1→7
4: 1→7
5: 2→6
6: 2→5
7: 3→4
将 G 转换为邻接矩阵 g
0 1 1 0 0 0 0 0
1 0 0 1 1 0 0 0
1 0 0 0 0 1 1 0
0 1 0 0 0 0 0 1
0 1 0 0 0 0 0 1
0 0 1 0 0 0 1 0
0 0 1 0 0 1 0 0
0 0 0 1 1 0 0 0
可能用到函数:
void CreateAdj (ALGraph *&G, int A[][MAX_VERTEX_NUM], int n, int e) //创建图的邻接表
void CreateMat(MGraph &g, int A[][MAX_VERTEX_NUM], int n, int e) //创建图的邻接矩阵
void MatrixToList(MGraph g, ALGraph *&G) //将邻接矩阵g 转换成邻接表G
void ListToMatrix(ALGraph *G, MGraph &g) //将邻接表G 转换成邻接矩阵g
void DispMatrix(MGraph g) //输出邻接矩阵g
void DispAdj List(ALGraph *G) //输出邻接表G
void DestroyAdj (ALGraph *&G) //销毁图的邻接表
完整代码如下:
#include
#include
#include
#define GF G->adjlist[i].firstarc //( ̄▽ ̄)"
#define INFINITY 32767 // 值∞这里是当作int型为2字节
const int MAX_VERTEX_NUM=8; // 最大顶点个数
typedef char InfoType; // 其他信息,这里没用到
// *****************************图的数组(邻接矩阵)存储表示***************************************//
typedef struct {
//VertexType vexs[MAX_VERTEX_NUM]; // 顶点向量
int arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; // 邻接矩阵数组
int n,e; // 图的当前顶点数和弧数
} MGraph;
void CreateMat(MGraph &g, int A[][MAX_VERTEX_NUM], int n, int e) //创建图的邻接矩阵
{
g.n=n,g.e=e;
for(int i=0; i<MAX_VERTEX_NUM; i++)
for(int j=0; j<MAX_VERTEX_NUM; j++) {
g.arcs[i][j]=A[i][j];
}
}
void DispMatrix(MGraph g) //输出邻接矩阵g
{
for(int i=0; i<MAX_VERTEX_NUM; i++) {
for(int j=0; j<MAX_VERTEX_NUM; j++) {
printf(" %d",g.arcs[i][j]);
}
printf("\n");
}
}
// ***************************图的邻接表存储表示************************************************//
typedef struct ArcNode { // 链表结点
int adjvex; // 该弧所指向的顶点的位置
//int weight; // 网的权值指针
ArcNode *nextarc; // 指向下一条弧的指针
} ArcNode;
typedef struct {
//VertexType data; // 顶点信息
ArcNode *firstarc; // 第一个表结点的地址,指向第一条依附该顶点的弧的指针
} VNode;
typedef struct {
VNode adjlist[MAX_VERTEX_NUM]; //adjacency List
int n, e; // 图的当前顶点数和弧数
} ALGraph;
int init(ALGraph *&G)
{
G=(ALGraph*)malloc(sizeof(ALGraph));
for(int i=0; i<MAX_VERTEX_NUM; i++) {
GF=(ArcNode*)malloc(sizeof(ArcNode));
if(!GF) return 0;//创建失败
GF->nextarc=NULL;
}
}
int DestroyAdj (ALGraph *&G) //销毁图的邻接表
{
ArcNode*p;
for(int i=0; i<MAX_VERTEX_NUM; i++) {
p=GF;
while(GF) {
p=GF->nextarc;
free(GF);
GF=p;
}
}
free(G);
return 1;
}
void CreateAdj (ALGraph *&G, int A[][MAX_VERTEX_NUM], int n, int e) //创建图的邻接表
{
init(G);
G->n=n;
G->e=e;
for(int i=0; i<n; i++)
for(int j=n-1; j>=0; j--) {
if(A[i][j]!=0) {
ArcNode* p=(ArcNode*)malloc(sizeof(ArcNode));
p->adjvex=j;
p->nextarc=GF->nextarc;
GF->nextarc=p;
}
}
}
void DispAdj_List(ALGraph *G) //输出邻接表G
{
ArcNode *p;
printf("图 G 的邻接表: \n");
for(int i=0; i<MAX_VERTEX_NUM; i++) {
printf(" %d:",i);
p=GF->nextarc;
for(int j=0; j<MAX_VERTEX_NUM; j++) {
if(p->adjvex==j) {
printf("%d",p->adjvex);
if(p->nextarc!=NULL) {
printf("->");
p=p->nextarc;
} else
printf("\n");
}
}
}
}
//************************邻接表邻接矩阵的相互转化*******************************************//
void MatrixToList(MGraph g, ALGraph *&G) //将邻接矩阵g 转换成邻接表G
{
printf("将g转换为邻接表 G \n");
init(G);
CreateAdj (G,g.arcs,8,9);
}
void ListToMatrix(ALGraph *G, MGraph &g) //将邻接表G 转换成邻接矩阵g
{
printf("将G转换成邻接矩阵g\n");
g.n=G->n;
g.e=G->e;
ArcNode *p;
memset(g.arcs,0,sizeof(g.arcs));
for(int i=0; i<MAX_VERTEX_NUM; i++)
for(int j=0; j<MAX_VERTEX_NUM; j++)
{
p=GF->nextarc;
if(j==p->adjvex)
{
g.arcs[i][j]=1;
p=p->nextarc;
}
}
}
int main()
{
MGraph g;//邻接矩阵
ALGraph *G;//邻接表
int m[8][8]= {
{0,1,1,0,0,0,0,0},
{1,0,0,1,1,0,0,0},
{1,0,0,0,0,1,1,0},
{0,1,0,0,0,0,0,1},
{0,1,0,0,0,0,0,1},
{0,0,1,0,0,0,1,0},
{0,0,1,0,0,1,0,0},
{0,0,0,1,1,0,0,0}
};
//1.创建并输出邻接矩阵g
CreateMat(g,m,8,9);
printf("图G的邻接矩阵:\n");
DispMatrix(g);
//2.邻接矩阵g转换成邻接表G
ALGraph *G1;//为测试转化另设一个邻接表G1
MatrixToList(g,G1);
DispAdj_List(G1);
DestroyAdj(G1);
//3.创建并输出邻接矩阵G
CreateAdj(G,m,8,9);
DispAdj_List(G);
//4.将邻接表G转换成邻接矩阵g
MGraph g1;//为测试转化另设一个邻接矩阵g1
ListToMatrix(G,g1);
DispMatrix(g);
//5.销毁邻接表G,G1
DestroyAdj(G);
DestroyAdj(G1);
}