图的存储方式(邻接矩阵与邻接表之间的转化)

#include<iostream.h>
#define MAXV 100 //<最大顶点个数>
#define INF 32767
#define maxsize 32767
typedef struct
{
int dingdian[MAXV]; //储存顶点的数组
int edges[MAXV][MAXV]; //邻接矩阵数组
int n; //顶点数
int e; //边数
}digraph; //完整的图邻接矩阵类型
int locatevetex(digraph *L,int v) //这函数主要找出哪两个顶点之间有连线,后返回顶点编号
{
int i;
for(i=0;in;i++)
{
if(L->dingdian[i]==v) //找到该顶点
{
return i; //把该顶点的编号返回
}
}
return -1;
}
//构造邻接矩阵
void Initdigraph(digraph *&L,int a,int b,int c[])
{

int i,j,k;
for(i=0;i<L->n;i++)
{
	L->dingdian[i]=c[i];
}
for(i=0;i<L->n;i++)
{
	for(j=0;j<L->n;j++)
	{
		if(i==j)
		{
			L->edges[j][i]=0;  
		}
		else
			L->edges[j][i]=maxsize; //统一初始化顶点间权重值
	}
}
int v1,v2,weight;
cout<<"请输入两个顶点以及两个顶点之间的权重值:"<<endl;
for(k=0;k<L->e;k++)
{
	cin>>v1>>v2>>weight;
	i=locatevetex(L,v1);
	j=locatevetex(L,v2);
	L->edges[j][i]=weight;
}

}
//打印有向图的邻接矩阵
void shuchu(digraph *L)
{
int i ,j;
for(i=0;in;i++)
{
for(j=0;jn;j++)
{
if(L->edges[i][j]maxsize)
cout<<“∞\t”;
else
cout<edges[i][j]<<"\t";
}
cout<<endl;
}
}
typedef struct ANode
{
int adjex; //该边的邻接点编号
struct ANode * nextarct; //指向下一条边的指针
int weight; //该边的相关信息,如权值(这里用整型表示)
}ArcNode; //边结点的类型
typedef struct Vnode
{
ArcNode *firstarc; //指向第一个边结点
}VNode; //邻接点的头结点类型
typedef struct
{
VNode adjlist[MAXV]; //邻接表的头结点数组
int n; //图中顶点数n
int e; //图中边数e
}AdjGraph; //完整的图邻接表类型
//创建图的邻接表
void CreateAdj(AdjGraph *&G,int edges[MAXV][MAXV],int n,int e)
{
int i,j;
ArcNode *p;
G=new AdjGraph;
for(i=0;i<n;i++) //给邻接表中所有头结点的指针域置为初值
G->adjlist[i].firstarc=NULL;
for(i=0;i<n;i++) //检查邻接矩阵中的每个元素
for(j=n-1;j>=0;j–)
if(edges[i][j]!=0&&edges[i][j]!=INF) //存在一条边
{
p=new ArcNode; //创建一个结点p
p->adjex=j; //存放邻接点
p->weight=edges[i][j]; //存放权重值
p->nextarct=G->adjlist[i].firstarc; //采用头插法插入结点p
G->adjlist[i].firstarc=p;
}
G->n=n;
G->e=e;
}
//输出图
void shuchutu(AdjGraph *G,int n) //输出邻接表G
{
int i;
ArcNode *p;
for(i=0;i<n;i++)
{
p=G->adjlist[i].firstarc;
cout<<i;
while(p!=NULL)
{
cout<<"---->";
cout<adjex<<","<weight;
p=p->nextarct;
}
cout<<"^"<<endl;
}
}
//邻接表转化为邻接矩阵
void ListToMat(AdjGraph *G,digraph *&L2)
{
int i,j;
ArcNode *p;
for(i=0;in;i++)
{
for(j=0;jn;j++)
{
if(j
i)
L2->edges[i][j]=0;
else
L2->edges[i][j]=maxsize;
}

		p=G->adjlist[i].firstarc;  //扫描所有单链表
		while(p!=NULL)
		{
			L2->edges[i][p->adjex]=p->weight;
			p=p->nextarct;
		}
}
	L2->n=G->n;
	L2->e=G->e;

}
void main()
{
int c[100],i;
digraph *L1;
digraph *L2;
L1=new digraph;
cout<<“请输入该图的边个数:”;
cin>>L1->e;
cout<<“请输入该图的顶点个数:”;
cin>>L1->n;
cout<<“请输入每个顶点的编号:”<<endl;
for(i=0;in;i++)
{
cin>>c[i];
}
Initdigraph(L1,L1->e,L1->n,c);
cout<<“有向图G的邻接矩阵为:”<<endl;
shuchu(L1);
AdjGraph *G;
CreateAdj(G,L1->edges,L1->n,L1->e);
cout<<“有向图G的邻接矩阵转换成邻接表为:”<<endl;
shuchutu(G,L1->n);
cout<<endl;
L2=new digraph;
ListToMat(G,L2);
cout<<“图G的邻接表转换成邻接矩阵为:”<<endl;
shuchu(L2);
}
在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值