图操作集代码实现(C语言)


图操作集的代码实现

  • 图的抽象数据类型描述详见:

用邻接矩阵表示图

  1. 图的描述

    typedef struct GNode{
        int NV;//顶点数
        int NE;//边数
        WeightType G[MaxVertexNum][MaxVertexNum];//类型为WeightType、大小为MaxVertexNum X MaxVertexNum的二维数组构成邻接矩阵保存边的信息
        //DataType Data[MaxVertexNum];//类型为DataType、大小为MaxVertexNum的一维数组用来存储顶点的信息,视情况选取。
    }GNode,*MGraph;
    
  2. MGraph CreateGraph(int VertexNum):构造并返回一个空图

     //输入一个顶点数,建立一个VertexNum个顶点、0条边的空图
     MGraph CreateGraph(int VertexNum)
     {
         int row = 0, col = 0;//行和列计数的临时变量
         MGraph G = NULL;
    
         //判断输入的顶点数是否大于邻接表空间
         if (VertexNum > MaxVertexNum)
         {
             printf("图顶点数溢出,创建图失败");
             return NULL;
         }
    
         //申请图空间,并将VertexNum赋给图节点中的顶点数,并将图节点中边数置0
         G = (MGraph)malloc(sizeof(GNode));
         G->NV = VertexNum;
         G->NE = 0;
    
         //将邻接表中所有元素置0
         for (row = 0; row < G->NV; row++)
         {
             for (col = 0; col < G->NV; col++)
             {
                 G->G[row][col] = 0;
             }
         }
    
         //将图返回
         return G;
     }
    
  3. void DestroyGraph(MGraph G G G):释放图 G G G占用的存储空间

     //释放图空间
     void DestroyGraph(MGraph G)
     {
         //将指针G指向的空间释放
         free(G);
     }
    
  4. Graph InsertVertex( Graph G G G):返回一个在 G G G中增加了新顶点 v v v的图

    //插入顶点
     MGraph InsertVertex(MGraph G)
     {
         int row = 0, col = 0;
         //判断图存储空间是否已经满了
         if (IsFull(G))
         {
             printf("图已满\n");
             return G;
         }
    
         //图存储空间未满,将顶点数加1,邻接矩阵扩充,扩充的空间填充0
         G->NV++;
         for (row = 0; row < G->NV; row++)
         {
             if (row != G->NV - 1)
             {
                 G->G[row][G->NV - 1] = 0;
             }
             else
             {
                 for (col = 0; col < G->NV; col++)
                 {
                     G->G[row][col] = 0;
                 }
             }
         }
    
         return G;
     }
    
  5. Graph InsertEdge( Graph G G G, Edge E ):返回一个在 G G G中增加了新边 ( v 1 , v 2 ) (v_1,v_2) (v1,v2)的图

    //边的节点表示
     typedef struct ENode {
         Vertex v1;//边的起点
         Vertex v2;//边的终点
         WeightType Weight;//边的权重
     }ENode,*Edge;
    
     //插入边
     MGraph InsertEdge(MGraph G, Edge E)
     {
         //边数加1
         G->NE++;
    
         //邻接矩阵对应位置改成插入边的权值
         G->G[E->v1][E->v2] = E->Weight;
    
         //如果是无权图,还要在对称位置再改成插入边的权值
         G->G[E->v2][E->v1] = E->Weight;
    
         return G;
     }
    
  6. Boolean IsEmpty(MGraph G G G):判断图是否是空图

    //判空
     Boolean IsEmpty(MGraph G)
     {
         return (G->NV == 0);
     }
    
  7. Boolean IsFull(MGraph G G G):判断图的存储空间是否已满

    //判满
     Boolean IsFull(MGraph G)
     {
         return (G->NV == MaxVertexNum);
     }
    

