SlideShare ist ein Scribd-Unternehmen logo
1 von 5
Downloaden Sie, um offline zu lesen
图的数组(邻接矩阵)存储表示

                                及重要的基本操作


/* 图的数组(邻接矩阵)存储表示及重要的基本操作 */

 #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
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
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
{ 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
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

Weitere ähnliche Inhalte

Andere mochten auch

Proyecto brazuelos pag web1
Proyecto brazuelos pag web1Proyecto brazuelos pag web1
Proyecto brazuelos pag web1oscarcelis
 
Lecture 12
Lecture 12Lecture 12
Lecture 12giskende
 
Presentación Innovación 2.0 e Inteligencia Colectiva
Presentación Innovación 2.0 e Inteligencia ColectivaPresentación Innovación 2.0 e Inteligencia Colectiva
Presentación Innovación 2.0 e Inteligencia ColectivaVictor Heredia
 
8.hzd 3 urte animaliak
8.hzd 3 urte animaliak8.hzd 3 urte animaliak
8.hzd 3 urte animaliakhaurhezkuntza
 
Trevisan - Educação Executiva em Redes Sociais - Comunicação Interna
Trevisan - Educação Executiva em Redes Sociais - Comunicação InternaTrevisan - Educação Executiva em Redes Sociais - Comunicação Interna
Trevisan - Educação Executiva em Redes Sociais - Comunicação InternaLuciano Palma
 
Hiragana ma mo
Hiragana ma moHiragana ma mo
Hiragana ma moshingogs
 
Tecnologia e o futuro: o que isso impacta na formação das equipes?
Tecnologia e o futuro: o que isso impacta na formação das equipes?Tecnologia e o futuro: o que isso impacta na formação das equipes?
Tecnologia e o futuro: o que isso impacta na formação das equipes?Luciano Palma
 

Andere mochten auch (8)

Proyecto brazuelos pag web1
Proyecto brazuelos pag web1Proyecto brazuelos pag web1
Proyecto brazuelos pag web1
 
Lecture 12
Lecture 12Lecture 12
Lecture 12
 
Presentación Innovación 2.0 e Inteligencia Colectiva
Presentación Innovación 2.0 e Inteligencia ColectivaPresentación Innovación 2.0 e Inteligencia Colectiva
Presentación Innovación 2.0 e Inteligencia Colectiva
 
Mondragó
MondragóMondragó
Mondragó
 
8.hzd 3 urte animaliak
8.hzd 3 urte animaliak8.hzd 3 urte animaliak
8.hzd 3 urte animaliak
 
Trevisan - Educação Executiva em Redes Sociais - Comunicação Interna
Trevisan - Educação Executiva em Redes Sociais - Comunicação InternaTrevisan - Educação Executiva em Redes Sociais - Comunicação Interna
Trevisan - Educação Executiva em Redes Sociais - Comunicação Interna
 
Hiragana ma mo
Hiragana ma moHiragana ma mo
Hiragana ma mo
 
Tecnologia e o futuro: o que isso impacta na formação das equipes?
Tecnologia e o futuro: o que isso impacta na formação das equipes?Tecnologia e o futuro: o que isso impacta na formação das equipes?
Tecnologia e o futuro: o que isso impacta na formação das equipes?
 

Mehr von mengyingchina

哈佛幸福课[升级版]
哈佛幸福课[升级版]哈佛幸福课[升级版]
哈佛幸福课[升级版]mengyingchina
 
数据结构复习笔记 静态链表
数据结构复习笔记 静态链表数据结构复习笔记 静态链表
数据结构复习笔记 静态链表mengyingchina
 
数据结构复习笔记 图的遍历及连通性问题
数据结构复习笔记 图的遍历及连通性问题数据结构复习笔记 图的遍历及连通性问题
数据结构复习笔记 图的遍历及连通性问题mengyingchina
 
数据结构复习笔记 拓扑排序Topological+sort
数据结构复习笔记 拓扑排序Topological+sort数据结构复习笔记 拓扑排序Topological+sort
数据结构复习笔记 拓扑排序Topological+sortmengyingchina
 
数据结构复习笔记 字符串模式匹配算(Kmp)
数据结构复习笔记 字符串模式匹配算(Kmp)数据结构复习笔记 字符串模式匹配算(Kmp)
数据结构复习笔记 字符串模式匹配算(Kmp)mengyingchina
 
数据结构复习笔记 关键路径+Critical+paths
数据结构复习笔记 关键路径+Critical+paths数据结构复习笔记 关键路径+Critical+paths
数据结构复习笔记 关键路径+Critical+pathsmengyingchina
 
数据结构复习笔记 树和二叉树
数据结构复习笔记 树和二叉树数据结构复习笔记 树和二叉树
数据结构复习笔记 树和二叉树mengyingchina
 

Mehr von mengyingchina (9)

哈佛幸福课[升级版]
哈佛幸福课[升级版]哈佛幸福课[升级版]
哈佛幸福课[升级版]
 
幸福课
幸福课幸福课
幸福课
 
数据结构复习笔记 静态链表
数据结构复习笔记 静态链表数据结构复习笔记 静态链表
数据结构复习笔记 静态链表
 
数据结构复习笔记 图的遍历及连通性问题
数据结构复习笔记 图的遍历及连通性问题数据结构复习笔记 图的遍历及连通性问题
数据结构复习笔记 图的遍历及连通性问题
 
数据结构复习笔记 拓扑排序Topological+sort
数据结构复习笔记 拓扑排序Topological+sort数据结构复习笔记 拓扑排序Topological+sort
数据结构复习笔记 拓扑排序Topological+sort
 
数据结构复习笔记 字符串模式匹配算(Kmp)
数据结构复习笔记 字符串模式匹配算(Kmp)数据结构复习笔记 字符串模式匹配算(Kmp)
数据结构复习笔记 字符串模式匹配算(Kmp)
 
数据结构复习笔记 关键路径+Critical+paths
数据结构复习笔记 关键路径+Critical+paths数据结构复习笔记 关键路径+Critical+paths
数据结构复习笔记 关键路径+Critical+paths
 
数据结构复习笔记 树和二叉树
数据结构复习笔记 树和二叉树数据结构复习笔记 树和二叉树
数据结构复习笔记 树和二叉树
 
文献综述
文献综述文献综述
文献综述
 

数据结构复习笔记 图的数组(邻接矩阵)存储表示及重要的基本操作

  • 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