赞
踩
#include<stdio.h> #include<stdlib.h> #define MaxVertexNum 100 typedef int weightType; typedef int Vertex; typedef int DataType; typedef struct GNode *ptrToGNode; struct GNode{ // 图 int Nv; // 顶点数 int Ne; // 边数 weightType G[MaxVertexNum][MaxVertexNum]; DataType Data[MaxVertexNum]; // 存顶点的数据 }; typedef ptrToGNode MGraph; typedef struct ENode *ptrToENode; struct ENode{ // 边 Vertex V1,V2; // 有向边<V1,V2> weightType Weight; // 权重 }; typedef ptrToENode Edge; // 初始化图 MGraph Create(int VertexNum){ Vertex v,w; MGraph Graph; Graph = (MGraph)malloc(sizeof(struct GNode)); Graph->Nv = VertexNum; Graph->Ne = 0; for(v=0;v<VertexNum;v++) for(w=0;w<VertexNum;w++) Graph->G[v][w] = 0; return Graph; } // 插入边 MGraph Insert(MGraph Graph,Edge E){ // 插入边 <V1,V2> Graph->G[E->V1][E->V2] = E->Weight; // 如果是无向图,还需要插入边 <V2,V1> Graph->G[E->V2][E->V1] = E->Weight; } // 建图 MGraph BuildGraph(){ MGraph Graph; Edge E; Vertex V; int Nv,i; scanf("%d",&Nv); // 读入顶点数 Graph = Create(Nv); scanf("%d",&(Graph->Ne)); // 读入边数 if(Graph->Ne != 0){ E = (Edge)malloc(sizeof(struct ENode)); for(i=0;i<Graph->Ne;i++){ scanf("%d %d %d",&E->V1,&E->V2,&E->Weight); // 读入每个边的数据 Insert(Graph,E); } } return Graph; } // 遍历图 void print(MGraph Graph){ Vertex v,w; for(v=0;v<Graph->Nv;v++){ for(w=0;w<Graph->Nv;w++) printf("%d ",Graph->G[v][w]); printf("\n"); } } int main(){ MGraph Graph; Graph = BuildGraph(); print(Graph); return 0; }
#include<stdio.h> #include<stdlib.h> #define MaxVertexNum 100 typedef int Vertex; typedef int DataType; typedef int weightType; typedef struct ENode *ptrToENode; struct ENode{ // 边 Vertex V1,V2; // 有向边<V1,V2> weightType Weight; // 权重 }; typedef ptrToENode Edge; typedef struct AdjVNode *ptrToAdjVNode; struct AdjVNode{ // 邻接表内元素 Vertex AdjV; // 邻接点下标 weightType Weight; // 权值 ptrToAdjVNode Next; // 下一个 }; typedef struct VNode{ // 邻接表头 ptrToAdjVNode FirstEdge; // 存每个顶点指针 DataType Data; // 顶点数据 }AdjList[MaxVertexNum]; typedef struct GNode *ptrToGNode; struct GNode{ // 图 int Nv; // 顶点 int Ne; // 边数 AdjList G; // 邻接表 }; typedef ptrToGNode LGraph; // 初始化 LGraph create(int VertexNum){ Vertex v,w; LGraph Graph; Graph = (LGraph)malloc(sizeof(struct GNode)); Graph->Nv = VertexNum; // 初始化边 Graph->Ne = 0; // 初始化点 // 每条边的 FirstEdge 指向 NULL for(v=0;v<Graph->Nv;v++) Graph->G[v].FirstEdge = NULL; return Graph; } // 插入一条边到邻接表的顶点指针之后 void InsertEdge(LGraph Graph,Edge E){ ptrToAdjVNode newNode; /**************** 插入边<V1,V2> ******************/ // 为 V2 建立新的结点 newNode = (ptrToAdjVNode)malloc(sizeof(struct AdjVNode)); newNode->AdjV = E->V2; newNode->Weight = E->Weight; // 将 V2 插入到邻接表头 newNode->Next = Graph->G[E->V1].FirstEdge; Graph->G[E->V1].FirstEdge = newNode; /*************** 若为无向图,插入边<V2,V1> *************/ newNode = (ptrToAdjVNode)malloc(sizeof(struct AdjVNode)); newNode->AdjV = E->V1; newNode->Weight = E->Weight; newNode->Next = Graph->G[E->V2].FirstEdge; Graph->G[E->V2].FirstEdge = newNode; } // 建图 LGraph BuildGraph(){ LGraph Graph; Edge E; Vertex V; int Nv,i; scanf("%d",&Nv); Graph = create(Nv); scanf("%d",&(Graph->Ne)); if(Graph->Ne != 0){ for(i=0;i<Graph->Ne;i++){ E = (Edge)malloc(sizeof(struct ENode)); scanf("%d %d %d",&E->V1,&E->V2,&E->Weight); InsertEdge(Graph,E); } } return Graph; } // 打印 void print(LGraph Graph){ Vertex v; ptrToAdjVNode tmp; for(v=0;v<Graph->Nv;v++){ tmp = Graph->G[v].FirstEdge; printf("%d ",v); while(tmp){ printf("%d ",tmp->AdjV); tmp = tmp->Next; } printf("\n"); } } int main(){ LGraph Graph; Graph = BuildGraph(); print(Graph); return 0; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。