1 #include "000库函数.h"
2 //无向图
3
4 #define MAXSIZE 9 /* 存储空间初始分配量 */
5 #define MAXEDGE 15
6 #define MAXVEX 9
7 #define INFINITY 65535
8
9 typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等 */
10 typedef int Boolean; /* Boolean是布尔类型,其值是TRUE或FALSE */
11
12 typedef char VertexType; /* 顶点类型应由用户定义 */
13 typedef int EdgeType; /* 边上的权值类型应由用户定义 */
14
15 struct MGraph {//临接矩阵参数
16 VertexType vexs[MAXVEX];
17 EdgeType arc[MAXVEX][MAXVEX];
18 int numVertexes, numEdges;
19 };
20
21 struct EdgeNode {//邻接表
22 int adjvex;//节点
23 EdgeType wt;//权重
24 struct EdgeNode *next;//指针
25 };
26
27 struct VertexNode {//顶点表节点
28 int in;//节点的入度
29 VertexType data;
30 EdgeNode *firstedge;
31 };
32
33 struct GraphAdjList {
34 VertexNode adjList[MAXVEX];
35 int numNodes, numEdges;
36 };
37
38 void CreateMGraph(MGraph **G) {
39 (*G) = new MGraph;
40 (*G)->numEdges = 15;
41 (*G)->numVertexes = 9;
42 /* 读入顶点信息,建立顶点表 */
43 (*G)->vexs[0] = 'A';
44 (*G)->vexs[1] = 'B';
45 (*G)->vexs[2] = 'C';
46 (*G)->vexs[3] = 'D';
47 (*G)->vexs[4] = 'E';
48 (*G)->vexs[5] = 'F';
49 (*G)->vexs[6] = 'G';
50 (*G)->vexs[7] = 'H';
51 (*G)->vexs[8] = 'I';
52
53
54 for (int i = 0; i < (*G)->numVertexes; ++i)/* 初始化图 */
55 {
56 for (int j = 0; j < (*G)->numVertexes; ++j)
57 {
58 (*G)->arc[i][j] = 0;
59 }
60 }
61
62 (*G)->arc[0][1] = 1;
63 (*G)->arc[0][5] = 1;
64
65 (*G)->arc[1][2] = 1;
66 (*G)->arc[1][8] = 1;
67 (*G)->arc[1][6] = 1;
68
69 (*G)->arc[2][3] = 1;
70 (*G)->arc[2][8] = 1;
71
72 (*G)->arc[3][4] = 1;
73 (*G)->arc[3][7] = 1;
74 (*G)->arc[3][6] = 1;
75 (*G)->arc[3][8] = 1;
76
77 (*G)->arc[4][5] = 1;
78 (*G)->arc[4][7] = 1;
79
80 (*G)->arc[5][6] = 1;
81
82 (*G)->arc[6][7] = 1;
83
84
85 for (int i = 0; i < (*G)->numVertexes; ++i)/* 初始化图 */
86 {
87 for (int j = 0; j < (*G)->numVertexes; ++j)
88 {
89 (*G)->arc[j][i] = (*G)->arc[i][j];
90 }
91 }
92
93 }
94
95
96 //构建临接表
97 void CreateALGraph(MGraph *G, GraphAdjList **GL) {
98 (*GL) = new GraphAdjList;
99 (*GL)->numEdges = G->numEdges;
100 (*GL)->numNodes = G->numVertexes;
101 for (int i = 0; i < G->numVertexes; ++i) {
102 (*GL)->adjList[i].data = G->vexs[i];
103 (*GL)->adjList[i].firstedge = NULL;
104 (*GL)->adjList[i].in = 0;
105 }
106 for (int i = 0; i < G->numVertexes; ++i) {
107 for (int j = 0; j < G->numVertexes; ++j) {
108 if (G->arc[i][j] != 0) {
109 EdgeNode *p = new EdgeNode;
110 p->adjvex = j;
111 p->wt = 1;
112 p->next = (*GL)->adjList[i].firstedge;
113 (*GL)->adjList[i].firstedge = p;
114 (*GL)->adjList[i].in += 1;
115 }
116 }
117 }
118
119 }
120 //深度遍历
121 vector<char>DFSRes;
122 void DFS(GraphAdjList *GL, vector <bool>&flag, EdgeNode *p) {
123 if (DFSRes.size() == GL->numNodes)return;
124 while (p) {
125 if (flag[p->adjvex]) {
126 DFSRes.push_back(GL->adjList[p->adjvex].data);//第一遍入栈,用来判断的
127 flag[p->adjvex] = false;
128 p = GL->adjList[p->adjvex].firstedge;//下一个点
129 DFS(GL, flag, p);
130 DFSRes.pop_back();//弹出栈,让后面回溯回来的元素入栈!
131 }
132 else
133 p = p->next;
134 }
135 }
136
137 void DFSTraverse(GraphAdjList *GL) {
138 vector<bool>flag(GL->numNodes, true);//标志
139 for (int i = 0; i < GL->numNodes; ++i) {
140 DFSRes.push_back(GL->adjList[i].data);
141 flag[i] = false;
142 EdgeNode *p = GL->adjList[i].firstedge;
143 DFS(GL, flag, p);
144 }
145 cout << "/*****DFS*****/" << endl;
146 for (auto a : DFSRes)
147 cout << a << "->";
148 cout << endl;
149 }
150
151
152 //广度遍历
153 vector<char>BFSRes;
154 deque<int>dq;//压入节符号
155
156 void BFS(GraphAdjList *GL, EdgeNode *p, vector<bool>&flag) {
157 BFSRes.push_back(GL->adjList[dq.front()].data);
158 dq.pop_front();
159 while (p) {
160 if (flag[p->adjvex]) {//未遍历过
161 flag[p->adjvex] = false;
162 dq.push_back(p->adjvex);
163 }
164 p = p->next;
165 }
166 if (dq.empty())return ;
167 BFS(GL, GL->adjList[dq.front()].firstedge, flag);//下一个表
168 }
169
170
171 void BFSTraverse(GraphAdjList *GL) {
172 vector<bool>flag(GL->numNodes, true);//访问标志
173 dq.push_back(0);
174 flag[0] = false;
175 BFS(GL, GL->adjList[dq.front()].firstedge, flag);
176 cout << "/*****BFS*****/" << endl;
177 for (auto b : BFSRes)
178 cout << b << "->";
179 cout << endl;
180 }
181
182
183
184 int T023(void)
185 {
186 MGraph *G;
187 GraphAdjList *GL;
188 CreateMGraph(&G);
189 CreateALGraph(G, &GL);
190
191 //printf("\n深度遍历:");
192 //DFSTraverse(GL);
193 printf("\n广度遍历:");
194 BFSTraverse(GL);
195 return 0;
196 }