数据结构lab3-图型结构的建立与搜索

课程名称:数据结构与算法

课程类型:必修

实验项目:图型结构的建立与搜索

实验题目:图的存储结构的建立与搜索

实验日期:2021.11.10

班级:2003001

学号:120L021011

姓名:石卓凡

一、实验目的

1. 掌握图的邻接矩阵、邻接表等不同存储形式的表示方法。

2. 掌握图的两种不同遍历方法的基本思想并能编程实现。

3. 掌握构造最小生成树的两种算法思想,并能编程实现。

4. 掌握求单源最短路径和任意两顶点之间的最短路径的算法。

5. 掌握求关键路径的算法,并能编程实现。

6. 能够灵活运用图的相关算法解决相应的实际问题。

二、****实验要求及实验环境

1****.分别实现图的邻接矩阵、邻接表存储结构的建立算法,分析和比较各建立算法的时间复杂度以及存储结构的空间占用情况;

2****.实现图的邻接矩阵、邻接表两种存储结构的相互转换算法;

3.在上述两种存储结构上,分别实现图的深度优先搜索(递归和非递归**)广度优先搜索算法。并以适当的方式存储和显示相应的搜索结果(深度优先或广度优先生成森林(或生成树)、深度优先或广度优先序列和编号);**

4分析搜索算法的时间复杂度;

5.以文件形式输入图的顶点和边,并显示相应的结果。要求顶点不少于10个,边不少于13****个;

6****.软件功能结构安排合理,界面友好,便于使用。

实验环境:

操作系统:Win7/Win10

集成开发环境:devcpp++

外部库:暂无

三、设计思想(本程序中的用到的所有数据类型的定义,主程序的流程图及各程序模块之间的调用关系)

数据类型定义

typedef struct TNode {

char Data; //结点数据

int Parent; //该结点双亲再数组中的下标

}TNode;

typedef struct Tree{

TNode node[MaxVNode]; //结点数组

int numTNode; //结点数量

}Tree;

Tree T;

typedef struct MatGraph//有向图的邻接矩阵

{

char VNode[MaxVNode];

int ENode[MaxVNode][MaxVNode];

int numENode;

int numVNode;

}MatGraph;

typedef struct ENode

{

int AdjV;//这条边的终点顶点对应的下标

int Weight;

struct ENode *Next;//链域,有着同一个起点的下一条边

}ENode;

typedef struct VNode

{

char Data;

ENode* FirstENode;//由该顶点V出发的第一条边

}VNode,AdjList[MaxVNode];

typedef struct ALGraph//有向图的邻接表

{

AdjList adjlist;

int numVNode;

int numENode;

}ALGraph;//ALGraph

1.本系统总计设计了23个函数,每个函数的功能和接口设计如下表所示:

序号 函数名 函数功能 函数参数 函数返回值
1 Main 根据order执行各函数
2 InitMatGraph 初始化Mat MatGraph &G NULL
3 InsertVNode 前序遍历 MatGraph &G,char V NULL
4 InsertENode 有向图MatG插入边 MatGraph &G,char V,char W,int Weight NULL
5 CreatMatGraph 读入边和顶点建立邻接矩阵 MatGraph &G NULL
6 Mat_DFS MatGraoh的DFS MatGraph G,int start NULL
7 Mat_BFS MatGraoh的BFS MatGraph G,int start NULL
8 ShowMatGraph 进行展示邻接矩阵 MatGraph G NULL
9 ShowALGraph 进行展示邻接表 ALGraph* G NULL
10 Mat_DFS_Tree 邻接矩阵DFS用树展示 MatGraph G,int start NULL
11 Mat_DFS_BianHao 邻接矩阵DFS用编号展示 MatGraph G,int start,int count,int arr[]) NULL
12 Mat_BFS_Tree 邻接矩阵BFS用树展示 MatGraph G,int start NULL
13 Mat_BFS_BianHao 邻接矩阵DFS用编号展示 MatGraph G,int start,int count,int arr[] NULL
14 AL_DFS_Tree 邻接表DFS用树展示 ALGraph* G,int v NULL
15 AL_DFS_BianHao 邻接表DFS用编号展示 ALGraph* G,int v,int count,int arr[] NULL
16 AL_BFS_Tree 邻接表BFS用树展示 ALGraph* G,int v NULL
17 AL_BFS_BianHao 邻接表BFS用编号展示 ALGraph* G,int v,int count,int arr[] NULL
18 InitialTree 初始化树 NULL NULL
19 ShowTree 展示树 (MatGraph &G) NULL
20 Mat_DFS_FeiDiGui 邻接矩阵DFS非递归 MatGraph MatG,int start
21 AL_DFS_FeiDiGui 邻接表DFS非递归 ALGraph* ALG,int start
22 ListToMat 已知邻接表G ,转为邻接矩阵MatG MatGraph &MatG,ALGraph* &ALG
23 MatToList 已知MatGraph邻接矩阵 有向图 转为 邻接表 MatGraph MatG,ALGraph* &ALG

2.逻辑设计

(1)邻接矩阵的建立

​ 1.打开文件,并且初始化InitMatGraph(G);

