Weitere ähnliche Inhalte
Mehr von mengyingchina (9)
数据结构复习笔记 图的数组(邻接矩阵)存储表示及重要的基本操作
- 1. 图的数组(邻接矩阵)存储表示
及重要的基本操作
/* 图的数组(邻接矩阵)存储表示及重要的基本操作 */
#define INFINITY INT_MAX /* 用整型最大值代替∞ */
#define MAX_VERTEX_NUM 20/* 最大顶点个数 */
//
//结构真的很重要,我觉得
typedef enum{DG,DN,UDG,UDN}GraphKind; /* {有向图,有向网,无向图,无向网} */
, , , }
typedef struct
{
VRType adj; /* 顶点关系类型。对无权图,用 1( )或 0( )表示相邻否;对带权图,则为
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; /* 图的种类标志 */
}MGraph;
邻接矩阵的表示:
//
//以下的重要基本操作,考试时应该不会让单独写吧,最多填空。了解一下,很常用的操作。
1
- 2. Status LocateVex(MGraph G,VertexType u)
{ /* 初始条件:图 G 存在,u 和 G 中顶点有相同特征 */
/* 操作结果:若 G 中存在顶点 u,则返回该顶点在图中位置;否则返回 NULL */
int i;
for(i=0;i<G.vexnum;++i)
if(strcmp(u,G.vexs[i])==0)
return i;
return NULL;
}
//构造图,以有向图和无向网为例
Status CreateDG(MGraph &G)
CreateDG
{/* 采用数组(邻接矩阵)表示法,构造有向图 G */
scanf(&G.vexnum, &G.arcnum, &IncInfo); // IncInfo 为 0 则各弧不含其它信息
for (i=0; i<G.vexnum; ++i )
scanf (&G.vexs[i]); // 构造顶点向量
for (i=0; i<G.vexnum; ++i ) // 初始化邻接矩阵
for (j=0; j<G.vexnum; ++j )
G.arcs[i][j]={0, NULL}; //{G.arcs[i][j].adj, G.arcs[i][j].info}
//{G.arcs[i][j].adj, G.arcs[i][j].info}
for (k=0; k<G.arcnum; ++k ) // 构造邻接矩阵
{scanf (&v1, &v2); // 输入一条边依附的顶点
i =LocateVex(G, v1 );
j = LocateVex (G, v2 ); // 确定 v1 和 v2 在 G 中位置
G.arc[i][j].adj = 1; // 有向图
if (IncInfo)
Input(* G.arcs[i][j].info); // 若弧含有相关信息,则输入
}
G.kind=DG; //图的类型
return OK;
} // CreateUDN
Status CreateUDN(MGraph &G)
{//采用数组(邻接矩阵)表示法,构造无向网 G
scanf(&G.vexnum, &G.arcnum, &IncInfo); // IncInfo 为 0 则各弧不含其它信息
for (i=0; i<G.vexnum; ++i )
scanf (&G.vexs[i]); // 构造顶点向量
for (i=0; i<G.vexnum; ++i ) // 初始化邻接矩阵
for (j=0; j<G.vexnum; ++j )
G.arcs[i][j]={INFINITY, NULL}; //{adj,info}
for (k=0; k<G.arcnum; ++k ) // 构造邻接矩阵
{scanf (&v1, &v2, &w); // 输入一条边依附的顶点及权值
i =LocateVex(G, v1 );
j = LocateVex (G, v2 ); // 确定 v1 和 v2 在 G 中位置
G.arc[i][j].adj = w; // 弧< v1,v2 >的权值
2
- 3. if (IncInfo)
Input(* G.arcs[i][j].info); // 若弧含有相关信息,则输入
G.arcs[j][i] =G.arcs[i][j]; // 置<v1,v2>的对称弧<v2,v1>
}
G.kind=UDN; //图的类型
return OK;
} // CreateUDN
Status FirstAdjVex(MGraph G,VertexType v)
{ /* 初始条件:图 G 存在,v 是 G 中某个顶点 */
/* 操作结果: 返回 v 的第一个邻接顶点的序号。 若顶点在 G 中没有邻接顶点,则返回-1 */
int j=0; //用来在非网图中判断邻接顶点
k=LocateVex(G,v); /* k 为顶点 v 在图 G 中的序号 */
if(G.kind%2) /* 网 */
j=INFINITY;
for(i=0;i<G.vexnum;i++)
if(G.arcs[k][i].adj!=j)
return i;
return NULL;
}
Status NextAdjVex(MGraph G,VertexType v,VertexType w)
{ /* 初始条件:图 G 存在,v 是 G 中某个顶点,w 是 v 的邻接顶点 */
/* 操作结果:返回 v 的(相对于 w 的)下一个邻接顶点的序号,若 w 是 v 的最后一个邻接
顶点,则返回 NULL */
int j=0; //用来在非网图中判断邻接顶点
k1=LocateVex(G,v); /* k1 为顶点 v 在图 G 中的序号 */
k2=LocateVex(G,w); /* k2 为顶点 w 在图 G 中的序号 */
if(G.kind%2) /* 网 */
j=INFINITY;
for(i=k2+1;i<G.vexnum;i++)
if(G.arcs[k1][i].adj!=j)
return i;
return NULL;
}
Status InsertVex(MGraph &G,VertexType v)
{
if(G.vexnum+1>MAX_VERTEX_NUM) return ERROR;
G.vexs[G.vexnum]=v; //增加顶点数据
G.vexnum++; //增加顶点个数
for(i=0; i<G.vexnum; i++) //增加边或弧的信息
if(G.kind==DN||G.kind==UDN)
3
- 4. { G.arcs[i][G.vexnum-1]={0,NULL};
G.arcs[G.vexnum-1][i]={0,NULL};
}
else{G.arcs[i][G.vexnum-1]={INFINITY,NULL};
G.arcs[i][G.vexnum-1]={INFINITY,NULL};
}
return OK;
}
Status InsertArc(MGraph &G,int v,int w)
{ G.arcnum++;
switch(G.kind)
{ case DG: G.arcs[v][w]=1; break; //有向图
case UDG:G.arcs[v][w]= G.arcs[w][v]=1; break; //无向图
case DN: scanf(G.arcs[v][w]); break; //有向网
case UDN: scanf(G.arcs[v][w]); //无向网
G.arcs[w][v]= G.arcs[v][w]; break;
}
return OK;
}
Status DeleteVex(MGraph &G, VertexType v)
{ k=Locate(G,v);
switch(G.kind)
{ case DG: //有向图
for(j=0; j<G.vexnum; j++)
if(G.arcs[k][j]) G.arcnum--;
for(j=0; j<G.vexnum-1; j++)
if(G.arcs[j][k]) G.arcnum--; break;
case UDG: //无向图
for(j=0; j<G.vexnum; j++)
if(G.arcs[k][j]) G.arcnum--; break;
case DN: //有向网
for(j=0; j<G.vexnum; j++)
if(G.arcs[k][j]!=INFINITY) G.arcnum--;
for(j=0; j<G.vexnum-1; j++)
if(G.arcs[j][k]!=INFINITY) G.arcnum--; break;
case UDN: //无向网
for(j=0; j<G.vexnum; j++)
if(G.arcs[i][j]!=INFINITY) G.arcnum--; break;
}
for(i=k; i<G.vexnum-1; i++) //删除由 k 发出的弧/边
for(j=0; j<G.vexnum; j++)
G.arcs[i][j]=A.arcs[i+1][j];
for(j=0; j<G.vexnum-1; j++) //删除到达 k 的弧/边
4
- 5. for(i=k; i<G.vexnum-1; i++)
G.arcs[j][i]=A.arcs[j][i+1];
for(i=k;i<G.vexnum-1;i++) G.vexs[i]=G.vexs[i+1]; //删除顶点
G.vexnum--; //修改顶点个数
return OK;
}
Status DeleteArc(MGraph &G,int v,int w)
{ G.arcnum--;
switch(G.kind)
{ case DG: G.arcs[v][w]= 0; break; //有向图
case UDG:G.arcs[v][w]= G.arcs[w][v]=0; break; //无向图
case DN: G.arcs[v][w]=INFINITY; break; //有向网
case UDN:G.arcs[v][w]= G.arcs[v][w]=INFINITY; break; //无向网
}
return OK;
}
5