• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

wchenfeng

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

实现图的邻接矩阵存储,将邻接矩阵转为邻接表。

前期提要

本代码的邻接矩阵的顶点设为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);
}

输出

 

 

posted on 2022-04-12 20:01  王陈锋  阅读(320)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3