7-1 邻接矩阵存储创建有向图

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
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;
}

你可能感兴趣的:(数据结构)