2.读入顶点个数

2.1 进行循环对应次数读入顶点V,用InsertVNode(G,V);插入顶点

3.读入边个数

3.1 进行循环对应次数读入边V1-V2,权重,利用InsertENode(G,V1,V2,weight);插入边

\4. ShowMatGraph(G)进行展示邻接矩阵

(2)邻接表的建立

1.打开文件

2.读入顶点个数,并且读入边个数

3.for循环依次读入G->adjlist[i].Data,并且将G->adjlist[i].FirstENode=NULL;

4.for循环依次读入边V1-V2以及权重Weight

4.1 新生成一个ENode* E赋值V1,V2,Weight,利用头插法插入邻接表

5.ShowALGraph(G)进行展示邻接表

(3)邻接矩阵的DFS递归

1.访问头元素并且标记为已访问

2.遍历所有的和源元素相关的元素,如果为没有被访问,递归的搜索该顶点;

(4)邻接矩阵的DFS非递归

1.初始化栈

2.将头元素进栈,并且cout,记录已访问

3.循环直到栈为空

3.1 读取栈顶元素

3.2遍历所有能和当前栈顶元素有关的顶点 , 对当前没有访问过的且有边连接的顶点访问和进栈

3.3对与已经遍历完所有能和当前栈顶元素有关的顶点之后,进行出栈

(5)邻接矩阵的BFS

\1. 初始化队列

\2. 对头元素进行进队并且cout和标记已访问

\3. 循环直到队列为空

3.1 v=队列头元素,并且出队

3.2 For循环遍历所有与v相关的顶点,找到有边相连接且没有访问过的顶点进行访问,压栈,并且标记已访问

(6)邻接表的DFS递归

\1. 访问头元素,并且标记为已访问

\2. 遍历所有的和头元素相关的元素,如果为被访问,递归的搜索该顶点;

(7)邻接表的DFS非递归

\1. 初始化栈

\2. 对于头元素进行访问,并且标记已访问,新建立边E,赋值为头元素的FirstENode

\3. While循环直到E为空且栈为空

3.1while循环直到E为空

3.1.1不断对尚未访问的并且可以访问到更深的顶点进行访问

3.1.2对于已经访问过的顶点时候,进行E转为同一个起点顶点的另一条边

3.2当由最初的结点的所有路都遍历完之后,出栈,E等于栈顶元素

(8)邻接表的BFS

\1. 初始化队列

\2. 将头元素结点v进行入队Q,并且访问,且设置为已经访问

\3. While直到Q为空

3.1 temp=队列头元素,进行出队,E等于G->adjlist[temp].FirstENode

3.2 While直到E为空

3.2.1如果边E指向的终点顶点E->AdjV并没有访问过,如果可以访问则进行访问并且对于合适的进入入队

3.2.2 E=E->Next;E更新为同一个出发顶点的下一条边

(9)已知有向图邻接表转为邻接矩阵

\1. 初始化邻接矩阵

\2. 遍历邻接表的每一个顶点,顶点存入邻接矩阵

2.1 E = ALG->adjlist[i].FirstENode;

2.2 while循环将E及其E所有的同一个起点顶点的边都存入邻接矩阵

(10) 有向图邻接矩阵转为邻接表

\1. 初始化邻接表

\2. 遍历邻接矩阵的每一个顶点

2.1 存储顶点进入邻接表

2.2 再次遍历所有顶点,去寻找有无对应的边,并且存储这个顶点所有相关的边进入邻接表

(11) 生成树展示

1.同DFS和BFS遍历框架和大体流程一样

2.但是把访问结点cout改为记录当前Data保存到T.node[i].Data,并且记录对应父节点下标保存至T.node[i].Parent,同时T.numTNode++;

(12) 编号展示

\1. 同DFS和BFS遍历框架和大体流程一样

\2. 多设置了int count记录当前第几个访问,与此同时传入数组int arr[],arr[i]=x代表了下标为i的对应的结点出现的编号是x

3.物理设计

1.生成树Tree用到双亲表示法的顺序存储,Tree内包含了TNode node[MaxVNode]的节点数组,用于记录节点个数的int numTNode;而每一个TNode里面有char型的Data记录值,有int Parent记录当前结点的父节点的下标

2.有向图邻接矩阵MatGraph,有char型的VNode[MaxVNode]顶点结点数组,int型ENode[MaxVNode][MaxVNode]边结点数组;int型numENode记录有多少个边;int型numVNode记录有多少个顶点;

3.有向图邻接表ALGraph,有数据类型为VNode型的数组adjlist;

记录有多少个顶点个数的int型的numVNode;

记录有多少个边个数int型numENode;

而VNode内部,定义了Char型的Data,记录值。定义了ENode* FirstENode,作为该顶点V出发的第一条边

而ENode内部,定义了int型AdjV,记录了这一条边指向的终点顶点,int Weight记录这条边的权值,struct ENode *Next记指向与这一条边有着相同起点顶点的下一条边的地址

4.stack栈用链式存储,栈有指向头节点的指针Node *head指向最初进入的元素(栈底),指向尾结点的Node *p,p指向栈顶最新进入的元素,记录栈元素数量的int length,而每个Node节点有对应数据类型的data,指向下一个结点的Node *next,

