数据结构14天重点学习
前言
图是数据结构中数据关系最复杂的一种结构
提示:以下是本篇文章正文内容,下面案例可供参考
一、图的储存结构
1图的两种储存结构
图的储存结构主要有两种,一种是邻接表表示法,另一种是邻接矩阵表示法。
邻接矩阵
优点
容易获得每个顶点的度,特别是对于有向图,获得顶点i的出度,只需遍历第i行,即arc[i][]的值,入度也只需遍历第i列,即arc[][i]。
缺点:
对于边数相对顶点较少的图,浪费了极大的储存空间。
邻接表
优点
便于增加和删除顶点
便于统计边的数目,按顶点表顺序扫描所有边表可得到边的数目,时间复杂度为O(n)
空间利于效率高避免了储存空间的浪费
缺点
对于有向图,出度和入度是不兼得的,要两样都获得就只能分别建立、遍历对应的邻接表和逆邻接表空间利用率和效率也不高。
2储存结构代码表示及建立
1)邻接矩阵
通过一个一维数组表示顶点,通过一个二维数组表示顶点间的关系
`邻接矩阵
代码如下
#define VertexNum 20
#define MaxWeight 99
typedef char Vertextype;
typedef int EdgeType;
typedef struct{
Vertextype vex[VertexNum];//储存顶点信息
EdgeType edges[VertexNum][VertexNum];//储存边的信息
int n,e;
}MGraph;
void CreateMGraph(MGraph *G)
{
int i,j,k;//定义i,j用于之后遍历输入使用,k用于输入权值信息
EdgeType w;//
printf("读入顶点数和边数:\n");
scanf("%d %d",&G->n,&G->e);
// getchar();
fflush(stdin);//防止键盘输入影响后面
printf("读入顶点信息,建立顶点表:");
for(i=0;i<G->n;i++){
printf("第%d个顶点",i+1);
scanf("%c",&G->vexs[i]);
getchar();}
printf("输入边表信息,建立边表\n");
for(i=0;i<G->n;i++){
for(j=0;j<G->n;j++){
G->edges[i][j]=MaxWeight;}}//初始化各边的权值
for(k=0;k<G->e;k++)//赋权值
{
printf("输入矩阵信息,i,j,w:");
scanf("%d %d %d",&i,&j,&w)