图是一种比线性表和树更为复杂的数据结构。图的存储结构虽然没有顺序结构,但是它可以借助二维数组来表示元素之间的关系,即邻接矩阵表示法。图的链式存储有多种,邻接表、十字链表和邻接多重表。
用邻接矩阵表示法表示图,除了一个用于存储邻接矩阵的二维数组外,还要一个一维数组来存储顶点信息。
【形式说明】
#define MaxInt 32767 //表示极大值
#define MVNum 100 //最大顶点
typedef char VerTexType; //假设顶点数据为字符型
typedef int ArcType; //假设边的权值类型为整型
typedef struct
{
VerTexType vexs[MVNum]; //顶点表
ArcType arcs[MVNum][MVNum]; /邻接矩阵
int vexnum,arcnum;
}AMGraph;
用一个邻接矩阵表示法创建无向网
【算法描述】
Status CreateUDN(AMGraph &G)
{
cin>>G.vexnum>>G.arcnum; //输入总顶点数,总边数
for(i=0;i<G.vexnum;++i) //依次输入顶点信息
cin>>G.vexs[i];
for(i=0;i<G.vexnum;++i)
for(j=0;j<G.vexnum;++j)
G.arcs[i][j]=MaxInt;
for(k=0;kk<G.arcnum;++k)
{
cin>>v1>>v2>>w; //输入一条边依附的顶点以及权值
i=LocateVex(G,v1);j=LocateVex(G,v2); //顶点数组的下标
G.arcs[i][j]=w;
G.arcs[j][i]=G.arcs[i][j]; //对称边
}
return OK;
}
但是,邻接矩阵表示法对于稀疏图就不大适用,相对邻接表而言,邻接矩阵更适合表示稠密图,而稀疏图则用邻接表表示更合适。
图的邻接表结构说明如下:
#define MVNum 100 //最大顶点数
typedef struct ArcNode //边结点
{
int adjvex; //该边指向的顶点的位置
struct ArcNode *nextarc; //指向下一条边的指针
OtherInfo info; //和边相关的信息(可以不定义)
}ArcNode;
typedef struct VNode
{
VerTexType data;
ArcNode *firstarc; //指向第一条依附该顶点的边的指针
}VNode,AdjList[MVNum];
typedef struct
{
AdjList vertices;
int vexnum,arcnum; //当前图的顶点数和边数
}ALGraph;
基于上述的邻接表表示法创建无向图
【算法描述】
Status CreateUDG(ALGraph &G)
{
cin>>G.vexnum>>G.arcnum