【数据结构】算法7.1-7.2 图的存储结构-数组表示法
来源:互联网 发布:淘宝最高级别会员 编辑:程序博客网 时间:2024/04/25 20:01
#include<stdio.h>#include<string.h>#include<stdlib.h>#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1#define OVERFLOW -2#define INFINITY 65535 //最大值∞#define MAX_VERTEX_NUM 20 //最大顶点个数typedef int Status;typedef int VRType;typedef char InfoType;typedef int VertexType;typedef enum {DG,DN,UDG,UDN}GraphKind; //{有向图,有向网,无向图,无向网}typedef struct ArcCell{ VRType adj; //VRType 是顶点关系类型。对无权图,用0或1表示相邻否;对带权图,则为权值类型 InfoType *info; //该弧相关信息的指针}ArcCell, AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];typedef struct{ VertexType vexs[MAX_VERTEX_NUM]; //顶点向量 AdjMatrix arcs; //邻接矩阵 int vexnum,arcnum; //图的当前顶点数和弧数 GraphKind kind; //图的种类标志}MGraph;/*******************************声明部分****************************************/Status CreateGraph (MGraph *G);//采用数组(邻接矩阵)表示法,构造图GStatus CreateDG(MGraph *G); //构造有向图Status CreateDN(MGraph *G);//构造有向网Status CreateUDG(MGraph *G);//构造无向图Status CreateUDN(MGraph *G);//构造无向网int LocateVex(MGraph G,VertexType v);//确定v在G中的位置Status PrintfArcs(MGraph G);//输出图G的邻接矩阵/*******************************函数部分****************************************/Status CreateGraph (MGraph *G){ printf("请输入图的类型:\n"); printf("0:有向图 1:有向网 2:无向图 3:无向网\n"); scanf("%d",&(*G).kind); switch((*G).kind) { case DG: return CreateDG(G); //构造有向图 case DN: return CreateDN(G); //构造有向网 case UDG: return CreateUDG(G); //构造无向图 case UDN: return CreateUDN(G); //构造无向网 default : return ERROR; }}Status CreateDG(MGraph *G){ printf("\n构造有向图\n"); int i,j,k; //i,j,k用于计数 VertexType v1,v2; //弧头,弧尾 printf("请输入顶点个数:"); scanf("%d",&(*G).vexnum); printf("请输入弧个数:"); scanf("%d",&(*G).arcnum); //假定该图不含其他信息 int IncInfo = 0; for(i = 0;i<(*G).vexnum;i++){ //构造顶点向量 printf("请输入G.vexs[%d] = ",i); scanf("%d",&(*G).vexs[i]); } //for for(i = 0;i<(*G).vexnum;i++) //初始化邻接矩阵 for(j = 0;j<(*G).vexnum;j++){ (*G).arcs[i][j].adj = 0; //无向图 (*G).arcs[i][j].info = NULL; } for(k = 0;k<(*G).arcnum;k++){ //构造邻接矩阵 printf("请输入弧头(初始点):"); //输入一条弧的始点和终点 scanf("%d",&v1); printf("请输入弧尾(终端点):"); scanf("%d",&v2); i = LocateVex(*G,v1); j = LocateVex(*G,v2); if(i>=0 && j>=0) (*G).arcs[i][j].adj = 1; } return OK;}Status CreateDN(MGraph *G){ printf("\n构造有向网\n"); int i,j,k; //i,j,k用于计数 int w; //权重 VertexType v1,v2; //弧头,弧尾 printf("请输入顶点个数:"); scanf("%d",&(*G).vexnum); printf("请输入弧个数:"); scanf("%d",&(*G).arcnum); //假定该图不含其他信息 int IncInfo = 0; for(i = 0;i<(*G).vexnum;i++){ //构造顶点向量 printf("请输入G.vexs[%d] = ",i); scanf("%d",&(*G).vexs[i]); } //for for(i = 0;i<(*G).vexnum;i++) //初始化邻接矩阵 for(j = 0;j<(*G).vexnum;j++){ (*G).arcs[i][j].adj = INFINITY; //无向网 (*G).arcs[i][j].info = NULL; } for(k = 0;k<(*G).arcnum;k++){ //构造邻接矩阵 printf("请输入弧头(初始点):"); //输入一条弧的始点和终点 scanf("%d",&v1); printf("请输入弧尾(终端点):"); scanf("%d",&v2); printf("请输入权重:"); scanf("%d",&w); i = LocateVex(*G,v1); j = LocateVex(*G,v2); if(i>=0 && j>=0) (*G).arcs[i][j].adj = w; //置<v1,v2>的对称弧<v2,v1> //不再输入该弧含有的相关信息 } return OK;}Status CreateUDG(MGraph *G){ printf("\n构造无向图\n"); int i,j,k; //i,j,k用于计数 VertexType v1,v2; //弧头,弧尾 printf("请输入顶点个数:"); scanf("%d",&(*G).vexnum); printf("请输入弧个数:"); scanf("%d",&(*G).arcnum); //假定该图不含其他信息 int IncInfo = 0; for(i = 0;i<(*G).vexnum;i++){ //构造顶点向量 printf("请输入G.vexs[%d] = ",i); scanf("%d",&(*G).vexs[i]); } //for for(i = 0;i<(*G).vexnum;i++) //初始化邻接矩阵 for(j = 0;j<(*G).vexnum;j++){ (*G).arcs[i][j].adj = 0; //无向图 (*G).arcs[i][j].info = NULL; } for(k = 0;k<(*G).arcnum;k++){ //构造邻接矩阵 printf("请输入弧头(初始点):"); //输入一条弧的始点和终点 scanf("%d",&v1); printf("请输入弧尾(终端点):"); scanf("%d",&v2); i = LocateVex(*G,v1); j = LocateVex(*G,v2); if(i>=0 && j>=0) (*G).arcs[i][j].adj = (*G).arcs[j][i].adj = 1; //置<v1,v2>的对称弧<v2,v1> } return OK;}Status CreateUDN(MGraph *G){ printf("\n3构造无向网\n"); int i,j,k; //i,j,k用于计数 int w; //权重 VertexType v1,v2; //弧头,弧尾 printf("请输入顶点个数:"); scanf("%d",&(*G).vexnum); printf("请输入弧个数:"); scanf("%d",&(*G).arcnum); //假定该图不含其他信息 int IncInfo = 0; for(i = 0;i<(*G).vexnum;i++){ //构造顶点向量 printf("请输入G.vexs[%d] = ",i); scanf("%d",&(*G).vexs[i]); } //for for(i = 0;i<(*G).vexnum;i++) //初始化邻接矩阵 for(j = 0;j<(*G).vexnum;j++){ (*G).arcs[i][j].adj = INFINITY; //无向网 (*G).arcs[i][j].info = NULL; } for(k = 0;k<(*G).arcnum;k++){ //构造邻接矩阵 printf("请输入弧头(初始点):"); //输入一条弧的始点和终点 scanf("%d",&v1); printf("请输入弧尾(终端点):"); scanf("%d",&v2); printf("请输入权重:"); scanf("%d",&w); i = LocateVex(*G,v1); j = LocateVex(*G,v2); if(i>=0 && j>=0) (*G).arcs[i][j].adj = (*G).arcs[j][i].adj = w; //置<v1,v2>的对称弧<v2,v1> //不再输入该弧含有的相关信息 } return OK;}int LocateVex(MGraph G,VertexType v){ int ct; for(ct = 0;ct < G.vexnum;ct++) if(G.vexs[ct] == v) return ct; return -1;}Status PrintfArcs(MGraph G){ int n = G.vexnum; int i,j; //i,j用于计数 for(i = 0;i < n;i++){ for(j = 0;j<n;j++){ printf("%d ",G.arcs[i][j]); } printf("\n"); } return OK;}/*******************************主函数部分**************************************/int main(){ MGraph G; CreateGraph(&G); PrintfArcs(G); return 0;}
0 0
- 【数据结构】算法7.1-7.2 图的存储结构-数组表示法
- 图的存储结构之数组表示法
- 图的存储结构(1):数组表示法
- 《数据结构与算法》学习笔记4 存储对象的数组和大O表示法
- 数据结构——树的存储结构孩子表示法
- C语言数据结构——数组顺序存储结构的实现和表示
- 数据结构之图的数组表示法
- 图的数组表示法-数据结构(18)
- 图算法-----图的邻接矩阵表示法(数组表示法)
- 【数据结构】线性表的单链表存储结构表示和实现
- 数据结构8:队列的顺序存储结构表示和实现
- 数据结构 树的表示,存储结构与遍历
- 图(网)的存储结构(数组存储表示即邻接矩阵、邻接表)
- 数组的顺序存储表示和实现-数据结构
- 多维数组的存储表示与实现--自己写数据结构
- 数据结构与算法5:图的存储结构
- 【数据结构】算法7.3 图的存储结构-十字链表
- 数据结构 - 图的存储结构表示及其遍历 (DFS && BFS)
- gdb调试学习小记
- 1001. 害死人不偿命的(3n+1)猜想 (15)
- 【URAL 1244】Gentlemen(DP+记录路径)
- maven项目的一些姿势
- 仿腾讯盒子游戏(新手练习)
- 【数据结构】算法7.1-7.2 图的存储结构-数组表示法
- AndroidStudio使用进阶三: 重新认识AndroidStudio&Gradle
- 南阳oj 45 棋盘覆盖
- STEP 7 V5.5 版本特性
- c++函数模板
- 实现线程读写锁的四种方法
- H.264的Slice及Slice类型
- 循环队列的顺序表示和实现
- java编程思想(十)总结