数据结构之图用邻接矩阵实现赋值有向图

来源:互联网 发布:网络优化 谢金星 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;}


原创粉丝点击