用邻接表表示图

 1 //用邻接表表示图
 2 #include <stdio.h>
 3 #include <stdlib.h>
 4  
 5 #define DataType char
 6 #define MaxVertexNum 20
 7 #define Vertex int
 8 #define WeightType int
 9 typedef struct GNode *PtrToGNode;
10 struct  GNode
11 {
12     int Nv;            //顶点数
13     int Ne;            //边数
14     AdjList G;        //邻接表
15 };
16  
17 struct ENode{
18     Vertex v1, v2;
19     int weight;
20 };
21  
22 typedef struct ENode* Edge;
23  
24 typedef PtrToGNode LGraph;    //以邻接表方式存储的图类型
25  
26 typedef struct Vnode {
27     PtrToAdjVNode FirstEdge;
28     DataType Data; //存顶点的数据
29 }AdjList[MaxVertexNum];
30  
31 typedef struct AdjVNode *PtrToAdjVNode;
32 struct AdjVNode {
33     Vertex AdjV;            //邻接点下标
34     WeightType Weight;        //边的权重
35     PtrToAdjVNode Next;        
36 };
37  
38 //初始化一个有VertexNum个顶点但没有边的图
39  
40 LGraph CreateGraph(int VertexNum)
41 {
42     Vertex v;
43     LGraph Graph;
44     Graph = (LGraph)malloc(sizeof(struct GNode));
45     Graph->Nv = VertexNum;
46     Graph->Ne = 0;
47  
48     for (v = 0; v < Graph->Nv; v++)
49         Graph->G[v].FirstEdge = NULL;
50  
51     return Graph;
52 }
53  
54 void InsertEdged(LGraph Graph, Edge E)
55 {
56     PtrToAdjVNode NewNode;
57     NewNode = (PtrToAdjVNode)malloc(sizeof(struct AdjVNode));
58     NewNode->AdjV = E->v2;
59     NewNode->Weight = E->weight;
60  
61     //将v2插入v1的表头
62     NewNode->Next = Graph->G[E->v1].FirstEdge;
63     Graph->G[E->v1].FirstEdge = NewNode;
64  
65     //若是无向图,还要插入边<v2, v1>
66     //为v1建立新的邻接点
67     NewNode = (PtrToAdjVNode)malloc(sizeof(struct AdjVNode));
68     NewNode->AdjV = E->v1;
69     NewNode->Weight = E->weight;
70     //将v1插入v2的表头
71     NewNode->Next = Graph->G[E->v2].FirstEdge;
72     Graph->G[E->v2].FirstEdge = NewNode;
73 }

猜你喜欢

转载自www.cnblogs.com/hi3254014978/p/9543200.html