在本文中,主要用来记录数据结构考试中,常见以及基础的图的考点。
1. 图的常见存储结构
1. 1. 邻接矩阵表示法
我们可以利用矩阵来对图进行存储,矩阵大小为图顶点个数的平法,如果两顶点之间存在路径,矩阵中两顶点所在行列交点为1或者该路径的权值。
以下是用邻接矩阵表示法存储无向带权图
//------图的邻接矩阵存储表示法------
#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
采用邻接矩阵表示法来创建无向网
- 1.输入总顶点数和总边数
- 2.依次输入点的信息存入顶点表中
- 3.初始化邻接矩阵,使每个权值初始值最大值(无向带权图)
- 4.构造邻接矩阵。依次输入每条边依附的顶点和权重,确定两个顶点在图中位置之后,使相应边赋予相应的权值,同时使对称边赋予相同的权值。
算法描述
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;k<G.arcnum;++k){
cin>>v1>>v2>>w; //输入一条边依附的顶点以及权值
i=LocateVex(G,v1); //找到v1v2在G中位置,即数组下标
j=LocateVex(G,v2);
G.arcs[i][j]=w; //修改边<v1,v2>的权值
G.arcs[j][i]=arcs[i][j]; //修改对称边的权重
}
return OK;
}
1. 2. 邻接表表示法
邻接表法首先要定义两存放顶点的头结点以及边的边结点。
#define MVNum 100 //最大顶点数
typedef struct ArcNode{
int adjvex; //边
struct AcrNode* nextarc; //下一个节点指针
// Infotype info;
}ArcNode;
typedef struct VNode{
VerTexType data;
ArcNode *firstarc;
}VNode,AdjList[MVNum];
typedef struct{
AdjList vertices;
int vexnum,arcum;
}ALGraph;
采用邻接表法创建一个无向图
1.输入总顶点数和总边数 2.依次输入顶点信息,使每个表头结点指针初始化为NULL 3.创建邻接表,依次输入每条边依附的两个顶点,确定这两个顶点的序号i和j后,将这两个边结点分别插入vi 和vj 对应的两个边链表的头部
Status CreateUDG(ALGraph &G){
cin>>G.vexnum>>G.arcnum;
for(i=0;i<G.vexnum;++i){
cin>>G.vertices[i].data;
G.vertices[i].firstarc=NULL;
}
//构造邻接表
for(k=0;k<G.arcnum;++k){
cin>>v1>>v2;
i=LocateVex(G,v1);
j=LocateVex(G,v2);
p1=new ArcNode;
p1->adjvex=j;
p1->nextarc=G.vertices[i].firstarc; G.vertices[i].firstarc=p1;
p2=new ArcNode; p2->adjvex=i;
p2->nextarc=G.vertices[j].firstarc;G.vertices[j].firstarc=p2;
}
return OK;
}