使用邻接矩阵实现的图结构
下一次实验课就要逼近了,我也不能坐以待毙,所以要积极起来呢。前几天就是在研究这个图结构是怎样实现的,看了很多的书,然后一知半解地照着书进行模仿。总觉得自己的思维局限在书中了,没有很好地发散。没有办法,因为考试是要考你掌握了知识没有,它是拒绝你创新的想法的。这真是考试的悲哀啊。
扯远了,我将书上的伪代码转化成了C++代码,保证能运行,但是这是看到的。有什么办法呢?有!不过有些麻烦。第一是在我的代码中加上cout语句,将所有顶点和弧的值输出,这样就可以看到输入的数值是否成功。第二种方法是在我的JGraph.h下设置断点,让程序停下来,然后在参数列表中搜索各个数组的值是否已经存入。使用邻接矩阵的话,只需要检查vexs数组和AdjMatrix二维数组的值是否存入即可。在我的代码中有提示。
更新于2010年12月8日:这是我最近,也是最新的成果,大家可以看看:http://student.youkuaiyun.com/space.php?uid=999749&do=blog&id=51393
- 下面是我的JGraph.h代码:
- /*----------------------------------------------------------------------------
- 蒋轶民制作:E-mail:jiangcaiyang123@163.com
- ------------------------------------------------------------------------------
- 文件名:JGraph.h
- ------------------------------------------------------------------------------
- 作用:这是使用邻接矩阵制作的图状结构,基本实现了图的创建操作。
- ------------------------------------------------------------------------------
- 调用规范:无
- /*--------------------------------------------------------------------------*/
- //条件编译
- #ifndef_JGRAPH_H_
- #define_JGRAPH_H_
- /*--------------------------------------------------------------------------*/
- //头文件
- #include<limits.h>
- //定义的宏
- #defineINFINITYINT_MAX
- #defineMAX_VERTEX_NUM20
- /*--------------------------------------------------------------------------*/
- //定义一系列类型
- enumGraphKind{DG,DN,UDG,UDN};//图的类型枚举
- typedefunsignedintVRType;
- typedefcharInfoType;
- typedefstruct
- {
- VRTypeadj;//顶点关系类型
- InfoType*info;//弧的信息
- }AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
- //图的定义
- template<typenameCustomType>
- classJMatrixGraph
- {
- public:
- JMatrixGraph():vexnum(0),arcnum(0){}//默认构造函数
- voidCreateGraph(GraphKindinputKind);//创建图
- private:
- voidCreateDG(void);//创建有向图
- voidCreateDN(void);//创建有向网
- voidCreateUDG(void);//创建无向图
- voidCreateUDN(void);//创建无向网
- CustomTypevexs[MAX_VERTEX_NUM];//顶点向量
- AdjMatrixarcs;//邻接矩阵
- intvexnum,arcnum;//图的顶点数和弧数
- GraphKindkind;//图的种类标志
- };
- template<typenameCustomType>
- voidJMatrixGraph<CustomType>::CreateGraph(GraphKindinputKind)
- {
- switch(inputKind)
- {
- caseDG:returnCreateDG();
- caseDN:returnCreateDN();
- caseUDG:returnCreateUDG();
- caseUDN:returnCreateUDN();
- }
- }
- template<typenameCustomType>//创建有向图
- voidJMatrixGraph<CustomType>::CreateDG(void)
- {
- inti,j,k;
- intv1,v2,incInfo;
- cout<<"输入顶点个数:/n";
- cin>>vexnum;
- cout<<"输入弧的个数:/n";
- cin>>arcnum;
- if(arcnum>vexnum*(vexnum-1)*0.5f)
- {
- cout<<"输入错误!因为不满足n(n-1)/2的条件。/n";
- return;
- }
- cout<<"输入弧的信息(0表示忽略):/n";
- cin>>incInfo;
- for(i=0;i<vexnum;i++)
- {
- cout<<"请输入第"<<i+1<<"个顶点的内容:/n";
- cin>>vexs[i];
- }
- for(i=0;i<vexnum;i++)
- {
- for(j=0;j<vexnum;j++)
- {
- arcs[i][j].adj=0;
- arcs[i][j].info=NULL;
- }
- }
- for(k=0;k<arcnum;k++)
- {
- cout<<"请输入第"<<k+1<<"边连接的两个顶点。/n";
- cin>>v1>>v2;
- arcs[v1-1][v2-1].adj=1;
- if(incInfo!=0)
- {
- cout<<"输入弧的信息,以字符串的形式存储。/n";
- cin>>arcs[v1-1][v2-1].info;
- }
- }//这里设置断点,下同
- }
- template<typenameCustomType>//创建有向网
- voidJMatrixGraph<CustomType>::CreateDN(void)
- {
- inti,j,k;
- intv1,v2,incInfo;
- intw;
- cout<<"输入顶点个数:/n";
- cin>>vexnum;
- cout<<"输入弧的个数:/n";
- cin>>arcnum;
- if(arcnum>vexnum*(vexnum-1)*0.5f)
- {
- cout<<"输入错误!因为不满足n(n-1)/2的条件。/n";
- return;
- }
- cout<<"输入弧的信息(0表示忽略):/n";
- cin>>incInfo;
- for(i=0;i<vexnum;i++)
- {
- cout<<"请输入第"<<i+1<<"个顶点的内容:/n";
- cin>>vexs[i];
- }
- for(i=0;i<vexnum;i++)
- {
- for(j=0;j<vexnum;j++)
- {
- arcs[i][j].adj=0;
- arcs[i][j].info=NULL;
- }
- }
- for(k=0;k<arcnum;k++)
- {
- cout<<"请输入第"<<k+1<<"边连接的两个顶点。/n";
- cin>>v1>>v2>>w;
- arcs[v1-1][v2-1].adj=w;
- if(incInfo!=0)
- {
- cout<<"输入弧的信息,以字符串的形式存储。/n";
- cin>>arcs[v1-1][v2-1].info;
- }
- }
- }
- template<typenameCustomType>//创建无向图
- voidJMatrixGraph<CustomType>::CreateUDG(void)
- {
- inti,j,k;
- intv1,v2,incInfo;
- cout<<"输入顶点个数:/n";
- cin>>vexnum;
- cout<<"输入弧的个数:/n";
- cin>>arcnum;
- if(arcnum>vexnum*(vexnum-1)*0.5f)
- {
- cout<<"输入错误!因为不满足n(n-1)/2的条件。/n";
- return;
- }
- cout<<"输入弧的信息(0表示忽略):/n";
- cin>>incInfo;
- for(i=0;i<vexnum;i++)
- {
- cout<<"请输入第"<<i+1<<"个顶点的内容:/n";
- cin>>vexs[i];
- }
- for(i=0;i<vexnum;i++)
- {
- for(j=0;j<vexnum;j++)
- {
- arcs[i][j].adj=INFINITY;
- arcs[i][j].info=NULL;
- }
- }
- for(k=0;k<arcnum;k++)
- {
- cout<<"请输入第"<<k+1<<"边连接的两个顶点和权值。/n";
- cin>>v1>>v2;
- arcs[v1-1][v2-1].adj=1;
- if(incInfo!=0)
- {
- cout<<"输入弧的信息,以字符串的形式存储。/n";
- cin>>arcs[v1-1][v2-1].info;
- }
- arcs[v1-1][v2-1]=arcs[v2-1][v1-1];
- }
- }
- template<typenameCustomType>//创建无向网
- voidJMatrixGraph<CustomType>::CreateUDN(void)
- {
- inti,j,k;
- intv1,v2,incInfo;
- intw;
- cout<<"输入顶点个数:/n";
- cin>>vexnum;
- cout<<"输入弧的个数:/n";
- cin>>arcnum;
- if(arcnum>vexnum*(vexnum-1)*0.5f)
- {
- cout<<"输入错误!因为不满足n(n-1)/2的条件。/n";
- return;
- }
- cout<<"输入弧的信息(0表示忽略):/n";
- cin>>incInfo;
- for(i=0;i<vexnum;i++)
- {
- cout<<"请输入第"<<i+1<<"个顶点的内容:/n";
- cin>>vexs[i];
- }
- for(i=0;i<vexnum;i++)
- {
- for(j=0;j<vexnum;j++)
- {
- arcs[i][j].adj=INFINITY;
- arcs[i][j].info=NULL;
- }
- }
- for(k=0;k<arcnum;k++)
- {
- cout<<"请输入第"<<k+1<<"边连接的两个顶点和权值。/n";
- cin>>v1>>v2>>w;
- arcs[v1-1][v2-1].adj=w;
- if(incInfo!=0)
- {
- cout<<"输入弧的信息,以字符串的形式存储。/n";
- cin>>arcs[v1-1][v2-1].info;
- }
- arcs[v1-1][v2-1]=arcs[v2-1][v1-1];
- }
- }
- #endif
下面是我随便使用一个C++源文件来进行验证:
- /*----------------------------------------------------------------------------
- 蒋轶民制作:E-mail:jiangcaiyang123@163.com
- ------------------------------------------------------------------------------
- 文件名:MainFrame.h
- ------------------------------------------------------------------------------
- 作用:验证图结构是否创建成功。
- /*--------------------------------------------------------------------------*/
- //头文件
- #include<iostream>
- #include"JGraph.h"
- usingnamespacestd;
- //程序的入口
- intmain(intargc,char**argv)
- {
- JMatrixGraph<char>jmg;
- jmg.CreateGraph(UDN);
- return0;
- }
下一次我准备使用邻接表来实现图的结构,而且将会进行图的深度搜索和广度搜索,我还想着使用DirectX来描绘我的图结构呢。期待我的成果吧。