邻接矩阵(Adjacency Matrix)

来源:互联网 发布:百度电脑软件管家 编辑:程序博客网 时间:2024/05/21 23:33

/*----------------------------Graph的定义与操作---------------------------------

基本操作:
1、 CreateGraph(&G,V,VR);
    初始条件:V是图的顶点集,VR是图中弧的集合;
    操作结果:按V和VR的定义构成图?
    ?
2、 DestoryGraph(&G);
    初始条件:图G存在;
    操作结果:销毁图G。

3、 LocateVex(G,u);
    初始条件:图G存在,u和G中顶点有相同的特征;
    操作结果:若图G存在顶点u,则返回该顶点在图中的位置;否则返回其它信息。?
    ?
4、 GetVex(G,v);
    初始条件:图G存在,v是G中的某个顶点;
    操作结果: 返回v的值。

5、 PutVex(&G,v,value);
    初始条件:图G存在,v是G中的某个顶点;
    操作结果: 对v赋值value。

6、 FirstAdjVex(G,v);
    初始条件:图G存在,v是G中的某个顶点;
    操作结果: 返回v的第一个邻接顶点。若顶点在G中没有邻接顶点,则返回“空”。?

7、 NextAdjVex(G,v,w);
    初始条件:图G存在,v是G中的某个顶点,w是v的邻接顶点;
    操作结果: 返回v的(相对于w的)下一个邻接顶点。若w是v的最后一个邻接顶点,
              则返回“空”。?

8、 InsertVex(&G,v);
    初始条件:图G存在,v和G中顶点有相同的特征;
    操作结果:在图G中增加新顶点v。

9、 DeleteVex(&G,v);
    初始条件:图G存在,v是G中的某个顶点;
    操作结果: 删出图G中顶点v及其相关的弧?

10、InsertArc(&G,v,w);
    初始条件:图G存在,v和w是G中的两个顶点;
    操作结果: 在G中增添弧<v,w>,若G是无向的,则还要增添对称弧<w,v>。

11、DFSTraverse(G,Visit());
    初始条件:图G存在,Visit()是G顶点的应用函数;
    操作结果: 对图进行深度优先遍历。在遍历过程中对每个顶点调用函数Visit()一次
              且仅一次。一旦Visit()失败,则操作失败。

12、BFSTraverse(G,Visit());
    初始条件:图G存在,Visit()是G顶点的应用函数;
    操作结果: 对图进行广度优先遍历。在遍历过程中对每个顶点调用函数Visit()一次
              且仅一次。一旦Visit()失败,则操作失败。

------------------------------------------------------------------------------*/

/*=============================邻接矩阵的存储结构=============================*/
#include<stdio.h>

#define  OK                 1
#define  ERROR              -1
#define  TRUE               1
#define  FALSE              0
#define  ADJACENCY          1
#define  UNADJACENCY        0
#define  NETWORK_INFINITY   32767
#define  MAX_VERTEX_NUM     20

int visited[MAX_VERTEX_NUM];
typedef int VRType;
typedef int VertexType;
typedef char InfoType;

typedef enum{ DG,DN,UDG,UDN }GraphKind;
typedef struct ArcCell {
   VRType  adj;
   InfoType *info;
}ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];

typedef struct {
   VertexType  vexs[MAX_VERTEX_NUM];
   AdjMatrix   arcs;
   int         vexnum,arcnum;
   GraphKind   kind;
}AMGraph;

/*========================邻接矩阵的基本操作的实现============================*/

/*-----------------------1、 CreateGraph(&G,V,VR)-----------------------------*/
int CreateGraph( AMGraph *G )
{
   int choice=0;
   printf(" 1-Directed Graph          /n");
   printf(" 2-Directed Network        /n");
   printf(" 3-UnDirected Graph        /n");
   printf(" 4-UnDirected Network      /n/n");
   do{ if(choice<1||choice>4)printf(" Choose: ");scanf("%d",&choice);}
   while(choice<1||choice>4);
   G->kind = (GraphKind)(choice);

   switch(G->kind){
     case  DG+1: return CreateDG(G);
     case  DN+1: return CreateDN(G);
     case UDG+1: return CreateUDG(G);
     case UDN+1: return CreateUDN(G);
     default : return ERROR;
   }
}