用邻接表表示图

  1. 图的描述

    //顶点的邻接点的信息节点
     typedef struct AdjVNode {
         Vertex AdjV;//邻接点的下标
         WeightType Weight;//顶点与该邻接点构成的边的权值
         struct AdjVNode *Next;//指向下一邻接节点的指针
     }AdjVNode,*AdjVNodePtr;
    
     //邻接表中每个顶点的信息节点
     typedef struct VNode {
         AdjVNodePtr FirstEdge;//保存边的信息,指向邻接点的指针
         //DataType Data;//保存顶点的信息,视情况选取
     }AdjList[MaxVertexNum];
    
     //图节点
     typedef struct GNode {
         int NV;//顶点数
         int NE;//边数
         AdjList G;//邻接表
     }GNode,*LGraph;
    
  2. Graph CreateGraph(int VertexNum):构造并返回一个空图

     //构造并返回一个空图
     LGraph CreateGraph(int VertexNum)
     {
         int row = 0;
         LGraph G = NULL;
    
         //判断存储空间是否足够
         if (VertexNum > MaxVertexNum)
         {
             printf("空间不足\n");
             return NULL;
         }
    
         //为图分配空间
         G = (LGraph)malloc(sizeof(GNode));
         G->NV = VertexNum;
         G->NE = 0;
    
         //因为没有边,所以所有顶点指向邻接点的指针都为NULL
         for (row = 0; row < VertexNum; row++)
         {
             G->G[row].FirstEdge = NULL;
         }
    
         return G;
     }
    
  3. void DestroyGraph(Graph G G G):释放图 G G G占用的存储空间

     //释放图空间
     void DestroyGraph(LGraph G)
     {
         int row = 0, col = 0;
         AdjVNodePtr Temp = NULL,CurrentPtr;
    
         //释放空间
         for (row = 0; row < G->NV; row++)
         {
             //释放每个顶点的邻接点链表的空间
             for (CurrentPtr = G->G[row].FirstEdge; CurrentPtr != NULL;)
             {
                 Temp = CurrentPtr->Next;
                 free(CurrentPtr);
                 CurrentPtr = Temp;
             }
         }
     }
    
  4. Graph InsertVertex( Graph G G G, Vertex v v v ):返回一个在 G G G中增加了新顶点 v v v的图

    //插入顶点
     void InsertVertex(LGraph G)
     {
         //判断存储空间是否已经满了
         if (IsFull(G))
         {
             printf("存储空间已满,插入失败\n");
             return;
         }
    
         //存储空间未满,顶点数加1,邻接表扩充1
         G->NV++;
         G->G[G->NV].FirstEdge = NULL;
     }
    
  5. Graph InsertEdge( Graph G G G, Vertex v 1 v_1 v1, Vertex v 2 v_2 v2 ):返回一个在 G G G中增加了新边 ( v 1 , v 2 ) (v_1,v_2) (v1,v2)的图

    //插入边
     void InsertEdge(LGraph G, Edge E)
     {
         AdjVNodePtr NewNode = NULL;
    
         /****************************** 插入边<v1,v2> *******************************/
         /*建立邻接点,并将边E的数据存入邻接点*/
         NewNode = (AdjVNodePtr)mallloc(sizeof(AdjVNode));
         NewNode->AdjV = E->v2;
         NewNode->Weight = E->Weight;
    
         /*将NewNode插入顶点v1的表头*/
         NewNode->Next = G->G[E->v1].FirstEdge;
         G->G[E->v1].FirstEdge = NewNode;
    
         /************************** 如果是无向图,还要插入边<v2,v1> *************************/
         /*建立邻接点,并将边E的数据存入邻接点*/
         NewNode = (AdjVNodePtr)mallloc(sizeof(AdjVNode));
         NewNode->AdjV = E->v1;
         NewNode->Weight = E->Weight;
    
         /*将NewNode插入顶点v1的表头*/
         NewNode->Next = G->G[E->v2].FirstEdge;
         G->G[E->v2].FirstEdge = NewNode;
     }
    
  6. Boolean IsEmpty(MGraph G G G):判断图是否是空图

    //判空
     Boolean IsEmpty(LGraph G)
     {
         return (G->NV == 0);
     }
    
  7. Boolean IsFull(MGraph G G G):判断图的存储空间是否已满

    //判满
     Boolean IsFull(LGraph G)
     {
         return (G->NV == MaxVertexNum);
     }
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值