C语言邻接矩阵和邻接表的相互转换算法讲解,邻接矩阵与邻接表的相互转换

本文介绍了一个C++程序,该程序能够实现带权图的邻接矩阵与邻接表之间的相互转换,并详细展示了从邻接矩阵到邻接表及从邻接表到邻接矩阵的具体实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

编写一个程序,输出带权图的邻接矩阵,并能将该邻接矩阵转换成相应的邻接表,并输出该邻接表,带权图如下图所示。

具体效果如下:  2.1.编写一个算法,实现由已知的邻接表产生对应的邻接矩阵,并输出。 具体效果如下:

#include

#include

#define MAXV 100

#define MaxSize 100

#define INF 327676

using namespace std;

typedef char InfoType;

typedef char ElemType;

//邻接矩阵声明

typedef struct

{

int no;

InfoType info;

} VertexType;

typedef struct

{

int edges[MAXV][MAXV];

int n,e;

VertexType vexs[MAXV];

} MatGraph;

//邻接表声明

typedef struct ANode

{

int adjvex;

struct ANode *nextarc;

int weight;

} ArcNode;

typedef struct Vnode

{

InfoType info;

ArcNode *firstarc;

} VNode;

typedef struct

{

VNode adjlist[MAXV];

int n,e;

} AdjGragh;

//创建邻接矩阵

void CreatrMat(MatGraph &g,int A[MAXV][MAXV],int n,int e)

{

int i,j;

g.n=n;

g.e=e;

for(i=0; i

for(j=0; j

g.edges[i][j]=A[i][j];

}

//输出邻接矩阵

void DispMat(MatGraph g)

{

int i,j;

for(i=0; i

{

for(j=0; j

{

if(g.edges[i][j]!=INF)

printf("%4d",g.edges[i][j]);

else

printf("%4s","∞");

}

cout<

}

}

//邻接矩阵转换为邻接表

void MatToList(MatGraph g,AdjGragh *&G)

{

int i,j;

ArcNode *p;

G=(AdjGragh *)malloc(sizeof(AdjGragh));

for(i=0; i

G->adjlist[i].firstarc=NULL;

for(i=0; i

{

for(j=g.e-1; j>=0; j--)

{

if(g.edges[i][j]!=0&&g.edges[i][j]!=INF)

{

p=(ArcNode *)malloc(sizeof(ArcNode));

p->adjvex=j;

p->weight=g.edges[i][j];

p->nextarc=G->adjlist[i].firstarc;

G->adjlist[i].firstarc=p;

}

}

}

G->n=g.n;

G->e=g.e;

}

//输出邻接表

void DispAdj(AdjGragh *G)

{

int i;

ArcNode *p;

for(i=0; in; i++)

{

p=G->adjlist[i].firstarc;

printf("%3d: ",i);

while(p!=NULL)

{

printf("%3d(%d) ",p->adjvex,p->weight);

p=p->nextarc;

}

cout<

}

}

//邻接表转换成邻接矩阵

void ListToMat(AdjGragh *G,MatGraph &g)

{

int i;

ArcNode *p;

for(i=0; in; i++)

{

p=G->adjlist[i].firstarc;

while(p!=NULL)

{

g.edges[i][p->adjvex]=p->weight;

p=p->nextarc;

}

}

g.n=G->n;

g.e=G->e;

}

//主函数

int main()

{

MatGraph g;

AdjGragh *G;

int A[MAXV][MAXV]= {{0,5,INF,7,INF,INF},{INF,0,4,INF,INF,INF},

{8,INF,0,INF,INF,9},{INF,INF,5,0,INF,6},

{INF,INF,INF,5,0,INF},{3,INF,INF,INF,1,0}

};

printf("有向图G的邻接矩阵:\n");

CreatrMat(g,A,6,6);

DispMat(g);

printf("图G的邻接矩阵转换成邻接表:\n");

MatToList(g,G);

DispAdj(G);

printf("图G的邻接表转换成邻接矩阵:\n");

ListToMat(G,g);

DispMat(g);

printf("图G的邻接表:\n");

MatToList(g,G);

DispAdj(G);

return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值