图的邻接矩阵的操作

来源:互联网 发布:珠海高凌java笔试题 编辑:程序博客网 时间:2024/04/28 16:18
 

图的邻接矩阵的实现比较容易,定义两个数组分别存储顶点信息(数据元素)和边或弧的信息(数据元素之间的关系) 。其存储结构形式定义如下:

#define INFINITY  MAX_VAL     /* 最大值∞ */

    /* 根据图的权值类型,分别定义为最大整数或实数 */

#define MAX_VEX  30     /*  最大顶点数目 */

typedef enum {DG, AG, WDG,WAG} GraphKind ;

      /*  {有向图,无向图,带权有向图,带权无向图}  */

typedef struct ArcType

         VexType  vex1, vex2 ;    /*  弧或边所依附的两个顶点 */

         ArcValType  ArcVal ;     /*  弧或边的权值  */

         ArcInfoType  ArcInfo ;   /*  弧或边的其它信息   */

}ArcType ;   /*  弧或边的结构定义  */

 

typedef struct

         GraphKind  kind ;    /*  图的种类标志   */

         int  vexnum , arcnum ;   /*  图的当前顶点数和弧数  */

         VexType   vexs[MAX_VEX] ;  /*  顶点向量  */

         AdjType   adj[MAX_VEX][MAX_VEX];

}MGraph ;    /*  图的结构定义   */

 

(1)  图的创建

AdjGraph  *Create_Graph(MGraph * G)

{  

         printf(“请输入图的种类标志:”) ;

         scanf(“%d”, &G->kind) ;

         G->vexnum=0 ;       /*  初始化顶点个数  */

         return(G) ;

}

 

(2)  图的顶点定位

图的顶点定位操作实际上是确定一个顶点在vexs数组中的位置(下标) ,其过程完全等同于在顺序存储的线性表中查找一个数据元素。

int  LocateVex(MGraph *G , VexType *vp)

         int  k ;

     for (k=0 ; k<G->vexnum ; k++)

              if (G->vexs[k]==*vp)  return(k) ;

     return(-1) ;     /*  图中无此顶点  */

}

 

(3)  向图中增加顶点

向图中增加一个顶点的操作,类似在顺序存储的线性表的末尾增加一个数据元素。

int  AddVertex(MGraph *G , VexType *vp)

         int  k , j ;

         if  (G->vexnum>=MAX_VEX)

         { 

                   printf(“Vertex Overflow !\n”) ;

                   return(-1) ;  

         }

         if  (LocateVex(G , vp)!=-1)

         { 

                   printf(“Vertex has existed !\n”) ;

                   return(-1) ;

         }

         k=G->vexnum ;

         G->vexs[G->vexnum++]=*vp ;

         if (G->kind==DG||G->kind==AG)

                   for (j=0 ; j<G->vexnum ; j++)

                            G->adj[j][k].ArcVal=G->adj[k][j].ArcVal=0 ;

                        /*  是不带权的有向图或无向图  */

         else

                   for (j=0 ; j<G->vexnum ; j++) 

                   {  

                            G->adj[j][k].ArcVal=INFINITY ;

                        G->adj[k][j].ArcVal=INFINITY ;

                   /*  是带权的有向图或无向图  */

                   }

         return(k) ;

}

 

(4)  向图中增加一条弧

int  AddArc(MGraph *G , ArcType *arc)

         int  k , j ;

         k=LocateVex(G , &arc->vex1)  ;

         j=LocateVex(G , &arc->vex2)  ;

         if (k==-1||j==-1)    

         { 

                   printf(“Arc’s Vertex do not existed !\n”) ;

                   return(-1) ;

         }

         if (G->kind==DG||G->kind==WDG)

         { 

                   G->adj[k][j].ArcVal=arc->ArcVal;

                   G->adj[k][j].ArcInfo=arc->ArcInfo ;

        /*  是有向图或带权的有向图*/

         }

         else

         { 

                   G->adj[k][j].ArcVal=arc->ArcVal ;

                   G->adj[j][k].ArcVal=arc->ArcVal ;

                   G->adj[k][j].ArcInfo=arc->ArcInfo ;

                   G->adj[j][k].ArcInfo=arc->ArcInfo ;

             /*  是无向图或带权的无向图,需对称赋值  */

         }

         return(1) ; 

}