版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_17497931/article/details/84562501
C语言实现图的邻接矩阵和邻接表存储,其中包含如下函数:
- CreateMat(MatGraph &g, int A[MAXV][MAXV], int n, int e):由边数组A、顶点数n和边数e创建图的邻接矩阵g。
- DispMat(MatGraph g):输出邻接矩阵g。
- CreateAdj(AdjGraph *& G, int A[MAXV][MAXV], int n, int e):由边数组A、顶点数n和边数e创建图的邻接表G。
- DispAdj(AdjGraph *G):输出邻接表G。
- 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);
}