数据结构之图用邻接矩阵实现赋值有向图
来源:互联网 发布:网络优化 谢金星 pdf 编辑:程序博客网 时间:2024/05/17 01:58
从图的结构和概念上看,可将图分为赋权有向图,赋权无向图,有向图和无向图四种不同类型。其中,赋值有向图具有比较一般的特征。用邻接矩阵表示法中,用一个二维数组来存储图中各边的信息。
用邻接矩阵表示一个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; //不存在则返回0return 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;}
- 数据结构之图用邻接矩阵实现赋值有向图
- 数据结构之用邻接矩阵实现赋值无向图,有向图,无向图
- 有向图邻接矩阵实现
- 邻接矩阵有向图
- 邻接矩阵--有向图
- 邻接矩阵实现的有向图
- 邻接矩阵有向图 之 Java详解
- 算法与数据结构基础9:C++实现有向图——邻接矩阵存储
- 邻接矩阵(有向图,无向图实现的差异)
- C++邻接矩阵实现有向图、无向图
- 邻接矩阵存储有向图
- 邻接矩阵存储有向图
- 邻接矩阵、构造有向图
- 有向图的邻接矩阵
- 有向图和无向图用邻接矩阵储存及代码实现
- 有向图和无向图用邻接矩阵储存
- 数据结构之有向网邻接矩阵Dijkstra实现源点至其余各顶点最短路径
- 数据结构之图-邻接矩阵
- [OpenGL ES 07]光照原理
- Virtual Box下配置Host-Only联网方式详解
- Tabhost的简单使用
- [OpenGL ES 08]Per-Pixel Light及卡通效果
- C语言 - 移动的小方块
- 数据结构之图用邻接矩阵实现赋值有向图
- 程序中如何打印日志?(三) VC++6.0和BCB6.0都不支持变长参数的宏
- Linux 内核堆栈打印函数
- 正则表达式实例学习-TCL2
- dota改高清分辨率mark
- Ubuntu 12.04增加右键命令:在终端中打开
- ffdshow 源代码分析 6: 对解码器的dll的封装(libavcodec)
- python中的参数传递顺序
- 链-反链-Dilworth定理 (转载)