您的位置:首页 > 理论基础 > 数据结构算法

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

2013-11-11 23:13 344 查看
从图的结构和概念上看,可将图分为赋权有向图,赋权无向图,有向图和无向图四种不同类型。其中,赋值有向图具有比较一般的特征。用邻接矩阵表示法中,用一个二维数组来存储图中各边的信息。

用邻接矩阵表示一个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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: