我们前面所说的树,它的关系是一对多,至于图,各个节点之间的关系就更为复杂,变为多对多了。
我们要存储一个图,一般分一下几个部分:
图的类型:有向图、有向网、无向图、无向网。其中有向与无向的概念大家都好理解,至于网与图的区别就是图中弧是否对权值进行操作。
我们在处理问题时,大多都是对网操作。
节点个数
弧的条数
我们可以用邻接矩阵来表示节点之间的关系,其中可以存储两节点之间的权值,也可以只表示两节点有关系。这些可以设置其中的值来区别。
一个图的存储大致就是如上,我们来用代码表示这些。
这些是存储结构:
#define MAX_VERTEX_NUM 10 //节点最大值
typedef int VertexType;
typedef int VRType;
typedef enum{DG=1,DN,UDG,UDN} GraphKind; //图的类型:有向图、有向网、无~~
typedef struct { //图的架构
VertexType vexs[MAX_VERTEX_NUM]; //顶点向量
VRType arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; //邻接矩阵
int vexnum,arcnum; //节点和弧的个数
GraphKind kind; //图的类型
}MGraph;
这些是图存储操作:
/*********************************************/
/* CreateGraph始 */
/* 参数:图G */
/* 功能:赋值G.kind */
/*********************************************/
void CreateGraph(MGraph &G)
{
int ch;
printf("\t\t欢 迎 进 行 建 图 操 作\n");
printf("\t\t 1.有 向 图\n");
printf("\t\t 2.有 向 网\n");
printf("\t\t 3.无 向 图\n");
printf("\t\t 4.无 向 网\n");
printf("\t\t 5.退出\n");
ch = 0;
printf("请输入您的选择:\t");
while(0 == ch)
{
scanf("%d",&ch);
if(ch<=UDN&&ch>=DG)
G.kind = (GraphKind)ch;
else if(EXIT != ch)
ch = 0;
switch(ch){
case DG: CreateDG(G); break; //构造有向图
case DN: CreateDN(G); break; //构造有向网
case UDG: CreateUDG(G); break; //构造无向图
case UDN: CreateUDN(G); break; //构造无向网
case EXIT: printf("退出成功!\n");break;
default: printf("输入错误!请重输入:\t");
}
}
/*********************************************/
/* LocateVex */
/* 参数:G,vex */
/* 功能查找顶点位置 */
/*********************************************/
int LocateVex(const MGraph *g,const VertexType vex)
{
int i;
for(i=0;i<g->vexnum;i++)
if(g->vexs[i] == vex) return i;
}
图的存储
最新推荐文章于 2022-06-07 11:00:27 发布