7-1 邻接矩阵存储创建有向图
编程实现:以邻接矩阵的存储方式,创建一个有向图,顶点为字符型。
输入格式:
第一行输入顶点个数和边的个数,中间用空格分开。下一行开始依次输入顶点,空格或回车分开。接着依次输入边依附的两个顶点。
输出格式:
若数据合理,则输出对应的矩阵。若顶点个数为0,则输出"error"。若顶点个数为1,边个数不合理,则输出"error"。
输入样例:
在这里给出一组输入。例如:
4 4
a b c d
a b
a c
c d
d a
输出样例:
在这里给出相应的输出。例如:
0 1 1 0
0 0 0 0
0 0 0 1
1 0 0 0
分析:
主要是处理错误信息的时候应该怎么处理,我在这里直接Create(G,error)
,这样就可以知道在输入边所依附的结点v1,v2的时候是否合法(顶点表中是否能找到该顶点)
#include<iostream>
using namespace std;
//邻接矩阵需要顶点表,二维矩阵,还有点数边数
#define MVNum 100
typedef struct
{
char vexs[MVNum]; //顶点表
int arcs[MVNum][MVNum]; //矩阵
int vexnum,arcnum; //顶点数、边数
}AMGraph;
int LocateVex(AMGraph G,char v)
{//找到顶点在顶点表中的位置
for(int i=0;i<G.vexnum;++i)
if(G.vexs[i]==v)return i;
return -1;
}
void Create(AMGraph &G,int &error)
{//创建有向图
cin>>G.vexnum>>G.arcnum; //输入顶点数和边数
for(int i=0;i<G.vexnum;++i) cin>>G.vexs[i]; //顶点信息
for(int i=0;i<G.vexnum;++i)
for(int j=0;j<G.vexnum;++j) G.arcs[i][j]=0; //有向图初始化为0
for(int k=0;k<G.arcnum;++k) //邻接矩阵信息
{ char v1,v2;
cin>>v1>>v2;
int i=LocateVex(G,v1),j=LocateVex(G,v2); //邻接矩阵只需要修改一下a[i][j]
if(i==-1||j==-1) error=0; //输入的顶点不合法
else G.arcs[i][j]=1; //有向图
}
}
int main()
{
AMGraph G;
int error=1; //输入的顶点无误:1有误:0
Create(G,error);
if(G.vexnum==0||(G.vexnum==1&&G.arcnum>1)||error==0)
//若顶点个数为0,则输出"error"。若顶点个数为1,边个数不合理,则输出"error"
cout<<"error";
else{
for(int i=0;i<G.vexnum;++i){
for(int j=0;j<G.vexnum;++j){
cout<<G.arcs[i][j];
if(j!=G.vexnum-1)cout<<" ";
else cout<<endl;
}
}
}
return 0;
}