- 图的存储结构代码实现(要求重点掌握)
- 邻接矩阵的存储结构
- 邻接表的存储结构
一、邻接矩阵代码实现
//图的邻接矩阵表示
#include<iostream>
#include<iomanip>
#include<string.h>
#include<math.h>
#include<malloc/malloc.h>
using namespace std;
#define MaxVertexNum 100 //最大顶点数设为100
typedef int EdgeType; //边的权值设为整形
typedef char VertexType[100]; //顶点类型设为字符串
typedef struct
{
VertexType vertex[MaxVertexNum]; //顶点表
EdgeType edges[MaxVertexNum][MaxVertexNum]; //邻接矩阵,即边表
int n,e; //顶点数和边数
}MGraph; //MGraph是以邻接矩阵存储的图类型
/*
以v1-->v2,v1-->v3,v3-->v4,v4-->v1,v4-->v2为例
*/
int LocateVex(MGraph G,VertexType u) //G为顶点表(v1、v2、v3、v4),u为每个顶点
{
int i;
for(i=0;i<G.n;++i)
if(strcmp(u,G.vertex[i])==0) //比较顶点在表中的位置,如v1在表v1、v2、v3、v4中的位置为0,返回值i=0
return i; //如v2在表v1、v2、v3、v4中的位置为1,返回值i=1
return -1;
}
void CreateMGraphDG(MGraph &G)
{ //建立有向图G的邻接矩阵存储
int i,j,k;
VertexType vi,vj;
cout<< "请输入顶点数和弧数(输入格式为:顶点数,弧数):"<<endl;
cin>>G.n>>G.e; //输入顶点数和弧数
cout<< "请输入顶点信息(输入格式为:顶点号<CR>):"<<endl;
for(i=0;i<G.n;i++)
cin>>G.vertex[i]; //输入定点信息,建立顶点表
for(i=0;i<G.n;i++)
for(j=0;j<G.n;j++)
G.edges[i][j]=0; //初始化邻接矩阵
cout<< "请输入"<<G.e<< "条弧对应的两个顶点的序号(输入格式为:弧尾,弧头):"<<endl;
for(k=0;k<G.e;k++)
{
cin>>vi>>vj; //输入e条边,建立邻接矩阵
i=LocateVex(G,vi);
j=LocateVex(G,vj);
G.edges[i][j]=1; //对输入的两顶点判断其在矩阵的位置,并赋值1,剩下的定点表明无对应关系,为已经的初始化值0
}
}
void CreateMGraphDN(MGraph &G)
{ //建立有向网G的邻接矩阵存储,边上带权的图也称网
int i,j,k,w; //区别于有向图,网要多声明一个变量w来代表各个边上的权值
VertexType vi,vj;
cout<< "请输入顶点数和弧数(输入格式为:顶点数,弧数):"<<endl;
cin>>G.n>>G.e; //输入顶点数和弧数
cout<< "请输入顶点信息(输入格式为:顶点号<CR>):"<<endl;
for(i=0;i<G.n;i++)
cin>>G.vertex[i]; //输入定点信息,建立顶点表
for(i=0;i<G.n;i++)
for(j=0;j<G.n;j++)
G.edges[i][j]=0; //初始化邻接矩阵
cout<< "请输入"<<G.e<< "条弧对应的两个顶点的序号(输入格式为:弧尾,弧头,权值):"<<endl;
for(k=0;k<G.e;k++)
{
cout<<"弧尾,弧头:";
cin>>vi>>vj; //输入e条边&#