5.queue队列用链式存储,有指向队首的指针Node *head,指向队尾的指针Node *rear,记录队列元素多少的int length,而每一个Node结点内部都有,对应数据类型的data,指向下一个结点的Node *next

4主程序流程图及各程序模块之间的调用关系

流程图img

调用关系

img

5.时空复杂度比较分析

(1)有向图邻接矩阵和邻接表存储结构建立算法:

邻接矩阵 邻接表
时间复杂度 O(n²) O(n+e)
空间复杂度 O(n²) O(n+e)
适用范围 稠密图 稀疏图

(2)搜索算法

邻接矩阵 邻接表
深度 广度 深度 广度
时间复杂度 img img img img

四、****测试结果

测试样例1:

img

imgimgimgimgimgimg

测试样例2:

imgimgimgimgimg

五、经验体会与不足

1.经验体会

1.在图的DFS类似于二叉树的先序遍历算法,因此在非递归时候都需要利用到栈来实现

2.非递归算法就是将递归算法用循环和借助栈或者队列来进行操作实现,递归算法更加简洁易懂,非递归算法有助于进一步理解

3.树可以说是一种特殊的图,树是有向无环的特殊的图

4.对于图的邻接矩阵和邻接表,在作为函数传参时候会根据自己的定义有所区别,比如邻接表传入指针型,传入参数时候(MatGraph &G)可以根据自己的需要选择是否要加入&

2.过程暴露的不足:

1.在实现广搜和深搜的生成树时候,如何利用现有的DFS,BFS序列表示修改没有思路

解决方法:将树的存储模式改为双亲表示法的顺序存储

2.如何利用现有的DFS和BFS序列修改为编号表示

解决方法:新建立数组arr[]表示第几次访问到的,同时插入count计数

六、附录:源代码(带注释)

\

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
#include<iostream>

\#include<stdlib.h>

\#include<stdio.h>

\#include<cstring>

\#include<assert.h>

using namespace std;

\#define INF -1

\#define MaxVNode 100

int visited[MaxVNode];



typedef struct TNode {

char Data; //结点数据

int Parent; //该结点双亲再数组中的下标

}TNode;



typedef struct Tree{

​ TNode node[MaxVNode]; //结点数组

int numTNode; //结点数量

}Tree;

Tree T;

typedef struct MatGraph//先按照有向图做

{

char VNode[MaxVNode];

int ENode[MaxVNode][MaxVNode];

int numENode;

int numVNode;

}MatGraph;

typedef struct ENode

{

int AdjV;//这条边的终点顶点对应的下标

int Weight;

struct ENode *Next;//链域,有着同一个起点的下一条边



}ENode;

typedef struct VNode

{

char Data;

​ ENode* FirstENode;//由该顶点V出发的第一条边

}VNode,AdjList[MaxVNode];

typedef struct ALGraph

{

​ AdjList adjlist;

int numVNode;

int numENode;

}ALGraph;//ALGraph

template<class T>class stack

{

private:

struct Node

​ {

​ T data;

​ Node *next;

​ };

​ Node *head;

​ Node *p;

int length;



public:

​ stack()

​ {

​ head = NULL;

​ length = 0;

​ }

​ void push(T n)//入栈

​ {

​ Node *q = new Node;

​ q->data = n;

if (head == NULL)

​ {

​ q->next = head;

​ head = q;

​ p = q;

​ }

else

​ {

​ q->next = p;

​ p = q;

​ }

​ length++;

​ }



​ void pop()//出栈 不会!!并且不会!!!将出栈的元素返回

​ {

if (length <= 0)

​ {

​ abort();

​ }

​ Node *q;

​ T data;

​ q = p;

​ data = p->data;

​ p = p->next;

​ delete(q);

​ length--;

​ }

int size()//返回元素个数

​ {

​ return length;

​ }

​ T top()//返回栈顶元素

​ {

​ return p->data;

​ }

bool empty()//判断栈是不是空的

​ {

if (length == 0)

​ {

​ return true;

​ }

else

​ {

​ return false;

​ }

​ }

};

template<class T>class queue

{

private:

struct Node

​ {

​ T data;

​ Node *next;

​ };

​ Node *head;//!

​ Node *rear;//!队尾

int length;



public:

​ queue()

​ {

​ head = NULL;

​ rear = NULL;//!初始化

​ length = 0;

​ }

​ void push(T n)//入队

​ {

​ Node *node = new Node;

​ node->data = n;

​ node->next = NULL;//!

if (head == NULL)

​ {

​ head = node;

​ rear = node;

​ }

else

​ {

​ rear->next = node;

​ rear = node;

​ }

​ length++;

​ }

​ void pop()//出栈 不会!!并且不会!!!将出栈的元素返回

​ {

if (length <= 0)

​ {

​ abort();

​ }

​ Node *temp = head;

​ head = head->next;

​ delete (temp);

​ length--;

​ }

int size()//返回元素个数

​ {

​ return length;

​ }

​ T front()//!返回队首元素

​ {

​ return head->data;

​ }

bool empty()//判断栈是不是空的

​ {

if (length == 0)

​ {

​ return true;

​ }

else

​ {

​ return false;

​ }

​ }

};

