图的数组(邻接矩阵)存储实现
来源:互联网 发布:华为商务软件 编辑:程序博客网 时间:2024/04/30 09:05
图的结构体定义:
typedef ElemType AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];//顶点之间关系图typedef struct{ TElemType vexs[MAX_VERTEX_NUM];//顶点元素存储 AdjMatrix arcs;//顶点之间关系图 int vexnum, arcnum;//顶点个数和边或弧的数目 GraphKind kind;//图的种类}MGraph;
判断应该实现哪种图/网的邻接矩阵:
Status CreateGraph(MGraph &G){ cout << "please input the kind of graph" << endl; cin >> (int&)G.kind; switch (G.kind) { case DG:return CreateDG(G, PrintG);//构造有向图 case DN:return CreateDN(G, PrintN);//构造有向网 case UDG:return CreateUDG(G, PrintG);//构造无向图 case UDN:return CreateUDN(G,PrintN);//构造无向网 default:return ERROR; }}
构造有向图并输出邻接矩阵:
Status CreateDG(MGraph &G, Status(*visit)(MGraph)){ TElemType v1, v2; cout << "读入定点数和边数目:" << endl; cin >> G.vexnum >> G.arcnum;//读入定点数和边数目 cout << "输入顶点元素:" << endl; 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;//邻接矩阵初始化 cout << "构造顶点之间关系:" << endl; for (int k = 0; k < G.arcnum; k++)//构造邻接矩阵 { cin >> v1 >> v2;//读入一条边依附的顶点和权值 int i = LocateVex(G, v1); int j = LocateVex(G, v2);//确定v1,v2在图中的位置 G.arcs[i][j] = 1;//边 <v1,v2>的权值 } visit(G); return OK;}
构造无向图并输出邻接矩阵:
Status CreateUDG(MGraph &G,Status (*visit)(MGraph)){ TElemType v1, v2; cout << "读入定点数和边数目:" << endl; cin >> G.vexnum >> G.arcnum;//读入定点数和边数目 cout << "输入顶点元素:" << endl; 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;//邻接矩阵初始化 cout << "构造顶点之间关系:" << endl; for (int k = 0; k < G.arcnum; k++)//构造邻接矩阵 { cin >> v1 >> v2;//读入一条边依附的顶点和权值 int i = LocateVex(G, v1); int j = LocateVex(G, v2);//确定v1,v2在图中的位置 G.arcs[i][j] = 1;//边 <v1,v2>的权值 G.arcs[j][i] = G.arcs[i][j];//置<v1,v2>的对称弧<v2,v1> } visit(G); return OK;}
构造有向网并输出邻接矩阵:
Status CreateDN(MGraph &G,Status (* visit)(MGraph)){ TElemType v1, v2; ElemType e; cout << "读入定点数和边数目:" << endl; cin >> G.vexnum >> G.arcnum;//读入定点数和边数目 cout << "输入顶点元素:" << endl; 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] = INFINITY;//邻接矩阵初始化 cout << "构造顶点之间关系:" << endl; for (int k = 0; k < G.arcnum; k++)//构造邻接矩阵 { cin >> v1 >> v2 >> e;//读入一条边依附的顶点和权值 int i = LocateVex(G, v1); int j = LocateVex(G, v2);//确定v1,v2在图中的位置 G.arcs[i][j] = e;//边 <v1,v2>的权值 } visit(G); return OK;}
构造无向网并输出邻接矩阵:
Status CreateUDN(MGraph &G, Status(*visit)(MGraph)){ TElemType v1, v2; ElemType e; cout << "读入定点数和边数目:" << endl; cin >> G.vexnum >> G.arcnum;//读入定点数和边数目 cout << "输入顶点元素:" << endl; 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] = INFINITY;//邻接矩阵初始化 cout << "构造顶点之间关系:" << endl; for (int k = 0; k < G.arcnum; k++)//构造邻接矩阵 { cin >> v1 >> v2 >>e;//读入一条边依附的顶点和权值 int i = LocateVex(G, v1); int j = LocateVex(G, v2);//确定v1,v2在图中的位置 G.arcs[i][j] = e;//边 <v1,v2>的权值 G.arcs[j][i] = G.arcs[i][j];//置<v1,v2>的对称弧<v2,v1> } visit(G); return OK;}
确定顶点关系输入元素时元素所对应的顶点序列号:
int LocateVex(MGraph G, TElemType e){ for (int i = 0; i < G.vexnum; i++) if (G.vexs[i] == e)//如果元素为该顶点元素,输出该结点序列号 return i;}
调用输出邻接矩阵函数:
Status PrintVexs(TElemType t)//返回顶点元素{ cout << t << " "; return OK;}Status PrintArcs(ElemType e)//返回邻接矩阵元素{ cout << e << " "; return OK;}Status PrintMGraph(MGraph G)//打印网的邻接矩阵{ for (int i = 0; i <= G.vexnum; i++) { for (int j = 0; j <= G.vexnum; j++) { if (i == 0 && j == 0)//左上角输出为空 cout << " "; else if (i == 0)//第一行输出顶点元素 PrintVexs(G.vexs[j - 1]); else if (j == 0)//第一列输出顶点元素 PrintVexs(G.vexs[i - 1]); else if (G.arcs[i - 1][j - 1] != (int)INFINITY)//如果不为INFINITY,输出邻接矩阵元素 PrintArcs(G.arcs[i - 1][j - 1]); else cout << INFINITY << " "; } cout << endl; } return OK;}Status PrintG(MGraph G)//打印图的邻接矩阵{ for (int i = 0; i <= G.vexnum; i++) { for (int j = 0; j <= G.vexnum; j++) { if (i == 0 && j == 0) cout << " "; else if (i == 0) PrintVexs(G.vexs[j - 1]); else if (j == 0) PrintVexs(G.vexs[i - 1]); else PrintArcs(G.arcs[i - 1][j - 1]); } cout << endl; } return OK;}
main.cpp:
int main(){ MGraph G; for (int i = 0; i < 4; i++) { menu(); CreateGraph(G); char ch; cout << "please enter a char to continue" << endl; cin >> ch; system("cls"); } system("pause"); return 0;}
调试结果:
阅读全文
0 0
- 图的数组(邻接矩阵)存储实现
- 图的数组(邻接矩阵)存储
- 图的邻接矩阵存储实现
- 数据结构之---C语言实现图的数组(邻接矩阵)存储表示
- 图的数组(邻接矩阵)存储结构和基本操作
- 图的数组(邻接矩阵)存储结构
- 图的邻接矩阵存储(C语言实现)
- 图的邻接矩阵存储 编程实现
- 数据结构:图的邻接矩阵存储实现
- 【数据结构】图的邻接矩阵存储实现
- 图的邻接矩阵存储---JAVA实现
- 图的邻接矩阵存储及其具体实现
- 图的存储表示--邻接矩阵法实现
- 图的存储-邻接矩阵
- 图的邻接矩阵存储
- 邻接矩阵存储的图
- 图的存储-邻接矩阵
- 图的邻接矩阵存储
- Eclipse常用设置
- 蓝桥杯 算法训练 Lift and Throw
- ElasticSearch里面复杂关系数据的存储方式
- memset函数
- 递归实现一些简单程序
- 图的数组(邻接矩阵)存储实现
- 08 用Django分页器实现文章分页
- 最大值(最基本splay区间修改,注意小细节)
- 118. Pascal's Triangle
- 一元线性回归方程最小二乘法矩阵处理
- 【Shiro权限管理】16.Shiro标签
- unity Timeline
- Eclipse创建Tomcat服务
- 【考研】第十四周总结