【数据结构】算法7.1-7.2 图的存储结构-数组表示法
2016-10-10 21:04
826 查看
#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); //采用数组(邻接矩阵)表示法,构造图G Status 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++){ 4000 (*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; }
相关文章推荐
- 6.33③ 假定用两个一维数组L[1..n]和R[1..n]作为 有n个结点的二叉树的存储结构, L[i]和R[i]分别指 示结点i的左孩子和右孩子,0表示空。试写一个算法 判别结点u是否为结点v的
- 树的存储结构 - 数据结构和算法41
- 二叉树的存储结构 - 数据结构和算法45
- 【数据结构与算法】基本数据结构——队列的链式表示
- 数据结构--数组和广义表--以行逻辑链接的顺序表为存储结构的矩阵的基本运算(求矩阵乘积)
- 树的存储结构 - 数据结构和算法41
- 09-数据结构_线性结构-离散存储-链表_插删伪算法
- 数据结构线性结构之连续存储---数组
- 【数据结构与算法】基本数据结构——线性表的链式表示
- 数据结构--数组和广义表--数组的顺序存储表示和实现
- 树的存储结构2 - 数据结构和算法42
- 二叉树-----数组存储结构及操作算法的实现------堆排序
- 图的存储结构(邻接矩阵)- 数据结构和算法56
- 数据结构--连续存储数组算法
- 数据结构:连续存储数组的算法
- 二叉树的存储结构 - 数据结构和算法45
- 图的存储结构(邻接表)- 数据结构和算法57
- 图的存储结构之数组表示法
- 图的存储结构(1):数组表示法
- 【数据结构】线性表的单链表存储结构表示和实现