void InitMatGraph(MatGraph &G);//初始化Mat

void InsertVNode(MatGraph &G,char V);//MatG插入V

void InsertENode(MatGraph &G,char V,char W,int Weight);//向图MatG插入边

void CreatMatGraph(MatGraph &G); //读入边和顶点建立邻接矩阵

void Mat_DFS(MatGraph G,int start);//MatGraoh的DFS

void Mat_BFS(MatGraph G,int start);//MatGraoh的BFS

void ShowMatGraph(MatGraph G);//进行展示邻接矩阵

void ShowALGraph(ALGraph* G);//进行展示邻接表

void Mat_DFS_Tree(MatGraph G,int start);//MatGraoh的DFS 树展示

void Mat_DFS_BianHao(MatGraph G,int start,int count,int arr[]);//MatGraoh的DFS

void Mat_BFS_Tree(MatGraph G,int start);

void Mat_BFS_BianHao(MatGraph G,int start,int count,int arr[]);

void AL_DFS_Tree(ALGraph* G,int v);

void AL_DFS_BianHao(ALGraph* G,int v,int count,int arr[]);

void AL_BFS_Tree(ALGraph *G,int v);

void AL_BFS_BianHao(ALGraph *G,int v,int count,int arr[]);

void InitialTree();//初始化树







void InitMatGraph(MatGraph &G)//初始化Mat

{

​ memset(G.VNode,'#',sizeof(G.VNode));//全部初始化#

​ memset(G.ENode,INF,sizeof(G.ENode));

G.numENode=0;//当前有效的边

G.numVNode=0;

}

void InsertVNode(MatGraph &G,char V)//MatG插入V

{

​ G.VNode[G.numVNode++]=V;

}

void InsertENode(MatGraph &G,char V,char W,int Weight)//有向图MatG插入边

{

//有向图

int v1,v2;//边VW对应下标v1,v2

for(int i=0;i<G.numVNode;i++)

​ {

if(G.VNode[i]==V)

​ v1=i;

if(G.VNode[i]==W)

​ v2=i;

​ }

​ G.ENode[v1][v2]=Weight;

/*//若是无向图

​ G.ENode[v2][v1]=Weight;

​ */

G.numENode++;

}

void Mat_DFS(MatGraph G,int start)//MatGraoh的DFS

{

​ cout<<G.VNode[start];

​ visited[start]=1;//代表已经访问

for(int i=0;i<G.numVNode;i++)

​ {

if(G.ENode[start][i]!=INF&&visited[i]!=1)

​ {

Mat_DFS(G,i);

​ }

​ }

}

void Mat_DFS_Tree(MatGraph G,int start)//MatGraoh的DFS

{

for(int i=0;i<G.numVNode;i++)

​ {

if(G.ENode[start][i]!=INF&&visited[i]!=1)

​ {

T.node[i].Data = G.VNode[i];

T.node[i].Parent = start;

T.numTNode++;

​ visited[start]=1;//代表已经访问

Mat_DFS_Tree(G,i);

​ }

​ }

}

void Mat_DFS_BianHao(MatGraph G,int start,int count,int arr[])//MatGraoh的DFS

{

​ arr[start]=count;//count最初从1开始

​ visited[start]=1;//代表已经访问

for(int i=0;i<G.numVNode;i++)

​ {

if(G.ENode[start][i]!=INF&&visited[i]!=1)

​ {

Mat_DFS_BianHao(G,i,++count,arr);

​ }

​ }

}

void Mat_BFS(MatGraph G,int start)

{

​ queue<int>Q;

​ cout<<G.VNode[start];

​ visited[start]=1;

Q.push(start);//进队之前cout

while(!Q.empty())

​ {

int v = Q.front();

Q.pop();

for(int i=0;i<G.numVNode;i++)

​ {

if(G.ENode[v][i]!=INF&&visited[i]!=1)

​ {

​ cout<<G.VNode[i];

Q.push(i);

​ visited[i]=1;

​ }

​ }

​ }

}

void Mat_BFS_Tree(MatGraph G,int start)

{

​ queue<int>Q;

​ visited[start]=1;

Q.push(start);//进队之前cout

while(!Q.empty())

​ {

int v = Q.front();

Q.pop();

for(int i=0;i<G.numVNode;i++)

​ {

if(G.ENode[v][i]!=INF&&visited[i]!=1)

​ {

//cout<<G.VNode[v]<<"->"<<G.VNode[i]<<" ";

T.node[i].Data = G.VNode[i];

T.node[i].Parent = v;

T.numTNode++;

Q.push(i);

​ visited[i]=1;

​ }

​ }

​ }

}

void Mat_BFS_BianHao(MatGraph G,int start,int count,int arr[])

{

​ queue<int>Q;

​ visited[start]=1;

​ arr[start]=count;//首个count=1

Q.push(start);//进队之前cout

while(!Q.empty())

​ {

int v = Q.front();

Q.pop();

for(int i=0;i<G.numVNode;i++)

​ {

if(G.ENode[v][i]!=INF&&visited[i]!=1)

​ {

​ arr[i]=++count;

Q.push(i);

​ visited[i]=1;

​ }

​ }

​ }

}

