一、实验目的
假设带权有向图采用邻接矩阵存储。用图的基本运算算法,包括创建图的邻接矩阵,输出图的邻接矩阵,销毁图的邻接矩阵,求图中顶点的度。并用如图图片所示的图进行测试
二、实验内容
本实验旨在通过设计并实现一个带权有向图的基本运算算法,来加深对图数据结构及其基本操作的理解。实验内容包括创建图的邻接矩阵、输出图的邻接矩阵、销毁图的邻接矩阵以及求图中顶点的度
三、实现过程
实现思路:
定义图的数据结构,包括顶点数、边数、顶点数组和边的邻接矩阵。
实现创建图的函数,根据输入的顶点数、边数和边的权重矩阵初始化图的结构。
实现输出图的函数,遍历邻接矩阵并打印出来。
实现销毁图的函数,释放图所占用的内存空间。
实现求顶点度的函数,分别计算顶点的入度和出度。
在主函数中调用上述函数,展示图的基本运算功能。
实现代码:
#include <stdio.h>
#include <malloc.h>
#define MAXVEX 100
#define INF 32767
typedef char VertexType[10];
typedef struct vertex
{ int adjvex;
VertexType data;
} VType;
typedef struct graph
{ int n,e;
VType vexs[MAXVEX];
int edges[MAXVEX][MAXVEX];
} MatGraph;
void CreateGraph(MatGraph &g,int A[][MAXVEX],int n,int e)
{
int i,j;
g.n=n; g.e=e;
for (i=0;i<n;i++)
for (j=0;j<n;j++)
g.edges[i][j]=A[i][j];
}
void DestroyGraph(MatGraph g)
{
}
void DispGraph(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 AddaVex(MatGraph &g)
{
g.n++;
}
int InsertEdge1(MatGraph &g,int u,int v,int w)
{
if (u<0 || u>=g.n || v<0 || v>=g.n)
return 0;
g.edges[u][v]=w;
g.edges[v][u]=w;
g.e++;
return 1;
}
int InsertEdge2(MatGraph &g,int u,int v,int w)
{
if (u<0 || u>=g.n || v<0 || v>=g.n)
return 0;
g.edges[u][v]=w;
g.e++;
return 1;
}
int Degree1(MatGraph g,int v)
{
int i,d=0;
if (v<0 || v>=g.n)
return -1;
for (i=0;i<g.n;i++)
if (g.edges[v][i]>0 && g.edges[v][i]<INF)
d++;
return d;
}
int Degree2(MatGraph g,int v)
{
int i,d1=0,d2=0,d;
if (v<0 || v>=g.n)
return -1;
for (i=0;i<g.n;i++)
if (g.edges[v][i]>0 && g.edges[v][i]<INF)
d1++;
for (i=0;i<g.n;i++)
if (g.edges[i][v]>0 && g.edges[i][v]<INF)
d2++;
d=d1+d2;
return d;
}
int main(){
MatGraph g;
int n=7,e=12,i;
int A[MAXVEX][MAXVEX]={
{0,2,5,3,INF,INF,INF},
{INF,0,2,INF,INF,8,INF},
{INF,INF,0,1,3,5,INF},
{INF,INF,INF,0,5,INF,INF},
{INF,INF,INF,INF,0,3,9},
{INF,INF,INF,INF,INF,0,5},
{INF,INF,INF,INF,INF,INF,0}};
CreateGraph(g,A,n,e);
printf("图G的存储结构:\n");DispGraph(g);
printf("图G中所有顶点的度:\n");
printf("顶点\t度\n");
for(i=0; i<g.n; i++)
printf("%d\t%d\n",i,Degree2(g,i));
DestroyGraph(g);
}
实验结果(运)行图: