#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(ji)
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);
}