图的遍历

来源:互联网 发布:剑灵蒂法捏脸数据 编辑:程序博客网 时间:2024/06/10 15:38
  1. /* 图的邻接矩阵表示法 */
#include <stdio.h>  #include <stdlib.h>  #include <string.h>  #define MaxVertexNum 100#define INFINITY 65535struct ENode{int v1,v2;/*有向边 <v1,v2>*/int weight;/*权重*/};typedef struct ENode *PtrToENode;struct GNode{int Nv;/*图中顶点个数*/int Ne;/*图中边的条数*/int G[MaxVertexNum][MaxVertexNum];/*邻接矩阵*/char Data[MaxVertexNum];/* 存顶点的数据 */ /* 注意:很多情况下,顶点无数据,此时Data[]可以不用出现 */};typedef struct GNode *PtrToGNode;PtrToGNode CreateGraph(int VertexNum)/*初始化一个有VertexNum个顶点,但没有边的图*/{int V,W;PtrToGNode Graph = (PtrToGNode)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] = INFINITY;}}return Graph;}void Insert(PtrToGNode Graph, PtrToENode E){Graph->G[E->v1][E->v2] = E->weight; /* 插入边 <V1, V2> */Graph->G[E->v2][E->v1] = E->weight;/* 若是无向图,还要插入边<V2, V1> */}PtrToGNode Build(){int V,Nv;scanf("%d",&Nv);PtrToGNode Graph = CreateGraph(Nv);scanf("%d",&Graph->Ne);if(Graph->Ne != 0){PtrToENode E = (PtrToENode)malloc(sizeof(struct ENode));for(int i = 0; i < Graph->Ne; i++)/*把每条边的信息插入到图中去*/{scanf("%d %d %d",&E->v1,&E->v2,&E->weight);Insert(Graph,E);}} for(int i = 0 ; i < Graph->Nv; i++) { scanf(" %c",&Graph->Data[i]); } return Graph;}


  1. /* 图的邻接表表示法 */

#include <stdio.h>  #include <stdlib.h>  #include <string.h>  #define MaxVertexNum 100#define INFINITY 65535/*边的定义*/ struct ENode{int v1,v2;int weight;};typedef struct ENode *PtrToENode;/* 邻接点的定义 */struct AdjVNode{int Adjv;int weight;struct AdjVNode *next;};typedef struct AdjVNode *PtrToAdjVNode;/*每个顶点都是一个表头结点*/typedef struct FirstVNode{PtrToAdjVNode FirstEdge;char Data;/*Data 可以是其他类型*/}Adjlist[MaxVertexNum];/*图结点的定义*/struct GNode{int Nv;int Ne;Adjlist G;};typedef struct GNode *PtrToGNode;PtrToGNode CreateGraph(int VertexNum){PtrToGNode Graph = (PtrToGNode)malloc(sizeof(struct GNode));Graph->Nv = VertexNum;Graph->Ne = 0;for(int i = 0; i < Graph->Nv; i++){Graph->G[i].FirstEdge = NULL;}return Graph;}void Insert(PtrToGNode Graph, PtrToENode E){PtrToAdjVNode NewNode;/*为v2建立新的邻结点*/NewNode = (PtrToAdjVNode)malloc(sizeof(struct AdjVNode));NewNode->Adjv = E->v2;NewNode->weight = E->weight;/*将v2插入v1的表头,类似于链表的插入操作*/NewNode->next = Graph->G[E->v1].FirstEdge;Graph->G[E->v1].FirstEdge = NewNode;/*为v2建立新的邻结点*/NewNode = (PtrToAdjVNode)malloc(sizeof(struct AdjVNode));NewNode->Adjv = E->v1;NewNode->weight = E->weight;/*将v2插入v1的表头*/NewNode->next = Graph->G[E->v2].FirstEdge;Graph->G[E->v2].FirstEdge = NewNode;}PtrToGNode Build(){int V,W;int Nv;scanf("%d",&Nv);PtrToGNode Graph = CreateGraph(Nv);scanf("%d",&Graph->Ne);if(Graph->Ne != 0){PtrToENode E = (PtrToENode)malloc(sizeof(struct ENode));for(int i = 0 ; i < Graph->Ne; i++){scanf("%d %d %d",&E->v1,&E->v2,&E->weight);}Insert(Graph,E);}return Graph;}



0 0
原创粉丝点击