void CreatMatGraph(MatGraph &G) //读入边和顶点建立邻接矩阵

{

​ FILE *p;

assert((p=fopen("MatGraph.txt","r"))!=NULL);

InitMatGraph(G);

int n;

​ fscanf(p,"顶点个数=%d;",&n);

for(int i=0;i<n;i++)

​ {

char V;

​ fscanf(p,"%c;",&V);

InsertVNode(G,V);

​ }

int m;

​ fscanf(p,"边个数=%d;",&m);

for(int i=0;i<m;i++)

​ {

char V1,V2;

int weight;

​ fscanf(p,"%c,%c,%d;",&V1,&V2,&weight);

InsertENode(G,V1,V2,weight);

​ }

​ fclose(p);

ShowMatGraph(G);//进行展示邻接矩阵

}

void ShowMatGraph(MatGraph G)//进行展示邻接矩阵

{

int n=G.numVNode;

int m=G.numENode;

//进行展示邻接矩阵

​ cout<<" ";//保证输入格式

for(int i=0;i<n;i++)

​ cout<<G.VNode[i]<<" ";

​ cout<<endl;

for(int i=0;i<n;i++)

​ {

​ cout<<G.VNode[i]<<" ";

for(int j=0;j<n;j++)

​ {

if(G.ENode[i][j]!=INF)

​ cout<<G.ENode[i][j]<<" ";

else

​ cout<<"oo ";

​ }

​ cout<<endl;

​ }

}

void CreatALGraph(ALGraph* G)//有向图处理

{

​ FILE *p;

assert((p=fopen("ALGraph.txt","r"))!=NULL);//txt文本必须要ANSI编码模式才可以中文

​ fscanf(p,"顶点个数=%d;",&(G->numVNode));//最初就给定numVNode

​ fscanf(p,"边个数=%d;",&(G->numENode));

for(int i=0;i<G->numVNode;i++)

​ {

​ fscanf(p,"%c;",&(G->adjlist[i].Data));

​ G->adjlist[i].FirstENode=NULL;

​ }

for(int i=0 ;i<G->numENode;i++)

​ {

char V1,V2;

int V1_i,V2_i;//V1对应的下标是V1_i

int Weight;

​ fscanf(p,"%c,%c,%d;",&V1,&V2,&Weight);

​ ENode* e;

​ e= new ENode;

for(int i=0;i<G->numVNode;i++)

​ {

if(V1 == G->adjlist[i].Data)

​ {

​ V1_i=i;

​ }

if(V2 == G->adjlist[i].Data )

​ {

​ V2_i=i;

​ }

​ }//找到下标

//边 V1->V2

​ e->AdjV=V2_i;//记录e边,由V1指向V2

​ e->Weight = Weight;

​ e->Next=G->adjlist[V1_i].FirstENode;//e边的起点顶点在V1所以头插法进入V1

​ G->adjlist[V1_i].FirstENode=e;//头插法

/*//若是无向图

​ //边V2->V1

​ e= new ENode;

​ e->AdjV=V1_i;

​ e->Weight = Weight;

​ e->Next=G->adjlist[V2_i].FirstENode;

​ G->adjlist[V2_i].FirstENode = e;

​ */

​ }

​ fclose(p);

ShowALGraph(G);

}

void ShowALGraph(ALGraph* G)//进行展示邻接表

{

for(int i=0;i<G->numVNode;i++)

​ {

​ cout<<G->adjlist[i].Data;

​ ENode* E;

​ E = G->adjlist[i].FirstENode;

while(E!=NULL)

​ {

​ cout<<"->";

​ cout<<E->Weight<<"->"<<G->adjlist[E->AdjV].Data;

​ E=E->Next;

​ }

​ cout<<"->NULL\n";

​ }

}

void AL_DFS(ALGraph* G,int v)

{

​ cout<<G->adjlist[v].Data;

​ visited[v]=1;//cout后就记录进visited

​ ENode* p;

​ p=G->adjlist[v].FirstENode;

while(p!=NULL)

​ {

if(visited[p->AdjV]!=1)

AL_DFS(G,p->AdjV);//从下一个点以DFS前进

​ p=p->Next;//当上一条路结束,开始这最开始同一个起点的下一条

​ }

}

void AL_DFS_BianHao(ALGraph* G,int v,int count,int arr[])

{

​ arr[v]=count;//首次进入的count=1

​ visited[v]=1;//cout后就记录进visited

​ ENode* p;

​ p=G->adjlist[v].FirstENode;

while(p!=NULL)

​ {

if(visited[p->AdjV]!=1)

AL_DFS_BianHao(G,p->AdjV,++count,arr);//从下一个点以DFS前进

​ p=p->Next;//当上一条路结束,开始这最开始同一个起点的下一条

​ }

}

void AL_DFS_Tree(ALGraph* G,int v)

