1 #include <iostream>
2 #include <queue>
3
4 using namespace std;
5
6 #define MaxVertexNum 10
7 typedef int Vertex;
8 typedef int WeightType;
9 typedef char DataType;
10
11 bool Visited[MaxVertexNum] = { false };
12
13 //边的定义
14 typedef struct ENode
15 {
16 Vertex V1, V2; //有向边<V1,V2>
17 WeightType Weight; //权重
18 }*Edge;
19
20 //邻接点的定义
21 typedef struct AdjVNode
22 {
23 Vertex AdjV; //邻接点下标
24 WeightType Weight; //边权重
25 struct AdjVNode *Next; //指向下一个邻接点的指针
26 }*PtrToAdjVNode;
27
28 //顶点表头结点的定义
29 typedef struct VNode
30 {
31 /* DataType Data; //存顶点的数据,很多情况下,顶点无数据,此时Data可以不用出现 */
32 struct AdjVNode *FirstEdge; //边表头指针
33 }AdjList[MaxVertexNum];
34
35 //图结点的定义
36 typedef struct GNode
37 {
38 int Nv; //顶点数
39 int Ne; //边数
40 AdjList G; //邻接表表示的图
41 }*LGraph;
42
43
44 LGraph BuildGraph(int vertex_num, int edge_num)
45 {
46 LGraph Graph = (LGraph)malloc(sizeof(struct GNode));
47 Graph->Nv = vertex_num;
48 Graph->Ne = edge_num;
49 for (int i = 0; i < Graph->Nv; ++i)
50 Graph->G[i].FirstEdge = NULL; //初始化所有表头指针为NULL
51
52 Edge E = (Edge)malloc(sizeof(struct ENode));
53 for (int i = 0; i < Graph->Ne; ++i)
54 {
55 printf("请输入第%d条边的起点和终点:", i+1);
56 cin >> E->V1 >> E->V2;
57 E->Weight = 1;
58
59
60 //这种插入方法将会使下标大的在前,小的在后,所以遍历的时候下标大的会先遍历
61 //插入边<V1,V2>
62 PtrToAdjVNode NewNode1 = (PtrToAdjVNode)malloc(sizeof(struct AdjVNode));
63 NewNode1->AdjV = E->V2;
64 NewNode1->Weight = E->Weight;
65 NewNode1->Next = Graph->G[E->V1].FirstEdge;
66 Graph->G[E->V1].FirstEdge = NewNode1;
67
68 //无向图,还要插入边<V2,V1>
69 PtrToAdjVNode NewNode2 = (PtrToAdjVNode)malloc(sizeof(struct AdjVNode));
70 NewNode2->AdjV = E->V1;
71 NewNode2->Weight = E->Weight;
72 NewNode2->Next = Graph->G[E->V2].FirstEdge;
73 Graph->G[E->V2].FirstEdge = NewNode2;
74 }
75
76 return Graph;
77 }
78
79 void Visit(LGraph Graph, Vertex V)
80 {
81 cout << V << ' ';
82 }
83
84 void ClearVisited()
85 {
86 for (int i = 0; i < MaxVertexNum; ++i)
87 Visited[i] = false;
88 }
89
90 void DFS(LGraph Graph, Vertex V)
91 {
92 Visit(Graph, V);
93 Visited[V] = true;
94
95 for (PtrToAdjVNode p = Graph->G[V].FirstEdge; p != NULL; p = p->Next)
96 {
97 if (!Visited[p->AdjV])
98 DFS(Graph, p->AdjV);
99 }
100 }
101
102 void BFS(LGraph Graph, Vertex V)
103 {
104 Visit(Graph, V);
105 Visited[V] = true;
106 queue<Vertex> Q;
107 Q.push(V);
108
109 while(!Q.empty())
110 {
111 Vertex W = Q.front();
112 Q.pop();
113 for (PtrToAdjVNode p = Graph->G[W].FirstEdge; p != NULL; p = p->Next)
114 {
115 if (!Visited[p->AdjV])
116 {
117 Visit(Graph, p->AdjV);
118 Visited[p->AdjV] = true;
119 Q.push(p->AdjV);
120 }
121 }
122 }
123 }
124
125 int main()
126 {
127 int nv, ne;
128 cout << "请输入图的顶点数与边数:";
129 cin >> nv >> ne;
130 LGraph Graph = BuildGraph(nv, ne);
131 cout << endl;
132 cout << "请输入遍历起点:";
133 Vertex V;
134 cin >> V;
135 cout << "DFS: ";
136 DFS(Graph, V);
137 ClearVisited();
138 cout <<endl;
139 cout << "BFS: ";
140 BFS(Graph, V);
141
142
143 return 0;
144 }
输出: