图的逻辑结构
1.邻接矩阵表示法
无向图的邻接矩阵
有向图的邻接矩阵
邻接矩阵的存储表示
邻接矩阵的存储表示:用两个数组分别表示存储顶点表和邻接矩阵
#define MVNum 100 //最大顶点数
typedef char VerTexType;//设顶点的数据类型为字符型
typedef int ArcType; //假设边的权值类型为整型
typedef struct{
VerTexType vexs[MVNum]; //顶点表
ArcType arcs[MVNum][MVnum]; //邻接矩阵
int vertexNum,arcNum; //顶点数和边数
}MGraph; //MGraph是以邻接矩阵存储的图类型
采用邻接矩阵表示法创建无向网
极大值可以设置如下:
#define Maxint 32767
无向网—>有向图
采用邻接矩阵表示法的优缺点
2.邻接表
邻接表表示法(链式)
firstarc:边表头指针
adjvex: 邻接点域,存放域Vi邻接的顶点在表头数组中的位置。
nextarc: 链域,指向下一条边或弧。
info: 权值或其他信息
无向图的邻接表
存储空间:O(n+2e)
有向图的邻接表
练习:已知某网的领接(出边)表,请画出该网络。
如下:
建立邻接表的算法
图的邻接表存储表示:
/***
顶点节点
***/
typedef struct VNode{
VertexType data; //顶点信息
ArcNode *firstarc; //边表头指针
}VNode,AdjList[MVNum];
#define MaxVerteNum 100 //最大顶点数为100
/***
边节点
***/
typedef struct ArcNode{
int adjvex; //该边所指向的顶点的位置
struct ArcNode *nextarc; //指向下一条边的指针
OtherInfo info; //和边相关的信息
}ArcNode;
/***
邻接表
***/
typedef struct{
AdjLint vertices; //领接表 vertices--vertex的复数
int vexnum,arcnum; //图的当前顶点数和弧数
}ALGraph;
采用领接表表示法创建无向网
【算法思想】
(1)输入总顶点数和总边数。
(2)建立顶点表
依次输入点的信息存入顶点表中
使每个表头节点的指针域初始化为NULL
(3)创建邻接表
依次输入两条边依附的两个顶点
确定两个顶点的序号i和j,建立边节点
将此边结点分别插入到Vi和Vj对应的两个边链表的头部
邻接表表示法优缺点及邻接矩阵的关系
邻接矩阵与邻接表表示法的关系
3.十字链表
firstin:第一条入度边
firstout:第一条出度边
tailvex:弧尾结点
headvex:弧头结点
hlink:弧头相同的下一条弧
tlink:弧尾相同的下一条弧
4.邻接多重表