int CreateDG( AMGraph *G )
{
   int IncInfo,i,j,k;    VertexType v1,v2;
   printf("/n/n The Graph's number of Vertex :"); scanf("%d",&(G->vexnum));
   printf(" The Graph's number of Arcnum :"); scanf("%d",&(G->arcnum));
   printf(" The Graph's incinfo:"); scanf("%d", &IncInfo);  printf("/n");
   /*顶点编号或者名称*/
   for(i = 0;i < G -> vexnum ;i ++){ printf(" The Graph's %d Vertex's NAME:",i+1); scanf("%d",(G->vexs)+i); }
   /*初始化邻接矩阵*/
   for(i=0;i< G->vexnum ;i++)
     for(j=0;j< G->vexnum ;j++){ (G->arcs)[i][j].adj = UNADJACENCY; (G->arcs)[i][j].info = NULL ; }
   /* 构造邻接矩阵 */
   for(k = 0;k < G -> arcnum;k ++){
     printf("/n The %d Arc ./n",k+1);
     printf(" The tail vertex:");do{ scanf("%d",&v1);if((v1<=0)||(v1>G->vexnum))printf(" ERROR/n The tail vertex:"); }while((v1<=0)||(v1>G->vexnum));
     printf(" The head vertex:");do{ scanf("%d",&v2);if((v2<=0)||(v2>G->vexnum))printf(" ERROR/n The head vertex:"); }while((v2<=0)||(v2>G->vexnum));
     i = LocateVex(*G,v1); j = LocateVex(*G,v2);
     (G->arcs)[i][j].adj = ADJACENCY;
     if(IncInfo){
       printf(" Enter %d arc's IncInfo:",k+1);
       scanf("%s",(G->arcs)[i][j].info ); fflush(stdin);
     }
     printf("/n");
   }
   return OK;
}

int CreateDN(AMGraph *G )
{
   int IncInfo,i,j,k;    VertexType v1,v2,w;
   printf("/n/n The Graph's number of Vertex :"); scanf("%d",&(G->vexnum));
   printf(" The Graph's number of Arcnum :"); scanf("%d",&(G->arcnum));
   printf(" The Graph's incinfo:"); scanf("%d", &IncInfo);  printf("/n");

   /*顶点编号或者名称*/
   for(i = 0;i < G -> vexnum ;i ++){ printf(" The Graph's %d Vertex's NAME:",i+1); scanf("%d",(G->vexs)+i); }
   /*初始化邻接矩阵*/
   for(i=0;i< G->vexnum ;i++)
     for(j=0;j< G->vexnum ;j++){ (G->arcs)[i][j].adj = NETWORK_INFINITY; (G->arcs)[i][j].info = NULL ; }
   /* 构造邻接矩阵 */
   for(k = 0;k < G -> arcnum;k ++){
     printf("/n The %d Arc ./n",k+1);
     printf(" The tail vertex:");do{ scanf("%d",&v1);if((v1<=0)||(v1>G->vexnum))printf(" ERROR/n The tail vertex:"); }while((v1<=0)||(v1>G->vexnum));
     printf(" The head vertex:");do{ scanf("%d",&v2);if((v2<=0)||(v2>G->vexnum))printf(" ERROR/n The head vertex:"); }while((v2<=0)||(v2>G->vexnum));
     printf(" The arc  weight:");scanf("%d",&w);
     i = LocateVex(*G,v1); j = LocateVex(*G,v2);
     (G->arcs)[i][j].adj = w;
     if(IncInfo){
       printf(" Enter %d arc's IncInfo:",k+1);
       scanf("%s",(G->arcs)[i][j].info ); fflush(stdin);
     }
     printf("/n");
   }
   return OK;
}

