图的逻辑结构是多对多,所以图没有顺序存储结构,但可以借助二维数组来表示元素间的关系,这就是数组表示法(邻接矩阵)
链式存储结构:可以用多重链表(邻接表,邻接多重表,十字链表)来表示
重点:邻接矩阵(数组)表示法 和 邻接表(链式)表示法
一:数组(邻接矩阵)表示法
1,先建立一个顶点表(记录各个顶点的信息)和一个邻接矩阵(表示各个顶点之间的关系).
顶点表是一个一维数组Vexs[n]
无向图邻接矩阵是一个二维数组arcs[n][n],如果两个顶点间有边相连,那么arcs[n][n] = 1,否则arcs[n][n] = 0(n为两个顶点的下标)n取决于顶点个数
有向图邻接矩阵是一个二维数组arcs[i][j],如果存在着由i顶点发出的,到j顶点弧,那么arcs[i][j] = 1,别的位置都为0
无向图的邻接矩阵特点:
1,无向图的邻接矩阵是对称的;
2,顶点i的度 = 第i行(列)中1的个数;
3,全完图的邻接矩阵中,对角元素为0,其余都是1;
在有向图的邻接矩阵中
第i行含义:以结点vi为尾的弧(即出度边)
第j列含义:以结点vj为头的弧(即入度边)
有向图的邻接矩阵特点:
1,有向图的邻接矩阵可能是不对称的.
2,顶点的出度 = 第i行元素之和;顶点的入度 = 第j列元素之和.
3,顶点的度 = 第i行的元素之和 + 第j列的元素之和
网(即有权图)的邻接矩阵表示法
无向网的邻接矩阵,就是把无向图的邻接矩阵中的1,变成权值,0变成无穷大
有向网的邻接矩阵,就是把有向图的邻接矩阵中的1,变成权值,0变成无穷大
二,邻接矩阵代码实现
邻接矩阵的存储表示:用两个数组分别存储顶点表和邻接矩阵
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100 //最大顶点数
typedef struct{
char vexs[MAXSIZE];//这里的数据类型根据实际情况而定
int arcs[MAXSIZE][MAXSIZE];//这里的数据类型根据实际情况而定
int vexnum, arcnum;//图的当前顶点数和边数
}G;
int main()
{
printf("Hello world!\n");
return 0;
}
采用邻接矩阵表示法创建无向网
算法思想:1,输入总顶点数和总边数
2,依次输入顶点的信息存入顶点表中.
3,初始化邻接矩阵,使每个权值初始化为极大值.
4,构造邻接矩阵.
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100 //最大顶点数
#define MAX_INT 32767//设置最大值
typedef struct{
char vexs[MAXSIZE];//这里的数据类型根据实际情况而定
int arcs[MAXSIZE][MAXSIZE];//这里的数据类型根据实际情况而定
int vexnum, arcnum;//图的当前顶点数和边数
}Graph;
int get_index(char* arr,char m)
{
int i = 0;
for(i = 0; i < MAXSIZE; i++)
{
if(arr[i] == m)return i;
}
return -1;
}
void CreatGraph(Graph* G)
{
int i,j = 0;
printf("请输入顶点和边的数量:>");
scanf("%d%d",&G->vexnum,&G->arcnum);//把输入的值保存到图结构体中
for(i = 0; i < G->vexnum; i++)//初始化邻接矩阵
{
for(j = 0; j < G->vexnum; j++)
{
G->arcs[i][j] = MAX_INT;//边的权值设置为极大值
}