{

//cout<<G->adjlist[v].Data;

​ visited[v]=1;//cout后就记录进visited

​ ENode* p;

​ p=G->adjlist[v].FirstENode;

while(p!=NULL)

​ {

if(visited[p->AdjV]!=1)

​ {

//cout<<G->adjlist[v].Data<<"->"<<G->adjlist[p->AdjV].Data<<" ";

T.node[p->AdjV].Data =G->adjlist[p->AdjV].Data;

T.node[p->AdjV].Parent = v;

T.numTNode++;

AL_DFS_Tree(G,p->AdjV);//从下一个点以DFS前进

​ }



​ p=p->Next;//当上一条路结束,开始这最开始同一个起点的下一条

​ }

}

void AL_BFS(ALGraph *G,int v)

{

​ cout<<G->adjlist[v].Data;

​ queue<int> Q;

Q.push(v);//设置为入队前cout

​ visited[v]=1;

while(!Q.empty())//

​ {

int temp;

​ temp=Q.front();

Q.pop();

​ ENode* E = G->adjlist[temp].FirstENode;//E为当前顶点的某条边

while(E!=NULL)

​ {

if(visited[E->AdjV]!=1)//边E指向的终点顶点E->AdjV并没有访问过

​ {

​ cout<<G->adjlist[E->AdjV].Data;

​ visited[E->AdjV]=1;//cout后visited记录

​ }

if (E->Next!=NULL)//和E同一个起点终点的另一条边,所指向的顶点,没有访问过 ,并且这另一条边存在

if(visited[E->Next->AdjV]!=1)//连用两个if 是因为visited[E->Next->AdjV],当 E->Next=NULL时候,判断语句visit[X]溢出

​ {

Q.push(E->AdjV);

​ }

​ E = E->Next;//E更新为同一个出发顶点的下一条边

​ }

​ }

}

void AL_BFS_BianHao(ALGraph *G,int v,int count,int arr[])

{

​ arr[v]=count;

​ queue<int> Q;

Q.push(v);//设置为入队前cout

​ visited[v]=1;

while(!Q.empty())//

​ {

int temp;

​ temp=Q.front();

Q.pop();

​ ENode* E = G->adjlist[temp].FirstENode;//E为当前顶点的某条边

while(E!=NULL)

​ {

if(visited[E->AdjV]!=1)//边E指向的终点顶点E->AdjV并没有访问过

​ {

​ arr[E->AdjV]=++count;

​ visited[E->AdjV]=1;//cout后visited记录

​ }

if (E->Next!=NULL)//和E同一个起点终点的另一条边,所指向的顶点,没有访问过 ,并且这另一条边存在

if(visited[E->Next->AdjV]!=1)//连用两个if 是因为visited[E->Next->AdjV],当 E->Next=NULL时候,判断语句visit[X]溢出

​ {

Q.push(E->AdjV);

​ }

​ E = E->Next;//E更新为同一个出发顶点的下一条边

​ }

​ }

}

void AL_BFS_Tree(ALGraph *G,int v)

{

​ queue<int> Q;

Q.push(v);//设置为入队前cout

​ visited[v]=1;

while(!Q.empty())//

​ {

int temp;

​ temp=Q.front();

Q.pop();

​ ENode* E = G->adjlist[temp].FirstENode;//E为当前顶点的某条边

while(E!=NULL)

​ {

if(visited[E->AdjV]!=1)//边E指向的终点顶点E->AdjV并没有访问过

​ {

//cout<<G->adjlist[temp].Data<<"->"<<G->adjlist[E->AdjV].Data<<" ";

T.node[E->AdjV].Data =G->adjlist[E->AdjV].Data;

T.node[E->AdjV].Parent = temp;

T.numTNode++;

​ visited[E->AdjV]=1;//cout后visited记录

​ }

if (E->Next!=NULL)//和E同一个起点终点的另一条边,所指向的顶点,没有访问过 ,并且这另一条边存在

if(visited[E->Next->AdjV]!=1)//连用两个if 是因为visited[E->Next->AdjV],当 E->Next=NULL时候,判断语句visit[X]溢出

​ {

Q.push(E->AdjV);

​ }

​ E = E->Next;//E更新为同一个出发顶点的下一条边

​ }

​ }

}

void MatToList(MatGraph MatG,ALGraph* &ALG)//同样是做有向图

{//已知MatGraph邻接矩阵 有向图 转为 邻接表

​ ALG = new ALGraph;

​ ALG->numVNode = MatG.numVNode;

​ ALG->numENode = MatG.numENode;

for(int i=0;i<MatG.numVNode;i++)

​ ALG->adjlist[i].FirstENode =NULL;//将初始化

for(int i=0;i<MatG.numVNode;i++)

​ {

int j =0;

​ ALG->adjlist[i].Data = MatG.VNode[i];//顶点转换

for(;j<MatG.numVNode;j++)//将这个顶点所有相关的边转换

​ {

if(INF!=MatG.ENode[i][j])//发现有对应的边从i到j

​ {

​ ENode* E = new ENode;

​ E->AdjV=j;

​ E->Weight = MatG.ENode[i][j];

​ E->Next = ALG->adjlist[i].FirstENode;

​ ALG->adjlist[i].FirstENode=E;//头插法

​ }

​ }

​ }

​ cout<<"已知的邻接矩阵\n";

ShowMatGraph(MatG);

​ cout<<"转换后变成\n";

ShowALGraph(ALG);

}