int CreateUDG( AMGraph *G )
{
   int IncInfo,i,j,k;    VertexType v1,v2;
   printf("/n/n The Graph's number of Vertex :"); scanf("%d",&(G->vexnum));
   printf(" The Graph's number of Arcnum :"); scanf("%d",&(G->arcnum));
   printf(" The Graph's incinfo:"); scanf("%d", &IncInfo);  printf("/n");
   /*顶点编号或者名称*/
   for(i = 0;i < G -> vexnum ;i ++){ printf(" The Graph's %d Vertex's NAME:",i+1); scanf("%d",(G->vexs)+i); }
   /*初始化邻接矩阵*/
   for(i=0;i< G->vexnum ;i++)
     for(j=0;j< G->vexnum ;j++){ (G->arcs)[i][j].adj = UNADJACENCY; (G->arcs)[i][j].info = NULL ; }
   /* 构造邻接矩阵 */
   for(k = 0;k < G -> arcnum;k ++){
     printf("/n The %d Arc ./n",k+1);
     printf(" The tail vertex:");do{ scanf("%d",&v1);if((v1<=0)||(v1>G->vexnum))printf(" ERROR/n The tail vertex:"); }while((v1<=0)||(v1>G->vexnum));
     printf(" The head vertex:");do{ scanf("%d",&v2);if((v2<=0)||(v2>G->vexnum))printf(" ERROR/n The head vertex:"); }while((v2<=0)||(v2>G->vexnum));
     i = LocateVex(*G,v1); j = LocateVex(*G,v2);
     (G->arcs)[i][j].adj = ADJACENCY;
     if(IncInfo){
       printf(" Enter %d arc's IncInfo:",k+1);
       scanf("%s",(G->arcs)[i][j].info ); fflush(stdin);
     }
     (G->arcs)[j][i] = (G->arcs)[i][j];
     printf("/n");
   }
   return OK;
}
int CreateUDN( AMGraph *G )
{
   int IncInfo,i,j,k;
   VertexType v1,v2,w;

   printf("/n/n The Graph's number of Vertex :"); scanf("%d",&(G->vexnum));
   printf(" The Graph's number of Arcnum :"); scanf("%d",&(G->arcnum));
   printf(" The Graph's incinfo:"); scanf("%d", &IncInfo);  printf("/n");

   /*顶点编号或者名称*/
   for(i = 0;i < G -> vexnum ;i ++){
     printf(" The Graph's %d Vertex's NAME:",i+1); scanf("%d",(G->vexs)+i);
   }
   /*初始化邻接矩阵*/
   for(i=0;i< G->vexnum ;i++)
     for(j=0;j< G->vexnum ;j++){
      (G->arcs)[i][j].adj = NETWORK_INFINITY; (G->arcs)[i][j].info = NULL ;
     }
   /* 构造邻接矩阵 */
   for(k = 0;k < G -> arcnum;k ++){
     printf("/n The %d Arc ./n",k+1);
     printf(" The tail vertex:");do{ scanf("%d",&v1);if((v1<=0)||(v1>G->vexnum))printf(" ERROR/n The tail vertex:"); }while((v1<=0)||(v1>G->vexnum));
     printf(" The head vertex:");do{ scanf("%d",&v2);if((v2<=0)||(v2>G->vexnum))printf(" ERROR/n The head vertex:"); }while((v2<=0)||(v2>G->vexnum));
     printf(" The arc  weight:");scanf("%d",&w);
     i = LocateVex(*G,v1); j = LocateVex(*G,v2);
     (G->arcs)[i][j].adj = w;
     if(IncInfo){
       printf(" Enter %d arc's IncInfo:",k+1);
       scanf("%s",(G->arcs)[i][j].info ); fflush(stdin);
     }
     (G->arcs)[j][i] = (G->arcs)[i][j];
     printf("/n");
   }
   return OK;
}

 

/*----------------------------3、 LocateVex(G,u)------------------------------*/
int LocateVex( AMGraph G,VertexType u )
{
   int ivex;
   for(ivex = 0;ivex < G.vexnum ;ivex ++)
     if(u == G.vexs[ivex])
       return ivex;
   return ERROR;
}

/*------------------------6、 FirstAdjVex(G,v)----------------------------*/
/*操作结果: 返回v的第一个邻接顶点。若顶点在G中没有邻接顶点,则返回“空”。*/
int FirstAdjVex(AMGraph G,int ivex)
{
   int jvex;
   for(jvex =0;jvex < G.vexnum;jvex ++)
     if(G.arcs[ivex][jvex].adj == ADJACENCY)  return jvex;
   if(jvex >= G.vexnum)  return ERROR;
}

/*-------------------------7、 NextAdjVex(G,v,w)----------------------------*/
/*操作结果:返回v的(相对于w的)下一个邻接顶点。若w是v的最后一个邻接顶点,则返回“空”。 */

int NextAdjVex(AMGraph G,int ivex ,int jw)
{
   for(jw +=1 ;jw < G.vexnum;jw ++)
     if(G.arcs[ivex][jw].adj == ADJACENCY) return jw;
   if(jw >= G.vexnum)   return  ERROR;
}
/*--------------------------11、深度优先遍历---------------------------------*/
/* int visited[MAX_VERTEX_NUM] */
void VisitFunc(AMGraph G,int v)
{
  printf("%6d",G.vexs[v]);
}

void DFS( AMGraph G,int v )
{
   int w;
   visited[v] = TRUE; VisitFunc(G,v);
   for(w = FirstAdjVex(G,v);w>=0;w=NextAdjVex(G,v,w))
     if(!visited[w])  DFS(G,w);
}

void DFSTraverse( AMGraph G,int v )
{
   for(v=0;v<G.vexnum;v++) visited[v] = FALSE;
   for(v=0;v<G.vexnum;v++)
     if(!visited[v]) DFS(G,v);
}

 

/*============================================================================*/

/*============================主函数main()====================================*/
int main( void )
{
   int i,j,ivex;
   AMGraph G;
   CreateGraph( &G );

   printf("The Adjacency Matrix is:/n");
   for(i = 0;i < G.vexnum;i ++){
     for(j = 0;j < G.vexnum;j ++)
       printf("%6d",G.arcs[i][j].adj);
     printf("/n");
   }

   printf("DFSTraverse AMGraph:/n");
   DFSTraverse(G,ivex);
   getch();

}