您的位置:首页 > 理论基础 > 数据结构算法

数据结构—图的存储结构(邻接矩阵)

2016-11-06 14:30 253 查看
邻接矩阵的代码

有向图/无向图

#include<iostream>
#include<string>
using namespace std;

#define MAX_VERTEX_NUM 20
#define INF 0
typedef struct
{
string vexs[MAX_VERTEX_NUM];//顶点数组.记录顶点的信息
int arc[MAX_VERTEX_NUM][MAX_VERTEX_NUM];//邻接矩阵
int vexnum,arcnum;//顶点个数,边的条数
}Graph;

int create_graph(Graph &G)
{
int i,j;
//输入顶点个数和边的条数
cout<<"输入顶点个数:"<<endl;
cin>>G.vexnum;
cout<<"输入边的条数:"<<endl;
cin>>G.arcnum;

//将顶点信息保存起来
cout<<"逐行输入图的起始点和终端点:"<<endl;
for(i=0;i<G.vexnum;i++)
{
cin>>G.vexs[i];
}

//初始化邻接矩阵,将每条与边相关的信息都设置为INF
for(i=0;i<G.vexnum;i++)
{
for(j=0;j<G.vexnum;j++)
{
G.arc[i][j]=INF;
}
}
return 1;
}

int locate(Graph G,string v)
{
int i;
for(i=0;i<G.arcnum;i++)
{
if(v==G.vexs[i])
return i;
}
return -1;
}
//此处存入的是有向图
int deposit(Graph &G)
{
string v1,v2;
int m,n;
cout<<"请输入您要存储的顶点信息:"<<endl;
for(int i=0;i<G.arcnum;i++)
{
cin>>v1>>v2;
m=locate(G,v1);
n=locate(G,v2);
G.arc[m]
=1;
//若要存储无向图,由于无向图的邻接矩阵具
//有对称性,则只需在此处加上
//G.arc
[m]=1;
}
return 1;
}

void display(Graph G)
{
cout<<"图的邻接矩阵显示如下:"<<endl;
for(int i=0;i<G.vexnum;i++)
{
for(int j=0;j<G.vexnum;j++)
{
cout<<G.arc[i][j]<<" ";
}
cout<<endl;
}
}
int main()
{
Graph G;
//初始化矩阵
if(create_graph(G))
{
cout<<"初始化矩阵成功!"<<endl;
}

//向初始化矩阵中输入要存入的矩阵信息
if(deposit(G))
{
cout<<"向矩阵中存储信息成功!"<<endl;
}

//打印矩阵
display(G);
return 0;
}


有向网/无向网

#include<iostream>
#include<string>
using namespace std;

#define MAX_VERTEX_NUM 20
#define INF 999
typedef struct
{
string vexs[MAX_VERTEX_NUM];//顶点数组.记录顶点的信息
int arc[MAX_VERTEX_NUM][MAX_VERTEX_NUM];//邻接矩阵
int vexnum,arcnum;//顶点个数,边的条数
}Graph;

int create_graph(Graph &G)
{
int i,j;
//输入顶点个数和边的条数
cout<<"输入顶点个数:"<<endl;
cin>>G.vexnum;
cout<<"输入边的条数:"<<endl;
cin>>G.arcnum;

//将顶点信息保存起来
cout<<"请依次输入顶点信息:"<<endl;
for(i=0;i<G.vexnum;i++)
{
cin>>G.vexs[i];
}

//初始化邻接矩阵,将每条与边相关的信息都设置为INF
for(i=0;i<G.vexnum;i++)
{
for(j=0;j<G.vexnum;j++)
{
G.arc[i][j]=INF;
}
}
return 1;
}

int locate(Graph G,string v)
{
int i;
for(i=0;i<G.arcnum;i++)
{
if(v==G.vexs[i])
return i;
}
return -1;
}
//此处存入的是有向图
int deposit(Graph &G)
{
string v1,v2;
int m,n;
int weight;
cout<<"请输入您要存储的顶点信息:"<<endl;
for(int i=0;i<G.arcnum;i++)
{
cin>>v1>>v2;
cin>>weight;
m=locate(G,v1);
n=locate(G,v2);
G.arc[m]
=weight;
//若要改为无向网,则只需在此处再加上
//G.arc
[m]=weight;
}
return 1;
}

void display(Graph G)
{
cout<<"图的邻接矩阵显示如下:"<<endl;
for(int i=0;i<G.vexnum;i++)
{
for(int j=0;j<G.vexnum;j++)
{
if(G.arc[i][j]==INF)
cout<<"∞";
else
cout<<G.arc[i][j]<<" ";
}
cout<<endl;
}
}
int main()
{
Graph G;
//初始化矩阵
if(create_graph(G))
{
cout<<"初始化矩阵成功!"<<endl;
}

//向初始化矩阵中输入要存入的矩阵信息
if(deposit(G))
{
cout<<"向矩阵中存储信息成功!"<<endl;
}

//打印矩阵
display(G);
return 0;
}


图和网的区别只在于边上有没有与边相关联的权值
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数据结构