建立图

用临接矩阵表示图

typedef struct GNode *ptrToGNode;
struct GNode{
      int Nv;//顶点数
      int Ne;//边数
      weightType G[MaxVertexNum][MaxVertexNum];
      DataType Data[MaxVertexNum];
    };
typedef ptrToGNode MGraph;//以邻接矩阵存储的图类型

MGraph初始化

初始化一个有VertexNum个顶点但没有边的图

typedef int Vertex;
MGraph CreateGraph(int VertexNum)
{     Vertex V,W;
      MGraph Graph;
      Graph=(MGraph)malloc(sizeof(struct GNode));
       Graph->Nv=VertexNum;
       Graph->Ne=0;
       for(V=0;V<Graph->Nv;V++)
           for(W=0;W<Graph->Nv;W++)
                 Graph->G[V][W]=0;
       return Graph;
}

向MGraph中插入边

typedef struct ENode *ptrToNode;
struct ENode{
        Vertex v1,v2;//有向边<v1,v2>
         weightType Weight;//权重
};
typedef ptrToENode Edge;
void InsertEdge(MGraph Graph,Edge E)
{
     Graph->G[E->V1][E->V2]=E->Weight;//插入边<v1,v2>
     Graph->G[E->V2][E->V1]=E->Weight;//若是无向图,还要插入边<v2,v1>
}

完整地建立一个MGraph

*输入格式

Nv Ne

V1 V2 Weight

...

MGraph BuildGraph()
{   MGraph Graph;
    Edge E;
    Vertex V;
     int Nv,i;
    cin>>Nv;
     Graph=CreatGraph(Nv);
     cin>>Graph->Ne;
      if(Graph->Ne!=0){
         E=(Edge)malloc(sizeof(struct ENode)};
         for(i=0;i<Graph->Ne;i++){
             cin>>E->V1>>E->V2>>E->Weight;
          InsertEdge(Graph,E);
          }
        }
     for(v=0;v<Graph->Mv;v++)
      cin>>Graph->Data[V];
     return Graph;
}

简单方法:

int G[MAXN][MAXN],Nv,Ne;
void BuildGraph()
{     int i,j,v1,v2,w;
      cin>>Nv;
      for(i=0;i<Nv;i++)
          for(j=0;j<Nv;j++)
              G[i][j]=0;
        cin>>Ne;
       for(i=0;i<Ne;i++){
          cin>>v1,v2,w;
          G[v1][v2]=w;
           G[v2][v1]=w;
          }
}

用邻接表表示图

邻接表:G[N]为指针数组,对应矩阵每行一个链表,只存非0元素。

typedef struct GNode *ptrToGNode;
struct GNode{
      int Nv;//顶点数
       int Ne;//边数
      AdjList G;//邻接表
};
typedef ptrToGNode LGraph;//以邻接表方式存储的图类型
typedef struct Vnode{
       ptrToAdjVNode FirstEdge;
       DataType Data;
}  AdjList[MaxVertexNum];
typedef struct AdjVNode *ptrToAdjVNode;
struct AdjVNode{
      Vertex AdjV;
      WeightType Weight;
      ptrToAdjVNode Next;
};

LGraph初始化

初始化一个有VertexNum个顶点但没有边的图

typedef int Vertex;
LGraph CreateGraph(int VertexNum)
{  Vertex V,W;
   LGraph Graph;
   Graph=(LGraph)malloc(sizeof(struct GNode));
    Graph->Nv=VertexNum;
     Graph->Ne=0;
     for(v=0;v<Graph->Nv;v++)
         Graph->G[v].FirstEdge=NULL;
      return Graph;
}

向LGraph中插入边

void InsertEdge(LGraph Graph,Edge E)
{   ptrToAdjVNode NewNode;
    NewNode=(PtrToAdjVNode)malloc(sizeof(struct AdjVNode));//插入边<v1,v2>,为v2建立新的邻接点
     NewNode->AdjV=E->V2;
     NewNode->Weight=E->weight;
     NewNode->Next=Graph->G[E->V1].FirstEdge;//将v2插入v1的表头
     Graph->G[E->V1].FirstEdge=NewNode;
NewNode=(PtrToAdjVNode)malloc(sizeof(struct AdjVNode));
 NewNode->AdjV=E->V1;
NewNode->Weight=E->weight;
NewNode->Next=Graph->G[E->V2].FirstEdge;//将v1插入v2的表头
 Graph->G[E->V2].FirstEdge=NewNode;
}

完整地建立一个LGraph


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值