数据结构之图用邻接矩阵实现赋值有向图
2013-11-11 23:13
344 查看
从图的结构和概念上看,可将图分为赋权有向图,赋权无向图,有向图和无向图四种不同类型。其中,赋值有向图具有比较一般的特征。用邻接矩阵表示法中,用一个二维数组来存储图中各边的信息。
用邻接矩阵表示一个n个顶点的有向图时,所需空间为n*n。输入邻接矩阵和查询一遍口需要n*n的时间。当图的边数远小于n*n时,该方法就会很浪费时间和空间,而用邻接表来表示图会更有效。
用邻接矩阵表示一个n个顶点的有向图时,所需空间为n*n。输入邻接矩阵和查询一遍口需要n*n的时间。当图的边数远小于n*n时,该方法就会很浪费时间和空间,而用邻接表来表示图会更有效。
#include<stdio.h> #include<malloc.h> #include<stdlib.h> //int noEdge=0; //数据结构 typedef struct graph *Graph; typedef struct graph { int NoEdge; //无边标记 int n; //顶点数 int e; //边数 int **a; //邻接矩阵 }AWDgraph; void Error(char *str) //打印错误信息并退出 { printf("%s",str); exit(0); } Graph GraphInit(int n,int noEdge) { Graph G=(Graph)malloc(sizeof(AWDgraph)); G->n=n; G->e=0; G->NoEdge=noEdge;//各顶点对间均无边 G->a=(int **)malloc(sizeof(int *)*(n+1)); //构建邻接矩阵 for(int i=0;i<=n;i++) //动态分配二维数组 G->a[i]=(int *)malloc(sizeof(int)*(n+1)); for( i=1;i<=n;i++) for(int j=1;j<=n;j++) G->a[i][j]=G->NoEdge; return G; } int GraphEdges(Graph G) //返回赋权有向图G的边数 { return G->e ; } int GraphVertices(Graph G) //返回赋权有向图G的顶点数 { return G->n ; } int GraphExits(int i,int j,Graph G) //判断当前赋权有向图G中的边(i,j)是否存在 { if(i<1||j<1||j>G->n||G->a[i][j]==G->NoEdge) return 0; //不存在则返回0 return 1;//否则返回1 } void GraphAdd(int i,int j,int w,Graph G)//在赋值有向图G中加入边权为w的边(i,j); { if(i<1||j<1||i>G->n||j>G->n||i==j||G->a[i][j]!=G->NoEdge) //G->a[i][j]!=G->NoEdge已存在边,不需再次输入 Error("Bad input"); G->a[i][j]=w; G->e++; } void GraphDelete(int i,int j,Graph G)//删除赋权有向图G中的边(i,j); { if(i<1||j<1||i>G->n ||i>G->n ||G->a[i][j]==G->NoEdge) Error("Bad input"); G->a[i][j]=G->NoEdge; G->e--; } int OutDegree(int i,Graph G) //返回赋值有向图G中顶点i的初度 { int j,sum=0; if(i<1||i>G->n)Error("Bad input"); for(j=1;j<=G->n;j++) if(G->a[i][j]!=G->NoEdge) sum++; return sum; } int InDegree(int i,Graph G) //返回赋权有向图G中的顶点i的入度 { int j,sum=0; if(i<1||i>G->n )Error("Bad input"); for(j=1;j<=G->n;j++) if(G->a[j][i]!=G->NoEdge) sum++; return sum; } void GraphPrint(Graph G) //输出赋权有向图G中的邻接矩阵 { int i,j; for(i=1;i<=G->n;i++) { for(j=1;j<=G->n;j++) printf("%d ",G->a[i][j]); printf("\n"); } } void Delete(Graph G) //内存释放 { int m=G->n; //二维数组内存释放 for(int i=0;i<m;i++) free(G->a[i]); free(G->a); } int main() { int noEdge=0; Graph G; G=GraphInit(10,0); GraphAdd(1,3,10,G); GraphAdd(2,4,6,G); GraphAdd(3,4,5,G); GraphAdd(1,5,12,G); GraphAdd(5,2,321,G); GraphPrint(G); return 0; }
相关文章推荐
- 数据结构之用邻接矩阵实现赋值无向图,有向图,无向图
- 数据结构(C实现)------- 图的邻接矩阵表示
- 数据结构:图的邻接矩阵存储实现
- 数据结构之---C语言实现图的数组(邻接矩阵)存储表示
- 数据结构基础 之 图 的 邻接矩阵实现与邻接表实现
- 数据结构,图的邻接矩阵创建,邻接矩阵与邻接表的交换,两种表的输出,过程用C++实现
- 数据结构——只用赋值、自增和循环操作实现减法运算
- [数据结构]图邻接矩阵C语言简单实现
- [数据结构]图基于邻接矩阵的BFS与DFS的C语言简单实现
- 数据结构——图的数组实现(邻接矩阵表示法)
- 数据结构(C实现)------- 图的邻接矩阵表示
- 38. 数据结构笔记之三十八图的邻接矩阵存储实现
- Java实现 数据结构之邻接矩阵
- 数据结构基础 之 图 的 邻接矩阵实现与邻接表实现
- 数据结构-图-as3实现-有向图 图存储(邻接矩阵),广度深度遍历
- 【数据结构】图的邻接矩阵存储实现
- 数据结构:图的实现--邻接矩阵
- 数据结构教程 第八课 线性表的链式表示与实现
- 数据结构基础(9) --单链表的设计与实现(2)之高级操作
- 常用查找数据结构及算法(Python实现)