void ListToMat(MatGraph &MatG,ALGraph* &ALG)//这里是!做有向图的 !

{//已知邻接表G ,转为邻接矩阵MatG

​ ENode* E;

​ memset(MatG.VNode,'#',sizeof(MatG.VNode));

​ memset(MatG.ENode,INF,sizeof(MatG.ENode));

MatG.numENode=ALG->numENode;

MatG.numVNode=ALG->numVNode;

for(int i=0;i<ALG->numVNode;i++)

​ {

​ E = ALG->adjlist[i].FirstENode;

​ MatG.VNode[i] = ALG->adjlist[i].Data;//转换顶点

while(E!=NULL)

​ {//转换边

​ MatG.ENode[i][E->AdjV]=E->Weight;

​ E=E->Next;

​ }

​ }

​ cout<<"已知的邻接表\n";

ShowALGraph(ALG);

​ cout<<"转换后变成\n";

ShowMatGraph(MatG);

}

void AL_DFS_FeiDiGui(ALGraph* ALG,int start)

{

​ stack<ENode*> S;

​ memset(visited,0,sizeof(visited));

​ cout<<ALG->adjlist[start].Data;

​ visited[start]=1;//访问之后立刻visited等于1

​ ENode* E = ALG->adjlist[start].FirstENode;

while(E||!S.empty())

​ {

while(E)

​ {

//1.更深

if(visited[E->AdjV]==0)//如果更深的终点顶点没有访问过

​ {

S.push(E);//visited之前入队,留下标记可以返回

​ cout<<ALG->adjlist[E->AdjV].Data;

​ visited[E->AdjV]=1;//cout之后立刻visited



E = ALG->adjlist[E->AdjV].FirstENode;//进入更深的终点顶点

​ }

//2.转向

else//visited[E->Adjv]==1

​ {

E = E->Next;

​ }//转为同一个起点的另一条边

​ }

if(!S.empty())//3.这条路全验证不通之后返回

​ {

E = S.top();

S.pop();

​ }

​ }

}

void Mat_DFS_FeiDiGui(MatGraph MatG,int start)

{

​ stack<int> S;

​ cout<<MatG.VNode[start];

​ visited[start]=1;

S.push(start);//visited之后就立刻入栈

//这里选择对首元素进行while之前就入栈

int v1_i;

int v2_i;

while(!S.empty())

​ {

​ v1_i = S.top();

for(v2_i=0;v2_i<MatG.numVNode;v2_i++)

​ {//1.深入

if(visited[v2_i]!=1&&MatG.ENode[v1_i][v2_i]!=INF)//v1->v2有边且从来没有访问过

​ {

​ cout<<MatG.VNode[v2_i];

​ visited[v2_i]=1;//

S.push(v2_i);//cout和visited后,入栈方便返回

//并且会由v2_i充当新的v1_i准备继续深入

​ break;//准备继续深入

​ }

//2.转向,通过for循环已经做到



​ }//3.返回上一级

if(v2_i==MatG.numVNode && !S.empty())

​ {//证明由v1_i已经不可能再深入了

S.pop();

​ }

​ }

}

void InitialTree()//初始化树

{

for(int i=0;i<MaxVNode;i++)

​ {

T.node[i].Data = '#';

T.node[i].Parent = -1;

​ }

T.numTNode=0;

}

void ShowTree()

{

for(int i=0;i<MaxVNode;i++)

​ {

if(T.node[i].Data!='#')

​ cout<<"T.node["<<i<<"].Data ="<<T.node[i].Data<<" ,Parent="<<T.node[i].Parent<<endl;

​ }

}

int main()

