C语言实现图的邻接矩阵和邻接表存储

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_17497931/article/details/84562501

C语言实现图的邻接矩阵和邻接表存储,其中包含如下函数:

  1. CreateMat(MatGraph &g, int A[MAXV][MAXV], int n, int e):由边数组A、顶点数n和边数e创建图的邻接矩阵g。
  2. DispMat(MatGraph g):输出邻接矩阵g。
  3. CreateAdj(AdjGraph *& G, int A[MAXV][MAXV], int n, int e):由边数组A、顶点数n和边数e创建图的邻接表G。
  4. DispAdj(AdjGraph *G):输出邻接表G。
  5. DestroyAdj(AdjGraph *&G):销毁图的邻接表G。

对应代码如下:

#include "stdio.h"
#include "malloc.h"
#define INF	32767
#define MAXV	100

typedef char InfoType;

typedef struct {
	int		no;
	InfoType	info;
} VertexType;

typedef struct {
	int		edges[MAXV][MAXV];
	int		n, e;
	VertexType	vexs[MAXV];
} MatGraph;

typedef struct ANode {
	int		adjvex;
	struct ANode	* nextarc;
	int		weight;
} ArcNode;

typedef struct Vnode {
	InfoType	info;
	int		count;
	ArcNode		* firstarc;
} VNode;

typedef struct {
	VNode	adjlist[MAXV];
	int	n, e;
} AdjGraph;

/*
 * -----------------------邻接矩阵的基本运算算法------------------------
 * 创建图的邻接矩阵
 */
void CreateMat( MatGraph &g, int A[MAXV][MAXV], int n, int e )
{
	int i, j;
	g.n	= n;
	g.e	= e;
	for ( i = 0; i < g.n; i++ )
		for ( j = 0; j < g.n; j++ )
			g.edges[i][j] = A[i][j];
}


/* 输出邻接矩阵g */
void DispMat( MatGraph g )
{
	int i, j;
	for ( i = 0; i < g.n; i++ )
	{
		for ( j = 0; j < g.n; j++ )
			if ( g.edges[i][j] != INF )
				printf( "%4d", g.edges[i][j] );
			else
				printf( "%4s", "∞" );
		printf( "\n" );
	}
}


/*
 * -----------------------邻接表的基本运算算法------------------------
 * 创建图的邻接表
 */
void CreateAdj( AdjGraph * & G, int A[MAXV][MAXV], int n, int e )
{
	int	i, j;
	ArcNode *p;
	G = (AdjGraph *) malloc( sizeof(AdjGraph) );
	for ( i = 0; i < n; i++ )
		G->adjlist[i].firstarc = NULL;
	for ( i = 0; i < n; i++ )
		for ( j = n - 1; j >= 0; j-- )
			if ( A[i][j] != 0 && A[i][j] != INF )
			{
				p			= (ArcNode *) malloc( sizeof(ArcNode) );
				p->adjvex		= j;
				p->weight		= A[i][j];
				p->nextarc		= G->adjlist[i].firstarc;
				G->adjlist[i].firstarc	= p;
			}
	G->n	= n;
	G->e	= e;
}


/* 输出临界表G */
void DispAdj( AdjGraph *G )
{
	ArcNode *p;
	for ( int i = 0; i < G->n; i++ )
	{
		p = G->adjlist[i].firstarc;
		printf( "%3d:", i );
		while ( p != NULL )
		{
			printf( "%3d[%d]→", p->adjvex, p->weight );
			p = p->nextarc;
		}
		printf( "∧\n" );
	}
}


/* 销毁图的邻接表 */
void DestroyAdj( AdjGraph * &G )
{
	ArcNode *pre, *p;
	for ( int i = 0; i < G->n; i++ )
	{
		pre = G->adjlist[i].firstarc;
		if ( pre != NULL )
		{
			p = pre->nextarc;
			while ( p != NULL )
			{
				free( pre );
				pre	= p;
				p	= p->nextarc;
			}
			free( pre );
		}
	}
	free( G );
}


/* --------------main----------------------------- */
int main()
{
	MatGraph	g;
	AdjGraph	*G;
	int		A[MAXV][MAXV] = {
		{ 0,   5,   INF, 7,   INF, INF }, { INF, 0,   4,   INF, INF, INF },
		{ 8,   INF, 0,	 INF, INF, 9   }, { INF, INF, 5,   0,	INF, 6	 },
		{ INF, INF, INF, 5,   0,   INF }, { 3,	 INF, INF, INF, 1,   0	 }
	};
	int		n = 6, e = 10;
	CreateMat( g, A, n, e );
	printf( "(1)图G的邻接表:\n" );
	DispMat( g );
	CreateAdj( G, A, n, e );
	printf( "(2)图G的邻接表:\n" );
	DispAdj( G );
	printf( "(3)销毁图G的邻接表\n" );
	DestroyAdj( G );
	return(1);
}

猜你喜欢

转载自blog.csdn.net/qq_17497931/article/details/84562501
今日推荐