1)数组表示法
//-----图的组(邻接矩阵)存储表示----- #define INFINITY INT_MAX //最大值∞ #define MAX_VERTEX_NUM 20 //最大的顶点个数 typedef enum {DG,DN,UDG,UDN}GraphKind; //{有向图(Digraph),有向网(DiNet),无向图(UniDigraph),无向网} typedef struct ArcCell{ VRType adj; //VRType是顶点关系类型。对无权图,用1或者0表示相邻与否;对带权图,则为权值类型。 InfoType *info; //该弧相关信息的指针 }ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; typedef struct{ VertexType vexs[MAX_VERTEX_NUM]; //顶点向量 AdjMatrix arcs; //邻接矩阵 int vexnum,arcnum; //图的当前顶点数与边数 GraphKind kind; //图的种类标志 }MGpraph
2)邻接表
//---------图的邻接表存储表示----------- #define MAX_VERTEX_NUM 20 typedef struct ArcNode{ int adjvex; //该弧指向的顶点的位置 struct ArcNode *nextarc; //指向下一条弧的指针 InfoType *info; //该弧相关信息的指针 }ArcNode; typedef struct VNode{ VertexType data; //顶点信息 ArcNode *firstarc; //指向的一条依附该顶点的弧的指针 }VNode,AdjList[MAX_VERTEX_NUM]; typedef struct{ AdjList vertices; int vexnum,arcnum; //图的当前顶点数和弧数 int kind; //图的种类 }
3)十字链表法
十字路口有方向,十字链表法是专门针对有向图设计的,旨在解决有向图用邻接表法找不到入度的这个问题。顶点结点包含三个域,数据域,firstin和firstout域分别指向第一个入度边,第一个出度边;边结点有五个域,尾域头域分别表示该弧的弧尾和弧头,链域tlink指向弧尾相同的下一条弧,hlink指向弧头相同的下一条弧,这样弧头相同的弧就在一个链表上,弧尾相同的弧也在一个链表上,info域指向该弧的相关信息。