{

​ cout<<" -------------------------------------------------------------------\n";

cout<<" |================== 图的相关操作 =================|\n";

cout<<" -------------------------------------------------------------------\n\n";

cout<<" |================== 1.根据txt建立邻接矩阵 =================|\n";

cout<<" |================== 2.邻接矩阵DFS =================|\n";

cout<<" |================== 3.邻接矩阵BFS =================|\n";

cout<<" |================== 4.根据txt建立邻接表 =================|\n";

cout<<" |================== 5.邻接表DFS =================|\n";

cout<<" |================== 6.邻接表BFS =================|\n";

cout<<" |================== 7.邻接矩阵转邻接表 =================|\n";

​ cout<<" |================== 8.邻接表转邻接矩阵 =================|\n";

cout<<" |================== 9.邻接表非递归DFS =================|\n";

cout<<" |================== 10.邻接矩阵非递归DFS =================|\n";

while(1)

​ {

int n;

​ cout<<"请输入";

​ cin>>n;

int start;

int arr[MaxVNode];



​ switch(n)

​ {

​ case 1:

MatGraph MatG;

CreatMatGraph(MatG);

​ cout<<endl;

​ break;

​ case 2:

​ cout<<"请输入从哪个下标开始进行:";

​ cin>>start;

//

​ memset(visited,0,sizeof(visited));//初始化visited

​ cout<<"序列展示\n" ;

Mat_DFS(MatG,start);

​ cout<<endl;

//

​ memset(visited,0,sizeof(visited));//初始化visited

InitialTree();

​ cout<<"生成树展示\n";

Mat_DFS_Tree(MatG,start);

//补充特例头结点进入

T.node[start].Data= MatG.VNode[start];

T.node[start].Parent = -1;

T.numTNode++;

ShowTree();

​ cout<<endl;

//

​ memset(visited,0,sizeof(visited));//初始化visited

​ memset(arr,-1,sizeof(arr));//初始化arr

​ cout<<"编号展示\n";

Mat_DFS_BianHao(MatG,start,1,arr);//MatGraohDFS

for(int i=0;i<MatG.numVNode;i++)

​ cout<<MatG.VNode[i]<<":"<<arr[i]<<" ";

​ cout<<endl;

​ break;

​ case 3:

​ cout<<"请输入从哪个下标开始进行:";

​ cin>>start;



​ cout<<"序号展示";

​ memset(visited,0,sizeof(visited));//初始化visited

Mat_BFS(MatG,start);

​ cout<<endl;



​ memset(visited,0,sizeof(visited));//初始化visited

InitialTree();

​ cout<<"生成树展示\n";

Mat_BFS_Tree(MatG,start);

//补充特例头结点进入

T.node[start].Data= MatG.VNode[start];

T.node[start].Parent = -1;

T.numTNode++;

ShowTree();

​ cout<<endl;



​ memset(visited,0,sizeof(visited));//初始化visited

​ cout<<"编号展示\n";

Mat_BFS_BianHao(MatG,start,1,arr);//MatGraohDFS

for(int i=0;i<MatG.numVNode;i++)

​ cout<<MatG.VNode[i]<<":"<<arr[i]<<" ";

​ cout<<endl;

​ break;

​ case 4:

ALGraph* ALG;

ALG = new ALGraph;

CreatALGraph(ALG);

​ cout<<endl;

​ break;

​ case 5:



​ cout<<"请输入从哪个下标开始进行:";

​ cin>>start;



​ cout<<"序号展示\n";

​ memset(visited,0,sizeof(visited));//初始化visited

AL_DFS(ALG,start);

​ cout<<endl;



​ memset(visited,0,sizeof(visited));//初始化visited

InitialTree();

​ cout<<"生成树展示\n";

AL_DFS_Tree(ALG,start);

//补充特例头结点进入

T.node[start].Data= ALG->adjlist[start].Data;

T.node[start].Parent = -1;

T.numTNode++;

ShowTree();

​ cout<<endl;



​ memset(visited,0,sizeof(visited));//初始化visited

​ memset(arr,-1,sizeof(arr));//初始化arr

​ cout<<"编号展示\n";

AL_DFS_BianHao(ALG,start,1,arr);//MatGraohDFS ,count=1所以直接传值1

for(int i=0;i<ALG->numVNode;i++)

​ cout<<ALG->adjlist[i].Data<<":"<<arr[i]<<" ";

​ cout<<endl;

​ break;

​ case 6:

​ cout<<"请输入从哪个下标开始进行:";

​ cin>>start;



​ cout<<"序号展示\n";

​ memset(visited,0,sizeof(visited));//初始化visited

AL_BFS(ALG,start);

​ cout<<endl;



​ memset(visited,0,sizeof(visited));//初始化visited

InitialTree();

​ cout<<"生成树展示\n";

AL_BFS_Tree(ALG,start);

//补充特例头结点进入

T.node[start].Data= ALG->adjlist[start].Data;

T.node[start].Parent = -1;

T.numTNode++;

ShowTree();

​ cout<<endl;



​ memset(visited,0,sizeof(visited));//初始化visited

​ memset(arr,-1,sizeof(arr));//初始化arr

​ cout<<"编号展示\n";

AL_BFS_BianHao(ALG,start,1,arr);//MatGraohDFS ,count=1所以直接传值1

for(int i=0;i<ALG->numVNode;i++)

​ cout<<ALG->adjlist[i].Data<<":"<<arr[i]<<" ";

​ cout<<endl;

​ break;



​ case 7:

​ memset(visited,0,sizeof(visited));//初始化visited

MatToList(MatG,ALG);

​ cout<<endl;

​ break;

​ case 8:

​ memset(visited,0,sizeof(visited));//初始化visited

ListToMat(MatG,ALG);

​ cout<<endl;

​ break;

​ case 9:

​ memset(visited,0,sizeof(visited));//初始化visited

​ cout<<"请输入从哪个下标开始进行:";

​ cin>>start;

AL_DFS_FeiDiGui(ALG,start);

​ cout<<endl;

​ break;

​ case 10:

​ memset(visited,0,sizeof(visited));//初始化visited

​ cout<<"请输入从哪个下标开始进行:";

​ cin>>start;

Mat_DFS_FeiDiGui(MatG,start);

​ cout<<endl;

​ break;



​ }



​ }



}

数据结构lab3-图型结构的建立与搜索
http://yoursite.com/2023/05/16/数据结构lab3-图型结构的建立与搜索/
作者
Fars
发布于
2023年5月16日
许可协议