From 1a4ce70ff7dd55413871bff488a7695ab8413fa4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BA=B7=E5=BB=BA=E4=BC=9F?= Date: Tue, 18 Feb 2020 03:44:06 +0800 Subject: [PATCH] =?UTF-8?q?:bulb:=20<07=20=E5=9B=BE>=E4=B9=A0=E9=A2=98?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CLion/ExerciseBook/07.14+07.16/07.14+07.16.c | 181 ++++ CLion/ExerciseBook/07.14+07.16/ALGraph.c | 737 +++++++++++++++ CLion/ExerciseBook/07.14+07.16/ALGraph.h | 162 ++++ CLion/ExerciseBook/07.14+07.16/CMakeLists.txt | 12 + .../ExerciseBook/07.14+07.16/TestData_DG.txt | 6 + .../ExerciseBook/07.14+07.16/TestData_DN.txt | 6 + .../ExerciseBook/07.14+07.16/TestData_UDG.txt | 6 + .../ExerciseBook/07.14+07.16/TestData_UDN.txt | 6 + CLion/ExerciseBook/07.15/07.15.c | 191 ++++ CLion/ExerciseBook/07.15/CMakeLists.txt | 12 + CLion/ExerciseBook/07.15/MGraph.c | 719 +++++++++++++++ CLion/ExerciseBook/07.15/MGraph.h | 160 ++++ CLion/ExerciseBook/07.15/TestData_DG.txt | 6 + CLion/ExerciseBook/07.15/TestData_DN.txt | 6 + CLion/ExerciseBook/07.15/TestData_UDG.txt | 6 + CLion/ExerciseBook/07.15/TestData_UDN.txt | 6 + CLion/ExerciseBook/07.17/07.17.c | 169 ++++ CLion/ExerciseBook/07.17/CMakeLists.txt | 12 + CLion/ExerciseBook/07.17/OLGraph.c | 861 ++++++++++++++++++ CLion/ExerciseBook/07.17/OLGraph.h | 178 ++++ CLion/ExerciseBook/07.17/TestData_DG.txt | 6 + CLion/ExerciseBook/07.17/TestData_DN.txt | 6 + CLion/ExerciseBook/07.17/TestData_UDG.txt | 6 + CLion/ExerciseBook/07.17/TestData_UDN.txt | 6 + CLion/ExerciseBook/07.18-07.19/07.18-07.19.c | 181 ++++ CLion/ExerciseBook/07.18-07.19/AMLGraph.c | 715 +++++++++++++++ CLion/ExerciseBook/07.18-07.19/AMLGraph.h | 162 ++++ CLion/ExerciseBook/07.18-07.19/CMakeLists.txt | 12 + .../ExerciseBook/07.18-07.19/TestData_UDG.txt | 6 + .../ExerciseBook/07.18-07.19/TestData_UDN.txt | 6 + CLion/ExerciseBook/07.20/07.20.c | 78 ++ CLion/ExerciseBook/07.20/07.20.png | Bin 0 -> 16161 bytes CLion/ExerciseBook/07.20/CMakeLists.txt | 12 + CLion/ExerciseBook/07.20/MGraph.c | 482 ++++++++++ CLion/ExerciseBook/07.20/MGraph.h | 129 +++ CLion/ExerciseBook/07.20/TestData_DG.txt | 6 + CLion/ExerciseBook/07.20/TestData_DN.txt | 6 + CLion/ExerciseBook/07.20/TestData_UDG.txt | 6 + CLion/ExerciseBook/07.20/TestData_UDN.txt | 6 + CLion/ExerciseBook/07.21/07.21.c | 75 ++ CLion/ExerciseBook/07.21/07.21.png | Bin 0 -> 16161 bytes CLion/ExerciseBook/07.21/ALGraph.c | 570 ++++++++++++ CLion/ExerciseBook/07.21/ALGraph.h | 143 +++ CLion/ExerciseBook/07.21/CMakeLists.txt | 12 + CLion/ExerciseBook/07.21/TestData_DG.txt | 6 + CLion/ExerciseBook/07.21/TestData_DN.txt | 6 + CLion/ExerciseBook/07.21/TestData_UDG.txt | 6 + CLion/ExerciseBook/07.21/TestData_UDN.txt | 6 + CLion/ExerciseBook/07.22-07.23/07.22-07.23.c | 213 +++++ .../ExerciseBook/07.22-07.23/07.22-07.23.png | Bin 0 -> 8413 bytes CLion/ExerciseBook/07.22-07.23/ALGraph.c | 405 ++++++++ CLion/ExerciseBook/07.22-07.23/ALGraph.h | 150 +++ CLion/ExerciseBook/07.22-07.23/CMakeLists.txt | 12 + CLion/ExerciseBook/07.22-07.23/LinkQueue.c | 102 +++ CLion/ExerciseBook/07.22-07.23/LinkQueue.h | 64 ++ .../ExerciseBook/07.22-07.23/TestData_DG.txt | 6 + CLion/ExerciseBook/07.24/07.24.c | 91 ++ CLion/ExerciseBook/07.24/07.24.png | Bin 0 -> 12105 bytes CLion/ExerciseBook/07.24/CMakeLists.txt | 12 + CLion/ExerciseBook/07.24/MGraph.c | 219 +++++ CLion/ExerciseBook/07.24/MGraph.h | 112 +++ CLion/ExerciseBook/07.24/SqStack.c | 106 +++ CLion/ExerciseBook/07.24/SqStack.h | 66 ++ CLion/ExerciseBook/07.24/TestData_DG.txt | 6 + CLion/ExerciseBook/07.25/07.25.c | 134 +++ CLion/ExerciseBook/07.25/07.25.png | Bin 0 -> 8338 bytes CLion/ExerciseBook/07.25/CMakeLists.txt | 12 + CLion/ExerciseBook/07.25/Graph.c | 164 ++++ CLion/ExerciseBook/07.25/Graph.h | 53 ++ CLion/ExerciseBook/07.25/TestData_DG.txt | 4 + CLion/ExerciseBook/07.26/07.26.c | 141 +++ CLion/ExerciseBook/07.26/07.26.png | Bin 0 -> 16448 bytes CLion/ExerciseBook/07.26/ALGraph.c | 325 +++++++ CLion/ExerciseBook/07.26/ALGraph.h | 128 +++ CLion/ExerciseBook/07.26/CMakeLists.txt | 12 + CLion/ExerciseBook/07.26/SqStack.c | 90 ++ CLion/ExerciseBook/07.26/SqStack.h | 59 ++ CLion/ExerciseBook/07.26/TestData_DG.txt | 6 + CLion/ExerciseBook/07.26/TopologicalSorting.c | 96 ++ CLion/ExerciseBook/07.26/TopologicalSorting.h | 28 + CLion/ExerciseBook/07.27/07.27.c | 133 +++ CLion/ExerciseBook/07.27/07.27.png | Bin 0 -> 8809 bytes CLion/ExerciseBook/07.27/ALGraph.c | 595 ++++++++++++ CLion/ExerciseBook/07.27/ALGraph.h | 175 ++++ CLion/ExerciseBook/07.27/CMakeLists.txt | 12 + CLion/ExerciseBook/07.27/TestData_UDG.txt | 6 + CLion/ExerciseBook/07.28/07.28.c | 110 +++ CLion/ExerciseBook/07.28/07.28.png | Bin 0 -> 10441 bytes CLion/ExerciseBook/07.28/CMakeLists.txt | 12 + CLion/ExerciseBook/07.28/MGraph.c | 299 ++++++ CLion/ExerciseBook/07.28/MGraph.h | 133 +++ CLion/ExerciseBook/07.28/TestData_DG.txt | 6 + CLion/ExerciseBook/07.29/07.29.c | 110 +++ CLion/ExerciseBook/07.29/07.29.png | Bin 0 -> 10441 bytes CLion/ExerciseBook/07.29/CMakeLists.txt | 12 + CLion/ExerciseBook/07.29/MGraph.c | 299 ++++++ CLion/ExerciseBook/07.29/MGraph.h | 133 +++ CLion/ExerciseBook/07.29/TestData_DG.txt | 6 + CLion/ExerciseBook/07.30/07.30.c | 99 ++ CLion/ExerciseBook/07.30/07.30.png | Bin 0 -> 10195 bytes CLion/ExerciseBook/07.30/CMakeLists.txt | 12 + CLion/ExerciseBook/07.30/MGraph.c | 299 ++++++ CLion/ExerciseBook/07.30/MGraph.h | 133 +++ CLion/ExerciseBook/07.30/TestData_DG.txt | 6 + CLion/ExerciseBook/07.31/07.31.c | 47 + CLion/ExerciseBook/07.31/07.31.png | Bin 0 -> 55908 bytes CLion/ExerciseBook/07.31/CMakeLists.txt | 12 + CLion/ExerciseBook/07.31/OLGraph.c | 509 +++++++++++ CLion/ExerciseBook/07.31/OLGraph.h | 175 ++++ .../07.31/StronglyConnectedComponents.c | 262 ++++++ .../07.31/StronglyConnectedComponents.h | 56 ++ CLion/ExerciseBook/07.31/TestData_DG.txt | 6 + CLion/ExerciseBook/07.32/07.32.c | 46 + CLion/ExerciseBook/07.32/07.32.png | Bin 0 -> 14783 bytes CLion/ExerciseBook/07.32/ALGraph.c | 326 +++++++ CLion/ExerciseBook/07.32/ALGraph.h | 128 +++ CLion/ExerciseBook/07.32/CMakeLists.txt | 12 + CLion/ExerciseBook/07.32/CSTree.c | 76 ++ CLion/ExerciseBook/07.32/CSTree.h | 54 ++ CLion/ExerciseBook/07.32/MFSet.c | 93 ++ CLion/ExerciseBook/07.32/MFSet.h | 92 ++ .../ExerciseBook/07.32/MinimumSpanningTree.c | 118 +++ .../ExerciseBook/07.32/MinimumSpanningTree.h | 30 + CLion/ExerciseBook/07.32/TestData_UDN.txt | 6 + CLion/ExerciseBook/07.33/07.33.c | 38 + CLion/ExerciseBook/07.33/07.33.png | Bin 0 -> 34695 bytes CLion/ExerciseBook/07.33/CMakeLists.txt | 12 + CLion/ExerciseBook/07.33/CSTree.c | 76 ++ CLion/ExerciseBook/07.33/CSTree.h | 53 ++ CLion/ExerciseBook/07.33/Graph.c | 244 +++++ CLion/ExerciseBook/07.33/Graph.h | 71 ++ CLion/ExerciseBook/07.33/MFSet.c | 93 ++ CLion/ExerciseBook/07.33/MFSet.h | 92 ++ .../ExerciseBook/07.33/MinimumSpanningTree.c | 142 +++ .../ExerciseBook/07.33/MinimumSpanningTree.h | 22 + CLion/ExerciseBook/07.33/SqQueue.c | 147 +++ CLion/ExerciseBook/07.33/SqQueue.h | 84 ++ CLion/ExerciseBook/07.33/TestData_UDN.txt | 4 + CLion/ExerciseBook/07.34/07.34.c | 131 +++ CLion/ExerciseBook/07.34/07.34.png | Bin 0 -> 16448 bytes CLion/ExerciseBook/07.34/ALGraph.c | 325 +++++++ CLion/ExerciseBook/07.34/ALGraph.h | 128 +++ CLion/ExerciseBook/07.34/CMakeLists.txt | 12 + CLion/ExerciseBook/07.34/SqStack.c | 90 ++ CLion/ExerciseBook/07.34/SqStack.h | 59 ++ CLion/ExerciseBook/07.34/TestData_DG.txt | 6 + CLion/ExerciseBook/07.34/TopologicalSorting.c | 96 ++ CLion/ExerciseBook/07.34/TopologicalSorting.h | 28 + CLion/ExerciseBook/07.35/07.35.c | 94 ++ CLion/ExerciseBook/07.35/07.35.png | Bin 0 -> 17387 bytes CLion/ExerciseBook/07.35/ALGraph.c | 325 +++++++ CLion/ExerciseBook/07.35/ALGraph.h | 128 +++ CLion/ExerciseBook/07.35/CMakeLists.txt | 12 + CLion/ExerciseBook/07.35/TestData_DG.txt | 6 + CLion/ExerciseBook/07.36-07.37/07.36-07.37.c | 167 ++++ .../ExerciseBook/07.36-07.37/07.36-07.37.png | Bin 0 -> 16448 bytes CLion/ExerciseBook/07.36-07.37/ALGraph.c | 325 +++++++ CLion/ExerciseBook/07.36-07.37/ALGraph.h | 128 +++ CLion/ExerciseBook/07.36-07.37/CMakeLists.txt | 12 + CLion/ExerciseBook/07.36-07.37/SqStack.c | 90 ++ CLion/ExerciseBook/07.36-07.37/SqStack.h | 59 ++ .../ExerciseBook/07.36-07.37/TestData_DG.txt | 6 + .../07.36-07.37/TopologicalSorting.c | 96 ++ .../07.36-07.37/TopologicalSorting.h | 28 + CLion/ExerciseBook/07.38/07.38.c | 110 +++ CLion/ExerciseBook/07.38/07.38.png | Bin 0 -> 27793 bytes CLion/ExerciseBook/07.38/ALGraph.c | 344 +++++++ CLion/ExerciseBook/07.38/ALGraph.h | 131 +++ CLion/ExerciseBook/07.38/CMakeLists.txt | 12 + CLion/ExerciseBook/07.38/SqList.c | 114 +++ CLion/ExerciseBook/07.38/SqList.h | 73 ++ CLion/ExerciseBook/07.38/TestData_DG.txt | 8 + CLion/ExerciseBook/07.39/07.39.c | 80 ++ CLion/ExerciseBook/07.39/07.39.png | Bin 0 -> 23608 bytes CLion/ExerciseBook/07.39/BiTree.c | 193 ++++ CLion/ExerciseBook/07.39/BiTree.h | 83 ++ CLion/ExerciseBook/07.39/CMakeLists.txt | 12 + CLion/ExerciseBook/07.39/LinkQueue.c | 102 +++ CLion/ExerciseBook/07.39/LinkQueue.h | 65 ++ CLion/ExerciseBook/07.39/SqList.c | 114 +++ CLion/ExerciseBook/07.39/SqList.h | 73 ++ CLion/ExerciseBook/07.39/TestData_Pre.txt | 1 + CLion/ExerciseBook/07.40/07.40.c | 193 ++++ CLion/ExerciseBook/07.40/07.40.png | Bin 0 -> 28101 bytes CLion/ExerciseBook/07.40/ALGraph.c | 377 ++++++++ CLion/ExerciseBook/07.40/ALGraph.h | 141 +++ CLion/ExerciseBook/07.40/CMakeLists.txt | 12 + CLion/ExerciseBook/07.40/SqList.c | 114 +++ CLion/ExerciseBook/07.40/SqList.h | 74 ++ CLion/ExerciseBook/07.40/TestData_DG.txt | 8 + CLion/ExerciseBook/07.41/07.41.c | 160 ++++ CLion/ExerciseBook/07.41/07.41.png | Bin 0 -> 36952 bytes CLion/ExerciseBook/07.41/ALGraph.c | 326 +++++++ CLion/ExerciseBook/07.41/ALGraph.h | 128 +++ CLion/ExerciseBook/07.41/CMakeLists.txt | 12 + CLion/ExerciseBook/07.41/SqStack.c | 103 +++ CLion/ExerciseBook/07.41/SqStack.h | 66 ++ CLion/ExerciseBook/07.41/TestData_DN.txt | 6 + CLion/ExerciseBook/07.42/07.42.c | 54 ++ CLion/ExerciseBook/07.42/07.42.png | Bin 0 -> 55687 bytes CLion/ExerciseBook/07.42/ALGraph.c | 583 ++++++++++++ CLion/ExerciseBook/07.42/ALGraph.h | 150 +++ CLion/ExerciseBook/07.42/CMakeLists.txt | 12 + CLion/ExerciseBook/07.42/ShortestPaths.c | 334 +++++++ CLion/ExerciseBook/07.42/ShortestPaths.h | 59 ++ CLion/ExerciseBook/07.42/TestData_DG.txt | 6 + CLion/ExerciseBook/07.42/TestData_DN.txt | 6 + CLion/ExerciseBook/07.42/TestData_UDG.txt | 6 + CLion/ExerciseBook/07.42/TestData_UDN.txt | 6 + CLion/ExerciseBook/CMakeLists.txt | 26 + .../ExerciseBook/07.14+07.16/07.14+07.16.cpp | 181 ++++ .../ExerciseBook/07.14+07.16/07.14+07.16.dev | 118 +++ Dev-C++/ExerciseBook/07.14+07.16/ALGraph.cpp | 737 +++++++++++++++ Dev-C++/ExerciseBook/07.14+07.16/ALGraph.h | 162 ++++ .../ExerciseBook/07.14+07.16/TestData_DG.txt | 6 + .../ExerciseBook/07.14+07.16/TestData_DN.txt | 6 + .../ExerciseBook/07.14+07.16/TestData_UDG.txt | 6 + .../ExerciseBook/07.14+07.16/TestData_UDN.txt | 6 + Dev-C++/ExerciseBook/07.15/07.15.cpp | 191 ++++ Dev-C++/ExerciseBook/07.15/07.15.dev | 118 +++ Dev-C++/ExerciseBook/07.15/MGraph.cpp | 719 +++++++++++++++ Dev-C++/ExerciseBook/07.15/MGraph.h | 160 ++++ Dev-C++/ExerciseBook/07.15/TestData_DG.txt | 6 + Dev-C++/ExerciseBook/07.15/TestData_DN.txt | 6 + Dev-C++/ExerciseBook/07.15/TestData_UDG.txt | 6 + Dev-C++/ExerciseBook/07.15/TestData_UDN.txt | 6 + Dev-C++/ExerciseBook/07.17/07.17.cpp | 169 ++++ Dev-C++/ExerciseBook/07.17/07.17.dev | 118 +++ Dev-C++/ExerciseBook/07.17/OLGraph.cpp | 861 ++++++++++++++++++ Dev-C++/ExerciseBook/07.17/OLGraph.h | 178 ++++ Dev-C++/ExerciseBook/07.17/TestData_DG.txt | 6 + Dev-C++/ExerciseBook/07.17/TestData_DN.txt | 6 + Dev-C++/ExerciseBook/07.17/TestData_UDG.txt | 6 + Dev-C++/ExerciseBook/07.17/TestData_UDN.txt | 6 + .../ExerciseBook/07.18-07.19/07.18-07.19.cpp | 181 ++++ .../ExerciseBook/07.18-07.19/07.18-07.19.dev | 100 ++ Dev-C++/ExerciseBook/07.18-07.19/AMLGraph.cpp | 715 +++++++++++++++ Dev-C++/ExerciseBook/07.18-07.19/AMLGraph.h | 162 ++++ .../ExerciseBook/07.18-07.19/TestData_UDG.txt | 6 + .../ExerciseBook/07.18-07.19/TestData_UDN.txt | 6 + Dev-C++/ExerciseBook/07.20/07.20.cpp | 78 ++ Dev-C++/ExerciseBook/07.20/07.20.dev | 118 +++ Dev-C++/ExerciseBook/07.20/07.20.png | Bin 0 -> 16161 bytes Dev-C++/ExerciseBook/07.20/MGraph.cpp | 482 ++++++++++ Dev-C++/ExerciseBook/07.20/MGraph.h | 129 +++ Dev-C++/ExerciseBook/07.20/TestData_DG.txt | 6 + Dev-C++/ExerciseBook/07.20/TestData_DN.txt | 6 + Dev-C++/ExerciseBook/07.20/TestData_UDG.txt | 6 + Dev-C++/ExerciseBook/07.20/TestData_UDN.txt | 6 + Dev-C++/ExerciseBook/07.21/07.21.cpp | 75 ++ Dev-C++/ExerciseBook/07.21/07.21.dev | 118 +++ Dev-C++/ExerciseBook/07.21/07.21.png | Bin 0 -> 16161 bytes Dev-C++/ExerciseBook/07.21/ALGraph.cpp | 570 ++++++++++++ Dev-C++/ExerciseBook/07.21/ALGraph.h | 143 +++ Dev-C++/ExerciseBook/07.21/TestData_DG.txt | 6 + Dev-C++/ExerciseBook/07.21/TestData_DN.txt | 6 + Dev-C++/ExerciseBook/07.21/TestData_UDG.txt | 6 + Dev-C++/ExerciseBook/07.21/TestData_UDN.txt | 6 + .../ExerciseBook/07.22-07.23/07.22-07.23.cpp | 213 +++++ .../ExerciseBook/07.22-07.23/07.22-07.23.dev | 111 +++ .../ExerciseBook/07.22-07.23/07.22-07.23.png | Bin 0 -> 8413 bytes Dev-C++/ExerciseBook/07.22-07.23/ALGraph.cpp | 405 ++++++++ Dev-C++/ExerciseBook/07.22-07.23/ALGraph.h | 150 +++ .../ExerciseBook/07.22-07.23/LinkQueue.cpp | 102 +++ Dev-C++/ExerciseBook/07.22-07.23/LinkQueue.h | 64 ++ .../ExerciseBook/07.22-07.23/TestData_DG.txt | 6 + Dev-C++/ExerciseBook/07.24/07.24.cpp | 91 ++ Dev-C++/ExerciseBook/07.24/07.24.dev | 111 +++ Dev-C++/ExerciseBook/07.24/07.24.png | Bin 0 -> 12105 bytes Dev-C++/ExerciseBook/07.24/MGraph.cpp | 219 +++++ Dev-C++/ExerciseBook/07.24/MGraph.h | 112 +++ Dev-C++/ExerciseBook/07.24/SqStack.cpp | 106 +++ Dev-C++/ExerciseBook/07.24/SqStack.h | 66 ++ Dev-C++/ExerciseBook/07.24/TestData_DG.txt | 6 + Dev-C++/ExerciseBook/07.25/07.25.cpp | 134 +++ Dev-C++/ExerciseBook/07.25/07.25.dev | 91 ++ Dev-C++/ExerciseBook/07.25/07.25.png | Bin 0 -> 8338 bytes Dev-C++/ExerciseBook/07.25/Graph.cpp | 164 ++++ Dev-C++/ExerciseBook/07.25/Graph.h | 53 ++ Dev-C++/ExerciseBook/07.25/TestData_DG.txt | 4 + Dev-C++/ExerciseBook/07.26/07.26.cpp | 141 +++ Dev-C++/ExerciseBook/07.26/07.26.dev | 131 +++ Dev-C++/ExerciseBook/07.26/07.26.png | Bin 0 -> 16448 bytes Dev-C++/ExerciseBook/07.26/ALGraph.cpp | 325 +++++++ Dev-C++/ExerciseBook/07.26/ALGraph.h | 128 +++ Dev-C++/ExerciseBook/07.26/SqStack.cpp | 90 ++ Dev-C++/ExerciseBook/07.26/SqStack.h | 59 ++ Dev-C++/ExerciseBook/07.26/TestData_DG.txt | 6 + .../ExerciseBook/07.26/TopologicalSorting.cpp | 96 ++ .../ExerciseBook/07.26/TopologicalSorting.h | 28 + Dev-C++/ExerciseBook/07.27/07.27.cpp | 133 +++ Dev-C++/ExerciseBook/07.27/07.27.dev | 91 ++ Dev-C++/ExerciseBook/07.27/07.27.png | Bin 0 -> 8809 bytes Dev-C++/ExerciseBook/07.27/ALGraph.cpp | 595 ++++++++++++ Dev-C++/ExerciseBook/07.27/ALGraph.h | 175 ++++ Dev-C++/ExerciseBook/07.27/TestData_UDG.txt | 6 + Dev-C++/ExerciseBook/07.28/07.28.cpp | 110 +++ Dev-C++/ExerciseBook/07.28/07.28.dev | 91 ++ Dev-C++/ExerciseBook/07.28/07.28.png | Bin 0 -> 10441 bytes Dev-C++/ExerciseBook/07.28/MGraph.cpp | 299 ++++++ Dev-C++/ExerciseBook/07.28/MGraph.h | 133 +++ Dev-C++/ExerciseBook/07.28/TestData_DG.txt | 6 + Dev-C++/ExerciseBook/07.29/07.29.cpp | 110 +++ Dev-C++/ExerciseBook/07.29/07.29.dev | 91 ++ Dev-C++/ExerciseBook/07.29/07.29.png | Bin 0 -> 10441 bytes Dev-C++/ExerciseBook/07.29/MGraph.cpp | 299 ++++++ Dev-C++/ExerciseBook/07.29/MGraph.h | 133 +++ Dev-C++/ExerciseBook/07.29/TestData_DG.txt | 6 + Dev-C++/ExerciseBook/07.30/07.30.cpp | 99 ++ Dev-C++/ExerciseBook/07.30/07.30.dev | 91 ++ Dev-C++/ExerciseBook/07.30/07.30.png | Bin 0 -> 10195 bytes Dev-C++/ExerciseBook/07.30/MGraph.cpp | 299 ++++++ Dev-C++/ExerciseBook/07.30/MGraph.h | 133 +++ Dev-C++/ExerciseBook/07.30/TestData_DG.txt | 6 + Dev-C++/ExerciseBook/07.31/07.31.cpp | 47 + Dev-C++/ExerciseBook/07.31/07.31.dev | 111 +++ Dev-C++/ExerciseBook/07.31/07.31.png | Bin 0 -> 55908 bytes Dev-C++/ExerciseBook/07.31/OLGraph.cpp | 509 +++++++++++ Dev-C++/ExerciseBook/07.31/OLGraph.h | 175 ++++ .../07.31/StronglyConnectedComponents.cpp | 262 ++++++ .../07.31/StronglyConnectedComponents.h | 56 ++ Dev-C++/ExerciseBook/07.31/TestData_DG.txt | 6 + Dev-C++/ExerciseBook/07.32/07.32.cpp | 46 + Dev-C++/ExerciseBook/07.32/07.32.dev | 151 +++ Dev-C++/ExerciseBook/07.32/07.32.png | Bin 0 -> 14783 bytes Dev-C++/ExerciseBook/07.32/ALGraph.cpp | 326 +++++++ Dev-C++/ExerciseBook/07.32/ALGraph.h | 128 +++ Dev-C++/ExerciseBook/07.32/CSTree.cpp | 76 ++ Dev-C++/ExerciseBook/07.32/CSTree.h | 54 ++ Dev-C++/ExerciseBook/07.32/MFSet.cpp | 93 ++ Dev-C++/ExerciseBook/07.32/MFSet.h | 92 ++ .../07.32/MinimumSpanningTree.cpp | 118 +++ .../ExerciseBook/07.32/MinimumSpanningTree.h | 30 + Dev-C++/ExerciseBook/07.32/TestData_UDN.txt | 6 + Dev-C++/ExerciseBook/07.33/07.33.cpp | 38 + Dev-C++/ExerciseBook/07.33/07.33.dev | 171 ++++ Dev-C++/ExerciseBook/07.33/07.33.png | Bin 0 -> 34695 bytes Dev-C++/ExerciseBook/07.33/CSTree.cpp | 76 ++ Dev-C++/ExerciseBook/07.33/CSTree.h | 53 ++ Dev-C++/ExerciseBook/07.33/Graph.cpp | 244 +++++ Dev-C++/ExerciseBook/07.33/Graph.h | 71 ++ Dev-C++/ExerciseBook/07.33/MFSet.cpp | 93 ++ Dev-C++/ExerciseBook/07.33/MFSet.h | 92 ++ .../07.33/MinimumSpanningTree.cpp | 142 +++ .../ExerciseBook/07.33/MinimumSpanningTree.h | 22 + Dev-C++/ExerciseBook/07.33/SqQueue.cpp | 147 +++ Dev-C++/ExerciseBook/07.33/SqQueue.h | 84 ++ Dev-C++/ExerciseBook/07.33/TestData_UDN.txt | 4 + Dev-C++/ExerciseBook/07.34/07.34.cpp | 131 +++ Dev-C++/ExerciseBook/07.34/07.34.dev | 131 +++ Dev-C++/ExerciseBook/07.34/07.34.png | Bin 0 -> 16448 bytes Dev-C++/ExerciseBook/07.34/ALGraph.cpp | 325 +++++++ Dev-C++/ExerciseBook/07.34/ALGraph.h | 128 +++ Dev-C++/ExerciseBook/07.34/SqStack.cpp | 90 ++ Dev-C++/ExerciseBook/07.34/SqStack.h | 59 ++ Dev-C++/ExerciseBook/07.34/TestData_DG.txt | 6 + .../ExerciseBook/07.34/TopologicalSorting.cpp | 96 ++ .../ExerciseBook/07.34/TopologicalSorting.h | 28 + Dev-C++/ExerciseBook/07.35/07.35.cpp | 94 ++ Dev-C++/ExerciseBook/07.35/07.35.dev | 91 ++ Dev-C++/ExerciseBook/07.35/07.35.png | Bin 0 -> 17387 bytes Dev-C++/ExerciseBook/07.35/ALGraph.cpp | 325 +++++++ Dev-C++/ExerciseBook/07.35/ALGraph.h | 128 +++ Dev-C++/ExerciseBook/07.35/TestData_DG.txt | 6 + .../ExerciseBook/07.36-07.37/07.36-07.37.cpp | 167 ++++ .../ExerciseBook/07.36-07.37/07.36-07.37.dev | 131 +++ .../ExerciseBook/07.36-07.37/07.36-07.37.png | Bin 0 -> 16448 bytes Dev-C++/ExerciseBook/07.36-07.37/ALGraph.cpp | 325 +++++++ Dev-C++/ExerciseBook/07.36-07.37/ALGraph.h | 128 +++ Dev-C++/ExerciseBook/07.36-07.37/SqStack.cpp | 90 ++ Dev-C++/ExerciseBook/07.36-07.37/SqStack.h | 59 ++ .../ExerciseBook/07.36-07.37/TestData_DG.txt | 6 + .../07.36-07.37/TopologicalSorting.cpp | 96 ++ .../07.36-07.37/TopologicalSorting.h | 28 + Dev-C++/ExerciseBook/07.38/07.38.cpp | 110 +++ Dev-C++/ExerciseBook/07.38/07.38.dev | 111 +++ Dev-C++/ExerciseBook/07.38/07.38.png | Bin 0 -> 27793 bytes Dev-C++/ExerciseBook/07.38/ALGraph.cpp | 344 +++++++ Dev-C++/ExerciseBook/07.38/ALGraph.h | 131 +++ Dev-C++/ExerciseBook/07.38/SqList.cpp | 114 +++ Dev-C++/ExerciseBook/07.38/SqList.h | 73 ++ Dev-C++/ExerciseBook/07.38/TestData_DG.txt | 8 + Dev-C++/ExerciseBook/07.39/07.39.cpp | 80 ++ Dev-C++/ExerciseBook/07.39/07.39.dev | 131 +++ Dev-C++/ExerciseBook/07.39/07.39.png | Bin 0 -> 23608 bytes Dev-C++/ExerciseBook/07.39/BiTree.cpp | 193 ++++ Dev-C++/ExerciseBook/07.39/BiTree.h | 83 ++ Dev-C++/ExerciseBook/07.39/LinkQueue.cpp | 102 +++ Dev-C++/ExerciseBook/07.39/LinkQueue.h | 65 ++ Dev-C++/ExerciseBook/07.39/SqList.cpp | 114 +++ Dev-C++/ExerciseBook/07.39/SqList.h | 73 ++ Dev-C++/ExerciseBook/07.39/TestData_Pre.txt | 1 + Dev-C++/ExerciseBook/07.40/07.40.cpp | 193 ++++ Dev-C++/ExerciseBook/07.40/07.40.dev | 111 +++ Dev-C++/ExerciseBook/07.40/07.40.png | Bin 0 -> 28101 bytes Dev-C++/ExerciseBook/07.40/ALGraph.cpp | 377 ++++++++ Dev-C++/ExerciseBook/07.40/ALGraph.h | 141 +++ Dev-C++/ExerciseBook/07.40/SqList.cpp | 114 +++ Dev-C++/ExerciseBook/07.40/SqList.h | 74 ++ Dev-C++/ExerciseBook/07.40/TestData_DG.txt | 8 + Dev-C++/ExerciseBook/07.41/07.41.cpp | 160 ++++ Dev-C++/ExerciseBook/07.41/07.41.dev | 111 +++ Dev-C++/ExerciseBook/07.41/07.41.png | Bin 0 -> 36952 bytes Dev-C++/ExerciseBook/07.41/ALGraph.cpp | 326 +++++++ Dev-C++/ExerciseBook/07.41/ALGraph.h | 128 +++ Dev-C++/ExerciseBook/07.41/SqStack.cpp | 103 +++ Dev-C++/ExerciseBook/07.41/SqStack.h | 66 ++ Dev-C++/ExerciseBook/07.41/TestData_DN.txt | 6 + Dev-C++/ExerciseBook/07.42/07.42.cpp | 54 ++ Dev-C++/ExerciseBook/07.42/07.42.dev | 138 +++ Dev-C++/ExerciseBook/07.42/07.42.png | Bin 0 -> 55687 bytes Dev-C++/ExerciseBook/07.42/ALGraph.cpp | 583 ++++++++++++ Dev-C++/ExerciseBook/07.42/ALGraph.h | 150 +++ Dev-C++/ExerciseBook/07.42/ShortestPaths.cpp | 334 +++++++ Dev-C++/ExerciseBook/07.42/ShortestPaths.h | 59 ++ Dev-C++/ExerciseBook/07.42/TestData_DG.txt | 6 + Dev-C++/ExerciseBook/07.42/TestData_DN.txt | 6 + Dev-C++/ExerciseBook/07.42/TestData_UDG.txt | 6 + Dev-C++/ExerciseBook/07.42/TestData_UDN.txt | 6 + .../ExerciseBook/07.14+07.16/07.14+07.16.c | 181 ++++ .../07.14+07.16/07.14+07.16.vcxproj | 82 ++ .../07.14+07.16/07.14+07.16.vcxproj.filters | 44 + .../07.14+07.16/07.14+07.16.vcxproj.user | 3 + VisualC++/ExerciseBook/07.14+07.16/ALGraph.c | 737 +++++++++++++++ VisualC++/ExerciseBook/07.14+07.16/ALGraph.h | 162 ++++ .../ExerciseBook/07.14+07.16/TestData_DG.txt | 6 + .../ExerciseBook/07.14+07.16/TestData_DN.txt | 6 + .../ExerciseBook/07.14+07.16/TestData_UDG.txt | 6 + .../ExerciseBook/07.14+07.16/TestData_UDN.txt | 6 + VisualC++/ExerciseBook/07.15/07.15.c | 191 ++++ VisualC++/ExerciseBook/07.15/07.15.vcxproj | 82 ++ .../ExerciseBook/07.15/07.15.vcxproj.filters | 44 + .../ExerciseBook/07.15/07.15.vcxproj.user | 3 + VisualC++/ExerciseBook/07.15/MGraph.c | 719 +++++++++++++++ VisualC++/ExerciseBook/07.15/MGraph.h | 161 ++++ VisualC++/ExerciseBook/07.15/TestData_DG.txt | 6 + VisualC++/ExerciseBook/07.15/TestData_DN.txt | 6 + VisualC++/ExerciseBook/07.15/TestData_UDG.txt | 6 + VisualC++/ExerciseBook/07.15/TestData_UDN.txt | 6 + VisualC++/ExerciseBook/07.17/07.17.c | 169 ++++ VisualC++/ExerciseBook/07.17/07.17.vcxproj | 82 ++ .../ExerciseBook/07.17/07.17.vcxproj.filters | 44 + .../ExerciseBook/07.17/07.17.vcxproj.user | 3 + VisualC++/ExerciseBook/07.17/OLGraph.c | 861 ++++++++++++++++++ VisualC++/ExerciseBook/07.17/OLGraph.h | 178 ++++ VisualC++/ExerciseBook/07.17/TestData_DG.txt | 6 + VisualC++/ExerciseBook/07.17/TestData_DN.txt | 6 + VisualC++/ExerciseBook/07.17/TestData_UDG.txt | 6 + VisualC++/ExerciseBook/07.17/TestData_UDN.txt | 6 + .../ExerciseBook/07.18-07.19/07.18-07.19.c | 181 ++++ .../07.18-07.19/07.18-07.19.vcxproj | 80 ++ .../07.18-07.19/07.18-07.19.vcxproj.filters | 38 + .../07.18-07.19/07.18-07.19.vcxproj.user | 3 + VisualC++/ExerciseBook/07.18-07.19/AMLGraph.c | 715 +++++++++++++++ VisualC++/ExerciseBook/07.18-07.19/AMLGraph.h | 162 ++++ .../ExerciseBook/07.18-07.19/TestData_UDG.txt | 6 + .../ExerciseBook/07.18-07.19/TestData_UDN.txt | 6 + VisualC++/ExerciseBook/07.20/07.20.c | 78 ++ VisualC++/ExerciseBook/07.20/07.20.png | Bin 0 -> 16161 bytes VisualC++/ExerciseBook/07.20/07.20.vcxproj | 82 ++ .../ExerciseBook/07.20/07.20.vcxproj.filters | 44 + .../ExerciseBook/07.20/07.20.vcxproj.user | 3 + VisualC++/ExerciseBook/07.20/MGraph.c | 482 ++++++++++ VisualC++/ExerciseBook/07.20/MGraph.h | 130 +++ VisualC++/ExerciseBook/07.20/TestData_DG.txt | 6 + VisualC++/ExerciseBook/07.20/TestData_DN.txt | 6 + VisualC++/ExerciseBook/07.20/TestData_UDG.txt | 6 + VisualC++/ExerciseBook/07.20/TestData_UDN.txt | 6 + VisualC++/ExerciseBook/07.21/07.21.c | 75 ++ VisualC++/ExerciseBook/07.21/07.21.png | Bin 0 -> 16161 bytes VisualC++/ExerciseBook/07.21/07.21.vcxproj | 82 ++ .../ExerciseBook/07.21/07.21.vcxproj.filters | 44 + .../ExerciseBook/07.21/07.21.vcxproj.user | 3 + VisualC++/ExerciseBook/07.21/ALGraph.c | 570 ++++++++++++ VisualC++/ExerciseBook/07.21/ALGraph.h | 143 +++ VisualC++/ExerciseBook/07.21/TestData_DG.txt | 6 + VisualC++/ExerciseBook/07.21/TestData_DN.txt | 6 + VisualC++/ExerciseBook/07.21/TestData_UDG.txt | 6 + VisualC++/ExerciseBook/07.21/TestData_UDN.txt | 6 + .../ExerciseBook/07.22-07.23/07.22-07.23.c | 213 +++++ .../ExerciseBook/07.22-07.23/07.22-07.23.png | Bin 0 -> 8413 bytes .../07.22-07.23/07.22-07.23.vcxproj | 81 ++ .../07.22-07.23/07.22-07.23.vcxproj.filters | 41 + .../07.22-07.23/07.22-07.23.vcxproj.user | 3 + VisualC++/ExerciseBook/07.22-07.23/ALGraph.c | 405 ++++++++ VisualC++/ExerciseBook/07.22-07.23/ALGraph.h | 150 +++ .../ExerciseBook/07.22-07.23/LinkQueue.c | 102 +++ .../ExerciseBook/07.22-07.23/LinkQueue.h | 64 ++ .../ExerciseBook/07.22-07.23/TestData_DG.txt | 6 + VisualC++/ExerciseBook/07.24/07.24.c | 91 ++ VisualC++/ExerciseBook/07.24/07.24.png | Bin 0 -> 12105 bytes VisualC++/ExerciseBook/07.24/07.24.vcxproj | 81 ++ .../ExerciseBook/07.24/07.24.vcxproj.filters | 41 + .../ExerciseBook/07.24/07.24.vcxproj.user | 3 + VisualC++/ExerciseBook/07.24/MGraph.c | 219 +++++ VisualC++/ExerciseBook/07.24/MGraph.h | 113 +++ VisualC++/ExerciseBook/07.24/SqStack.c | 106 +++ VisualC++/ExerciseBook/07.24/SqStack.h | 66 ++ VisualC++/ExerciseBook/07.24/TestData_DG.txt | 6 + VisualC++/ExerciseBook/07.25/07.25.c | 134 +++ VisualC++/ExerciseBook/07.25/07.25.png | Bin 0 -> 8338 bytes VisualC++/ExerciseBook/07.25/07.25.vcxproj | 79 ++ .../ExerciseBook/07.25/07.25.vcxproj.filters | 35 + .../ExerciseBook/07.25/07.25.vcxproj.user | 3 + VisualC++/ExerciseBook/07.25/Graph.c | 164 ++++ VisualC++/ExerciseBook/07.25/Graph.h | 53 ++ VisualC++/ExerciseBook/07.25/TestData_DG.txt | 4 + VisualC++/ExerciseBook/07.26/07.26.c | 141 +++ VisualC++/ExerciseBook/07.26/07.26.png | Bin 0 -> 16448 bytes VisualC++/ExerciseBook/07.26/07.26.vcxproj | 83 ++ .../ExerciseBook/07.26/07.26.vcxproj.filters | 47 + .../ExerciseBook/07.26/07.26.vcxproj.user | 3 + VisualC++/ExerciseBook/07.26/ALGraph.c | 325 +++++++ VisualC++/ExerciseBook/07.26/ALGraph.h | 128 +++ VisualC++/ExerciseBook/07.26/SqStack.c | 90 ++ VisualC++/ExerciseBook/07.26/SqStack.h | 59 ++ VisualC++/ExerciseBook/07.26/TestData_DG.txt | 6 + .../ExerciseBook/07.26/TopologicalSorting.c | 96 ++ .../ExerciseBook/07.26/TopologicalSorting.h | 28 + VisualC++/ExerciseBook/07.27/07.27.c | 133 +++ VisualC++/ExerciseBook/07.27/07.27.png | Bin 0 -> 8809 bytes VisualC++/ExerciseBook/07.27/07.27.vcxproj | 79 ++ .../ExerciseBook/07.27/07.27.vcxproj.filters | 35 + .../ExerciseBook/07.27/07.27.vcxproj.user | 3 + VisualC++/ExerciseBook/07.27/ALGraph.c | 595 ++++++++++++ VisualC++/ExerciseBook/07.27/ALGraph.h | 175 ++++ VisualC++/ExerciseBook/07.27/TestData_UDG.txt | 6 + VisualC++/ExerciseBook/07.28/07.28.c | 110 +++ VisualC++/ExerciseBook/07.28/07.28.png | Bin 0 -> 10441 bytes VisualC++/ExerciseBook/07.28/07.28.vcxproj | 79 ++ .../ExerciseBook/07.28/07.28.vcxproj.filters | 35 + .../ExerciseBook/07.28/07.28.vcxproj.user | 3 + VisualC++/ExerciseBook/07.28/MGraph.c | 299 ++++++ VisualC++/ExerciseBook/07.28/MGraph.h | 134 +++ VisualC++/ExerciseBook/07.28/TestData_DG.txt | 6 + VisualC++/ExerciseBook/07.29/07.29.c | 110 +++ VisualC++/ExerciseBook/07.29/07.29.png | Bin 0 -> 10441 bytes VisualC++/ExerciseBook/07.29/07.29.vcxproj | 79 ++ .../ExerciseBook/07.29/07.29.vcxproj.filters | 35 + .../ExerciseBook/07.29/07.29.vcxproj.user | 3 + VisualC++/ExerciseBook/07.29/MGraph.c | 299 ++++++ VisualC++/ExerciseBook/07.29/MGraph.h | 134 +++ VisualC++/ExerciseBook/07.29/TestData_DG.txt | 6 + VisualC++/ExerciseBook/07.30/07.30.c | 99 ++ VisualC++/ExerciseBook/07.30/07.30.png | Bin 0 -> 10195 bytes VisualC++/ExerciseBook/07.30/07.30.vcxproj | 79 ++ .../ExerciseBook/07.30/07.30.vcxproj.filters | 35 + .../ExerciseBook/07.30/07.30.vcxproj.user | 3 + VisualC++/ExerciseBook/07.30/MGraph.c | 299 ++++++ VisualC++/ExerciseBook/07.30/MGraph.h | 134 +++ VisualC++/ExerciseBook/07.30/TestData_DG.txt | 6 + VisualC++/ExerciseBook/07.31/07.31.c | 47 + VisualC++/ExerciseBook/07.31/07.31.png | Bin 0 -> 55908 bytes VisualC++/ExerciseBook/07.31/07.31.vcxproj | 81 ++ .../ExerciseBook/07.31/07.31.vcxproj.filters | 41 + .../ExerciseBook/07.31/07.31.vcxproj.user | 3 + VisualC++/ExerciseBook/07.31/OLGraph.c | 509 +++++++++++ VisualC++/ExerciseBook/07.31/OLGraph.h | 175 ++++ .../07.31/StronglyConnectedComponents.c | 262 ++++++ .../07.31/StronglyConnectedComponents.h | 56 ++ VisualC++/ExerciseBook/07.31/TestData_DG.txt | 6 + VisualC++/ExerciseBook/07.32/07.32.c | 46 + VisualC++/ExerciseBook/07.32/07.32.png | Bin 0 -> 14783 bytes VisualC++/ExerciseBook/07.32/07.32.vcxproj | 85 ++ .../ExerciseBook/07.32/07.32.vcxproj.filters | 53 ++ .../ExerciseBook/07.32/07.32.vcxproj.user | 3 + VisualC++/ExerciseBook/07.32/ALGraph.c | 326 +++++++ VisualC++/ExerciseBook/07.32/ALGraph.h | 128 +++ VisualC++/ExerciseBook/07.32/CSTree.c | 76 ++ VisualC++/ExerciseBook/07.32/CSTree.h | 54 ++ VisualC++/ExerciseBook/07.32/MFSet.c | 93 ++ VisualC++/ExerciseBook/07.32/MFSet.h | 92 ++ .../ExerciseBook/07.32/MinimumSpanningTree.c | 118 +++ .../ExerciseBook/07.32/MinimumSpanningTree.h | 30 + VisualC++/ExerciseBook/07.32/TestData_UDN.txt | 6 + VisualC++/ExerciseBook/07.33/07.33.c | 38 + VisualC++/ExerciseBook/07.33/07.33.png | Bin 0 -> 34695 bytes VisualC++/ExerciseBook/07.33/07.33.vcxproj | 87 ++ .../ExerciseBook/07.33/07.33.vcxproj.filters | 59 ++ .../ExerciseBook/07.33/07.33.vcxproj.user | 3 + VisualC++/ExerciseBook/07.33/CSTree.c | 76 ++ VisualC++/ExerciseBook/07.33/CSTree.h | 53 ++ VisualC++/ExerciseBook/07.33/Graph.c | 244 +++++ VisualC++/ExerciseBook/07.33/Graph.h | 71 ++ VisualC++/ExerciseBook/07.33/MFSet.c | 93 ++ VisualC++/ExerciseBook/07.33/MFSet.h | 92 ++ .../ExerciseBook/07.33/MinimumSpanningTree.c | 142 +++ .../ExerciseBook/07.33/MinimumSpanningTree.h | 22 + VisualC++/ExerciseBook/07.33/SqQueue.c | 147 +++ VisualC++/ExerciseBook/07.33/SqQueue.h | 84 ++ VisualC++/ExerciseBook/07.33/TestData_UDN.txt | 4 + VisualC++/ExerciseBook/07.34/07.34.c | 131 +++ VisualC++/ExerciseBook/07.34/07.34.png | Bin 0 -> 16448 bytes VisualC++/ExerciseBook/07.34/07.34.vcxproj | 83 ++ .../ExerciseBook/07.34/07.34.vcxproj.filters | 47 + .../ExerciseBook/07.34/07.34.vcxproj.user | 3 + VisualC++/ExerciseBook/07.34/ALGraph.c | 325 +++++++ VisualC++/ExerciseBook/07.34/ALGraph.h | 128 +++ VisualC++/ExerciseBook/07.34/SqStack.c | 90 ++ VisualC++/ExerciseBook/07.34/SqStack.h | 59 ++ VisualC++/ExerciseBook/07.34/TestData_DG.txt | 6 + .../ExerciseBook/07.34/TopologicalSorting.c | 96 ++ .../ExerciseBook/07.34/TopologicalSorting.h | 28 + VisualC++/ExerciseBook/07.35/07.35.c | 94 ++ VisualC++/ExerciseBook/07.35/07.35.png | Bin 0 -> 17387 bytes VisualC++/ExerciseBook/07.35/07.35.vcxproj | 79 ++ .../ExerciseBook/07.35/07.35.vcxproj.filters | 35 + .../ExerciseBook/07.35/07.35.vcxproj.user | 3 + VisualC++/ExerciseBook/07.35/ALGraph.c | 325 +++++++ VisualC++/ExerciseBook/07.35/ALGraph.h | 128 +++ VisualC++/ExerciseBook/07.35/TestData_DG.txt | 6 + .../ExerciseBook/07.36-07.37/07.36-07.37.c | 167 ++++ .../ExerciseBook/07.36-07.37/07.36-07.37.png | Bin 0 -> 16448 bytes .../07.36-07.37/07.36-07.37.vcxproj | 83 ++ .../07.36-07.37/07.36-07.37.vcxproj.filters | 47 + .../07.36-07.37/07.36-07.37.vcxproj.user | 3 + VisualC++/ExerciseBook/07.36-07.37/ALGraph.c | 325 +++++++ VisualC++/ExerciseBook/07.36-07.37/ALGraph.h | 128 +++ VisualC++/ExerciseBook/07.36-07.37/SqStack.c | 90 ++ VisualC++/ExerciseBook/07.36-07.37/SqStack.h | 59 ++ .../ExerciseBook/07.36-07.37/TestData_DG.txt | 6 + .../07.36-07.37/TopologicalSorting.c | 96 ++ .../07.36-07.37/TopologicalSorting.h | 28 + VisualC++/ExerciseBook/07.38/07.38.c | 110 +++ VisualC++/ExerciseBook/07.38/07.38.png | Bin 0 -> 27793 bytes VisualC++/ExerciseBook/07.38/07.38.vcxproj | 81 ++ .../ExerciseBook/07.38/07.38.vcxproj.filters | 41 + .../ExerciseBook/07.38/07.38.vcxproj.user | 3 + VisualC++/ExerciseBook/07.38/ALGraph.c | 344 +++++++ VisualC++/ExerciseBook/07.38/ALGraph.h | 131 +++ VisualC++/ExerciseBook/07.38/SqList.c | 114 +++ VisualC++/ExerciseBook/07.38/SqList.h | 73 ++ VisualC++/ExerciseBook/07.38/TestData_DG.txt | 8 + VisualC++/ExerciseBook/07.39/07.39.c | 80 ++ VisualC++/ExerciseBook/07.39/07.39.png | Bin 0 -> 23608 bytes VisualC++/ExerciseBook/07.39/07.39.vcxproj | 83 ++ .../ExerciseBook/07.39/07.39.vcxproj.filters | 47 + .../ExerciseBook/07.39/07.39.vcxproj.user | 3 + VisualC++/ExerciseBook/07.39/BiTree.c | 193 ++++ VisualC++/ExerciseBook/07.39/BiTree.h | 83 ++ VisualC++/ExerciseBook/07.39/LinkQueue.c | 102 +++ VisualC++/ExerciseBook/07.39/LinkQueue.h | 65 ++ VisualC++/ExerciseBook/07.39/SqList.c | 114 +++ VisualC++/ExerciseBook/07.39/SqList.h | 73 ++ VisualC++/ExerciseBook/07.39/TestData_Pre.txt | 1 + VisualC++/ExerciseBook/07.40/07.40.c | 193 ++++ VisualC++/ExerciseBook/07.40/07.40.png | Bin 0 -> 28101 bytes VisualC++/ExerciseBook/07.40/07.40.vcxproj | 81 ++ .../ExerciseBook/07.40/07.40.vcxproj.filters | 41 + .../ExerciseBook/07.40/07.40.vcxproj.user | 3 + VisualC++/ExerciseBook/07.40/ALGraph.c | 377 ++++++++ VisualC++/ExerciseBook/07.40/ALGraph.h | 141 +++ VisualC++/ExerciseBook/07.40/SqList.c | 114 +++ VisualC++/ExerciseBook/07.40/SqList.h | 74 ++ VisualC++/ExerciseBook/07.40/TestData_DG.txt | 8 + VisualC++/ExerciseBook/07.41/07.41.c | 160 ++++ VisualC++/ExerciseBook/07.41/07.41.png | Bin 0 -> 36952 bytes VisualC++/ExerciseBook/07.41/07.41.vcxproj | 81 ++ .../ExerciseBook/07.41/07.41.vcxproj.filters | 41 + .../ExerciseBook/07.41/07.41.vcxproj.user | 3 + VisualC++/ExerciseBook/07.41/ALGraph.c | 326 +++++++ VisualC++/ExerciseBook/07.41/ALGraph.h | 128 +++ VisualC++/ExerciseBook/07.41/SqStack.c | 103 +++ VisualC++/ExerciseBook/07.41/SqStack.h | 66 ++ VisualC++/ExerciseBook/07.41/TestData_DN.txt | 6 + VisualC++/ExerciseBook/07.42/07.42.c | 54 ++ VisualC++/ExerciseBook/07.42/07.42.png | Bin 0 -> 55687 bytes VisualC++/ExerciseBook/07.42/07.42.vcxproj | 84 ++ .../ExerciseBook/07.42/07.42.vcxproj.filters | 50 + .../ExerciseBook/07.42/07.42.vcxproj.user | 3 + VisualC++/ExerciseBook/07.42/ALGraph.c | 583 ++++++++++++ VisualC++/ExerciseBook/07.42/ALGraph.h | 150 +++ VisualC++/ExerciseBook/07.42/ShortestPaths.c | 334 +++++++ VisualC++/ExerciseBook/07.42/ShortestPaths.h | 59 ++ VisualC++/ExerciseBook/07.42/TestData_DG.txt | 6 + VisualC++/ExerciseBook/07.42/TestData_DN.txt | 6 + VisualC++/ExerciseBook/07.42/TestData_UDG.txt | 6 + VisualC++/ExerciseBook/07.42/TestData_UDN.txt | 6 + VisualC++/ExerciseBook/ExerciseBook.sdf | Bin 6836224 -> 8343552 bytes VisualC++/ExerciseBook/ExerciseBook.sln | 150 +++ VisualC++/ExerciseBook/ExerciseBook.suo | Bin 303616 -> 332800 bytes 681 files changed, 69938 insertions(+) create mode 100644 CLion/ExerciseBook/07.14+07.16/07.14+07.16.c create mode 100644 CLion/ExerciseBook/07.14+07.16/ALGraph.c create mode 100644 CLion/ExerciseBook/07.14+07.16/ALGraph.h create mode 100644 CLion/ExerciseBook/07.14+07.16/CMakeLists.txt create mode 100644 CLion/ExerciseBook/07.14+07.16/TestData_DG.txt create mode 100644 CLion/ExerciseBook/07.14+07.16/TestData_DN.txt create mode 100644 CLion/ExerciseBook/07.14+07.16/TestData_UDG.txt create mode 100644 CLion/ExerciseBook/07.14+07.16/TestData_UDN.txt create mode 100644 CLion/ExerciseBook/07.15/07.15.c create mode 100644 CLion/ExerciseBook/07.15/CMakeLists.txt create mode 100644 CLion/ExerciseBook/07.15/MGraph.c create mode 100644 CLion/ExerciseBook/07.15/MGraph.h create mode 100644 CLion/ExerciseBook/07.15/TestData_DG.txt create mode 100644 CLion/ExerciseBook/07.15/TestData_DN.txt create mode 100644 CLion/ExerciseBook/07.15/TestData_UDG.txt create mode 100644 CLion/ExerciseBook/07.15/TestData_UDN.txt create mode 100644 CLion/ExerciseBook/07.17/07.17.c create mode 100644 CLion/ExerciseBook/07.17/CMakeLists.txt create mode 100644 CLion/ExerciseBook/07.17/OLGraph.c create mode 100644 CLion/ExerciseBook/07.17/OLGraph.h create mode 100644 CLion/ExerciseBook/07.17/TestData_DG.txt create mode 100644 CLion/ExerciseBook/07.17/TestData_DN.txt create mode 100644 CLion/ExerciseBook/07.17/TestData_UDG.txt create mode 100644 CLion/ExerciseBook/07.17/TestData_UDN.txt create mode 100644 CLion/ExerciseBook/07.18-07.19/07.18-07.19.c create mode 100644 CLion/ExerciseBook/07.18-07.19/AMLGraph.c create mode 100644 CLion/ExerciseBook/07.18-07.19/AMLGraph.h create mode 100644 CLion/ExerciseBook/07.18-07.19/CMakeLists.txt create mode 100644 CLion/ExerciseBook/07.18-07.19/TestData_UDG.txt create mode 100644 CLion/ExerciseBook/07.18-07.19/TestData_UDN.txt create mode 100644 CLion/ExerciseBook/07.20/07.20.c create mode 100644 CLion/ExerciseBook/07.20/07.20.png create mode 100644 CLion/ExerciseBook/07.20/CMakeLists.txt create mode 100644 CLion/ExerciseBook/07.20/MGraph.c create mode 100644 CLion/ExerciseBook/07.20/MGraph.h create mode 100644 CLion/ExerciseBook/07.20/TestData_DG.txt create mode 100644 CLion/ExerciseBook/07.20/TestData_DN.txt create mode 100644 CLion/ExerciseBook/07.20/TestData_UDG.txt create mode 100644 CLion/ExerciseBook/07.20/TestData_UDN.txt create mode 100644 CLion/ExerciseBook/07.21/07.21.c create mode 100644 CLion/ExerciseBook/07.21/07.21.png create mode 100644 CLion/ExerciseBook/07.21/ALGraph.c create mode 100644 CLion/ExerciseBook/07.21/ALGraph.h create mode 100644 CLion/ExerciseBook/07.21/CMakeLists.txt create mode 100644 CLion/ExerciseBook/07.21/TestData_DG.txt create mode 100644 CLion/ExerciseBook/07.21/TestData_DN.txt create mode 100644 CLion/ExerciseBook/07.21/TestData_UDG.txt create mode 100644 CLion/ExerciseBook/07.21/TestData_UDN.txt create mode 100644 CLion/ExerciseBook/07.22-07.23/07.22-07.23.c create mode 100644 CLion/ExerciseBook/07.22-07.23/07.22-07.23.png create mode 100644 CLion/ExerciseBook/07.22-07.23/ALGraph.c create mode 100644 CLion/ExerciseBook/07.22-07.23/ALGraph.h create mode 100644 CLion/ExerciseBook/07.22-07.23/CMakeLists.txt create mode 100644 CLion/ExerciseBook/07.22-07.23/LinkQueue.c create mode 100644 CLion/ExerciseBook/07.22-07.23/LinkQueue.h create mode 100644 CLion/ExerciseBook/07.22-07.23/TestData_DG.txt create mode 100644 CLion/ExerciseBook/07.24/07.24.c create mode 100644 CLion/ExerciseBook/07.24/07.24.png create mode 100644 CLion/ExerciseBook/07.24/CMakeLists.txt create mode 100644 CLion/ExerciseBook/07.24/MGraph.c create mode 100644 CLion/ExerciseBook/07.24/MGraph.h create mode 100644 CLion/ExerciseBook/07.24/SqStack.c create mode 100644 CLion/ExerciseBook/07.24/SqStack.h create mode 100644 CLion/ExerciseBook/07.24/TestData_DG.txt create mode 100644 CLion/ExerciseBook/07.25/07.25.c create mode 100644 CLion/ExerciseBook/07.25/07.25.png create mode 100644 CLion/ExerciseBook/07.25/CMakeLists.txt create mode 100644 CLion/ExerciseBook/07.25/Graph.c create mode 100644 CLion/ExerciseBook/07.25/Graph.h create mode 100644 CLion/ExerciseBook/07.25/TestData_DG.txt create mode 100644 CLion/ExerciseBook/07.26/07.26.c create mode 100644 CLion/ExerciseBook/07.26/07.26.png create mode 100644 CLion/ExerciseBook/07.26/ALGraph.c create mode 100644 CLion/ExerciseBook/07.26/ALGraph.h create mode 100644 CLion/ExerciseBook/07.26/CMakeLists.txt create mode 100644 CLion/ExerciseBook/07.26/SqStack.c create mode 100644 CLion/ExerciseBook/07.26/SqStack.h create mode 100644 CLion/ExerciseBook/07.26/TestData_DG.txt create mode 100644 CLion/ExerciseBook/07.26/TopologicalSorting.c create mode 100644 CLion/ExerciseBook/07.26/TopologicalSorting.h create mode 100644 CLion/ExerciseBook/07.27/07.27.c create mode 100644 CLion/ExerciseBook/07.27/07.27.png create mode 100644 CLion/ExerciseBook/07.27/ALGraph.c create mode 100644 CLion/ExerciseBook/07.27/ALGraph.h create mode 100644 CLion/ExerciseBook/07.27/CMakeLists.txt create mode 100644 CLion/ExerciseBook/07.27/TestData_UDG.txt create mode 100644 CLion/ExerciseBook/07.28/07.28.c create mode 100644 CLion/ExerciseBook/07.28/07.28.png create mode 100644 CLion/ExerciseBook/07.28/CMakeLists.txt create mode 100644 CLion/ExerciseBook/07.28/MGraph.c create mode 100644 CLion/ExerciseBook/07.28/MGraph.h create mode 100644 CLion/ExerciseBook/07.28/TestData_DG.txt create mode 100644 CLion/ExerciseBook/07.29/07.29.c create mode 100644 CLion/ExerciseBook/07.29/07.29.png create mode 100644 CLion/ExerciseBook/07.29/CMakeLists.txt create mode 100644 CLion/ExerciseBook/07.29/MGraph.c create mode 100644 CLion/ExerciseBook/07.29/MGraph.h create mode 100644 CLion/ExerciseBook/07.29/TestData_DG.txt create mode 100644 CLion/ExerciseBook/07.30/07.30.c create mode 100644 CLion/ExerciseBook/07.30/07.30.png create mode 100644 CLion/ExerciseBook/07.30/CMakeLists.txt create mode 100644 CLion/ExerciseBook/07.30/MGraph.c create mode 100644 CLion/ExerciseBook/07.30/MGraph.h create mode 100644 CLion/ExerciseBook/07.30/TestData_DG.txt create mode 100644 CLion/ExerciseBook/07.31/07.31.c create mode 100644 CLion/ExerciseBook/07.31/07.31.png create mode 100644 CLion/ExerciseBook/07.31/CMakeLists.txt create mode 100644 CLion/ExerciseBook/07.31/OLGraph.c create mode 100644 CLion/ExerciseBook/07.31/OLGraph.h create mode 100644 CLion/ExerciseBook/07.31/StronglyConnectedComponents.c create mode 100644 CLion/ExerciseBook/07.31/StronglyConnectedComponents.h create mode 100644 CLion/ExerciseBook/07.31/TestData_DG.txt create mode 100644 CLion/ExerciseBook/07.32/07.32.c create mode 100644 CLion/ExerciseBook/07.32/07.32.png create mode 100644 CLion/ExerciseBook/07.32/ALGraph.c create mode 100644 CLion/ExerciseBook/07.32/ALGraph.h create mode 100644 CLion/ExerciseBook/07.32/CMakeLists.txt create mode 100644 CLion/ExerciseBook/07.32/CSTree.c create mode 100644 CLion/ExerciseBook/07.32/CSTree.h create mode 100644 CLion/ExerciseBook/07.32/MFSet.c create mode 100644 CLion/ExerciseBook/07.32/MFSet.h create mode 100644 CLion/ExerciseBook/07.32/MinimumSpanningTree.c create mode 100644 CLion/ExerciseBook/07.32/MinimumSpanningTree.h create mode 100644 CLion/ExerciseBook/07.32/TestData_UDN.txt create mode 100644 CLion/ExerciseBook/07.33/07.33.c create mode 100644 CLion/ExerciseBook/07.33/07.33.png create mode 100644 CLion/ExerciseBook/07.33/CMakeLists.txt create mode 100644 CLion/ExerciseBook/07.33/CSTree.c create mode 100644 CLion/ExerciseBook/07.33/CSTree.h create mode 100644 CLion/ExerciseBook/07.33/Graph.c create mode 100644 CLion/ExerciseBook/07.33/Graph.h create mode 100644 CLion/ExerciseBook/07.33/MFSet.c create mode 100644 CLion/ExerciseBook/07.33/MFSet.h create mode 100644 CLion/ExerciseBook/07.33/MinimumSpanningTree.c create mode 100644 CLion/ExerciseBook/07.33/MinimumSpanningTree.h create mode 100644 CLion/ExerciseBook/07.33/SqQueue.c create mode 100644 CLion/ExerciseBook/07.33/SqQueue.h create mode 100644 CLion/ExerciseBook/07.33/TestData_UDN.txt create mode 100644 CLion/ExerciseBook/07.34/07.34.c create mode 100644 CLion/ExerciseBook/07.34/07.34.png create mode 100644 CLion/ExerciseBook/07.34/ALGraph.c create mode 100644 CLion/ExerciseBook/07.34/ALGraph.h create mode 100644 CLion/ExerciseBook/07.34/CMakeLists.txt create mode 100644 CLion/ExerciseBook/07.34/SqStack.c create mode 100644 CLion/ExerciseBook/07.34/SqStack.h create mode 100644 CLion/ExerciseBook/07.34/TestData_DG.txt create mode 100644 CLion/ExerciseBook/07.34/TopologicalSorting.c create mode 100644 CLion/ExerciseBook/07.34/TopologicalSorting.h create mode 100644 CLion/ExerciseBook/07.35/07.35.c create mode 100644 CLion/ExerciseBook/07.35/07.35.png create mode 100644 CLion/ExerciseBook/07.35/ALGraph.c create mode 100644 CLion/ExerciseBook/07.35/ALGraph.h create mode 100644 CLion/ExerciseBook/07.35/CMakeLists.txt create mode 100644 CLion/ExerciseBook/07.35/TestData_DG.txt create mode 100644 CLion/ExerciseBook/07.36-07.37/07.36-07.37.c create mode 100644 CLion/ExerciseBook/07.36-07.37/07.36-07.37.png create mode 100644 CLion/ExerciseBook/07.36-07.37/ALGraph.c create mode 100644 CLion/ExerciseBook/07.36-07.37/ALGraph.h create mode 100644 CLion/ExerciseBook/07.36-07.37/CMakeLists.txt create mode 100644 CLion/ExerciseBook/07.36-07.37/SqStack.c create mode 100644 CLion/ExerciseBook/07.36-07.37/SqStack.h create mode 100644 CLion/ExerciseBook/07.36-07.37/TestData_DG.txt create mode 100644 CLion/ExerciseBook/07.36-07.37/TopologicalSorting.c create mode 100644 CLion/ExerciseBook/07.36-07.37/TopologicalSorting.h create mode 100644 CLion/ExerciseBook/07.38/07.38.c create mode 100644 CLion/ExerciseBook/07.38/07.38.png create mode 100644 CLion/ExerciseBook/07.38/ALGraph.c create mode 100644 CLion/ExerciseBook/07.38/ALGraph.h create mode 100644 CLion/ExerciseBook/07.38/CMakeLists.txt create mode 100644 CLion/ExerciseBook/07.38/SqList.c create mode 100644 CLion/ExerciseBook/07.38/SqList.h create mode 100644 CLion/ExerciseBook/07.38/TestData_DG.txt create mode 100644 CLion/ExerciseBook/07.39/07.39.c create mode 100644 CLion/ExerciseBook/07.39/07.39.png create mode 100644 CLion/ExerciseBook/07.39/BiTree.c create mode 100644 CLion/ExerciseBook/07.39/BiTree.h create mode 100644 CLion/ExerciseBook/07.39/CMakeLists.txt create mode 100644 CLion/ExerciseBook/07.39/LinkQueue.c create mode 100644 CLion/ExerciseBook/07.39/LinkQueue.h create mode 100644 CLion/ExerciseBook/07.39/SqList.c create mode 100644 CLion/ExerciseBook/07.39/SqList.h create mode 100644 CLion/ExerciseBook/07.39/TestData_Pre.txt create mode 100644 CLion/ExerciseBook/07.40/07.40.c create mode 100644 CLion/ExerciseBook/07.40/07.40.png create mode 100644 CLion/ExerciseBook/07.40/ALGraph.c create mode 100644 CLion/ExerciseBook/07.40/ALGraph.h create mode 100644 CLion/ExerciseBook/07.40/CMakeLists.txt create mode 100644 CLion/ExerciseBook/07.40/SqList.c create mode 100644 CLion/ExerciseBook/07.40/SqList.h create mode 100644 CLion/ExerciseBook/07.40/TestData_DG.txt create mode 100644 CLion/ExerciseBook/07.41/07.41.c create mode 100644 CLion/ExerciseBook/07.41/07.41.png create mode 100644 CLion/ExerciseBook/07.41/ALGraph.c create mode 100644 CLion/ExerciseBook/07.41/ALGraph.h create mode 100644 CLion/ExerciseBook/07.41/CMakeLists.txt create mode 100644 CLion/ExerciseBook/07.41/SqStack.c create mode 100644 CLion/ExerciseBook/07.41/SqStack.h create mode 100644 CLion/ExerciseBook/07.41/TestData_DN.txt create mode 100644 CLion/ExerciseBook/07.42/07.42.c create mode 100644 CLion/ExerciseBook/07.42/07.42.png create mode 100644 CLion/ExerciseBook/07.42/ALGraph.c create mode 100644 CLion/ExerciseBook/07.42/ALGraph.h create mode 100644 CLion/ExerciseBook/07.42/CMakeLists.txt create mode 100644 CLion/ExerciseBook/07.42/ShortestPaths.c create mode 100644 CLion/ExerciseBook/07.42/ShortestPaths.h create mode 100644 CLion/ExerciseBook/07.42/TestData_DG.txt create mode 100644 CLion/ExerciseBook/07.42/TestData_DN.txt create mode 100644 CLion/ExerciseBook/07.42/TestData_UDG.txt create mode 100644 CLion/ExerciseBook/07.42/TestData_UDN.txt create mode 100644 Dev-C++/ExerciseBook/07.14+07.16/07.14+07.16.cpp create mode 100644 Dev-C++/ExerciseBook/07.14+07.16/07.14+07.16.dev create mode 100644 Dev-C++/ExerciseBook/07.14+07.16/ALGraph.cpp create mode 100644 Dev-C++/ExerciseBook/07.14+07.16/ALGraph.h create mode 100644 Dev-C++/ExerciseBook/07.14+07.16/TestData_DG.txt create mode 100644 Dev-C++/ExerciseBook/07.14+07.16/TestData_DN.txt create mode 100644 Dev-C++/ExerciseBook/07.14+07.16/TestData_UDG.txt create mode 100644 Dev-C++/ExerciseBook/07.14+07.16/TestData_UDN.txt create mode 100644 Dev-C++/ExerciseBook/07.15/07.15.cpp create mode 100644 Dev-C++/ExerciseBook/07.15/07.15.dev create mode 100644 Dev-C++/ExerciseBook/07.15/MGraph.cpp create mode 100644 Dev-C++/ExerciseBook/07.15/MGraph.h create mode 100644 Dev-C++/ExerciseBook/07.15/TestData_DG.txt create mode 100644 Dev-C++/ExerciseBook/07.15/TestData_DN.txt create mode 100644 Dev-C++/ExerciseBook/07.15/TestData_UDG.txt create mode 100644 Dev-C++/ExerciseBook/07.15/TestData_UDN.txt create mode 100644 Dev-C++/ExerciseBook/07.17/07.17.cpp create mode 100644 Dev-C++/ExerciseBook/07.17/07.17.dev create mode 100644 Dev-C++/ExerciseBook/07.17/OLGraph.cpp create mode 100644 Dev-C++/ExerciseBook/07.17/OLGraph.h create mode 100644 Dev-C++/ExerciseBook/07.17/TestData_DG.txt create mode 100644 Dev-C++/ExerciseBook/07.17/TestData_DN.txt create mode 100644 Dev-C++/ExerciseBook/07.17/TestData_UDG.txt create mode 100644 Dev-C++/ExerciseBook/07.17/TestData_UDN.txt create mode 100644 Dev-C++/ExerciseBook/07.18-07.19/07.18-07.19.cpp create mode 100644 Dev-C++/ExerciseBook/07.18-07.19/07.18-07.19.dev create mode 100644 Dev-C++/ExerciseBook/07.18-07.19/AMLGraph.cpp create mode 100644 Dev-C++/ExerciseBook/07.18-07.19/AMLGraph.h create mode 100644 Dev-C++/ExerciseBook/07.18-07.19/TestData_UDG.txt create mode 100644 Dev-C++/ExerciseBook/07.18-07.19/TestData_UDN.txt create mode 100644 Dev-C++/ExerciseBook/07.20/07.20.cpp create mode 100644 Dev-C++/ExerciseBook/07.20/07.20.dev create mode 100644 Dev-C++/ExerciseBook/07.20/07.20.png create mode 100644 Dev-C++/ExerciseBook/07.20/MGraph.cpp create mode 100644 Dev-C++/ExerciseBook/07.20/MGraph.h create mode 100644 Dev-C++/ExerciseBook/07.20/TestData_DG.txt create mode 100644 Dev-C++/ExerciseBook/07.20/TestData_DN.txt create mode 100644 Dev-C++/ExerciseBook/07.20/TestData_UDG.txt create mode 100644 Dev-C++/ExerciseBook/07.20/TestData_UDN.txt create mode 100644 Dev-C++/ExerciseBook/07.21/07.21.cpp create mode 100644 Dev-C++/ExerciseBook/07.21/07.21.dev create mode 100644 Dev-C++/ExerciseBook/07.21/07.21.png create mode 100644 Dev-C++/ExerciseBook/07.21/ALGraph.cpp create mode 100644 Dev-C++/ExerciseBook/07.21/ALGraph.h create mode 100644 Dev-C++/ExerciseBook/07.21/TestData_DG.txt create mode 100644 Dev-C++/ExerciseBook/07.21/TestData_DN.txt create mode 100644 Dev-C++/ExerciseBook/07.21/TestData_UDG.txt create mode 100644 Dev-C++/ExerciseBook/07.21/TestData_UDN.txt create mode 100644 Dev-C++/ExerciseBook/07.22-07.23/07.22-07.23.cpp create mode 100644 Dev-C++/ExerciseBook/07.22-07.23/07.22-07.23.dev create mode 100644 Dev-C++/ExerciseBook/07.22-07.23/07.22-07.23.png create mode 100644 Dev-C++/ExerciseBook/07.22-07.23/ALGraph.cpp create mode 100644 Dev-C++/ExerciseBook/07.22-07.23/ALGraph.h create mode 100644 Dev-C++/ExerciseBook/07.22-07.23/LinkQueue.cpp create mode 100644 Dev-C++/ExerciseBook/07.22-07.23/LinkQueue.h create mode 100644 Dev-C++/ExerciseBook/07.22-07.23/TestData_DG.txt create mode 100644 Dev-C++/ExerciseBook/07.24/07.24.cpp create mode 100644 Dev-C++/ExerciseBook/07.24/07.24.dev create mode 100644 Dev-C++/ExerciseBook/07.24/07.24.png create mode 100644 Dev-C++/ExerciseBook/07.24/MGraph.cpp create mode 100644 Dev-C++/ExerciseBook/07.24/MGraph.h create mode 100644 Dev-C++/ExerciseBook/07.24/SqStack.cpp create mode 100644 Dev-C++/ExerciseBook/07.24/SqStack.h create mode 100644 Dev-C++/ExerciseBook/07.24/TestData_DG.txt create mode 100644 Dev-C++/ExerciseBook/07.25/07.25.cpp create mode 100644 Dev-C++/ExerciseBook/07.25/07.25.dev create mode 100644 Dev-C++/ExerciseBook/07.25/07.25.png create mode 100644 Dev-C++/ExerciseBook/07.25/Graph.cpp create mode 100644 Dev-C++/ExerciseBook/07.25/Graph.h create mode 100644 Dev-C++/ExerciseBook/07.25/TestData_DG.txt create mode 100644 Dev-C++/ExerciseBook/07.26/07.26.cpp create mode 100644 Dev-C++/ExerciseBook/07.26/07.26.dev create mode 100644 Dev-C++/ExerciseBook/07.26/07.26.png create mode 100644 Dev-C++/ExerciseBook/07.26/ALGraph.cpp create mode 100644 Dev-C++/ExerciseBook/07.26/ALGraph.h create mode 100644 Dev-C++/ExerciseBook/07.26/SqStack.cpp create mode 100644 Dev-C++/ExerciseBook/07.26/SqStack.h create mode 100644 Dev-C++/ExerciseBook/07.26/TestData_DG.txt create mode 100644 Dev-C++/ExerciseBook/07.26/TopologicalSorting.cpp create mode 100644 Dev-C++/ExerciseBook/07.26/TopologicalSorting.h create mode 100644 Dev-C++/ExerciseBook/07.27/07.27.cpp create mode 100644 Dev-C++/ExerciseBook/07.27/07.27.dev create mode 100644 Dev-C++/ExerciseBook/07.27/07.27.png create mode 100644 Dev-C++/ExerciseBook/07.27/ALGraph.cpp create mode 100644 Dev-C++/ExerciseBook/07.27/ALGraph.h create mode 100644 Dev-C++/ExerciseBook/07.27/TestData_UDG.txt create mode 100644 Dev-C++/ExerciseBook/07.28/07.28.cpp create mode 100644 Dev-C++/ExerciseBook/07.28/07.28.dev create mode 100644 Dev-C++/ExerciseBook/07.28/07.28.png create mode 100644 Dev-C++/ExerciseBook/07.28/MGraph.cpp create mode 100644 Dev-C++/ExerciseBook/07.28/MGraph.h create mode 100644 Dev-C++/ExerciseBook/07.28/TestData_DG.txt create mode 100644 Dev-C++/ExerciseBook/07.29/07.29.cpp create mode 100644 Dev-C++/ExerciseBook/07.29/07.29.dev create mode 100644 Dev-C++/ExerciseBook/07.29/07.29.png create mode 100644 Dev-C++/ExerciseBook/07.29/MGraph.cpp create mode 100644 Dev-C++/ExerciseBook/07.29/MGraph.h create mode 100644 Dev-C++/ExerciseBook/07.29/TestData_DG.txt create mode 100644 Dev-C++/ExerciseBook/07.30/07.30.cpp create mode 100644 Dev-C++/ExerciseBook/07.30/07.30.dev create mode 100644 Dev-C++/ExerciseBook/07.30/07.30.png create mode 100644 Dev-C++/ExerciseBook/07.30/MGraph.cpp create mode 100644 Dev-C++/ExerciseBook/07.30/MGraph.h create mode 100644 Dev-C++/ExerciseBook/07.30/TestData_DG.txt create mode 100644 Dev-C++/ExerciseBook/07.31/07.31.cpp create mode 100644 Dev-C++/ExerciseBook/07.31/07.31.dev create mode 100644 Dev-C++/ExerciseBook/07.31/07.31.png create mode 100644 Dev-C++/ExerciseBook/07.31/OLGraph.cpp create mode 100644 Dev-C++/ExerciseBook/07.31/OLGraph.h create mode 100644 Dev-C++/ExerciseBook/07.31/StronglyConnectedComponents.cpp create mode 100644 Dev-C++/ExerciseBook/07.31/StronglyConnectedComponents.h create mode 100644 Dev-C++/ExerciseBook/07.31/TestData_DG.txt create mode 100644 Dev-C++/ExerciseBook/07.32/07.32.cpp create mode 100644 Dev-C++/ExerciseBook/07.32/07.32.dev create mode 100644 Dev-C++/ExerciseBook/07.32/07.32.png create mode 100644 Dev-C++/ExerciseBook/07.32/ALGraph.cpp create mode 100644 Dev-C++/ExerciseBook/07.32/ALGraph.h create mode 100644 Dev-C++/ExerciseBook/07.32/CSTree.cpp create mode 100644 Dev-C++/ExerciseBook/07.32/CSTree.h create mode 100644 Dev-C++/ExerciseBook/07.32/MFSet.cpp create mode 100644 Dev-C++/ExerciseBook/07.32/MFSet.h create mode 100644 Dev-C++/ExerciseBook/07.32/MinimumSpanningTree.cpp create mode 100644 Dev-C++/ExerciseBook/07.32/MinimumSpanningTree.h create mode 100644 Dev-C++/ExerciseBook/07.32/TestData_UDN.txt create mode 100644 Dev-C++/ExerciseBook/07.33/07.33.cpp create mode 100644 Dev-C++/ExerciseBook/07.33/07.33.dev create mode 100644 Dev-C++/ExerciseBook/07.33/07.33.png create mode 100644 Dev-C++/ExerciseBook/07.33/CSTree.cpp create mode 100644 Dev-C++/ExerciseBook/07.33/CSTree.h create mode 100644 Dev-C++/ExerciseBook/07.33/Graph.cpp create mode 100644 Dev-C++/ExerciseBook/07.33/Graph.h create mode 100644 Dev-C++/ExerciseBook/07.33/MFSet.cpp create mode 100644 Dev-C++/ExerciseBook/07.33/MFSet.h create mode 100644 Dev-C++/ExerciseBook/07.33/MinimumSpanningTree.cpp create mode 100644 Dev-C++/ExerciseBook/07.33/MinimumSpanningTree.h create mode 100644 Dev-C++/ExerciseBook/07.33/SqQueue.cpp create mode 100644 Dev-C++/ExerciseBook/07.33/SqQueue.h create mode 100644 Dev-C++/ExerciseBook/07.33/TestData_UDN.txt create mode 100644 Dev-C++/ExerciseBook/07.34/07.34.cpp create mode 100644 Dev-C++/ExerciseBook/07.34/07.34.dev create mode 100644 Dev-C++/ExerciseBook/07.34/07.34.png create mode 100644 Dev-C++/ExerciseBook/07.34/ALGraph.cpp create mode 100644 Dev-C++/ExerciseBook/07.34/ALGraph.h create mode 100644 Dev-C++/ExerciseBook/07.34/SqStack.cpp create mode 100644 Dev-C++/ExerciseBook/07.34/SqStack.h create mode 100644 Dev-C++/ExerciseBook/07.34/TestData_DG.txt create mode 100644 Dev-C++/ExerciseBook/07.34/TopologicalSorting.cpp create mode 100644 Dev-C++/ExerciseBook/07.34/TopologicalSorting.h create mode 100644 Dev-C++/ExerciseBook/07.35/07.35.cpp create mode 100644 Dev-C++/ExerciseBook/07.35/07.35.dev create mode 100644 Dev-C++/ExerciseBook/07.35/07.35.png create mode 100644 Dev-C++/ExerciseBook/07.35/ALGraph.cpp create mode 100644 Dev-C++/ExerciseBook/07.35/ALGraph.h create mode 100644 Dev-C++/ExerciseBook/07.35/TestData_DG.txt create mode 100644 Dev-C++/ExerciseBook/07.36-07.37/07.36-07.37.cpp create mode 100644 Dev-C++/ExerciseBook/07.36-07.37/07.36-07.37.dev create mode 100644 Dev-C++/ExerciseBook/07.36-07.37/07.36-07.37.png create mode 100644 Dev-C++/ExerciseBook/07.36-07.37/ALGraph.cpp create mode 100644 Dev-C++/ExerciseBook/07.36-07.37/ALGraph.h create mode 100644 Dev-C++/ExerciseBook/07.36-07.37/SqStack.cpp create mode 100644 Dev-C++/ExerciseBook/07.36-07.37/SqStack.h create mode 100644 Dev-C++/ExerciseBook/07.36-07.37/TestData_DG.txt create mode 100644 Dev-C++/ExerciseBook/07.36-07.37/TopologicalSorting.cpp create mode 100644 Dev-C++/ExerciseBook/07.36-07.37/TopologicalSorting.h create mode 100644 Dev-C++/ExerciseBook/07.38/07.38.cpp create mode 100644 Dev-C++/ExerciseBook/07.38/07.38.dev create mode 100644 Dev-C++/ExerciseBook/07.38/07.38.png create mode 100644 Dev-C++/ExerciseBook/07.38/ALGraph.cpp create mode 100644 Dev-C++/ExerciseBook/07.38/ALGraph.h create mode 100644 Dev-C++/ExerciseBook/07.38/SqList.cpp create mode 100644 Dev-C++/ExerciseBook/07.38/SqList.h create mode 100644 Dev-C++/ExerciseBook/07.38/TestData_DG.txt create mode 100644 Dev-C++/ExerciseBook/07.39/07.39.cpp create mode 100644 Dev-C++/ExerciseBook/07.39/07.39.dev create mode 100644 Dev-C++/ExerciseBook/07.39/07.39.png create mode 100644 Dev-C++/ExerciseBook/07.39/BiTree.cpp create mode 100644 Dev-C++/ExerciseBook/07.39/BiTree.h create mode 100644 Dev-C++/ExerciseBook/07.39/LinkQueue.cpp create mode 100644 Dev-C++/ExerciseBook/07.39/LinkQueue.h create mode 100644 Dev-C++/ExerciseBook/07.39/SqList.cpp create mode 100644 Dev-C++/ExerciseBook/07.39/SqList.h create mode 100644 Dev-C++/ExerciseBook/07.39/TestData_Pre.txt create mode 100644 Dev-C++/ExerciseBook/07.40/07.40.cpp create mode 100644 Dev-C++/ExerciseBook/07.40/07.40.dev create mode 100644 Dev-C++/ExerciseBook/07.40/07.40.png create mode 100644 Dev-C++/ExerciseBook/07.40/ALGraph.cpp create mode 100644 Dev-C++/ExerciseBook/07.40/ALGraph.h create mode 100644 Dev-C++/ExerciseBook/07.40/SqList.cpp create mode 100644 Dev-C++/ExerciseBook/07.40/SqList.h create mode 100644 Dev-C++/ExerciseBook/07.40/TestData_DG.txt create mode 100644 Dev-C++/ExerciseBook/07.41/07.41.cpp create mode 100644 Dev-C++/ExerciseBook/07.41/07.41.dev create mode 100644 Dev-C++/ExerciseBook/07.41/07.41.png create mode 100644 Dev-C++/ExerciseBook/07.41/ALGraph.cpp create mode 100644 Dev-C++/ExerciseBook/07.41/ALGraph.h create mode 100644 Dev-C++/ExerciseBook/07.41/SqStack.cpp create mode 100644 Dev-C++/ExerciseBook/07.41/SqStack.h create mode 100644 Dev-C++/ExerciseBook/07.41/TestData_DN.txt create mode 100644 Dev-C++/ExerciseBook/07.42/07.42.cpp create mode 100644 Dev-C++/ExerciseBook/07.42/07.42.dev create mode 100644 Dev-C++/ExerciseBook/07.42/07.42.png create mode 100644 Dev-C++/ExerciseBook/07.42/ALGraph.cpp create mode 100644 Dev-C++/ExerciseBook/07.42/ALGraph.h create mode 100644 Dev-C++/ExerciseBook/07.42/ShortestPaths.cpp create mode 100644 Dev-C++/ExerciseBook/07.42/ShortestPaths.h create mode 100644 Dev-C++/ExerciseBook/07.42/TestData_DG.txt create mode 100644 Dev-C++/ExerciseBook/07.42/TestData_DN.txt create mode 100644 Dev-C++/ExerciseBook/07.42/TestData_UDG.txt create mode 100644 Dev-C++/ExerciseBook/07.42/TestData_UDN.txt create mode 100644 VisualC++/ExerciseBook/07.14+07.16/07.14+07.16.c create mode 100644 VisualC++/ExerciseBook/07.14+07.16/07.14+07.16.vcxproj create mode 100644 VisualC++/ExerciseBook/07.14+07.16/07.14+07.16.vcxproj.filters create mode 100644 VisualC++/ExerciseBook/07.14+07.16/07.14+07.16.vcxproj.user create mode 100644 VisualC++/ExerciseBook/07.14+07.16/ALGraph.c create mode 100644 VisualC++/ExerciseBook/07.14+07.16/ALGraph.h create mode 100644 VisualC++/ExerciseBook/07.14+07.16/TestData_DG.txt create mode 100644 VisualC++/ExerciseBook/07.14+07.16/TestData_DN.txt create mode 100644 VisualC++/ExerciseBook/07.14+07.16/TestData_UDG.txt create mode 100644 VisualC++/ExerciseBook/07.14+07.16/TestData_UDN.txt create mode 100644 VisualC++/ExerciseBook/07.15/07.15.c create mode 100644 VisualC++/ExerciseBook/07.15/07.15.vcxproj create mode 100644 VisualC++/ExerciseBook/07.15/07.15.vcxproj.filters create mode 100644 VisualC++/ExerciseBook/07.15/07.15.vcxproj.user create mode 100644 VisualC++/ExerciseBook/07.15/MGraph.c create mode 100644 VisualC++/ExerciseBook/07.15/MGraph.h create mode 100644 VisualC++/ExerciseBook/07.15/TestData_DG.txt create mode 100644 VisualC++/ExerciseBook/07.15/TestData_DN.txt create mode 100644 VisualC++/ExerciseBook/07.15/TestData_UDG.txt create mode 100644 VisualC++/ExerciseBook/07.15/TestData_UDN.txt create mode 100644 VisualC++/ExerciseBook/07.17/07.17.c create mode 100644 VisualC++/ExerciseBook/07.17/07.17.vcxproj create mode 100644 VisualC++/ExerciseBook/07.17/07.17.vcxproj.filters create mode 100644 VisualC++/ExerciseBook/07.17/07.17.vcxproj.user create mode 100644 VisualC++/ExerciseBook/07.17/OLGraph.c create mode 100644 VisualC++/ExerciseBook/07.17/OLGraph.h create mode 100644 VisualC++/ExerciseBook/07.17/TestData_DG.txt create mode 100644 VisualC++/ExerciseBook/07.17/TestData_DN.txt create mode 100644 VisualC++/ExerciseBook/07.17/TestData_UDG.txt create mode 100644 VisualC++/ExerciseBook/07.17/TestData_UDN.txt create mode 100644 VisualC++/ExerciseBook/07.18-07.19/07.18-07.19.c create mode 100644 VisualC++/ExerciseBook/07.18-07.19/07.18-07.19.vcxproj create mode 100644 VisualC++/ExerciseBook/07.18-07.19/07.18-07.19.vcxproj.filters create mode 100644 VisualC++/ExerciseBook/07.18-07.19/07.18-07.19.vcxproj.user create mode 100644 VisualC++/ExerciseBook/07.18-07.19/AMLGraph.c create mode 100644 VisualC++/ExerciseBook/07.18-07.19/AMLGraph.h create mode 100644 VisualC++/ExerciseBook/07.18-07.19/TestData_UDG.txt create mode 100644 VisualC++/ExerciseBook/07.18-07.19/TestData_UDN.txt create mode 100644 VisualC++/ExerciseBook/07.20/07.20.c create mode 100644 VisualC++/ExerciseBook/07.20/07.20.png create mode 100644 VisualC++/ExerciseBook/07.20/07.20.vcxproj create mode 100644 VisualC++/ExerciseBook/07.20/07.20.vcxproj.filters create mode 100644 VisualC++/ExerciseBook/07.20/07.20.vcxproj.user create mode 100644 VisualC++/ExerciseBook/07.20/MGraph.c create mode 100644 VisualC++/ExerciseBook/07.20/MGraph.h create mode 100644 VisualC++/ExerciseBook/07.20/TestData_DG.txt create mode 100644 VisualC++/ExerciseBook/07.20/TestData_DN.txt create mode 100644 VisualC++/ExerciseBook/07.20/TestData_UDG.txt create mode 100644 VisualC++/ExerciseBook/07.20/TestData_UDN.txt create mode 100644 VisualC++/ExerciseBook/07.21/07.21.c create mode 100644 VisualC++/ExerciseBook/07.21/07.21.png create mode 100644 VisualC++/ExerciseBook/07.21/07.21.vcxproj create mode 100644 VisualC++/ExerciseBook/07.21/07.21.vcxproj.filters create mode 100644 VisualC++/ExerciseBook/07.21/07.21.vcxproj.user create mode 100644 VisualC++/ExerciseBook/07.21/ALGraph.c create mode 100644 VisualC++/ExerciseBook/07.21/ALGraph.h create mode 100644 VisualC++/ExerciseBook/07.21/TestData_DG.txt create mode 100644 VisualC++/ExerciseBook/07.21/TestData_DN.txt create mode 100644 VisualC++/ExerciseBook/07.21/TestData_UDG.txt create mode 100644 VisualC++/ExerciseBook/07.21/TestData_UDN.txt create mode 100644 VisualC++/ExerciseBook/07.22-07.23/07.22-07.23.c create mode 100644 VisualC++/ExerciseBook/07.22-07.23/07.22-07.23.png create mode 100644 VisualC++/ExerciseBook/07.22-07.23/07.22-07.23.vcxproj create mode 100644 VisualC++/ExerciseBook/07.22-07.23/07.22-07.23.vcxproj.filters create mode 100644 VisualC++/ExerciseBook/07.22-07.23/07.22-07.23.vcxproj.user create mode 100644 VisualC++/ExerciseBook/07.22-07.23/ALGraph.c create mode 100644 VisualC++/ExerciseBook/07.22-07.23/ALGraph.h create mode 100644 VisualC++/ExerciseBook/07.22-07.23/LinkQueue.c create mode 100644 VisualC++/ExerciseBook/07.22-07.23/LinkQueue.h create mode 100644 VisualC++/ExerciseBook/07.22-07.23/TestData_DG.txt create mode 100644 VisualC++/ExerciseBook/07.24/07.24.c create mode 100644 VisualC++/ExerciseBook/07.24/07.24.png create mode 100644 VisualC++/ExerciseBook/07.24/07.24.vcxproj create mode 100644 VisualC++/ExerciseBook/07.24/07.24.vcxproj.filters create mode 100644 VisualC++/ExerciseBook/07.24/07.24.vcxproj.user create mode 100644 VisualC++/ExerciseBook/07.24/MGraph.c create mode 100644 VisualC++/ExerciseBook/07.24/MGraph.h create mode 100644 VisualC++/ExerciseBook/07.24/SqStack.c create mode 100644 VisualC++/ExerciseBook/07.24/SqStack.h create mode 100644 VisualC++/ExerciseBook/07.24/TestData_DG.txt create mode 100644 VisualC++/ExerciseBook/07.25/07.25.c create mode 100644 VisualC++/ExerciseBook/07.25/07.25.png create mode 100644 VisualC++/ExerciseBook/07.25/07.25.vcxproj create mode 100644 VisualC++/ExerciseBook/07.25/07.25.vcxproj.filters create mode 100644 VisualC++/ExerciseBook/07.25/07.25.vcxproj.user create mode 100644 VisualC++/ExerciseBook/07.25/Graph.c create mode 100644 VisualC++/ExerciseBook/07.25/Graph.h create mode 100644 VisualC++/ExerciseBook/07.25/TestData_DG.txt create mode 100644 VisualC++/ExerciseBook/07.26/07.26.c create mode 100644 VisualC++/ExerciseBook/07.26/07.26.png create mode 100644 VisualC++/ExerciseBook/07.26/07.26.vcxproj create mode 100644 VisualC++/ExerciseBook/07.26/07.26.vcxproj.filters create mode 100644 VisualC++/ExerciseBook/07.26/07.26.vcxproj.user create mode 100644 VisualC++/ExerciseBook/07.26/ALGraph.c create mode 100644 VisualC++/ExerciseBook/07.26/ALGraph.h create mode 100644 VisualC++/ExerciseBook/07.26/SqStack.c create mode 100644 VisualC++/ExerciseBook/07.26/SqStack.h create mode 100644 VisualC++/ExerciseBook/07.26/TestData_DG.txt create mode 100644 VisualC++/ExerciseBook/07.26/TopologicalSorting.c create mode 100644 VisualC++/ExerciseBook/07.26/TopologicalSorting.h create mode 100644 VisualC++/ExerciseBook/07.27/07.27.c create mode 100644 VisualC++/ExerciseBook/07.27/07.27.png create mode 100644 VisualC++/ExerciseBook/07.27/07.27.vcxproj create mode 100644 VisualC++/ExerciseBook/07.27/07.27.vcxproj.filters create mode 100644 VisualC++/ExerciseBook/07.27/07.27.vcxproj.user create mode 100644 VisualC++/ExerciseBook/07.27/ALGraph.c create mode 100644 VisualC++/ExerciseBook/07.27/ALGraph.h create mode 100644 VisualC++/ExerciseBook/07.27/TestData_UDG.txt create mode 100644 VisualC++/ExerciseBook/07.28/07.28.c create mode 100644 VisualC++/ExerciseBook/07.28/07.28.png create mode 100644 VisualC++/ExerciseBook/07.28/07.28.vcxproj create mode 100644 VisualC++/ExerciseBook/07.28/07.28.vcxproj.filters create mode 100644 VisualC++/ExerciseBook/07.28/07.28.vcxproj.user create mode 100644 VisualC++/ExerciseBook/07.28/MGraph.c create mode 100644 VisualC++/ExerciseBook/07.28/MGraph.h create mode 100644 VisualC++/ExerciseBook/07.28/TestData_DG.txt create mode 100644 VisualC++/ExerciseBook/07.29/07.29.c create mode 100644 VisualC++/ExerciseBook/07.29/07.29.png create mode 100644 VisualC++/ExerciseBook/07.29/07.29.vcxproj create mode 100644 VisualC++/ExerciseBook/07.29/07.29.vcxproj.filters create mode 100644 VisualC++/ExerciseBook/07.29/07.29.vcxproj.user create mode 100644 VisualC++/ExerciseBook/07.29/MGraph.c create mode 100644 VisualC++/ExerciseBook/07.29/MGraph.h create mode 100644 VisualC++/ExerciseBook/07.29/TestData_DG.txt create mode 100644 VisualC++/ExerciseBook/07.30/07.30.c create mode 100644 VisualC++/ExerciseBook/07.30/07.30.png create mode 100644 VisualC++/ExerciseBook/07.30/07.30.vcxproj create mode 100644 VisualC++/ExerciseBook/07.30/07.30.vcxproj.filters create mode 100644 VisualC++/ExerciseBook/07.30/07.30.vcxproj.user create mode 100644 VisualC++/ExerciseBook/07.30/MGraph.c create mode 100644 VisualC++/ExerciseBook/07.30/MGraph.h create mode 100644 VisualC++/ExerciseBook/07.30/TestData_DG.txt create mode 100644 VisualC++/ExerciseBook/07.31/07.31.c create mode 100644 VisualC++/ExerciseBook/07.31/07.31.png create mode 100644 VisualC++/ExerciseBook/07.31/07.31.vcxproj create mode 100644 VisualC++/ExerciseBook/07.31/07.31.vcxproj.filters create mode 100644 VisualC++/ExerciseBook/07.31/07.31.vcxproj.user create mode 100644 VisualC++/ExerciseBook/07.31/OLGraph.c create mode 100644 VisualC++/ExerciseBook/07.31/OLGraph.h create mode 100644 VisualC++/ExerciseBook/07.31/StronglyConnectedComponents.c create mode 100644 VisualC++/ExerciseBook/07.31/StronglyConnectedComponents.h create mode 100644 VisualC++/ExerciseBook/07.31/TestData_DG.txt create mode 100644 VisualC++/ExerciseBook/07.32/07.32.c create mode 100644 VisualC++/ExerciseBook/07.32/07.32.png create mode 100644 VisualC++/ExerciseBook/07.32/07.32.vcxproj create mode 100644 VisualC++/ExerciseBook/07.32/07.32.vcxproj.filters create mode 100644 VisualC++/ExerciseBook/07.32/07.32.vcxproj.user create mode 100644 VisualC++/ExerciseBook/07.32/ALGraph.c create mode 100644 VisualC++/ExerciseBook/07.32/ALGraph.h create mode 100644 VisualC++/ExerciseBook/07.32/CSTree.c create mode 100644 VisualC++/ExerciseBook/07.32/CSTree.h create mode 100644 VisualC++/ExerciseBook/07.32/MFSet.c create mode 100644 VisualC++/ExerciseBook/07.32/MFSet.h create mode 100644 VisualC++/ExerciseBook/07.32/MinimumSpanningTree.c create mode 100644 VisualC++/ExerciseBook/07.32/MinimumSpanningTree.h create mode 100644 VisualC++/ExerciseBook/07.32/TestData_UDN.txt create mode 100644 VisualC++/ExerciseBook/07.33/07.33.c create mode 100644 VisualC++/ExerciseBook/07.33/07.33.png create mode 100644 VisualC++/ExerciseBook/07.33/07.33.vcxproj create mode 100644 VisualC++/ExerciseBook/07.33/07.33.vcxproj.filters create mode 100644 VisualC++/ExerciseBook/07.33/07.33.vcxproj.user create mode 100644 VisualC++/ExerciseBook/07.33/CSTree.c create mode 100644 VisualC++/ExerciseBook/07.33/CSTree.h create mode 100644 VisualC++/ExerciseBook/07.33/Graph.c create mode 100644 VisualC++/ExerciseBook/07.33/Graph.h create mode 100644 VisualC++/ExerciseBook/07.33/MFSet.c create mode 100644 VisualC++/ExerciseBook/07.33/MFSet.h create mode 100644 VisualC++/ExerciseBook/07.33/MinimumSpanningTree.c create mode 100644 VisualC++/ExerciseBook/07.33/MinimumSpanningTree.h create mode 100644 VisualC++/ExerciseBook/07.33/SqQueue.c create mode 100644 VisualC++/ExerciseBook/07.33/SqQueue.h create mode 100644 VisualC++/ExerciseBook/07.33/TestData_UDN.txt create mode 100644 VisualC++/ExerciseBook/07.34/07.34.c create mode 100644 VisualC++/ExerciseBook/07.34/07.34.png create mode 100644 VisualC++/ExerciseBook/07.34/07.34.vcxproj create mode 100644 VisualC++/ExerciseBook/07.34/07.34.vcxproj.filters create mode 100644 VisualC++/ExerciseBook/07.34/07.34.vcxproj.user create mode 100644 VisualC++/ExerciseBook/07.34/ALGraph.c create mode 100644 VisualC++/ExerciseBook/07.34/ALGraph.h create mode 100644 VisualC++/ExerciseBook/07.34/SqStack.c create mode 100644 VisualC++/ExerciseBook/07.34/SqStack.h create mode 100644 VisualC++/ExerciseBook/07.34/TestData_DG.txt create mode 100644 VisualC++/ExerciseBook/07.34/TopologicalSorting.c create mode 100644 VisualC++/ExerciseBook/07.34/TopologicalSorting.h create mode 100644 VisualC++/ExerciseBook/07.35/07.35.c create mode 100644 VisualC++/ExerciseBook/07.35/07.35.png create mode 100644 VisualC++/ExerciseBook/07.35/07.35.vcxproj create mode 100644 VisualC++/ExerciseBook/07.35/07.35.vcxproj.filters create mode 100644 VisualC++/ExerciseBook/07.35/07.35.vcxproj.user create mode 100644 VisualC++/ExerciseBook/07.35/ALGraph.c create mode 100644 VisualC++/ExerciseBook/07.35/ALGraph.h create mode 100644 VisualC++/ExerciseBook/07.35/TestData_DG.txt create mode 100644 VisualC++/ExerciseBook/07.36-07.37/07.36-07.37.c create mode 100644 VisualC++/ExerciseBook/07.36-07.37/07.36-07.37.png create mode 100644 VisualC++/ExerciseBook/07.36-07.37/07.36-07.37.vcxproj create mode 100644 VisualC++/ExerciseBook/07.36-07.37/07.36-07.37.vcxproj.filters create mode 100644 VisualC++/ExerciseBook/07.36-07.37/07.36-07.37.vcxproj.user create mode 100644 VisualC++/ExerciseBook/07.36-07.37/ALGraph.c create mode 100644 VisualC++/ExerciseBook/07.36-07.37/ALGraph.h create mode 100644 VisualC++/ExerciseBook/07.36-07.37/SqStack.c create mode 100644 VisualC++/ExerciseBook/07.36-07.37/SqStack.h create mode 100644 VisualC++/ExerciseBook/07.36-07.37/TestData_DG.txt create mode 100644 VisualC++/ExerciseBook/07.36-07.37/TopologicalSorting.c create mode 100644 VisualC++/ExerciseBook/07.36-07.37/TopologicalSorting.h create mode 100644 VisualC++/ExerciseBook/07.38/07.38.c create mode 100644 VisualC++/ExerciseBook/07.38/07.38.png create mode 100644 VisualC++/ExerciseBook/07.38/07.38.vcxproj create mode 100644 VisualC++/ExerciseBook/07.38/07.38.vcxproj.filters create mode 100644 VisualC++/ExerciseBook/07.38/07.38.vcxproj.user create mode 100644 VisualC++/ExerciseBook/07.38/ALGraph.c create mode 100644 VisualC++/ExerciseBook/07.38/ALGraph.h create mode 100644 VisualC++/ExerciseBook/07.38/SqList.c create mode 100644 VisualC++/ExerciseBook/07.38/SqList.h create mode 100644 VisualC++/ExerciseBook/07.38/TestData_DG.txt create mode 100644 VisualC++/ExerciseBook/07.39/07.39.c create mode 100644 VisualC++/ExerciseBook/07.39/07.39.png create mode 100644 VisualC++/ExerciseBook/07.39/07.39.vcxproj create mode 100644 VisualC++/ExerciseBook/07.39/07.39.vcxproj.filters create mode 100644 VisualC++/ExerciseBook/07.39/07.39.vcxproj.user create mode 100644 VisualC++/ExerciseBook/07.39/BiTree.c create mode 100644 VisualC++/ExerciseBook/07.39/BiTree.h create mode 100644 VisualC++/ExerciseBook/07.39/LinkQueue.c create mode 100644 VisualC++/ExerciseBook/07.39/LinkQueue.h create mode 100644 VisualC++/ExerciseBook/07.39/SqList.c create mode 100644 VisualC++/ExerciseBook/07.39/SqList.h create mode 100644 VisualC++/ExerciseBook/07.39/TestData_Pre.txt create mode 100644 VisualC++/ExerciseBook/07.40/07.40.c create mode 100644 VisualC++/ExerciseBook/07.40/07.40.png create mode 100644 VisualC++/ExerciseBook/07.40/07.40.vcxproj create mode 100644 VisualC++/ExerciseBook/07.40/07.40.vcxproj.filters create mode 100644 VisualC++/ExerciseBook/07.40/07.40.vcxproj.user create mode 100644 VisualC++/ExerciseBook/07.40/ALGraph.c create mode 100644 VisualC++/ExerciseBook/07.40/ALGraph.h create mode 100644 VisualC++/ExerciseBook/07.40/SqList.c create mode 100644 VisualC++/ExerciseBook/07.40/SqList.h create mode 100644 VisualC++/ExerciseBook/07.40/TestData_DG.txt create mode 100644 VisualC++/ExerciseBook/07.41/07.41.c create mode 100644 VisualC++/ExerciseBook/07.41/07.41.png create mode 100644 VisualC++/ExerciseBook/07.41/07.41.vcxproj create mode 100644 VisualC++/ExerciseBook/07.41/07.41.vcxproj.filters create mode 100644 VisualC++/ExerciseBook/07.41/07.41.vcxproj.user create mode 100644 VisualC++/ExerciseBook/07.41/ALGraph.c create mode 100644 VisualC++/ExerciseBook/07.41/ALGraph.h create mode 100644 VisualC++/ExerciseBook/07.41/SqStack.c create mode 100644 VisualC++/ExerciseBook/07.41/SqStack.h create mode 100644 VisualC++/ExerciseBook/07.41/TestData_DN.txt create mode 100644 VisualC++/ExerciseBook/07.42/07.42.c create mode 100644 VisualC++/ExerciseBook/07.42/07.42.png create mode 100644 VisualC++/ExerciseBook/07.42/07.42.vcxproj create mode 100644 VisualC++/ExerciseBook/07.42/07.42.vcxproj.filters create mode 100644 VisualC++/ExerciseBook/07.42/07.42.vcxproj.user create mode 100644 VisualC++/ExerciseBook/07.42/ALGraph.c create mode 100644 VisualC++/ExerciseBook/07.42/ALGraph.h create mode 100644 VisualC++/ExerciseBook/07.42/ShortestPaths.c create mode 100644 VisualC++/ExerciseBook/07.42/ShortestPaths.h create mode 100644 VisualC++/ExerciseBook/07.42/TestData_DG.txt create mode 100644 VisualC++/ExerciseBook/07.42/TestData_DN.txt create mode 100644 VisualC++/ExerciseBook/07.42/TestData_UDG.txt create mode 100644 VisualC++/ExerciseBook/07.42/TestData_UDN.txt diff --git a/CLion/ExerciseBook/07.14+07.16/07.14+07.16.c b/CLion/ExerciseBook/07.14+07.16/07.14+07.16.c new file mode 100644 index 0000000..4308a68 --- /dev/null +++ b/CLion/ExerciseBook/07.14+07.16/07.14+07.16.c @@ -0,0 +1,181 @@ +#include +#include // æä¾›å®va_listã€va_startã€va_argã€va_end +#include "Status.h" //**â–²01 绪论**// +#include "ALGraph.h" //**â–²07 图**// + +/* + * 创建图/表 + */ +Status CreateGraph_7_14(ALGraph* G, char* path[]); + +/* + * æ’入顶点 + * + * 将指定的顶点v追加到顶点集中,未建立该顶点与其他顶点的关系 + */ +Status InsertVex_7_16(ALGraph* G, VertexType v); + +/* + * 删除顶点 + * + * 从顶点集中删除指定的顶点v,注æ„éœ€è¦æ›´æ–°ç›¸å…³çš„顶点关系 + */ +Status DeleteVex_7_16(ALGraph* G, VertexType v); + +/* + * æ’入边/å¼§ + * + * 如果当å‰å›¾/网是无å‘的,则æ’入一æ¡å¼§éœ€è¦å¢žåŠ ä¸¤ä¸ªé¡¶ç‚¹å…³ç³»ï¼Œä½†å¼§çš„æ•°é‡åªå¢žä¸€ã€‚ + * + * 对于图æ¥è¯´ï¼Œå¯ä»¥åœ¨å¯å˜å‚数中列出边/弧的附加信æ¯ï¼› + * 对于网æ¥è¯´ï¼Œå¯ä»¥åœ¨å¯å˜å‚æ•°ä¸­ä¾æ¬¡åˆ—出边/å¼§çš„æƒå€¼ä»¥åŠé™„加信æ¯ã€‚ + */ +Status InsertArc_7_16(ALGraph* G, VertexType v, VertexType w, ...); + +/* + * 删除边/å¼§ + * + * æ­¤åˆ é™¤åªæ˜¯æ›´æ–°è¾¹/弧的连通关系 + */ +Status DeleteArc_7_16(ALGraph* G, VertexType v, VertexType w); + + +int main(int argc, char* argv[]) { + ALGraph G; + + printf("████████ 创建并输出图/网...\n"); + { + char* path[4]; + + path[0] = "TestData_DG.txt"; + path[1] = "TestData_DN.txt"; + path[2] = "TestData_UDG.txt"; + path[3] = "TestData_UDN.txt"; + + CreateGraph_7_14(&G, path); + PrintGraph(G); + printf("\n"); + } + + printf("████████ 删除顶点...\n"); + { + VertexType v = 'X'; + + printf("删除顶点 '%c' åŽçš„图为:\n", v); + DeleteVex_7_16(&G, v); + PrintGraph(G); + printf("\n"); + } + + printf("████████ æ’入顶点...\n"); + { + VertexType v = 'Y'; + + printf("æ’入顶点 '%c' åŽçš„图为:\n", v); + InsertVex_7_16(&G, v); + PrintGraph(G); + printf("\n"); + } + + printf("████████ æ’入边/å¼§...\n"); + { + // 注:是é‡å¤çš„è¾¹ + VertexType v[10] = {'B', 'C', 'E', 'Y', 'Y', 'Y', 'D', 'D', 'E', 'E'}; + VertexType w[10] = {'Y', 'Y', 'Y', 'A', 'B', 'D', 'C', 'A', 'B', 'D'}; + InfoType info[10] = {{8}, {5}, {1}, {11}, {2}, {6}, {3}, {7}, {2}, {9}}; + int k; + + // 图 + if(G.kind == DG || G.kind == UDG) { + for(k = 0; k < 10; k++) { + printf("æ’入无æƒå€¼çš„边:<%c, %c>...\n", v[k], w[k]); + InsertArc_7_16(&G, v[k], w[k]); + } + + // 网 + } else if(G.kind == DN || G.kind == UDN) { + for(k = 0; k < 10; k++) { + printf("æ’入带æƒå€¼çš„边:<%c, %c, %d>...\n", v[k], w[k], info[k].weight); + InsertArc_7_16(&G, v[k], w[k], &info[k]); + } + } else { + return ERROR; + } + + PrintGraph(G); + printf("\n"); + } + + printf("████████ 删除边/å¼§...\n"); + { + VertexType v[3] = {'D', 'E', 'F'}; + VertexType w[3] = {'A', 'B', 'B'}; + int k; + + for(k = 0; k < 3; k++) { + printf("删除边:<%c, %c>...\n", v[k], w[k]); + DeleteArc_7_16(&G, v[k], w[k]); + } + PrintGraph(G); + printf("\n"); + } + + return 0; +} + + +/* + * 创建图/表 + */ +Status CreateGraph_7_14(ALGraph* G, char* path[]) { + return CreateGraph(G, path); +} + +/* + * æ’入顶点 + * + * 将指定的顶点v追加到顶点集中,未建立该顶点与其他顶点的关系 + */ +Status InsertVex_7_16(ALGraph* G, VertexType v) { + return InsertVex(G, v); +} + +/* + * 删除顶点 + * + * 从顶点集中删除指定的顶点v,注æ„éœ€è¦æ›´æ–°ç›¸å…³çš„顶点关系 + */ +Status DeleteVex_7_16(ALGraph* G, VertexType v) { + return DeleteVex(G, v); +} + +/* + * æ’入边/å¼§ + * + * 如果当å‰å›¾/网是无å‘的,则æ’入一æ¡å¼§éœ€è¦å¢žåŠ ä¸¤ä¸ªé¡¶ç‚¹å…³ç³»ï¼Œä½†å¼§çš„æ•°é‡åªå¢žä¸€ã€‚ + * + * 对于图æ¥è¯´ï¼Œå¯ä»¥åœ¨å¯å˜å‚数中列出边/弧的附加信æ¯ï¼› + * 对于网æ¥è¯´ï¼Œå¯ä»¥åœ¨å¯å˜å‚æ•°ä¸­ä¾æ¬¡åˆ—出边/å¼§çš„æƒå€¼ä»¥åŠé™„加信æ¯ã€‚ + */ +Status InsertArc_7_16(ALGraph* G, VertexType v, VertexType w, ...) { + va_list ap; + InfoType* info = NULL; // è¾¹/å¼§çš„é™„åŠ ä¿¡æ¯ + + // 如果边/å¼§ä¸Šå­˜åœ¨é™„åŠ ä¿¡æ¯ + if(IncInfo) { + va_start(ap, w); // 在wåŽæŸ¥è¯¢é¦–个å¯å˜å‚æ•° + info = va_arg(ap, InfoType*); // 获å–é™„åŠ ä¿¡æ¯ + va_end(ap); + } + + return InsertArc(G, v, w, info); +} + +/* + * 删除边/å¼§ + * + * æ­¤åˆ é™¤åªæ˜¯æ›´æ–°è¾¹/弧的连通关系 + */ +Status DeleteArc_7_16(ALGraph* G, VertexType v, VertexType w) { + return DeleteArc(G, v, w); +} diff --git a/CLion/ExerciseBook/07.14+07.16/ALGraph.c b/CLion/ExerciseBook/07.14+07.16/ALGraph.c new file mode 100644 index 0000000..fe1d06c --- /dev/null +++ b/CLion/ExerciseBook/07.14+07.16/ALGraph.c @@ -0,0 +1,737 @@ +/*================== + * 图的邻接表存储表示 + ===================*/ + +#include "ALGraph.h" + +// 录入数æ®çš„æºæ–‡ä»¶ï¼›fp为null时,说明需è¦ä»ŽæŽ§åˆ¶å°å½•å…¥ +static FILE* fp = NULL; + +/* + * IncInfo指示该图/网的边/弧上是å¦å­˜åœ¨é™„加信æ¯ã€‚ + * 如果其值ä¸ä¸º0,则表示无附加信æ¯ï¼Œå¦åˆ™ï¼Œè¡¨ç¤ºå­˜åœ¨é™„加信æ¯ã€‚ + */ +Boolean IncInfo = FALSE; + +// 访问标志数组,记录访问过的顶点 +static Boolean visited[MAX_VERTEX_NUM]; + +// 函数å˜é‡ +static Status (* VisitFunc)(VertexType e); + + +/* + * 创建 + * + *ã€å¤‡æ³¨ã€‘ + * + * æ•™æä¸­é»˜è®¤ä»ŽæŽ§åˆ¶å°è¯»å–æ•°æ®ã€‚ + * 这里为了方便测试,é¿å…æ¯æ¬¡è¿è¡Œéƒ½æ‰‹åŠ¨è¾“å…¥æ•°æ®ï¼Œ + * 因而å…许选择从预设的文件pathä¸­è¯»å–æµ‹è¯•æ•°æ®ã€‚ + * + * 如果需è¦ä»ŽæŽ§åˆ¶å°è¯»å–æ•°æ®ï¼Œåˆ™path为NULL,或path[kind]为""。 + * 如果需è¦ä»Žæ–‡ä»¶ä¸­è¯»å–æ•°æ®ï¼Œåˆ™éœ€è¦åœ¨path中填写文件åä¿¡æ¯ã€‚ + */ +Status CreateGraph(ALGraph* G, char* path[]) { + int readFromConsole; // 是å¦ä»ŽæŽ§åˆ¶å°è¯»å–æ•°æ® + int kind; + Status flag; + + printf("请输入图的类型(0-有å‘图 │ 1-有å‘网 │ 2-æ— å‘图 │ 3-æ— å‘网):"); + scanf("%d", &kind); + + // 类型ä¸åˆè§„ + if(kind < 0 || kind > 3) { + return ERROR; + } + + // 如果没有文件路径信æ¯ï¼Œåˆ™ä»ŽæŽ§åˆ¶å°è¯»å–输入 + readFromConsole = (path == NULL) || strcmp(path[kind], "") == 0; + + // 需è¦ä»Žæ–‡ä»¶è¯»å– + if(readFromConsole) { + (*G).kind = kind; // 记录图/网的类型 + } else { + // æ‰“å¼€æ–‡ä»¶ï¼Œå‡†å¤‡è¯»å–æµ‹è¯•æ•°æ® + fp = fopen(path[kind], "r"); + if(fp == NULL) { + return ERROR; + } + + // 录入图的类型 + ReadData(fp, "%d", &((*G).kind)); + } + + // éšæœºåˆ›å»ºæœ‰å‘图/网或无å‘图/ç½‘çš„ä¸€ç§ + switch((*G).kind) { + case DG: + flag = CreateDG(G); + break; + case DN: + flag = CreateDN(G); + break; + case UDG: + flag = CreateUDG(G); + break; + case UDN: + flag = CreateUDN(G); + break; + default: + flag = ERROR; + break; + } + + if(fp != NULL) { + fclose(fp); + fp = NULL; + } + + return flag; +} + +/* + * 构造有å‘图 + */ +static Status CreateDG(ALGraph* G) { + int i, k; + int vexnum, arcnum; + VertexType v1, v2; + InfoType* info = NULL; + + (*G).vexnum = (*G).arcnum = 0; + + if(fp == NULL) { + printf("请输入有å‘图的顶点数:"); + scanf("%d", &vexnum); + printf("请输入有å‘图的弧数:"); + scanf("%d", &arcnum); + printf("该有å‘图的弧上是å¦åŒ…å«å…¶ä»–附加信æ¯(0-ä¸åŒ…å«â”‚1-包å«):"); + scanf("%d", &IncInfo); + + // 录入顶点集 + printf("请录入 %d 个顶点,ä¸åŒé¡¶ç‚¹ä¹‹é—´ç”¨ç©ºæ ¼éš”开:", vexnum); + for(i = 0; i < vexnum; i++) { + // 跳过空白,寻找下一个"å¯è¯»"ç¬¦å· + skipBlank(stdin); + scanf("%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } else { + ReadData(fp, "%d", &vexnum); // 录入顶点数 + ReadData(fp, "%d", &arcnum); // 录入弧数 + ReadData(fp, "%d", &IncInfo); // 判断弧上是å¦åŒ…å«é™„åŠ ä¿¡æ¯ + + // 录入顶点集 + for(i = 0; i < vexnum; i++) { + // 跳过空白,寻找下一个"å¯è¯»"ç¬¦å· + skipBlank(fp); + ReadData(fp, "%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } + + // 仅在控制å°å½•å…¥ä¿¡æ¯æ—¶è¾“出此æç¤º + if(fp == NULL && arcnum != 0) { + printf("请为有å‘图便¬¡å½•å…¥ %d æ¡å¼§çš„ä¿¡æ¯ï¼Œé¡¶ç‚¹ä¹‹é—´ç”¨ç©ºæ ¼éš”开:\n", arcnum); + } + + // å½•å…¥å¼§çš„ä¿¡æ¯ + for(k = 0; k < arcnum; k++) { + if(fp == NULL) { + printf("第 %2d æ¡å¼§ï¼š", k + 1); + skipBlank(stdin); // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + scanf("%c", &v1); + skipBlank(stdin); // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + scanf("%c", &v2); + } else { + // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + skipBlank(fp); + ReadData(fp, "%c%c", &v1, &v2); + } + + // 如果需è¦å½•å…¥å¼§çš„å…¶ä»–é™„åŠ ä¿¡æ¯ + if(IncInfo) { + // 最åŽå½•å…¥é™„åŠ ä¿¡æ¯ + Input(*G, &info); + } + + // æ’入弧 + InsertArc(G, v1, v2, info); + } + + // ä»Žæ–‡ä»¶ä¸­è¯»å–æ•°æ®æ—¶ï¼Œæœ€åŽå…¶å®žåº”当判断一下是å¦è¯»åˆ°äº†è¶³å¤Ÿçš„ä¿¡æ¯ + return OK; +} + +/* + * 构造有å‘网 + */ +static Status CreateDN(ALGraph* G) { + int i, k; + int vexnum, arcnum; + VertexType v1, v2; + InfoType* info = NULL; + + (*G).vexnum = (*G).arcnum = 0; + + if(fp == NULL) { + printf("请输入有å‘网的顶点数:"); + scanf("%d", &vexnum); + printf("请输入有å‘网的弧数:"); + scanf("%d", &arcnum); + printf("该有å‘网的弧上必须包å«å…¶ä»–附加信æ¯ï¼Œå› ä¸ºæ­¤å¤„çš„æƒå€¼éœ€è¦å­˜å‚¨åˆ°é™„加信æ¯ä¸­...\n"); + IncInfo = 1; + + // 录入顶点集 + printf("请录入 %d 个顶点,ä¸åŒé¡¶ç‚¹ä¹‹é—´ç”¨ç©ºæ ¼éš”开:", vexnum); + for(i = 0; i < vexnum; i++) { + // 跳过空白,寻找下一个"å¯è¯»"ç¬¦å· + skipBlank(stdin); + scanf("%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } else { + ReadData(fp, "%d", &vexnum); // 录入顶点数 + ReadData(fp, "%d", &arcnum); // 录入弧数 + ReadData(fp, "%d", &IncInfo);// 判断弧上是å¦åŒ…å«é™„加信æ¯(此处应当包å«) + IncInfo = 1; // 强制将æƒå€¼å½•入到附加信æ¯ä¸­ + + // 录入顶点集 + for(i = 0; i < vexnum; i++) { + // 跳过空白,寻找下一个"å¯è¯»"ç¬¦å· + skipBlank(fp); + ReadData(fp, "%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } + + // 仅在控制å°å½•å…¥ä¿¡æ¯æ—¶è¾“出此æç¤º + if(fp == NULL && arcnum != 0) { + printf("请为有å‘ç½‘ä¾æ¬¡å½•å…¥ %d æ¡å¼§(带æƒå€¼)的信æ¯ï¼Œé¡¶ç‚¹åŠæƒå€¼ä¹‹é—´ç”¨ç©ºæ ¼éš”开:\n", arcnum); + } + + // å½•å…¥å¼§çš„ä¿¡æ¯ + for(k = 0; k < arcnum; k++) { + if(fp == NULL) { + printf("第 %2d æ¡å¼§åŠå…¶æƒå€¼ï¼š", k + 1); + skipBlank(stdin); // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + scanf("%c", &v1); + skipBlank(stdin); // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + scanf("%c", &v2); + } else { + // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + skipBlank(fp); + ReadData(fp, "%c%c", &v1, &v2); + } + + // 如果需è¦å½•å…¥å¼§çš„å…¶ä»–é™„åŠ ä¿¡æ¯ + if(IncInfo) { + // 最åŽå½•入附加信æ¯(此处需è¦å½•入网的æƒå€¼) + Input(*G, &info); + } + + // æ’入弧 + InsertArc(G, v1, v2, info); + } + + // ä»Žæ–‡ä»¶ä¸­è¯»å–æ•°æ®æ—¶ï¼Œæœ€åŽå…¶å®žåº”当判断一下是å¦è¯»åˆ°äº†è¶³å¤Ÿçš„ä¿¡æ¯ + return OK; +} + +/* + * 构造无å‘图 + */ +static Status CreateUDG(ALGraph* G) { + int i, k; + int vexnum, arcnum; + VertexType v1, v2; + InfoType* info = NULL; + + (*G).vexnum = (*G).arcnum = 0; + + if(fp == NULL) { + printf("请输入无å‘图的顶点数:"); + scanf("%d", &vexnum); + printf("请输入无å‘图的边数:"); + scanf("%d", &arcnum); + printf("该无å‘图的边上是å¦åŒ…å«å…¶ä»–附加信æ¯(0-ä¸åŒ…å«â”‚1-包å«):"); + scanf("%d", &IncInfo); + + // 录入顶点集 + printf("请录入 %d 个顶点,ä¸åŒé¡¶ç‚¹ä¹‹é—´ç”¨ç©ºæ ¼éš”开:", vexnum); + for(i = 0; i < vexnum; i++) { + // 跳过空白,寻找下一个"å¯è¯»"ç¬¦å· + skipBlank(stdin); + scanf("%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } else { + ReadData(fp, "%d", &vexnum); // 录入顶点数 + ReadData(fp, "%d", &arcnum); // 录入边数 + ReadData(fp, "%d", &IncInfo);// 判断边上是å¦åŒ…å«é™„åŠ ä¿¡æ¯ + + // 录入顶点集 + for(i = 0; i < vexnum; i++) { + // 跳过空白,寻找下一个"å¯è¯»"ç¬¦å· + skipBlank(fp); + ReadData(fp, "%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } + + // 仅在控制å°å½•å…¥ä¿¡æ¯æ—¶è¾“出此æç¤º + if(fp == NULL && arcnum != 0) { + printf("请为无å‘图便¬¡å½•å…¥ %d æ¡è¾¹çš„ä¿¡æ¯ï¼Œé¡¶ç‚¹ä¹‹é—´ç”¨ç©ºæ ¼éš”开:\n", arcnum); + } + + // å½•å…¥è¾¹çš„ä¿¡æ¯ + for(k = 0; k < arcnum; k++) { + if(fp == NULL) { + printf("第 %2d æ¡è¾¹ï¼š", k + 1); + skipBlank(stdin); // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + scanf("%c", &v1); + skipBlank(stdin); // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + scanf("%c", &v2); + } else { + // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + skipBlank(fp); + ReadData(fp, "%c%c", &v1, &v2); + } + + // 如果需è¦å½•å…¥è¾¹çš„å…¶ä»–é™„åŠ ä¿¡æ¯ + if(IncInfo) { + // 最åŽå½•å…¥é™„åŠ ä¿¡æ¯ + Input(*G, &info); + + } + + // æ’入边 + InsertArc(G, v1, v2, info); + } + + // ä»Žæ–‡ä»¶ä¸­è¯»å–æ•°æ®æ—¶ï¼Œæœ€åŽå…¶å®žåº”当判断一下是å¦è¯»åˆ°äº†è¶³å¤Ÿçš„ä¿¡æ¯ + return OK; +} + +/* + * 构造无å‘网 + */ +static Status CreateUDN(ALGraph* G) { + int i, k; + int vexnum, arcnum; + VertexType v1, v2; + InfoType* info = NULL; + + (*G).vexnum = (*G).arcnum = 0; + + if(fp == NULL) { + printf("请输入无å‘网的顶点数:"); + scanf("%d", &vexnum); + printf("请输入无å‘网的边数:"); + scanf("%d", &arcnum); + printf("该无å‘网的边上必须包å«å…¶ä»–附加信æ¯ï¼Œå› ä¸ºæ­¤å¤„çš„æƒå€¼éœ€è¦å­˜å‚¨åˆ°é™„加信æ¯ä¸­...\n"); + IncInfo = 1; + + // 录入顶点集 + printf("请录入 %d 个顶点,ä¸åŒé¡¶ç‚¹ä¹‹é—´ç”¨ç©ºæ ¼éš”开:", vexnum); + for(i = 0; i < vexnum; i++) { + // 跳过空白,寻找下一个"å¯è¯»"ç¬¦å· + skipBlank(stdin); + scanf("%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } else { + ReadData(fp, "%d", &vexnum); // 录入顶点数 + ReadData(fp, "%d", &arcnum); // 录入边数 + ReadData(fp, "%d", &IncInfo);// 判断边上是å¦åŒ…å«é™„åŠ ä¿¡æ¯ + IncInfo = 1; // 强制将æƒå€¼å½•入到附加信æ¯ä¸­ + + // 录入顶点集 + for(i = 0; i < vexnum; i++) { + // 跳过空白,寻找下一个"å¯è¯»"ç¬¦å· + skipBlank(fp); + ReadData(fp, "%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } + + // 仅在控制å°å½•å…¥ä¿¡æ¯æ—¶è¾“出此æç¤º + if(fp == NULL && arcnum != 0) { + printf("请为无å‘ç½‘ä¾æ¬¡å½•å…¥ %d æ¡è¾¹(带æƒå€¼)的信æ¯ï¼Œé¡¶ç‚¹åŠæƒå€¼ä¹‹é—´ç”¨ç©ºæ ¼éš”开:\n", arcnum); + } + + // å½•å…¥è¾¹çš„ä¿¡æ¯ + for(k = 0; k < arcnum; k++) { + if(fp == NULL) { + printf("第 %2d æ¡è¾¹åŠå…¶æƒå€¼ï¼š", k + 1); + skipBlank(stdin); // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + scanf("%c", &v1); + skipBlank(stdin); // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + scanf("%c", &v2); + } else { + // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + skipBlank(fp); + ReadData(fp, "%c%c", &v1, &v2); + } + + // 如果需è¦å½•å…¥è¾¹çš„å…¶ä»–é™„åŠ ä¿¡æ¯ + if(IncInfo) { + // 最åŽå½•入附加信æ¯(此处需è¦å½•入网的æƒå€¼) + Input(*G, &info); + } + + // æ’入边 + InsertArc(G, v1, v2, info); + } + + // ä»Žæ–‡ä»¶ä¸­è¯»å–æ•°æ®æ—¶ï¼Œæœ€åŽå…¶å®žåº”当判断一下是å¦è¯»åˆ°äº†è¶³å¤Ÿçš„ä¿¡æ¯ + return OK; +} + +/* + * 录入边/å¼§çš„ç›¸å…³é™„åŠ ä¿¡æ¯ + */ +static void Input(ALGraph G, InfoType** info) { + int weight; + + // 在"网"的情形下需è¦å½•å…¥æƒå€¼ä¿¡æ¯ + if(G.kind == DN || G.kind == UDN) { + *info = (InfoType*) malloc(sizeof(InfoType)); + + if(fp == NULL) { + scanf("%d", &weight); + } else { + ReadData(fp, "%d", &weight); + } + + (*info)->weight = weight; + } +} + +/* + * 查找 + * + * 返回顶点u在图/网中的ä½ç½® + */ +int LocateVex(ALGraph G, VertexType u) { + int i; + + for(i = 0; i < G.vexnum; i++) { + if(G.vertices[i].data == u) { + return i; + } + } + + return -1; +} + +/* + * æ’入顶点 + * + * 将指定的顶点v追加到顶点集中,未建立该顶点与其他顶点的关系 + */ +Status InsertVex(ALGraph* G, VertexType v) { + int k; + + // 顶点数过多 + if((*G).vexnum == MAX_VERTEX_NUM) { + return ERROR; + } + + // 首先需è¦åˆ¤æ–­è¯¥é¡¶ç‚¹æ˜¯å¦å­˜åœ¨ + k = LocateVex(*G, v); + if(k >= 0) { + return ERROR; // 指定的顶点存在时,无需é‡å¤æ·»åŠ  + } + + G->vertices[(*G).vexnum].data = v; + G->vertices[(*G).vexnum].firstarc = NULL; + + (*G).vexnum++; + + return OK; +} + +/* + * 删除顶点 + * + * 从顶点集中删除指定的顶点v,注æ„éœ€è¦æ›´æ–°ç›¸å…³çš„顶点关系 + */ +Status DeleteVex(ALGraph* G, VertexType v) { + int k, i; + ArcNode* pre, * r; + + // 首先需è¦åˆ¤æ–­è¯¥é¡¶ç‚¹æ˜¯å¦å­˜åœ¨ + k = LocateVex(*G, v); + if(k == -1) { + return ERROR; // 指定的顶点ä¸å­˜åœ¨ + } + + // 找到以结点v出å‘的链表,释放该链表上所有结点 + r = G->vertices[k].firstarc; + while(r != NULL) { + pre = r; + r = r->nextarc; + free(pre); + + (*G).arcnum--; + } + + G->vertices[k].firstarc = NULL; + + // é历其它所有链表,删除那些指å‘顶点v的弧;而且,下标超过k的顶点,其下标值需è¦é€’å‡ + for(i = 0; i < G->vexnum; i++) { + pre = NULL; + r = G->vertices[i].firstarc; + while(r != NULL && r->adjvex < k) { + pre = r; + r = r->nextarc; + } + + // 链表上所有顶点的下标å‡å°äºŽk + if(r == NULL) { + continue; + } + + if(r->adjvex == k) { + // 从开头删掉结点v + if(pre == NULL) { + G->vertices[i].firstarc = r->nextarc; + + // 从中间æŸä¸ªä½ç½®åˆ æŽ‰ç»“点v + } else { + pre->nextarc = r->nextarc; + } + + free(r); + + // 如果这是有å‘的图/网,ä¾ç„¶éœ€è¦é€’å‡è¾¹/å¼§çš„æ•°é‡ + if((*G).kind == DG || (*G).kind == DN) { + (*G).arcnum--; + } + } + + // 冿¬¡ç¡®å®šrçš„ä½ç½® + if(pre == NULL) { + r = G->vertices[i].firstarc; + } else { + r = pre->nextarc; + } + + // 下标超过k的顶点,需è¦é€’å‡å…¶ä¸‹æ ‡ + while(r != NULL && r->adjvex > k) { + r->adjvex -= 1; + r = r->nextarc; + } + } + + // 顶点集å‰ç§» + for(i = k + 1; i < (*G).vexnum; i++) { + G->vertices[i - 1] = G->vertices[i]; + } + + // é¡¶ç‚¹æ•°é€’å‡ + (*G).vexnum--; + + return OK; +} + +/* + * 构造一个边/弧结点(ä»…é™å†…部使用) + */ +static ArcNode* newArcNodePtr(int adjvex, ArcNode* nextarc, InfoType* info) { + ArcNode* p = (ArcNode*) malloc(sizeof(ArcNode)); + if(!p) { + exit(OVERFLOW); + } + + p->adjvex = adjvex; + + p->nextarc = nextarc; + + p->info = info; + + return p; +} + +/* + * æ’入边/å¼§ + * + * 如果当å‰å›¾/网是无å‘的,则æ’入一æ¡å¼§éœ€è¦å¢žåŠ ä¸¤ä¸ªé¡¶ç‚¹å…³ç³»ï¼Œä½†å¼§çš„æ•°é‡åªå¢žä¸€ã€‚ + * 对于图/网æ¥è¯´ï¼Œå¯ä»¥åœ¨å¯å˜å‚数中列出边/弧的附加信æ¯ã€‚ + * + * æ³¨ï¼šæ­¤å¤„æŽ¥æ”¶çš„å‚æ•°ä¸ŽMGraph有些ä¸ä¸€æ ·ï¼šç½‘的附加信æ¯ä¸­åŒ…å«äº†å„æ¡è¾¹/å¼§çš„æƒå€¼ã€‚ + */ +Status InsertArc(ALGraph* G, VertexType v, VertexType w, ...) { + int tail, head, k, count; + ArcNode* r; + ArcNode* pre; + Boolean overlay = FALSE; // 是å¦ä¸ºè¦†ç›–添加 + InfoType* info = NULL; // è¾¹/å¼§çš„é™„åŠ ä¿¡æ¯ + va_list ap; + + tail = LocateVex(*G, v); // 获å–顶点v在顶点集中的ä½ç½® + if(tail == -1) { + return ERROR; // 指定的顶点ä¸å­˜åœ¨ + } + + head = LocateVex(*G, w); // 获å–顶点w在顶点集中的ä½ç½® + if(head == -1) { + return ERROR; // 指定的顶点ä¸å­˜åœ¨ + } + + // æ‹’ç»çޝ + if(tail == head) { + return ERROR; + } + + // 如果边/å¼§ä¸Šå­˜åœ¨é™„åŠ ä¿¡æ¯ + if(IncInfo) { + va_start(ap, w); // 在wåŽæŸ¥è¯¢é¦–个å¯å˜å‚æ•° + info = va_arg(ap, InfoType*); // 获å–é™„åŠ ä¿¡æ¯ + va_end(ap); + } + + /* 接下æ¥ï¼Œéœ€è¦æŸ¥æ‰¾åˆé€‚çš„æ’å…¥ä½ç½® */ + + for(count = 0; count < 2; count++) { + pre = NULL; + // 指å‘以tail为尾的首æ¡è¾¹/å¼§ + r = G->vertices[tail].firstarc; + while(r != NULL && r->adjvex < head) { + pre = r; + r = r->nextarc; + } + + // é‡åˆ°äº†ç›¸åŒä½ç½®çš„结点 + if(r != NULL && r->adjvex == head) { + r->info = info; // å¤ç”¨è¯¥ç»“点 + overlay = TRUE; // å‘生了覆盖 + } else { + if(pre == NULL) { + G->vertices[tail].firstarc = newArcNodePtr(head, r, info); + } else { + pre->nextarc = newArcNodePtr(head, r, info); + } + } + + // 如果当å‰å›¾/网是无å‘的,需è¦è€ƒè™‘对称性 + if((G->kind == UDG || G->kind == UDN) && tail != head) { + // 颠倒iå’Œj + k = tail; + tail = head; + head = k; + } else { + break; // 如果是有å‘的,å¯ä»¥ç»“æŸäº† + } + } + + // 在éžè¦†ç›–的情形下,æ‰è€ƒè™‘æ›´æ–°è¾¹/å¼§çš„æ•°é‡ + if(!overlay) { + (*G).arcnum++; // ä¸è®ºæœ‰å‘æ— å‘,边/å¼§æ•°åªå¢žä¸€ + } + + return OK; +} + +/* + * 删除边/å¼§ + */ +Status DeleteArc(ALGraph* G, VertexType v, VertexType w) { + int tail, head, k, count; + ArcNode* r; + ArcNode* pre; + + tail = LocateVex(*G, v); + if(tail == -1) { + return ERROR; // 指定的顶点ä¸å­˜åœ¨ + } + + head = LocateVex(*G, w); + if(head == -1) { + return ERROR; // 指定的顶点ä¸å­˜åœ¨ + } + + for(count = 0; count < 2; count++) { + pre = NULL; + // 在当å‰é“¾è¡¨ä¸­æ‰¾åˆ°å¾…删除的边/å¼§ + r = G->vertices[tail].firstarc; + while(r != NULL && r->adjvex < head) { + pre = r; + r = r->nextarc; + } + + // 找到了待删除的边/å¼§ + if(r != NULL && r->adjvex == head) { + if(pre == NULL) { + G->vertices[tail].firstarc = r->nextarc; + } else { + pre->nextarc = r->nextarc; + } + + free(r); + } else { + return ERROR; // 没找到 + } + + // 如果当å‰å›¾/网是无å‘的,需è¦è€ƒè™‘对称性 + if((G->kind == UDG || G->kind == UDN) && tail != head) { + // 颠倒tailå’Œhead + k = tail; + tail = head; + head = k; + } else { + break; // 如果是有å‘的,å¯ä»¥ç»“æŸäº† + } + } + + (*G).arcnum--; // ä¸è®ºæœ‰å‘æ— å‘,边/å¼§æ•°åªå‡ä¸€ + + return OK; +} + +/* + * 以图形化形å¼è¾“出当å‰ç»“æž„ + */ +void PrintGraph(ALGraph G) { + int i; + ArcNode* p; + + if(G.vexnum == 0) { + printf("空图,无需打å°ï¼\n"); + return; + } + + printf("当å‰å›¾/ç½‘åŒ…å« %2d 个顶点, %2d æ¡è¾¹/å¼§...\n", G.vexnum, G.arcnum); + + for(i = 0; i < G.vexnum; i++) { + printf("%c ===> ", G.vertices[i].data); + + p = G.vertices[i].firstarc; + while(p != NULL) { + if(IncInfo == 0) { + printf("%c ", G.vertices[p->adjvex].data); + + // 对于网,会从其附加信æ¯ä¸­èŽ·å–到æƒå€¼ + } else { + printf("%c[%2d] ", G.vertices[p->adjvex].data, p->info->weight); + } + + p = p->nextarc; + + if(p != NULL) { + printf("- "); + } + } + + printf("\n"); + } +} diff --git a/CLion/ExerciseBook/07.14+07.16/ALGraph.h b/CLion/ExerciseBook/07.14+07.16/ALGraph.h new file mode 100644 index 0000000..2960c9f --- /dev/null +++ b/CLion/ExerciseBook/07.14+07.16/ALGraph.h @@ -0,0 +1,162 @@ +/*================== + * 图的邻接表存储表示 + ===================*/ + +#ifndef ALGRAPH_H +#define ALGRAPH_H + +#include +#include // æä¾›memsetã€strcmp 原型 +#include // æä¾›å®va_listã€va_startã€va_argã€va_end +#include // æä¾›mallocã€reallocã€freeã€exit原型 +#include "Status.h" //**â–²01 绪论**// + +/* + * 注: + * + * 通常æ¥è®²ï¼Œæ— æƒå›¾è¢«ç®€ç§°ä¸ºã€å›¾ã€‘,有æƒå›¾è¢«ç®€ç§°ä¸ºã€ç½‘】。 + * æ— å‘图/网中的顶点关系被称为ã€è¾¹ã€‘,有å‘图/网中的顶点关系被称为ã€å¼§ã€‘,并区分弧头与弧尾。 + * 实际表述中,未必会严格éµå®ˆä»¥ä¸Šå‘½å。 + * + * 当å‰ç»“构适åˆå­˜å‚¨è¾¹/弧比较稀ç–的图/网。 + * + * ★ æ’入边/å¼§çš„ä¿¡æ¯æ—¶ï¼Œè¿™é‡Œçš„实现是按"å‡åº"æ’入的,这使得æ’入的弧是按"å‡åº"排列的。 + */ + + +/* å®å®šä¹‰ */ +#define MAX_VERTEX_NUM 26 // 最大顶点个数 + + +// 图的类型 +typedef enum { + DG, // 0-有å‘图 + DN, // 1-有å‘网(带æƒå€¼) + UDG, // 2-æ— å‘图 + UDN // 3-æ— å‘网(带æƒå€¼) +} GraphKind; + +// 顶点类型 +typedef char VertexType; + +// è¾¹/å¼§çš„ç›¸å…³é™„åŠ ä¿¡æ¯ +typedef struct { + /* + * 注: + * æ•™æä¸­ç»™å‡ºçš„结构åªè€ƒè™‘了无æƒå›¾ï¼Œè€Œæ²¡è€ƒè™‘有æƒå›¾(网)。 + * 这里为了把“网â€çš„æƒ…形也考虑进去,特在附加信æ¯ä¸­å¢žåŠ äº†"æƒé‡"属性。 + */ + int weight; +} InfoType; + +/* è¾¹/弧结点 */ +typedef struct ArcNode { + int adjvex; // 该弧所指å‘的顶点的ä½ç½® + struct ArcNode* nextarc; // 指å‘下一æ¡å¼§çš„æŒ‡é’ˆ + InfoType* info; // 弧的附加信æ¯ï¼Œé€šå¸¸å¿½ç•¥ +} ArcNode; + +// æ¯ä¸ªé“¾è¡¨çš„头结点 +typedef struct VNode { + VertexType data; // é¡¶ç‚¹ä¿¡æ¯ + ArcNode* firstarc; // 指å‘第一æ¡ä¾é™„该顶点的弧的指针 +} VNode; + +/* 图的邻接表存储表示类型定义 */ +typedef struct { + VNode vertices[MAX_VERTEX_NUM]; // 邻接表 + int vexnum, arcnum; // 图/网的顶点数和弧数 + GraphKind kind; // 图的类型标志 +} ALGraph; + + +// è¾¹/弧上是å¦å­˜åœ¨é™„åŠ ä¿¡æ¯ +extern Boolean IncInfo; + + +/* + * 创建 + * + *ã€å¤‡æ³¨ã€‘ + * + * æ•™æä¸­é»˜è®¤ä»ŽæŽ§åˆ¶å°è¯»å–æ•°æ®ã€‚ + * 这里为了方便测试,é¿å…æ¯æ¬¡è¿è¡Œéƒ½æ‰‹åŠ¨è¾“å…¥æ•°æ®ï¼Œ + * 因而å…许选择从预设的文件pathä¸­è¯»å–æµ‹è¯•æ•°æ®ã€‚ + * + * 如果需è¦ä»ŽæŽ§åˆ¶å°è¯»å–æ•°æ®ï¼Œåˆ™path为NULL,或path[kind]为""。 + * 如果需è¦ä»Žæ–‡ä»¶ä¸­è¯»å–æ•°æ®ï¼Œåˆ™éœ€è¦åœ¨path中填写文件åä¿¡æ¯ã€‚ + */ +Status CreateGraph(ALGraph* G, char* path[]); + +/* + * 构造有å‘图 + */ +static Status CreateDG(ALGraph* G); + +/* + * 构造有å‘网 + */ +static Status CreateDN(ALGraph* G); + +/* + * 构造无å‘图 + */ +static Status CreateUDG(ALGraph* G); + +/* + * 构造无å‘网 + */ +static Status CreateUDN(ALGraph* G); + +/* + * 录入边/å¼§çš„ç›¸å…³é™„åŠ ä¿¡æ¯ + */ +static void Input(ALGraph G, InfoType** info); + +/* + * 查找 + * + * 返回顶点u在图/网中的ä½ç½® + */ +int LocateVex(ALGraph G, VertexType u); + +/* + * æ’入顶点 + * + * 将指定的顶点v追加到顶点集中,未建立该顶点与其他顶点的关系 + */ +Status InsertVex(ALGraph* G, VertexType v); + +/* + * 删除顶点 + * + * 从顶点集中删除指定的顶点v,注æ„éœ€è¦æ›´æ–°ç›¸å…³çš„顶点关系 + */ +Status DeleteVex(ALGraph* G, VertexType v); + +/* + * 构造一个边/弧结点(ä»…é™å†…部使用) + */ +static ArcNode* newArcNodePtr(int adjvex, ArcNode* nextarc, InfoType* info); + +/* + * æ’入边/å¼§ + * + * 如果当å‰å›¾/网是无å‘的,则æ’入一æ¡å¼§éœ€è¦å¢žåŠ ä¸¤ä¸ªé¡¶ç‚¹å…³ç³»ï¼Œä½†å¼§çš„æ•°é‡åªå¢žä¸€ã€‚ + * 对于图/网æ¥è¯´ï¼Œå¯ä»¥åœ¨å¯å˜å‚数中列出边/弧的附加信æ¯ã€‚ + * + * æ³¨ï¼šæ­¤å¤„æŽ¥æ”¶çš„å‚æ•°ä¸ŽMGraph有些ä¸ä¸€æ ·ï¼šç½‘的附加信æ¯ä¸­åŒ…å«äº†å„æ¡è¾¹/å¼§çš„æƒå€¼ã€‚ + */ +Status InsertArc(ALGraph* G, VertexType v, VertexType w, ...); + +/* + * 删除边/å¼§ + */ +Status DeleteArc(ALGraph* G, VertexType v, VertexType w); + +/* + * 以图形化形å¼è¾“出当å‰ç»“æž„ + */ +void PrintGraph(ALGraph G); + +#endif diff --git a/CLion/ExerciseBook/07.14+07.16/CMakeLists.txt b/CLion/ExerciseBook/07.14+07.16/CMakeLists.txt new file mode 100644 index 0000000..06836ca --- /dev/null +++ b/CLion/ExerciseBook/07.14+07.16/CMakeLists.txt @@ -0,0 +1,12 @@ +# 包å«å…¬å…±åº“ +include_directories(${CMAKE_SOURCE_DIR}/Status) + +# 生æˆå¯æ‰§è¡Œæ–‡ä»¶ +add_executable(07.14+07.16 ALGraph.h ALGraph.c 07.14+07.16.c) +# 链接公共库 +target_link_libraries(07.14+07.16 Scanf_lib) + +# è®°å½•è¦æ‹·è´åˆ°*.exeç›®å½•ä¸‹çš„èµ„æºæ–‡ä»¶ +file(GLOB TestData TestData*.txt) +# å°†èµ„æºæ–‡ä»¶æ‹·è´åˆ°*.exe目录下,ä¸ç„¶æ— æ³•加载 +file(COPY ${TestData} DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) diff --git a/CLion/ExerciseBook/07.14+07.16/TestData_DG.txt b/CLion/ExerciseBook/07.14+07.16/TestData_DG.txt new file mode 100644 index 0000000..4768c22 --- /dev/null +++ b/CLion/ExerciseBook/07.14+07.16/TestData_DG.txt @@ -0,0 +1,6 @@ +图类型→0(有å‘图) +顶点数→6 +弧数→14 +弧是å¦å¸¦æœ‰å…¶ä»–ä¿¡æ¯â†’0 +顶点集→ã€A,X,B,C,D,E】 +弧的集åˆâ†’ã€A,B】ã€A,C】ã€A,D】ã€B,C】ã€B,D】ã€B,E】ã€C,B】ã€C,E】ã€C,X】ã€E,A】ã€E,D】ã€E,X】ã€X,A】ã€X,D】 \ No newline at end of file diff --git a/CLion/ExerciseBook/07.14+07.16/TestData_DN.txt b/CLion/ExerciseBook/07.14+07.16/TestData_DN.txt new file mode 100644 index 0000000..953c892 --- /dev/null +++ b/CLion/ExerciseBook/07.14+07.16/TestData_DN.txt @@ -0,0 +1,6 @@ +图类型→1(有å‘网) +顶点数→6 +弧数→14 +弧是å¦å¸¦æœ‰å…¶ä»–ä¿¡æ¯â†’1 +顶点集→ã€A,X,B,C,D,E】 +弧的集åˆâ†’ã€A,B,3】ã€A,C,8】ã€A,D,11】ã€B,C,7】ã€B,D,4】ã€B,E,1】ã€C,B,5】ã€C,E,17】ã€C,X,3】ã€E,A,6】ã€E,D,4】ã€E,X,2】ã€X,A,8】ã€X,D,10】 \ No newline at end of file diff --git a/CLion/ExerciseBook/07.14+07.16/TestData_UDG.txt b/CLion/ExerciseBook/07.14+07.16/TestData_UDG.txt new file mode 100644 index 0000000..65d0356 --- /dev/null +++ b/CLion/ExerciseBook/07.14+07.16/TestData_UDG.txt @@ -0,0 +1,6 @@ +图类型→2(无å‘图) +顶点数→6 +边数→13 +边是å¦å¸¦æœ‰å…¶ä»–ä¿¡æ¯â†’0 +顶点集→ã€A,X,B,C,D,E】 +边的集åˆâ†’ã€A,B】ã€A,C】ã€A,D】ã€B,C】ã€B,D】ã€B,E】ã€C,E】ã€C,X】ã€E,A】ã€E,D】ã€E,X】ã€X,A】ã€X,D】 \ No newline at end of file diff --git a/CLion/ExerciseBook/07.14+07.16/TestData_UDN.txt b/CLion/ExerciseBook/07.14+07.16/TestData_UDN.txt new file mode 100644 index 0000000..b5f1949 --- /dev/null +++ b/CLion/ExerciseBook/07.14+07.16/TestData_UDN.txt @@ -0,0 +1,6 @@ +图类型→3(无å‘网) +顶点数→6 +边数→13 +边是å¦å¸¦æœ‰å…¶ä»–ä¿¡æ¯â†’1 +顶点集→ã€A,X,B,C,D,E】 +边的集åˆâ†’ã€A,B,3】ã€A,C,8】ã€A,D,11】ã€B,C,7】ã€B,D,4】ã€B,E,1】ã€C,E,17】ã€C,X,3】ã€E,A,6】ã€E,D,4】ã€E,X,2】ã€X,A,8】ã€X,D,10】 \ No newline at end of file diff --git a/CLion/ExerciseBook/07.15/07.15.c b/CLion/ExerciseBook/07.15/07.15.c new file mode 100644 index 0000000..4d8f630 --- /dev/null +++ b/CLion/ExerciseBook/07.15/07.15.c @@ -0,0 +1,191 @@ +#include +#include // æä¾›å®va_listã€va_startã€va_argã€va_end +#include "Status.h" //**â–²01 绪论**// +#include "MGraph.h" //**â–²07 图**// + +/* + * æ’入顶点 + * + * 将指定的顶点v追加到顶点集中,未建立该顶点与其他顶点的关系 + */ +Status InsertVex_7_15(MGraph* G, VertexType v); + +/* + * 删除顶点 + * + * 从顶点集中删除指定的顶点v,注æ„éœ€è¦æ›´æ–°ç›¸å…³çš„顶点关系 + */ +Status DeleteVex_7_15(MGraph* G, VertexType v); + +/* + * æ’入边/å¼§ + * + * 如果当å‰å›¾/网是无å‘的,则æ’入一æ¡å¼§éœ€è¦å¢žåŠ ä¸¤ä¸ªé¡¶ç‚¹å…³ç³»ï¼Œä½†å¼§çš„æ•°é‡åªå¢žä¸€ã€‚ + * + * 对于图æ¥è¯´ï¼Œå¯ä»¥åœ¨å¯å˜å‚数中列出边/弧的附加信æ¯ï¼› + * 对于网æ¥è¯´ï¼Œå¯ä»¥åœ¨å¯å˜å‚æ•°ä¸­ä¾æ¬¡åˆ—出边/å¼§çš„æƒå€¼ä»¥åŠé™„加信æ¯ã€‚ + */ +Status InsertArc_7_15(MGraph* G, VertexType v, VertexType w, ...); + +/* + * 删除边/å¼§ + * + * æ­¤åˆ é™¤åªæ˜¯æ›´æ–°è¾¹/弧的连通关系 + */ +Status DeleteArc_7_15(MGraph* G, VertexType v, VertexType w); + + +int main(int argc, char* argv[]) { + MGraph G; + + printf("████████ 创建并输出图/网...\n"); + { + char* path[4]; + + path[0] = "TestData_DG.txt"; + path[1] = "TestData_DN.txt"; + path[2] = "TestData_UDG.txt"; + path[3] = "TestData_UDN.txt"; + + CreateGraph(&G, path); + PrintGraph(G); + printf("\n"); + } + + printf("████████ 删除顶点...\n"); + { + VertexType v = 'X'; + + printf("删除顶点 '%c' åŽçš„图为:\n", v); + DeleteVex_7_15(&G, v); + PrintGraph(G); + printf("\n"); + } + + printf("████████ æ’入顶点...\n"); + { + VertexType v = 'Y'; + + printf("æ’入顶点 '%c' åŽçš„图为:\n", v); + InsertVex_7_15(&G, v); + PrintGraph(G); + printf("\n"); + } + + printf("████████ æ’入边/å¼§...\n"); + { + // 注:是é‡å¤çš„è¾¹ + VertexType v[10] = {'B', 'C', 'E', 'Y', 'Y', 'Y', 'D', 'D', 'E', 'E'}; + VertexType w[10] = {'Y', 'Y', 'Y', 'A', 'B', 'D', 'C', 'A', 'B', 'D'}; + VRType adj[10] = {8, 5, 1, 11, 2, 6, 3, 7, 2, 9}; + int k; + + // 图 + if(G.kind == DG || G.kind == UDG) { + for(k = 0; k < 10; k++) { + printf("æ’入无æƒå€¼çš„边:<%c, %c>...\n", v[k], w[k]); + InsertArc_7_15(&G, v[k], w[k]); + } + + // 网 + } else if(G.kind == DN || G.kind == UDN) { + for(k = 0; k < 10; k++) { + printf("æ’入带æƒå€¼çš„边:<%c, %c, %d>...\n", v[k], w[k], adj[k]); + InsertArc_7_15(&G, v[k], w[k], adj[k]); + } + } else { + return ERROR; + } + + PrintGraph(G); + printf("\n"); + } + + printf("████████ 删除边/å¼§...\n"); + { + VertexType v[3] = {'D', 'E', 'F'}; + VertexType w[3] = {'A', 'B', 'B'}; + int k; + + for(k = 0; k < 3; k++) { + printf("删除边:<%c, %c>...\n", v[k], w[k]); + DeleteArc_7_15(&G, v[k], w[k]); + } + PrintGraph(G); + printf("\n"); + } + + return 0; +} + + +/* + * æ’入顶点 + * + * 将指定的顶点v追加到顶点集中,未建立该顶点与其他顶点的关系 + */ +Status InsertVex_7_15(MGraph* G, VertexType v) { + return InsertVex(G, v); +} + +/* + * 删除顶点 + * + * 从顶点集中删除指定的顶点v,注æ„éœ€è¦æ›´æ–°ç›¸å…³çš„顶点关系 + */ +Status DeleteVex_7_15(MGraph* G, VertexType v) { + return DeleteVex(G, v); +} + +/* + * æ’入边/å¼§ + * + * 如果当å‰å›¾/网是无å‘的,则æ’入一æ¡å¼§éœ€è¦å¢žåŠ ä¸¤ä¸ªé¡¶ç‚¹å…³ç³»ï¼Œä½†å¼§çš„æ•°é‡åªå¢žä¸€ã€‚ + * + * 对于图æ¥è¯´ï¼Œå¯ä»¥åœ¨å¯å˜å‚数中列出边/弧的附加信æ¯ï¼› + * 对于网æ¥è¯´ï¼Œå¯ä»¥åœ¨å¯å˜å‚æ•°ä¸­ä¾æ¬¡åˆ—出边/å¼§çš„æƒå€¼ä»¥åŠé™„加信æ¯ã€‚ + */ +Status InsertArc_7_15(MGraph* G, VertexType v, VertexType w, ...) { + va_list ap; + VRType adj; + InfoType* info = NULL; // è¾¹/å¼§çš„é™„åŠ ä¿¡æ¯ + + // 图 + if((*G).kind == DG || (*G).kind == UDG) { + + // 如果边/å¼§ä¸Šå­˜åœ¨é™„åŠ ä¿¡æ¯ + if(IncInfo) { + va_start(ap, w); // 在wåŽæŸ¥è¯¢é¦–个å¯å˜å‚æ•° + info = va_arg(ap, InfoType*); // 获å–é™„åŠ ä¿¡æ¯ + va_end(ap); + } + + return InsertArc(G, v, w, info); + + // 网 + } else if((*G).kind == DN || (*G).kind == UDN) { + va_start(ap, w); // 在wåŽæŸ¥è¯¢é¦–个å¯å˜å‚æ•° + + adj = va_arg(ap, VRType); // èŽ·å–æƒå€¼ä¿¡æ¯ + + // 如果边/å¼§ä¸Šå­˜åœ¨é™„åŠ ä¿¡æ¯ + if(IncInfo) { + info = va_arg(ap, InfoType*); // 获å–é™„åŠ ä¿¡æ¯ + } + + va_end(ap); + + return InsertArc(G, v, w, adj, info); + } else { + return ERROR; + } +} + +/* + * 删除边/å¼§ + * + * æ­¤åˆ é™¤åªæ˜¯æ›´æ–°è¾¹/弧的连通关系 + */ +Status DeleteArc_7_15(MGraph* G, VertexType v, VertexType w) { + return DeleteArc(G, v, w); +} diff --git a/CLion/ExerciseBook/07.15/CMakeLists.txt b/CLion/ExerciseBook/07.15/CMakeLists.txt new file mode 100644 index 0000000..f442e52 --- /dev/null +++ b/CLion/ExerciseBook/07.15/CMakeLists.txt @@ -0,0 +1,12 @@ +# 包å«å…¬å…±åº“ +include_directories(${CMAKE_SOURCE_DIR}/Status) + +# 生æˆå¯æ‰§è¡Œæ–‡ä»¶ +add_executable(07.15 MGraph.h MGraph.c 07.15.c) +# 链接公共库 +target_link_libraries(07.15 Scanf_lib) + +# è®°å½•è¦æ‹·è´åˆ°*.exeç›®å½•ä¸‹çš„èµ„æºæ–‡ä»¶ +file(GLOB TestData TestData*.txt) +# å°†èµ„æºæ–‡ä»¶æ‹·è´åˆ°*.exe目录下,ä¸ç„¶æ— æ³•加载 +file(COPY ${TestData} DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) diff --git a/CLion/ExerciseBook/07.15/MGraph.c b/CLion/ExerciseBook/07.15/MGraph.c new file mode 100644 index 0000000..7920ec7 --- /dev/null +++ b/CLion/ExerciseBook/07.15/MGraph.c @@ -0,0 +1,719 @@ +/*================================= + * 图的数组(邻接矩阵)存储表示 + * + * 包å«ç®—法: 7.1ã€7.2ã€7.4ã€7.5ã€7.6 + ==================================*/ + +#include "MGraph.h" //**â–²07 图**// + +// 录入数æ®çš„æºæ–‡ä»¶ï¼›fp为null时,说明需è¦ä»ŽæŽ§åˆ¶å°å½•å…¥ +static FILE* fp = NULL; + +/* + * IncInfo指示该图/网的边/弧上是å¦å­˜åœ¨é™„加信æ¯ã€‚ + * 如果其值ä¸ä¸º0,则表示无附加信æ¯ï¼Œå¦åˆ™ï¼Œè¡¨ç¤ºå­˜åœ¨é™„加信æ¯ã€‚ + */ +Boolean IncInfo = FALSE; + +// 访问标志数组,记录访问过的顶点 +static Boolean visited[MAX_VERTEX_NUM]; + +// 函数å˜é‡ +static Status (* VisitFunc)(VertexType e); + + +/* + * ████████ 算法7.1 ████████ + * + * 创建图/表 + * + *ã€å¤‡æ³¨ã€‘ + * + * æ•™æä¸­é»˜è®¤ä»ŽæŽ§åˆ¶å°è¯»å–æ•°æ®ã€‚ + * 这里为了方便测试,é¿å…æ¯æ¬¡è¿è¡Œéƒ½æ‰‹åŠ¨è¾“å…¥æ•°æ®ï¼Œ + * 因而å…许选择从预设的文件pathä¸­è¯»å–æµ‹è¯•æ•°æ®ã€‚ + * + * 如果需è¦ä»ŽæŽ§åˆ¶å°è¯»å–æ•°æ®ï¼Œåˆ™path为NULL,或path[kind]为""。 + * 如果需è¦ä»Žæ–‡ä»¶ä¸­è¯»å–æ•°æ®ï¼Œåˆ™éœ€è¦åœ¨path中填写文件åä¿¡æ¯ã€‚ + */ +Status CreateGraph(MGraph* G, char* path[]) { + int readFromConsole; // 是å¦ä»ŽæŽ§åˆ¶å°è¯»å–æ•°æ® + int kind; + Status flag; + + printf("请输入图的类型(0-有å‘图 │ 1-有å‘网 │ 2-æ— å‘图 │ 3-æ— å‘网):"); + scanf("%d", &kind); + + // 类型ä¸åˆè§„ + if(kind < 0 || kind > 3) { + return ERROR; + } + + // 如果没有文件路径信æ¯ï¼Œåˆ™ä»ŽæŽ§åˆ¶å°è¯»å–输入 + readFromConsole = (path == NULL) || strcmp(path[kind], "") == 0; + + // 需è¦ä»Žæ–‡ä»¶è¯»å– + if(readFromConsole) { + (*G).kind = kind; // 记录图/网的类型 + } else { + // æ‰“å¼€æ–‡ä»¶ï¼Œå‡†å¤‡è¯»å–æµ‹è¯•æ•°æ® + fp = fopen(path[kind], "r"); + if(fp == NULL) { + return ERROR; + } + + // 录入图的类型 + ReadData(fp, "%d", &((*G).kind)); + } + + // éšæœºåˆ›å»ºæœ‰å‘图/网或无å‘图/ç½‘çš„ä¸€ç§ + switch((*G).kind) { + case DG: + flag = CreateDG(G); + break; + case DN: + flag = CreateDN(G); + break; + case UDG: + flag = CreateUDG(G); + break; + case UDN: + flag = CreateUDN(G); + break; + default: + flag = ERROR; + break; + } + + if(fp != NULL) { + fclose(fp); + fp = NULL; + } + + return flag; +} + +/* + * 构造有å‘图 + */ +static Status CreateDG(MGraph* G) { + int i, j, k; + ArcCell arcs = {0, NULL}; // 有å‘å›¾æ¯æ¡è¾¹çš„åˆå§‹å€¼ + VertexType v1, v2; + + if(fp == NULL) { + printf("请输入有å‘图的顶点数:"); + scanf("%d", &((*G).vexnum)); + printf("请输入有å‘图的弧数:"); + scanf("%d", &((*G).arcnum)); + printf("该有å‘图的弧上是å¦åŒ…å«å…¶ä»–附加信æ¯(0-ä¸åŒ…å«â”‚1-包å«):"); + scanf("%d", &IncInfo); + + // 录入顶点集 + printf("请录入 %d 个顶点,ä¸åŒé¡¶ç‚¹ä¹‹é—´ç”¨ç©ºæ ¼éš”开:", (*G).vexnum); + for(i = 0; i < (*G).vexnum; i++) { + // 跳过空白,寻找下一个"å¯è¯»"ç¬¦å· + skipBlank(stdin); + scanf("%c", &((*G).vexs[i])); + } + } else { + ReadData(fp, "%d", &((*G).vexnum)); // 录入顶点数 + ReadData(fp, "%d", &((*G).arcnum)); // 录入弧数 + ReadData(fp, "%d", &IncInfo); // 判断弧上是å¦åŒ…å«é™„åŠ ä¿¡æ¯ + + // 录入顶点集 + for(i = 0; i < (*G).vexnum; i++) { + // 跳过空白,寻找下一个"å¯è¯»"ç¬¦å· + skipBlank(fp); + ReadData(fp, "%c", &((*G).vexs[i])); + } + } + + // åˆå§‹åŒ–有å‘图的邻接矩阵 + for(i = 0; i < (*G).vexnum; i++) { + for(j = 0; j < (*G).vexnum; j++) { + (*G).arcs[i][j] = arcs; + } + } + + // 仅在控制å°å½•å…¥ä¿¡æ¯æ—¶è¾“出此æç¤º + if(fp == NULL && (*G).arcnum != 0) { + printf("请为有å‘图便¬¡å½•å…¥ %d æ¡å¼§çš„ä¿¡æ¯ï¼Œé¡¶ç‚¹ä¹‹é—´ç”¨ç©ºæ ¼éš”开:\n", (*G).arcnum); + } + + // å½•å…¥å¼§çš„ä¿¡æ¯ + for(k = 0; k < (*G).arcnum; k++) { + if(fp == NULL) { + printf("第 %2d æ¡å¼§ï¼š", k + 1); + skipBlank(stdin); // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + scanf("%c", &v1); + skipBlank(stdin); // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + scanf("%c", &v2); + } else { + // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + skipBlank(fp); + ReadData(fp, "%c%c", &v1, &v2); + } + + i = LocateVex(*G, v1); // 获å–顶点v1在顶点集中的ä½ç½® + j = LocateVex(*G, v2); // 获å–顶点v2在顶点集中的ä½ç½® + + // 将指定的顶点关系设置为1,指示这两个顶点是直接连接的(注:这里没有验è¯ä¸‹æ ‡æ˜¯å¦è¶Šç•Œ) + (*G).arcs[i][j].adj = 1; + + // 如果需è¦å½•å…¥å¼§çš„å…¶ä»–é™„åŠ ä¿¡æ¯ + if(IncInfo) { + // 最åŽå½•å…¥é™„åŠ ä¿¡æ¯ + Input(*G, &((*G).arcs[i][j].info)); + } + } + + // ä»Žæ–‡ä»¶ä¸­è¯»å–æ•°æ®æ—¶ï¼Œæœ€åŽå…¶å®žåº”当判断一下是å¦è¯»åˆ°äº†è¶³å¤Ÿçš„ä¿¡æ¯ + return OK; +} + +/* + * 构造有å‘网 + */ +static Status CreateDN(MGraph* G) { + int i, j, k; + ArcCell arcs = {INFINITE, NULL}; // 有å‘ç½‘æ¯æ¡å¼§çš„åˆå§‹å€¼ + VertexType v1, v2; + VRType w; + + if(fp == NULL) { + printf("请输入有å‘网的顶点数:"); + scanf("%d", &((*G).vexnum)); + printf("请输入有å‘网的弧数:"); + scanf("%d", &((*G).arcnum)); + printf("该有å‘网的弧上是å¦åŒ…å«å…¶ä»–附加信æ¯(0-ä¸åŒ…å«â”‚1-包å«):"); + scanf("%d", &IncInfo); + + // 录入顶点集 + printf("请录入 %d 个顶点,ä¸åŒé¡¶ç‚¹ä¹‹é—´ç”¨ç©ºæ ¼éš”开:", (*G).vexnum); + for(i = 0; i < (*G).vexnum; i++) { + // 跳过空白,寻找下一个"å¯è¯»"ç¬¦å· + skipBlank(stdin); + scanf("%c", &((*G).vexs[i])); + } + } else { + ReadData(fp, "%d", &((*G).vexnum)); // 录入顶点数 + ReadData(fp, "%d", &((*G).arcnum)); // 录入弧数 + ReadData(fp, "%d", &IncInfo); // 判断弧上是å¦åŒ…å«é™„åŠ ä¿¡æ¯ + + // 录入顶点集 + for(i = 0; i < (*G).vexnum; i++) { + // 跳过空白,寻找下一个"å¯è¯»"ç¬¦å· + skipBlank(fp); + ReadData(fp, "%c", &((*G).vexs[i])); + } + } + + // åˆå§‹åŒ–有å‘网的邻接矩阵 + for(i = 0; i < (*G).vexnum; i++) { + for(j = 0; j < (*G).vexnum; j++) { + (*G).arcs[i][j] = arcs; + } + } + + // 仅在控制å°å½•å…¥ä¿¡æ¯æ—¶è¾“出此æç¤º + if(fp == NULL && (*G).arcnum != 0) { + printf("请为有å‘ç½‘ä¾æ¬¡å½•å…¥ %d æ¡å¼§(带æƒå€¼)的信æ¯ï¼Œé¡¶ç‚¹åŠæƒå€¼ä¹‹é—´ç”¨ç©ºæ ¼éš”开:\n", (*G).arcnum); + } + + // å½•å…¥å¼§çš„ä¿¡æ¯ + for(k = 0; k < (*G).arcnum; k++) { + if(fp == NULL) { + printf("第 %2d æ¡å¼§åŠå…¶æƒå€¼ï¼š", k + 1); + skipBlank(stdin); // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + scanf("%c", &v1); + skipBlank(stdin); // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + scanf("%c", &v2); + scanf("%d", &w); + } else { + // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + skipBlank(fp); + ReadData(fp, "%c%c%d", &v1, &v2, &w); + } + + i = LocateVex(*G, v1); // 获å–顶点v1在顶点集中的ä½ç½® + j = LocateVex(*G, v2); // 获å–顶点v2在顶点集中的ä½ç½® + + // 在指定的顶点关系上记录æƒå€¼(注:这里没有验è¯ä¸‹æ ‡æ˜¯å¦è¶Šç•Œ) + (*G).arcs[i][j].adj = w; + + // 如果需è¦å½•å…¥å¼§çš„å…¶ä»–é™„åŠ ä¿¡æ¯ + if(IncInfo) { + // 最åŽå½•å…¥é™„åŠ ä¿¡æ¯ + Input(*G, &((*G).arcs[i][j].info)); + } + } + + // ä»Žæ–‡ä»¶ä¸­è¯»å–æ•°æ®æ—¶ï¼Œæœ€åŽå…¶å®žåº”当判断一下是å¦è¯»åˆ°äº†è¶³å¤Ÿçš„ä¿¡æ¯ + return OK; +} + +/* + * 构造无å‘图 + */ +static Status CreateUDG(MGraph* G) { + int i, j, k; + ArcCell arcs = {0, NULL}; // æ— å‘å›¾æ¯æ¡è¾¹çš„åˆå§‹å€¼ + VertexType v1, v2; + + if(fp == NULL) { + printf("请输入无å‘图的顶点数:"); + scanf("%d", &((*G).vexnum)); + printf("请输入无å‘图的边数:"); + scanf("%d", &((*G).arcnum)); + printf("该无å‘图的边上是å¦åŒ…å«å…¶ä»–附加信æ¯(0-ä¸åŒ…å«â”‚1-包å«):"); + scanf("%d", &IncInfo); + + // 录入顶点集 + printf("请录入 %d 个顶点,ä¸åŒé¡¶ç‚¹ä¹‹é—´ç”¨ç©ºæ ¼éš”开:", (*G).vexnum); + for(i = 0; i < (*G).vexnum; i++) { + // 跳过空白,寻找下一个"å¯è¯»"ç¬¦å· + skipBlank(stdin); + scanf("%c", &((*G).vexs[i])); + } + } else { + ReadData(fp, "%d", &((*G).vexnum)); // 录入顶点数 + ReadData(fp, "%d", &((*G).arcnum)); // 录入边数 + ReadData(fp, "%d", &IncInfo); // 判断边上是å¦åŒ…å«é™„åŠ ä¿¡æ¯ + + // 录入顶点集 + for(i = 0; i < (*G).vexnum; i++) { + // 跳过空白,寻找下一个"å¯è¯»"ç¬¦å· + skipBlank(fp); + ReadData(fp, "%c", &((*G).vexs[i])); + } + } + + // åˆå§‹åŒ–æ— å‘图的邻接矩阵 + for(i = 0; i < (*G).vexnum; i++) { + for(j = 0; j < (*G).vexnum; j++) { + (*G).arcs[i][j] = arcs; + } + } + + // 仅在控制å°å½•å…¥ä¿¡æ¯æ—¶è¾“出此æç¤º + if(fp == NULL && (*G).arcnum != 0) { + printf("请为无å‘图便¬¡å½•å…¥ %d æ¡è¾¹çš„ä¿¡æ¯ï¼Œé¡¶ç‚¹ä¹‹é—´ç”¨ç©ºæ ¼éš”开:\n", (*G).arcnum); + } + + // å½•å…¥è¾¹çš„ä¿¡æ¯ + for(k = 0; k < (*G).arcnum; k++) { + if(fp == NULL) { + printf("第 %2d æ¡è¾¹ï¼š", k + 1); + skipBlank(stdin); // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + scanf("%c", &v1); + skipBlank(stdin); // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + scanf("%c", &v2); + } else { + // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + skipBlank(fp); + ReadData(fp, "%c%c", &v1, &v2); + } + + i = LocateVex(*G, v1); // 获å–顶点v1在顶点集中的ä½ç½® + j = LocateVex(*G, v2); // 获å–顶点v2在顶点集中的ä½ç½® + + // 将指定的顶点关系设置为1,指示这两个顶点是直接连接的(注:这里没有验è¯ä¸‹æ ‡æ˜¯å¦è¶Šç•Œ) + (*G).arcs[i][j].adj = 1; + + // 如果需è¦å½•å…¥è¾¹çš„å…¶ä»–é™„åŠ ä¿¡æ¯ + if(IncInfo) { + // 最åŽå½•å…¥é™„åŠ ä¿¡æ¯ + Input(*G, &((*G).arcs[i][j].info)); + } + + // 填充对称点 + (*G).arcs[j][i] = (*G).arcs[i][j]; + } + + // ä»Žæ–‡ä»¶ä¸­è¯»å–æ•°æ®æ—¶ï¼Œæœ€åŽå…¶å®žåº”当判断一下是å¦è¯»åˆ°äº†è¶³å¤Ÿçš„ä¿¡æ¯ + return OK; +} + +/* + * ████████ 算法7.2 ████████ + * + * 构造无å‘网 + */ +static Status CreateUDN(MGraph* G) { + int i, j, k; + ArcCell arcs = {INFINITE, NULL}; // æ— å‘ç½‘æ¯æ¡è¾¹çš„åˆå§‹å€¼ + VertexType v1, v2; + VRType w; + + if(fp == NULL) { + printf("请输入无å‘网的顶点数:"); + scanf("%d", &((*G).vexnum)); + printf("请输入无å‘网的边数:"); + scanf("%d", &((*G).arcnum)); + printf("该无å‘网的边上是å¦åŒ…å«å…¶ä»–附加信æ¯(0-ä¸åŒ…å«â”‚1-包å«):"); + scanf("%d", &IncInfo); + + // 录入顶点集 + printf("请录入 %d 个顶点,ä¸åŒé¡¶ç‚¹ä¹‹é—´ç”¨ç©ºæ ¼éš”开:", (*G).vexnum); + for(i = 0; i < (*G).vexnum; i++) { + // 跳过空白,寻找下一个"å¯è¯»"ç¬¦å· + skipBlank(stdin); + scanf("%c", &((*G).vexs[i])); + } + } else { + ReadData(fp, "%d", &((*G).vexnum)); // 录入顶点数 + ReadData(fp, "%d", &((*G).arcnum)); // 录入边数 + ReadData(fp, "%d", &IncInfo); // 判断边上是å¦åŒ…å«é™„åŠ ä¿¡æ¯ + + // 录入顶点集 + for(i = 0; i < (*G).vexnum; i++) { + // 跳过空白,寻找下一个"å¯è¯»"ç¬¦å· + skipBlank(fp); + ReadData(fp, "%c", &((*G).vexs[i])); + } + } + + // åˆå§‹åŒ–æ— å‘网的邻接矩阵 + for(i = 0; i < (*G).vexnum; i++) { + for(j = 0; j < (*G).vexnum; j++) { + (*G).arcs[i][j] = arcs; + } + } + + // 仅在控制å°å½•å…¥ä¿¡æ¯æ—¶è¾“出此æç¤º + if(fp == NULL && (*G).arcnum != 0) { + printf("请为无å‘ç½‘ä¾æ¬¡å½•å…¥ %d æ¡è¾¹(带æƒå€¼)的信æ¯ï¼Œé¡¶ç‚¹åŠæƒå€¼ä¹‹é—´ç”¨ç©ºæ ¼éš”开:\n", (*G).arcnum); + } + + // å½•å…¥è¾¹çš„ä¿¡æ¯ + for(k = 0; k < (*G).arcnum; k++) { + if(fp == NULL) { + printf("第 %2d æ¡è¾¹åŠå…¶æƒå€¼ï¼š", k + 1); + skipBlank(stdin); // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + scanf("%c", &v1); + skipBlank(stdin); // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + scanf("%c", &v2); + scanf("%d", &w); + } else { + // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + skipBlank(fp); + ReadData(fp, "%c%c%d", &v1, &v2, &w); + } + + i = LocateVex(*G, v1); // 获å–顶点v1在顶点集中的ä½ç½® + j = LocateVex(*G, v2); // 获å–顶点v2在顶点集中的ä½ç½® + + // 在指定的顶点关系上记录æƒå€¼(注:这里没有验è¯ä¸‹æ ‡æ˜¯å¦è¶Šç•Œ) + (*G).arcs[i][j].adj = w; + + // 如果需è¦å½•å…¥è¾¹çš„å…¶ä»–é™„åŠ ä¿¡æ¯ + if(IncInfo) { + // 最åŽå½•å…¥é™„åŠ ä¿¡æ¯ + Input(*G, &((*G).arcs[i][j].info)); + } + + // 填充对称点 + (*G).arcs[j][i] = (*G).arcs[i][j]; + } + + // ä»Žæ–‡ä»¶ä¸­è¯»å–æ•°æ®æ—¶ï¼Œæœ€åŽå…¶å®žåº”当判断一下是å¦è¯»åˆ°äº†è¶³å¤Ÿçš„ä¿¡æ¯ + return OK; +} + +/* + * 录入边/å¼§çš„ç›¸å…³é™„åŠ ä¿¡æ¯ + */ +static void Input(MGraph G, InfoType** info) { + //录入边/弧的信æ¯ï¼Œæœ¬æµ‹è¯•涉åŠåˆ°çš„è¾¹/å¼§é»˜è®¤æ— å…¶ä»–é™„åŠ ä¿¡æ¯ +} + +/* + * 查找 + * + * 返回顶点u在图/网中的ä½ç½® + */ +int LocateVex(MGraph G, VertexType u) { + int i; + + for(i = 0; i < G.vexnum; i++) { + if(G.vexs[i] == u) { + return i; + } + } + + return -1; +} + +/* + * æ’入顶点 + * + * 将指定的顶点v追加到顶点集中,未建立该顶点与其他顶点的关系 + */ +Status InsertVex(MGraph* G, VertexType v) { + int i, k; + VRType adj; + + // 顶点数过多 + if((*G).vexnum == MAX_VERTEX_NUM) { + return ERROR; + } + + // 首先需è¦åˆ¤æ–­è¯¥é¡¶ç‚¹æ˜¯å¦å­˜åœ¨ + k = LocateVex(*G, v); + if(k >= 0) { + return ERROR; // 指定的顶点存在时,无需é‡å¤æ·»åŠ  + } + + // 确定一个éžè¿žé€šæ ‡è®° + if((*G).kind == DG || (*G).kind == UDG) { + adj = 0; // 图 + } else if((*G).kind == DN || (*G).kind == UDN) { + adj = INFINITE; // 网 + } else { + return ERROR; + } + + (*G).vexs[(*G).vexnum] = v; + (*G).vexnum++; + + for(i = 0; i < (*G).vexnum; i++) { + (*G).arcs[i][(*G).vexnum - 1].adj = adj; + (*G).arcs[(*G).vexnum - 1][i].adj = adj; + } + + return OK; +} + +/* + * 删除顶点 + * + * 从顶点集中删除指定的顶点v,注æ„éœ€è¦æ›´æ–°ç›¸å…³çš„顶点关系 + */ +Status DeleteVex(MGraph* G, VertexType v) { + int i, j, k; + VRType adj; + + k = LocateVex(*G, v); + if(k == -1) { + return ERROR; // 指定的顶点ä¸å­˜åœ¨ + } + + // 确定一个éžè¿žé€šæ ‡è®° + if((*G).kind == DG || (*G).kind == UDG) { + adj = 0; // 图 + } else if((*G).kind == DN || (*G).kind == UDN) { + adj = INFINITE; // 网 + } else { + return ERROR; + } + + // æ›´æ–°è¾¹/å¼§çš„æ•°é‡ + for(i = 0; i < (*G).vexnum; i++) { + // 如果存在从顶点v出å‘的边,则边的数é‡å‡ä¸€ + if((*G).arcs[k][i].adj != adj) { + (*G).arcnum--; + } + + // 如果这是有å‘的图/网,ä¾ç„¶éœ€è¦æ›´æ–°è¾¹/å¼§çš„æ•°é‡ + if((*G).kind == DG || (*G).kind == DN) { + // 如果存在到达顶点v的边,则边的数é‡å‡ä¸€ + if((*G).arcs[i][k].adj != adj) { + (*G).arcnum--; + } + } + } + + // 将邻接矩阵中的顶点关系左移 + for(j = k + 1; j < (*G).vexnum; j++) { + for(i = 0; i < (*G).vexnum; i++) { + (*G).arcs[i][j - 1] = (*G).arcs[i][j]; // å³è¾¹çš„列挪到左边的列 + } + } + + // 将邻接矩阵中的顶点关系上移 + for(i = k + 1; i < (*G).vexnum; i++) { + // 注,由于上é¢è¿›è¡Œå·¦ç§»çš„关系,所以这里的j是å°äºŽ(*G).vexnum - 1 + for(j = 0; j < (*G).vexnum - 1; j++) { + (*G).arcs[i - 1][j] = (*G).arcs[i][j]; // 下一行挪到上一行 + } + } + + // 将该顶点从顶点集中移除 + for(i = k + 1; i < (*G).vexnum; i++) { + (*G).vexs[i - 1] = (*G).vexs[i]; + } + + // 顶点数å‡ä¸€ + (*G).vexnum--; + + return OK; +} + +/* + * æ’入边/å¼§ + * + * 如果当å‰å›¾/网是无å‘的,则æ’入一æ¡å¼§éœ€è¦å¢žåŠ ä¸¤ä¸ªé¡¶ç‚¹å…³ç³»ï¼Œä½†å¼§çš„æ•°é‡åªå¢žä¸€ã€‚ + * + * 对于图æ¥è¯´ï¼Œå¯ä»¥åœ¨å¯å˜å‚数中列出边/弧的附加信æ¯ï¼› + * 对于网æ¥è¯´ï¼Œå¯ä»¥åœ¨å¯å˜å‚æ•°ä¸­ä¾æ¬¡åˆ—出边/å¼§çš„æƒå€¼ä»¥åŠé™„加信æ¯ã€‚ + */ +Status InsertArc(MGraph* G, VertexType v, VertexType w, ...) { + int kv, kw; + VRType adj; // 顶点关系 + Boolean overlay = FALSE; // 是å¦ä¸ºè¦†ç›–添加 + InfoType* info = NULL; // è¾¹/å¼§çš„é™„åŠ ä¿¡æ¯ + va_list ap; + + kv = LocateVex(*G, v); + if(kv == -1) { + return ERROR; // 指定的顶点ä¸å­˜åœ¨ + } + + kw = LocateVex(*G, w); + if(kw == -1) { + return ERROR; // 指定的顶点ä¸å­˜åœ¨ + } + + // æ‹’ç»çޝ + if(kv == kw) { + return ERROR; + } + + /* 确定一个顶点关系 */ + + // 对于图æ¥è¯´ï¼Œè¿žé€šå…³ç³»ç”¨1表示 + if((*G).kind == DG || (*G).kind == UDG) { + adj = 1; + + // 如果边/å¼§ä¸Šå­˜åœ¨é™„åŠ ä¿¡æ¯ + if(IncInfo) { + va_start(ap, w); // 在wåŽæŸ¥è¯¢é¦–个å¯å˜å‚æ•° + info = va_arg(ap, InfoType*); // 获å–é™„åŠ ä¿¡æ¯ + va_end(ap); + } + + overlay = (*G).arcs[kv][kw].adj != 0; + + // 对于网æ¥è¯´ï¼Œæ­¤å¤„需è¦ä»Žå¯å˜å‚æ•°ä¸­èŽ·å–æƒå€¼ä¿¡æ¯ + } else if((*G).kind == DN || (*G).kind == UDN) { + va_start(ap, w); // 在wåŽæŸ¥è¯¢é¦–个å¯å˜å‚æ•° + + adj = va_arg(ap, VRType); // èŽ·å–æƒå€¼ä¿¡æ¯ + + // 如果边/å¼§ä¸Šå­˜åœ¨é™„åŠ ä¿¡æ¯ + if(IncInfo) { + info = va_arg(ap, InfoType*); // 获å–é™„åŠ ä¿¡æ¯ + } + + va_end(ap); + + overlay = (*G).arcs[kv][kw].adj != INFINITE; + } else { + return ERROR; + } + + (*G).arcs[kv][kw].adj = adj; // 记录顶点关系 + + // 如果边/弧上存在附加信æ¯ï¼Œåˆ™è®°å½•附加关系 + if(IncInfo) { + (*G).arcs[kv][kw].info = info; + } + + // 如果是无å‘图/网,需è¦è€ƒè™‘对称性 + if((*G).kind == UDG || (*G).kind == UDN) { + (*G).arcs[kw][kv] = (*G).arcs[kv][kw]; + } + + // 在éžè¦†ç›–的情形下,æ‰è€ƒè™‘æ›´æ–°è¾¹/å¼§çš„æ•°é‡ + if(!overlay) { + (*G).arcnum++; // ä¸è®ºæœ‰å‘æ— å‘,边/å¼§æ•°åªå¢žä¸€ + } + + return OK; +} + +/* + * 删除边/å¼§ + * + * æ­¤åˆ é™¤åªæ˜¯æ›´æ–°è¾¹/弧的连通关系 + */ +Status DeleteArc(MGraph* G, VertexType v, VertexType w) { + int kv, kw; + VRType adj; + Boolean found = FALSE; // 是å¦å­˜åœ¨å¾…删除的边/å¼§ + + kv = LocateVex(*G, v); + if(kv == -1) { + return ERROR; // 指定的顶点ä¸å­˜åœ¨ + } + + kw = LocateVex(*G, w); + if(kw == -1) { + return ERROR; // 指定的顶点ä¸å­˜åœ¨ + } + + // 确定一个éžè¿žé€šæ ‡è®° + if((*G).kind == DG || (*G).kind == UDG) { + adj = 0; // 图 + + found = (*G).arcs[kv][kw].adj != 0; + } else if((*G).kind == DN || (*G).kind == UDN) { + adj = INFINITE; // 网 + + found = (*G).arcs[kv][kw].adj != INFINITE; + } else { + return ERROR; + } + + // 标记这两个顶点已断开连接 + (*G).arcs[kv][kw].adj = adj; + + // 如果是无å‘图/网,需è¦è€ƒè™‘对称性 + if((*G).kind == UDG || (*G).kind == UDN) { + (*G).arcs[kw][kv] = (*G).arcs[kv][kw]; + } + + // 在找到了指定的弧时,æ‰è€ƒè™‘æ›´æ–°è¾¹/å¼§çš„æ•°é‡ + if(found) { + (*G).arcnum--; // ä¸è®ºæœ‰å‘æ— å‘,边/å¼§æ•°åªå‡ä¸€ + } + + return OK; +} + +/* + * 以图形化形å¼è¾“出当å‰ç»“æž„ + * + * 注:在图/网中,使用"-"æ¥è¡¨ç¤ºä¸¤é¡¶ç‚¹ä¸ç›´æŽ¥è¿žé€š + */ +void PrintGraph(MGraph G) { + int i, j; + + if(G.vexnum == 0) { + printf("空图,无需打å°ï¼\n"); + return; + } + + printf("当å‰å›¾/ç½‘åŒ…å« %2d 个顶点, %2d æ¡è¾¹/å¼§...\n", G.vexnum, G.arcnum); + + printf(" "); + for(i = 0; i < G.vexnum; i++) { + printf(" %c", G.vexs[i]); + } + printf("\n"); + + for(i = 0; i < G.vexnum; i++) { + printf("%c ", G.vexs[i]); + + for(j = 0; j < G.vexnum; j++) { + if(((G.kind == DG || G.kind == UDG) && G.arcs[i][j].adj == 0) || ((G.kind == DN || G.kind == UDN) && G.arcs[i][j].adj == INFINITE)) { + printf(" -"); + } else { + printf("%3d", G.arcs[i][j].adj); + } + } + + printf("\n"); + } +} diff --git a/CLion/ExerciseBook/07.15/MGraph.h b/CLion/ExerciseBook/07.15/MGraph.h new file mode 100644 index 0000000..c31c48c --- /dev/null +++ b/CLion/ExerciseBook/07.15/MGraph.h @@ -0,0 +1,160 @@ +/*================================= + * 图的数组(邻接矩阵)存储表示 + * + * 包å«ç®—法: 7.1ã€7.2ã€7.4ã€7.5ã€7.6 + ==================================*/ + +#ifndef MGRAPH_H +#define MGRAPH_H + +#include +#include // æä¾›å®INT_MAX +#include // æä¾›memsetã€strcmp 原型 +#include // æä¾›å®va_listã€va_startã€va_argã€va_end +#include "Status.h" //**â–²01 绪论**// + +/* + * 注: + * + * 通常æ¥è®²ï¼Œæ— æƒå›¾è¢«ç®€ç§°ä¸ºã€å›¾ã€‘,有æƒå›¾è¢«ç®€ç§°ä¸ºã€ç½‘】。 + * æ— å‘图/网中的顶点关系被称为ã€è¾¹ã€‘,有å‘图/网中的顶点关系被称为ã€å¼§ã€‘,并区分弧头与弧尾。 + * 实际表述中,未必会严格éµå®ˆä»¥ä¸Šå‘½å。 + */ + +/* å®å®šä¹‰ */ +#define INFINITE INT_MAX // 最大值,用æ¥è¡¨ç¤ºç½‘中的两个顶点ä¸ç›´æŽ¥è¿žæŽ¥ +#define MAX_VERTEX_NUM 26 // 最大顶点个数 + + +// 图的类型 +typedef enum { + DG, // 0-有å‘图 + DN, // 1-有å‘网(带æƒå€¼) + UDG, // 2-æ— å‘图 + UDN // 3-æ— å‘网(带æƒå€¼) +} GraphKind; + +// 顶点类型 +typedef char VertexType; + +/* + * 顶点关系类型 + * + * 在无æƒå›¾ä¸­ï¼Œè¯¥å€¼é€šå¸¸ä¸º0或1,表示两顶点是å¦ç›´æŽ¥è¿žé€šï¼› + * 在有æƒå›¾ä¸­ï¼Œè¯¥å€¼é€šå¸¸ä¸ºæƒå€¼ã€‚ + */ +typedef int VRType; + +// è¾¹çš„ç›¸å…³é™„åŠ ä¿¡æ¯ +typedef struct { + // 如果有的è¯ï¼ŒåŽç»­ä¼šæ·»åŠ ç›¸åº”çš„å±žæ€§ +} InfoType; + +// è¾¹çš„ç±»åž‹ï¼Œæ¯æ¡è¾¹ä¸Šå¯èƒ½æœ‰é™„加信æ¯info +typedef struct ArcCell { + VRType adj; // 顶点关系,在有æƒå›¾è·Ÿæ— æƒå›¾ä¸­çš„å«ä¹‰ä¸åŒ + InfoType* info; // 边的附加信æ¯ï¼Œé€šå¸¸å¿½ç•¥ +} ArcCell; + +/* 图/网的数组(邻接矩阵)存储表示类型定义 */ +typedef struct { + VertexType vexs[MAX_VERTEX_NUM]; // 顶点å‘é‡ + ArcCell arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; // 邻接矩阵 + int vexnum, arcnum; // 图/网的顶点数和弧数 + GraphKind kind; // 图的类型标志 +} MGraph; + + +// è¾¹/弧上是å¦å­˜åœ¨é™„åŠ ä¿¡æ¯ +extern Boolean IncInfo; + + +/* + * ████████ 算法7.1 ████████ + * + * 创建 + * + *ã€å¤‡æ³¨ã€‘ + * + * æ•™æä¸­é»˜è®¤ä»ŽæŽ§åˆ¶å°è¯»å–æ•°æ®ã€‚ + * 这里为了方便测试,é¿å…æ¯æ¬¡è¿è¡Œéƒ½æ‰‹åŠ¨è¾“å…¥æ•°æ®ï¼Œ + * 因而å…许选择从预设的文件pathä¸­è¯»å–æµ‹è¯•æ•°æ®ã€‚ + * + * 如果需è¦ä»ŽæŽ§åˆ¶å°è¯»å–æ•°æ®ï¼Œåˆ™path为NULL,或path[kind]为""。 + * 如果需è¦ä»Žæ–‡ä»¶ä¸­è¯»å–æ•°æ®ï¼Œåˆ™éœ€è¦åœ¨path中填写文件åä¿¡æ¯ã€‚ + */ +Status CreateGraph(MGraph* G, char* path[]); + +/* + * 构造有å‘图 + */ +static Status CreateDG(MGraph* G); + +/* + * 构造有å‘网 + */ +static Status CreateDN(MGraph* G); + +/* + * 构造无å‘图 + */ +static Status CreateUDG(MGraph* G); + +/* + * ████████ 算法7.2 ████████ + * + * 构造无å‘网 + */ +static Status CreateUDN(MGraph* G); + +/* + * å½•å…¥è¾¹çš„ç›¸å…³é™„åŠ ä¿¡æ¯ + */ +static void Input(MGraph G, InfoType** info); + +/* + * 查找 + * + * 返回顶点u在图/网中的ä½ç½® + */ +int LocateVex(MGraph G, VertexType u); + +/* + * æ’入顶点 + * + * 将指定的顶点v追加到顶点集中,未建立该顶点与其他顶点的关系 + */ +Status InsertVex(MGraph* G, VertexType v); + +/* + * 删除顶点 + * + * 从顶点集中删除指定的顶点v,注æ„éœ€è¦æ›´æ–°ç›¸å…³çš„顶点关系 + */ +Status DeleteVex(MGraph* G, VertexType v); + +/* + * æ’入边/å¼§ + * + * 如果当å‰å›¾/网是无å‘的,则æ’入一æ¡å¼§éœ€è¦å¢žåŠ ä¸¤ä¸ªé¡¶ç‚¹å…³ç³»ï¼Œä½†å¼§çš„æ•°é‡åªå¢žä¸€ã€‚ + * + * 对于图æ¥è¯´ï¼Œå¯ä»¥åœ¨å¯å˜å‚数中列出边/弧的附加信æ¯ï¼› + * 对于网æ¥è¯´ï¼Œå¯ä»¥åœ¨å¯å˜å‚æ•°ä¸­ä¾æ¬¡åˆ—出边/å¼§çš„æƒå€¼ä»¥åŠé™„加信æ¯ã€‚ + */ +Status InsertArc(MGraph* G, VertexType v, VertexType w, ...); + +/* + * 删除边/å¼§ + * + * æ­¤åˆ é™¤åªæ˜¯æ›´æ–°è¾¹/弧的连通关系 + */ +Status DeleteArc(MGraph* G, VertexType v, VertexType w); + +/* + * 以图形化形å¼è¾“出当å‰ç»“æž„ + * + * 注:在图/网中,使用"-"æ¥è¡¨ç¤ºä¸¤é¡¶ç‚¹ä¸ç›´æŽ¥è¿žé€š + */ +void PrintGraph(MGraph G); + +#endif diff --git a/CLion/ExerciseBook/07.15/TestData_DG.txt b/CLion/ExerciseBook/07.15/TestData_DG.txt new file mode 100644 index 0000000..4768c22 --- /dev/null +++ b/CLion/ExerciseBook/07.15/TestData_DG.txt @@ -0,0 +1,6 @@ +图类型→0(有å‘图) +顶点数→6 +弧数→14 +弧是å¦å¸¦æœ‰å…¶ä»–ä¿¡æ¯â†’0 +顶点集→ã€A,X,B,C,D,E】 +弧的集åˆâ†’ã€A,B】ã€A,C】ã€A,D】ã€B,C】ã€B,D】ã€B,E】ã€C,B】ã€C,E】ã€C,X】ã€E,A】ã€E,D】ã€E,X】ã€X,A】ã€X,D】 \ No newline at end of file diff --git a/CLion/ExerciseBook/07.15/TestData_DN.txt b/CLion/ExerciseBook/07.15/TestData_DN.txt new file mode 100644 index 0000000..34f7d7a --- /dev/null +++ b/CLion/ExerciseBook/07.15/TestData_DN.txt @@ -0,0 +1,6 @@ +图类型→1(有å‘网) +顶点数→6 +弧数→14 +弧是å¦å¸¦æœ‰å…¶ä»–ä¿¡æ¯â†’0 +顶点集→ã€A,X,B,C,D,E】 +弧的集åˆâ†’ã€A,B,3】ã€A,C,8】ã€A,D,11】ã€B,C,7】ã€B,D,4】ã€B,E,1】ã€C,B,5】ã€C,E,17】ã€C,X,3】ã€E,A,6】ã€E,D,4】ã€E,X,2】ã€X,A,8】ã€X,D,10】 \ No newline at end of file diff --git a/CLion/ExerciseBook/07.15/TestData_UDG.txt b/CLion/ExerciseBook/07.15/TestData_UDG.txt new file mode 100644 index 0000000..65d0356 --- /dev/null +++ b/CLion/ExerciseBook/07.15/TestData_UDG.txt @@ -0,0 +1,6 @@ +图类型→2(无å‘图) +顶点数→6 +边数→13 +边是å¦å¸¦æœ‰å…¶ä»–ä¿¡æ¯â†’0 +顶点集→ã€A,X,B,C,D,E】 +边的集åˆâ†’ã€A,B】ã€A,C】ã€A,D】ã€B,C】ã€B,D】ã€B,E】ã€C,E】ã€C,X】ã€E,A】ã€E,D】ã€E,X】ã€X,A】ã€X,D】 \ No newline at end of file diff --git a/CLion/ExerciseBook/07.15/TestData_UDN.txt b/CLion/ExerciseBook/07.15/TestData_UDN.txt new file mode 100644 index 0000000..23d0eda --- /dev/null +++ b/CLion/ExerciseBook/07.15/TestData_UDN.txt @@ -0,0 +1,6 @@ +图类型→3(无å‘网) +顶点数→6 +边数→13 +边是å¦å¸¦æœ‰å…¶ä»–ä¿¡æ¯â†’0 +顶点集→ã€A,X,B,C,D,E】 +边的集åˆâ†’ã€A,B,3】ã€A,C,8】ã€A,D,11】ã€B,C,7】ã€B,D,4】ã€B,E,1】ã€C,E,17】ã€C,X,3】ã€E,A,6】ã€E,D,4】ã€E,X,2】ã€X,A,8】ã€X,D,10】 \ No newline at end of file diff --git a/CLion/ExerciseBook/07.17/07.17.c b/CLion/ExerciseBook/07.17/07.17.c new file mode 100644 index 0000000..7d54d13 --- /dev/null +++ b/CLion/ExerciseBook/07.17/07.17.c @@ -0,0 +1,169 @@ +#include +#include // æä¾›å®va_listã€va_startã€va_argã€va_end +#include "Status.h" //**â–²01 绪论**// +#include "OLGraph.h" //**â–²07 图**// + +/* + * æ’入顶点 + * + * 将指定的顶点v追加到顶点集中,未建立该顶点与其他顶点的关系 + */ +Status InsertVex_7_17(OLGraph* G, VertexType v); + +/* + * 删除顶点 + * + * 从顶点集中删除指定的顶点v,注æ„éœ€è¦æ›´æ–°ç›¸å…³çš„顶点关系 + */ +Status DeleteVex_7_17(OLGraph* G, VertexType v); + +/* + * æ’入边/å¼§ + * + * 如果当å‰å›¾/网是无å‘的,则æ’入一æ¡å¼§éœ€è¦å¢žåŠ ä¸¤ä¸ªé¡¶ç‚¹å…³ç³»ï¼Œä½†å¼§çš„æ•°é‡åªå¢žä¸€ã€‚ + * + * 对于图æ¥è¯´ï¼Œå¯ä»¥åœ¨å¯å˜å‚数中列出边/弧的附加信æ¯ï¼› + * 对于网æ¥è¯´ï¼Œå¯ä»¥åœ¨å¯å˜å‚æ•°ä¸­ä¾æ¬¡åˆ—出边/å¼§çš„æƒå€¼ä»¥åŠé™„加信æ¯ã€‚ + */ +Status InsertArc_7_17(OLGraph* G, VertexType v, VertexType w, ...); + +/* + * 删除边/å¼§ + * + * æ­¤åˆ é™¤åªæ˜¯æ›´æ–°è¾¹/弧的连通关系 + */ +Status DeleteArc_7_17(OLGraph* G, VertexType v, VertexType w); + + +int main(int argc, char* argv[]) { + OLGraph G; + + printf("████████ 创建并输出图/网...\n"); + { + char* path[4]; + + path[0] = "TestData_DG.txt"; + path[1] = "TestData_DN.txt"; + path[2] = "TestData_UDG.txt"; + path[3] = "TestData_UDN.txt"; + + CreateGraph(&G, path); + PrintGraph(G); + printf("\n"); + } + + printf("████████ 删除顶点...\n"); + { + VertexType v = 'X'; + + printf("删除顶点 '%c' åŽçš„图为:\n", v); + DeleteVex_7_17(&G, v); + PrintGraph(G); + printf("\n"); + } + + printf("████████ æ’入顶点...\n"); + { + VertexType v = 'Y'; + + printf("æ’入顶点 '%c' åŽçš„图为:\n", v); + InsertVex_7_17(&G, v); + PrintGraph(G); + printf("\n"); + } + + printf("████████ æ’入边/å¼§...\n"); + { + // 注:是é‡å¤çš„è¾¹ + VertexType v[10] = {'B', 'C', 'E', 'Y', 'Y', 'Y', 'D', 'D', 'E', 'E'}; + VertexType w[10] = {'Y', 'Y', 'Y', 'A', 'B', 'D', 'C', 'A', 'B', 'D'}; + InfoType info[10] = {{8}, {5}, {1}, {11}, {2}, {6}, {3}, {7}, {2}, {9}}; + int k; + + // 图 + if(G.kind == DG || G.kind == UDG) { + for(k = 0; k < 10; k++) { + printf("æ’入无æƒå€¼çš„边:<%c, %c>...\n", v[k], w[k]); + InsertArc_7_17(&G, v[k], w[k]); + } + + // 网 + } else if(G.kind == DN || G.kind == UDN) { + for(k = 0; k < 10; k++) { + printf("æ’入带æƒå€¼çš„边:<%c, %c, %d>...\n", v[k], w[k], info[k].weight); + InsertArc_7_17(&G, v[k], w[k], &info[k]); + } + } else { + return ERROR; + } + + PrintGraph(G); + printf("\n"); + } + + printf("████████ 删除边/å¼§...\n"); + { + VertexType v[3] = {'D', 'E', 'F'}; + VertexType w[3] = {'A', 'B', 'B'}; + int k; + + for(k = 0; k < 3; k++) { + printf("删除边:<%c, %c>...\n", v[k], w[k]); + DeleteArc_7_17(&G, v[k], w[k]); + } + PrintGraph(G); + printf("\n"); + } + + return 0; +} + + +/* + * æ’入顶点 + * + * 将指定的顶点v追加到顶点集中,未建立该顶点与其他顶点的关系 + */ +Status InsertVex_7_17(OLGraph* G, VertexType v) { + return InsertVex(G, v); +} + +/* + * 删除顶点 + * + * 从顶点集中删除指定的顶点v,注æ„éœ€è¦æ›´æ–°ç›¸å…³çš„顶点关系 + */ +Status DeleteVex_7_17(OLGraph* G, VertexType v) { + return DeleteVex(G, v); +} + +/* + * æ’入边/å¼§ + * + * 如果当å‰å›¾/网是无å‘的,则æ’入一æ¡å¼§éœ€è¦å¢žåŠ ä¸¤ä¸ªé¡¶ç‚¹å…³ç³»ï¼Œä½†å¼§çš„æ•°é‡åªå¢žä¸€ã€‚ + * + * 对于图æ¥è¯´ï¼Œå¯ä»¥åœ¨å¯å˜å‚数中列出边/弧的附加信æ¯ï¼› + * 对于网æ¥è¯´ï¼Œå¯ä»¥åœ¨å¯å˜å‚æ•°ä¸­ä¾æ¬¡åˆ—出边/å¼§çš„æƒå€¼ä»¥åŠé™„加信æ¯ã€‚ + */ +Status InsertArc_7_17(OLGraph* G, VertexType v, VertexType w, ...) { + va_list ap; + InfoType* info = NULL; // è¾¹/å¼§çš„é™„åŠ ä¿¡æ¯ + + // 如果边/å¼§ä¸Šå­˜åœ¨é™„åŠ ä¿¡æ¯ + if(IncInfo) { + va_start(ap, w); // 在wåŽæŸ¥è¯¢é¦–个å¯å˜å‚æ•° + info = va_arg(ap, InfoType*); // 获å–é™„åŠ ä¿¡æ¯ + va_end(ap); + } + + return InsertArc(G, v, w, info); +} + +/* + * 删除边/å¼§ + * + * æ­¤åˆ é™¤åªæ˜¯æ›´æ–°è¾¹/弧的连通关系 + */ +Status DeleteArc_7_17(OLGraph* G, VertexType v, VertexType w) { + return DeleteArc(G, v, w); +} diff --git a/CLion/ExerciseBook/07.17/CMakeLists.txt b/CLion/ExerciseBook/07.17/CMakeLists.txt new file mode 100644 index 0000000..35cd375 --- /dev/null +++ b/CLion/ExerciseBook/07.17/CMakeLists.txt @@ -0,0 +1,12 @@ +# 包å«å…¬å…±åº“ +include_directories(${CMAKE_SOURCE_DIR}/Status) + +# 生æˆå¯æ‰§è¡Œæ–‡ä»¶ +add_executable(07.17 OLGraph.h OLGraph.c 07.17.c) +# 链接公共库 +target_link_libraries(07.17 Scanf_lib) + +# è®°å½•è¦æ‹·è´åˆ°*.exeç›®å½•ä¸‹çš„èµ„æºæ–‡ä»¶ +file(GLOB TestData TestData*.txt) +# å°†èµ„æºæ–‡ä»¶æ‹·è´åˆ°*.exe目录下,ä¸ç„¶æ— æ³•加载 +file(COPY ${TestData} DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) diff --git a/CLion/ExerciseBook/07.17/OLGraph.c b/CLion/ExerciseBook/07.17/OLGraph.c new file mode 100644 index 0000000..be3dd6e --- /dev/null +++ b/CLion/ExerciseBook/07.17/OLGraph.c @@ -0,0 +1,861 @@ +/*==================== + * 图的å字链表存储表示 + * + * 包å«ç®—法: 7.3 + ====================*/ + +#include "OLGraph.h" + +// 录入数æ®çš„æºæ–‡ä»¶ï¼›fp为null时,说明需è¦ä»ŽæŽ§åˆ¶å°å½•å…¥ +static FILE* fp = NULL; + +/* + * IncInfo指示该图的边上是å¦å­˜åœ¨é™„加信æ¯ã€‚ + * 如果其值ä¸ä¸º0,则表示无附加信æ¯ï¼Œå¦åˆ™ï¼Œè¡¨ç¤ºå­˜åœ¨é™„加信æ¯ã€‚ + */ +Boolean IncInfo = FALSE; + +// 访问标志数组,记录访问过的顶点 +static Boolean visited[MAX_VERTEX_NUM]; + +// 函数å˜é‡ +static Status (* VisitFunc)(VertexType e); + + +/* + * 创建 + * + *ã€å¤‡æ³¨ã€‘ + * + * æ•™æä¸­é»˜è®¤ä»ŽæŽ§åˆ¶å°è¯»å–æ•°æ®ã€‚ + * 这里为了方便测试,é¿å…æ¯æ¬¡è¿è¡Œéƒ½æ‰‹åŠ¨è¾“å…¥æ•°æ®ï¼Œ + * 因而å…许选择从预设的文件pathä¸­è¯»å–æµ‹è¯•æ•°æ®ã€‚ + * + * 如果需è¦ä»ŽæŽ§åˆ¶å°è¯»å–æ•°æ®ï¼Œåˆ™path为NULL,或path[kind]为""。 + * 如果需è¦ä»Žæ–‡ä»¶ä¸­è¯»å–æ•°æ®ï¼Œåˆ™éœ€è¦åœ¨path中填写文件åä¿¡æ¯ã€‚ + */ +Status CreateGraph(OLGraph* G, char* path[]) { + int readFromConsole; // 是å¦ä»ŽæŽ§åˆ¶å°è¯»å–æ•°æ® + int kind; + Status flag; + + printf("请输入图的类型(0-有å‘图 │ 1-有å‘网 │ 2-æ— å‘图 │ 3-æ— å‘网):"); + scanf("%d", &kind); + + // 类型ä¸åˆè§„ + if(kind < 0 || kind > 3) { + return ERROR; + } + + // 如果没有文件路径信æ¯ï¼Œåˆ™ä»ŽæŽ§åˆ¶å°è¯»å–输入 + readFromConsole = (path == NULL) || strcmp(path[kind], "") == 0; + + // 需è¦ä»Žæ–‡ä»¶è¯»å– + if(readFromConsole) { + (*G).kind = kind; // 记录图/网的类型 + } else { + // æ‰“å¼€æ–‡ä»¶ï¼Œå‡†å¤‡è¯»å–æµ‹è¯•æ•°æ® + fp = fopen(path[kind], "r"); + if(fp == NULL) { + return ERROR; + } + + // 录入图的类型 + ReadData(fp, "%d", &((*G).kind)); + } + + // éšæœºåˆ›å»ºæœ‰å‘图/网或无å‘图/ç½‘çš„ä¸€ç§ + switch((*G).kind) { + case DG: + flag = CreateDG(G); + break; + case DN: + flag = CreateDN(G); + break; + case UDG: + flag = CreateUDG(G); + break; + case UDN: + flag = CreateUDN(G); + break; + default: + flag = ERROR; + break; + } + + if(fp != NULL) { + fclose(fp); + fp = NULL; + } + + return flag; +} + +/* + * ████████ 算法7.3 ████████ + * + * 构造有å‘图 + * + * 注: + * æ•™æä¸­ä½¿ç”¨äº†å¤´æ’æ³•æ¥æ’入弧,这ç§åšæ³•çš„å”¯ä¸€ä¼˜ç‚¹æ˜¯æ’入方便, + * 但是在涉åŠåˆ°åˆ é™¤æˆ–查找时,效率较低; + * 而且,"å¤´æ’æ³•"ä¾èµ–输入的顺åºï¼Œå¦‚果输入的边/弧是乱åºçš„, + * 则最终构造出的图/网中的边/弧也是无åºçš„。 + * + * 为了克æœä»¥ä¸Šç¼ºç‚¹ï¼Œè¿™é‡Œæ”¹ç”¨"å‡åº"æ’入法,ä¿è¯æ’入的弧是"å‡åº"的。 + * ä½†åŒæ—¶ï¼Œè¿™æ ·åšä¼šä½¿"æ’å…¥"算法å˜å¾—è¾ƒä¸ºå¤æ‚。 + */ +static Status CreateDG(OLGraph* G) { + int i, k; + int vexnum, arcnum; + VertexType v1, v2; + InfoType* info = NULL; + + (*G).vexnum = (*G).arcnum = 0; + + if(fp == NULL) { + printf("请输入有å‘图的顶点数:"); + scanf("%d", &vexnum); + printf("请输入有å‘图的弧数:"); + scanf("%d", &arcnum); + printf("该有å‘图的弧上是å¦åŒ…å«å…¶ä»–附加信æ¯(0-ä¸åŒ…å«â”‚1-包å«):"); + scanf("%d", &IncInfo); + + // 录入顶点集 + printf("请录入 %d 个顶点,ä¸åŒé¡¶ç‚¹ä¹‹é—´ç”¨ç©ºæ ¼éš”开:", vexnum); + for(i = 0; i < vexnum; i++) { + scanf("%c", &((*G).xlist[i].data)); + (*G).xlist[i].firstin = NULL; + (*G).xlist[i].firstout = NULL; + (*G).vexnum++; + } + } else { + ReadData(fp, "%d", &vexnum); // 录入顶点数 + ReadData(fp, "%d", &arcnum); // 录入弧数 + ReadData(fp, "%d", &IncInfo); // 判断弧上是å¦åŒ…å«é™„åŠ ä¿¡æ¯ + + // 录入顶点集 + for(i = 0; i < vexnum; i++) { + // 跳过空白,寻找下一个"å¯è¯»"ç¬¦å· + skipBlank(fp); + ReadData(fp, "%c", &((*G).xlist[i].data)); + (*G).xlist[i].firstin = NULL; + (*G).xlist[i].firstout = NULL; + (*G).vexnum++; + } + } + + // 仅在控制å°å½•å…¥ä¿¡æ¯æ—¶è¾“出此æç¤º + if(fp == NULL && arcnum != 0) { + printf("请为有å‘图便¬¡å½•å…¥ %d æ¡å¼§çš„ä¿¡æ¯ï¼Œé¡¶ç‚¹ä¹‹é—´ç”¨ç©ºæ ¼éš”开:\n", arcnum); + } + + // å½•å…¥å¼§çš„ä¿¡æ¯ + for(k = 0; k < arcnum; k++) { + if(fp == NULL) { + printf("第 %2d æ¡å¼§ï¼š", k + 1); + skipBlank(stdin); // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + scanf("%c", &v1); + skipBlank(stdin); // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + scanf("%c", &v2); + } else { + // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + skipBlank(fp); + ReadData(fp, "%c%c", &v1, &v2); + } + + // 如果需è¦å½•å…¥å¼§çš„å…¶ä»–é™„åŠ ä¿¡æ¯ + if(IncInfo) { + // 最åŽå½•å…¥é™„åŠ ä¿¡æ¯ + Input(*G, &info); + } + + // æ’入弧 + InsertArc(G, v1, v2, info); + } + + // ä»Žæ–‡ä»¶ä¸­è¯»å–æ•°æ®æ—¶ï¼Œæœ€åŽå…¶å®žåº”当判断一下是å¦è¯»åˆ°äº†è¶³å¤Ÿçš„ä¿¡æ¯ + return OK; +} + +/* + * 构造有å‘网 + */ +static Status CreateDN(OLGraph* G) { + int i, k; + int vexnum, arcnum; + VertexType v1, v2; + InfoType* info = NULL; + + (*G).vexnum = (*G).arcnum = 0; + + if(fp == NULL) { + printf("请输入有å‘图的顶点数:"); + scanf("%d", &vexnum); + printf("请输入有å‘网的弧数:"); + scanf("%d", &arcnum); + printf("该有å‘网的弧上必须包å«å…¶ä»–附加信æ¯ï¼Œå› ä¸ºæ­¤å¤„çš„æƒå€¼éœ€è¦å­˜å‚¨åˆ°é™„加信æ¯ä¸­...\n"); + IncInfo = 1; + + // 录入顶点集 + printf("请录入 %d 个顶点,ä¸åŒé¡¶ç‚¹ä¹‹é—´ç”¨ç©ºæ ¼éš”开:", vexnum); + for(i = 0; i < vexnum; i++) { + // 跳过空白,寻找下一个"å¯è¯»"ç¬¦å· + skipBlank(stdin); + scanf("%c", &((*G).xlist[i].data)); + (*G).xlist[i].firstin = NULL; + (*G).xlist[i].firstout = NULL; + (*G).vexnum++; + } + } else { + ReadData(fp, "%d", &vexnum); // 录入顶点数 + ReadData(fp, "%d", &arcnum); // 录入弧数 + ReadData(fp, "%d", &IncInfo);// 判断弧上是å¦åŒ…å«é™„加信æ¯(此处应当包å«) + IncInfo = 1; // 强制将æƒå€¼å½•入到附加信æ¯ä¸­ + + // 录入顶点集 + for(i = 0; i < vexnum; i++) { + // 跳过空白,寻找下一个"å¯è¯»"ç¬¦å· + skipBlank(fp); + ReadData(fp, "%c", &((*G).xlist[i].data)); + (*G).xlist[i].firstin = NULL; + (*G).xlist[i].firstout = NULL; + (*G).vexnum++; + } + } + + // 仅在控制å°å½•å…¥ä¿¡æ¯æ—¶è¾“出此æç¤º + if(fp == NULL && arcnum != 0) { + printf("请为有å‘ç½‘ä¾æ¬¡å½•å…¥ %d æ¡å¼§(带æƒå€¼)的信æ¯ï¼Œé¡¶ç‚¹åŠæƒå€¼ä¹‹é—´ç”¨ç©ºæ ¼éš”开:\n", arcnum); + } + + // å½•å…¥å¼§çš„ä¿¡æ¯ + for(k = 0; k < arcnum; k++) { + if(fp == NULL) { + printf("第 %2d æ¡å¼§åŠå…¶æƒå€¼ï¼š", k + 1); + skipBlank(stdin); // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + scanf("%c", &v1); + skipBlank(stdin); // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + scanf("%c", &v2); + } else { + // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + skipBlank(fp); + ReadData(fp, "%c%c", &v1, &v2); + } + + // 如果需è¦å½•å…¥å¼§çš„å…¶ä»–é™„åŠ ä¿¡æ¯ + if(IncInfo) { + // 最åŽå½•入附加信æ¯(此处需è¦å½•入网的æƒå€¼) + Input(*G, &info); + } + + // æ’入弧 + InsertArc(G, v1, v2, info); + } + + // ä»Žæ–‡ä»¶ä¸­è¯»å–æ•°æ®æ—¶ï¼Œæœ€åŽå…¶å®žåº”当判断一下是å¦è¯»åˆ°äº†è¶³å¤Ÿçš„ä¿¡æ¯ + return OK; +} + +/* + * 构造无å‘图 + */ +static Status CreateUDG(OLGraph* G) { + int i, k; + int vexnum, arcnum; + VertexType v1, v2; + InfoType* info = NULL; + + (*G).vexnum = (*G).arcnum = 0; + + if(fp == NULL) { + printf("请输入无å‘图的顶点数:"); + scanf("%d", &vexnum); + printf("请输入无å‘图的边数:"); + scanf("%d", &arcnum); + printf("该无å‘图的边上是å¦åŒ…å«å…¶ä»–附加信æ¯(0-ä¸åŒ…å«â”‚1-包å«):"); + scanf("%d", &IncInfo); + + // 录入顶点集 + printf("请录入 %d 个顶点,ä¸åŒé¡¶ç‚¹ä¹‹é—´ç”¨ç©ºæ ¼éš”开:", vexnum); + for(i = 0; i < vexnum; i++) { + // 跳过空白,寻找下一个"å¯è¯»"ç¬¦å· + skipBlank(stdin); + scanf("%c", &((*G).xlist[i].data)); + (*G).xlist[i].firstin = NULL; + (*G).xlist[i].firstout = NULL; + (*G).vexnum++; + } + } else { + ReadData(fp, "%d", &vexnum); // 录入顶点数 + ReadData(fp, "%d", &arcnum); // 录入边数 + ReadData(fp, "%d", &IncInfo);// 判断边上是å¦åŒ…å«é™„åŠ ä¿¡æ¯ + + // 录入顶点集 + for(i = 0; i < vexnum; i++) { + // 跳过空白,寻找下一个"å¯è¯»"ç¬¦å· + skipBlank(fp); + ReadData(fp, "%c", &((*G).xlist[i].data)); + (*G).xlist[i].firstin = NULL; + (*G).xlist[i].firstout = NULL; + (*G).vexnum++; + } + } + + // 仅在控制å°å½•å…¥ä¿¡æ¯æ—¶è¾“出此æç¤º + if(fp == NULL && arcnum != 0) { + printf("请为无å‘图便¬¡å½•å…¥ %d æ¡è¾¹çš„ä¿¡æ¯ï¼Œé¡¶ç‚¹ä¹‹é—´ç”¨ç©ºæ ¼éš”开:\n", arcnum); + } + + // å½•å…¥è¾¹çš„ä¿¡æ¯ + for(k = 0; k < arcnum; k++) { + if(fp == NULL) { + printf("第 %2d æ¡è¾¹ï¼š", k + 1); + skipBlank(stdin); // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + scanf("%c", &v1); + skipBlank(stdin); // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + scanf("%c", &v2); + } else { + // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + skipBlank(fp); + ReadData(fp, "%c%c", &v1, &v2); + } + + // 如果需è¦å½•å…¥è¾¹çš„å…¶ä»–é™„åŠ ä¿¡æ¯ + if(IncInfo) { + // 最åŽå½•å…¥é™„åŠ ä¿¡æ¯ + Input(*G, &info); + } + + // æ’入边 + InsertArc(G, v1, v2, info); + } + + // ä»Žæ–‡ä»¶ä¸­è¯»å–æ•°æ®æ—¶ï¼Œæœ€åŽå…¶å®žåº”当判断一下是å¦è¯»åˆ°äº†è¶³å¤Ÿçš„ä¿¡æ¯ + return OK; +} + +/* + * 构造无å‘网 + */ +static Status CreateUDN(OLGraph* G) { + int i, k; + int vexnum, arcnum; + VertexType v1, v2; + InfoType* info = NULL; + + (*G).vexnum = (*G).arcnum = 0; + + if(fp == NULL) { + printf("请输入无å‘网的顶点数:"); + scanf("%d", &vexnum); + printf("请输入无å‘网的边数:"); + scanf("%d", &arcnum); + printf("该无å‘网的边上必须包å«å…¶ä»–附加信æ¯ï¼Œå› ä¸ºæ­¤å¤„çš„æƒå€¼éœ€è¦å­˜å‚¨åˆ°é™„加信æ¯ä¸­...\n"); + IncInfo = 1; + + // 录入顶点集 + printf("请录入 %d 个顶点,ä¸åŒé¡¶ç‚¹ä¹‹é—´ç”¨ç©ºæ ¼éš”开:", vexnum); + for(i = 0; i < vexnum; i++) { + // 跳过空白,寻找下一个"å¯è¯»"ç¬¦å· + skipBlank(stdin); + scanf("%c", &((*G).xlist[i].data)); + (*G).xlist[i].firstin = NULL; + (*G).xlist[i].firstout = NULL; + (*G).vexnum++; + } + } else { + ReadData(fp, "%d", &vexnum); // 录入顶点数 + ReadData(fp, "%d", &arcnum); // 录入边数 + ReadData(fp, "%d", &IncInfo);// 判断边上是å¦åŒ…å«é™„åŠ ä¿¡æ¯ + IncInfo = 1; // 强制将æƒå€¼å½•入到附加信æ¯ä¸­ + + // 录入顶点集 + for(i = 0; i < vexnum; i++) { + // 跳过空白,寻找下一个"å¯è¯»"ç¬¦å· + skipBlank(fp); + ReadData(fp, "%c", &((*G).xlist[i].data)); + (*G).xlist[i].firstin = NULL; + (*G).xlist[i].firstout = NULL; + (*G).vexnum++; + } + } + + // 仅在控制å°å½•å…¥ä¿¡æ¯æ—¶è¾“出此æç¤º + if(fp == NULL && arcnum != 0) { + printf("请为无å‘ç½‘ä¾æ¬¡å½•å…¥ %d æ¡è¾¹(带æƒå€¼)的信æ¯ï¼Œé¡¶ç‚¹åŠæƒå€¼ä¹‹é—´ç”¨ç©ºæ ¼éš”开:\n", arcnum); + } + + // å½•å…¥è¾¹çš„ä¿¡æ¯ + for(k = 0; k < arcnum; k++) { + if(fp == NULL) { + printf("第 %2d æ¡è¾¹åŠå…¶æƒå€¼ï¼š", k + 1); + skipBlank(stdin); // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + scanf("%c", &v1); + skipBlank(stdin); // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + scanf("%c", &v2); + } else { + // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + skipBlank(fp); + ReadData(fp, "%c%c", &v1, &v2); + } + + // 如果需è¦å½•å…¥è¾¹çš„å…¶ä»–é™„åŠ ä¿¡æ¯ + if(IncInfo) { + // 最åŽå½•入附加信æ¯(此处需è¦å½•入网的æƒå€¼) + Input(*G, &info); + } + + // æ’入边 + InsertArc(G, v1, v2, info); + } + + // ä»Žæ–‡ä»¶ä¸­è¯»å–æ•°æ®æ—¶ï¼Œæœ€åŽå…¶å®žåº”当判断一下是å¦è¯»åˆ°äº†è¶³å¤Ÿçš„ä¿¡æ¯ + return OK; +} + +/* + * å½•å…¥å¼§çš„ç›¸å…³é™„åŠ ä¿¡æ¯ + */ +static void Input(OLGraph G, InfoType** info) { + int weight; + + // 在"网"的情形下需è¦å½•å…¥æƒå€¼ä¿¡æ¯ + if(G.kind == DN || G.kind == UDN) { + *info = (InfoType*) malloc(sizeof(InfoType)); + + if(fp == NULL) { + scanf("%d", &weight); + } else { + ReadData(fp, "%d", &weight); + } + + (*info)->weight = weight; + } +} + +/* + * 查找 + * + * 返回顶点u在图/网中的ä½ç½® + */ +int LocateVex(OLGraph G, VertexType u) { + int i; + + for(i = 0; i < G.vexnum; i++) { + if(G.xlist[i].data == u) { + return i; + } + } + + return -1; +} + +/* + * æ’入顶点 + * + * 将指定的顶点v追加到顶点集中,未建立该顶点与其他顶点的关系 + */ +Status InsertVex(OLGraph* G, VertexType v) { + int k; + + // 顶点数过多 + if((*G).vexnum == MAX_VERTEX_NUM) { + return ERROR; + } + + // 首先需è¦åˆ¤æ–­è¯¥é¡¶ç‚¹æ˜¯å¦å­˜åœ¨ + k = LocateVex(*G, v); + if(k >= 0) { + return ERROR; // 指定的顶点存在时,无需é‡å¤æ·»åŠ  + } + + G->xlist[(*G).vexnum].data = v; + G->xlist[(*G).vexnum].firstin = NULL; + G->xlist[(*G).vexnum].firstout = NULL; + + (*G).vexnum++; + + return OK; +} + +/* + * 删除顶点 + * + * 从顶点集中删除指定的顶点v,注æ„éœ€è¦æ›´æ–°ç›¸å…³çš„顶点关系 + */ +Status DeleteVex(OLGraph* G, VertexType v) { + int k, i; + ArcBox* pre, * r; + ArcBox* pre2, * r2; + + // 首先需è¦åˆ¤æ–­è¯¥é¡¶ç‚¹æ˜¯å¦å­˜åœ¨ + k = LocateVex(*G, v); + if(k == -1) { + return ERROR; // 指定的顶点ä¸å­˜åœ¨ + } + + // 找到以结点v出å‘的链表,释放该链表上所有结点 + r = G->xlist[k].firstout; + while(r != NULL) { + pre = r; + r = r->tlink; + + // 在纵å‘链表上查找preçš„ä½ç½® + pre2 = NULL; + r2 = G->xlist[pre->headvex].firstin; // 至此,r2一定ä¸ä¸ºNULL + while(r2 != NULL && r2->tailvex != k) { + pre2 = r2; + r2 = r2->hlink; + } + + // 至此,r2一定指å‘了待删除的弧 + if(pre2 == NULL) { + G->xlist[pre->headvex].firstin = r2->hlink; + } else { + pre2->hlink = r2->hlink; + } + + free(pre); + + (*G).arcnum--; + } + + G->xlist[k].firstout = NULL; + + // é历其它所有链表,删除那些指å‘顶点v的弧;而且,下标超过k的顶点,其下标值需è¦é€’å‡ + for(i = 0; i < G->vexnum; i++) { + pre = NULL; + r = G->xlist[i].firstout; + while(r != NULL && r->headvex < k) { + if(r->tailvex > k) { + r->tailvex -= 1; + } + pre = r; + r = r->tlink; + } + + // 链表上所有顶点的下标å‡å°äºŽk + if(r == NULL) { + continue; + } + + if(r->headvex == k) { + // 从开头删掉结点v + if(pre == NULL) { + G->xlist[i].firstout = r->tlink; + + // 从中间æŸä¸ªä½ç½®åˆ æŽ‰ç»“点v + } else { + pre->tlink = r->tlink; + } + + // 在纵å‘链表上查找rçš„ä½ç½® + pre2 = NULL; + r2 = G->xlist[k].firstin; // 至此,r2一定ä¸ä¸ºNULL + while(r2 != NULL && r2->tailvex != r->tailvex) { + pre2 = r2; + r2 = r2->hlink; + } + + // 至此,r2一定指å‘了待删除的弧 + if(pre2 == NULL) { + G->xlist[k].firstin = r2->hlink; + } else { + pre2->hlink = r2->hlink; + } + + free(r); + + // 如果这是有å‘的图/网,ä¾ç„¶éœ€è¦é€’å‡è¾¹/å¼§çš„æ•°é‡ + if((*G).kind == DG || (*G).kind == DN) { + (*G).arcnum--; + } + } + + // 冿¬¡ç¡®å®šrçš„ä½ç½® + if(pre == NULL) { + r = G->xlist[i].firstout; + } else { + r = pre->tlink; + } + + // 下标超过k的顶点,需è¦é€’å‡å…¶ä¸‹æ ‡ + while(r != NULL) { + if(r->tailvex > k) { + r->tailvex -= 1; + } + + if(r->headvex > k) { + r->headvex -= 1; + } + + r = r->tlink; + } + } + + // 顶点集å‰ç§» + for(i = k + 1; i < (*G).vexnum; i++) { + G->xlist[i - 1] = G->xlist[i]; + } + + // é¡¶ç‚¹æ•°é€’å‡ + (*G).vexnum--; + + return OK; +} + +/* + * 构造一个边/弧结点(ä»…é™å†…部使用) + */ +static ArcBox* newArcBoxPtr(int tailvex, int headvex, ArcBox* hlink, ArcBox* tlink, InfoType* info) { + ArcBox* p = (ArcBox*) malloc(sizeof(ArcBox)); + if(!p) { + exit(OVERFLOW); + } + + p->tailvex = tailvex; + p->headvex = headvex; + + p->hlink = hlink; + p->tlink = tlink; + + p->info = info; + + return p; +} + +/* + * æ’入边/å¼§ + * + * 如果当å‰å›¾/网是无å‘的,则æ’入一æ¡å¼§éœ€è¦å¢žåŠ ä¸¤ä¸ªé¡¶ç‚¹å…³ç³»ï¼Œä½†å¼§çš„æ•°é‡åªå¢žä¸€ã€‚ + * 对于图/网æ¥è¯´ï¼Œå¯ä»¥åœ¨å¯å˜å‚数中列出边/弧的附加信æ¯ã€‚ + * + * æ³¨ï¼šæ­¤å¤„æŽ¥æ”¶çš„å‚æ•°ä¸ŽMGraph有些ä¸ä¸€æ ·ï¼šç½‘的附加信æ¯ä¸­åŒ…å«äº†å„æ¡è¾¹/å¼§çš„æƒå€¼ã€‚ + */ +Status InsertArc(OLGraph* G, VertexType v, VertexType w, ...) { + int tail, head, k, count; + ArcBox* p; + ArcBox* pre; + ArcBox* r; + Boolean overlay = FALSE; // 是å¦ä¸ºè¦†ç›–添加 + InfoType* info = NULL; // è¾¹/å¼§çš„é™„åŠ ä¿¡æ¯ + va_list ap; + + tail = LocateVex(*G, v); // 获å–顶点v在顶点集中的ä½ç½® + if(tail == -1) { + return ERROR; // 指定的顶点ä¸å­˜åœ¨ + } + + head = LocateVex(*G, w); // 获å–顶点w在顶点集中的ä½ç½® + if(head == -1) { + return ERROR; // 指定的顶点ä¸å­˜åœ¨ + } + + // æ‹’ç»çޝ + if(tail == head) { + return ERROR; + } + + // 如果边/å¼§ä¸Šå­˜åœ¨é™„åŠ ä¿¡æ¯ + if(IncInfo) { + va_start(ap, w); // 在wåŽæŸ¥è¯¢é¦–个å¯å˜å‚æ•° + info = va_arg(ap, InfoType*); // 获å–é™„åŠ ä¿¡æ¯ + va_end(ap); + } + + /* 接下æ¥ï¼Œéœ€è¦æŸ¥æ‰¾åˆé€‚çš„æ’å…¥ä½ç½® */ + + for(count = 0; count < 2; count++) { + + // 在横å‘链表上查找åˆé€‚çš„æ’å…¥ä½ç½® + pre = NULL; + // 指å‘以tail为尾的首æ¡è¾¹/å¼§ + r = G->xlist[tail].firstout; + while(r != NULL && r->headvex < head) { + pre = r; + r = r->tlink; + } + + // é‡åˆ°äº†ç›¸åŒä½ç½®çš„结点 + if(r != NULL && r->headvex == head) { + r->info = info; // å¤ç”¨è¯¥ç»“点 + overlay = TRUE; // å‘生了覆盖 + } else { + p = newArcBoxPtr(tail, head, NULL, r, info); + + if(pre == NULL) { + G->xlist[tail].firstout = p; + } else { + pre->tlink = p; + } + } + + // 如果没有å‘生覆盖,说明æ’入了新结点,此时需è¦è€ƒè™‘其在纵å‘链表上的ä½ç½® + if(overlay == FALSE) { + // 在纵å‘链表上查找åˆé€‚çš„æ’å…¥ä½ç½® + pre = NULL; + // 指å‘以head为头的首æ¡è¾¹/å¼§ + r = G->xlist[head].firstin; + while(r != NULL && r->tailvex < tail) { + pre = r; + r = r->hlink; + } + + // é‡åˆ°äº†ç›¸åŒä½ç½®çš„结点 + if(r != NULL && r->tailvex == tail) { + // ä¸ä¼šæ‰§è¡Œåˆ°è¿™é‡Œï¼Œå› ä¸ºå¦‚æžœå‘生了覆盖,å‰é¢è¿›ä¸æ¥ + } else { + /* 至此,结点på·²ç»å­˜åœ¨äº† */ + + if(pre == NULL) { + p->hlink = G->xlist[head].firstin; + G->xlist[head].firstin = p; + } else { + p->hlink = pre->hlink; + pre->hlink = p; + } + } + } + + // 如果当å‰å›¾/网是无å‘的,需è¦è€ƒè™‘对称性 + if((G->kind == UDG || G->kind == UDN) && tail != head) { + // 颠倒iå’Œj + k = tail; + tail = head; + head = k; + } else { + break; // 如果是有å‘的,å¯ä»¥ç»“æŸäº† + } + } + + // 在éžè¦†ç›–的情形下,æ‰è€ƒè™‘æ›´æ–°è¾¹/å¼§çš„æ•°é‡ + if(!overlay) { + (*G).arcnum++; // ä¸è®ºæœ‰å‘æ— å‘,边/å¼§æ•°åªå¢žä¸€ + } + + return OK; +} + +/* + * 删除边/å¼§ + */ +Status DeleteArc(OLGraph* G, VertexType v, VertexType w) { + int tail, head, k, count; + ArcBox* pre, * r; + ArcBox* pre2, * r2; + + tail = LocateVex(*G, v); + if(tail == -1) { + return ERROR; // 指定的顶点ä¸å­˜åœ¨ + } + + head = LocateVex(*G, w); + if(head == -1) { + return ERROR; // 指定的顶点ä¸å­˜åœ¨ + } + + for(count = 0; count < 2; count++) { + pre = NULL; + // 在横å‘链表中找到待删除的边/å¼§ + r = G->xlist[tail].firstout; + while(r != NULL && r->headvex < head) { + pre = r; + r = r->tlink; + } + + // 找到了待删除的边/å¼§ + if(r != NULL && r->headvex == head) { + if(pre == NULL) { + G->xlist[tail].firstout = r->tlink; + } else { + pre->tlink = r->tlink; + } + + // 在纵å‘链表上查找rçš„ä½ç½® + pre2 = NULL; + r2 = G->xlist[head].firstin; // 至此,r2一定ä¸ä¸ºNULL + while(r2 != NULL && r2->tailvex != r->tailvex) { + pre2 = r2; + r2 = r2->hlink; + } + + // 至此,r2一定指å‘了待删除的弧 + if(pre2 == NULL) { + G->xlist[head].firstin = r2->hlink; + } else { + pre2->hlink = r2->hlink; + } + + free(r); + } else { + return ERROR; // 没找到 + } + + // 如果当å‰å›¾/网是无å‘的,需è¦è€ƒè™‘对称性 + if((G->kind == UDG || G->kind == UDN) && tail != head) { + // 颠倒tailå’Œhead + k = tail; + tail = head; + head = k; + } else { + break; // 如果是有å‘的,å¯ä»¥ç»“æŸäº† + } + } + + (*G).arcnum--; // ä¸è®ºæœ‰å‘æ— å‘,边/å¼§æ•°åªå‡ä¸€ + + return OK; +} + +/* + * 以图形化形å¼è¾“出当å‰ç»“æž„ + */ +void PrintGraph(OLGraph G) { + int i, head; + ArcBox* p; + + if(G.vexnum == 0) { + printf("空图,无需打å°ï¼\n"); + return; + } + + printf("当å‰å›¾/ç½‘åŒ…å« %2d 个顶点, %2d æ¡è¾¹/å¼§...\n", G.vexnum, G.arcnum); + + for(i = 0; i < G.vexnum; i++) { + printf("%c ===> ", G.xlist[i].data); + + head = 0; + p = G.xlist[i].firstout; + + while(p != NULL) { + if(head < p->headvex) { + if(IncInfo == 0) { + printf(" "); + + // 对于网,会从其附加信æ¯ä¸­èŽ·å–到æƒå€¼ + } else { + printf(" "); + } + } else { + if(IncInfo == 0) { + printf("<%c, %c>", G.xlist[p->tailvex].data, G.xlist[p->headvex].data); + + // 对于网,会从其附加信æ¯ä¸­èŽ·å–到æƒå€¼ + } else { + printf("<%c, %c, %2d>", G.xlist[p->tailvex].data, G.xlist[p->headvex].data, p->info->weight); + } + + p = p->tlink; + } + + head++; + + if(p != NULL) { + printf(" "); + } + } + + printf("\n"); + } +} diff --git a/CLion/ExerciseBook/07.17/OLGraph.h b/CLion/ExerciseBook/07.17/OLGraph.h new file mode 100644 index 0000000..4e7f9b6 --- /dev/null +++ b/CLion/ExerciseBook/07.17/OLGraph.h @@ -0,0 +1,178 @@ +/*==================== + * 图的å字链表存储表示 + * + * 包å«ç®—法: 7.3 + ====================*/ + +#ifndef OLGRAPH_H +#define OLGRAPH_H + +#include +#include // æä¾›memsetã€strcmp 原型 +#include // æä¾›å®va_listã€va_startã€va_argã€va_end +#include // æä¾›mallocã€reallocã€freeã€exit原型 +#include "Status.h" //**â–²01 绪论**// + +/* + * 注: + * + * 通常æ¥è®²ï¼Œæ— æƒå›¾è¢«ç®€ç§°ä¸ºã€å›¾ã€‘,有æƒå›¾è¢«ç®€ç§°ä¸ºã€ç½‘】。 + * æ— å‘图/网中的顶点关系被称为ã€è¾¹ã€‘,有å‘图/网中的顶点关系被称为ã€å¼§ã€‘,并区分弧头与弧尾。 + * 实际表述中,未必会严格éµå®ˆä»¥ä¸Šå‘½å。 + * + * 当å‰ç»“构适åˆå­˜å‚¨æœ‰å‘图。 + * + * ★ æ’入边/å¼§çš„ä¿¡æ¯æ—¶ï¼Œè¿™é‡Œçš„实现是按"å‡åº"æ’入的,这使得æ’入的弧是按"å‡åº"排列的。 + */ + + +/* å®å®šä¹‰ */ +#define MAX_VERTEX_NUM 26 // 最大顶点个数 + + +// 图的类型 +typedef enum { + DG, // 0-有å‘图 + DN, // 1-有å‘网(带æƒå€¼) + UDG, // 2-æ— å‘图 + UDN // 3-æ— å‘网(带æƒå€¼) +} GraphKind; + +// 顶点类型 +typedef char VertexType; + +// è¾¹/å¼§çš„ç›¸å…³é™„åŠ ä¿¡æ¯ +typedef struct { + /* + * 注: + * æ•™æä¸­ç»™å‡ºçš„结构åªè€ƒè™‘了无æƒå›¾ï¼Œè€Œæ²¡è€ƒè™‘有æƒå›¾(网)。 + * 这里为了把“网â€çš„æƒ…形也考虑进去,特在附加信æ¯ä¸­å¢žåŠ äº†"æƒé‡"属性。 + */ + int weight; +} InfoType; + +/* è¾¹/弧结点 */ +typedef struct ArcBox { + int tailvex; // 弧头顶点ä½ç½® + int headvex; // 弧尾顶点ä½ç½® + struct ArcBox* hlink; // 指å‘下一个拥有相åŒå¼§å¤´çš„å¼§ + struct ArcBox* tlink; // 指å‘下一个拥有相åŒå¼§å°¾çš„å¼§ + InfoType* info; // è¯¥å¼§çš„ç›¸å…³é™„åŠ ä¿¡æ¯ +} ArcBox; + +// æ¯ä¸ªæ¨ªå‘链表的头结点 +typedef struct VexNode { + VertexType data; // 顶点 + ArcBox* firstin; // 指å‘该顶点的第一æ¡å…¥å¼§ + ArcBox* firstout; // 指å‘该顶点的第一æ¡å‡ºå¼§ +} VexNode; + +/* 图的å字链表存储表示类型定义 */ +typedef struct { + VexNode xlist[MAX_VERTEX_NUM]; // 表头å‘é‡ + int vexnum, arcnum; // 顶点数和弧数 + GraphKind kind; // 图的类型标志 +} OLGraph; + + +// è¾¹/弧上是å¦å­˜åœ¨é™„åŠ ä¿¡æ¯ +extern Boolean IncInfo; + + +/* + * 创建 + * + *ã€å¤‡æ³¨ã€‘ + * + * æ•™æä¸­é»˜è®¤ä»ŽæŽ§åˆ¶å°è¯»å–æ•°æ®ã€‚ + * 这里为了方便测试,é¿å…æ¯æ¬¡è¿è¡Œéƒ½æ‰‹åŠ¨è¾“å…¥æ•°æ®ï¼Œ + * 因而å…许选择从预设的文件pathä¸­è¯»å–æµ‹è¯•æ•°æ®ã€‚ + * + * 如果需è¦ä»ŽæŽ§åˆ¶å°è¯»å–æ•°æ®ï¼Œåˆ™path为NULL,或path[kind]为""。 + * 如果需è¦ä»Žæ–‡ä»¶ä¸­è¯»å–æ•°æ®ï¼Œåˆ™éœ€è¦åœ¨path中填写文件åä¿¡æ¯ã€‚ + */ +Status CreateGraph(OLGraph* G, char* path[]); + +/* + * ████████ 算法7.3 ████████ + * + * 构造有å‘图 + * + * 注: + * æ•™æä¸­ä½¿ç”¨äº†å¤´æ’æ³•æ¥æ’入弧,这ç§åšæ³•çš„å”¯ä¸€ä¼˜ç‚¹æ˜¯æ’入方便, + * 但是在涉åŠåˆ°åˆ é™¤æˆ–查找时,效率较低; + * 而且,"å¤´æ’æ³•"ä¾èµ–输入的顺åºï¼Œå¦‚果输入的边/弧是乱åºçš„, + * 则最终构造出的图/网中的边/弧也是无åºçš„。 + * + * 为了克æœä»¥ä¸Šç¼ºç‚¹ï¼Œè¿™é‡Œæ”¹ç”¨"å‡åº"æ’入法,ä¿è¯æ’入的弧是"å‡åº"的。 + * ä½†åŒæ—¶ï¼Œè¿™æ ·åšä¼šä½¿"æ’å…¥"算法å˜å¾—è¾ƒä¸ºå¤æ‚。 + */ +static Status CreateDG(OLGraph* G); + +/* + * 构造有å‘网 + */ +static Status CreateDN(OLGraph* G); + +/* + * 构造无å‘图 + */ +static Status CreateUDG(OLGraph* G); + +/* + * 构造无å‘网 + */ +static Status CreateUDN(OLGraph* G); + +/* + * å½•å…¥å¼§çš„ç›¸å…³é™„åŠ ä¿¡æ¯ + */ +static void Input(OLGraph G, InfoType** info); + +/* + * 查找 + * + * 返回顶点u在图/网中的ä½ç½® + */ +int LocateVex(OLGraph G, VertexType u); + +/* + * æ’入顶点 + * + * 将指定的顶点v追加到顶点集中,未建立该顶点与其他顶点的关系 + */ +Status InsertVex(OLGraph* G, VertexType v); + +/* + * 删除顶点 + * + * 从顶点集中删除指定的顶点v,注æ„éœ€è¦æ›´æ–°ç›¸å…³çš„顶点关系 + */ +Status DeleteVex(OLGraph* G, VertexType v); + +/* + * 构造一个边/弧结点(ä»…é™å†…部使用) + */ +static ArcBox* newArcBoxPtr(int tailvex, int headvex, ArcBox* hlink, ArcBox* tlink, InfoType* info); + +/* + * æ’入边/å¼§ + * + * 如果当å‰å›¾/网是无å‘的,则æ’入一æ¡å¼§éœ€è¦å¢žåŠ ä¸¤ä¸ªé¡¶ç‚¹å…³ç³»ï¼Œä½†å¼§çš„æ•°é‡åªå¢žä¸€ã€‚ + * 对于图/网æ¥è¯´ï¼Œå¯ä»¥åœ¨å¯å˜å‚数中列出边/弧的附加信æ¯ã€‚ + * + * æ³¨ï¼šæ­¤å¤„æŽ¥æ”¶çš„å‚æ•°ä¸ŽMGraph有些ä¸ä¸€æ ·ï¼šç½‘的附加信æ¯ä¸­åŒ…å«äº†å„æ¡è¾¹/å¼§çš„æƒå€¼ã€‚ + */ +Status InsertArc(OLGraph* G, VertexType v, VertexType w, ...); + +/* + * 删除边/å¼§ + */ +Status DeleteArc(OLGraph* G, VertexType v, VertexType w); + +/* + * 以图形化形å¼è¾“出当å‰ç»“æž„ + */ +void PrintGraph(OLGraph G); + +#endif diff --git a/CLion/ExerciseBook/07.17/TestData_DG.txt b/CLion/ExerciseBook/07.17/TestData_DG.txt new file mode 100644 index 0000000..4768c22 --- /dev/null +++ b/CLion/ExerciseBook/07.17/TestData_DG.txt @@ -0,0 +1,6 @@ +图类型→0(有å‘图) +顶点数→6 +弧数→14 +弧是å¦å¸¦æœ‰å…¶ä»–ä¿¡æ¯â†’0 +顶点集→ã€A,X,B,C,D,E】 +弧的集åˆâ†’ã€A,B】ã€A,C】ã€A,D】ã€B,C】ã€B,D】ã€B,E】ã€C,B】ã€C,E】ã€C,X】ã€E,A】ã€E,D】ã€E,X】ã€X,A】ã€X,D】 \ No newline at end of file diff --git a/CLion/ExerciseBook/07.17/TestData_DN.txt b/CLion/ExerciseBook/07.17/TestData_DN.txt new file mode 100644 index 0000000..953c892 --- /dev/null +++ b/CLion/ExerciseBook/07.17/TestData_DN.txt @@ -0,0 +1,6 @@ +图类型→1(有å‘网) +顶点数→6 +弧数→14 +弧是å¦å¸¦æœ‰å…¶ä»–ä¿¡æ¯â†’1 +顶点集→ã€A,X,B,C,D,E】 +弧的集åˆâ†’ã€A,B,3】ã€A,C,8】ã€A,D,11】ã€B,C,7】ã€B,D,4】ã€B,E,1】ã€C,B,5】ã€C,E,17】ã€C,X,3】ã€E,A,6】ã€E,D,4】ã€E,X,2】ã€X,A,8】ã€X,D,10】 \ No newline at end of file diff --git a/CLion/ExerciseBook/07.17/TestData_UDG.txt b/CLion/ExerciseBook/07.17/TestData_UDG.txt new file mode 100644 index 0000000..65d0356 --- /dev/null +++ b/CLion/ExerciseBook/07.17/TestData_UDG.txt @@ -0,0 +1,6 @@ +图类型→2(无å‘图) +顶点数→6 +边数→13 +边是å¦å¸¦æœ‰å…¶ä»–ä¿¡æ¯â†’0 +顶点集→ã€A,X,B,C,D,E】 +边的集åˆâ†’ã€A,B】ã€A,C】ã€A,D】ã€B,C】ã€B,D】ã€B,E】ã€C,E】ã€C,X】ã€E,A】ã€E,D】ã€E,X】ã€X,A】ã€X,D】 \ No newline at end of file diff --git a/CLion/ExerciseBook/07.17/TestData_UDN.txt b/CLion/ExerciseBook/07.17/TestData_UDN.txt new file mode 100644 index 0000000..b5f1949 --- /dev/null +++ b/CLion/ExerciseBook/07.17/TestData_UDN.txt @@ -0,0 +1,6 @@ +图类型→3(无å‘网) +顶点数→6 +边数→13 +边是å¦å¸¦æœ‰å…¶ä»–ä¿¡æ¯â†’1 +顶点集→ã€A,X,B,C,D,E】 +边的集åˆâ†’ã€A,B,3】ã€A,C,8】ã€A,D,11】ã€B,C,7】ã€B,D,4】ã€B,E,1】ã€C,E,17】ã€C,X,3】ã€E,A,6】ã€E,D,4】ã€E,X,2】ã€X,A,8】ã€X,D,10】 \ No newline at end of file diff --git a/CLion/ExerciseBook/07.18-07.19/07.18-07.19.c b/CLion/ExerciseBook/07.18-07.19/07.18-07.19.c new file mode 100644 index 0000000..e3e2e66 --- /dev/null +++ b/CLion/ExerciseBook/07.18-07.19/07.18-07.19.c @@ -0,0 +1,181 @@ +#include +#include // æä¾›å®va_listã€va_startã€va_argã€va_end +#include "Status.h" //**â–²01 绪论**// +#include "AMLGraph.h" //**â–²07 图**// + +/* + * 创建图/表 + */ +Status CreateGraph_7_19(AMLGraph* G, char* path[]); + +/* + * æ’入顶点 + * + * 将指定的顶点v追加到顶点集中,未建立该顶点与其他顶点的关系 + */ +Status InsertVex_7_18(AMLGraph* G, VertexType v); + +/* + * 删除顶点 + * + * 从顶点集中删除指定的顶点v,注æ„éœ€è¦æ›´æ–°ç›¸å…³çš„顶点关系 + */ +Status DeleteVex_7_18(AMLGraph* G, VertexType v); + +/* + * æ’入边/å¼§ + * + * 如果当å‰å›¾/网是无å‘的,则æ’入一æ¡å¼§éœ€è¦å¢žåŠ ä¸¤ä¸ªé¡¶ç‚¹å…³ç³»ï¼Œä½†å¼§çš„æ•°é‡åªå¢žä¸€ã€‚ + * + * 对于图æ¥è¯´ï¼Œå¯ä»¥åœ¨å¯å˜å‚数中列出边/弧的附加信æ¯ï¼› + * 对于网æ¥è¯´ï¼Œå¯ä»¥åœ¨å¯å˜å‚æ•°ä¸­ä¾æ¬¡åˆ—出边/å¼§çš„æƒå€¼ä»¥åŠé™„加信æ¯ã€‚ + */ +Status InsertArc_7_18(AMLGraph* G, VertexType v, VertexType w, ...); + +/* + * 删除边/å¼§ + * + * æ­¤åˆ é™¤åªæ˜¯æ›´æ–°è¾¹/弧的连通关系 + */ +Status DeleteArc_7_18(AMLGraph* G, VertexType v, VertexType w); + + +int main(int argc, char* argv[]) { + AMLGraph G; + + printf("████████ 创建并输出图/网...\n"); + { + char* path[4]; + + path[0] = ""; + path[1] = ""; + path[2] = "TestData_UDG.txt"; + path[3] = "TestData_UDN.txt"; + + CreateGraph_7_19(&G, path); + PrintGraph(G); + printf("\n"); + } + + printf("████████ 删除顶点...\n"); + { + VertexType v = 'X'; + + printf("删除顶点 '%c' åŽçš„图为:\n", v); + DeleteVex_7_18(&G, v); + PrintGraph(G); + printf("\n"); + } + + printf("████████ æ’入顶点...\n"); + { + VertexType v = 'Y'; + + printf("æ’入顶点 '%c' åŽçš„图为:\n", v); + InsertVex_7_18(&G, v); + PrintGraph(G); + printf("\n"); + } + + printf("████████ æ’入边/å¼§...\n"); + { + // 注:是é‡å¤çš„è¾¹ + VertexType v[10] = {'B', 'C', 'E', 'Y', 'Y', 'Y', 'D', 'D', 'E', 'E'}; + VertexType w[10] = {'Y', 'Y', 'Y', 'A', 'B', 'D', 'C', 'A', 'B', 'D'}; + InfoType info[10] = {{8}, {5}, {1}, {11}, {2}, {6}, {3}, {7}, {2}, {9}}; + int k; + + // 图 + if(G.kind == DG || G.kind == UDG) { + for(k = 0; k < 10; k++) { + printf("æ’入无æƒå€¼çš„边:<%c, %c>...\n", v[k], w[k]); + InsertArc_7_18(&G, v[k], w[k]); + } + + // 网 + } else if(G.kind == DN || G.kind == UDN) { + for(k = 0; k < 10; k++) { + printf("æ’入带æƒå€¼çš„边:<%c, %c, %d>...\n", v[k], w[k], info[k].weight); + InsertArc_7_18(&G, v[k], w[k], &info[k]); + } + } else { + return ERROR; + } + + PrintGraph(G); + printf("\n"); + } + + printf("████████ 删除边/å¼§...\n"); + { + VertexType v[3] = {'D', 'E', 'F'}; + VertexType w[3] = {'A', 'B', 'B'}; + int k; + + for(k = 0; k < 3; k++) { + printf("删除边:<%c, %c>...\n", v[k], w[k]); + DeleteArc_7_18(&G, v[k], w[k]); + } + PrintGraph(G); + printf("\n"); + } + + return 0; +} + + +/* + * 创建图/表 + */ +Status CreateGraph_7_19(AMLGraph* G, char* path[]) { + return CreateGraph(G, path); +} + +/* + * æ’入顶点 + * + * 将指定的顶点v追加到顶点集中,未建立该顶点与其他顶点的关系 + */ +Status InsertVex_7_18(AMLGraph* G, VertexType v) { + return InsertVex(G, v); +} + +/* + * 删除顶点 + * + * 从顶点集中删除指定的顶点v,注æ„éœ€è¦æ›´æ–°ç›¸å…³çš„顶点关系 + */ +Status DeleteVex_7_18(AMLGraph* G, VertexType v) { + return DeleteVex(G, v); +} + +/* + * æ’入边/å¼§ + * + * 如果当å‰å›¾/网是无å‘的,则æ’入一æ¡å¼§éœ€è¦å¢žåŠ ä¸¤ä¸ªé¡¶ç‚¹å…³ç³»ï¼Œä½†å¼§çš„æ•°é‡åªå¢žä¸€ã€‚ + * + * 对于图æ¥è¯´ï¼Œå¯ä»¥åœ¨å¯å˜å‚数中列出边/弧的附加信æ¯ï¼› + * 对于网æ¥è¯´ï¼Œå¯ä»¥åœ¨å¯å˜å‚æ•°ä¸­ä¾æ¬¡åˆ—出边/å¼§çš„æƒå€¼ä»¥åŠé™„加信æ¯ã€‚ + */ +Status InsertArc_7_18(AMLGraph* G, VertexType v, VertexType w, ...) { + va_list ap; + InfoType* info = NULL; // è¾¹/å¼§çš„é™„åŠ ä¿¡æ¯ + + // 如果边/å¼§ä¸Šå­˜åœ¨é™„åŠ ä¿¡æ¯ + if(IncInfo) { + va_start(ap, w); // 在wåŽæŸ¥è¯¢é¦–个å¯å˜å‚æ•° + info = va_arg(ap, InfoType*); // 获å–é™„åŠ ä¿¡æ¯ + va_end(ap); + } + + return InsertArc(G, v, w, info); +} + +/* + * 删除边/å¼§ + * + * æ­¤åˆ é™¤åªæ˜¯æ›´æ–°è¾¹/弧的连通关系 + */ +Status DeleteArc_7_18(AMLGraph* G, VertexType v, VertexType w) { + return DeleteArc(G, v, w); +} diff --git a/CLion/ExerciseBook/07.18-07.19/AMLGraph.c b/CLion/ExerciseBook/07.18-07.19/AMLGraph.c new file mode 100644 index 0000000..4bfacd4 --- /dev/null +++ b/CLion/ExerciseBook/07.18-07.19/AMLGraph.c @@ -0,0 +1,715 @@ +/*===================== + * 图的邻接多é‡è¡¨å­˜å‚¨è¡¨ç¤º + ======================*/ + +#include "AMLGraph.h" + +// 录入数æ®çš„æºæ–‡ä»¶ï¼›fp为null时,说明需è¦ä»ŽæŽ§åˆ¶å°å½•å…¥ +static FILE* fp = NULL; + +/* + * IncInfo指示该图的边上是å¦å­˜åœ¨é™„加信æ¯ã€‚ + * 如果其值ä¸ä¸º0,则表示无附加信æ¯ï¼Œå¦åˆ™ï¼Œè¡¨ç¤ºå­˜åœ¨é™„加信æ¯ã€‚ + */ +Boolean IncInfo = FALSE; + +// 访问标志数组,记录访问过的顶点 +static Boolean visited[MAX_VERTEX_NUM]; + +// 函数å˜é‡ +static Status (* VisitFunc)(VertexType e); + + +/* + * 创建 + * + *ã€å¤‡æ³¨ã€‘ + * + * æ•™æä¸­é»˜è®¤ä»ŽæŽ§åˆ¶å°è¯»å–æ•°æ®ã€‚ + * 这里为了方便测试,é¿å…æ¯æ¬¡è¿è¡Œéƒ½æ‰‹åŠ¨è¾“å…¥æ•°æ®ï¼Œ + * 因而å…许选择从预设的文件pathä¸­è¯»å–æµ‹è¯•æ•°æ®ã€‚ + * + * 如果需è¦ä»ŽæŽ§åˆ¶å°è¯»å–æ•°æ®ï¼Œåˆ™path为NULL,或path[kind]为""。 + * 如果需è¦ä»Žæ–‡ä»¶ä¸­è¯»å–æ•°æ®ï¼Œåˆ™éœ€è¦åœ¨path中填写文件åä¿¡æ¯ã€‚ + */ +Status CreateGraph(AMLGraph* G, char* path[]) { + int readFromConsole; // 是å¦ä»ŽæŽ§åˆ¶å°è¯»å–æ•°æ® + int kind; + Status flag; + + printf("请输入图的类型(2-æ— å‘图 │ 3-æ— å‘网):"); + scanf("%d", &kind); + + // 类型ä¸åˆè§„(åªæŽ¥å—æ— å‘的图/网) + if(kind < 2 || kind > 3) { + return ERROR; + } + + // 如果没有文件路径信æ¯ï¼Œåˆ™ä»ŽæŽ§åˆ¶å°è¯»å–输入 + readFromConsole = (path == NULL) || strcmp(path[kind], "") == 0; + + // 需è¦ä»Žæ–‡ä»¶è¯»å– + if(readFromConsole) { + (*G).kind = kind; // 记录图/网的类型 + } else { + // æ‰“å¼€æ–‡ä»¶ï¼Œå‡†å¤‡è¯»å–æµ‹è¯•æ•°æ® + fp = fopen(path[kind], "r"); + if(fp == NULL) { + return ERROR; + } + + // 录入图的类型 + ReadData(fp, "%d", &((*G).kind)); + } + + // éšæœºåˆ›å»ºæ— å‘图或无å‘ç½‘çš„ä¸€ç§ + switch((*G).kind) { + case UDG: + flag = CreateUDG(G); + break; + case UDN: + flag = CreateUDN(G); + break; + default: + flag = ERROR; + break; + } + + if(fp != NULL) { + fclose(fp); + fp = NULL; + } + + return flag; +} + +/* + * 构造无å‘图 + */ +static Status CreateUDG(AMLGraph* G) { + int i, k; + int vexnum, arcnum; + VertexType v1, v2; + InfoType* info = NULL; + + (*G).vexnum = (*G).edgenum = 0; + + if(fp == NULL) { + printf("请输入无å‘图的顶点数:"); + scanf("%d", &vexnum); + printf("请输入无å‘图的边数:"); + scanf("%d", &arcnum); + printf("该无å‘图的边上是å¦åŒ…å«å…¶ä»–附加信æ¯(0-ä¸åŒ…å«â”‚1-包å«):"); + scanf("%d", &IncInfo); + + // 录入顶点集 + printf("请录入 %d 个顶点,ä¸åŒé¡¶ç‚¹ä¹‹é—´ç”¨ç©ºæ ¼éš”开:", vexnum); + for(i = 0; i < vexnum; i++) { + // 跳过空白,寻找下一个"å¯è¯»"ç¬¦å· + skipBlank(stdin); + scanf("%c", &((*G).adjmulist[i].data)); + (*G).adjmulist[i].firstedge = NULL; + (*G).vexnum++; + } + } else { + ReadData(fp, "%d", &vexnum); // 录入顶点数 + ReadData(fp, "%d", &arcnum); // 录入边数 + ReadData(fp, "%d", &IncInfo);// 判断边上是å¦åŒ…å«é™„åŠ ä¿¡æ¯ + + // 录入顶点集 + for(i = 0; i < vexnum; i++) { + // 跳过空白,寻找下一个"å¯è¯»"ç¬¦å· + skipBlank(fp); + ReadData(fp, "%c", &((*G).adjmulist[i].data)); + (*G).adjmulist[i].firstedge = NULL; + (*G).vexnum++; + } + } + + // 仅在控制å°å½•å…¥ä¿¡æ¯æ—¶è¾“出此æç¤º + if(fp == NULL && arcnum != 0) { + printf("请为无å‘图便¬¡å½•å…¥ %d æ¡è¾¹çš„ä¿¡æ¯ï¼Œé¡¶ç‚¹ä¹‹é—´ç”¨ç©ºæ ¼éš”开:\n", arcnum); + } + + // å½•å…¥è¾¹çš„ä¿¡æ¯ + for(k = 0; k < arcnum; k++) { + if(fp == NULL) { + printf("第 %2d æ¡è¾¹ï¼š", k + 1); + skipBlank(stdin); // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + scanf("%c", &v1); + skipBlank(stdin); // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + scanf("%c", &v2); + } else { + // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + skipBlank(fp); + ReadData(fp, "%c%c", &v1, &v2); + } + + // 如果需è¦å½•å…¥è¾¹çš„å…¶ä»–é™„åŠ ä¿¡æ¯ + if(IncInfo) { + // 最åŽå½•å…¥é™„åŠ ä¿¡æ¯ + Input(*G, &info); + } + + // æ’入边 + InsertArc(G, v1, v2, info); + } + + // ä»Žæ–‡ä»¶ä¸­è¯»å–æ•°æ®æ—¶ï¼Œæœ€åŽå…¶å®žåº”当判断一下是å¦è¯»åˆ°äº†è¶³å¤Ÿçš„ä¿¡æ¯ + return OK; +} + +/* + * 构造无å‘网 + */ +static Status CreateUDN(AMLGraph* G) { + int i, k; + int vexnum, arcnum; + VertexType v1, v2; + InfoType* info = NULL; + + (*G).vexnum = (*G).edgenum = 0; + + if(fp == NULL) { + printf("请输入无å‘网的顶点数:"); + scanf("%d", &vexnum); + printf("请输入无å‘网的边数:"); + scanf("%d", &arcnum); + printf("该无å‘网的边上必须包å«å…¶ä»–附加信æ¯ï¼Œå› ä¸ºæ­¤å¤„çš„æƒå€¼éœ€è¦å­˜å‚¨åˆ°é™„加信æ¯ä¸­...\n"); + IncInfo = 1; + + // 录入顶点集 + printf("请录入 %d 个顶点,ä¸åŒé¡¶ç‚¹ä¹‹é—´ç”¨ç©ºæ ¼éš”开:", vexnum); + for(i = 0; i < vexnum; i++) { + // 跳过空白,寻找下一个"å¯è¯»"ç¬¦å· + skipBlank(stdin); + scanf("%c", &((*G).adjmulist[i].data)); + (*G).adjmulist[i].firstedge = NULL; + (*G).vexnum++; + } + } else { + ReadData(fp, "%d", &vexnum); // 录入顶点数 + ReadData(fp, "%d", &arcnum); // 录入边数 + ReadData(fp, "%d", &IncInfo);// 判断边上是å¦åŒ…å«é™„åŠ ä¿¡æ¯ + IncInfo = 1; // 强制将æƒå€¼å½•入到附加信æ¯ä¸­ + + // 录入顶点集 + for(i = 0; i < vexnum; i++) { + // 跳过空白,寻找下一个"å¯è¯»"ç¬¦å· + skipBlank(fp); + ReadData(fp, "%c", &((*G).adjmulist[i].data)); + (*G).adjmulist[i].firstedge = NULL; + (*G).vexnum++; + } + } + + // 仅在控制å°å½•å…¥ä¿¡æ¯æ—¶è¾“出此æç¤º + if(fp == NULL && arcnum != 0) { + printf("请为无å‘ç½‘ä¾æ¬¡å½•å…¥ %d æ¡è¾¹(带æƒå€¼)的信æ¯ï¼Œé¡¶ç‚¹åŠæƒå€¼ä¹‹é—´ç”¨ç©ºæ ¼éš”开:\n", arcnum); + } + + // å½•å…¥è¾¹çš„ä¿¡æ¯ + for(k = 0; k < arcnum; k++) { + if(fp == NULL) { + printf("第 %2d æ¡è¾¹åŠå…¶æƒå€¼ï¼š", k + 1); + skipBlank(stdin); // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + scanf("%c", &v1); + skipBlank(stdin); // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + scanf("%c", &v2); + } else { + // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + skipBlank(fp); + ReadData(fp, "%c%c", &v1, &v2); + } + + // 如果需è¦å½•å…¥è¾¹çš„å…¶ä»–é™„åŠ ä¿¡æ¯ + if(IncInfo) { + // 最åŽå½•入附加信æ¯(此处需è¦å½•入网的æƒå€¼) + Input(*G, &info); + } + + // æ’入边 + InsertArc(G, v1, v2, info); + } + + // ä»Žæ–‡ä»¶ä¸­è¯»å–æ•°æ®æ—¶ï¼Œæœ€åŽå…¶å®žåº”当判断一下是å¦è¯»åˆ°äº†è¶³å¤Ÿçš„ä¿¡æ¯ + return OK; +} + +/* + * å½•å…¥è¾¹çš„ç›¸å…³é™„åŠ ä¿¡æ¯ + */ +static void Input(AMLGraph G, InfoType** info) { + int weight; + + // 在"网"的情形下需è¦å½•å…¥æƒå€¼ä¿¡æ¯ + if(G.kind == UDN) { + *info = (InfoType*) malloc(sizeof(InfoType)); + + if(fp == NULL) { + scanf("%d", &weight); + } else { + ReadData(fp, "%d", &weight); + } + + (*info)->weight = weight; + } +} + +/* + * 查找 + * + * 返回顶点u在图/网中的ä½ç½® + */ +int LocateVex(AMLGraph G, VertexType u) { + int i; + + for(i = 0; i < G.vexnum; i++) { + if(G.adjmulist[i].data == u) { + return i; + } + } + + return -1; +} + +/* + * æ’入顶点 + * + * 将指定的顶点v追加到顶点集中,未建立该顶点与其他顶点的关系 + */ +Status InsertVex(AMLGraph* G, VertexType v) { + int k; + + // 顶点数过多 + if((*G).vexnum == MAX_VERTEX_NUM) { + return ERROR; + } + + // 首先需è¦åˆ¤æ–­è¯¥é¡¶ç‚¹æ˜¯å¦å­˜åœ¨ + k = LocateVex(*G, v); + if(k >= 0) { + return ERROR; // 指定的顶点存在时,无需é‡å¤æ·»åŠ  + } + + G->adjmulist[(*G).vexnum].data = v; + G->adjmulist[(*G).vexnum].firstedge = NULL; + + (*G).vexnum++; + + return OK; +} + +/* + * 删除顶点 + * + * 从顶点集中删除指定的顶点v,注æ„éœ€è¦æ›´æ–°ç›¸å…³çš„顶点关系 + */ +Status DeleteVex(AMLGraph* G, VertexType v) { + int i, k, other; + EBox* p; + EBox* pre, * r; + + // 首先需è¦åˆ¤æ–­è¯¥é¡¶ç‚¹æ˜¯å¦å­˜åœ¨ + k = LocateVex(*G, v); + if(k == -1) { + return ERROR; // 指定的顶点ä¸å­˜åœ¨ + } + + while((p = G->adjmulist[k].firstedge) != NULL) { + if(p->ivex == k) { + G->adjmulist[k].firstedge = p->ilink; + other = p->jvex; + } else if(p->jvex == k) { + G->adjmulist[k].firstedge = p->jlink; + other = p->ivex; + } else { + // 没有其他å¯èƒ½ + } + + pre = NULL; + r = G->adjmulist[other].firstedge; + + // 查找边,肯定能找到 + while(r != NULL) { + if(r->ivex == other && r->jvex < k) { + pre = r; + r = r->ilink; + } else if(r->jvex == other && r->ivex < k) { + pre = r; + r = r->jlink; + } else { + break; + } + } + + if(r != NULL && r->ivex == other && r->jvex == k) { + if(pre == NULL) { + G->adjmulist[other].firstedge = r->ilink; + } else { + if(pre->ivex == other) { + pre->ilink = r->ilink; + } else if(pre->jvex == other) { + pre->jlink = r->ilink; + } else { + // 没有其他å¯èƒ½ + } + } + } else if(r != NULL && r->jvex == other && r->ivex == k) { + if(pre == NULL) { + G->adjmulist[other].firstedge = r->jlink; + } else { + if(pre->ivex == other) { + pre->ilink = r->jlink; + } else if(pre->jvex == other) { + pre->jlink = r->jlink; + } else { + // 没有其他å¯èƒ½ + } + } + } else { + // ä¸ä¼šè‡³æ­¤ï¼Œå› ä¸ºè‚¯å®šèƒ½æ‰¾åˆ° + } + + free(p); + + (*G).edgenum--; // 边数å‡ä¸€ + } + + // 下标超过k的顶点,需è¦é€’å‡å…¶ä¸‹æ ‡ + for(i = k + 1; i < (*G).vexnum; i++) { + r = G->adjmulist[i].firstedge; + + while(r!=NULL){ + if(r->ivex==i) { + r->ivex--; + r = r->ilink; + } else if(r->jvex==i) { + r->jvex--; + r = r->jlink; + } else { + // ä¸ä¼šè‡³æ­¤ + } + } + } + + // 顶点集å‰ç§» + for(i = k + 1; i < (*G).vexnum; i++) { + G->adjmulist[i - 1] = G->adjmulist[i]; + } + + // é¡¶ç‚¹æ•°é€’å‡ + (*G).vexnum--; + + return OK; +} + +/* + * 构造一个边结点(ä»…é™å†…部使用) + */ +static EBox* newEBoxPtr(VisitIf mark, int ivex, int jvex, EBox* ilink, EBox* jlink, InfoType* info) { + EBox* p = (EBox*) malloc(sizeof(EBox)); + if(!p) { + exit(OVERFLOW); + } + + p->mark = mark; + + p->ivex = ivex; + p->jvex = jvex; + + p->ilink = ilink; + p->jlink = jlink; + + p->info = info; + + return p; +} + +/* + * æ’入边 + * + * 当å‰å›¾/网是无å‘的,且由于特殊的结构,使得æ’入一æ¡è¾¹æ—¶åªéœ€è¦å¢žåŠ ä¸€å¯¹é¡¶ç‚¹å…³ç³»ï¼Œè¾¹çš„æ•°é‡ä¾ç„¶å¢žä¸€ã€‚ + * 对于图/网æ¥è¯´ï¼Œå¯ä»¥åœ¨å¯å˜å‚数中列出边的附加信æ¯ã€‚ + * + * æ³¨ï¼šæ­¤å¤„æŽ¥æ”¶çš„å‚æ•°ä¸ŽMGraph有些ä¸ä¸€æ ·ï¼šç½‘的附加信æ¯ä¸­åŒ…å«äº†å„æ¡è¾¹çš„æƒå€¼ã€‚ + */ +Status InsertArc(AMLGraph* G, VertexType v, VertexType w, ...) { + int tail, head, k; + EBox* p; + EBox* pre; + EBox* r; + Boolean overlay = FALSE; // 是å¦ä¸ºè¦†ç›–添加 + InfoType* info = NULL; // è¾¹çš„é™„åŠ ä¿¡æ¯ + va_list ap; + + tail = LocateVex(*G, v); // 获å–顶点v在顶点集中的ä½ç½® + if(tail == -1) { + return ERROR; // 指定的顶点ä¸å­˜åœ¨ + } + + head = LocateVex(*G, w); // 获å–顶点w在顶点集中的ä½ç½® + if(head == -1) { + return ERROR; // 指定的顶点ä¸å­˜åœ¨ + } + + // æ‹’ç»çޝ + if(tail == head) { + return ERROR; + } + + // å¦‚æžœè¾¹ä¸Šå­˜åœ¨é™„åŠ ä¿¡æ¯ + if(IncInfo) { + va_start(ap, w); // 在wåŽæŸ¥è¯¢é¦–个å¯å˜å‚æ•° + info = va_arg(ap, InfoType*); // 获å–é™„åŠ ä¿¡æ¯ + va_end(ap); + } + + /* 接下æ¥ï¼Œéœ€è¦æŸ¥æ‰¾åˆé€‚çš„æ’å…¥ä½ç½® */ + + pre = NULL; + r = G->adjmulist[tail].firstedge; + + while(r != NULL) { + if(r->ivex == tail && r->jvex < head) { + pre = r; + r = r->ilink; + } else if(r->jvex == tail && r->ivex < head) { + pre = r; + r = r->jlink; + } else { + break; + } + } + + if(r != NULL && r->ivex == tail && r->jvex == head) { + r->info = info; // å¤ç”¨è¯¥ç»“点 + overlay = TRUE; // å‘生了覆盖 + } else if(r != NULL && r->jvex == tail && r->ivex == head) { + r->info = info; // å¤ç”¨è¯¥ç»“点 + overlay = TRUE; // å‘生了覆盖 + } else { + p = newEBoxPtr(unvisit, tail, head, r, NULL, info); + + if(pre == NULL) { + G->adjmulist[tail].firstedge = p; + } else { + if(pre->ivex == tail) { + pre->ilink = p; + } else if(pre->jvex == tail) { + pre->jlink = p; + } else { + // 没有其他å¯èƒ½ + } + } + } + + if(!overlay) { + pre = NULL; + r = G->adjmulist[head].firstedge; + + while(r != NULL) { + if(r->ivex == head && r->jvex < tail) { + pre = r; + r = r->ilink; + } else if(r->jvex == head && r->ivex < tail) { + pre = r; + r = r->jlink; + } else { + break; + } + } + + p->jlink = r; + + if(pre == NULL) { + G->adjmulist[head].firstedge = p; + } else { + if(pre->ivex == head) { + pre->ilink = p; + } else if(pre->jvex == head) { + pre->jlink = p; + } else { + // 没有其他å¯èƒ½ + } + } + } + + (*G).edgenum++; // 边数增一 + + return OK; +} + +/* + * 删除边 + */ +Status DeleteArc(AMLGraph* G, VertexType v, VertexType w) { + int tail, head; + EBox* r; + EBox* pre; + + tail = LocateVex(*G, v); + if(tail == -1) { + return ERROR; // 指定的顶点ä¸å­˜åœ¨ + } + + head = LocateVex(*G, w); + if(head == -1) { + return ERROR; // 指定的顶点ä¸å­˜åœ¨ + } + + pre = NULL; + r = G->adjmulist[tail].firstedge; + + while(r != NULL) { + if(r->ivex == tail && r->jvex < head) { + pre = r; + r = r->ilink; + } else if(r->jvex == tail && r->ivex < head) { + pre = r; + r = r->jlink; + } else { + break; + } + } + + if(r != NULL && r->ivex == tail && r->jvex == head) { + if(pre == NULL) { + G->adjmulist[tail].firstedge = r->ilink; + } else { + if(pre->ivex == tail) { + pre->ilink = r->ilink; + } else if(pre->jvex == tail) { + pre->jlink = r->ilink; + } else { + // 没有其他å¯èƒ½ + } + } + } else if(r != NULL && r->jvex == tail && r->ivex == head) { + if(pre == NULL) { + G->adjmulist[tail].firstedge = r->jlink; + } else { + if(pre->ivex == tail) { + pre->ilink = r->jlink; + } else if(pre->jvex == tail) { + pre->jlink = r->jlink; + } else { + // 没有其他å¯èƒ½ + } + } + } else { + return ERROR; // 未找到 + } + + + pre = NULL; + r = G->adjmulist[head].firstedge; + + while(r != NULL) { + if(r->ivex == head && r->jvex < tail) { + pre = r; + r = r->ilink; + } else if(r->jvex == head && r->ivex < tail) { + pre = r; + r = r->jlink; + } else { + break; + } + } + + if(r != NULL && r->ivex == head && r->jvex == tail) { + if(pre == NULL) { + G->adjmulist[head].firstedge = r->ilink; + } else { + if(pre->ivex == head) { + pre->ilink = r->ilink; + } else if(pre->jvex == head) { + pre->jlink = r->ilink; + } else { + // 没有其他å¯èƒ½ + } + } + } else if(r != NULL && r->jvex == head && r->ivex == tail) { + if(pre == NULL) { + G->adjmulist[head].firstedge = r->jlink; + } else { + if(pre->ivex == head) { + pre->ilink = r->jlink; + } else if(pre->jvex == head) { + pre->jlink = r->jlink; + } else { + // 没有其他å¯èƒ½ + } + } + } else { + // ä¸ä¼šè‡³æ­¤ï¼Œå› ä¸ºå‰é¢æ‰¾åˆ°äº†ï¼Œæ­¤å¤„肯定也能找到 + } + + free(r); // 释放内存 + + (*G).edgenum--; // 边数å‡ä¸€ + + return OK; +} + +/* + * 以图形化形å¼è¾“出当å‰ç»“æž„ + */ +void PrintGraph(AMLGraph G) { + int i, cur, pos; + EBox* p; + + if(G.vexnum == 0) { + printf("空图,无需打å°ï¼\n"); + return; + } + + printf("当å‰å›¾/ç½‘åŒ…å« %2d 个顶点, %2d æ¡è¾¹...\n", G.vexnum, G.edgenum); + + for(i = 0; i < G.vexnum; i++) { + printf("%c ===> ", G.adjmulist[i].data); + + cur = 0; + p = G.adjmulist[i].firstedge; + + while(p != NULL) { + if(p->ivex == i) { + pos = p->jvex; + } else { + pos = p->ivex; + } + + if(cur < pos) { + if(IncInfo == 0) { + printf(" "); + + // 对于网,会从其附加信æ¯ä¸­èŽ·å–到æƒå€¼ + } else { + printf(" "); + } + } else { + if(IncInfo == 0) { + printf("%c", G.adjmulist[pos].data); + + // 对于网,会从其附加信æ¯ä¸­èŽ·å–到æƒå€¼ + } else { + printf("%c[%2d]", G.adjmulist[pos].data, p->info->weight); + } + + if(p->ivex == i) { + p = p->ilink; + } else { + p = p->jlink; + } + } + + cur++; + + if(p != NULL) { + printf(" "); + } + } + + printf("\n"); + } +} diff --git a/CLion/ExerciseBook/07.18-07.19/AMLGraph.h b/CLion/ExerciseBook/07.18-07.19/AMLGraph.h new file mode 100644 index 0000000..d1e53d9 --- /dev/null +++ b/CLion/ExerciseBook/07.18-07.19/AMLGraph.h @@ -0,0 +1,162 @@ +/*===================== + * 图的邻接多é‡è¡¨å­˜å‚¨è¡¨ç¤º + ======================*/ + +#ifndef AMLGRAPH_H +#define AMLGRAPH_H + +#include +#include // æä¾›memsetã€strcmp 原型 +#include // æä¾›å®va_listã€va_startã€va_argã€va_end +#include // æä¾›mallocã€reallocã€freeã€exit原型 +#include "Status.h" //**â–²01 绪论**// + +/* + * 注: + * + * 通常æ¥è®²ï¼Œæ— æƒå›¾è¢«ç®€ç§°ä¸ºã€å›¾ã€‘,有æƒå›¾è¢«ç®€ç§°ä¸ºã€ç½‘】。 + * æ— å‘图/网中的顶点关系被称为ã€è¾¹ã€‘,有å‘图/网中的顶点关系被称为ã€å¼§ã€‘,并区分弧头与弧尾。 + * 实际表述中,未必会严格éµå®ˆä»¥ä¸Šå‘½å。 + * + * 当å‰ç»“构适åˆå­˜å‚¨æ— å‘图/网。 + * + * ★ æ’入边/å¼§çš„ä¿¡æ¯æ—¶ï¼Œè¿™é‡Œçš„实现是按"å‡åº"æ’入的,这使得æ’入的弧是按"å‡åº"排列的。 + */ + + +/* å®å®šä¹‰ */ +#define MAX_VERTEX_NUM 26 // 最大顶点个数 + + +// 图的类型 +// 图的类型 +typedef enum { + DG, // 0-有å‘å›¾ï¼›æ­¤å¤„ä¸æ”¯æŒ + DN, // 1-有å‘网(带æƒå€¼)ï¼›æ­¤å¤„ä¸æ”¯æŒ + UDG, // 2-æ— å‘图 + UDN // 3-æ— å‘网(带æƒå€¼) +} GraphKind; + + +/* æ— å‘图(邻接多é‡è¡¨ï¼‰ç±»åž‹å®šä¹‰ */ +typedef enum { + unvisit, visit +} VisitIf; + +// 顶点类型 +typedef char VertexType; + +// è¾¹çš„ç›¸å…³é™„åŠ ä¿¡æ¯ +typedef struct { + /* + * 注: + * æ•™æä¸­ç»™å‡ºçš„结构åªè€ƒè™‘了无æƒå›¾ï¼Œè€Œæ²¡è€ƒè™‘有æƒå›¾(网)。 + * 这里为了把“网â€çš„æƒ…形也考虑进去,特在附加信æ¯ä¸­å¢žåŠ äº†"æƒé‡"属性。 + */ + int weight; +} InfoType; + +/* 边结点 */ +typedef struct EBox { + VisitIf mark; // 访问标记 + int ivex; // 该边ä¾é™„的两个顶点的ä½ç½® + int jvex; // 该边ä¾é™„的两个顶点的ä½ç½® + struct EBox* ilink; // 分别指å‘ä¾é™„这两个顶点的下一æ¡è¾¹ + struct EBox* jlink; // 分别指å‘ä¾é™„这两个顶点的下一æ¡è¾¹ + InfoType* info; +} EBox; + +// æ¯ä¸ªé“¾è¡¨çš„头结点 +typedef struct VexBox { + VertexType data; // é¡¶ç‚¹ä¿¡æ¯ + EBox* firstedge; // 指å‘第一æ¡ä¾é™„该顶点的边的指针 +} VexBox; + +/* 图的邻接多é‡è¡¨å­˜å‚¨è¡¨ç¤ºç±»åž‹å®šä¹‰ */ +typedef struct { + VexBox adjmulist[MAX_VERTEX_NUM]; // 表头å‘é‡ + int vexnum, edgenum; // 图/网的顶点数和边数 + GraphKind kind; // 图的类型标志 +} AMLGraph; + + +// è¾¹/弧上是å¦å­˜åœ¨é™„åŠ ä¿¡æ¯ +extern Boolean IncInfo; + + +/* + * 创建 + * + *ã€å¤‡æ³¨ã€‘ + * + * æ•™æä¸­é»˜è®¤ä»ŽæŽ§åˆ¶å°è¯»å–æ•°æ®ã€‚ + * 这里为了方便测试,é¿å…æ¯æ¬¡è¿è¡Œéƒ½æ‰‹åŠ¨è¾“å…¥æ•°æ®ï¼Œ + * 因而å…许选择从预设的文件pathä¸­è¯»å–æµ‹è¯•æ•°æ®ã€‚ + * + * 如果需è¦ä»ŽæŽ§åˆ¶å°è¯»å–æ•°æ®ï¼Œåˆ™path为NULL,或path[kind]为""。 + * 如果需è¦ä»Žæ–‡ä»¶ä¸­è¯»å–æ•°æ®ï¼Œåˆ™éœ€è¦åœ¨path中填写文件åä¿¡æ¯ã€‚ + */ +Status CreateGraph(AMLGraph* G, char* path[]); + +/* + * 构造无å‘图 + */ +static Status CreateUDG(AMLGraph* G); + +/* + * 构造无å‘网 + */ +static Status CreateUDN(AMLGraph* G); + +/* + * å½•å…¥è¾¹çš„ç›¸å…³é™„åŠ ä¿¡æ¯ + */ +static void Input(AMLGraph G, InfoType** info); + +/* + * 查找 + * + * 返回顶点u在图/网中的ä½ç½® + */ +int LocateVex(AMLGraph G, VertexType u); + +/* + * æ’入顶点 + * + * 将指定的顶点v追加到顶点集中,未建立该顶点与其他顶点的关系 + */ +Status InsertVex(AMLGraph* G, VertexType v); + +/* + * 删除顶点 + * + * 从顶点集中删除指定的顶点v,注æ„éœ€è¦æ›´æ–°ç›¸å…³çš„顶点关系 + */ +Status DeleteVex(AMLGraph* G, VertexType v); + +/* + * 构造一个边结点(ä»…é™å†…部使用) + */ +static EBox* newEBoxPtr(VisitIf mark, int ivex, int jvex, EBox* ilink, EBox* jlink, InfoType* info); + +/* + * æ’入边 + * + * 当å‰å›¾/网是无å‘的,且由于特殊的结构,使得æ’入一æ¡è¾¹æ—¶åªéœ€è¦å¢žåŠ ä¸€å¯¹é¡¶ç‚¹å…³ç³»ï¼Œè¾¹çš„æ•°é‡ä¾ç„¶å¢žä¸€ã€‚ + * 对于图/网æ¥è¯´ï¼Œå¯ä»¥åœ¨å¯å˜å‚数中列出边的附加信æ¯ã€‚ + * + * æ³¨ï¼šæ­¤å¤„æŽ¥æ”¶çš„å‚æ•°ä¸ŽMGraph有些ä¸ä¸€æ ·ï¼šç½‘的附加信æ¯ä¸­åŒ…å«äº†å„æ¡è¾¹çš„æƒå€¼ã€‚ + */ +Status InsertArc(AMLGraph* G, VertexType v, VertexType w, ...); + +/* + * 删除边 + */ +Status DeleteArc(AMLGraph* G, VertexType v, VertexType w); + +/* + * 以图形化形å¼è¾“出当å‰ç»“æž„ + */ +void PrintGraph(AMLGraph G); + +#endif diff --git a/CLion/ExerciseBook/07.18-07.19/CMakeLists.txt b/CLion/ExerciseBook/07.18-07.19/CMakeLists.txt new file mode 100644 index 0000000..9376fca --- /dev/null +++ b/CLion/ExerciseBook/07.18-07.19/CMakeLists.txt @@ -0,0 +1,12 @@ +# 包å«å…¬å…±åº“ +include_directories(${CMAKE_SOURCE_DIR}/Status) + +# 生æˆå¯æ‰§è¡Œæ–‡ä»¶ +add_executable(07.18-07.19 AMLGraph.h AMLGraph.c 07.18-07.19.c) +# 链接公共库 +target_link_libraries(07.18-07.19 Scanf_lib) + +# è®°å½•è¦æ‹·è´åˆ°*.exeç›®å½•ä¸‹çš„èµ„æºæ–‡ä»¶ +file(GLOB TestData TestData*.txt) +# å°†èµ„æºæ–‡ä»¶æ‹·è´åˆ°*.exe目录下,ä¸ç„¶æ— æ³•加载 +file(COPY ${TestData} DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) diff --git a/CLion/ExerciseBook/07.18-07.19/TestData_UDG.txt b/CLion/ExerciseBook/07.18-07.19/TestData_UDG.txt new file mode 100644 index 0000000..65d0356 --- /dev/null +++ b/CLion/ExerciseBook/07.18-07.19/TestData_UDG.txt @@ -0,0 +1,6 @@ +图类型→2(无å‘图) +顶点数→6 +边数→13 +边是å¦å¸¦æœ‰å…¶ä»–ä¿¡æ¯â†’0 +顶点集→ã€A,X,B,C,D,E】 +边的集åˆâ†’ã€A,B】ã€A,C】ã€A,D】ã€B,C】ã€B,D】ã€B,E】ã€C,E】ã€C,X】ã€E,A】ã€E,D】ã€E,X】ã€X,A】ã€X,D】 \ No newline at end of file diff --git a/CLion/ExerciseBook/07.18-07.19/TestData_UDN.txt b/CLion/ExerciseBook/07.18-07.19/TestData_UDN.txt new file mode 100644 index 0000000..b5f1949 --- /dev/null +++ b/CLion/ExerciseBook/07.18-07.19/TestData_UDN.txt @@ -0,0 +1,6 @@ +图类型→3(无å‘网) +顶点数→6 +边数→13 +边是å¦å¸¦æœ‰å…¶ä»–ä¿¡æ¯â†’1 +顶点集→ã€A,X,B,C,D,E】 +边的集åˆâ†’ã€A,B,3】ã€A,C,8】ã€A,D,11】ã€B,C,7】ã€B,D,4】ã€B,E,1】ã€C,E,17】ã€C,X,3】ã€E,A,6】ã€E,D,4】ã€E,X,2】ã€X,A,8】ã€X,D,10】 \ No newline at end of file diff --git a/CLion/ExerciseBook/07.20/07.20.c b/CLion/ExerciseBook/07.20/07.20.c new file mode 100644 index 0000000..4b3e0c0 --- /dev/null +++ b/CLion/ExerciseBook/07.20/07.20.c @@ -0,0 +1,78 @@ +#include +#include "Status.h" //**â–²01 绪论**// +#include "MGraph.h" //**â–²07 图**// + +/* + * 判断图G是å¦å¯ä¼ é€’ + */ +Status Algo_7_20(MGraph G); + + +int main(int argc, char* argv[]) { + MGraph G; + + printf("████████ 创建并输出图...\n"); + { + char* path[4]; + + path[0] = "TestData_DG.txt"; + path[1] = "TestData_DN.txt"; + path[2] = "TestData_UDG.txt"; + path[3] = "TestData_UDN.txt"; + + CreateGraph(&G, path); + PrintGraph(G); + printf("\n"); + } + + Algo_7_20(G) ? printf("图Gå¯ä¼ é€’ï¼\n") : printf("图Gä¸å¯ä¼ é€’ï¼\n"); + printf("\n"); + + return 0; +} + + +/* + * 判断图G是å¦å¯ä¼ é€’ + */ +Status Algo_7_20(MGraph G) { + Status trans; + int x, y, z; + int flag; // ä¸è¿žé€šçš„æ ‡è®° + + // 对于图,ä¸è¿žé€šæ ‡è®°æ˜¯0 + if(G.kind == DG || G.kind == UDG) { + flag = 0; + + // 对于网,ä¸è¿žé€šæ ‡è®°æ˜¯INFINITE + } else if(G.kind == DN || G.kind == UDN) { + flag = INFINITE; + } else { + return ERROR; + } + + // 预设为å¯ä¼ é€’ + trans = TRUE; + + // 对于V中æ¯ä¸ªx + for(x = 0; x < G.vexnum; x++) { + // N(x)中æ¯ä¸ªy + for(y = 0; y < G.vexnum; y++) { + if(G.arcs[x][y].adj != flag) { + // N(y)中ä¸ç­‰äºŽxçš„æ¯ä¸ªz + for(z = 0; z < G.vexnum; z++) { + if(G.arcs[y][z].adj != flag && z != x) { + // zä¸åœ¨N(x)中 + if(G.arcs[x][z].adj == flag) { + // ä¸å¯ä¼ é€’ + trans = FALSE; + return trans; + } + } + } + } + } + } + + return trans; +} diff --git a/CLion/ExerciseBook/07.20/07.20.png b/CLion/ExerciseBook/07.20/07.20.png new file mode 100644 index 0000000000000000000000000000000000000000..29a4418760cc5fd0d0e3904258af3a0fd49246d9 GIT binary patch literal 16161 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 literal 0 HcmV?d00001 diff --git a/CLion/ExerciseBook/07.20/CMakeLists.txt b/CLion/ExerciseBook/07.20/CMakeLists.txt new file mode 100644 index 0000000..131bd2b --- /dev/null +++ b/CLion/ExerciseBook/07.20/CMakeLists.txt @@ -0,0 +1,12 @@ +# 包å«å…¬å…±åº“ +include_directories(${CMAKE_SOURCE_DIR}/Status) + +# 生æˆå¯æ‰§è¡Œæ–‡ä»¶ +add_executable(07.20 MGraph.h MGraph.c 07.20.c) +# 链接公共库 +target_link_libraries(07.20 Scanf_lib) + +# è®°å½•è¦æ‹·è´åˆ°*.exeç›®å½•ä¸‹çš„èµ„æºæ–‡ä»¶ +file(GLOB TestData TestData*.txt) +# å°†èµ„æºæ–‡ä»¶æ‹·è´åˆ°*.exe目录下,ä¸ç„¶æ— æ³•加载 +file(COPY ${TestData} DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) diff --git a/CLion/ExerciseBook/07.20/MGraph.c b/CLion/ExerciseBook/07.20/MGraph.c new file mode 100644 index 0000000..6572aa6 --- /dev/null +++ b/CLion/ExerciseBook/07.20/MGraph.c @@ -0,0 +1,482 @@ +/*================================= + * 图的数组(邻接矩阵)存储表示 + * + * 包å«ç®—法: 7.1ã€7.2ã€7.4ã€7.5ã€7.6 + ==================================*/ + +#include "MGraph.h" //**â–²07 图**// + +// 录入数æ®çš„æºæ–‡ä»¶ï¼›fp为null时,说明需è¦ä»ŽæŽ§åˆ¶å°å½•å…¥ +static FILE* fp = NULL; + +/* + * IncInfo指示该图/网的边/弧上是å¦å­˜åœ¨é™„加信æ¯ã€‚ + * 如果其值ä¸ä¸º0,则表示无附加信æ¯ï¼Œå¦åˆ™ï¼Œè¡¨ç¤ºå­˜åœ¨é™„加信æ¯ã€‚ + */ +Boolean IncInfo = FALSE; + +// 访问标志数组,记录访问过的顶点 +static Boolean visited[MAX_VERTEX_NUM]; + +// 函数å˜é‡ +static Status (* VisitFunc)(VertexType e); + + +/* + * ████████ 算法7.1 ████████ + * + * 创建图/表 + * + *ã€å¤‡æ³¨ã€‘ + * + * æ•™æä¸­é»˜è®¤ä»ŽæŽ§åˆ¶å°è¯»å–æ•°æ®ã€‚ + * 这里为了方便测试,é¿å…æ¯æ¬¡è¿è¡Œéƒ½æ‰‹åŠ¨è¾“å…¥æ•°æ®ï¼Œ + * 因而å…许选择从预设的文件pathä¸­è¯»å–æµ‹è¯•æ•°æ®ã€‚ + * + * 如果需è¦ä»ŽæŽ§åˆ¶å°è¯»å–æ•°æ®ï¼Œåˆ™path为NULL,或path[kind]为""。 + * 如果需è¦ä»Žæ–‡ä»¶ä¸­è¯»å–æ•°æ®ï¼Œåˆ™éœ€è¦åœ¨path中填写文件åä¿¡æ¯ã€‚ + */ +Status CreateGraph(MGraph* G, char* path[]) { + int readFromConsole; // 是å¦ä»ŽæŽ§åˆ¶å°è¯»å–æ•°æ® + int kind; + Status flag; + + printf("请输入图的类型(0-有å‘图 │ 1-有å‘网 │ 2-æ— å‘图 │ 3-æ— å‘网):"); + scanf("%d", &kind); + + // 类型ä¸åˆè§„ + if(kind < 0 || kind > 3) { + return ERROR; + } + + // 如果没有文件路径信æ¯ï¼Œåˆ™ä»ŽæŽ§åˆ¶å°è¯»å–输入 + readFromConsole = (path == NULL) || strcmp(path[kind], "") == 0; + + // 需è¦ä»Žæ–‡ä»¶è¯»å– + if(readFromConsole) { + (*G).kind = kind; // 记录图/网的类型 + } else { + // æ‰“å¼€æ–‡ä»¶ï¼Œå‡†å¤‡è¯»å–æµ‹è¯•æ•°æ® + fp = fopen(path[kind], "r"); + if(fp == NULL) { + return ERROR; + } + + // 录入图的类型 + ReadData(fp, "%d", &((*G).kind)); + } + + // éšæœºåˆ›å»ºæœ‰å‘图/网或无å‘图/ç½‘çš„ä¸€ç§ + switch((*G).kind) { + case DG: + flag = CreateDG(G); + break; + case DN: + flag = CreateDN(G); + break; + case UDG: + flag = CreateUDG(G); + break; + case UDN: + flag = CreateUDN(G); + break; + default: + flag = ERROR; + break; + } + + if(fp != NULL) { + fclose(fp); + fp = NULL; + } + + return flag; +} + +/* + * 构造有å‘图 + */ +static Status CreateDG(MGraph* G) { + int i, j, k; + ArcCell arcs = {0, NULL}; // 有å‘å›¾æ¯æ¡è¾¹çš„åˆå§‹å€¼ + VertexType v1, v2; + + if(fp == NULL) { + printf("请输入有å‘图的顶点数:"); + scanf("%d", &((*G).vexnum)); + printf("请输入有å‘图的弧数:"); + scanf("%d", &((*G).arcnum)); + printf("该有å‘图的弧上是å¦åŒ…å«å…¶ä»–附加信æ¯(0-ä¸åŒ…å«â”‚1-包å«):"); + scanf("%d", &IncInfo); + + // 录入顶点集 + printf("请录入 %d 个顶点,ä¸åŒé¡¶ç‚¹ä¹‹é—´ç”¨ç©ºæ ¼éš”开:", (*G).vexnum); + for(i = 0; i < (*G).vexnum; i++) { + // 跳过空白,寻找下一个"å¯è¯»"ç¬¦å· + skipBlank(stdin); + scanf("%c", &((*G).vexs[i])); + } + } else { + ReadData(fp, "%d", &((*G).vexnum)); // 录入顶点数 + ReadData(fp, "%d", &((*G).arcnum)); // 录入弧数 + ReadData(fp, "%d", &IncInfo); // 判断弧上是å¦åŒ…å«é™„åŠ ä¿¡æ¯ + + // 录入顶点集 + for(i = 0; i < (*G).vexnum; i++) { + // 跳过空白,寻找下一个"å¯è¯»"ç¬¦å· + skipBlank(fp); + ReadData(fp, "%c", &((*G).vexs[i])); + } + } + + // åˆå§‹åŒ–有å‘图的邻接矩阵 + for(i = 0; i < (*G).vexnum; i++) { + for(j = 0; j < (*G).vexnum; j++) { + (*G).arcs[i][j] = arcs; + } + } + + // 仅在控制å°å½•å…¥ä¿¡æ¯æ—¶è¾“出此æç¤º + if(fp == NULL && (*G).arcnum != 0) { + printf("请为有å‘图便¬¡å½•å…¥ %d æ¡å¼§çš„ä¿¡æ¯ï¼Œé¡¶ç‚¹ä¹‹é—´ç”¨ç©ºæ ¼éš”开:\n", (*G).arcnum); + } + + // å½•å…¥å¼§çš„ä¿¡æ¯ + for(k = 0; k < (*G).arcnum; k++) { + if(fp == NULL) { + printf("第 %2d æ¡å¼§ï¼š", k + 1); + skipBlank(stdin); // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + scanf("%c", &v1); + skipBlank(stdin); // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + scanf("%c", &v2); + } else { + // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + skipBlank(fp); + ReadData(fp, "%c%c", &v1, &v2); + } + + i = LocateVex(*G, v1); // 获å–顶点v1在顶点集中的ä½ç½® + j = LocateVex(*G, v2); // 获å–顶点v2在顶点集中的ä½ç½® + + // 将指定的顶点关系设置为1,指示这两个顶点是直接连接的(注:这里没有验è¯ä¸‹æ ‡æ˜¯å¦è¶Šç•Œ) + (*G).arcs[i][j].adj = 1; + + // 如果需è¦å½•å…¥å¼§çš„å…¶ä»–é™„åŠ ä¿¡æ¯ + if(IncInfo) { + // 最åŽå½•å…¥é™„åŠ ä¿¡æ¯ + Input(*G, &((*G).arcs[i][j].info)); + } + } + + // ä»Žæ–‡ä»¶ä¸­è¯»å–æ•°æ®æ—¶ï¼Œæœ€åŽå…¶å®žåº”当判断一下是å¦è¯»åˆ°äº†è¶³å¤Ÿçš„ä¿¡æ¯ + return OK; +} + +/* + * 构造有å‘网 + */ +static Status CreateDN(MGraph* G) { + int i, j, k; + ArcCell arcs = {INFINITE, NULL}; // 有å‘ç½‘æ¯æ¡å¼§çš„åˆå§‹å€¼ + VertexType v1, v2; + VRType w; + + if(fp == NULL) { + printf("请输入有å‘网的顶点数:"); + scanf("%d", &((*G).vexnum)); + printf("请输入有å‘网的弧数:"); + scanf("%d", &((*G).arcnum)); + printf("该有å‘网的弧上是å¦åŒ…å«å…¶ä»–附加信æ¯(0-ä¸åŒ…å«â”‚1-包å«):"); + scanf("%d", &IncInfo); + + // 录入顶点集 + printf("请录入 %d 个顶点,ä¸åŒé¡¶ç‚¹ä¹‹é—´ç”¨ç©ºæ ¼éš”开:", (*G).vexnum); + for(i = 0; i < (*G).vexnum; i++) { + // 跳过空白,寻找下一个"å¯è¯»"ç¬¦å· + skipBlank(stdin); + scanf("%c", &((*G).vexs[i])); + } + } else { + ReadData(fp, "%d", &((*G).vexnum)); // 录入顶点数 + ReadData(fp, "%d", &((*G).arcnum)); // 录入弧数 + ReadData(fp, "%d", &IncInfo); // 判断弧上是å¦åŒ…å«é™„åŠ ä¿¡æ¯ + + // 录入顶点集 + for(i = 0; i < (*G).vexnum; i++) { + // 跳过空白,寻找下一个"å¯è¯»"ç¬¦å· + skipBlank(fp); + ReadData(fp, "%c", &((*G).vexs[i])); + } + } + + // åˆå§‹åŒ–有å‘网的邻接矩阵 + for(i = 0; i < (*G).vexnum; i++) { + for(j = 0; j < (*G).vexnum; j++) { + (*G).arcs[i][j] = arcs; + } + } + + // 仅在控制å°å½•å…¥ä¿¡æ¯æ—¶è¾“出此æç¤º + if(fp == NULL && (*G).arcnum != 0) { + printf("请为有å‘ç½‘ä¾æ¬¡å½•å…¥ %d æ¡å¼§(带æƒå€¼)的信æ¯ï¼Œé¡¶ç‚¹åŠæƒå€¼ä¹‹é—´ç”¨ç©ºæ ¼éš”开:\n", (*G).arcnum); + } + + // å½•å…¥å¼§çš„ä¿¡æ¯ + for(k = 0; k < (*G).arcnum; k++) { + if(fp == NULL) { + printf("第 %2d æ¡å¼§åŠå…¶æƒå€¼ï¼š", k + 1); + skipBlank(stdin); // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + scanf("%c", &v1); + skipBlank(stdin); // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + scanf("%c", &v2); + scanf("%d", &w); + } else { + // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + skipBlank(fp); + ReadData(fp, "%c%c%d", &v1, &v2, &w); + } + + i = LocateVex(*G, v1); // 获å–顶点v1在顶点集中的ä½ç½® + j = LocateVex(*G, v2); // 获å–顶点v2在顶点集中的ä½ç½® + + // 在指定的顶点关系上记录æƒå€¼(注:这里没有验è¯ä¸‹æ ‡æ˜¯å¦è¶Šç•Œ) + (*G).arcs[i][j].adj = w; + + // 如果需è¦å½•å…¥å¼§çš„å…¶ä»–é™„åŠ ä¿¡æ¯ + if(IncInfo) { + // 最åŽå½•å…¥é™„åŠ ä¿¡æ¯ + Input(*G, &((*G).arcs[i][j].info)); + } + } + + // ä»Žæ–‡ä»¶ä¸­è¯»å–æ•°æ®æ—¶ï¼Œæœ€åŽå…¶å®žåº”当判断一下是å¦è¯»åˆ°äº†è¶³å¤Ÿçš„ä¿¡æ¯ + return OK; +} + +/* + * 构造无å‘图 + */ +static Status CreateUDG(MGraph* G) { + int i, j, k; + ArcCell arcs = {0, NULL}; // æ— å‘å›¾æ¯æ¡è¾¹çš„åˆå§‹å€¼ + VertexType v1, v2; + + if(fp == NULL) { + printf("请输入无å‘图的顶点数:"); + scanf("%d", &((*G).vexnum)); + printf("请输入无å‘图的边数:"); + scanf("%d", &((*G).arcnum)); + printf("该无å‘图的边上是å¦åŒ…å«å…¶ä»–附加信æ¯(0-ä¸åŒ…å«â”‚1-包å«):"); + scanf("%d", &IncInfo); + + // 录入顶点集 + printf("请录入 %d 个顶点,ä¸åŒé¡¶ç‚¹ä¹‹é—´ç”¨ç©ºæ ¼éš”开:", (*G).vexnum); + for(i = 0; i < (*G).vexnum; i++) { + // 跳过空白,寻找下一个"å¯è¯»"ç¬¦å· + skipBlank(stdin); + scanf("%c", &((*G).vexs[i])); + } + } else { + ReadData(fp, "%d", &((*G).vexnum)); // 录入顶点数 + ReadData(fp, "%d", &((*G).arcnum)); // 录入边数 + ReadData(fp, "%d", &IncInfo); // 判断边上是å¦åŒ…å«é™„åŠ ä¿¡æ¯ + + // 录入顶点集 + for(i = 0; i < (*G).vexnum; i++) { + // 跳过空白,寻找下一个"å¯è¯»"ç¬¦å· + skipBlank(fp); + ReadData(fp, "%c", &((*G).vexs[i])); + } + } + + // åˆå§‹åŒ–æ— å‘图的邻接矩阵 + for(i = 0; i < (*G).vexnum; i++) { + for(j = 0; j < (*G).vexnum; j++) { + (*G).arcs[i][j] = arcs; + } + } + + // 仅在控制å°å½•å…¥ä¿¡æ¯æ—¶è¾“出此æç¤º + if(fp == NULL && (*G).arcnum != 0) { + printf("请为无å‘图便¬¡å½•å…¥ %d æ¡è¾¹çš„ä¿¡æ¯ï¼Œé¡¶ç‚¹ä¹‹é—´ç”¨ç©ºæ ¼éš”开:\n", (*G).arcnum); + } + + // å½•å…¥è¾¹çš„ä¿¡æ¯ + for(k = 0; k < (*G).arcnum; k++) { + if(fp == NULL) { + printf("第 %2d æ¡è¾¹ï¼š", k + 1); + skipBlank(stdin); // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + scanf("%c", &v1); + skipBlank(stdin); // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + scanf("%c", &v2); + } else { + // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + skipBlank(fp); + ReadData(fp, "%c%c", &v1, &v2); + } + + i = LocateVex(*G, v1); // 获å–顶点v1在顶点集中的ä½ç½® + j = LocateVex(*G, v2); // 获å–顶点v2在顶点集中的ä½ç½® + + // 将指定的顶点关系设置为1,指示这两个顶点是直接连接的(注:这里没有验è¯ä¸‹æ ‡æ˜¯å¦è¶Šç•Œ) + (*G).arcs[i][j].adj = 1; + + // 如果需è¦å½•å…¥è¾¹çš„å…¶ä»–é™„åŠ ä¿¡æ¯ + if(IncInfo) { + // 最åŽå½•å…¥é™„åŠ ä¿¡æ¯ + Input(*G, &((*G).arcs[i][j].info)); + } + + // 填充对称点 + (*G).arcs[j][i] = (*G).arcs[i][j]; + } + + // ä»Žæ–‡ä»¶ä¸­è¯»å–æ•°æ®æ—¶ï¼Œæœ€åŽå…¶å®žåº”当判断一下是å¦è¯»åˆ°äº†è¶³å¤Ÿçš„ä¿¡æ¯ + return OK; +} + +/* + * ████████ 算法7.2 ████████ + * + * 构造无å‘网 + */ +static Status CreateUDN(MGraph* G) { + int i, j, k; + ArcCell arcs = {INFINITE, NULL}; // æ— å‘ç½‘æ¯æ¡è¾¹çš„åˆå§‹å€¼ + VertexType v1, v2; + VRType w; + + if(fp == NULL) { + printf("请输入无å‘网的顶点数:"); + scanf("%d", &((*G).vexnum)); + printf("请输入无å‘网的边数:"); + scanf("%d", &((*G).arcnum)); + printf("该无å‘网的边上是å¦åŒ…å«å…¶ä»–附加信æ¯(0-ä¸åŒ…å«â”‚1-包å«):"); + scanf("%d", &IncInfo); + + // 录入顶点集 + printf("请录入 %d 个顶点,ä¸åŒé¡¶ç‚¹ä¹‹é—´ç”¨ç©ºæ ¼éš”开:", (*G).vexnum); + for(i = 0; i < (*G).vexnum; i++) { + // 跳过空白,寻找下一个"å¯è¯»"ç¬¦å· + skipBlank(stdin); + scanf("%c", &((*G).vexs[i])); + } + } else { + ReadData(fp, "%d", &((*G).vexnum)); // 录入顶点数 + ReadData(fp, "%d", &((*G).arcnum)); // 录入边数 + ReadData(fp, "%d", &IncInfo); // 判断边上是å¦åŒ…å«é™„åŠ ä¿¡æ¯ + + // 录入顶点集 + for(i = 0; i < (*G).vexnum; i++) { + // 跳过空白,寻找下一个"å¯è¯»"ç¬¦å· + skipBlank(fp); + ReadData(fp, "%c", &((*G).vexs[i])); + } + } + + // åˆå§‹åŒ–æ— å‘网的邻接矩阵 + for(i = 0; i < (*G).vexnum; i++) { + for(j = 0; j < (*G).vexnum; j++) { + (*G).arcs[i][j] = arcs; + } + } + + // 仅在控制å°å½•å…¥ä¿¡æ¯æ—¶è¾“出此æç¤º + if(fp == NULL && (*G).arcnum != 0) { + printf("请为无å‘ç½‘ä¾æ¬¡å½•å…¥ %d æ¡è¾¹(带æƒå€¼)的信æ¯ï¼Œé¡¶ç‚¹åŠæƒå€¼ä¹‹é—´ç”¨ç©ºæ ¼éš”开:\n", (*G).arcnum); + } + + // å½•å…¥è¾¹çš„ä¿¡æ¯ + for(k = 0; k < (*G).arcnum; k++) { + if(fp == NULL) { + printf("第 %2d æ¡è¾¹åŠå…¶æƒå€¼ï¼š", k + 1); + skipBlank(stdin); // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + scanf("%c", &v1); + skipBlank(stdin); // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + scanf("%c", &v2); + scanf("%d", &w); + } else { + // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + skipBlank(fp); + ReadData(fp, "%c%c%d", &v1, &v2, &w); + } + + i = LocateVex(*G, v1); // 获å–顶点v1在顶点集中的ä½ç½® + j = LocateVex(*G, v2); // 获å–顶点v2在顶点集中的ä½ç½® + + // 在指定的顶点关系上记录æƒå€¼(注:这里没有验è¯ä¸‹æ ‡æ˜¯å¦è¶Šç•Œ) + (*G).arcs[i][j].adj = w; + + // 如果需è¦å½•å…¥è¾¹çš„å…¶ä»–é™„åŠ ä¿¡æ¯ + if(IncInfo) { + // 最åŽå½•å…¥é™„åŠ ä¿¡æ¯ + Input(*G, &((*G).arcs[i][j].info)); + } + + // 填充对称点 + (*G).arcs[j][i] = (*G).arcs[i][j]; + } + + // ä»Žæ–‡ä»¶ä¸­è¯»å–æ•°æ®æ—¶ï¼Œæœ€åŽå…¶å®žåº”当判断一下是å¦è¯»åˆ°äº†è¶³å¤Ÿçš„ä¿¡æ¯ + return OK; +} + +/* + * 录入边/å¼§çš„ç›¸å…³é™„åŠ ä¿¡æ¯ + */ +static void Input(MGraph G, InfoType** info) { + //录入边/弧的信æ¯ï¼Œæœ¬æµ‹è¯•涉åŠåˆ°çš„è¾¹/å¼§é»˜è®¤æ— å…¶ä»–é™„åŠ ä¿¡æ¯ +} + +/* + * 查找 + * + * 返回顶点u在图/网中的ä½ç½® + */ +int LocateVex(MGraph G, VertexType u) { + int i; + + for(i = 0; i < G.vexnum; i++) { + if(G.vexs[i] == u) { + return i; + } + } + + return -1; +} + +/* + * 以图形化形å¼è¾“出当å‰ç»“æž„ + * + * 注:在图/网中,使用"-"æ¥è¡¨ç¤ºä¸¤é¡¶ç‚¹ä¸ç›´æŽ¥è¿žé€š + */ +void PrintGraph(MGraph G) { + int i, j; + + if(G.vexnum == 0) { + printf("空图,无需打å°ï¼\n"); + return; + } + + printf("当å‰å›¾/ç½‘åŒ…å« %2d 个顶点, %2d æ¡è¾¹/å¼§...\n", G.vexnum, G.arcnum); + + printf(" "); + for(i = 0; i < G.vexnum; i++) { + printf(" %c", G.vexs[i]); + } + printf("\n"); + + for(i = 0; i < G.vexnum; i++) { + printf("%c ", G.vexs[i]); + + for(j = 0; j < G.vexnum; j++) { + if(((G.kind == DG || G.kind == UDG) && G.arcs[i][j].adj == 0) || ((G.kind == DN || G.kind == UDN) && G.arcs[i][j].adj == INFINITE)) { + printf(" -"); + } else { + printf("%3d", G.arcs[i][j].adj); + } + } + + printf("\n"); + } +} diff --git a/CLion/ExerciseBook/07.20/MGraph.h b/CLion/ExerciseBook/07.20/MGraph.h new file mode 100644 index 0000000..7f469e1 --- /dev/null +++ b/CLion/ExerciseBook/07.20/MGraph.h @@ -0,0 +1,129 @@ +/*================================= + * 图的数组(邻接矩阵)存储表示 + * + * 包å«ç®—法: 7.1ã€7.2ã€7.4ã€7.5ã€7.6 + ==================================*/ + +#ifndef MGRAPH_H +#define MGRAPH_H + +#include +#include // æä¾›å®INT_MAX +#include // æä¾›memsetã€strcmp 原型 +#include // æä¾›å®va_listã€va_startã€va_argã€va_end +#include "Status.h" //**â–²01 绪论**// + +/* + * 注: + * + * 通常æ¥è®²ï¼Œæ— æƒå›¾è¢«ç®€ç§°ä¸ºã€å›¾ã€‘,有æƒå›¾è¢«ç®€ç§°ä¸ºã€ç½‘】。 + * æ— å‘图/网中的顶点关系被称为ã€è¾¹ã€‘,有å‘图/网中的顶点关系被称为ã€å¼§ã€‘,并区分弧头与弧尾。 + * 实际表述中,未必会严格éµå®ˆä»¥ä¸Šå‘½å。 + */ + +/* å®å®šä¹‰ */ +#define INFINITE INT_MAX // 最大值,用æ¥è¡¨ç¤ºç½‘中的两个顶点ä¸ç›´æŽ¥è¿žæŽ¥ +#define MAX_VERTEX_NUM 26 // 最大顶点个数 + + +// 图的类型 +typedef enum { + DG, // 0-有å‘图 + DN, // 1-有å‘网(带æƒå€¼) + UDG, // 2-æ— å‘图 + UDN // 3-æ— å‘网(带æƒå€¼) +} GraphKind; + +// 顶点类型 +typedef char VertexType; + +/* + * 顶点关系类型 + * + * 在无æƒå›¾ä¸­ï¼Œè¯¥å€¼é€šå¸¸ä¸º0或1,表示两顶点是å¦ç›´æŽ¥è¿žé€šï¼› + * 在有æƒå›¾ä¸­ï¼Œè¯¥å€¼é€šå¸¸ä¸ºæƒå€¼ã€‚ + */ +typedef int VRType; + +// è¾¹çš„ç›¸å…³é™„åŠ ä¿¡æ¯ +typedef struct { + // 如果有的è¯ï¼ŒåŽç»­ä¼šæ·»åŠ ç›¸åº”çš„å±žæ€§ +} InfoType; + +// è¾¹çš„ç±»åž‹ï¼Œæ¯æ¡è¾¹ä¸Šå¯èƒ½æœ‰é™„加信æ¯info +typedef struct ArcCell { + VRType adj; // 顶点关系,在有æƒå›¾è·Ÿæ— æƒå›¾ä¸­çš„å«ä¹‰ä¸åŒ + InfoType* info; // 边的附加信æ¯ï¼Œé€šå¸¸å¿½ç•¥ +} ArcCell; + +/* 图/网的数组(邻接矩阵)存储表示类型定义 */ +typedef struct { + VertexType vexs[MAX_VERTEX_NUM]; // 顶点å‘é‡ + ArcCell arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; // 邻接矩阵 + int vexnum, arcnum; // 图/网的顶点数和弧数 + GraphKind kind; // 图的类型标志 +} MGraph; + + +// è¾¹/弧上是å¦å­˜åœ¨é™„åŠ ä¿¡æ¯ +extern Boolean IncInfo; + + +/* + * ████████ 算法7.1 ████████ + * + * 创建 + * + *ã€å¤‡æ³¨ã€‘ + * + * æ•™æä¸­é»˜è®¤ä»ŽæŽ§åˆ¶å°è¯»å–æ•°æ®ã€‚ + * 这里为了方便测试,é¿å…æ¯æ¬¡è¿è¡Œéƒ½æ‰‹åŠ¨è¾“å…¥æ•°æ®ï¼Œ + * 因而å…许选择从预设的文件pathä¸­è¯»å–æµ‹è¯•æ•°æ®ã€‚ + * + * 如果需è¦ä»ŽæŽ§åˆ¶å°è¯»å–æ•°æ®ï¼Œåˆ™path为NULL,或path[kind]为""。 + * 如果需è¦ä»Žæ–‡ä»¶ä¸­è¯»å–æ•°æ®ï¼Œåˆ™éœ€è¦åœ¨path中填写文件åä¿¡æ¯ã€‚ + */ +Status CreateGraph(MGraph* G, char* path[]); + +/* + * 构造有å‘图 + */ +static Status CreateDG(MGraph* G); + +/* + * 构造有å‘网 + */ +static Status CreateDN(MGraph* G); + +/* + * 构造无å‘图 + */ +static Status CreateUDG(MGraph* G); + +/* + * ████████ 算法7.2 ████████ + * + * 构造无å‘网 + */ +static Status CreateUDN(MGraph* G); + +/* + * å½•å…¥è¾¹çš„ç›¸å…³é™„åŠ ä¿¡æ¯ + */ +static void Input(MGraph G, InfoType** info); + +/* + * 查找 + * + * 返回顶点u在图/网中的ä½ç½® + */ +int LocateVex(MGraph G, VertexType u); + +/* + * 以图形化形å¼è¾“出当å‰ç»“æž„ + * + * 注:在图/网中,使用"-"æ¥è¡¨ç¤ºä¸¤é¡¶ç‚¹ä¸ç›´æŽ¥è¿žé€š + */ +void PrintGraph(MGraph G); + +#endif diff --git a/CLion/ExerciseBook/07.20/TestData_DG.txt b/CLion/ExerciseBook/07.20/TestData_DG.txt new file mode 100644 index 0000000..7b8b53e --- /dev/null +++ b/CLion/ExerciseBook/07.20/TestData_DG.txt @@ -0,0 +1,6 @@ +图类型→0(有å‘图) +顶点数→5 +弧数→10 +弧是å¦å¸¦æœ‰å…¶ä»–ä¿¡æ¯â†’0 +顶点集→ã€A,B,C,D,E】 +弧的集åˆâ†’ã€A,B】ã€A,C】ã€A,D】ã€A,E】ã€B,A】ã€B,C】ã€B,D】ã€B,E】ã€C,D】ã€E,D】 \ No newline at end of file diff --git a/CLion/ExerciseBook/07.20/TestData_DN.txt b/CLion/ExerciseBook/07.20/TestData_DN.txt new file mode 100644 index 0000000..a76b093 --- /dev/null +++ b/CLion/ExerciseBook/07.20/TestData_DN.txt @@ -0,0 +1,6 @@ +图类型→1(有å‘网) +顶点数→5 +弧数→10 +弧是å¦å¸¦æœ‰å…¶ä»–ä¿¡æ¯â†’0 +顶点集→ã€A,B,C,D,E】 +弧的集åˆâ†’ã€A,B,5】ã€A,C,1】ã€A,D,2】ã€A,E,6】ã€B,A,5】ã€B,C,2】ã€B,D,8】ã€B,E,7】ã€C,D,2】ã€E,D,3】 \ No newline at end of file diff --git a/CLion/ExerciseBook/07.20/TestData_UDG.txt b/CLion/ExerciseBook/07.20/TestData_UDG.txt new file mode 100644 index 0000000..8eb3f2c --- /dev/null +++ b/CLion/ExerciseBook/07.20/TestData_UDG.txt @@ -0,0 +1,6 @@ +图类型→2(无å‘图) +顶点数→5 +边数→10 +边是å¦å¸¦æœ‰å…¶ä»–ä¿¡æ¯â†’0 +顶点集→ã€A,B,C,D,E】 +边的集åˆâ†’ã€A,B】ã€A,C】ã€A,D】ã€A,E】ã€B,C】ã€B,D】ã€B,E】ã€C,D】ã€C,E】ã€D,E】 \ No newline at end of file diff --git a/CLion/ExerciseBook/07.20/TestData_UDN.txt b/CLion/ExerciseBook/07.20/TestData_UDN.txt new file mode 100644 index 0000000..7c9d355 --- /dev/null +++ b/CLion/ExerciseBook/07.20/TestData_UDN.txt @@ -0,0 +1,6 @@ +图类型→3(无å‘网) +顶点数→5 +边数→10 +边是å¦å¸¦æœ‰å…¶ä»–ä¿¡æ¯â†’0 +顶点集→ã€A,B,C,D,E】 +边的集åˆâ†’ã€A,B,1】ã€A,C,3】ã€A,D,2】ã€A,E,1】ã€B,C,5】ã€B,D,3】ã€B,E,6】ã€C,D,8】ã€C,E,4】ã€D,E,7】 \ No newline at end of file diff --git a/CLion/ExerciseBook/07.21/07.21.c b/CLion/ExerciseBook/07.21/07.21.c new file mode 100644 index 0000000..83ad791 --- /dev/null +++ b/CLion/ExerciseBook/07.21/07.21.c @@ -0,0 +1,75 @@ +#include +#include "Status.h" //**â–²01 绪论**// +#include "ALGraph.h" //**â–²07 图**// + +/* + * 判断图G是å¦å¯ä¼ é€’ + */ +Status Algo_7_21(ALGraph G); + + +int main(int argc, char* argv[]) { + ALGraph G; + + printf("████████ 创建并输出图...\n"); + { + char* path[4]; + + path[0] = "TestData_DG.txt"; + path[1] = "TestData_DN.txt"; + path[2] = "TestData_UDG.txt"; + path[3] = "TestData_UDN.txt"; + + CreateGraph(&G, path); + PrintGraph(G); + printf("\n"); + } + + Algo_7_21(G) ? printf("图Gå¯ä¼ é€’ï¼\n") : printf("图Gä¸å¯ä¼ é€’ï¼\n"); + printf("\n"); + + return 0; +} + + +/* + * 判断图G是å¦å¯ä¼ é€’ + */ +Status Algo_7_21(ALGraph G) { + Status trans; + int x, y, z; + ArcNode* py, * pz, * px; + + // 预设为å¯ä¼ é€’ + trans = TRUE; + + // 对于V中æ¯ä¸ªx + for(x = 0; x < G.vexnum; x++) { + // N(x)中æ¯ä¸ªy + for(py = G.vertices[x].firstarc; py != NULL; py = py->nextarc) { + y = py->adjvex; + + for(pz = G.vertices[y].firstarc; pz != NULL; pz = pz->nextarc) { + z = pz->adjvex; + + // 排除与x相等的z + if(z != x) { + for(px = G.vertices[x].firstarc; px != NULL; px = px->nextarc) { + if(px->adjvex == z) { + break; // 找到zåŽåŠæ—¶è·³å‡º + } + } + + // 如果zä¸åœ¨N(x)中 + if(px == NULL) { + trans = FALSE; + return trans; + } + } + + } + } + } + + return trans; +} diff --git a/CLion/ExerciseBook/07.21/07.21.png b/CLion/ExerciseBook/07.21/07.21.png new file mode 100644 index 0000000000000000000000000000000000000000..29a4418760cc5fd0d0e3904258af3a0fd49246d9 GIT binary patch literal 16161 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 literal 0 HcmV?d00001 diff --git a/CLion/ExerciseBook/07.21/ALGraph.c b/CLion/ExerciseBook/07.21/ALGraph.c new file mode 100644 index 0000000..688b760 --- /dev/null +++ b/CLion/ExerciseBook/07.21/ALGraph.c @@ -0,0 +1,570 @@ +/*================== + * 图的邻接表存储表示 + ===================*/ + +#include "ALGraph.h" + +// 录入数æ®çš„æºæ–‡ä»¶ï¼›fp为null时,说明需è¦ä»ŽæŽ§åˆ¶å°å½•å…¥ +static FILE* fp = NULL; + +/* + * IncInfo指示该图/网的边/弧上是å¦å­˜åœ¨é™„加信æ¯ã€‚ + * 如果其值ä¸ä¸º0,则表示无附加信æ¯ï¼Œå¦åˆ™ï¼Œè¡¨ç¤ºå­˜åœ¨é™„加信æ¯ã€‚ + */ +Boolean IncInfo = FALSE; + +// 访问标志数组,记录访问过的顶点 +static Boolean visited[MAX_VERTEX_NUM]; + +// 函数å˜é‡ +static Status (* VisitFunc)(VertexType e); + + +/* + * 创建 + * + *ã€å¤‡æ³¨ã€‘ + * + * æ•™æä¸­é»˜è®¤ä»ŽæŽ§åˆ¶å°è¯»å–æ•°æ®ã€‚ + * 这里为了方便测试,é¿å…æ¯æ¬¡è¿è¡Œéƒ½æ‰‹åŠ¨è¾“å…¥æ•°æ®ï¼Œ + * 因而å…许选择从预设的文件pathä¸­è¯»å–æµ‹è¯•æ•°æ®ã€‚ + * + * 如果需è¦ä»ŽæŽ§åˆ¶å°è¯»å–æ•°æ®ï¼Œåˆ™path为NULL,或path[kind]为""。 + * 如果需è¦ä»Žæ–‡ä»¶ä¸­è¯»å–æ•°æ®ï¼Œåˆ™éœ€è¦åœ¨path中填写文件åä¿¡æ¯ã€‚ + */ +Status CreateGraph(ALGraph* G, char* path[]) { + int readFromConsole; // 是å¦ä»ŽæŽ§åˆ¶å°è¯»å–æ•°æ® + int kind; + Status flag; + + printf("请输入图的类型(0-有å‘图 │ 1-有å‘网 │ 2-æ— å‘图 │ 3-æ— å‘网):"); + scanf("%d", &kind); + + // 类型ä¸åˆè§„ + if(kind < 0 || kind > 3) { + return ERROR; + } + + // 如果没有文件路径信æ¯ï¼Œåˆ™ä»ŽæŽ§åˆ¶å°è¯»å–输入 + readFromConsole = (path == NULL) || strcmp(path[kind], "") == 0; + + // 需è¦ä»Žæ–‡ä»¶è¯»å– + if(readFromConsole) { + (*G).kind = kind; // 记录图/网的类型 + } else { + // æ‰“å¼€æ–‡ä»¶ï¼Œå‡†å¤‡è¯»å–æµ‹è¯•æ•°æ® + fp = fopen(path[kind], "r"); + if(fp == NULL) { + return ERROR; + } + + // 录入图的类型 + ReadData(fp, "%d", &((*G).kind)); + } + + // éšæœºåˆ›å»ºæœ‰å‘图/网或无å‘图/ç½‘çš„ä¸€ç§ + switch((*G).kind) { + case DG: + flag = CreateDG(G); + break; + case DN: + flag = CreateDN(G); + break; + case UDG: + flag = CreateUDG(G); + break; + case UDN: + flag = CreateUDN(G); + break; + default: + flag = ERROR; + break; + } + + if(fp != NULL) { + fclose(fp); + fp = NULL; + } + + return flag; +} + +/* + * 构造有å‘图 + */ +static Status CreateDG(ALGraph* G) { + int i, k; + int vexnum, arcnum; + VertexType v1, v2; + InfoType* info = NULL; + + (*G).vexnum = (*G).arcnum = 0; + + if(fp == NULL) { + printf("请输入有å‘图的顶点数:"); + scanf("%d", &vexnum); + printf("请输入有å‘图的弧数:"); + scanf("%d", &arcnum); + printf("该有å‘图的弧上是å¦åŒ…å«å…¶ä»–附加信æ¯(0-ä¸åŒ…å«â”‚1-包å«):"); + scanf("%d", &IncInfo); + + // 录入顶点集 + printf("请录入 %d 个顶点,ä¸åŒé¡¶ç‚¹ä¹‹é—´ç”¨ç©ºæ ¼éš”开:", vexnum); + for(i = 0; i < vexnum; i++) { + // 跳过空白,寻找下一个"å¯è¯»"ç¬¦å· + skipBlank(stdin); + scanf("%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } else { + ReadData(fp, "%d", &vexnum); // 录入顶点数 + ReadData(fp, "%d", &arcnum); // 录入弧数 + ReadData(fp, "%d", &IncInfo); // 判断弧上是å¦åŒ…å«é™„åŠ ä¿¡æ¯ + + // 录入顶点集 + for(i = 0; i < vexnum; i++) { + // 跳过空白,寻找下一个"å¯è¯»"ç¬¦å· + skipBlank(fp); + ReadData(fp, "%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } + + // 仅在控制å°å½•å…¥ä¿¡æ¯æ—¶è¾“出此æç¤º + if(fp == NULL && arcnum != 0) { + printf("请为有å‘图便¬¡å½•å…¥ %d æ¡å¼§çš„ä¿¡æ¯ï¼Œé¡¶ç‚¹ä¹‹é—´ç”¨ç©ºæ ¼éš”开:\n", arcnum); + } + + // å½•å…¥å¼§çš„ä¿¡æ¯ + for(k = 0; k < arcnum; k++) { + if(fp == NULL) { + printf("第 %2d æ¡å¼§ï¼š", k + 1); + skipBlank(stdin); // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + scanf("%c", &v1); + skipBlank(stdin); // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + scanf("%c", &v2); + } else { + // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + skipBlank(fp); + ReadData(fp, "%c%c", &v1, &v2); + } + + // 如果需è¦å½•å…¥å¼§çš„å…¶ä»–é™„åŠ ä¿¡æ¯ + if(IncInfo) { + // 最åŽå½•å…¥é™„åŠ ä¿¡æ¯ + Input(*G, &info); + } + + // æ’入弧 + InsertArc(G, v1, v2, info); + } + + // ä»Žæ–‡ä»¶ä¸­è¯»å–æ•°æ®æ—¶ï¼Œæœ€åŽå…¶å®žåº”当判断一下是å¦è¯»åˆ°äº†è¶³å¤Ÿçš„ä¿¡æ¯ + return OK; +} + +/* + * 构造有å‘网 + */ +static Status CreateDN(ALGraph* G) { + int i, k; + int vexnum, arcnum; + VertexType v1, v2; + InfoType* info = NULL; + + (*G).vexnum = (*G).arcnum = 0; + + if(fp == NULL) { + printf("请输入有å‘网的顶点数:"); + scanf("%d", &vexnum); + printf("请输入有å‘网的弧数:"); + scanf("%d", &arcnum); + printf("该有å‘网的弧上必须包å«å…¶ä»–附加信æ¯ï¼Œå› ä¸ºæ­¤å¤„çš„æƒå€¼éœ€è¦å­˜å‚¨åˆ°é™„加信æ¯ä¸­...\n"); + IncInfo = 1; + + // 录入顶点集 + printf("请录入 %d 个顶点,ä¸åŒé¡¶ç‚¹ä¹‹é—´ç”¨ç©ºæ ¼éš”开:", vexnum); + for(i = 0; i < vexnum; i++) { + // 跳过空白,寻找下一个"å¯è¯»"ç¬¦å· + skipBlank(stdin); + scanf("%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } else { + ReadData(fp, "%d", &vexnum); // 录入顶点数 + ReadData(fp, "%d", &arcnum); // 录入弧数 + ReadData(fp, "%d", &IncInfo);// 判断弧上是å¦åŒ…å«é™„加信æ¯(此处应当包å«) + IncInfo = 1; // 强制将æƒå€¼å½•入到附加信æ¯ä¸­ + + // 录入顶点集 + for(i = 0; i < vexnum; i++) { + // 跳过空白,寻找下一个"å¯è¯»"ç¬¦å· + skipBlank(fp); + ReadData(fp, "%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } + + // 仅在控制å°å½•å…¥ä¿¡æ¯æ—¶è¾“出此æç¤º + if(fp == NULL && arcnum != 0) { + printf("请为有å‘ç½‘ä¾æ¬¡å½•å…¥ %d æ¡å¼§(带æƒå€¼)的信æ¯ï¼Œé¡¶ç‚¹åŠæƒå€¼ä¹‹é—´ç”¨ç©ºæ ¼éš”开:\n", arcnum); + } + + // å½•å…¥å¼§çš„ä¿¡æ¯ + for(k = 0; k < arcnum; k++) { + if(fp == NULL) { + printf("第 %2d æ¡å¼§åŠå…¶æƒå€¼ï¼š", k + 1); + skipBlank(stdin); // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + scanf("%c", &v1); + skipBlank(stdin); // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + scanf("%c", &v2); + } else { + // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + skipBlank(fp); + ReadData(fp, "%c%c", &v1, &v2); + } + + // 如果需è¦å½•å…¥å¼§çš„å…¶ä»–é™„åŠ ä¿¡æ¯ + if(IncInfo) { + // 最åŽå½•入附加信æ¯(此处需è¦å½•入网的æƒå€¼) + Input(*G, &info); + } + + // æ’入弧 + InsertArc(G, v1, v2, info); + } + + // ä»Žæ–‡ä»¶ä¸­è¯»å–æ•°æ®æ—¶ï¼Œæœ€åŽå…¶å®žåº”当判断一下是å¦è¯»åˆ°äº†è¶³å¤Ÿçš„ä¿¡æ¯ + return OK; +} + +/* + * 构造无å‘图 + */ +static Status CreateUDG(ALGraph* G) { + int i, k; + int vexnum, arcnum; + VertexType v1, v2; + InfoType* info = NULL; + + (*G).vexnum = (*G).arcnum = 0; + + if(fp == NULL) { + printf("请输入无å‘图的顶点数:"); + scanf("%d", &vexnum); + printf("请输入无å‘图的边数:"); + scanf("%d", &arcnum); + printf("该无å‘图的边上是å¦åŒ…å«å…¶ä»–附加信æ¯(0-ä¸åŒ…å«â”‚1-包å«):"); + scanf("%d", &IncInfo); + + // 录入顶点集 + printf("请录入 %d 个顶点,ä¸åŒé¡¶ç‚¹ä¹‹é—´ç”¨ç©ºæ ¼éš”开:", vexnum); + for(i = 0; i < vexnum; i++) { + // 跳过空白,寻找下一个"å¯è¯»"ç¬¦å· + skipBlank(stdin); + scanf("%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } else { + ReadData(fp, "%d", &vexnum); // 录入顶点数 + ReadData(fp, "%d", &arcnum); // 录入边数 + ReadData(fp, "%d", &IncInfo);// 判断边上是å¦åŒ…å«é™„åŠ ä¿¡æ¯ + + // 录入顶点集 + for(i = 0; i < vexnum; i++) { + // 跳过空白,寻找下一个"å¯è¯»"ç¬¦å· + skipBlank(fp); + ReadData(fp, "%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } + + // 仅在控制å°å½•å…¥ä¿¡æ¯æ—¶è¾“出此æç¤º + if(fp == NULL && arcnum != 0) { + printf("请为无å‘图便¬¡å½•å…¥ %d æ¡è¾¹çš„ä¿¡æ¯ï¼Œé¡¶ç‚¹ä¹‹é—´ç”¨ç©ºæ ¼éš”开:\n", arcnum); + } + + // å½•å…¥è¾¹çš„ä¿¡æ¯ + for(k = 0; k < arcnum; k++) { + if(fp == NULL) { + printf("第 %2d æ¡è¾¹ï¼š", k + 1); + skipBlank(stdin); // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + scanf("%c", &v1); + skipBlank(stdin); // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + scanf("%c", &v2); + } else { + // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + skipBlank(fp); + ReadData(fp, "%c%c", &v1, &v2); + } + + // 如果需è¦å½•å…¥è¾¹çš„å…¶ä»–é™„åŠ ä¿¡æ¯ + if(IncInfo) { + // 最åŽå½•å…¥é™„åŠ ä¿¡æ¯ + Input(*G, &info); + + } + + // æ’入边 + InsertArc(G, v1, v2, info); + } + + // ä»Žæ–‡ä»¶ä¸­è¯»å–æ•°æ®æ—¶ï¼Œæœ€åŽå…¶å®žåº”当判断一下是å¦è¯»åˆ°äº†è¶³å¤Ÿçš„ä¿¡æ¯ + return OK; +} + +/* + * 构造无å‘网 + */ +static Status CreateUDN(ALGraph* G) { + int i, k; + int vexnum, arcnum; + VertexType v1, v2; + InfoType* info = NULL; + + (*G).vexnum = (*G).arcnum = 0; + + if(fp == NULL) { + printf("请输入无å‘网的顶点数:"); + scanf("%d", &vexnum); + printf("请输入无å‘网的边数:"); + scanf("%d", &arcnum); + printf("该无å‘网的边上必须包å«å…¶ä»–附加信æ¯ï¼Œå› ä¸ºæ­¤å¤„çš„æƒå€¼éœ€è¦å­˜å‚¨åˆ°é™„加信æ¯ä¸­...\n"); + IncInfo = 1; + + // 录入顶点集 + printf("请录入 %d 个顶点,ä¸åŒé¡¶ç‚¹ä¹‹é—´ç”¨ç©ºæ ¼éš”开:", vexnum); + for(i = 0; i < vexnum; i++) { + // 跳过空白,寻找下一个"å¯è¯»"ç¬¦å· + skipBlank(stdin); + scanf("%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } else { + ReadData(fp, "%d", &vexnum); // 录入顶点数 + ReadData(fp, "%d", &arcnum); // 录入边数 + ReadData(fp, "%d", &IncInfo);// 判断边上是å¦åŒ…å«é™„åŠ ä¿¡æ¯ + IncInfo = 1; // 强制将æƒå€¼å½•入到附加信æ¯ä¸­ + + // 录入顶点集 + for(i = 0; i < vexnum; i++) { + // 跳过空白,寻找下一个"å¯è¯»"ç¬¦å· + skipBlank(fp); + ReadData(fp, "%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } + + // 仅在控制å°å½•å…¥ä¿¡æ¯æ—¶è¾“出此æç¤º + if(fp == NULL && arcnum != 0) { + printf("请为无å‘ç½‘ä¾æ¬¡å½•å…¥ %d æ¡è¾¹(带æƒå€¼)的信æ¯ï¼Œé¡¶ç‚¹åŠæƒå€¼ä¹‹é—´ç”¨ç©ºæ ¼éš”开:\n", arcnum); + } + + // å½•å…¥è¾¹çš„ä¿¡æ¯ + for(k = 0; k < arcnum; k++) { + if(fp == NULL) { + printf("第 %2d æ¡è¾¹åŠå…¶æƒå€¼ï¼š", k + 1); + skipBlank(stdin); // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + scanf("%c", &v1); + skipBlank(stdin); // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + scanf("%c", &v2); + } else { + // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + skipBlank(fp); + ReadData(fp, "%c%c", &v1, &v2); + } + + // 如果需è¦å½•å…¥è¾¹çš„å…¶ä»–é™„åŠ ä¿¡æ¯ + if(IncInfo) { + // 最åŽå½•入附加信æ¯(此处需è¦å½•入网的æƒå€¼) + Input(*G, &info); + } + + // æ’入边 + InsertArc(G, v1, v2, info); + } + + // ä»Žæ–‡ä»¶ä¸­è¯»å–æ•°æ®æ—¶ï¼Œæœ€åŽå…¶å®žåº”当判断一下是å¦è¯»åˆ°äº†è¶³å¤Ÿçš„ä¿¡æ¯ + return OK; +} + +/* + * 录入边/å¼§çš„ç›¸å…³é™„åŠ ä¿¡æ¯ + */ +static void Input(ALGraph G, InfoType** info) { + int weight; + + // 在"网"的情形下需è¦å½•å…¥æƒå€¼ä¿¡æ¯ + if(G.kind == DN || G.kind == UDN) { + *info = (InfoType*) malloc(sizeof(InfoType)); + + if(fp == NULL) { + scanf("%d", &weight); + } else { + ReadData(fp, "%d", &weight); + } + + (*info)->weight = weight; + } +} + +/* + * 查找 + * + * 返回顶点u在图/网中的ä½ç½® + */ +int LocateVex(ALGraph G, VertexType u) { + int i; + + for(i = 0; i < G.vexnum; i++) { + if(G.vertices[i].data == u) { + return i; + } + } + + return -1; +} + +/* + * 构造一个边/弧结点(ä»…é™å†…部使用) + */ +static ArcNode* newArcNodePtr(int adjvex, ArcNode* nextarc, InfoType* info) { + ArcNode* p = (ArcNode*) malloc(sizeof(ArcNode)); + if(!p) { + exit(OVERFLOW); + } + + p->adjvex = adjvex; + + p->nextarc = nextarc; + + p->info = info; + + return p; +} + +/* + * æ’入边/å¼§ + * + * 如果当å‰å›¾/网是无å‘的,则æ’入一æ¡å¼§éœ€è¦å¢žåŠ ä¸¤ä¸ªé¡¶ç‚¹å…³ç³»ï¼Œä½†å¼§çš„æ•°é‡åªå¢žä¸€ã€‚ + * 对于图/网æ¥è¯´ï¼Œå¯ä»¥åœ¨å¯å˜å‚数中列出边/弧的附加信æ¯ã€‚ + * + * æ³¨ï¼šæ­¤å¤„æŽ¥æ”¶çš„å‚æ•°ä¸ŽMGraph有些ä¸ä¸€æ ·ï¼šç½‘的附加信æ¯ä¸­åŒ…å«äº†å„æ¡è¾¹/å¼§çš„æƒå€¼ã€‚ + */ +Status InsertArc(ALGraph* G, VertexType v, VertexType w, ...) { + int tail, head, k, count; + ArcNode* r; + ArcNode* pre; + Boolean overlay = FALSE; // 是å¦ä¸ºè¦†ç›–添加 + InfoType* info = NULL; // è¾¹/å¼§çš„é™„åŠ ä¿¡æ¯ + va_list ap; + + tail = LocateVex(*G, v); // 获å–顶点v在顶点集中的ä½ç½® + if(tail == -1) { + return ERROR; // 指定的顶点ä¸å­˜åœ¨ + } + + head = LocateVex(*G, w); // 获å–顶点w在顶点集中的ä½ç½® + if(head == -1) { + return ERROR; // 指定的顶点ä¸å­˜åœ¨ + } + + // æ‹’ç»çޝ + if(tail == head) { + return ERROR; + } + + // 如果边/å¼§ä¸Šå­˜åœ¨é™„åŠ ä¿¡æ¯ + if(IncInfo) { + va_start(ap, w); // 在wåŽæŸ¥è¯¢é¦–个å¯å˜å‚æ•° + info = va_arg(ap, InfoType*); // 获å–é™„åŠ ä¿¡æ¯ + va_end(ap); + } + + /* 接下æ¥ï¼Œéœ€è¦æŸ¥æ‰¾åˆé€‚çš„æ’å…¥ä½ç½® */ + + for(count = 0; count < 2; count++) { + pre = NULL; + // 指å‘以tail为尾的首æ¡è¾¹/å¼§ + r = G->vertices[tail].firstarc; + while(r != NULL && r->adjvex < head) { + pre = r; + r = r->nextarc; + } + + // é‡åˆ°äº†ç›¸åŒä½ç½®çš„结点 + if(r != NULL && r->adjvex == head) { + r->info = info; // å¤ç”¨è¯¥ç»“点 + overlay = TRUE; // å‘生了覆盖 + } else { + if(pre == NULL) { + G->vertices[tail].firstarc = newArcNodePtr(head, r, info); + } else { + pre->nextarc = newArcNodePtr(head, r, info); + } + } + + // 如果当å‰å›¾/网是无å‘的,需è¦è€ƒè™‘对称性 + if((G->kind == UDG || G->kind == UDN) && tail != head) { + // 颠倒iå’Œj + k = tail; + tail = head; + head = k; + } else { + break; // 如果是有å‘的,å¯ä»¥ç»“æŸäº† + } + } + + // 在éžè¦†ç›–的情形下,æ‰è€ƒè™‘æ›´æ–°è¾¹/å¼§çš„æ•°é‡ + if(!overlay) { + (*G).arcnum++; // ä¸è®ºæœ‰å‘æ— å‘,边/å¼§æ•°åªå¢žä¸€ + } + + return OK; +} + +/* + * 以图形化形å¼è¾“出当å‰ç»“æž„ + */ +void PrintGraph(ALGraph G) { + int i; + ArcNode* p; + + if(G.vexnum == 0) { + printf("空图,无需打å°ï¼\n"); + return; + } + + printf("当å‰å›¾/ç½‘åŒ…å« %2d 个顶点, %2d æ¡è¾¹/å¼§...\n", G.vexnum, G.arcnum); + + for(i = 0; i < G.vexnum; i++) { + printf("%c ===> ", G.vertices[i].data); + + p = G.vertices[i].firstarc; + while(p != NULL) { + if(IncInfo == 0) { + printf("%c ", G.vertices[p->adjvex].data); + + // 对于网,会从其附加信æ¯ä¸­èŽ·å–到æƒå€¼ + } else { + printf("%c[%2d] ", G.vertices[p->adjvex].data, p->info->weight); + } + + p = p->nextarc; + + if(p != NULL) { + printf("- "); + } + } + + printf("\n"); + } +} diff --git a/CLion/ExerciseBook/07.21/ALGraph.h b/CLion/ExerciseBook/07.21/ALGraph.h new file mode 100644 index 0000000..0796902 --- /dev/null +++ b/CLion/ExerciseBook/07.21/ALGraph.h @@ -0,0 +1,143 @@ +/*================== + * 图的邻接表存储表示 + ===================*/ + +#ifndef ALGRAPH_H +#define ALGRAPH_H + +#include +#include // æä¾›memsetã€strcmp 原型 +#include // æä¾›å®va_listã€va_startã€va_argã€va_end +#include // æä¾›mallocã€reallocã€freeã€exit原型 +#include "Status.h" //**â–²01 绪论**// + +/* + * 注: + * + * 通常æ¥è®²ï¼Œæ— æƒå›¾è¢«ç®€ç§°ä¸ºã€å›¾ã€‘,有æƒå›¾è¢«ç®€ç§°ä¸ºã€ç½‘】。 + * æ— å‘图/网中的顶点关系被称为ã€è¾¹ã€‘,有å‘图/网中的顶点关系被称为ã€å¼§ã€‘,并区分弧头与弧尾。 + * 实际表述中,未必会严格éµå®ˆä»¥ä¸Šå‘½å。 + * + * 当å‰ç»“构适åˆå­˜å‚¨è¾¹/弧比较稀ç–的图/网。 + * + * ★ æ’入边/å¼§çš„ä¿¡æ¯æ—¶ï¼Œè¿™é‡Œçš„实现是按"å‡åº"æ’入的,这使得æ’入的弧是按"å‡åº"排列的。 + */ + + +/* å®å®šä¹‰ */ +#define MAX_VERTEX_NUM 26 // 最大顶点个数 + + +// 图的类型 +typedef enum { + DG, // 0-有å‘图 + DN, // 1-有å‘网(带æƒå€¼) + UDG, // 2-æ— å‘图 + UDN // 3-æ— å‘网(带æƒå€¼) +} GraphKind; + +// 顶点类型 +typedef char VertexType; + +// è¾¹/å¼§çš„ç›¸å…³é™„åŠ ä¿¡æ¯ +typedef struct { + /* + * 注: + * æ•™æä¸­ç»™å‡ºçš„结构åªè€ƒè™‘了无æƒå›¾ï¼Œè€Œæ²¡è€ƒè™‘有æƒå›¾(网)。 + * 这里为了把“网â€çš„æƒ…形也考虑进去,特在附加信æ¯ä¸­å¢žåŠ äº†"æƒé‡"属性。 + */ + int weight; +} InfoType; + +/* è¾¹/弧结点 */ +typedef struct ArcNode { + int adjvex; // 该弧所指å‘的顶点的ä½ç½® + struct ArcNode* nextarc; // 指å‘下一æ¡å¼§çš„æŒ‡é’ˆ + InfoType* info; // 弧的附加信æ¯ï¼Œé€šå¸¸å¿½ç•¥ +} ArcNode; + +// æ¯ä¸ªé“¾è¡¨çš„头结点 +typedef struct VNode { + VertexType data; // é¡¶ç‚¹ä¿¡æ¯ + ArcNode* firstarc; // 指å‘第一æ¡ä¾é™„该顶点的弧的指针 +} VNode; + +/* 图的邻接表存储表示类型定义 */ +typedef struct { + VNode vertices[MAX_VERTEX_NUM]; // 邻接表 + int vexnum, arcnum; // 图/网的顶点数和弧数 + GraphKind kind; // 图的类型标志 +} ALGraph; + + +// è¾¹/弧上是å¦å­˜åœ¨é™„åŠ ä¿¡æ¯ +extern Boolean IncInfo; + + +/* + * 创建 + * + *ã€å¤‡æ³¨ã€‘ + * + * æ•™æä¸­é»˜è®¤ä»ŽæŽ§åˆ¶å°è¯»å–æ•°æ®ã€‚ + * 这里为了方便测试,é¿å…æ¯æ¬¡è¿è¡Œéƒ½æ‰‹åŠ¨è¾“å…¥æ•°æ®ï¼Œ + * 因而å…许选择从预设的文件pathä¸­è¯»å–æµ‹è¯•æ•°æ®ã€‚ + * + * 如果需è¦ä»ŽæŽ§åˆ¶å°è¯»å–æ•°æ®ï¼Œåˆ™path为NULL,或path[kind]为""。 + * 如果需è¦ä»Žæ–‡ä»¶ä¸­è¯»å–æ•°æ®ï¼Œåˆ™éœ€è¦åœ¨path中填写文件åä¿¡æ¯ã€‚ + */ +Status CreateGraph(ALGraph* G, char* path[]); + +/* + * 构造有å‘图 + */ +static Status CreateDG(ALGraph* G); + +/* + * 构造有å‘网 + */ +static Status CreateDN(ALGraph* G); + +/* + * 构造无å‘图 + */ +static Status CreateUDG(ALGraph* G); + +/* + * 构造无å‘网 + */ +static Status CreateUDN(ALGraph* G); + +/* + * 录入边/å¼§çš„ç›¸å…³é™„åŠ ä¿¡æ¯ + */ +static void Input(ALGraph G, InfoType** info); + +/* + * 查找 + * + * 返回顶点u在图/网中的ä½ç½® + */ +int LocateVex(ALGraph G, VertexType u); + +/* + * 构造一个边/弧结点(ä»…é™å†…部使用) + */ +static ArcNode* newArcNodePtr(int adjvex, ArcNode* nextarc, InfoType* info); + +/* + * æ’入边/å¼§ + * + * 如果当å‰å›¾/网是无å‘的,则æ’入一æ¡å¼§éœ€è¦å¢žåŠ ä¸¤ä¸ªé¡¶ç‚¹å…³ç³»ï¼Œä½†å¼§çš„æ•°é‡åªå¢žä¸€ã€‚ + * 对于图/网æ¥è¯´ï¼Œå¯ä»¥åœ¨å¯å˜å‚数中列出边/弧的附加信æ¯ã€‚ + * + * æ³¨ï¼šæ­¤å¤„æŽ¥æ”¶çš„å‚æ•°ä¸ŽMGraph有些ä¸ä¸€æ ·ï¼šç½‘的附加信æ¯ä¸­åŒ…å«äº†å„æ¡è¾¹/å¼§çš„æƒå€¼ã€‚ + */ +Status InsertArc(ALGraph* G, VertexType v, VertexType w, ...); + +/* + * 以图形化形å¼è¾“出当å‰ç»“æž„ + */ +void PrintGraph(ALGraph G); + +#endif diff --git a/CLion/ExerciseBook/07.21/CMakeLists.txt b/CLion/ExerciseBook/07.21/CMakeLists.txt new file mode 100644 index 0000000..a1f421a --- /dev/null +++ b/CLion/ExerciseBook/07.21/CMakeLists.txt @@ -0,0 +1,12 @@ +# 包å«å…¬å…±åº“ +include_directories(${CMAKE_SOURCE_DIR}/Status) + +# 生æˆå¯æ‰§è¡Œæ–‡ä»¶ +add_executable(07.21 ALGraph.h ALGraph.c 07.21.c) +# 链接公共库 +target_link_libraries(07.21 Scanf_lib) + +# è®°å½•è¦æ‹·è´åˆ°*.exeç›®å½•ä¸‹çš„èµ„æºæ–‡ä»¶ +file(GLOB TestData TestData*.txt) +# å°†èµ„æºæ–‡ä»¶æ‹·è´åˆ°*.exe目录下,ä¸ç„¶æ— æ³•加载 +file(COPY ${TestData} DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) diff --git a/CLion/ExerciseBook/07.21/TestData_DG.txt b/CLion/ExerciseBook/07.21/TestData_DG.txt new file mode 100644 index 0000000..7b8b53e --- /dev/null +++ b/CLion/ExerciseBook/07.21/TestData_DG.txt @@ -0,0 +1,6 @@ +图类型→0(有å‘图) +顶点数→5 +弧数→10 +弧是å¦å¸¦æœ‰å…¶ä»–ä¿¡æ¯â†’0 +顶点集→ã€A,B,C,D,E】 +弧的集åˆâ†’ã€A,B】ã€A,C】ã€A,D】ã€A,E】ã€B,A】ã€B,C】ã€B,D】ã€B,E】ã€C,D】ã€E,D】 \ No newline at end of file diff --git a/CLion/ExerciseBook/07.21/TestData_DN.txt b/CLion/ExerciseBook/07.21/TestData_DN.txt new file mode 100644 index 0000000..f064b55 --- /dev/null +++ b/CLion/ExerciseBook/07.21/TestData_DN.txt @@ -0,0 +1,6 @@ +图类型→1(有å‘网) +顶点数→5 +弧数→10 +弧是å¦å¸¦æœ‰å…¶ä»–ä¿¡æ¯â†’1 +顶点集→ã€A,B,C,D,E】 +弧的集åˆâ†’ã€A,B,5】ã€A,C,1】ã€A,D,2】ã€A,E,6】ã€B,A,5】ã€B,C,2】ã€B,D,8】ã€B,E,7】ã€C,D,2】ã€E,D,3】 \ No newline at end of file diff --git a/CLion/ExerciseBook/07.21/TestData_UDG.txt b/CLion/ExerciseBook/07.21/TestData_UDG.txt new file mode 100644 index 0000000..8eb3f2c --- /dev/null +++ b/CLion/ExerciseBook/07.21/TestData_UDG.txt @@ -0,0 +1,6 @@ +图类型→2(无å‘图) +顶点数→5 +边数→10 +边是å¦å¸¦æœ‰å…¶ä»–ä¿¡æ¯â†’0 +顶点集→ã€A,B,C,D,E】 +边的集åˆâ†’ã€A,B】ã€A,C】ã€A,D】ã€A,E】ã€B,C】ã€B,D】ã€B,E】ã€C,D】ã€C,E】ã€D,E】 \ No newline at end of file diff --git a/CLion/ExerciseBook/07.21/TestData_UDN.txt b/CLion/ExerciseBook/07.21/TestData_UDN.txt new file mode 100644 index 0000000..f68d702 --- /dev/null +++ b/CLion/ExerciseBook/07.21/TestData_UDN.txt @@ -0,0 +1,6 @@ +图类型→3(无å‘网) +顶点数→5 +边数→10 +边是å¦å¸¦æœ‰å…¶ä»–ä¿¡æ¯â†’1 +顶点集→ã€A,B,C,D,E】 +边的集åˆâ†’ã€A,B,1】ã€A,C,3】ã€A,D,2】ã€A,E,1】ã€B,C,5】ã€B,D,3】ã€B,E,6】ã€C,D,8】ã€C,E,4】ã€D,E,7】 \ No newline at end of file diff --git a/CLion/ExerciseBook/07.22-07.23/07.22-07.23.c b/CLion/ExerciseBook/07.22-07.23/07.22-07.23.c new file mode 100644 index 0000000..b791193 --- /dev/null +++ b/CLion/ExerciseBook/07.22-07.23/07.22-07.23.c @@ -0,0 +1,213 @@ +#include +#include "Status.h" //**â–²01 绪论**// +#include "ALGraph.h" //**â–²07 图**// + +// 访问标志数组,记录访问过的顶点 +static Boolean visited[MAX_VERTEX_NUM]; + + +/* + * 通过深度优先é历,输出顶点vi到vj之间的路径 + */ +void Algo_7_22(ALGraph G, VertexType vi, VertexType vj); + +/* + * 深度优先é历图G,查找顶点i到顶点j之间的路径存入path + */ +static Status DFS_7_22(ALGraph G, int i, int j, int path[MAX_VERTEX_NUM + 1]); + +/* + * 通过广度优先é历,输出顶点vi到vj之间的路径 + */ +void Algo_7_23(ALGraph G, VertexType vi, VertexType vj); + +/* + * 广度优先é历图G,查找顶点i到顶点j之间的路径存入path + */ +static Status BFS_7_23(ALGraph G, int i, int j, int path[MAX_VERTEX_NUM + 1]); + + +int main(int argc, char* argv[]) { + ALGraph G; + + printf("████████ 创建并输出图...\n"); + { + char* path[4]; + + path[0] = "TestData_DG.txt"; + path[1] = ""; + path[2] = ""; + path[3] = ""; + + CreateGraph(&G, path); + PrintGraph(G); + printf("\n"); + } + + printf("████████ 题7.22:通过深度优先é历判断两顶点间是å¦å­˜åœ¨è·¯å¾„...\n"); + { + VertexType vi = 'A'; + VertexType vj = 'F'; + + Algo_7_22(G, vi, vj); + printf("\n"); + } + + printf("████████ 题7.23:通过广度优先é历判断两顶点间是å¦å­˜åœ¨è·¯å¾„...\n"); + { + VertexType vi = 'A'; + VertexType vj = 'F'; + + Algo_7_23(G, vi, vj); + printf("\n"); + } + + return 0; +} + + +/* + * 通过深度优先é历,判断顶点vi到vj之间是å¦å­˜åœ¨è·¯å¾„ + */ +void Algo_7_22(ALGraph G, VertexType vi, VertexType vj) { + int i, j, k; + int path[MAX_VERTEX_NUM + 1]; + + for(k = 0; k < G.vexnum; k++) { + visited[k] = FALSE; + } + + i = LocateVex(G, vi); + j = LocateVex(G, vj); + + path[0] = 0; + + if(DFS_7_22(G, i, j, path) == ERROR) { + printf("%c 到 %c 之间ä¸å­˜åœ¨é€šè·¯ï¼\n", vi, vj); + return; + } + + printf("%c 到 %c 之间的通路为:", vi, vj); + for(k = 1; k <= path[0]; k++) { + printf("%c ", GetVex(G, path[k])); + } + printf("\n"); +} + +/* + * 深度优先é历图G,查找顶点i到顶点j之间的路径存入path + */ +static Status DFS_7_22(ALGraph G, int i, int j, int path[MAX_VERTEX_NUM + 1]) { + int w; + + // 将顶点i加入路径 + visited[i] = TRUE; + path[0]++; + path[path[0]] = i; + + if(i == j) { + return OK; + } + + // é历vi所有邻接点 + for(w = FirstAdjVex(G, GetVex(G, i)); w >= 0; w = NextAdjVex(G, GetVex(G, i), GetVex(G, w))) { + // 跳过已访问的顶点 + if(visited[w]) { + continue; + } + + // 递归(深度优先) + if(DFS_7_22(G, w, j, path) == OK) { + return OK; + } + } + + // 移除顶点i + visited[i] = FALSE; + path[0]--; + + return ERROR; +} + +/* + * 通过广度优先é历,判断顶点vi到vj之间是å¦å­˜åœ¨è·¯å¾„ + */ +void Algo_7_23(ALGraph G, VertexType vi, VertexType vj) { + int i, j, k; + int path[MAX_VERTEX_NUM + 1]; + + for(k = 0; k < G.vexnum; k++) { + visited[k] = FALSE; + } + + i = LocateVex(G, vi); + j = LocateVex(G, vj); + + path[0] = 0; + + if(BFS_7_23(G, i, j, path) == ERROR) { + printf("%c 到 %c 之间ä¸å­˜åœ¨é€šè·¯ï¼\n", vi, vj); + return; + } + + printf("%c 到 %c 之间的通路为:", vi, vj); + for(k = 1; k <= path[0]; k++) { + printf("%c ", GetVex(G, path[k])); + } + printf("\n"); +} + +/* + * 广度优先é历图G,查找顶点i到顶点j之间的路径存入path + */ +static Status BFS_7_23(ALGraph G, int i, int j, int path[MAX_VERTEX_NUM + 1]) { + int w; + LinkQueue Q; + QElemType e; + + // 将顶点i加入路径 + visited[i] = TRUE; + path[0]++; + path[path[0]] = i; + + if(i == j) { + return OK; + } + + // 置空辅助队列 + InitQueue(&Q); + + // é历vi所有邻接点 + for(w = FirstAdjVex(G, GetVex(G, i)); w >= 0; w = NextAdjVex(G, GetVex(G, i), GetVex(G, w))) { + // 跳过已访问的顶点 + if(visited[w]) { + continue; + } + + if(w == j) { + // 将顶点w加入路径 + visited[w] = TRUE; + path[0]++; + path[path[0]] = w; + return OK; + } + + EnQueue(&Q, w); + } + + // 从邻接点出å‘,继续寻找目标路径 + while(!QueueEmpty(Q)) { + DeQueue(&Q, &e); + + // 递归(广度优先) + if(BFS_7_23(G, e, j, path) == OK) { + return OK; + } + } + + // 移除顶点i + visited[i] = FALSE; + path[0]--; + + return ERROR; +} diff --git a/CLion/ExerciseBook/07.22-07.23/07.22-07.23.png b/CLion/ExerciseBook/07.22-07.23/07.22-07.23.png new file mode 100644 index 0000000000000000000000000000000000000000..cfe4c39968b1c8e22b3675a030cdf7d1da88b0f6 GIT binary patch literal 8413 zcmXwf1z3~s7dFl40YhR)$3Q}I2of7OQW!{!ARr;qEvX}yx=?=Q+>0&$;h65~;09Mb1KwhlfX{uBM`ghllTqyG{oX;68KU z-6FUzd=EWUI9}N>>n84o$PV@thKE-fPjPKYjJqduRWtFx!=vu__r~vWDR_m4$KkH7 z0@L?3-%UGo8UH=gb76N%f7chZez&NI_wnqLCSi^cx`e{ag~%Bp0gz;DPxgtmm*%34 z<&dqlntxGSpW;XBvz+Asf95rCRXFl`i;chV{%mC0V|MwX<%!C`xRE3I5sv`JjB^eE z3P{&NY-4AaKfWo+5^HrxG0-?B)$+Q2)@7k(a+|DO&G%^SY4K#y)b{XiW5M}6SXo(F zOYog}IsY;0a&vQdg1=TaRL-9PJwN~AI1Bl8H3i2)VXb?X}_)L z+K~rqRH_=M-p2ISNv_$Rh6wbkpswPVnP**h?FqkRZ`j`<&&$VUsF95fGEyY}1m(&2 zcv_*31A|Xq_(!nA^Sd3H$7C8!H$o}Rq2||BCp)d|(xkI4vkM*&R@LGY{X27Ddq_*s zm@#gNlEviMW0~t5BsJY)1!NXCz{!~v+0k;PUi z1xhD*h+p%>ACb*6v+*B!*qd?se577K__53e%Q{LTt3C+LhWfiUlmh2uU)~d|d0nKP z3FOKdBx*oJliMFphPCJa5jE#w>{n9{>ER2fbv=&xs|CZ(&kwDyqheByt2ZBo!6QbS zSC1NiA**FKKd@CLU_a<*3Y(l91U4k){_5%@IX@`rSCn44XsKjzcYH@xeyM8h40kg> z>_92=A^R&|h6i9U5mcQ?+f&{QvVKsG+N&2V7n`56( z5@qslZ*OPv%W3=9S0h5s#GAPyks=z5|7A^A+L|17hyBNmf}bk^EwA~^whJ9lqx4n# z3w5o~WaRhLg1U!=5)TC!b0zx0Wp3Uws(!)JA5f_D-0}5n3LSLijn*1UYmhN6tSp{- z)Lt=jcHhNlv-?DZpQ4}P(zs;Sy}`t8*bM>!gTY$s>uP-dc7CA0s;hr_{U%|) zc3XsXXC_arE7tF!-5J}qKXlCnbdAf4282XwoscCt|!5R-{QncVC zZFFo-|D+nb563M+zf)yfminXq#m{DrvtyM;g;tAEZ+{Z=V>n$#_!Gt|FFBp zS)DZ*cx8KRPJ`6@q@6#K`Y5}VE|2LtbYj~6QHWM;_viefefjBl@WQ=li;esIQI66n z8o3U&$-mTfd1{#R^)%N-`=FbzSkGP#OC2xRm4t;J{T1PsVh*x6(B zdqtlr9}PKH3>D~ZIpndEOo81~Le6nVtK-9TMOMBrSgc@GiC1fcA?Dm5+$o+8bdS0R zA|m-F_8V-k(Y^Ci<%6I?6`L24vw&`aGF=|?0=M5Dy2m4AhgqB-Rfd72R>32GSUmL3 zeXP)pe7N3aEevT1cRh7#8}`)yfKj;W^D8rJxISyWn-}IK*Zk_IaPi+~(ft7D|1G2< zv`!YJ(hx)65^#QyS$@vZ%S2vR5uE?0NRLh!(n+C0)$K=EGDUmd>*wCEgL@4Q#*~F* zW4znZ&&sC;EaoMXhd3w_{=Ou0^7^KQXo&e7pwQaVGEABsL%5^X-;p)aFO*oa*HKK} zgS=*KYpaO0Ouq`%S|fPRT!e^avIK7s;=KN&Yk>!ihx#;E2npYZ2s}DZidToI65G7q zN4NG1fy$hmoCYDu(sxcc;m zylv99G&|P`+>Jn@#%8lDahRHA zgWH0!9J&ARAhS}Dt!CNjKY!|kw!34&FKX%YzD4Xc`8;>ecmB+@r6U5NT@}}031hDI zr6vv&iZJWN{jQpQs4DYpi=bg>)&0aTO+h1=SBtl0&5uM(Dl7j?RshKrEJ668w#%V# z-gz50A#uQqCbr>Q-@B-0&-KZZ&^zgrr?0x+V%lq#{F!VZntOQtl`5BzZ)MEx0V+s@ zYisqHosb)P(jgJ#rX<6yCEY?o5H7LKJ3dyoAuW7Q&Wr0w2pj0tRflqON?({b;*hBuw>=>8j7GV0HdMPt3Cmu{{%fFQ z^x`4$a}I5oA)nMf!(75{_^o-;;{0bPr5gGwZZ`>eA{IbbDcEDWBoFlA%+L)og33&pFtd zEdKV5;_mFtY{7@6m};b8;Gg};=w@Q#1A}GsVp7_UTe;dFK25oS^`l7#ufKe>TKp<$ z4qOdj?PD6nl6&M+C?EHnqc2`Jr@OQB;8*+%Tupw>+A{Ho;InxjwCp*O40mh z1w|kuNP1XuQ(LLK-|d2h=SWy=wz)U3rp-!*mecE;t%3Lh3X>DI{`;XAG5E0YccN{r ze&bU|D}I8mNY;;CPHyBp#urbft{_r2`6S`g$G?APAn!s#LSQI@3IEzlj--?mx%=;` zwIk1W0R)=fnP}hTtJKK+Nr%@Ak2n%F9zB2fM^7lo(&Q+pJX~Ra6fQEkt?8%iS5om% zY@F70Qae9H!&aQR{WQo~hYCqE5w5Ek5~~#^s~R6SM1rdkh!cnF5)u>FmKWPhxw7(0 zKd6z}$wx`r;el$+M8;Jbee@{EP~%hflD4+C!|C$HwViqE8%=4u!wk`(Bk`m@dPRJ z=D5sMb2ydLYU;rW!Fr(~qr^AnCc>t&nanEHT4I)0d>;7oZs9l1(@i!e>Vrv#;#*OE z4-z#x`GTUA(vT7p@#ASth(NvK?-Eiw55$f+AunV=r)^`S1Tx!K)`zhq3!VIaJZGGQ z%LSjNk$FT6S@ayE_%a>_*D8f%f3jL-se@483%mmN}Rl$vIx0k6%k@WAX8nJPx8OQ{Bz9{7#cbrI*+2ryf#hA#{BC{uVxO_ zvPp;v42w6zjN#@8O+^-K_l}@@y;~bHjJO0|#J!d6k0&g#-dSf;7t1C=*lFB61xN422e;17W&=jvjUYQFjz%7Uy>uSsRn-xym|7 z+8lory2^d}YYCqn5r8**pd#j(ApQcCg$c~=No_dqtfwdRidMvMS8A{az+&Fz#UO~V z6qbNC0F2ei-3*p0@mQDgevVc)1|suT(l0_CqCGrkFWK8Gv>jgMenGu3+QDzN@xehK zOI0edX>E{7!Gg$1`Ub$C*ug=&_@4(Pd$=jh62zNvQ!?`Ew~-bY-b~sr;Rz--;Xr*L z*}_@hFgaS$r4EfNN!C)j90XFDzmAM>imb@?ww08X{p!(+wYSL8meH7~WoQPnJ%9dO z!&@_#t|>yshL5aL4rMLJmL}nxGC9tYeU@PhsIX2dy=UunkB?xj~JfBe-`oWcy7DQ$4uwa}( z;XX9Totp1(0#nF1x|#-i_IycvK)A=wj<3e~UUm-_%PZf+Oxd+VBQCi%gIaW!(iZ#XoY(;OC6oBpoEy18q(J6 zf$ONCboO6MpBH1!WNSoKkX-Ly(qv=`gt8_7s{4CUocTj|Rku{@Yj!qP*3ev}p#2}Bt%6oyYStbD;$)|T?d^v_=#W(N(5|IHLZ zAZaT5uT{wu5N4<4!8gT*#hfCgh6DC=E<0HJ3B5{VEzcc36rFGlrPLP$QE@BFJ?STT z^p`1f{i`X(#iAz)?IGD+Vt{eioJE@qJo6vEZhLbL`z=>-8w|ThdV_=JyqhRZB^y2^ z*C$8>K2?}`vNVWihF_jc-1*lC4&nQ%)|9oB?R7$2h|{$XBqhV}RD`qY0thDzwARGJ z2zcpW%(ODX$*3wy-Idc(b$yqg)$D|9?c4jkcLMjHIvkY#d=?RSdCG5-Kx{;l{!9F$ z!vmDKL&ROA%Vv^aBWrAl-EBsjSMT+> zm`8jUk9pf63eZ12?Izz?IQdJ*5sHwE>JkkPItuZ5aIf4yL!>Rale>mZQnw0B_&Cb^ zJ$1-u&71EZOlh5QFv(gUMZ*QL4%d#Udy;fAAlmA=Uy&v39YU;-Grr#8w>ppazjCK2 z?UZm=?XvXe7;Ke;o!Di>_?69ne3<<%AT8Qh2`^PUKQS57TQk{eXk^6L52adXx7YNy zQ@nNk*Cy1Z$u^&bRKi`jxBF~G3)33E@I>vh**v&N=k*8%Gz>lJ%hJnClEM4C?y)J*i`$F#ROs%QQz^d*1jo=?RWiBG%nz~9$Iu+C3CUNfrm>w2b zFsoi<@NXf-dR)t)9?H)iBsyRDZZ2cv(GfesLf8dhsjmV3U={U3x5}C#ww{27Dp~U@ zV#xKk?E8$$2=iwhew-H(m>70hXfB5{Ad@2O?MSut`l-H}yTkB_sE&8JI|U7=S=LIf zO@g<&_c(Ew0Zk#ELa4C>zz5p#RF(^}Ldx#UirG8afXk%y4f-~}UH>pnx)ix>@u$T7 z?)U0IlKRdgo<3&~5ywQhEMsa~L|NRp2a^YYE()MAhjU6S66w4m;n(ww<|B6>Ko#7&tS%ApwK6_EWV<(h1zWK{Oqp~-Sd?koj71u2;$Cbmd z&ClvEGNd*-fjfs)Vr#7EG-+2tJ?(4!a<(Z)`MCFUf*9pEMq2cD`fi(*__M)Dzvp}& zZStiaRhd6}RTZR1jP>d7f0ldngot-<`tw{lI9+jcC(`MK6xnO5*-%(erfs&(@>$H2 zVHwgdqcAs|A>|I1p@}P8onmhB%RkM`b?RKvx^jHeHNlTlHv+@+&i!I|VA7`JPPx91 zO^K7FkavqYnk=yYJwSutAmik`t|Gk>1ht>rQm4HLP;eVD<_XuBdjh3Jzgl!5XbGnH z`!1L1S6VFMDz7-+UfOg5h@jQsec%X!sgtPejL8$w6~Zfy)9K{ zeoC?Rna%vIW#C;yI}YHjRgjj zG0ty#Ms--9=vB?-kr3w*mo~z*&>Hfm@quvF3A-n3N>lV#}`Qe%7{?dRT z5!!h5nK*h^k%UWPgQRxJv9m3N%hx#Il~x8iDByOUDl3)z#G*v!7VnWPQbA2OtCRi#7Lb z)Xn$9U0ffpAT-%pRdS&(_~Z-dNSp0MMd9Ec3oq)^DAt}EFD&;9!KIVRzaysob8#n+ z|5#W5g-$~J#f47s{L(GA1#ul;I^nho<(U6u8qr`i_oUc9>4OQ)t+DyQ1ct%A5%yz3Bjsy zibEwLn;god`C~$t$3AE3g`@ANiE3*LfN5iD4!^as1H>hi4S{+;ruPh&Vw1!%;<#nO^4& zDtMps#3WE(pbks*(P-$9CFhHy4>{C~RC_umF z_*_P`?Fiy?=Iy41drm}8F4 zo$&rx5AP6UQHSy-pc8@p8#<=4Q$)|A%Z(8cI?<2g51J0QjS8$?Tg+W#Tt5bjm0z%TOQlNHZLC{CT(xeV+abn)N z9X=rgati7YX~Krs*v7-8qQ!&_`7EYK^r0e>=kQFR zA&o2>EOUR7&K-39?M|;9e@Y<@`}C)>PtmXGYH&XsKG0SG4z`g_ekgA5U(<+8p7SLl zo`Xe^>-?-5+kOOqHj!y2611D-$T&!|pv3=#(B^&FO)zg0lZLsG3J5-K>zK6iK~+e^ z0eJt7ME(56oyJ+Ht1K-Je##{Gorg+KlyYF2h&c71NgN$uuHb>_qPFa!T`JN8PW$^v z&rBZ)!Cc|_=Eal8D5|)Xfs<|l$S_CPCnm80Y_*-JMayF`Y;1CDcpSzaXEQ>$MlbOJ z-fb42eBl$(m}f{OVuA12^48mAja)R^^U#0}>elOAVCJ<_E-NNJA=t@I$L@EwySwWt z8w3a9}_U7j18a&p~ zV6F$3>}*W=m_@IYl$4{Rqw4DFtgBeuD7i3l4H9MH-Z6hf;M$0e6h?oQ*T(67`2TP28Ki?TQ8li{5w7- zE)9>B2++dr*tSguTxH%Gd9N$!}h{{AOcB;CYFF&0~7x!&ldAKF44q)pAul{vLo zC2cR&9&5gdd@7i@)sNry-DVz=SQ2FUeip~4ITQvl`kd17vT{RCE~nJ=6{*0E5Z0a- zr3$07Rm|4j9ea(?TP{0uI!%}wtSxwtn(&9qfV(nAPB;A*kmr1hteNV2(OZYQ3f*2D`b#D6{AuWYJlDrX^KD0qGrmZez;kT?dz90=lX$ z6(CLZ7+^|hE?@sBXc^Re5|LT(|NbxFYTS-p!AV}+Ogy4F=!h#LV;ie{21FyQ-!>fn zoK|toRs(76a})HACD7nP6L*@4p5z~0o3GX_#k9q~3#m}v?|3f&$sxN47(RD1HWV~z z$!mP8GKApPg3LJ$)drh2^05_46 zv&gzR-%)#^?HepBEgEiln^bDo?b2Smuuzue;1{gQImhJ69I;sHb-+UYEtU_^qbIWP zwxQ8c=H+*Uc%pWO4~YOy&xp3IW{hQ5u`I~**E1V=J{-Ok?s(}Ln7}Gu6^iZ?%a$+FbNAAtH!I(eA&yYBgr?vHk)bBlOQ{?Hr^B*-h z2_=xoF3If8>BII4eZgGstsrm0UPnn7AR^-&^8muW&%EGYt+fW9vZNs<){*|b?V=6C z*8i*heW~?&_a+u2aJ5pT1`#Jm&~gX{wam&ei9-G4km&Zi83Lj2ia5HeG5@(&>!d#( zyIg`Jv~UA?@D&iR{Bs^FbmkiW_;X?+3{en0Bw|2sPnExD^i<#ezyY9rDKpPO!3Q}L ztnZaZe+s3`6xvOzp=qCmP>1_+TH>^+Jtz>~%Kw`TwfHfU3(fhAZ6JAH;oYNirv4?& zj^$7H)Lgyw)T9qoCb|n0sE3l-tjc|>woUY%)WkLs#gA17Jz9=>u8eT(OY;bDG&V0Q5-5i*Vb-F!)&?{@({01 z%!y$U@8;*{wQSeo&&nzHDdtnTt6U+FMbUkh{`NqgC=S5Q0rV;e;-N^l8i8?ia$+E# zidhJKLn~kN6i7t)_nn!u^e=GSJdKka7X-M;olZj8LyiK<;uuO-cAedt^!OraVjF+| z6b@c;1M3t=>v2KYGi z^zj{HgR@=Zh#i-${Mf1e0OS=82R1%95E!ae;4;DJ!fzV76VSfDrL{D z$0!wg%9ZR;Na6IvK4mf@OS1_F8urQlaBFJ2H`@=scr`C{EM1Y4y8;vYci*+qb#X}3 zO3{WM{&J8PzE@7ls>9jKF~M|D6p163aS8x@X~uObFzAot>d~XK;&(WwQ-HyWYez;O zQc|s2fBD`{Ck3-{Ln@k^WBDqDM|>`K6s7J7*OY+WpQ-|_x@PNLaHQ|?@t=i?LmV*R zl^&4w?Q9Qjxjr|zmb*v4>k72^i%aVuyGm25G@O{1-pB{23`=h@Yx%65 z(UYcouU_sm^U`p<0|j=c%WN;|4C>*>0O}eZ*3KX2eA#Dva`ZdGOs~)*p!bz6lJ#v% z4F?bLiJ2X`Yje1OlKnhduHIC*wSNAB9t2ep5nmJpe8%5<{PO3CuR_3iaIRRYIPHPY S1n!XpJoP8qDrNAOsQ&|B!4&TR literal 0 HcmV?d00001 diff --git a/CLion/ExerciseBook/07.22-07.23/ALGraph.c b/CLion/ExerciseBook/07.22-07.23/ALGraph.c new file mode 100644 index 0000000..f747122 --- /dev/null +++ b/CLion/ExerciseBook/07.22-07.23/ALGraph.c @@ -0,0 +1,405 @@ +/*================== + * 图的邻接表存储表示 + ===================*/ + +#include "ALGraph.h" + +// 录入数æ®çš„æºæ–‡ä»¶ï¼›fp为null时,说明需è¦ä»ŽæŽ§åˆ¶å°å½•å…¥ +static FILE* fp = NULL; + +/* + * IncInfo指示该图/网的边/弧上是å¦å­˜åœ¨é™„加信æ¯ã€‚ + * 如果其值ä¸ä¸º0,则表示无附加信æ¯ï¼Œå¦åˆ™ï¼Œè¡¨ç¤ºå­˜åœ¨é™„加信æ¯ã€‚ + */ +Boolean IncInfo = FALSE; + +// 访问标志数组,记录访问过的顶点 +static Boolean visited[MAX_VERTEX_NUM]; + +// 函数å˜é‡ +static Status (* VisitFunc)(VertexType e); + + +/* + * 创建 + * + *ã€å¤‡æ³¨ã€‘ + * + * æ•™æä¸­é»˜è®¤ä»ŽæŽ§åˆ¶å°è¯»å–æ•°æ®ã€‚ + * 这里为了方便测试,é¿å…æ¯æ¬¡è¿è¡Œéƒ½æ‰‹åŠ¨è¾“å…¥æ•°æ®ï¼Œ + * 因而å…许选择从预设的文件pathä¸­è¯»å–æµ‹è¯•æ•°æ®ã€‚ + * + * 如果需è¦ä»ŽæŽ§åˆ¶å°è¯»å–æ•°æ®ï¼Œåˆ™path为NULL,或path[kind]为""。 + * 如果需è¦ä»Žæ–‡ä»¶ä¸­è¯»å–æ•°æ®ï¼Œåˆ™éœ€è¦åœ¨path中填写文件åä¿¡æ¯ã€‚ + */ +Status CreateGraph(ALGraph* G, char* path[]) { + int readFromConsole; // 是å¦ä»ŽæŽ§åˆ¶å°è¯»å–æ•°æ® + int kind; + Status flag; + + // ★★★此处固定为有å‘图 + kind = 0; + + // 如果没有文件路径信æ¯ï¼Œåˆ™ä»ŽæŽ§åˆ¶å°è¯»å–输入 + readFromConsole = (path == NULL) || strcmp(path[kind], "") == 0; + + // 需è¦ä»Žæ–‡ä»¶è¯»å– + if(readFromConsole) { + (*G).kind = kind; // 记录图/网的类型 + } else { + // æ‰“å¼€æ–‡ä»¶ï¼Œå‡†å¤‡è¯»å–æµ‹è¯•æ•°æ® + fp = fopen(path[kind], "r"); + if(fp == NULL) { + return ERROR; + } + + // 录入图的类型 + ReadData(fp, "%d", &((*G).kind)); + } + + // éšæœºåˆ›å»ºæœ‰å‘图/网或无å‘图/ç½‘çš„ä¸€ç§ + switch((*G).kind) { + case DG: + flag = CreateDG(G); + break; + default: + flag = ERROR; + break; + } + + if(fp != NULL) { + fclose(fp); + fp = NULL; + } + + return flag; +} + +/* + * 构造有å‘图 + */ +static Status CreateDG(ALGraph* G) { + int i, k; + int vexnum, arcnum; + VertexType v1, v2; + InfoType* info = NULL; + + (*G).vexnum = (*G).arcnum = 0; + + if(fp == NULL) { + printf("请输入有å‘图的顶点数:"); + scanf("%d", &vexnum); + printf("请输入有å‘图的弧数:"); + scanf("%d", &arcnum); + printf("该有å‘图的弧上是å¦åŒ…å«å…¶ä»–附加信æ¯(0-ä¸åŒ…å«â”‚1-包å«):"); + scanf("%d", &IncInfo); + + // 录入顶点集 + printf("请录入 %d 个顶点,ä¸åŒé¡¶ç‚¹ä¹‹é—´ç”¨ç©ºæ ¼éš”开:", vexnum); + for(i = 0; i < vexnum; i++) { + // 跳过空白,寻找下一个"å¯è¯»"ç¬¦å· + skipBlank(stdin); + scanf("%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } else { + ReadData(fp, "%d", &vexnum); // 录入顶点数 + ReadData(fp, "%d", &arcnum); // 录入弧数 + ReadData(fp, "%d", &IncInfo); // 判断弧上是å¦åŒ…å«é™„åŠ ä¿¡æ¯ + + // 录入顶点集 + for(i = 0; i < vexnum; i++) { + // 跳过空白,寻找下一个"å¯è¯»"ç¬¦å· + skipBlank(fp); + ReadData(fp, "%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } + + // 仅在控制å°å½•å…¥ä¿¡æ¯æ—¶è¾“出此æç¤º + if(fp == NULL && arcnum != 0) { + printf("请为有å‘图便¬¡å½•å…¥ %d æ¡å¼§çš„ä¿¡æ¯ï¼Œé¡¶ç‚¹ä¹‹é—´ç”¨ç©ºæ ¼éš”开:\n", arcnum); + } + + // å½•å…¥å¼§çš„ä¿¡æ¯ + for(k = 0; k < arcnum; k++) { + if(fp == NULL) { + printf("第 %2d æ¡å¼§ï¼š", k + 1); + skipBlank(stdin); // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + scanf("%c", &v1); + skipBlank(stdin); // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + scanf("%c", &v2); + } else { + // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + skipBlank(fp); + ReadData(fp, "%c%c", &v1, &v2); + } + + // 如果需è¦å½•å…¥å¼§çš„å…¶ä»–é™„åŠ ä¿¡æ¯ + if(IncInfo) { + // 最åŽå½•å…¥é™„åŠ ä¿¡æ¯ + Input(*G, &info); + } + + // æ’入弧 + InsertArc(G, v1, v2, info); + } + + // ä»Žæ–‡ä»¶ä¸­è¯»å–æ•°æ®æ—¶ï¼Œæœ€åŽå…¶å®žåº”当判断一下是å¦è¯»åˆ°äº†è¶³å¤Ÿçš„ä¿¡æ¯ + return OK; +} + +/* + * 录入边/å¼§çš„ç›¸å…³é™„åŠ ä¿¡æ¯ + */ +static void Input(ALGraph G, InfoType** info) { + int weight; + + // 在"网"的情形下需è¦å½•å…¥æƒå€¼ä¿¡æ¯ + if(G.kind == DN || G.kind == UDN) { + *info = (InfoType*) malloc(sizeof(InfoType)); + + if(fp == NULL) { + scanf("%d", &weight); + } else { + ReadData(fp, "%d", &weight); + } + + (*info)->weight = weight; + } +} + +/* + * 查找 + * + * 返回顶点u在图/网中的ä½ç½® + */ +int LocateVex(ALGraph G, VertexType u) { + int i; + + for(i = 0; i < G.vexnum; i++) { + if(G.vertices[i].data == u) { + return i; + } + } + + return -1; +} + +/* + * å–值 + * + * 返回索引v处的顶点值 + */ +VertexType GetVex(ALGraph G, int v) { + if(v < 0 || v >= G.vexnum) { + return '\0'; // 指定的顶点ä¸å­˜åœ¨ + } + + return G.vertices[v].data; +} + +/* + * 首个邻接点 + * + * 返回顶点v的首个邻接点 + */ +int FirstAdjVex(ALGraph G, VertexType v) { + int k; + ArcNode* r; + + // 首先需è¦åˆ¤æ–­è¯¥é¡¶ç‚¹æ˜¯å¦å­˜åœ¨ + k = LocateVex(G, v); + if(k == -1) { + return -1; // 指定的顶点ä¸å­˜åœ¨ + } + + r = G.vertices[k].firstarc; + if(r == NULL) { + return -1; + } else { + return r->adjvex; + } +} + +/* + * 下一个邻接点 + * + * 返回顶点vçš„(相对于wçš„)下一个邻接点 + */ +int NextAdjVex(ALGraph G, VertexType v, VertexType w) { + int kv, kw; + ArcNode* r; + + // 首先需è¦åˆ¤æ–­è¯¥é¡¶ç‚¹æ˜¯å¦å­˜åœ¨ + kv = LocateVex(G, v); + if(kv == -1) { + return -1; // 指定的顶点ä¸å­˜åœ¨ + } + + // 首先需è¦åˆ¤æ–­è¯¥é¡¶ç‚¹æ˜¯å¦å­˜åœ¨ + kw = LocateVex(G, w); + if(kw == -1) { + return -1; // 指定的顶点ä¸å­˜åœ¨ + } + + r = G.vertices[kv].firstarc; + if(r == NULL) { + return -1; // 链表为空 + } + + // 在链表中查找w + while(r != NULL && r->adjvex < kw) { + r = r->nextarc; + } + + // 如果没找到w + if(r == NULL) { + return -1; + } + + // 如果找到了w,但是wåŽé¢æ²¡æœ‰åˆ«çš„顶点,那么也无法返回邻接点 + if(r->adjvex == kw && r->nextarc != NULL) { + return r->nextarc->adjvex; + } + + return -1; +} + +/* + * 构造一个边/弧结点(ä»…é™å†…部使用) + */ +static ArcNode* newArcNodePtr(int adjvex, ArcNode* nextarc, InfoType* info) { + ArcNode* p = (ArcNode*) malloc(sizeof(ArcNode)); + if(!p) { + exit(OVERFLOW); + } + + p->adjvex = adjvex; + + p->nextarc = nextarc; + + p->info = info; + + return p; +} + +/* + * æ’入边/å¼§ + * + * 如果当å‰å›¾/网是无å‘的,则æ’入一æ¡å¼§éœ€è¦å¢žåŠ ä¸¤ä¸ªé¡¶ç‚¹å…³ç³»ï¼Œä½†å¼§çš„æ•°é‡åªå¢žä¸€ã€‚ + * 对于图/网æ¥è¯´ï¼Œå¯ä»¥åœ¨å¯å˜å‚数中列出边/弧的附加信æ¯ã€‚ + * + * æ³¨ï¼šæ­¤å¤„æŽ¥æ”¶çš„å‚æ•°ä¸ŽMGraph有些ä¸ä¸€æ ·ï¼šç½‘的附加信æ¯ä¸­åŒ…å«äº†å„æ¡è¾¹/å¼§çš„æƒå€¼ã€‚ + */ +Status InsertArc(ALGraph* G, VertexType v, VertexType w, ...) { + int tail, head, k, count; + ArcNode* r; + ArcNode* pre; + Boolean overlay = FALSE; // 是å¦ä¸ºè¦†ç›–添加 + InfoType* info = NULL; // è¾¹/å¼§çš„é™„åŠ ä¿¡æ¯ + va_list ap; + + tail = LocateVex(*G, v); // 获å–顶点v在顶点集中的ä½ç½® + if(tail == -1) { + return ERROR; // 指定的顶点ä¸å­˜åœ¨ + } + + head = LocateVex(*G, w); // 获å–顶点w在顶点集中的ä½ç½® + if(head == -1) { + return ERROR; // 指定的顶点ä¸å­˜åœ¨ + } + + // æ‹’ç»çޝ + if(tail == head) { + return ERROR; + } + + // 如果边/å¼§ä¸Šå­˜åœ¨é™„åŠ ä¿¡æ¯ + if(IncInfo) { + va_start(ap, w); // 在wåŽæŸ¥è¯¢é¦–个å¯å˜å‚æ•° + info = va_arg(ap, InfoType*); // 获å–é™„åŠ ä¿¡æ¯ + va_end(ap); + } + + /* 接下æ¥ï¼Œéœ€è¦æŸ¥æ‰¾åˆé€‚çš„æ’å…¥ä½ç½® */ + + for(count = 0; count < 2; count++) { + pre = NULL; + // 指å‘以tail为尾的首æ¡è¾¹/å¼§ + r = G->vertices[tail].firstarc; + while(r != NULL && r->adjvex < head) { + pre = r; + r = r->nextarc; + } + + // é‡åˆ°äº†ç›¸åŒä½ç½®çš„结点 + if(r != NULL && r->adjvex == head) { + r->info = info; // å¤ç”¨è¯¥ç»“点 + overlay = TRUE; // å‘生了覆盖 + } else { + if(pre == NULL) { + G->vertices[tail].firstarc = newArcNodePtr(head, r, info); + } else { + pre->nextarc = newArcNodePtr(head, r, info); + } + } + + // 如果当å‰å›¾/网是无å‘的,需è¦è€ƒè™‘对称性 + if((G->kind == UDG || G->kind == UDN) && tail != head) { + // 颠倒iå’Œj + k = tail; + tail = head; + head = k; + } else { + break; // 如果是有å‘的,å¯ä»¥ç»“æŸäº† + } + } + + // 在éžè¦†ç›–的情形下,æ‰è€ƒè™‘æ›´æ–°è¾¹/å¼§çš„æ•°é‡ + if(!overlay) { + (*G).arcnum++; // ä¸è®ºæœ‰å‘æ— å‘,边/å¼§æ•°åªå¢žä¸€ + } + + return OK; +} + +/* + * 以图形化形å¼è¾“出当å‰ç»“æž„ + */ +void PrintGraph(ALGraph G) { + int i; + ArcNode* p; + + if(G.vexnum == 0) { + printf("空图,无需打å°ï¼\n"); + return; + } + + printf("当å‰å›¾/ç½‘åŒ…å« %2d 个顶点, %2d æ¡è¾¹/å¼§...\n", G.vexnum, G.arcnum); + + for(i = 0; i < G.vexnum; i++) { + printf("%c ===> ", G.vertices[i].data); + + p = G.vertices[i].firstarc; + while(p != NULL) { + if(IncInfo == 0) { + printf("%c ", G.vertices[p->adjvex].data); + + // 对于网,会从其附加信æ¯ä¸­èŽ·å–到æƒå€¼ + } else { + printf("%c[%2d] ", G.vertices[p->adjvex].data, p->info->weight); + } + + p = p->nextarc; + + if(p != NULL) { + printf("- "); + } + } + + printf("\n"); + } +} diff --git a/CLion/ExerciseBook/07.22-07.23/ALGraph.h b/CLion/ExerciseBook/07.22-07.23/ALGraph.h new file mode 100644 index 0000000..74e2809 --- /dev/null +++ b/CLion/ExerciseBook/07.22-07.23/ALGraph.h @@ -0,0 +1,150 @@ +/*================== + * 图的邻接表存储表示 + ===================*/ + +#ifndef ALGRAPH_H +#define ALGRAPH_H + +#include +#include // æä¾›memsetã€strcmp 原型 +#include // æä¾›å®va_listã€va_startã€va_argã€va_end +#include // æä¾›mallocã€reallocã€freeã€exit原型 +#include "Status.h" //**â–²01 绪论**// +#include "LinkQueue.h" //**â–²03 栈和队列**// + +/* + * 注: + * + * 通常æ¥è®²ï¼Œæ— æƒå›¾è¢«ç®€ç§°ä¸ºã€å›¾ã€‘,有æƒå›¾è¢«ç®€ç§°ä¸ºã€ç½‘】。 + * æ— å‘图/网中的顶点关系被称为ã€è¾¹ã€‘,有å‘图/网中的顶点关系被称为ã€å¼§ã€‘,并区分弧头与弧尾。 + * 实际表述中,未必会严格éµå®ˆä»¥ä¸Šå‘½å。 + * + * 当å‰ç»“构适åˆå­˜å‚¨è¾¹/弧比较稀ç–的图/网。 + * + * ★ æ’入边/å¼§çš„ä¿¡æ¯æ—¶ï¼Œè¿™é‡Œçš„实现是按"å‡åº"æ’入的,这使得æ’入的弧是按"å‡åº"排列的。 + */ + + +/* å®å®šä¹‰ */ +#define MAX_VERTEX_NUM 26 // 最大顶点个数 + + +// 图的类型 +typedef enum { + DG, // 0-有å‘图 + DN, // 1-有å‘网(带æƒå€¼) + UDG, // 2-æ— å‘图 + UDN // 3-æ— å‘网(带æƒå€¼) +} GraphKind; + +// 顶点类型 +typedef char VertexType; + +// è¾¹/å¼§çš„ç›¸å…³é™„åŠ ä¿¡æ¯ +typedef struct { + /* + * 注: + * æ•™æä¸­ç»™å‡ºçš„结构åªè€ƒè™‘了无æƒå›¾ï¼Œè€Œæ²¡è€ƒè™‘有æƒå›¾(网)。 + * 这里为了把“网â€çš„æƒ…形也考虑进去,特在附加信æ¯ä¸­å¢žåŠ äº†"æƒé‡"属性。 + */ + int weight; +} InfoType; + +/* è¾¹/弧结点 */ +typedef struct ArcNode { + int adjvex; // 该弧所指å‘的顶点的ä½ç½® + struct ArcNode* nextarc; // 指å‘下一æ¡å¼§çš„æŒ‡é’ˆ + InfoType* info; // 弧的附加信æ¯ï¼Œé€šå¸¸å¿½ç•¥ +} ArcNode; + +// æ¯ä¸ªé“¾è¡¨çš„头结点 +typedef struct VNode { + VertexType data; // é¡¶ç‚¹ä¿¡æ¯ + ArcNode* firstarc; // 指å‘第一æ¡ä¾é™„该顶点的弧的指针 +} VNode; + +/* 图的邻接表存储表示类型定义 */ +typedef struct { + VNode vertices[MAX_VERTEX_NUM]; // 邻接表 + int vexnum, arcnum; // 图/网的顶点数和弧数 + GraphKind kind; // 图的类型标志 +} ALGraph; + + +// è¾¹/弧上是å¦å­˜åœ¨é™„åŠ ä¿¡æ¯ +extern Boolean IncInfo; + + +/* + * 创建 + * + *ã€å¤‡æ³¨ã€‘ + * + * æ•™æä¸­é»˜è®¤ä»ŽæŽ§åˆ¶å°è¯»å–æ•°æ®ã€‚ + * 这里为了方便测试,é¿å…æ¯æ¬¡è¿è¡Œéƒ½æ‰‹åŠ¨è¾“å…¥æ•°æ®ï¼Œ + * 因而å…许选择从预设的文件pathä¸­è¯»å–æµ‹è¯•æ•°æ®ã€‚ + * + * 如果需è¦ä»ŽæŽ§åˆ¶å°è¯»å–æ•°æ®ï¼Œåˆ™path为NULL,或path[kind]为""。 + * 如果需è¦ä»Žæ–‡ä»¶ä¸­è¯»å–æ•°æ®ï¼Œåˆ™éœ€è¦åœ¨path中填写文件åä¿¡æ¯ã€‚ + */ +Status CreateGraph(ALGraph* G, char* path[]); + +/* + * 构造有å‘图 + */ +static Status CreateDG(ALGraph* G); + +/* + * 录入边/å¼§çš„ç›¸å…³é™„åŠ ä¿¡æ¯ + */ +static void Input(ALGraph G, InfoType** info); + +/* + * 查找 + * + * 返回顶点u在图/网中的ä½ç½® + */ +int LocateVex(ALGraph G, VertexType u); + +/* + * å–值 + * + * 返回索引v处的顶点值 + */ +VertexType GetVex(ALGraph G, int v); + +/* + * 首个邻接点 + * + * 返回顶点v的首个邻接点 + */ +int FirstAdjVex(ALGraph G, VertexType v); + +/* + * 下一个邻接点 + * + * 返回顶点vçš„(相对于wçš„)下一个邻接点 + */ +int NextAdjVex(ALGraph G, VertexType v, VertexType w); + +/* + * 构造一个边/弧结点(ä»…é™å†…部使用) + */ +static ArcNode* newArcNodePtr(int adjvex, ArcNode* nextarc, InfoType* info); + +/* + * æ’入边/å¼§ + * + * 如果当å‰å›¾/网是无å‘的,则æ’入一æ¡å¼§éœ€è¦å¢žåŠ ä¸¤ä¸ªé¡¶ç‚¹å…³ç³»ï¼Œä½†å¼§çš„æ•°é‡åªå¢žä¸€ã€‚ + * 对于图/网æ¥è¯´ï¼Œå¯ä»¥åœ¨å¯å˜å‚数中列出边/弧的附加信æ¯ã€‚ + * + * æ³¨ï¼šæ­¤å¤„æŽ¥æ”¶çš„å‚æ•°ä¸ŽMGraph有些ä¸ä¸€æ ·ï¼šç½‘的附加信æ¯ä¸­åŒ…å«äº†å„æ¡è¾¹/å¼§çš„æƒå€¼ã€‚ + */ +Status InsertArc(ALGraph* G, VertexType v, VertexType w, ...); + +/* + * 以图形化形å¼è¾“出当å‰ç»“æž„ + */ +void PrintGraph(ALGraph G); + +#endif diff --git a/CLion/ExerciseBook/07.22-07.23/CMakeLists.txt b/CLion/ExerciseBook/07.22-07.23/CMakeLists.txt new file mode 100644 index 0000000..6342a55 --- /dev/null +++ b/CLion/ExerciseBook/07.22-07.23/CMakeLists.txt @@ -0,0 +1,12 @@ +# 包å«å…¬å…±åº“ +include_directories(${CMAKE_SOURCE_DIR}/Status) + +# 生æˆå¯æ‰§è¡Œæ–‡ä»¶ +add_executable(07.22-07.23 LinkQueue.h LinkQueue.c ALGraph.h ALGraph.c 07.22-07.23.c) +# 链接公共库 +target_link_libraries(07.22-07.23 Scanf_lib) + +# è®°å½•è¦æ‹·è´åˆ°*.exeç›®å½•ä¸‹çš„èµ„æºæ–‡ä»¶ +file(GLOB TestData TestData*.txt) +# å°†èµ„æºæ–‡ä»¶æ‹·è´åˆ°*.exe目录下,ä¸ç„¶æ— æ³•加载 +file(COPY ${TestData} DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) diff --git a/CLion/ExerciseBook/07.22-07.23/LinkQueue.c b/CLion/ExerciseBook/07.22-07.23/LinkQueue.c new file mode 100644 index 0000000..745613f --- /dev/null +++ b/CLion/ExerciseBook/07.22-07.23/LinkQueue.c @@ -0,0 +1,102 @@ +/*========================= + * 队列的链å¼å­˜å‚¨ç»“构(链队) + ==========================*/ + +#ifndef LINKQUEUE_C +#define LINKQUEUE_C + +#include "LinkQueue.h" //**â–²03 栈和队列**// + +/* + * åˆå§‹åŒ– + * + * 构造一个空的链队。 + * åˆå§‹åŒ–æˆåŠŸåˆ™è¿”å›žOK,å¦åˆ™è¿”回ERROR。 + * + *ã€æ³¨ã€‘ + * 这里的队列带有头结点 + */ +Status InitQueue(LinkQueue* Q) { + if(Q == NULL) { + return ERROR; + } + + (*Q).front = (*Q).rear = (QueuePtr) malloc(sizeof(QNode)); + if(!(*Q).front) { + exit(OVERFLOW); + } + + (*Q).front->next = NULL; + + return OK; +} + +/* + * 判空 + * + * 判断链队中是å¦åŒ…嫿œ‰æ•ˆæ•°æ®ã€‚ + * + * 返回值: + * TRUE : 链队为空 + * FALSE: 链队ä¸ä¸ºç©º + */ +Status QueueEmpty(LinkQueue Q) { + if(Q.front == Q.rear) { + return TRUE; + } else { + return FALSE; + } +} + +/* + * 入队 + * + * 将元素e添加到队列尾部。 + */ +Status EnQueue(LinkQueue* Q, QElemType e) { + QueuePtr p; + + if(Q == NULL || (*Q).front == NULL) { + return ERROR; + } + + p = (QueuePtr) malloc(sizeof(QNode)); + if(!p) { + exit(OVERFLOW); + } + + p->data = e; + p->next = NULL; + + (*Q).rear->next = p; + (*Q).rear = p; + + return OK; +} + +/* + * 出队 + * + * 移除队列头部的元素,将其存储到e中。 + */ +Status DeQueue(LinkQueue* Q, QElemType* e) { + QueuePtr p; + + if(Q == NULL || (*Q).front == NULL || (*Q).front == (*Q).rear) { + return ERROR; + } + + p = (*Q).front->next; + *e = p->data; + + (*Q).front->next = p->next; + if((*Q).rear == p) { + (*Q).rear = (*Q).front; + } + + free(p); + + return OK; +} + +#endif diff --git a/CLion/ExerciseBook/07.22-07.23/LinkQueue.h b/CLion/ExerciseBook/07.22-07.23/LinkQueue.h new file mode 100644 index 0000000..ec9c0e1 --- /dev/null +++ b/CLion/ExerciseBook/07.22-07.23/LinkQueue.h @@ -0,0 +1,64 @@ +/*========================= + * 队列的链å¼å­˜å‚¨ç»“构(链队) + ==========================*/ + +#ifndef LINKQUEUE_H +#define LINKQUEUE_H + +#include +#include // æä¾›mallocã€reallocã€freeã€exit原型 +#include "Status.h" //**â–²01 绪论**// + +/* 链队元素类型定义 */ +typedef int QElemType; + +// 队列元素结构 +typedef struct QNode { + QElemType data; + struct QNode* next; +} QNode, * QueuePtr; + +// 队列结构 +typedef struct { + QueuePtr front; // 队头指针 + QueuePtr rear; // 队尾指针 +} LinkQueue; // 队列的链å¼å­˜å‚¨è¡¨ç¤º + + +/* + * åˆå§‹åŒ– + * + * 构造一个空的链队。 + * åˆå§‹åŒ–æˆåŠŸåˆ™è¿”å›žOK,å¦åˆ™è¿”回ERROR。 + * + *ã€æ³¨ã€‘ + * 这里的队列带有头结点 + */ +Status InitQueue(LinkQueue* Q); + +/* + * 判空 + * + * 判断链队中是å¦åŒ…嫿œ‰æ•ˆæ•°æ®ã€‚ + * + * 返回值: + * TRUE : 链队为空 + * FALSE: 链队ä¸ä¸ºç©º + */ +Status QueueEmpty(LinkQueue Q); + +/* + * 入队 + * + * 将元素e添加到队列尾部。 + */ +Status EnQueue(LinkQueue* Q, QElemType e); + +/* + * 出队 + * + * 移除队列头部的元素,将其存储到e中。 + */ +Status DeQueue(LinkQueue* Q, QElemType* e); + +#endif diff --git a/CLion/ExerciseBook/07.22-07.23/TestData_DG.txt b/CLion/ExerciseBook/07.22-07.23/TestData_DG.txt new file mode 100644 index 0000000..697827d --- /dev/null +++ b/CLion/ExerciseBook/07.22-07.23/TestData_DG.txt @@ -0,0 +1,6 @@ +图类型→0(有å‘图) +顶点数→6 +弧数→11 +弧是å¦å¸¦æœ‰å…¶ä»–ä¿¡æ¯â†’0 +顶点集→ã€A,B,C,D,E,F】 +弧的集åˆâ†’ã€A,C】ã€A,D】ã€B,D】ã€C,D】ã€C,E】ã€D,C】ã€E,A】ã€E,B】ã€E,F】ã€F,B】ã€F,D】 \ No newline at end of file diff --git a/CLion/ExerciseBook/07.24/07.24.c b/CLion/ExerciseBook/07.24/07.24.c new file mode 100644 index 0000000..7fc71c5 --- /dev/null +++ b/CLion/ExerciseBook/07.24/07.24.c @@ -0,0 +1,91 @@ +#include +#include "Status.h" //**â–²01 绪论**// +#include "SqStack.h" //**â–²03 栈和队列**// +#include "MGraph.h" //**â–²07 图**// + +// 访问标志数组,记录访问过的顶点 +static Boolean visited[MAX_VERTEX_NUM]; + + +/* + * 利用栈对有å‘强连通图进行深度优先é历, + * ä¹ é¢˜ä¸­æŒ‡å‡ºä¸æ‹˜æ³¥äºŽå…·ä½“çš„å›¾ç»“æž„ï¼Œä½†æ˜¯è¿™é‡Œä¾æ—§é‡‡ç”¨äº†é‚»æŽ¥çŸ©é˜µå­˜å‚¨çš„图作为示例。 + */ +Status Algo_7_24(MGraph G); + + +int main(int argc, char* argv[]) { + MGraph G; + + printf("████████ 创建并输出图...\n"); + { + char* path[4]; + + path[0] = "TestData_DG.txt"; + path[1] = ""; + path[2] = ""; + path[3] = ""; + + CreateGraph(&G, path); + PrintGraph(G); + printf("\n"); + } + + printf("████████ 深度优先é历图...\n"); + { + Algo_7_24(G); + printf("\n"); + } + + return 0; +} + + +/* + * 利用栈对有å‘强连通图进行深度优先é历, + * ä¹ é¢˜ä¸­æŒ‡å‡ºä¸æ‹˜æ³¥äºŽå…·ä½“çš„å›¾ç»“æž„ï¼Œä½†æ˜¯è¿™é‡Œä¾æ—§é‡‡ç”¨äº†é‚»æŽ¥çŸ©é˜µå­˜å‚¨çš„图作为示例。 + */ +Status Algo_7_24(MGraph G) { + SqStack S; + SElemType e; + int i; + + if(G.vexnum < 1) { + return ERROR; + } + + for(i = 0; i < G.vexnum; i++) { + visited[i] = FALSE; + } + + InitStack(&S); + + // 第一个顶点入栈 + Push(&S, 0); + visited[0] = TRUE; + printf("%c ", G.vexs[0]); + + while(!StackEmpty(S)) { + GetTop(S, &e); + + for(i = 0; i < G.vexnum; i++) { + if(G.arcs[e][i].adj!=0 && visited[i]==FALSE) { + Push(&S, i); + visited[i] = TRUE; + printf("%c ", G.vexs[i]); + + // 立刻跳出当å‰å¾ªçŽ¯ï¼Œè¿›è¡Œä¸‹ä¸€è½®æ·±åº¦æœå¯» + break; + } + } + + // 如果顶点e没有未访问的邻接点了,则将该顶点出栈 + if(i == G.vexnum) { + Pop(&S, &e); + } + } + + printf("\n"); + + return OK; +} diff --git a/CLion/ExerciseBook/07.24/07.24.png b/CLion/ExerciseBook/07.24/07.24.png new file mode 100644 index 0000000000000000000000000000000000000000..ff528b7b145bad37a63ed8525603b8a93b51006b GIT binary patch literal 12105 zcmb`tbzfD__dX0Fb!g=P(g=bcq(KlwQc9Y$=>`RkC`e05cPZUnn+B1RmXK}*x0X?my1!>^*zU%$hZ^)^)83R92KGfKkHG(9j5EWh7P6(9px69|q11sH8~7 zjt%-lw^fxEM=S25UV&b2nu#fhp`n$9Nb#c#y9vs-~qi%{x_J0Nw zdKV{b8yk3cQc3HicDpoD=eIZnyy!E`bb#RC;1w#9s#N85+A7)<1zmv-yfFHJWd`5` zR~0U{PoWx}N)M1ohX4Osumw^o&e*p_mhDe#^y_X?IC;Mk`6ys(N9Q!R%xbn7BrL%K`zQe=BOw{!=Ag+) zIpXrFu7vYWz3aP&7pHqgS2V6|@owAXj-PFHP{&168@h$j_jdS2-rsl-l3X%PvuI_# zK6khfTj&_%-#Rngm9B4f@ou9YH$}Wt*W%)CSlxx3(Bylz{2+Q`&ypI10cex;tiRDU z3hxDfiet#E_T2XLXM?`#LqEIzOADbN;N+!?PbU4TG|=7M9V(SMkH&}2@#f8&T}NWV zv9U2_fl*X6c}&~T(9m$M(uq)jISz>E$7rHy#4+Hke4UGQ?9k+1aBVELXe(gRf8Umj zJ@FnZ;vI|u?CNW53KO}UWj(IwRUd6{$9lRcKIc6+IB4l$TyE`F%>AOHD4)vdt=;~H z>t(%jeHj0q!J3J>hDP^-ji7Lfe2Vm3PmG9Nj3&DyU$Wx8Nb;aIi-3?TLJ~v@;9EB2 zVDhrJ`kwFp+99>Wlrr{)2Gj6wA-CUg+4J5)vR=asUwVaWZ0{civGsa$lzmtXbU=+! zrY001e#=!(3iBe4myJv|=@Q?cELAKh?&O`U*l~sPYandh5>3Tal^qcFZyN+Js&Z5D zp8XDKEa4+tb)+wsf9d4|7leT}@iK7>bDPT%BQnPRgy-O@@Ao3ylDheq9doq$W&Ld# zd@+_+wHNM;fbUy5guO)$@5x4ctT@lwEvG%*1xB2LL8nf~5xS z-g+Yy#>XM|gf1WXgAQUDh%%ox>SqL3|abck; z_sV9gFb8_08MnqM8&xRI3&5!Q>tdpInaRjv&#Orou{!+IX#1kKgHJAcni~H`>kgA* z=ZgM2Ez)5{z{sasxCV=@{HpTus+`Ys}F`~WlHv9ZfU)JCj2_@euUmaL0< zoj0g&-P5}l(F-s*^!<2_98FmyFA>>Q&{D@_O?JA7<|)Gau+doY>=mpqT1iXI@}((2 z;Yc6YF2v_~LHs7>c||E4lxHcU=7UJ zTkExssecJL0?!guCyZ35f+yE;8$)zL6J3m2>8OUrI8%X1u{(qKdnP;aecbaw4V}6qkcfG$wxr%$4l@*~Ff}^+kgYcc z-oI=q-tOt!kmE4VN9<26*ZWEhaWzo5f3`{`)`={xvJbFS58tYLZE0zDr{FHXq~HA{ zZU4AwK_)T{)}IOX^=h{aiXNJB-#*Xtfg!ZuRGF2@cqFmCK7We}Dh%7V$UB@5F^8K;po!kF_gjF+_$}Yq6+q!8lHX;tD{` zB>lV@677Io^H<$rwKl?O^~jt^btS5wDb&F->ajzC#dMrLAJSr>AR6N z<>loq;R;SUsYtl~S6$%b+y&&vm`yJRS-LAN4=F{gL&|_QYuKyTui4_Ca3p=-oYMeK zTt81(mNy1%6Xtg*L6zcrzG|@IiR0~%u7am$+P^~i-M_u@yJNO{@}w#XgSpVx*LP

=-L3vq)SMxuB^K0oUTLHW6vn{7_@Ts3NF%tv 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 D-4|Tz literal 0 HcmV?d00001 diff --git a/CLion/ExerciseBook/07.24/CMakeLists.txt b/CLion/ExerciseBook/07.24/CMakeLists.txt new file mode 100644 index 0000000..1d9429a --- /dev/null +++ b/CLion/ExerciseBook/07.24/CMakeLists.txt @@ -0,0 +1,12 @@ +# 包å«å…¬å…±åº“ +include_directories(${CMAKE_SOURCE_DIR}/Status) + +# 生æˆå¯æ‰§è¡Œæ–‡ä»¶ +add_executable(07.24 SqStack.h SqStack.c MGraph.h MGraph.c 07.24.c) +# 链接公共库 +target_link_libraries(07.24 Scanf_lib) + +# è®°å½•è¦æ‹·è´åˆ°*.exeç›®å½•ä¸‹çš„èµ„æºæ–‡ä»¶ +file(GLOB TestData TestData*.txt) +# å°†èµ„æºæ–‡ä»¶æ‹·è´åˆ°*.exe目录下,ä¸ç„¶æ— æ³•加载 +file(COPY ${TestData} DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) diff --git a/CLion/ExerciseBook/07.24/MGraph.c b/CLion/ExerciseBook/07.24/MGraph.c new file mode 100644 index 0000000..18fca40 --- /dev/null +++ b/CLion/ExerciseBook/07.24/MGraph.c @@ -0,0 +1,219 @@ +/*================================= + * 图的数组(邻接矩阵)存储表示 + * + * 包å«ç®—法: 7.1ã€7.2ã€7.4ã€7.5ã€7.6 + ==================================*/ + +#include "MGraph.h" //**â–²07 图**// + +// 录入数æ®çš„æºæ–‡ä»¶ï¼›fp为null时,说明需è¦ä»ŽæŽ§åˆ¶å°å½•å…¥ +static FILE* fp = NULL; + +/* + * IncInfo指示该图/网的边/弧上是å¦å­˜åœ¨é™„加信æ¯ã€‚ + * 如果其值ä¸ä¸º0,则表示无附加信æ¯ï¼Œå¦åˆ™ï¼Œè¡¨ç¤ºå­˜åœ¨é™„加信æ¯ã€‚ + */ +Boolean IncInfo = FALSE; + +// 访问标志数组,记录访问过的顶点 +static Boolean visited[MAX_VERTEX_NUM]; + +// 函数å˜é‡ +static Status (* VisitFunc)(VertexType e); + + +/* + * ████████ 算法7.1 ████████ + * + * 创建图/表 + * + *ã€å¤‡æ³¨ã€‘ + * + * æ•™æä¸­é»˜è®¤ä»ŽæŽ§åˆ¶å°è¯»å–æ•°æ®ã€‚ + * 这里为了方便测试,é¿å…æ¯æ¬¡è¿è¡Œéƒ½æ‰‹åŠ¨è¾“å…¥æ•°æ®ï¼Œ + * 因而å…许选择从预设的文件pathä¸­è¯»å–æµ‹è¯•æ•°æ®ã€‚ + * + * 如果需è¦ä»ŽæŽ§åˆ¶å°è¯»å–æ•°æ®ï¼Œåˆ™path为NULL,或path[kind]为""。 + * 如果需è¦ä»Žæ–‡ä»¶ä¸­è¯»å–æ•°æ®ï¼Œåˆ™éœ€è¦åœ¨path中填写文件åä¿¡æ¯ã€‚ + */ +Status CreateGraph(MGraph* G, char* path[]) { + int readFromConsole; // 是å¦ä»ŽæŽ§åˆ¶å°è¯»å–æ•°æ® + int kind; + Status flag; + + // ★★★此处固定为有å‘图 + kind = 0; + + // 如果没有文件路径信æ¯ï¼Œåˆ™ä»ŽæŽ§åˆ¶å°è¯»å–输入 + readFromConsole = (path == NULL) || strcmp(path[kind], "") == 0; + + // 需è¦ä»Žæ–‡ä»¶è¯»å– + if(readFromConsole) { + (*G).kind = kind; // 记录图/网的类型 + } else { + // æ‰“å¼€æ–‡ä»¶ï¼Œå‡†å¤‡è¯»å–æµ‹è¯•æ•°æ® + fp = fopen(path[kind], "r"); + if(fp == NULL) { + return ERROR; + } + + // 录入图的类型 + ReadData(fp, "%d", &((*G).kind)); + } + + // éšæœºåˆ›å»ºæœ‰å‘图/网或无å‘图/ç½‘çš„ä¸€ç§ + switch((*G).kind) { + case DG: + flag = CreateDG(G); + break; + default: + flag = ERROR; + break; + } + + if(fp != NULL) { + fclose(fp); + fp = NULL; + } + + return flag; +} + +/* + * 构造有å‘图 + */ +static Status CreateDG(MGraph* G) { + int i, j, k; + ArcCell arcs = {0, NULL}; // 有å‘å›¾æ¯æ¡è¾¹çš„åˆå§‹å€¼ + VertexType v1, v2; + + if(fp == NULL) { + printf("请输入有å‘图的顶点数:"); + scanf("%d", &((*G).vexnum)); + printf("请输入有å‘图的弧数:"); + scanf("%d", &((*G).arcnum)); + printf("该有å‘图的弧上是å¦åŒ…å«å…¶ä»–附加信æ¯(0-ä¸åŒ…å«â”‚1-包å«):"); + scanf("%d", &IncInfo); + + // 录入顶点集 + printf("请录入 %d 个顶点,ä¸åŒé¡¶ç‚¹ä¹‹é—´ç”¨ç©ºæ ¼éš”开:", (*G).vexnum); + for(i = 0; i < (*G).vexnum; i++) { + // 跳过空白,寻找下一个"å¯è¯»"ç¬¦å· + skipBlank(stdin); + scanf("%c", &((*G).vexs[i])); + } + } else { + ReadData(fp, "%d", &((*G).vexnum)); // 录入顶点数 + ReadData(fp, "%d", &((*G).arcnum)); // 录入弧数 + ReadData(fp, "%d", &IncInfo); // 判断弧上是å¦åŒ…å«é™„åŠ ä¿¡æ¯ + + // 录入顶点集 + for(i = 0; i < (*G).vexnum; i++) { + // 跳过空白,寻找下一个"å¯è¯»"ç¬¦å· + skipBlank(fp); + ReadData(fp, "%c", &((*G).vexs[i])); + } + } + + // åˆå§‹åŒ–有å‘图的邻接矩阵 + for(i = 0; i < (*G).vexnum; i++) { + for(j = 0; j < (*G).vexnum; j++) { + (*G).arcs[i][j] = arcs; + } + } + + // 仅在控制å°å½•å…¥ä¿¡æ¯æ—¶è¾“出此æç¤º + if(fp == NULL && (*G).arcnum != 0) { + printf("请为有å‘图便¬¡å½•å…¥ %d æ¡å¼§çš„ä¿¡æ¯ï¼Œé¡¶ç‚¹ä¹‹é—´ç”¨ç©ºæ ¼éš”开:\n", (*G).arcnum); + } + + // å½•å…¥å¼§çš„ä¿¡æ¯ + for(k = 0; k < (*G).arcnum; k++) { + if(fp == NULL) { + printf("第 %2d æ¡å¼§ï¼š", k + 1); + skipBlank(stdin); // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + scanf("%c", &v1); + skipBlank(stdin); // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + scanf("%c", &v2); + } else { + // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + skipBlank(fp); + ReadData(fp, "%c%c", &v1, &v2); + } + + i = LocateVex(*G, v1); // 获å–顶点v1在顶点集中的ä½ç½® + j = LocateVex(*G, v2); // 获å–顶点v2在顶点集中的ä½ç½® + + // 将指定的顶点关系设置为1,指示这两个顶点是直接连接的(注:这里没有验è¯ä¸‹æ ‡æ˜¯å¦è¶Šç•Œ) + (*G).arcs[i][j].adj = 1; + + // 如果需è¦å½•å…¥å¼§çš„å…¶ä»–é™„åŠ ä¿¡æ¯ + if(IncInfo) { + // 最åŽå½•å…¥é™„åŠ ä¿¡æ¯ + Input(*G, &((*G).arcs[i][j].info)); + } + } + + // ä»Žæ–‡ä»¶ä¸­è¯»å–æ•°æ®æ—¶ï¼Œæœ€åŽå…¶å®žåº”当判断一下是å¦è¯»åˆ°äº†è¶³å¤Ÿçš„ä¿¡æ¯ + return OK; +} + +/* + * 录入边/å¼§çš„ç›¸å…³é™„åŠ ä¿¡æ¯ + */ +static void Input(MGraph G, InfoType** info) { + //录入边/弧的信æ¯ï¼Œæœ¬æµ‹è¯•涉åŠåˆ°çš„è¾¹/å¼§é»˜è®¤æ— å…¶ä»–é™„åŠ ä¿¡æ¯ +} + +/* + * 查找 + * + * 返回顶点u在图/网中的ä½ç½® + */ +int LocateVex(MGraph G, VertexType u) { + int i; + + for(i = 0; i < G.vexnum; i++) { + if(G.vexs[i] == u) { + return i; + } + } + + return -1; +} + +/* + * 以图形化形å¼è¾“出当å‰ç»“æž„ + * + * 注:在图/网中,使用"-"æ¥è¡¨ç¤ºä¸¤é¡¶ç‚¹ä¸ç›´æŽ¥è¿žé€š + */ +void PrintGraph(MGraph G) { + int i, j; + + if(G.vexnum == 0) { + printf("空图,无需打å°ï¼\n"); + return; + } + + printf("当å‰å›¾/ç½‘åŒ…å« %2d 个顶点, %2d æ¡è¾¹/å¼§...\n", G.vexnum, G.arcnum); + + printf(" "); + for(i = 0; i < G.vexnum; i++) { + printf(" %c", G.vexs[i]); + } + printf("\n"); + + for(i = 0; i < G.vexnum; i++) { + printf("%c ", G.vexs[i]); + + for(j = 0; j < G.vexnum; j++) { + if(((G.kind == DG || G.kind == UDG) && G.arcs[i][j].adj == 0) || ((G.kind == DN || G.kind == UDN) && G.arcs[i][j].adj == INFINITE)) { + printf(" -"); + } else { + printf("%3d", G.arcs[i][j].adj); + } + } + + printf("\n"); + } +} diff --git a/CLion/ExerciseBook/07.24/MGraph.h b/CLion/ExerciseBook/07.24/MGraph.h new file mode 100644 index 0000000..8d5fa76 --- /dev/null +++ b/CLion/ExerciseBook/07.24/MGraph.h @@ -0,0 +1,112 @@ +/*================================= + * 图的数组(邻接矩阵)存储表示 + * + * 包å«ç®—法: 7.1ã€7.2ã€7.4ã€7.5ã€7.6 + ==================================*/ + +#ifndef MGRAPH_H +#define MGRAPH_H + +#include +#include // æä¾›å®INT_MAX +#include // æä¾›memsetã€strcmp 原型 +#include // æä¾›å®va_listã€va_startã€va_argã€va_end +#include "Status.h" //**â–²01 绪论**// + +/* + * 注: + * + * 通常æ¥è®²ï¼Œæ— æƒå›¾è¢«ç®€ç§°ä¸ºã€å›¾ã€‘,有æƒå›¾è¢«ç®€ç§°ä¸ºã€ç½‘】。 + * æ— å‘图/网中的顶点关系被称为ã€è¾¹ã€‘,有å‘图/网中的顶点关系被称为ã€å¼§ã€‘,并区分弧头与弧尾。 + * 实际表述中,未必会严格éµå®ˆä»¥ä¸Šå‘½å。 + */ + +/* å®å®šä¹‰ */ +#define INFINITE INT_MAX // 最大值,用æ¥è¡¨ç¤ºç½‘中的两个顶点ä¸ç›´æŽ¥è¿žæŽ¥ +#define MAX_VERTEX_NUM 26 // 最大顶点个数 + + +// 图的类型 +typedef enum { + DG, // 0-有å‘图 + DN, // 1-有å‘网(带æƒå€¼) + UDG, // 2-æ— å‘图 + UDN // 3-æ— å‘网(带æƒå€¼) +} GraphKind; + +// 顶点类型 +typedef char VertexType; + +/* + * 顶点关系类型 + * + * 在无æƒå›¾ä¸­ï¼Œè¯¥å€¼é€šå¸¸ä¸º0或1,表示两顶点是å¦ç›´æŽ¥è¿žé€šï¼› + * 在有æƒå›¾ä¸­ï¼Œè¯¥å€¼é€šå¸¸ä¸ºæƒå€¼ã€‚ + */ +typedef int VRType; + +// è¾¹çš„ç›¸å…³é™„åŠ ä¿¡æ¯ +typedef struct { + // 如果有的è¯ï¼ŒåŽç»­ä¼šæ·»åŠ ç›¸åº”çš„å±žæ€§ +} InfoType; + +// è¾¹çš„ç±»åž‹ï¼Œæ¯æ¡è¾¹ä¸Šå¯èƒ½æœ‰é™„加信æ¯info +typedef struct ArcCell { + VRType adj; // 顶点关系,在有æƒå›¾è·Ÿæ— æƒå›¾ä¸­çš„å«ä¹‰ä¸åŒ + InfoType* info; // 边的附加信æ¯ï¼Œé€šå¸¸å¿½ç•¥ +} ArcCell; + +/* 图/网的数组(邻接矩阵)存储表示类型定义 */ +typedef struct { + VertexType vexs[MAX_VERTEX_NUM]; // 顶点å‘é‡ + ArcCell arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; // 邻接矩阵 + int vexnum, arcnum; // 图/网的顶点数和弧数 + GraphKind kind; // 图的类型标志 +} MGraph; + + +// è¾¹/弧上是å¦å­˜åœ¨é™„åŠ ä¿¡æ¯ +extern Boolean IncInfo; + + +/* + * ████████ 算法7.1 ████████ + * + * 创建 + * + *ã€å¤‡æ³¨ã€‘ + * + * æ•™æä¸­é»˜è®¤ä»ŽæŽ§åˆ¶å°è¯»å–æ•°æ®ã€‚ + * 这里为了方便测试,é¿å…æ¯æ¬¡è¿è¡Œéƒ½æ‰‹åŠ¨è¾“å…¥æ•°æ®ï¼Œ + * 因而å…许选择从预设的文件pathä¸­è¯»å–æµ‹è¯•æ•°æ®ã€‚ + * + * 如果需è¦ä»ŽæŽ§åˆ¶å°è¯»å–æ•°æ®ï¼Œåˆ™path为NULL,或path[kind]为""。 + * 如果需è¦ä»Žæ–‡ä»¶ä¸­è¯»å–æ•°æ®ï¼Œåˆ™éœ€è¦åœ¨path中填写文件åä¿¡æ¯ã€‚ + */ +Status CreateGraph(MGraph* G, char* path[]); + +/* + * 构造有å‘图 + */ +static Status CreateDG(MGraph* G); + +/* + * å½•å…¥è¾¹çš„ç›¸å…³é™„åŠ ä¿¡æ¯ + */ +static void Input(MGraph G, InfoType** info); + +/* + * 查找 + * + * 返回顶点u在图/网中的ä½ç½® + */ +int LocateVex(MGraph G, VertexType u); + +/* + * 以图形化形å¼è¾“出当å‰ç»“æž„ + * + * 注:在图/网中,使用"-"æ¥è¡¨ç¤ºä¸¤é¡¶ç‚¹ä¸ç›´æŽ¥è¿žé€š + */ +void PrintGraph(MGraph G); + +#endif diff --git a/CLion/ExerciseBook/07.24/SqStack.c b/CLion/ExerciseBook/07.24/SqStack.c new file mode 100644 index 0000000..c7e31cc --- /dev/null +++ b/CLion/ExerciseBook/07.24/SqStack.c @@ -0,0 +1,106 @@ +/*========================= + * 栈的顺åºå­˜å‚¨ç»“æž„ï¼ˆé¡ºåºæ ˆï¼‰ + ==========================*/ + +#include "SqStack.h" //**â–²03 栈和队列**// + +/* + * åˆå§‹åŒ– + * + * 构造一个空栈。åˆå§‹åŒ–æˆåŠŸåˆ™è¿”å›žOK,å¦åˆ™è¿”回ERROR。 + */ +Status InitStack(SqStack* S) { + if(S == NULL) { + return ERROR; + } + + (*S).base = (SElemType*) malloc(STACK_INIT_SIZE * sizeof(SElemType)); + if((*S).base == NULL) { + exit(OVERFLOW); + } + + (*S).top = (*S).base; + (*S).stacksize = STACK_INIT_SIZE; + + return OK; +} + +/* + * 判空 + * + * åˆ¤æ–­é¡ºåºæ ˆä¸­æ˜¯å¦åŒ…嫿œ‰æ•ˆæ•°æ®ã€‚ + * + * 返回值: + * TRUE : é¡ºåºæ ˆä¸ºç©º + * FALSE: é¡ºåºæ ˆä¸ä¸ºç©º + */ +Status StackEmpty(SqStack S) { + if(S.top == S.base) { + return TRUE; + } else { + return FALSE; + } +} + +/* + * å–值 + * + * 返回栈顶元素,并用e接收。 + */ +Status GetTop(SqStack S, SElemType* e) { + if(S.base == NULL || S.top == S.base) { + return 0; + } + + // ä¸ä¼šæ”¹å˜æ ˆä¸­å…ƒç´  + *e = *(S.top - 1); + + return OK; +} + +/* + * 入栈 + * + * 将元素e压入到栈顶。 + */ +Status Push(SqStack* S, SElemType e) { + if(S == NULL || (*S).base == NULL) { + return ERROR; + } + + // 栈满时,追加存储空间 + if((*S).top - (*S).base >= (*S).stacksize) { + (*S).base = (SElemType*) realloc((*S).base, ((*S).stacksize + STACKINCREMENT) * sizeof(SElemType)); + if((*S).base == NULL) { + exit(OVERFLOW); // 存储分é…失败 + } + + (*S).top = (*S).base + (*S).stacksize; + (*S).stacksize += STACKINCREMENT; + } + + // 进栈先赋值,栈顶指针å†è‡ªå¢ž + *(S->top++) = e; + + return OK; +} + +/* + * 出栈 + * + * 将栈顶元素弹出,并用e接收。 + */ +Status Pop(SqStack* S, SElemType* e) { + if(S == NULL || (*S).base == NULL) { + return ERROR; + } + + if((*S).top == (*S).base) { + return ERROR; + } + + // 出栈栈顶指针先递å‡ï¼Œå†èµ‹å€¼ + *e = *(--(*S).top); + + return OK; +} diff --git a/CLion/ExerciseBook/07.24/SqStack.h b/CLion/ExerciseBook/07.24/SqStack.h new file mode 100644 index 0000000..f936b91 --- /dev/null +++ b/CLion/ExerciseBook/07.24/SqStack.h @@ -0,0 +1,66 @@ +/*========================= + * 栈的顺åºå­˜å‚¨ç»“æž„ï¼ˆé¡ºåºæ ˆï¼‰ + ==========================*/ + +#ifndef SQSTACK_H +#define SQSTACK_H + +#include +#include // æä¾›mallocã€reallocã€freeã€exit原型 +#include "Status.h" //**â–²01 绪论**// + +/* å®å®šä¹‰ */ +#define STACK_INIT_SIZE 100 // é¡ºåºæ ˆå­˜å‚¨ç©ºé—´çš„åˆå§‹åˆ†é…é‡ +#define STACKINCREMENT 10 // é¡ºåºæ ˆå­˜å‚¨ç©ºé—´çš„分é…å¢žé‡ + +/* é¡ºåºæ ˆå…ƒç´ ç±»åž‹å®šä¹‰ */ +typedef int SElemType; + +// é¡ºåºæ ˆå…ƒç´ ç»“æž„ +typedef struct { + SElemType* base; // 栈底指针 + SElemType* top; // 栈顶指针 + int stacksize; // 当å‰å·²åˆ†é…的存储空间,以元素为å•ä½ +} SqStack; + + +/* + * åˆå§‹åŒ– + * + * 构造一个空栈。åˆå§‹åŒ–æˆåŠŸåˆ™è¿”å›žOK,å¦åˆ™è¿”回ERROR。 + */ +Status InitStack(SqStack* S); + +/* + * 判空 + * + * åˆ¤æ–­é¡ºåºæ ˆä¸­æ˜¯å¦åŒ…嫿œ‰æ•ˆæ•°æ®ã€‚ + * + * 返回值: + * TRUE : é¡ºåºæ ˆä¸ºç©º + * FALSE: é¡ºåºæ ˆä¸ä¸ºç©º + */ +Status StackEmpty(SqStack S); + +/* + * å–值 + * + * 返回栈顶元素,并用e接收。 + */ +Status GetTop(SqStack S, SElemType* e); + +/* + * 入栈 + * + * 将元素e压入到栈顶。 + */ +Status Push(SqStack* S, SElemType e); + +/* + * 出栈 + * + * 将栈顶元素弹出,并用e接收。 + */ +Status Pop(SqStack* S, SElemType* e); + +#endif diff --git a/CLion/ExerciseBook/07.24/TestData_DG.txt b/CLion/ExerciseBook/07.24/TestData_DG.txt new file mode 100644 index 0000000..248d266 --- /dev/null +++ b/CLion/ExerciseBook/07.24/TestData_DG.txt @@ -0,0 +1,6 @@ +图类型→0(有å‘图) +顶点数→10 +弧数→14 +弧是å¦å¸¦æœ‰å…¶ä»–ä¿¡æ¯â†’0 +顶点集→ã€A,B,C,D,E,F,G,H,I,J】 +弧的集åˆâ†’ã€A,C】ã€C,D】ã€D,A】ã€A,B】ã€D,E】ã€E,F】ã€E,H】ã€F,D】ã€F,G】ã€G,H】ã€H,E】ã€B,J】ã€J,I】ã€I,B】 \ No newline at end of file diff --git a/CLion/ExerciseBook/07.25/07.25.c b/CLion/ExerciseBook/07.25/07.25.c new file mode 100644 index 0000000..d2e817a --- /dev/null +++ b/CLion/ExerciseBook/07.25/07.25.c @@ -0,0 +1,134 @@ +#include +#include "Graph.h" + +// 访问标志 +typedef enum { + UnVisited, // 未访问 + Visited, // 已访问 + InPath, // 在路径上 +} FLAG; + +// 访问标志数组,记录访问过的顶点 +static FLAG flags[MAX_VERTEX_NUM]; + + +/* + * 找出有å‘图中的回路 + */ +void Algo_7_25(Graph G); + +/* + * 从start顶点开始查找回路。 + * + * path用æ¥å­˜å‚¨è·¯è¿‡çš„顶点,path[0]存储path中的顶点数é‡ã€‚ + * + * 如果找到回路,返回回路起始顶点的åºå·ï¼› + * 如果没找到回路,则返回-1。 + */ +int Circuit_7_25(Graph G, int start, int path[MAX_VERTEX_NUM + 1]); + + +int main(int argc, char* argv[]) { + Graph G; + + printf("████████ 创建并输出图...\n"); + { + char* path = "TestData_DG.txt"; + + CreateGraph(&G, path); + PrintGraph(G); + printf("\n"); + } + + printf("████████ 查找图中的回路...\n"); + { + Algo_7_25(G); + printf("\n"); + } + + return 0; +} + + +/* + * 找出有å‘图中的回路 + */ +void Algo_7_25(Graph G) { + int i, w = -1; + int path[MAX_VERTEX_NUM + 1]; // 0å·å•元用æ¥è®°å½•pathä¸­å­˜å‚¨çš„é¡¶ç‚¹æ•°é‡ + + // 把所有顶点标记为未访问 + for(i = 0; i < G.vexnum; i++) { + flags[i] = UnVisited; + } + + path[0] = 0; + + for(i = 0; i < G.vexnum; i++) { + w = Circuit_7_25(G, i, path); + + if(w != -1) { + break; // 如果找到了任æ„一æ¡å›žè·¯ï¼Œè·³å‡ºå¾ªçޝ + } + } + + if(w == -1) { + printf("给定的有å‘图中ä¸å­˜åœ¨å›žè·¯ï¼\n"); + return; + } + + printf("有å‘图中找到的首æ¡å›žè·¯ä¸ºï¼š"); + for(i = 1; path[i] != w; i++) { + // 寻找回路起点 + } + // 找到了回路起点 + if(path[i] == w) { + while(i <= path[0]) { + printf("%c -> ", G.vexs[path[i]]); + i++; + } + printf("%c\n", G.vexs[w]); + } +} + +/* + * 从start顶点开始查找回路。 + * + * path用æ¥å­˜å‚¨è·¯è¿‡çš„顶点,path[0]存储path中的顶点数é‡ã€‚ + * + * 如果找到回路,返回回路起始顶点的åºå·ï¼› + * 如果没找到回路,则返回-1。 + */ +int Circuit_7_25(Graph G, int start, int path[MAX_VERTEX_NUM]) { + int i; + int v, w; + + path[0]++; + path[path[0]] = start; + flags[start] = InPath; // 标记该顶点已进入路径 + + // é历顶点start的邻接点 + for(i = G.fst[start]; i <= G.lst[start]; i++) { + v = G.s[i]; // 获å–邻接点åºå· + + // 如果é‡åˆ°äº†å·²åœ¨è·¯å¾„中的邻接点,说明出现了回路 + if(flags[v] == InPath) { + return v; + + // 忽略已访问的邻接点 + } else if(flags[v] == Visited) { + continue; + } else { + w = Circuit_7_25(G, v, path); + if(w != -1) { + return w; + } + } + } + + // 从路径中移除该顶点,并将其状æ€é™çº§ä¸º"已访问" + path[0]--; + flags[start] = Visited; + + return -1; +} diff --git a/CLion/ExerciseBook/07.25/07.25.png b/CLion/ExerciseBook/07.25/07.25.png new file mode 100644 index 0000000000000000000000000000000000000000..d902081ad316df7ba5f6b9180d24562b0c8d4b2d GIT binary patch literal 8338 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 ARR910 literal 0 HcmV?d00001 diff --git a/CLion/ExerciseBook/07.25/CMakeLists.txt b/CLion/ExerciseBook/07.25/CMakeLists.txt new file mode 100644 index 0000000..eec8910 --- /dev/null +++ b/CLion/ExerciseBook/07.25/CMakeLists.txt @@ -0,0 +1,12 @@ +# 包å«å…¬å…±åº“ +include_directories(${CMAKE_SOURCE_DIR}/Status) + +# 生æˆå¯æ‰§è¡Œæ–‡ä»¶ +add_executable(07.25 Graph.h Graph.c 07.25.c) +# 链接公共库 +target_link_libraries(07.25 Scanf_lib) + +# è®°å½•è¦æ‹·è´åˆ°*.exeç›®å½•ä¸‹çš„èµ„æºæ–‡ä»¶ +file(GLOB TestData TestData*.txt) +# å°†èµ„æºæ–‡ä»¶æ‹·è´åˆ°*.exe目录下,ä¸ç„¶æ— æ³•加载 +file(COPY ${TestData} DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) diff --git a/CLion/ExerciseBook/07.25/Graph.c b/CLion/ExerciseBook/07.25/Graph.c new file mode 100644 index 0000000..4b727c6 --- /dev/null +++ b/CLion/ExerciseBook/07.25/Graph.c @@ -0,0 +1,164 @@ +/*================================= + * 由题7.25çš„æè¿°åˆ›å»ºçš„ä¸€ç§æœ‰å‘图结构 + ==================================*/ + +#include "Graph.h" + +// 录入数æ®çš„æºæ–‡ä»¶ï¼›fp为null时,说明需è¦ä»ŽæŽ§åˆ¶å°å½•å…¥ +static FILE* fp = NULL; + + +/* + * 创建有å‘图 + * + * path为NULL或为""时,从控制å°è¯»å–图的åˆå§‹åŒ–ä¿¡æ¯ã€‚ + * å¦åˆ™ï¼Œä»Žé¢„设的文件中读å–图的åˆå§‹åŒ–ä¿¡æ¯ã€‚ + */ +Status CreateGraph(Graph* G, char* path) { + int readFromConsole; // 是å¦ä»ŽæŽ§åˆ¶å°è¯»å–æ•°æ® + + // 如果没有文件路径信æ¯ï¼Œåˆ™ä»ŽæŽ§åˆ¶å°è¯»å–输入 + readFromConsole = path == NULL || strcmp(path, "") == 0; + + // 需è¦ä»Žæ–‡ä»¶è¯»å– + if(!readFromConsole) { + // æ‰“å¼€æ–‡ä»¶ï¼Œå‡†å¤‡è¯»å–æµ‹è¯•æ•°æ® + fp = fopen(path, "r"); + if(fp == NULL) { + return ERROR; + } + } + + Create(G); + + if(fp != NULL) { + fclose(fp); + fp = NULL; + } + + return OK; +} + +/* + * 创建有å‘图的核心算法 + */ +static void Create(Graph* G) { + int i, j, k; + VertexType v1, v2; + Boolean adjs[MAX_VERTEX_NUM][MAX_VERTEX_NUM] = {FALSE}; // è®°å½•é‚»æŽ¥ç‚¹ä¿¡æ¯ + int cur; + + // 从控制å°è¯»å– + if(fp == NULL) { + printf("请输入有å‘图的顶点数:"); + scanf("%d", &((*G).vexnum)); + printf("请输入有å‘图的弧数:"); + scanf("%d", &((*G).arcnum)); + + // 录入顶点集 + printf("请录入 %d 个顶点,ä¸åŒé¡¶ç‚¹ä¹‹é—´ç”¨ç©ºæ ¼éš”开:", (*G).vexnum); + for(i = 0; i < (*G).vexnum; i++) { + // 跳过空白,寻找下一个"å¯è¯»"ç¬¦å· + skipBlank(stdin); + scanf("%c", &((*G).vexs[i])); + } + + // ä»Žæ–‡ä»¶è¯»å– + } else { + ReadData(fp, "%d", &((*G).vexnum)); // 录入顶点数 + ReadData(fp, "%d", &((*G).arcnum)); // 录入弧数 + + // 录入顶点集 + for(i = 0; i < (*G).vexnum; i++) { + // 跳过空白,寻找下一个"å¯è¯»"ç¬¦å· + skipBlank(fp); + ReadData(fp, "%c", &((*G).vexs[i])); + } + } + + // 仅在控制å°å½•å…¥ä¿¡æ¯æ—¶è¾“出此æç¤º + if(fp == NULL && (*G).arcnum != 0) { + printf("请为有å‘图便¬¡å½•å…¥ %d æ¡å¼§çš„ä¿¡æ¯ï¼Œé¡¶ç‚¹ä¹‹é—´ç”¨ç©ºæ ¼éš”开:\n", (*G).arcnum); + } + + // å½•å…¥å¼§çš„ä¿¡æ¯ + for(k = 0; k < (*G).arcnum; k++) { + if(fp == NULL) { + printf("第 %2d æ¡å¼§ï¼š", k + 1); + skipBlank(stdin); // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + scanf("%c", &v1); + skipBlank(stdin); // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + scanf("%c", &v2); + } else { + // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + skipBlank(fp); + ReadData(fp, "%c%c", &v1, &v2); + } + + i = LocateVex(*G, v1); // 获å–顶点v1在顶点集中的ä½ç½® + j = LocateVex(*G, v2); // 获å–顶点v2在顶点集中的ä½ç½® + + adjs[i][j] = TRUE; + } + + cur = 0; + + // è®°å½•é‚»æŽ¥ç‚¹ä¿¡æ¯ + for(i = 0; i < G->vexnum; i++) { + G->fst[i] = -1; + G->lst[i] = -2; + + for(j = 0; j < G->vexnum; j++) { + if(adjs[i][j] == TRUE) { + if(G->fst[i] == -1) { + G->fst[i] = cur; + } + + G->s[cur++] = j; // 存储åŽç»§é¡¶ç‚¹ä¿¡æ¯ + } + } + + if(G->fst[i] != -1) { + G->lst[i] = cur - 1; + } + } +} + +/* + * 查找 + * + * 返回顶点u在有å‘图中的ä½ç½® + */ +int LocateVex(Graph G, VertexType u) { + int i; + + for(i = 0; i < G.vexnum; i++) { + if(G.vexs[i] == u) { + return i; + } + } + + return -1; +} + +/* + * æ‰“å°æœ‰å‘图结构 + */ +void PrintGraph(Graph G) { + int i, j; + + if(G.vexnum == 0) { + printf("空图,无需打å°ï¼\n"); + return; + } + + printf("当剿œ‰å‘å›¾åŒ…å« %2d 个顶点, %2d æ¡å¼§...\n", G.vexnum, G.arcnum); + + for(i = 0; i < G.vexnum; i++) { + printf("%c -> ", G.vexs[i]); + for(j = G.fst[i]; j <= G.lst[i]; j++) { + printf("%c ", G.vexs[G.s[j]]); + } + printf("\n"); + } +} diff --git a/CLion/ExerciseBook/07.25/Graph.h b/CLion/ExerciseBook/07.25/Graph.h new file mode 100644 index 0000000..b0f474b --- /dev/null +++ b/CLion/ExerciseBook/07.25/Graph.h @@ -0,0 +1,53 @@ +/*================================= + * 由题7.25çš„æè¿°åˆ›å»ºçš„ä¸€ç§æœ‰å‘图结构 + ==================================*/ + +#ifndef GRAPH_H +#define GRAPH_H + +#include +#include // æä¾›memsetã€strcmp 原型 +#include "Status.h" //**â–²01 绪论**// + +#define MAX_VERTEX_NUM 26 // 顶点个数最大值 +#define MAX_ADJ_NUM 650 // 所有顶点的邻接点数é‡å’Œæœ€å¤§å€¼ + +// 顶点类型 +typedef char VertexType; + +// 有å‘图类型定义 +typedef struct Graph { + VertexType vexs[MAX_VERTEX_NUM]; // 顶点å‘é‡ + int s[MAX_ADJ_NUM]; // å„顶点的邻接点 + int fst[MAX_VERTEX_NUM]; // fst[v] -> 顶点v的邻接点在s中的起始下标 + int lst[MAX_VERTEX_NUM]; // lst[v] -> 顶点v的邻接点在s中的终止下标 + int vexnum, arcnum; // 有å‘图的顶点数和弧数 +} Graph; + + +/* + * 创建有å‘图 + * + * path为NULL或为""时,从控制å°è¯»å–图的åˆå§‹åŒ–ä¿¡æ¯ã€‚ + * å¦åˆ™ï¼Œä»Žé¢„设的文件中读å–图的åˆå§‹åŒ–ä¿¡æ¯ã€‚ + */ +Status CreateGraph(Graph* G, char* path); + +/* + * 创建有å‘图的核心算法 + */ +static void Create(Graph* G); + +/* + * 查找 + * + * 返回顶点u在有å‘图中的ä½ç½® + */ +int LocateVex(Graph G, VertexType u); + +/* + * æ‰“å°æœ‰å‘图结构 + */ +void PrintGraph(Graph G); + +#endif diff --git a/CLion/ExerciseBook/07.25/TestData_DG.txt b/CLion/ExerciseBook/07.25/TestData_DG.txt new file mode 100644 index 0000000..ddc3f6e --- /dev/null +++ b/CLion/ExerciseBook/07.25/TestData_DG.txt @@ -0,0 +1,4 @@ +顶点数→9 +弧数→11 +顶点集→ã€A,B,C,D,E,F,G,H,I】 +弧的集åˆâ†’ã€A,B】ã€A,D】ã€B,C】ã€D,E】ã€E,F】ã€F,C】ã€F,G】ã€F,H】ã€H,I】ã€I,D】ã€E,B】 \ No newline at end of file diff --git a/CLion/ExerciseBook/07.26/07.26.c b/CLion/ExerciseBook/07.26/07.26.c new file mode 100644 index 0000000..0c682e9 --- /dev/null +++ b/CLion/ExerciseBook/07.26/07.26.c @@ -0,0 +1,141 @@ +#include +#include "Status.h" //**â–²01 绪论**// +#include "ALGraph.h" //**â–²07 图**// +#include "TopologicalSorting.h" //**â–²07 图**// + +/* + * 对无回路的有å‘图中的顶点适当地编å·ï¼Œä½¿å…¶é‚»æŽ¥çŸ©é˜µä¸ºä¸‹ä¸‰è§’形且主对角线为全零。 + * 调整æˆåŠŸåŽï¼Œè¾“出新旧编å·å¯¹ç…§è¡¨ã€‚ + * + * 注:本质上求拓扑排åºçš„逆åºåˆ— + */ +void Algo_7_26(ALGraph G); + +/* + * 以图形化形å¼è¾“出调整结点顺åºåŽçš„图结构 + * + * 注:在图/网中,使用"-"æ¥è¡¨ç¤ºä¸¤é¡¶ç‚¹ä¸ç›´æŽ¥è¿žé€š + */ +static void PrintGraph_7_26(ALGraph G, int topo[MAX_VERTEX_NUM]); + + +int main(int argc, char* argv[]) { + ALGraph G; + + printf("████████ 创建并输出图...\n"); + { + char* path[4]; + + path[0] = "TestData_DG.txt"; + path[1] = ""; + path[2] = ""; + path[3] = ""; + + CreateGraph(&G, path); + PrintGraph(G); + printf("\n"); + } + + printf("████████ 输出有å‘图的顶点顺åº...\n"); + { + Algo_7_26(G); + printf("\n"); + } + + return 0; +} + + +/* + * 对无回路的有å‘图中的顶点适当地编å·ï¼Œä½¿å…¶é‚»æŽ¥çŸ©é˜µä¸ºä¸‹ä¸‰è§’形且主对角线为全零。 + * 调整æˆåŠŸåŽï¼Œè¾“出新旧编å·å¯¹ç…§è¡¨ã€‚ + * + * 注:本质上求拓扑排åºçš„逆åºåˆ— + */ +void Algo_7_26(ALGraph G) { + int i; + int tmp; + int topo[MAX_VERTEX_NUM]; + + if(TopologicalSort(G, topo) == ERROR) { + printf("给定的有å‘图存在回路,无法获å–其拓扑åºåˆ—...\n"); + return; + } + + printf("调整å‰ï¼š"); + for(i = 0; i < G.vexnum; i++) { + printf("%c ", G.vertices[i].data); + } + printf("\n"); + + // 对得到的拓扑åºåˆ—åšä¸€ä¸ªç®€å•的逆置 + for(i = 0; i < G.vexnum / 2; i++) { + tmp = topo[i]; + topo[i] = topo[G.vexnum - i - 1]; + topo[G.vexnum - i - 1] = tmp; + } + + printf("调整åŽï¼š"); + for(i = 0; i < G.vexnum; i++) { + printf("%c ", G.vertices[topo[i]].data); + } + printf("\n\n"); + + printf("████████ æ ¹æ®è°ƒæ•´åŽçš„顶点次åºï¼Œæ‰“å°å…¶å­˜å‚¨ç»“æž„(此步骤å¯é€‰)...\n"); + PrintGraph_7_26(G, topo); +} + +/* + * 以图形化形å¼è¾“出调整结点顺åºåŽçš„图结构 + * + * 注:在图/网中,使用"-"æ¥è¡¨ç¤ºä¸¤é¡¶ç‚¹ä¸ç›´æŽ¥è¿žé€š + */ +static void PrintGraph_7_26(ALGraph G, int topo[MAX_VERTEX_NUM]) { + int i, j; + int pos[MAX_VERTEX_NUM]; + int adjs[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; + ArcNode* p; + + // 记录å„顶点在拓扑åºåˆ—中的索引 + for(i = 0; i < G.vexnum; i++) { + pos[topo[i]] = i; + } + + // åˆå§‹åŒ– + for(i = 0; i < G.vexnum; i++) { + for(j = 0; j < G.vexnum; j++) { + adjs[i][j] = 0; + } + } + + // é历有å‘图å„弧之间的关系 + for(i = 0; i < G.vexnum; i++) { + p = G.vertices[i].firstarc; + + while(p != NULL) { + adjs[pos[i]][pos[p->adjvex]] = 1; + p = p->nextarc; + } + } + + + printf(" "); + for(i = 0; i < G.vexnum; i++) { + printf(" %c", G.vertices[topo[i]].data); + } + printf("\n"); + + for(i = 0; i < G.vexnum; i++) { + printf("%c ", G.vertices[topo[i]].data); + + for(j = 0; j < G.vexnum; j++) { + if(adjs[i][j] == 0) { + printf(" -"); + } else { + printf("%3d", adjs[i][j]); + } + } + + printf("\n"); + } +} diff --git a/CLion/ExerciseBook/07.26/07.26.png b/CLion/ExerciseBook/07.26/07.26.png new file mode 100644 index 0000000000000000000000000000000000000000..6bb19199dc12ec07185960e5914dd51744fe7485 GIT binary patch literal 16448 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 MqODx1Xchkd0f5#y;s5{u literal 0 HcmV?d00001 diff --git a/CLion/ExerciseBook/07.26/ALGraph.c b/CLion/ExerciseBook/07.26/ALGraph.c new file mode 100644 index 0000000..1c9c854 --- /dev/null +++ b/CLion/ExerciseBook/07.26/ALGraph.c @@ -0,0 +1,325 @@ +/*================== + * 图的邻接表存储表示 + ===================*/ + +#include "ALGraph.h" + +// 录入数æ®çš„æºæ–‡ä»¶ï¼›fp为null时,说明需è¦ä»ŽæŽ§åˆ¶å°å½•å…¥ +static FILE* fp = NULL; + +/* + * IncInfo指示该图/网的边/弧上是å¦å­˜åœ¨é™„加信æ¯ã€‚ + * 如果其值ä¸ä¸º0,则表示无附加信æ¯ï¼Œå¦åˆ™ï¼Œè¡¨ç¤ºå­˜åœ¨é™„加信æ¯ã€‚ + */ +Boolean IncInfo = FALSE; + +// 访问标志数组,记录访问过的顶点 +static Boolean visited[MAX_VERTEX_NUM]; + +// 函数å˜é‡ +static Status (* VisitFunc)(VertexType e); + + +/* + * 创建 + * + *ã€å¤‡æ³¨ã€‘ + * + * æ•™æä¸­é»˜è®¤ä»ŽæŽ§åˆ¶å°è¯»å–æ•°æ®ã€‚ + * 这里为了方便测试,é¿å…æ¯æ¬¡è¿è¡Œéƒ½æ‰‹åŠ¨è¾“å…¥æ•°æ®ï¼Œ + * 因而å…许选择从预设的文件pathä¸­è¯»å–æµ‹è¯•æ•°æ®ã€‚ + * + * 如果需è¦ä»ŽæŽ§åˆ¶å°è¯»å–æ•°æ®ï¼Œåˆ™path为NULL,或path[kind]为""。 + * 如果需è¦ä»Žæ–‡ä»¶ä¸­è¯»å–æ•°æ®ï¼Œåˆ™éœ€è¦åœ¨path中填写文件åä¿¡æ¯ã€‚ + */ +Status CreateGraph(ALGraph* G, char* path[]) { + int readFromConsole; // 是å¦ä»ŽæŽ§åˆ¶å°è¯»å–æ•°æ® + int kind; + Status flag; + + // ★★★此处固定为有å‘图 + kind = 0; + + // 如果没有文件路径信æ¯ï¼Œåˆ™ä»ŽæŽ§åˆ¶å°è¯»å–输入 + readFromConsole = (path == NULL) || strcmp(path[kind], "") == 0; + + // 需è¦ä»Žæ–‡ä»¶è¯»å– + if(readFromConsole) { + (*G).kind = kind; // 记录图/网的类型 + } else { + // æ‰“å¼€æ–‡ä»¶ï¼Œå‡†å¤‡è¯»å–æµ‹è¯•æ•°æ® + fp = fopen(path[kind], "r"); + if(fp == NULL) { + return ERROR; + } + + // 录入图的类型 + ReadData(fp, "%d", &((*G).kind)); + } + + // éšæœºåˆ›å»ºæœ‰å‘图/网或无å‘图/ç½‘çš„ä¸€ç§ + switch((*G).kind) { + case DG: + flag = CreateDG(G); + break; + default: + flag = ERROR; + break; + } + + if(fp != NULL) { + fclose(fp); + fp = NULL; + } + + return flag; +} + +/* + * 构造有å‘图 + */ +static Status CreateDG(ALGraph* G) { + int i, k; + int vexnum, arcnum; + VertexType v1, v2; + InfoType* info = NULL; + + (*G).vexnum = (*G).arcnum = 0; + + if(fp == NULL) { + printf("请输入有å‘图的顶点数:"); + scanf("%d", &vexnum); + printf("请输入有å‘图的弧数:"); + scanf("%d", &arcnum); + printf("该有å‘图的弧上是å¦åŒ…å«å…¶ä»–附加信æ¯(0-ä¸åŒ…å«â”‚1-包å«):"); + scanf("%d", &IncInfo); + + // 录入顶点集 + printf("请录入 %d 个顶点,ä¸åŒé¡¶ç‚¹ä¹‹é—´ç”¨ç©ºæ ¼éš”开:", vexnum); + for(i = 0; i < vexnum; i++) { + // 跳过空白,寻找下一个"å¯è¯»"ç¬¦å· + skipBlank(stdin); + scanf("%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } else { + ReadData(fp, "%d", &vexnum); // 录入顶点数 + ReadData(fp, "%d", &arcnum); // 录入弧数 + ReadData(fp, "%d", &IncInfo); // 判断弧上是å¦åŒ…å«é™„åŠ ä¿¡æ¯ + + // 录入顶点集 + for(i = 0; i < vexnum; i++) { + // 跳过空白,寻找下一个"å¯è¯»"ç¬¦å· + skipBlank(fp); + ReadData(fp, "%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } + + // 仅在控制å°å½•å…¥ä¿¡æ¯æ—¶è¾“出此æç¤º + if(fp == NULL && arcnum != 0) { + printf("请为有å‘图便¬¡å½•å…¥ %d æ¡å¼§çš„ä¿¡æ¯ï¼Œé¡¶ç‚¹ä¹‹é—´ç”¨ç©ºæ ¼éš”开:\n", arcnum); + } + + // å½•å…¥å¼§çš„ä¿¡æ¯ + for(k = 0; k < arcnum; k++) { + if(fp == NULL) { + printf("第 %2d æ¡å¼§ï¼š", k + 1); + skipBlank(stdin); // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + scanf("%c", &v1); + skipBlank(stdin); // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + scanf("%c", &v2); + } else { + // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + skipBlank(fp); + ReadData(fp, "%c%c", &v1, &v2); + } + + // 如果需è¦å½•å…¥å¼§çš„å…¶ä»–é™„åŠ ä¿¡æ¯ + if(IncInfo) { + // 最åŽå½•å…¥é™„åŠ ä¿¡æ¯ + Input(*G, &info); + } + + // æ’入弧 + InsertArc(G, v1, v2, info); + } + + // ä»Žæ–‡ä»¶ä¸­è¯»å–æ•°æ®æ—¶ï¼Œæœ€åŽå…¶å®žåº”当判断一下是å¦è¯»åˆ°äº†è¶³å¤Ÿçš„ä¿¡æ¯ + return OK; +} + +/* + * 录入边/å¼§çš„ç›¸å…³é™„åŠ ä¿¡æ¯ + */ +static void Input(ALGraph G, InfoType** info) { + int weight; + + // 在"网"的情形下需è¦å½•å…¥æƒå€¼ä¿¡æ¯ + if(G.kind == DN || G.kind == UDN) { + *info = (InfoType*) malloc(sizeof(InfoType)); + + if(fp == NULL) { + scanf("%d", &weight); + } else { + ReadData(fp, "%d", &weight); + } + + (*info)->weight = weight; + } +} + +/* + * 查找 + * + * 返回顶点u在图/网中的ä½ç½® + */ +int LocateVex(ALGraph G, VertexType u) { + int i; + + for(i = 0; i < G.vexnum; i++) { + if(G.vertices[i].data == u) { + return i; + } + } + + return -1; +} + +/* + * 构造一个边/弧结点(ä»…é™å†…部使用) + */ +static ArcNode* newArcNodePtr(int adjvex, ArcNode* nextarc, InfoType* info) { + ArcNode* p = (ArcNode*) malloc(sizeof(ArcNode)); + if(!p) { + exit(OVERFLOW); + } + + p->adjvex = adjvex; + + p->nextarc = nextarc; + + p->info = info; + + return p; +} + +/* + * æ’入边/å¼§ + * + * 如果当å‰å›¾/网是无å‘的,则æ’入一æ¡å¼§éœ€è¦å¢žåŠ ä¸¤ä¸ªé¡¶ç‚¹å…³ç³»ï¼Œä½†å¼§çš„æ•°é‡åªå¢žä¸€ã€‚ + * 对于图/网æ¥è¯´ï¼Œå¯ä»¥åœ¨å¯å˜å‚数中列出边/弧的附加信æ¯ã€‚ + * + * æ³¨ï¼šæ­¤å¤„æŽ¥æ”¶çš„å‚æ•°ä¸ŽMGraph有些ä¸ä¸€æ ·ï¼šç½‘的附加信æ¯ä¸­åŒ…å«äº†å„æ¡è¾¹/å¼§çš„æƒå€¼ã€‚ + */ +Status InsertArc(ALGraph* G, VertexType v, VertexType w, ...) { + int tail, head, k, count; + ArcNode* r; + ArcNode* pre; + Boolean overlay = FALSE; // 是å¦ä¸ºè¦†ç›–添加 + InfoType* info = NULL; // è¾¹/å¼§çš„é™„åŠ ä¿¡æ¯ + va_list ap; + + tail = LocateVex(*G, v); // 获å–顶点v在顶点集中的ä½ç½® + if(tail == -1) { + return ERROR; // 指定的顶点ä¸å­˜åœ¨ + } + + head = LocateVex(*G, w); // 获å–顶点w在顶点集中的ä½ç½® + if(head == -1) { + return ERROR; // 指定的顶点ä¸å­˜åœ¨ + } + + // æ‹’ç»çޝ + if(tail == head) { + return ERROR; + } + + // 如果边/å¼§ä¸Šå­˜åœ¨é™„åŠ ä¿¡æ¯ + if(IncInfo) { + va_start(ap, w); // 在wåŽæŸ¥è¯¢é¦–个å¯å˜å‚æ•° + info = va_arg(ap, InfoType*); // 获å–é™„åŠ ä¿¡æ¯ + va_end(ap); + } + + /* 接下æ¥ï¼Œéœ€è¦æŸ¥æ‰¾åˆé€‚çš„æ’å…¥ä½ç½® */ + + for(count = 0; count < 2; count++) { + pre = NULL; + // 指å‘以tail为尾的首æ¡è¾¹/å¼§ + r = G->vertices[tail].firstarc; + while(r != NULL && r->adjvex < head) { + pre = r; + r = r->nextarc; + } + + // é‡åˆ°äº†ç›¸åŒä½ç½®çš„结点 + if(r != NULL && r->adjvex == head) { + r->info = info; // å¤ç”¨è¯¥ç»“点 + overlay = TRUE; // å‘生了覆盖 + } else { + if(pre == NULL) { + G->vertices[tail].firstarc = newArcNodePtr(head, r, info); + } else { + pre->nextarc = newArcNodePtr(head, r, info); + } + } + + // 如果当å‰å›¾/网是无å‘的,需è¦è€ƒè™‘对称性 + if((G->kind == UDG || G->kind == UDN) && tail != head) { + // 颠倒iå’Œj + k = tail; + tail = head; + head = k; + } else { + break; // 如果是有å‘的,å¯ä»¥ç»“æŸäº† + } + } + + // 在éžè¦†ç›–的情形下,æ‰è€ƒè™‘æ›´æ–°è¾¹/å¼§çš„æ•°é‡ + if(!overlay) { + (*G).arcnum++; // ä¸è®ºæœ‰å‘æ— å‘,边/å¼§æ•°åªå¢žä¸€ + } + + return OK; +} + +/* + * 以图形化形å¼è¾“出当å‰ç»“æž„ + */ +void PrintGraph(ALGraph G) { + int i; + ArcNode* p; + + if(G.vexnum == 0) { + printf("空图,无需打å°ï¼\n"); + return; + } + + printf("当å‰å›¾/ç½‘åŒ…å« %2d 个顶点, %2d æ¡è¾¹/å¼§...\n", G.vexnum, G.arcnum); + + for(i = 0; i < G.vexnum; i++) { + printf("%c ===> ", G.vertices[i].data); + + p = G.vertices[i].firstarc; + while(p != NULL) { + if(IncInfo == 0) { + printf("%c ", G.vertices[p->adjvex].data); + + // 对于网,会从其附加信æ¯ä¸­èŽ·å–到æƒå€¼ + } else { + printf("%c[%2d] ", G.vertices[p->adjvex].data, p->info->weight); + } + + p = p->nextarc; + + if(p != NULL) { + printf("- "); + } + } + + printf("\n"); + } +} diff --git a/CLion/ExerciseBook/07.26/ALGraph.h b/CLion/ExerciseBook/07.26/ALGraph.h new file mode 100644 index 0000000..ce5d0a0 --- /dev/null +++ b/CLion/ExerciseBook/07.26/ALGraph.h @@ -0,0 +1,128 @@ +/*================== + * 图的邻接表存储表示 + ===================*/ + +#ifndef ALGRAPH_H +#define ALGRAPH_H + +#include +#include // æä¾›memsetã€strcmp 原型 +#include // æä¾›å®va_listã€va_startã€va_argã€va_end +#include // æä¾›mallocã€reallocã€freeã€exit原型 +#include "Status.h" //**â–²01 绪论**// + +/* + * 注: + * + * 通常æ¥è®²ï¼Œæ— æƒå›¾è¢«ç®€ç§°ä¸ºã€å›¾ã€‘,有æƒå›¾è¢«ç®€ç§°ä¸ºã€ç½‘】。 + * æ— å‘图/网中的顶点关系被称为ã€è¾¹ã€‘,有å‘图/网中的顶点关系被称为ã€å¼§ã€‘,并区分弧头与弧尾。 + * 实际表述中,未必会严格éµå®ˆä»¥ä¸Šå‘½å。 + * + * 当å‰ç»“构适åˆå­˜å‚¨è¾¹/弧比较稀ç–的图/网。 + * + * ★ æ’入边/å¼§çš„ä¿¡æ¯æ—¶ï¼Œè¿™é‡Œçš„实现是按"å‡åº"æ’入的,这使得æ’入的弧是按"å‡åº"排列的。 + */ + + +/* å®å®šä¹‰ */ +#define MAX_VERTEX_NUM 26 // 最大顶点个数 + + +// 图的类型 +typedef enum { + DG, // 0-有å‘图 + DN, // 1-有å‘网(带æƒå€¼) + UDG, // 2-æ— å‘图 + UDN // 3-æ— å‘网(带æƒå€¼) +} GraphKind; + +// 顶点类型 +typedef char VertexType; + +// è¾¹/å¼§çš„ç›¸å…³é™„åŠ ä¿¡æ¯ +typedef struct { + /* + * 注: + * æ•™æä¸­ç»™å‡ºçš„结构åªè€ƒè™‘了无æƒå›¾ï¼Œè€Œæ²¡è€ƒè™‘有æƒå›¾(网)。 + * 这里为了把“网â€çš„æƒ…形也考虑进去,特在附加信æ¯ä¸­å¢žåŠ äº†"æƒé‡"属性。 + */ + int weight; +} InfoType; + +/* è¾¹/弧结点 */ +typedef struct ArcNode { + int adjvex; // 该弧所指å‘的顶点的ä½ç½® + struct ArcNode* nextarc; // 指å‘下一æ¡å¼§çš„æŒ‡é’ˆ + InfoType* info; // 弧的附加信æ¯ï¼Œé€šå¸¸å¿½ç•¥ +} ArcNode; + +// æ¯ä¸ªé“¾è¡¨çš„头结点 +typedef struct VNode { + VertexType data; // é¡¶ç‚¹ä¿¡æ¯ + ArcNode* firstarc; // 指å‘第一æ¡ä¾é™„该顶点的弧的指针 +} VNode; + +/* 图的邻接表存储表示类型定义 */ +typedef struct { + VNode vertices[MAX_VERTEX_NUM]; // 邻接表 + int vexnum, arcnum; // 图/网的顶点数和弧数 + GraphKind kind; // 图的类型标志 +} ALGraph; + + +// è¾¹/弧上是å¦å­˜åœ¨é™„åŠ ä¿¡æ¯ +extern Boolean IncInfo; + + +/* + * 创建 + * + *ã€å¤‡æ³¨ã€‘ + * + * æ•™æä¸­é»˜è®¤ä»ŽæŽ§åˆ¶å°è¯»å–æ•°æ®ã€‚ + * 这里为了方便测试,é¿å…æ¯æ¬¡è¿è¡Œéƒ½æ‰‹åŠ¨è¾“å…¥æ•°æ®ï¼Œ + * 因而å…许选择从预设的文件pathä¸­è¯»å–æµ‹è¯•æ•°æ®ã€‚ + * + * 如果需è¦ä»ŽæŽ§åˆ¶å°è¯»å–æ•°æ®ï¼Œåˆ™path为NULL,或path[kind]为""。 + * 如果需è¦ä»Žæ–‡ä»¶ä¸­è¯»å–æ•°æ®ï¼Œåˆ™éœ€è¦åœ¨path中填写文件åä¿¡æ¯ã€‚ + */ +Status CreateGraph(ALGraph* G, char* path[]); + +/* + * 构造有å‘图 + */ +static Status CreateDG(ALGraph* G); + +/* + * 录入边/å¼§çš„ç›¸å…³é™„åŠ ä¿¡æ¯ + */ +static void Input(ALGraph G, InfoType** info); + +/* + * 查找 + * + * 返回顶点u在图/网中的ä½ç½® + */ +int LocateVex(ALGraph G, VertexType u); + +/* + * 构造一个边/弧结点(ä»…é™å†…部使用) + */ +static ArcNode* newArcNodePtr(int adjvex, ArcNode* nextarc, InfoType* info); + +/* + * æ’入边/å¼§ + * + * 如果当å‰å›¾/网是无å‘的,则æ’入一æ¡å¼§éœ€è¦å¢žåŠ ä¸¤ä¸ªé¡¶ç‚¹å…³ç³»ï¼Œä½†å¼§çš„æ•°é‡åªå¢žä¸€ã€‚ + * 对于图/网æ¥è¯´ï¼Œå¯ä»¥åœ¨å¯å˜å‚数中列出边/弧的附加信æ¯ã€‚ + * + * æ³¨ï¼šæ­¤å¤„æŽ¥æ”¶çš„å‚æ•°ä¸ŽMGraph有些ä¸ä¸€æ ·ï¼šç½‘的附加信æ¯ä¸­åŒ…å«äº†å„æ¡è¾¹/å¼§çš„æƒå€¼ã€‚ + */ +Status InsertArc(ALGraph* G, VertexType v, VertexType w, ...); + +/* + * 以图形化形å¼è¾“出当å‰ç»“æž„ + */ +void PrintGraph(ALGraph G); + +#endif diff --git a/CLion/ExerciseBook/07.26/CMakeLists.txt b/CLion/ExerciseBook/07.26/CMakeLists.txt new file mode 100644 index 0000000..16faef4 --- /dev/null +++ b/CLion/ExerciseBook/07.26/CMakeLists.txt @@ -0,0 +1,12 @@ +# 包å«å…¬å…±åº“ +include_directories(${CMAKE_SOURCE_DIR}/Status) + +# 生æˆå¯æ‰§è¡Œæ–‡ä»¶ +add_executable(07.26 SqStack.h SqStack.c ALGraph.h ALGraph.c TopologicalSorting.h TopologicalSorting.c 07.26.c) +# 链接公共库 +target_link_libraries(07.26 Scanf_lib) + +# è®°å½•è¦æ‹·è´åˆ°*.exeç›®å½•ä¸‹çš„èµ„æºæ–‡ä»¶ +file(GLOB TestData TestData*.txt) +# å°†èµ„æºæ–‡ä»¶æ‹·è´åˆ°*.exe目录下,ä¸ç„¶æ— æ³•加载 +file(COPY ${TestData} DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) diff --git a/CLion/ExerciseBook/07.26/SqStack.c b/CLion/ExerciseBook/07.26/SqStack.c new file mode 100644 index 0000000..d709204 --- /dev/null +++ b/CLion/ExerciseBook/07.26/SqStack.c @@ -0,0 +1,90 @@ +/*========================= + * 栈的顺åºå­˜å‚¨ç»“æž„ï¼ˆé¡ºåºæ ˆï¼‰ + ==========================*/ + +#include "SqStack.h" //**â–²03 栈和队列**// + +/* + * åˆå§‹åŒ– + * + * 构造一个空栈。åˆå§‹åŒ–æˆåŠŸåˆ™è¿”å›žOK,å¦åˆ™è¿”回ERROR。 + */ +Status InitStack(SqStack* S) { + if(S == NULL) { + return ERROR; + } + + (*S).base = (SElemType*) malloc(STACK_INIT_SIZE * sizeof(SElemType)); + if((*S).base == NULL) { + exit(OVERFLOW); + } + + (*S).top = (*S).base; + (*S).stacksize = STACK_INIT_SIZE; + + return OK; +} + +/* + * 判空 + * + * åˆ¤æ–­é¡ºåºæ ˆä¸­æ˜¯å¦åŒ…嫿œ‰æ•ˆæ•°æ®ã€‚ + * + * 返回值: + * TRUE : é¡ºåºæ ˆä¸ºç©º + * FALSE: é¡ºåºæ ˆä¸ä¸ºç©º + */ +Status StackEmpty(SqStack S) { + if(S.top == S.base) { + return TRUE; + } else { + return FALSE; + } +} + +/* + * 入栈 + * + * 将元素e压入到栈顶。 + */ +Status Push(SqStack* S, SElemType e) { + if(S == NULL || (*S).base == NULL) { + return ERROR; + } + + // 栈满时,追加存储空间 + if((*S).top - (*S).base >= (*S).stacksize) { + (*S).base = (SElemType*) realloc((*S).base, ((*S).stacksize + STACKINCREMENT) * sizeof(SElemType)); + if((*S).base == NULL) { + exit(OVERFLOW); // 存储分é…失败 + } + + (*S).top = (*S).base + (*S).stacksize; + (*S).stacksize += STACKINCREMENT; + } + + // 进栈先赋值,栈顶指针å†è‡ªå¢ž + *(S->top++) = e; + + return OK; +} + +/* + * 出栈 + * + * 将栈顶元素弹出,并用e接收。 + */ +Status Pop(SqStack* S, SElemType* e) { + if(S == NULL || (*S).base == NULL) { + return ERROR; + } + + if((*S).top == (*S).base) { + return ERROR; + } + + // 出栈栈顶指针先递å‡ï¼Œå†èµ‹å€¼ + *e = *(--(*S).top); + + return OK; +} diff --git a/CLion/ExerciseBook/07.26/SqStack.h b/CLion/ExerciseBook/07.26/SqStack.h new file mode 100644 index 0000000..e840954 --- /dev/null +++ b/CLion/ExerciseBook/07.26/SqStack.h @@ -0,0 +1,59 @@ +/*========================= + * 栈的顺åºå­˜å‚¨ç»“æž„ï¼ˆé¡ºåºæ ˆï¼‰ + ==========================*/ + +#ifndef SQSTACK_H +#define SQSTACK_H + +#include +#include // æä¾›mallocã€reallocã€freeã€exit原型 +#include "Status.h" //**â–²01 绪论**// + +/* å®å®šä¹‰ */ +#define STACK_INIT_SIZE 100 // é¡ºåºæ ˆå­˜å‚¨ç©ºé—´çš„åˆå§‹åˆ†é…é‡ +#define STACKINCREMENT 10 // é¡ºåºæ ˆå­˜å‚¨ç©ºé—´çš„分é…å¢žé‡ + +/* é¡ºåºæ ˆå…ƒç´ ç±»åž‹å®šä¹‰ */ +typedef int SElemType; + +// é¡ºåºæ ˆå…ƒç´ ç»“æž„ +typedef struct { + SElemType* base; // 栈底指针 + SElemType* top; // 栈顶指针 + int stacksize; // 当å‰å·²åˆ†é…的存储空间,以元素为å•ä½ +} SqStack; + + +/* + * åˆå§‹åŒ– + * + * 构造一个空栈。åˆå§‹åŒ–æˆåŠŸåˆ™è¿”å›žOK,å¦åˆ™è¿”回ERROR。 + */ +Status InitStack(SqStack* S); + +/* + * 判空 + * + * åˆ¤æ–­é¡ºåºæ ˆä¸­æ˜¯å¦åŒ…嫿œ‰æ•ˆæ•°æ®ã€‚ + * + * 返回值: + * TRUE : é¡ºåºæ ˆä¸ºç©º + * FALSE: é¡ºåºæ ˆä¸ä¸ºç©º + */ +Status StackEmpty(SqStack S); + +/* + * 入栈 + * + * 将元素e压入到栈顶。 + */ +Status Push(SqStack* S, SElemType e); + +/* + * 出栈 + * + * 将栈顶元素弹出,并用e接收。 + */ +Status Pop(SqStack* S, SElemType* e); + +#endif diff --git a/CLion/ExerciseBook/07.26/TestData_DG.txt b/CLion/ExerciseBook/07.26/TestData_DG.txt new file mode 100644 index 0000000..9d20118 --- /dev/null +++ b/CLion/ExerciseBook/07.26/TestData_DG.txt @@ -0,0 +1,6 @@ +图类型→0(有å‘图) +顶点数→12 +弧数→16 +弧是å¦å¸¦æœ‰å…¶ä»–ä¿¡æ¯â†’0 +顶点集→ã€A,B,C,D,E,F,G,H,I,J,K,L】 +弧的集åˆâ†’ã€F,J】ã€F,B】ã€F,C】ã€F,A】ã€B,C】ã€J,I】ã€C,I】ã€C,H】ã€I,H】ã€C,G】ã€D,A】ã€D,L】ã€L,A】ã€D,K】ã€K,E】ã€E,G】 \ No newline at end of file diff --git a/CLion/ExerciseBook/07.26/TopologicalSorting.c b/CLion/ExerciseBook/07.26/TopologicalSorting.c new file mode 100644 index 0000000..b35a574 --- /dev/null +++ b/CLion/ExerciseBook/07.26/TopologicalSorting.c @@ -0,0 +1,96 @@ +/*======================= + * AOV-网(有å‘图)çš„æ‹“æ‰‘æŽ’åº + * + * 包å«ç®—法: 7.12 + ========================*/ + +#include "TopologicalSorting.h" + +/* + * ████████ 算法7.12 ████████ + * + * 如果有å‘图G无回路,则输出它的一个拓扑åºåˆ—并返回OKï¼›å¦åˆ™ï¼Œè¿”回FALSE。 + * 拓扑åºåˆ—通常ä¸å”¯ä¸€ï¼Œä½†æ˜¯å¿…é¡»ä¿è¯æŸäº›å…³é”®èŠ‚ç‚¹çš„å…ˆåŽæ¬¡åºã€‚ + * + * 注:与教æä¸åŒä¹‹å¤„在于,此处增加了一个topo数组åšå‚数。 + *   对于求出的拓扑åºåˆ—,ä¸ä¼šç›´æŽ¥è¾“出,而是会缓存到topo中。 + *   这样的åšçš„目的是åŽç»­çš„习题中会有多处用到该拓扑åºåˆ—。 + */ +Status TopologicalSort(ALGraph G, int topo[MAX_VERTEX_NUM]) { + int i, k, count; + int indegree[MAX_VERTEX_NUM]; + SqStack S; + ArcNode* p; + + // 对å„顶点求入度 + FindInDegree(G, indegree); + + // åˆå§‹åŒ–零入度顶点栈 + InitStack(&S); + + // 建立入度为0的顶点栈 + for(i = 0; i < G.vexnum; i++) { + // 将入度为0的顶点添加到栈中 + if(indegree[i] == 0) { + Push(&S, i); + } + } + + // 对拓扑åºåˆ—中的顶点计数 + count = 0; + + // é历顶点栈 + while(!StackEmpty(S)) { + // 获å–一个零入度顶点 + Pop(&S, &i); + + // å°†å„顶点的åºå·æš‚å­˜èµ·æ¥ + topo[count++] = i; + + // é历iå·é¡¶ç‚¹çš„邻接点 + for(p = G.vertices[i].firstarc; p != NULL; p = p->nextarc) { + // 获å–顶点åºå· + k = p->adjvex; + + /* + * å°†iå·é¡¶ç‚¹æ¯ä¸ªé‚»æŽ¥ç‚¹çš„入度å‡ä¸€ï¼Œè¿™ç›¸å½“于切段iå·é¡¶ç‚¹åˆ°å…¶å®ƒé‚»æŽ¥ç‚¹çš„è”系。 + * 如果出现了新的入度为0的顶点,继续将其入栈。 + */ + if((--indegree[k]) == 0) { + Push(&S, k); + } + } + } + + // 如果é‡åˆ°äº†å›žè·¯ï¼Œåˆ™è¿”回ERROR + if(count < G.vexnum) { + return ERROR; + } else { + return OK; + } +} + +/* + * 计算å„顶点的入度 + */ +static void FindInDegree(ALGraph G, int indegree[MAX_VERTEX_NUM]) { + int i; + ArcNode* p; + + // åˆå§‹åŒ–所有顶点的入度为0 + for(i = 0; i < G.vexnum; i++) { + indegree[i] = 0; + } + + // é历所有顶点 + for(i = 0; i < G.vexnum; i++) { + // 指å‘该顶点的首个邻接点 + p = G.vertices[i].firstarc; + + // é历该顶点的所有邻接点,统计å„顶点的入度 + while(p != NULL) { + indegree[p->adjvex]++; + p = p->nextarc; + } + } +} diff --git a/CLion/ExerciseBook/07.26/TopologicalSorting.h b/CLion/ExerciseBook/07.26/TopologicalSorting.h new file mode 100644 index 0000000..ecdde03 --- /dev/null +++ b/CLion/ExerciseBook/07.26/TopologicalSorting.h @@ -0,0 +1,28 @@ +/*======================= + * AOV-网(有å‘图)çš„æ‹“æ‰‘æŽ’åº + * + * 包å«ç®—法: 7.12 + ========================*/ + +#ifndef TOPOLOGICALSORTING_H +#define TOPOLOGICALSORTING_H + +#include +#include "Status.h" //**â–²01 绪论**// +#include "SqStack.h" //**â–²03 栈和队列**// +#include "ALGraph.h" //**â–²07 图**// + +/* + * ████████ 算法7.12 ████████ + * + * 如果有å‘图G无回路,则输出它的一个拓扑åºåˆ—并返回OKï¼›å¦åˆ™ï¼Œè¿”回FALSE。 + * 拓扑åºåˆ—通常ä¸å”¯ä¸€ï¼Œä½†æ˜¯å¿…é¡»ä¿è¯æŸäº›å…³é”®èŠ‚ç‚¹çš„å…ˆåŽæ¬¡åºã€‚ + */ +Status TopologicalSort(ALGraph G, int topo[MAX_VERTEX_NUM]); + +/* + * 计算å„顶点的入度 + */ +static void FindInDegree(ALGraph G, int indegree[MAX_VERTEX_NUM]); + +#endif diff --git a/CLion/ExerciseBook/07.27/07.27.c b/CLion/ExerciseBook/07.27/07.27.c new file mode 100644 index 0000000..9f34067 --- /dev/null +++ b/CLion/ExerciseBook/07.27/07.27.c @@ -0,0 +1,133 @@ +#include +#include "Status.h" //**â–²01 绪论**// +#include "ALGraph.h" //**â–²07 图**// + +// 访问标志数组,记录访问过的顶点 +static Boolean visited[MAX_VERTEX_NUM]; + + +/* + * 输出满足æ¡ä»¶çš„简å•路径 + */ +void Algo_7_27(ALGraph G, VertexType start, VertexType end, int k); + +/* + * 查找满足æ¡ä»¶çš„简å•路径。 + * + * path用æ¥å­˜å‚¨è·¯è¿‡çš„顶点,path[0]存储path中的顶点数é‡ã€‚ + * + * 如果找到简å•路径,则将其存储到path中,并返回OKï¼›å¦åˆ™ï¼Œè¿”回ERROR。 + */ +Status SimplePath_7_27(ALGraph G, int start, int end, int k, int path[MAX_VERTEX_NUM]); + + +int main(int argc, char* argv[]) { + ALGraph G; + + printf("████████ 创建并输出图...\n"); + { + char* path[4]; + + path[0] = ""; + path[1] = ""; + path[2] = "TestData_UDG.txt"; + path[3] = ""; + + CreateGraph(&G, path); + PrintGraph(G); + printf("\n"); + } + + printf("████████ 查找简å•路径...\n"); + { + VertexType start = 'A'; + VertexType end = 'B'; + int k = 4; + + Algo_7_27(G, start, end, k); + printf("\n"); + } + + return 0; +} + + +/* + * 输出满足æ¡ä»¶çš„简å•路径 + */ +void Algo_7_27(ALGraph G, VertexType start, VertexType end, int k) { + int i, m, n; + int path[MAX_VERTEX_NUM + 1]; // 0å·å•元用æ¥è®°å½•pathä¸­å­˜å‚¨çš„é¡¶ç‚¹æ•°é‡ + Status s; + + m = LocateVex(G, start); + n = LocateVex(G, end); + + if(k <= 0 || m == -1 || n == -1 || m == n) { + printf("傿•°é”™è¯¯ï¼\n"); + return; + } + + // 把所有顶点标记为未访问 + for(i = 0; i < G.vexnum; i++) { + visited[i] = FALSE; + } + + path[0] = 0; + + s = SimplePath_7_27(G, m, n, k, path); + + if(s == ERROR) { + printf("æœªæ‰¾åˆ°ç¬¦åˆæ¡ä»¶çš„简å•路径ï¼\n"); + return; + } + + printf("%c 到 %c 之间存在的一æ¡é•¿åº¦ä¸º %d 的简å•路径为:", start, end, k); + for(i = 1; i <= path[0]; i++) { + printf("%c ", GetVex(G, path[i])); + } + printf("\n"); +} + +/* + * 查找满足æ¡ä»¶çš„简å•路径。 + * + * path用æ¥å­˜å‚¨è·¯è¿‡çš„顶点,path[0]存储path中的顶点数é‡ã€‚ + * + * 如果找到简å•路径,则将其存储到path中,并返回OKï¼›å¦åˆ™ï¼Œè¿”回ERROR。 + */ +Status SimplePath_7_27(ALGraph G, int start, int end, int k, int path[MAX_VERTEX_NUM]) { + int w; + + path[0]++; + path[path[0]] = start; + visited[start] = TRUE; // 标记该顶点已访问 + + // 如果é‡åˆ°ç»ˆç‚¹ï¼Œåˆ™éœ€è¦è§†æƒ…形返回 + if(start == end) { + // 顶点数 = 路径长度+1 + if(path[0] == k + 1) { + return OK; + } + } else { + // 深度优先é历 + for(w = FirstAdjVex(G, G.vertices[start].data); + w >= 0; + w = NextAdjVex(G, G.vertices[start].data, G.vertices[w].data)) { + // 忽略已访问过的顶点 + if(visited[w] == TRUE) { + continue; + } + + if(SimplePath_7_27(G, w, end, k, path) == OK) { + return OK; + } + } + } + + // 从路径中移除该顶点,并将其状æ€é™çº§ä¸º"已访问" + path[0]--; + visited[start] = FALSE; // 清除访问标记 + + return ERROR; +} diff --git a/CLion/ExerciseBook/07.27/07.27.png b/CLion/ExerciseBook/07.27/07.27.png new file mode 100644 index 0000000000000000000000000000000000000000..a37e6ceb71414701b75b1862516f5f9183058992 GIT binary patch literal 8809 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 + InsertArc(G, v1, v2, info); + } + + // ä»Žæ–‡ä»¶ä¸­è¯»å–æ•°æ®æ—¶ï¼Œæœ€åŽå…¶å®žåº”当判断一下是å¦è¯»åˆ°äº†è¶³å¤Ÿçš„ä¿¡æ¯ + return OK; +} + +/* + * 录入边/å¼§çš„ç›¸å…³é™„åŠ ä¿¡æ¯ + */ +static void Input(ALGraph G, InfoType** info) { + int weight; + + // 在"网"的情形下需è¦å½•å…¥æƒå€¼ä¿¡æ¯ + if(G.kind == DN || G.kind == UDN) { + *info = (InfoType*) malloc(sizeof(InfoType)); + + if(fp == NULL) { + scanf("%d", &weight); + } else { + ReadData(fp, "%d", &weight); + } + + (*info)->weight = weight; + } +} + +/* + * 查找 + * + * 返回顶点u在图/网中的ä½ç½® + */ +int LocateVex(ALGraph G, VertexType u) { + int i; + + for(i = 0; i < G.vexnum; i++) { + if(G.vertices[i].data == u) { + return i; + } + } + + return -1; +} + +/* + * å–值 + * + * 返回索引v处的顶点值 + */ +VertexType GetVex(ALGraph G, int v) { + if(v < 0 || v >= G.vexnum) { + return '\0'; // 指定的顶点ä¸å­˜åœ¨ + } + + return G.vertices[v].data; +} + +/* + * 赋值 + * + * 将顶点v赋值为value + */ +Status PutVex(ALGraph* G, VertexType v, VertexType value) { + int k; + + // 首先需è¦åˆ¤æ–­è¯¥é¡¶ç‚¹æ˜¯å¦å­˜åœ¨ + k = LocateVex((*G), v); + if(k == -1) { + return ERROR; // 指定的顶点ä¸å­˜åœ¨ + } + + // 替æ¢å¤´ç»“点 + (*G).vertices[k].data = value; + + /* 链表中的元素存储的是顶点的ä½ç½®ï¼Œæ‰€ä»¥æ— éœ€éåŽ†é“¾è¡¨æ¥æ›¿æ¢ç›®æ ‡å€¼ */ + + return OK; +} + +/* + * 首个邻接点 + * + * 返回顶点v的首个邻接点 + */ +int FirstAdjVex(ALGraph G, VertexType v) { + int k; + ArcNode* r; + + // 首先需è¦åˆ¤æ–­è¯¥é¡¶ç‚¹æ˜¯å¦å­˜åœ¨ + k = LocateVex(G, v); + if(k == -1) { + return -1; // 指定的顶点ä¸å­˜åœ¨ + } + + r = G.vertices[k].firstarc; + if(r == NULL) { + return -1; + } else { + return r->adjvex; + } +} + +/* + * 下一个邻接点 + * + * 返回顶点vçš„(相对于wçš„)下一个邻接点 + */ +int NextAdjVex(ALGraph G, VertexType v, VertexType w) { + int kv, kw; + ArcNode* r; + + // 首先需è¦åˆ¤æ–­è¯¥é¡¶ç‚¹æ˜¯å¦å­˜åœ¨ + kv = LocateVex(G, v); + if(kv == -1) { + return -1; // 指定的顶点ä¸å­˜åœ¨ + } + + // 首先需è¦åˆ¤æ–­è¯¥é¡¶ç‚¹æ˜¯å¦å­˜åœ¨ + kw = LocateVex(G, w); + if(kw == -1) { + return -1; // 指定的顶点ä¸å­˜åœ¨ + } + + r = G.vertices[kv].firstarc; + if(r == NULL) { + return -1; // 链表为空 + } + + // 在链表中查找w + while(r != NULL && r->adjvex < kw) { + r = r->nextarc; + } + + // 如果没找到w + if(r == NULL) { + return -1; + } + + // 如果找到了w,但是wåŽé¢æ²¡æœ‰åˆ«çš„顶点,那么也无法返回邻接点 + if(r->adjvex == kw && r->nextarc != NULL) { + return r->nextarc->adjvex; + } + + return -1; +} + +/* + * æ’入顶点 + * + * 将指定的顶点v追加到顶点集中,未建立该顶点与其他顶点的关系 + */ +Status InsertVex(ALGraph* G, VertexType v) { + int k; + + // 顶点数过多 + if((*G).vexnum == MAX_VERTEX_NUM) { + return ERROR; + } + + // 首先需è¦åˆ¤æ–­è¯¥é¡¶ç‚¹æ˜¯å¦å­˜åœ¨ + k = LocateVex(*G, v); + if(k >= 0) { + return ERROR; // 指定的顶点存在时,无需é‡å¤æ·»åŠ  + } + + G->vertices[(*G).vexnum].data = v; + G->vertices[(*G).vexnum].firstarc = NULL; + + (*G).vexnum++; + + return OK; +} + +/* + * 删除顶点 + * + * 从顶点集中删除指定的顶点v,注æ„éœ€è¦æ›´æ–°ç›¸å…³çš„顶点关系 + */ +Status DeleteVex(ALGraph* G, VertexType v) { + int k, i; + ArcNode* pre, * r; + + // 首先需è¦åˆ¤æ–­è¯¥é¡¶ç‚¹æ˜¯å¦å­˜åœ¨ + k = LocateVex(*G, v); + if(k == -1) { + return ERROR; // 指定的顶点ä¸å­˜åœ¨ + } + + // 找到以结点v出å‘的链表,释放该链表上所有结点 + r = G->vertices[k].firstarc; + while(r != NULL) { + pre = r; + r = r->nextarc; + free(pre); + + (*G).arcnum--; + } + + G->vertices[k].firstarc = NULL; + + // é历其它所有链表,删除那些指å‘顶点v的弧;而且,下标超过k的顶点,其下标值需è¦é€’å‡ + for(i = 0; i < G->vexnum; i++) { + pre = NULL; + r = G->vertices[i].firstarc; + while(r != NULL && r->adjvex < k) { + pre = r; + r = r->nextarc; + } + + // 链表上所有顶点的下标å‡å°äºŽk + if(r == NULL) { + continue; + } + + if(r->adjvex == k) { + // 从开头删掉结点v + if(pre == NULL) { + G->vertices[i].firstarc = r->nextarc; + + // 从中间æŸä¸ªä½ç½®åˆ æŽ‰ç»“点v + } else { + pre->nextarc = r->nextarc; + } + + free(r); + + // 如果这是有å‘的图/网,ä¾ç„¶éœ€è¦é€’å‡è¾¹/å¼§çš„æ•°é‡ + if((*G).kind == DG || (*G).kind == DN) { + (*G).arcnum--; + } + } + + // 冿¬¡ç¡®å®šrçš„ä½ç½® + if(pre == NULL) { + r = G->vertices[i].firstarc; + } else { + r = pre->nextarc; + } + + // 下标超过k的顶点,需è¦é€’å‡å…¶ä¸‹æ ‡ + while(r != NULL && r->adjvex > k) { + r->adjvex -= 1; + r = r->nextarc; + } + } + + // 顶点集å‰ç§» + for(i = k + 1; i < (*G).vexnum; i++) { + G->vertices[i - 1] = G->vertices[i]; + } + + // é¡¶ç‚¹æ•°é€’å‡ + (*G).vexnum--; + + return OK; +} + +/* + * 构造一个边/弧结点(ä»…é™å†…部使用) + */ +static ArcNode* newArcNodePtr(int adjvex, ArcNode* nextarc, InfoType* info) { + ArcNode* p = (ArcNode*) malloc(sizeof(ArcNode)); + if(!p) { + exit(OVERFLOW); + } + + p->adjvex = adjvex; + + p->nextarc = nextarc; + + p->info = info; + + return p; +} + +/* + * æ’入边/å¼§ + * + * 如果当å‰å›¾/网是无å‘的,则æ’入一æ¡å¼§éœ€è¦å¢žåŠ ä¸¤ä¸ªé¡¶ç‚¹å…³ç³»ï¼Œä½†å¼§çš„æ•°é‡åªå¢žä¸€ã€‚ + * 对于图/网æ¥è¯´ï¼Œå¯ä»¥åœ¨å¯å˜å‚数中列出边/弧的附加信æ¯ã€‚ + * + * æ³¨ï¼šæ­¤å¤„æŽ¥æ”¶çš„å‚æ•°ä¸ŽMGraph有些ä¸ä¸€æ ·ï¼šç½‘的附加信æ¯ä¸­åŒ…å«äº†å„æ¡è¾¹/å¼§çš„æƒå€¼ã€‚ + */ +Status InsertArc(ALGraph* G, VertexType v, VertexType w, ...) { + int tail, head, k, count; + ArcNode* r; + ArcNode* pre; + Boolean overlay = FALSE; // 是å¦ä¸ºè¦†ç›–添加 + InfoType* info = NULL; // è¾¹/å¼§çš„é™„åŠ ä¿¡æ¯ + va_list ap; + + tail = LocateVex(*G, v); // 获å–顶点v在顶点集中的ä½ç½® + if(tail == -1) { + return ERROR; // 指定的顶点ä¸å­˜åœ¨ + } + + head = LocateVex(*G, w); // 获å–顶点w在顶点集中的ä½ç½® + if(head == -1) { + return ERROR; // 指定的顶点ä¸å­˜åœ¨ + } + + // æ‹’ç»çޝ + if(tail == head) { + return ERROR; + } + + // 如果边/å¼§ä¸Šå­˜åœ¨é™„åŠ ä¿¡æ¯ + if(IncInfo) { + va_start(ap, w); // 在wåŽæŸ¥è¯¢é¦–个å¯å˜å‚æ•° + info = va_arg(ap, InfoType*); // 获å–é™„åŠ ä¿¡æ¯ + va_end(ap); + } + + /* 接下æ¥ï¼Œéœ€è¦æŸ¥æ‰¾åˆé€‚çš„æ’å…¥ä½ç½® */ + + for(count = 0; count < 2; count++) { + pre = NULL; + // 指å‘以tail为尾的首æ¡è¾¹/å¼§ + r = G->vertices[tail].firstarc; + while(r != NULL && r->adjvex < head) { + pre = r; + r = r->nextarc; + } + + // é‡åˆ°äº†ç›¸åŒä½ç½®çš„结点 + if(r != NULL && r->adjvex == head) { + r->info = info; // å¤ç”¨è¯¥ç»“点 + overlay = TRUE; // å‘生了覆盖 + } else { + if(pre == NULL) { + G->vertices[tail].firstarc = newArcNodePtr(head, r, info); + } else { + pre->nextarc = newArcNodePtr(head, r, info); + } + } + + // 如果当å‰å›¾/网是无å‘的,需è¦è€ƒè™‘对称性 + if((G->kind == UDG || G->kind == UDN) && tail != head) { + // 颠倒iå’Œj + k = tail; + tail = head; + head = k; + } else { + break; // 如果是有å‘的,å¯ä»¥ç»“æŸäº† + } + } + + // 在éžè¦†ç›–的情形下,æ‰è€ƒè™‘æ›´æ–°è¾¹/å¼§çš„æ•°é‡ + if(!overlay) { + (*G).arcnum++; // ä¸è®ºæœ‰å‘æ— å‘,边/å¼§æ•°åªå¢žä¸€ + } + + return OK; +} + +/* + * 删除边/å¼§ + */ +Status DeleteArc(ALGraph* G, VertexType v, VertexType w) { + int tail, head, k, count; + ArcNode* r; + ArcNode* pre; + + tail = LocateVex(*G, v); + if(tail == -1) { + return ERROR; // 指定的顶点ä¸å­˜åœ¨ + } + + head = LocateVex(*G, w); + if(head == -1) { + return ERROR; // 指定的顶点ä¸å­˜åœ¨ + } + + for(count = 0; count < 2; count++) { + pre = NULL; + // 在当å‰é“¾è¡¨ä¸­æ‰¾åˆ°å¾…删除的边/å¼§ + r = G->vertices[tail].firstarc; + while(r != NULL && r->adjvex < head) { + pre = r; + r = r->nextarc; + } + + // 找到了待删除的边/å¼§ + if(r != NULL && r->adjvex == head) { + if(pre == NULL) { + G->vertices[tail].firstarc = r->nextarc; + } else { + pre->nextarc = r->nextarc; + } + + free(r); + } else { + return ERROR; // 没找到 + } + + // 如果当å‰å›¾/网是无å‘的,需è¦è€ƒè™‘对称性 + if((G->kind == UDG || G->kind == UDN) && tail != head) { + // 颠倒tailå’Œhead + k = tail; + tail = head; + head = k; + } else { + break; // 如果是有å‘的,å¯ä»¥ç»“æŸäº† + } + } + + (*G).arcnum--; // ä¸è®ºæœ‰å‘æ— å‘,边/å¼§æ•°åªå‡ä¸€ + + return OK; +} + +/* + * 以图形化形å¼è¾“出当å‰ç»“æž„ + */ +void PrintGraph(ALGraph G) { + int i; + ArcNode* p; + + if(G.vexnum == 0) { + printf("空图,无需打å°ï¼\n"); + return; + } + + printf("当å‰å›¾/ç½‘åŒ…å« %2d 个顶点, %2d æ¡è¾¹/å¼§...\n", G.vexnum, G.arcnum); + + for(i = 0; i < G.vexnum; i++) { + printf("%c ===> ", G.vertices[i].data); + + p = G.vertices[i].firstarc; + while(p != NULL) { + if(IncInfo == 0) { + printf("%c ", G.vertices[p->adjvex].data); + + // 对于网,会从其附加信æ¯ä¸­èŽ·å–到æƒå€¼ + } else { + printf("%c[%2d] ", G.vertices[p->adjvex].data, p->info->weight); + } + + p = p->nextarc; + + if(p != NULL) { + printf("- "); + } + } + + printf("\n"); + } +} diff --git a/CLion/ExerciseBook/07.27/ALGraph.h b/CLion/ExerciseBook/07.27/ALGraph.h new file mode 100644 index 0000000..1baa0df --- /dev/null +++ b/CLion/ExerciseBook/07.27/ALGraph.h @@ -0,0 +1,175 @@ +/*================== + * 图的邻接表存储表示 + ===================*/ + +#ifndef ALGRAPH_H +#define ALGRAPH_H + +#include +#include // æä¾›memsetã€strcmp 原型 +#include // æä¾›å®va_listã€va_startã€va_argã€va_end +#include // æä¾›mallocã€reallocã€freeã€exit原型 +#include "Status.h" //**â–²01 绪论**// + +/* + * 注: + * + * 通常æ¥è®²ï¼Œæ— æƒå›¾è¢«ç®€ç§°ä¸ºã€å›¾ã€‘,有æƒå›¾è¢«ç®€ç§°ä¸ºã€ç½‘】。 + * æ— å‘图/网中的顶点关系被称为ã€è¾¹ã€‘,有å‘图/网中的顶点关系被称为ã€å¼§ã€‘,并区分弧头与弧尾。 + * 实际表述中,未必会严格éµå®ˆä»¥ä¸Šå‘½å。 + * + * 当å‰ç»“构适åˆå­˜å‚¨è¾¹/弧比较稀ç–的图/网。 + * + * ★ æ’入边/å¼§çš„ä¿¡æ¯æ—¶ï¼Œè¿™é‡Œçš„实现是按"å‡åº"æ’入的,这使得æ’入的弧是按"å‡åº"排列的。 + */ + + +/* å®å®šä¹‰ */ +#define MAX_VERTEX_NUM 26 // 最大顶点个数 + + +// 图的类型 +typedef enum { + DG, // 0-有å‘图 + DN, // 1-有å‘网(带æƒå€¼) + UDG, // 2-æ— å‘图 + UDN // 3-æ— å‘网(带æƒå€¼) +} GraphKind; + +// 顶点类型 +typedef char VertexType; + +// è¾¹/å¼§çš„ç›¸å…³é™„åŠ ä¿¡æ¯ +typedef struct { + /* + * 注: + * æ•™æä¸­ç»™å‡ºçš„结构åªè€ƒè™‘了无æƒå›¾ï¼Œè€Œæ²¡è€ƒè™‘有æƒå›¾(网)。 + * 这里为了把“网â€çš„æƒ…形也考虑进去,特在附加信æ¯ä¸­å¢žåŠ äº†"æƒé‡"属性。 + */ + int weight; +} InfoType; + +/* è¾¹/弧结点 */ +typedef struct ArcNode { + int adjvex; // 该弧所指å‘的顶点的ä½ç½® + struct ArcNode* nextarc; // 指å‘下一æ¡å¼§çš„æŒ‡é’ˆ + InfoType* info; // 弧的附加信æ¯ï¼Œé€šå¸¸å¿½ç•¥ +} ArcNode; + +// æ¯ä¸ªé“¾è¡¨çš„头结点 +typedef struct VNode { + VertexType data; // é¡¶ç‚¹ä¿¡æ¯ + ArcNode* firstarc; // 指å‘第一æ¡ä¾é™„该顶点的弧的指针 +} VNode; + +/* 图的邻接表存储表示类型定义 */ +typedef struct { + VNode vertices[MAX_VERTEX_NUM]; // 邻接表 + int vexnum, arcnum; // 图/网的顶点数和弧数 + GraphKind kind; // 图的类型标志 +} ALGraph; + + +// è¾¹/弧上是å¦å­˜åœ¨é™„åŠ ä¿¡æ¯ +extern Boolean IncInfo; + + +/* + * 创建 + * + *ã€å¤‡æ³¨ã€‘ + * + * æ•™æä¸­é»˜è®¤ä»ŽæŽ§åˆ¶å°è¯»å–æ•°æ®ã€‚ + * 这里为了方便测试,é¿å…æ¯æ¬¡è¿è¡Œéƒ½æ‰‹åŠ¨è¾“å…¥æ•°æ®ï¼Œ + * 因而å…许选择从预设的文件pathä¸­è¯»å–æµ‹è¯•æ•°æ®ã€‚ + * + * 如果需è¦ä»ŽæŽ§åˆ¶å°è¯»å–æ•°æ®ï¼Œåˆ™path为NULL,或path[kind]为""。 + * 如果需è¦ä»Žæ–‡ä»¶ä¸­è¯»å–æ•°æ®ï¼Œåˆ™éœ€è¦åœ¨path中填写文件åä¿¡æ¯ã€‚ + */ +Status CreateGraph(ALGraph* G, char* path[]); + +/* + * 构造无å‘图 + */ +static Status CreateUDG(ALGraph* G); + +/* + * 录入边/å¼§çš„ç›¸å…³é™„åŠ ä¿¡æ¯ + */ +static void Input(ALGraph G, InfoType** info); + +/* + * 查找 + * + * 返回顶点u在图/网中的ä½ç½® + */ +int LocateVex(ALGraph G, VertexType u); + +/* + * å–值 + * + * 返回索引v处的顶点值 + */ +VertexType GetVex(ALGraph G, int v); + +/* + * 赋值 + * + * 将顶点v赋值为value + */ +Status PutVex(ALGraph* G, VertexType v, VertexType value); + +/* + * 首个邻接点 + * + * 返回顶点v的首个邻接点 + */ +int FirstAdjVex(ALGraph G, VertexType v); + +/* + * 下一个邻接点 + * + * 返回顶点vçš„(相对于wçš„)下一个邻接点 + */ +int NextAdjVex(ALGraph G, VertexType v, VertexType w); + +/* + * æ’入顶点 + * + * 将指定的顶点v追加到顶点集中,未建立该顶点与其他顶点的关系 + */ +Status InsertVex(ALGraph* G, VertexType v); + +/* + * 删除顶点 + * + * 从顶点集中删除指定的顶点v,注æ„éœ€è¦æ›´æ–°ç›¸å…³çš„顶点关系 + */ +Status DeleteVex(ALGraph* G, VertexType v); + +/* + * 构造一个边/弧结点(ä»…é™å†…部使用) + */ +static ArcNode* newArcNodePtr(int adjvex, ArcNode* nextarc, InfoType* info); + +/* + * æ’入边/å¼§ + * + * 如果当å‰å›¾/网是无å‘的,则æ’入一æ¡å¼§éœ€è¦å¢žåŠ ä¸¤ä¸ªé¡¶ç‚¹å…³ç³»ï¼Œä½†å¼§çš„æ•°é‡åªå¢žä¸€ã€‚ + * 对于图/网æ¥è¯´ï¼Œå¯ä»¥åœ¨å¯å˜å‚数中列出边/弧的附加信æ¯ã€‚ + * + * æ³¨ï¼šæ­¤å¤„æŽ¥æ”¶çš„å‚æ•°ä¸ŽMGraph有些ä¸ä¸€æ ·ï¼šç½‘的附加信æ¯ä¸­åŒ…å«äº†å„æ¡è¾¹/å¼§çš„æƒå€¼ã€‚ + */ +Status InsertArc(ALGraph* G, VertexType v, VertexType w, ...); + +/* + * 删除边/å¼§ + */ +Status DeleteArc(ALGraph* G, VertexType v, VertexType w); + +/* + * 以图形化形å¼è¾“出当å‰ç»“æž„ + */ +void PrintGraph(ALGraph G); + +#endif diff --git a/CLion/ExerciseBook/07.27/CMakeLists.txt b/CLion/ExerciseBook/07.27/CMakeLists.txt new file mode 100644 index 0000000..c3214a4 --- /dev/null +++ b/CLion/ExerciseBook/07.27/CMakeLists.txt @@ -0,0 +1,12 @@ +# 包å«å…¬å…±åº“ +include_directories(${CMAKE_SOURCE_DIR}/Status) + +# 生æˆå¯æ‰§è¡Œæ–‡ä»¶ +add_executable(07.27 ALGraph.h ALGraph.c 07.27.c) +# 链接公共库 +target_link_libraries(07.27 Scanf_lib) + +# è®°å½•è¦æ‹·è´åˆ°*.exeç›®å½•ä¸‹çš„èµ„æºæ–‡ä»¶ +file(GLOB TestData TestData*.txt) +# å°†èµ„æºæ–‡ä»¶æ‹·è´åˆ°*.exe目录下,ä¸ç„¶æ— æ³•加载 +file(COPY ${TestData} DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) diff --git a/CLion/ExerciseBook/07.27/TestData_UDG.txt b/CLion/ExerciseBook/07.27/TestData_UDG.txt new file mode 100644 index 0000000..8bc43d6 --- /dev/null +++ b/CLion/ExerciseBook/07.27/TestData_UDG.txt @@ -0,0 +1,6 @@ +图类型→2(无å‘图) +顶点数→9 +边数→13 +边是å¦å¸¦æœ‰å…¶ä»–ä¿¡æ¯â†’0 +顶点集→ã€A,B,C,D,E,F,G,H,I】 +边的集åˆâ†’ã€A,B】ã€B,E】ã€E,D】ã€D,F】ã€F,A】ã€B,D】ã€A,C】ã€C,E】ã€A,H】ã€H,G】ã€G,C】ã€C,I】ã€H,I】 \ No newline at end of file diff --git a/CLion/ExerciseBook/07.28/07.28.c b/CLion/ExerciseBook/07.28/07.28.c new file mode 100644 index 0000000..de86261 --- /dev/null +++ b/CLion/ExerciseBook/07.28/07.28.c @@ -0,0 +1,110 @@ +#include +#include "Status.h" //**â–²01 绪论**// +#include "MGraph.h" //**â–²07 图**// + +// 访问标志数组,记录访问过的顶点 +static Boolean visited[MAX_VERTEX_NUM]; + + +/* + * 输出满足æ¡ä»¶çš„简å•路径 + */ +void Algo_7_28(MGraph G, VertexType start, VertexType end); + +/* + * 查找start到end之间的所有的简å•路径 + */ +void SimplePath_7_28(MGraph G, int start, int end, int path[MAX_VERTEX_NUM]); + + +int main(int argc, char* argv[]) { + MGraph G; + + printf("████████ 创建并输出图...\n"); + { + char* path[4]; + + path[0] = "TestData_DG.txt"; + path[1] = ""; + path[2] = ""; + path[3] = ""; + + CreateGraph(&G, path); + PrintGraph(G); + printf("\n"); + } + + printf("████████ 查找简å•路径...\n"); + { + VertexType start = 'u'; + VertexType end = 'v'; + + Algo_7_28(G, start, end); + printf("\n"); + } + + return 0; +} + + +/* + * 输出start到end之间的所有的简å•路径 + */ +void Algo_7_28(MGraph G, VertexType start, VertexType end) { + int i, m, n; + int path[MAX_VERTEX_NUM + 1]; // 0å·å•元用æ¥è®°å½•pathä¸­å­˜å‚¨çš„é¡¶ç‚¹æ•°é‡ + + m = LocateVex(G, start); + n = LocateVex(G, end); + + if(m == -1 || n == -1 || m == n) { + printf("傿•°é”™è¯¯ï¼\n"); + return; + } + + // 把所有顶点标记为未访问 + for(i = 0; i < G.vexnum; i++) { + visited[i] = FALSE; + } + + path[0] = 0; + + printf("查找 %c 到 %c 之间存在的所有简å•路径...\n", start, end); + SimplePath_7_28(G, m, n, path); +} + +/* + * 查找start到end之间的所有的简å•路径 + */ +void SimplePath_7_28(MGraph G, int start, int end, int path[MAX_VERTEX_NUM]) { + int i, w; + + path[0]++; + path[path[0]] = start; + visited[start] = TRUE; // 标记该顶点已访问 + + // 如果é‡åˆ°æ»¡è¶³é¢˜æ„的路径,则输出它 + if(start == end) { + // 输出找到的简å•路径 + for(i = 1; i <= path[0]; i++) { + printf("%c ", GetVex(G, path[i])); + } + printf("\n"); + } else { + // 深度优先é历 + for(w = FirstAdjVex(G, G.vexs[start]); + w >= 0; + w = NextAdjVex(G, G.vexs[start], G.vexs[w])) { + // 忽略已访问过的顶点 + if(visited[w] == TRUE) { + continue; + } + + SimplePath_7_28(G, w, end, path); + } + } + + // 从路径中移除该顶点,并将其状æ€é™çº§ä¸º"已访问" + path[0]--; + visited[start] = FALSE; // 清除访问标记 +} diff --git a/CLion/ExerciseBook/07.28/07.28.png b/CLion/ExerciseBook/07.28/07.28.png new file mode 100644 index 0000000000000000000000000000000000000000..d814ec27df79db865275062fa483cfa48ee7242e GIT binary patch literal 10441 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 G.vexnum) { + return '\0'; // 指定的顶点ä¸å­˜åœ¨ + } + + return G.vexs[v]; +} + +/* + * 首个邻接点 + * + * 返回顶点v的首个邻接点 + */ +int FirstAdjVex(MGraph G, VertexType v) { + int kv, j; + VRType adj; + + kv = LocateVex(G, v); + if(kv == -1) { + return -1; // 指定的顶点ä¸å­˜åœ¨ + } + + // 确定一个éžè¿žé€šæ ‡è®° + if(G.kind == DG || G.kind == UDG) { + adj = 0; // 图 + } else if(G.kind == DN || G.kind == UDN) { + adj = INFINITE; // 网 + } else { + return -1; + } + + // 从头开始查找 + for(j = 0; j < G.vexnum; j++) { + // 找到与v直接连接的顶点 + if(G.arcs[kv][j].adj != adj) { + return j; + } + } + + return -1; +} + +/* + * 下一个邻接点 + * + * 返回顶点vçš„(相对于wçš„)下一个邻接点 + */ +int NextAdjVex(MGraph G, VertexType v, VertexType w) { + int kv, kw, j; + VRType adj; + + kv = LocateVex(G, v); + if(kv == -1) { + return -1; // 指定的顶点ä¸å­˜åœ¨ + } + + kw = LocateVex(G, w); + if(kw == -1) { + return -1; // 指定的顶点ä¸å­˜åœ¨ + } + + // 确定一个éžè¿žé€šæ ‡è®° + if(G.kind == DG || G.kind == UDG) { + adj = 0; // 图 + } else if(G.kind == DN || G.kind == UDN) { + adj = INFINITE; // 网 + } else { + return -1; + } + + // 从顶点wåŽå¼€å§‹æŸ¥æ‰¾ + for(j = kw + 1; j < G.vexnum; j++) { + // 找到与v直接连接的顶点 + if(G.arcs[kv][j].adj != adj) { + return j; + } + } + + return -1; +} + +/* + * 以图形化形å¼è¾“出当å‰ç»“æž„ + * + * 注:在网中,使用"-"æ¥è¡¨ç¤ºä¸¤é¡¶ç‚¹ä¸ç›´æŽ¥è¿žé€š + */ +void PrintGraph(MGraph G) { + int i, j; + + if(G.vexnum == 0) { + printf("空图,无需打å°ï¼\n"); + return; + } + + printf("当å‰å›¾/ç½‘åŒ…å« %2d 个顶点, %2d æ¡è¾¹/å¼§...\n", G.vexnum, G.arcnum); + + printf(" "); + for(i = 0; i < G.vexnum; i++) { + printf(" %c", G.vexs[i]); + } + printf("\n"); + + for(i = 0; i < G.vexnum; i++) { + printf("%c ", G.vexs[i]); + + for(j = 0; j < G.vexnum; j++) { + if(((G.kind == DG || G.kind == UDG) && G.arcs[i][j].adj == 0) || ((G.kind == DN || G.kind == UDN) && G.arcs[i][j].adj == INFINITE)) { + printf(" -"); + } else { + printf("%3d", G.arcs[i][j].adj); + } + } + + printf("\n"); + } +} diff --git a/CLion/ExerciseBook/07.28/MGraph.h b/CLion/ExerciseBook/07.28/MGraph.h new file mode 100644 index 0000000..4a33b72 --- /dev/null +++ b/CLion/ExerciseBook/07.28/MGraph.h @@ -0,0 +1,133 @@ +/*================================= + * 图的数组(邻接矩阵)存储表示 + * + * 包å«ç®—法: 7.1ã€7.2ã€7.4ã€7.5ã€7.6 + ==================================*/ + +#ifndef MGRAPH_H +#define MGRAPH_H + +#include +#include // æä¾›å®INT_MAX +#include // æä¾›memsetã€strcmp 原型 +#include // æä¾›å®va_listã€va_startã€va_argã€va_end +#include "Status.h" //**â–²01 绪论**// + +/* + * 注: + * + * 通常æ¥è®²ï¼Œæ— æƒå›¾è¢«ç®€ç§°ä¸ºã€å›¾ã€‘,有æƒå›¾è¢«ç®€ç§°ä¸ºã€ç½‘】。 + * æ— å‘图/网中的顶点关系被称为ã€è¾¹ã€‘,有å‘图/网中的顶点关系被称为ã€å¼§ã€‘,并区分弧头与弧尾。 + * 实际表述中,未必会严格éµå®ˆä»¥ä¸Šå‘½å。 + */ + +/* å®å®šä¹‰ */ +#define INFINITE INT_MAX // 最大值,用æ¥è¡¨ç¤ºç½‘中的两个顶点ä¸ç›´æŽ¥è¿žæŽ¥ +#define MAX_VERTEX_NUM 26 // 最大顶点个数 + + +// 图的类型 +typedef enum { + DG, // 0-有å‘图 + DN, // 1-有å‘网(带æƒå€¼) + UDG, // 2-æ— å‘图 + UDN // 3-æ— å‘网(带æƒå€¼) +} GraphKind; + +// 顶点类型 +typedef char VertexType; + +/* + * 顶点关系类型 + * + * 在无æƒå›¾ä¸­ï¼Œè¯¥å€¼é€šå¸¸ä¸º0或1,表示两顶点是å¦ç›´æŽ¥è¿žé€šï¼› + * 在有æƒå›¾ä¸­ï¼Œè¯¥å€¼é€šå¸¸ä¸ºæƒå€¼ã€‚ + */ +typedef int VRType; + +// è¾¹çš„ç›¸å…³é™„åŠ ä¿¡æ¯ +typedef struct { + // 如果有的è¯ï¼ŒåŽç»­ä¼šæ·»åŠ ç›¸åº”çš„å±žæ€§ +} InfoType; + +// è¾¹çš„ç±»åž‹ï¼Œæ¯æ¡è¾¹ä¸Šå¯èƒ½æœ‰é™„加信æ¯info +typedef struct ArcCell { + VRType adj; // 顶点关系,在有æƒå›¾è·Ÿæ— æƒå›¾ä¸­çš„å«ä¹‰ä¸åŒ + InfoType* info; // 边的附加信æ¯ï¼Œé€šå¸¸å¿½ç•¥ +} ArcCell; + +/* 图/网的数组(邻接矩阵)存储表示类型定义 */ +typedef struct { + VertexType vexs[MAX_VERTEX_NUM]; // 顶点å‘é‡ + ArcCell arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; // 邻接矩阵 + int vexnum, arcnum; // 图/网的顶点数和弧数 + GraphKind kind; // 图的类型标志 +} MGraph; + + +// è¾¹/弧上是å¦å­˜åœ¨é™„åŠ ä¿¡æ¯ +extern Boolean IncInfo; + + +/* + * ████████ 算法7.1 ████████ + * + * 创建 + * + *ã€å¤‡æ³¨ã€‘ + * + * æ•™æä¸­é»˜è®¤ä»ŽæŽ§åˆ¶å°è¯»å–æ•°æ®ã€‚ + * 这里为了方便测试,é¿å…æ¯æ¬¡è¿è¡Œéƒ½æ‰‹åŠ¨è¾“å…¥æ•°æ®ï¼Œ + * 因而å…许选择从预设的文件pathä¸­è¯»å–æµ‹è¯•æ•°æ®ã€‚ + * + * 如果需è¦ä»ŽæŽ§åˆ¶å°è¯»å–æ•°æ®ï¼Œåˆ™path为NULL,或path[kind]为""。 + * 如果需è¦ä»Žæ–‡ä»¶ä¸­è¯»å–æ•°æ®ï¼Œåˆ™éœ€è¦åœ¨path中填写文件åä¿¡æ¯ã€‚ + */ +Status CreateGraph(MGraph* G, char* path[]); + +/* + * 构造无å‘图 + */ +static Status CreateDG(MGraph* G); + +/* + * å½•å…¥è¾¹çš„ç›¸å…³é™„åŠ ä¿¡æ¯ + */ +static void Input(MGraph G, InfoType** info); + +/* + * 查找 + * + * 返回顶点u在图/网中的ä½ç½® + */ +int LocateVex(MGraph G, VertexType u); + +/* + * å–值 + * + * 返回索引v处的顶点值 + */ +VertexType GetVex(MGraph G, int v); + +/* + * 首个邻接点 + * + * 返回顶点v的首个邻接点 + */ +int FirstAdjVex(MGraph G, VertexType v); + +/* + * 下一个邻接点 + * + * 返回顶点vçš„(相对于wçš„)下一个邻接点 + */ +int NextAdjVex(MGraph G, VertexType v, VertexType w); + +/* + * 以图形化形å¼è¾“出当å‰ç»“æž„ + * + * 注:在网中,使用"-"æ¥è¡¨ç¤ºä¸¤é¡¶ç‚¹ä¸ç›´æŽ¥è¿žé€š + */ +void PrintGraph(MGraph G); + +#endif diff --git a/CLion/ExerciseBook/07.28/TestData_DG.txt b/CLion/ExerciseBook/07.28/TestData_DG.txt new file mode 100644 index 0000000..c16e388 --- /dev/null +++ b/CLion/ExerciseBook/07.28/TestData_DG.txt @@ -0,0 +1,6 @@ +图类型→0(有å‘图) +顶点数→8 +弧数→11 +弧是å¦å¸¦æœ‰å…¶ä»–ä¿¡æ¯â†’0 +顶点集→ã€a,b,c,d,e,f,u,v】 +弧的集åˆâ†’ã€u,c】ã€c,d】ã€d,e】ã€e,u】ã€d,v】ã€e,f】ã€f,v】ã€v,b】ã€b,f】ã€u,a】ã€a,b】 \ No newline at end of file diff --git a/CLion/ExerciseBook/07.29/07.29.c b/CLion/ExerciseBook/07.29/07.29.c new file mode 100644 index 0000000..3c8c180 --- /dev/null +++ b/CLion/ExerciseBook/07.29/07.29.c @@ -0,0 +1,110 @@ +#include +#include "Status.h" //**â–²01 绪论**// +#include "MGraph.h" //**â–²07 图**// + +// 访问标志数组,记录访问过的顶点 +static Boolean visited[MAX_VERTEX_NUM]; + + +/* + * 输出有å‘图G中长度为k的简å•路径 + */ +void Algo_7_29(MGraph G, int k); + +/* + * 查找有å‘图G中长度为k的简å•路径 + */ +void SimplePath_7_29(MGraph G, int start, int k, int path[MAX_VERTEX_NUM]); + + +int main(int argc, char* argv[]) { + MGraph G; + + printf("████████ 创建并输出图...\n"); + { + char* path[4]; + + path[0] = "TestData_DG.txt"; + path[1] = ""; + path[2] = ""; + path[3] = ""; + + CreateGraph(&G, path); + PrintGraph(G); + printf("\n"); + } + + printf("████████ 查找定长的简å•路径...\n"); + { + int k = 4; + + Algo_7_29(G, k); + printf("\n"); + } + + return 0; +} + + +/* + * 输出有å‘图G中长度为k的简å•路径 + */ +void Algo_7_29(MGraph G, int k) { + int i; + int path[MAX_VERTEX_NUM + 1]; // 0å·å•元用æ¥è®°å½•pathä¸­å­˜å‚¨çš„é¡¶ç‚¹æ•°é‡ + + if(k <= 0) { + printf("傿•°é”™è¯¯ï¼\n"); + return; + } + + // 把所有顶点标记为未访问 + for(i = 0; i < G.vexnum; i++) { + visited[i] = FALSE; + } + + path[0] = 0; + + printf("查找所有长度为 %d 的简å•路径...\n", k); + + for(i = 0; i < G.vexnum; i++) { + SimplePath_7_29(G, i, k, path); + } + +} + +/* + * 查找有å‘图G中长度为k的简å•路径 + */ +void SimplePath_7_29(MGraph G, int start, int k, int path[MAX_VERTEX_NUM]) { + int i, w; + + path[0]++; + path[path[0]] = start; + visited[start] = TRUE; // 标记该顶点已访问 + + // 如果é‡åˆ°é•¿åº¦ä¸ºk的路径(顶点数 = 路径长度+1),则输出它 + if(path[0] == k + 1) { + // 输出找到的简å•路径 + for(i = 1; i <= path[0]; i++) { + printf("%c ", GetVex(G, path[i])); + } + printf("\n"); + } else { + // 深度优先é历 + for(w = FirstAdjVex(G, G.vexs[start]); + w >= 0; + w = NextAdjVex(G, G.vexs[start], G.vexs[w])) { + // 忽略已访问过的顶点 + if(visited[w] == TRUE) { + continue; + } + + SimplePath_7_29(G, w, k, path); + } + } + + // 从路径中移除该顶点,并将其状æ€é™çº§ä¸º"已访问" + path[0]--; + visited[start] = FALSE; // 清除访问标记 +} diff --git a/CLion/ExerciseBook/07.29/07.29.png b/CLion/ExerciseBook/07.29/07.29.png new file mode 100644 index 0000000000000000000000000000000000000000..d814ec27df79db865275062fa483cfa48ee7242e GIT binary patch literal 10441 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 G.vexnum) { + return '\0'; // 指定的顶点ä¸å­˜åœ¨ + } + + return G.vexs[v]; +} + +/* + * 首个邻接点 + * + * 返回顶点v的首个邻接点 + */ +int FirstAdjVex(MGraph G, VertexType v) { + int kv, j; + VRType adj; + + kv = LocateVex(G, v); + if(kv == -1) { + return -1; // 指定的顶点ä¸å­˜åœ¨ + } + + // 确定一个éžè¿žé€šæ ‡è®° + if(G.kind == DG || G.kind == UDG) { + adj = 0; // 图 + } else if(G.kind == DN || G.kind == UDN) { + adj = INFINITE; // 网 + } else { + return -1; + } + + // 从头开始查找 + for(j = 0; j < G.vexnum; j++) { + // 找到与v直接连接的顶点 + if(G.arcs[kv][j].adj != adj) { + return j; + } + } + + return -1; +} + +/* + * 下一个邻接点 + * + * 返回顶点vçš„(相对于wçš„)下一个邻接点 + */ +int NextAdjVex(MGraph G, VertexType v, VertexType w) { + int kv, kw, j; + VRType adj; + + kv = LocateVex(G, v); + if(kv == -1) { + return -1; // 指定的顶点ä¸å­˜åœ¨ + } + + kw = LocateVex(G, w); + if(kw == -1) { + return -1; // 指定的顶点ä¸å­˜åœ¨ + } + + // 确定一个éžè¿žé€šæ ‡è®° + if(G.kind == DG || G.kind == UDG) { + adj = 0; // 图 + } else if(G.kind == DN || G.kind == UDN) { + adj = INFINITE; // 网 + } else { + return -1; + } + + // 从顶点wåŽå¼€å§‹æŸ¥æ‰¾ + for(j = kw + 1; j < G.vexnum; j++) { + // 找到与v直接连接的顶点 + if(G.arcs[kv][j].adj != adj) { + return j; + } + } + + return -1; +} + +/* + * 以图形化形å¼è¾“出当å‰ç»“æž„ + * + * 注:在网中,使用"-"æ¥è¡¨ç¤ºä¸¤é¡¶ç‚¹ä¸ç›´æŽ¥è¿žé€š + */ +void PrintGraph(MGraph G) { + int i, j; + + if(G.vexnum == 0) { + printf("空图,无需打å°ï¼\n"); + return; + } + + printf("当å‰å›¾/ç½‘åŒ…å« %2d 个顶点, %2d æ¡è¾¹/å¼§...\n", G.vexnum, G.arcnum); + + printf(" "); + for(i = 0; i < G.vexnum; i++) { + printf(" %c", G.vexs[i]); + } + printf("\n"); + + for(i = 0; i < G.vexnum; i++) { + printf("%c ", G.vexs[i]); + + for(j = 0; j < G.vexnum; j++) { + if(((G.kind == DG || G.kind == UDG) && G.arcs[i][j].adj == 0) || ((G.kind == DN || G.kind == UDN) && G.arcs[i][j].adj == INFINITE)) { + printf(" -"); + } else { + printf("%3d", G.arcs[i][j].adj); + } + } + + printf("\n"); + } +} diff --git a/CLion/ExerciseBook/07.29/MGraph.h b/CLion/ExerciseBook/07.29/MGraph.h new file mode 100644 index 0000000..4a33b72 --- /dev/null +++ b/CLion/ExerciseBook/07.29/MGraph.h @@ -0,0 +1,133 @@ +/*================================= + * 图的数组(邻接矩阵)存储表示 + * + * 包å«ç®—法: 7.1ã€7.2ã€7.4ã€7.5ã€7.6 + ==================================*/ + +#ifndef MGRAPH_H +#define MGRAPH_H + +#include +#include // æä¾›å®INT_MAX +#include // æä¾›memsetã€strcmp 原型 +#include // æä¾›å®va_listã€va_startã€va_argã€va_end +#include "Status.h" //**â–²01 绪论**// + +/* + * 注: + * + * 通常æ¥è®²ï¼Œæ— æƒå›¾è¢«ç®€ç§°ä¸ºã€å›¾ã€‘,有æƒå›¾è¢«ç®€ç§°ä¸ºã€ç½‘】。 + * æ— å‘图/网中的顶点关系被称为ã€è¾¹ã€‘,有å‘图/网中的顶点关系被称为ã€å¼§ã€‘,并区分弧头与弧尾。 + * 实际表述中,未必会严格éµå®ˆä»¥ä¸Šå‘½å。 + */ + +/* å®å®šä¹‰ */ +#define INFINITE INT_MAX // 最大值,用æ¥è¡¨ç¤ºç½‘中的两个顶点ä¸ç›´æŽ¥è¿žæŽ¥ +#define MAX_VERTEX_NUM 26 // 最大顶点个数 + + +// 图的类型 +typedef enum { + DG, // 0-有å‘图 + DN, // 1-有å‘网(带æƒå€¼) + UDG, // 2-æ— å‘图 + UDN // 3-æ— å‘网(带æƒå€¼) +} GraphKind; + +// 顶点类型 +typedef char VertexType; + +/* + * 顶点关系类型 + * + * 在无æƒå›¾ä¸­ï¼Œè¯¥å€¼é€šå¸¸ä¸º0或1,表示两顶点是å¦ç›´æŽ¥è¿žé€šï¼› + * 在有æƒå›¾ä¸­ï¼Œè¯¥å€¼é€šå¸¸ä¸ºæƒå€¼ã€‚ + */ +typedef int VRType; + +// è¾¹çš„ç›¸å…³é™„åŠ ä¿¡æ¯ +typedef struct { + // 如果有的è¯ï¼ŒåŽç»­ä¼šæ·»åŠ ç›¸åº”çš„å±žæ€§ +} InfoType; + +// è¾¹çš„ç±»åž‹ï¼Œæ¯æ¡è¾¹ä¸Šå¯èƒ½æœ‰é™„加信æ¯info +typedef struct ArcCell { + VRType adj; // 顶点关系,在有æƒå›¾è·Ÿæ— æƒå›¾ä¸­çš„å«ä¹‰ä¸åŒ + InfoType* info; // 边的附加信æ¯ï¼Œé€šå¸¸å¿½ç•¥ +} ArcCell; + +/* 图/网的数组(邻接矩阵)存储表示类型定义 */ +typedef struct { + VertexType vexs[MAX_VERTEX_NUM]; // 顶点å‘é‡ + ArcCell arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; // 邻接矩阵 + int vexnum, arcnum; // 图/网的顶点数和弧数 + GraphKind kind; // 图的类型标志 +} MGraph; + + +// è¾¹/弧上是å¦å­˜åœ¨é™„åŠ ä¿¡æ¯ +extern Boolean IncInfo; + + +/* + * ████████ 算法7.1 ████████ + * + * 创建 + * + *ã€å¤‡æ³¨ã€‘ + * + * æ•™æä¸­é»˜è®¤ä»ŽæŽ§åˆ¶å°è¯»å–æ•°æ®ã€‚ + * 这里为了方便测试,é¿å…æ¯æ¬¡è¿è¡Œéƒ½æ‰‹åŠ¨è¾“å…¥æ•°æ®ï¼Œ + * 因而å…许选择从预设的文件pathä¸­è¯»å–æµ‹è¯•æ•°æ®ã€‚ + * + * 如果需è¦ä»ŽæŽ§åˆ¶å°è¯»å–æ•°æ®ï¼Œåˆ™path为NULL,或path[kind]为""。 + * 如果需è¦ä»Žæ–‡ä»¶ä¸­è¯»å–æ•°æ®ï¼Œåˆ™éœ€è¦åœ¨path中填写文件åä¿¡æ¯ã€‚ + */ +Status CreateGraph(MGraph* G, char* path[]); + +/* + * 构造无å‘图 + */ +static Status CreateDG(MGraph* G); + +/* + * å½•å…¥è¾¹çš„ç›¸å…³é™„åŠ ä¿¡æ¯ + */ +static void Input(MGraph G, InfoType** info); + +/* + * 查找 + * + * 返回顶点u在图/网中的ä½ç½® + */ +int LocateVex(MGraph G, VertexType u); + +/* + * å–值 + * + * 返回索引v处的顶点值 + */ +VertexType GetVex(MGraph G, int v); + +/* + * 首个邻接点 + * + * 返回顶点v的首个邻接点 + */ +int FirstAdjVex(MGraph G, VertexType v); + +/* + * 下一个邻接点 + * + * 返回顶点vçš„(相对于wçš„)下一个邻接点 + */ +int NextAdjVex(MGraph G, VertexType v, VertexType w); + +/* + * 以图形化形å¼è¾“出当å‰ç»“æž„ + * + * 注:在网中,使用"-"æ¥è¡¨ç¤ºä¸¤é¡¶ç‚¹ä¸ç›´æŽ¥è¿žé€š + */ +void PrintGraph(MGraph G); + +#endif diff --git a/CLion/ExerciseBook/07.29/TestData_DG.txt b/CLion/ExerciseBook/07.29/TestData_DG.txt new file mode 100644 index 0000000..c16e388 --- /dev/null +++ b/CLion/ExerciseBook/07.29/TestData_DG.txt @@ -0,0 +1,6 @@ +图类型→0(有å‘图) +顶点数→8 +弧数→11 +弧是å¦å¸¦æœ‰å…¶ä»–ä¿¡æ¯â†’0 +顶点集→ã€a,b,c,d,e,f,u,v】 +弧的集åˆâ†’ã€u,c】ã€c,d】ã€d,e】ã€e,u】ã€d,v】ã€e,f】ã€f,v】ã€v,b】ã€b,f】ã€u,a】ã€a,b】 \ No newline at end of file diff --git a/CLion/ExerciseBook/07.30/07.30.c b/CLion/ExerciseBook/07.30/07.30.c new file mode 100644 index 0000000..4ac711b --- /dev/null +++ b/CLion/ExerciseBook/07.30/07.30.c @@ -0,0 +1,99 @@ +#include +#include "Status.h" +#include "MGraph.h" + +// 访问标志数组,记录访问过的顶点 +static Boolean visited[MAX_VERTEX_NUM]; + + +/* + * 找出有å‘图中所有回路 + */ +void Algo_7_30(MGraph G); + +/* + * æ‰“å°æœ‰å‘图中所有回路 + */ +void Circuit_7_30(MGraph G, int start, int end, int path[MAX_VERTEX_NUM + 1]); + + +int main(int argc, char* argv[]) { + MGraph G; + + printf("████████ 创建并输出图...\n"); + { + char* path[4]; + + path[0] = "TestData_DG.txt"; + path[1] = ""; + path[2] = ""; + path[3] = ""; + + CreateGraph(&G, path); + PrintGraph(G); + printf("\n"); + } + + printf("████████ 查找图中的回路...\n"); + { + Algo_7_30(G); + printf("\n"); + } + + return 0; +} + + +/* + * 找出有å‘图中所有回路 + */ +void Algo_7_30(MGraph G) { + int i; + int path[MAX_VERTEX_NUM + 1]; // 0å·å•元用æ¥è®°å½•pathä¸­å­˜å‚¨çš„é¡¶ç‚¹æ•°é‡ + + // 把所有顶点标记为未访问 + for(i = 0; i < G.vexnum; i++) { + visited[i] = FALSE; + } + + path[0] = 0; + + for(i = 0; i < G.vexnum; i++) { + Circuit_7_30(G, i, i, path); + } +} + +/* + * æ‰“å°æœ‰å‘图中所有回路 + */ +void Circuit_7_30(MGraph G, int start, int end, int path[MAX_VERTEX_NUM]) { + int i, w; + + path[0]++; + path[path[0]] = start; + visited[start] = TRUE; // 标记该顶点已进入路径 + + // é历顶点start的邻接点 + for(w = FirstAdjVex(G, G.vexs[start]); w >= 0; w = NextAdjVex(G, G.vexs[start], G.vexs[w])) { + // 如果é‡åˆ°äº†å·²åœ¨è·¯å¾„中的邻接点,说明出现了回路 + if(visited[w] == TRUE) { + if(w == end) { + // 输出回路 + for(i = 1; i <= path[0]; i++) { + printf("%c -> ", GetVex(G, path[i])); + } + printf("%c\n", GetVex(G, w)); + } + + } else { + // 筛掉é‡å¤è·¯å¾„ + if(w > end) { + Circuit_7_30(G, w, end, path); + } + } + } + + // 从路径中移除该顶点,并将其状æ€é™çº§ä¸º"已访问" + path[0]--; + visited[start] = FALSE; +} diff --git a/CLion/ExerciseBook/07.30/07.30.png b/CLion/ExerciseBook/07.30/07.30.png new file mode 100644 index 0000000000000000000000000000000000000000..02410bc62be3037124e596cce3277db9eab58733 GIT binary patch literal 10195 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 literal 0 HcmV?d00001 diff --git a/CLion/ExerciseBook/07.30/CMakeLists.txt b/CLion/ExerciseBook/07.30/CMakeLists.txt new file mode 100644 index 0000000..5ca7a3b --- /dev/null +++ b/CLion/ExerciseBook/07.30/CMakeLists.txt @@ -0,0 +1,12 @@ +# 包å«å…¬å…±åº“ +include_directories(${CMAKE_SOURCE_DIR}/Status) + +# 生æˆå¯æ‰§è¡Œæ–‡ä»¶ +add_executable(07.30 MGraph.h MGraph.c 07.30.c) +# 链接公共库 +target_link_libraries(07.30 Scanf_lib) + +# è®°å½•è¦æ‹·è´åˆ°*.exeç›®å½•ä¸‹çš„èµ„æºæ–‡ä»¶ +file(GLOB TestData TestData*.txt) +# å°†èµ„æºæ–‡ä»¶æ‹·è´åˆ°*.exe目录下,ä¸ç„¶æ— æ³•加载 +file(COPY ${TestData} DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) diff --git a/CLion/ExerciseBook/07.30/MGraph.c b/CLion/ExerciseBook/07.30/MGraph.c new file mode 100644 index 0000000..7751984 --- /dev/null +++ b/CLion/ExerciseBook/07.30/MGraph.c @@ -0,0 +1,299 @@ +/*================================= + * 图的数组(邻接矩阵)存储表示 + * + * 包å«ç®—法: 7.1ã€7.2ã€7.4ã€7.5ã€7.6 + ==================================*/ + +#include "MGraph.h" //**â–²07 图**// + +// 录入数æ®çš„æºæ–‡ä»¶ï¼›fp为null时,说明需è¦ä»ŽæŽ§åˆ¶å°å½•å…¥ +static FILE* fp = NULL; + +/* + * IncInfo指示该图/网的边/弧上是å¦å­˜åœ¨é™„加信æ¯ã€‚ + * 如果其值ä¸ä¸º0,则表示无附加信æ¯ï¼Œå¦åˆ™ï¼Œè¡¨ç¤ºå­˜åœ¨é™„加信æ¯ã€‚ + */ +Boolean IncInfo = FALSE; + + +/* + * ████████ 算法7.1 ████████ + * + * 创建图/表 + * + *ã€å¤‡æ³¨ã€‘ + * + * æ•™æä¸­é»˜è®¤ä»ŽæŽ§åˆ¶å°è¯»å–æ•°æ®ã€‚ + * 这里为了方便测试,é¿å…æ¯æ¬¡è¿è¡Œéƒ½æ‰‹åŠ¨è¾“å…¥æ•°æ®ï¼Œ + * 因而å…许选择从预设的文件pathä¸­è¯»å–æµ‹è¯•æ•°æ®ã€‚ + * + * 如果需è¦ä»ŽæŽ§åˆ¶å°è¯»å–æ•°æ®ï¼Œåˆ™path为NULL,或path[kind]为""。 + * 如果需è¦ä»Žæ–‡ä»¶ä¸­è¯»å–æ•°æ®ï¼Œåˆ™éœ€è¦åœ¨path中填写文件åä¿¡æ¯ã€‚ + */ +Status CreateGraph(MGraph* G, char* path[]) { + int readFromConsole; // 是å¦ä»ŽæŽ§åˆ¶å°è¯»å–æ•°æ® + int kind; + Status flag; + + // ★★★此处固定为有å‘图 + kind = 0; + + // 如果没有文件路径信æ¯ï¼Œåˆ™ä»ŽæŽ§åˆ¶å°è¯»å–输入 + readFromConsole = (path == NULL) || strcmp(path[kind], "") == 0; + + // 需è¦ä»Žæ–‡ä»¶è¯»å– + if(readFromConsole) { + (*G).kind = kind; // 记录图/网的类型 + } else { + // æ‰“å¼€æ–‡ä»¶ï¼Œå‡†å¤‡è¯»å–æµ‹è¯•æ•°æ® + fp = fopen(path[kind], "r"); + if(fp == NULL) { + return ERROR; + } + + // 录入图的类型 + ReadData(fp, "%d", &((*G).kind)); + } + + // éšæœºåˆ›å»ºæœ‰å‘图/网或无å‘图/ç½‘çš„ä¸€ç§ + switch((*G).kind) { + case DG: + flag = CreateDG(G); + break; + default: + flag = ERROR; + break; + } + + if(fp != NULL) { + fclose(fp); + fp = NULL; + } + + return flag; +} + +/* + * 构造有å‘图 + */ +static Status CreateDG(MGraph* G) { + int i, j, k; + ArcCell arcs = {0, NULL}; // 有å‘å›¾æ¯æ¡è¾¹çš„åˆå§‹å€¼ + VertexType v1, v2; + + if(fp == NULL) { + printf("请输入有å‘图的顶点数:"); + scanf("%d", &((*G).vexnum)); + printf("请输入有å‘图的弧数:"); + scanf("%d", &((*G).arcnum)); + printf("该有å‘图的弧上是å¦åŒ…å«å…¶ä»–附加信æ¯(0-ä¸åŒ…å«â”‚1-包å«):"); + scanf("%d", &IncInfo); + + // 录入顶点集 + printf("请录入 %d 个顶点,ä¸åŒé¡¶ç‚¹ä¹‹é—´ç”¨ç©ºæ ¼éš”开:", (*G).vexnum); + for(i = 0; i < (*G).vexnum; i++) { + // 跳过空白,寻找下一个"å¯è¯»"ç¬¦å· + skipBlank(stdin); + scanf("%c", &((*G).vexs[i])); + } + } else { + ReadData(fp, "%d", &((*G).vexnum)); // 录入顶点数 + ReadData(fp, "%d", &((*G).arcnum)); // 录入弧数 + ReadData(fp, "%d", &IncInfo); // 判断弧上是å¦åŒ…å«é™„åŠ ä¿¡æ¯ + + // 录入顶点集 + for(i = 0; i < (*G).vexnum; i++) { + // 跳过空白,寻找下一个"å¯è¯»"ç¬¦å· + skipBlank(fp); + ReadData(fp, "%c", &((*G).vexs[i])); + } + } + + // åˆå§‹åŒ–有å‘图的邻接矩阵 + for(i = 0; i < (*G).vexnum; i++) { + for(j = 0; j < (*G).vexnum; j++) { + (*G).arcs[i][j] = arcs; + } + } + + // 仅在控制å°å½•å…¥ä¿¡æ¯æ—¶è¾“出此æç¤º + if(fp == NULL && (*G).arcnum != 0) { + printf("请为有å‘图便¬¡å½•å…¥ %d æ¡å¼§çš„ä¿¡æ¯ï¼Œé¡¶ç‚¹ä¹‹é—´ç”¨ç©ºæ ¼éš”开:\n", (*G).arcnum); + } + + // å½•å…¥å¼§çš„ä¿¡æ¯ + for(k = 0; k < (*G).arcnum; k++) { + if(fp == NULL) { + printf("第 %2d æ¡å¼§ï¼š", k + 1); + skipBlank(stdin); // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + scanf("%c", &v1); + skipBlank(stdin); // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + scanf("%c", &v2); + } else { + // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + skipBlank(fp); + ReadData(fp, "%c%c", &v1, &v2); + } + + i = LocateVex(*G, v1); // 获å–顶点v1在顶点集中的ä½ç½® + j = LocateVex(*G, v2); // 获å–顶点v2在顶点集中的ä½ç½® + + // 将指定的顶点关系设置为1,指示这两个顶点是直接连接的(注:这里没有验è¯ä¸‹æ ‡æ˜¯å¦è¶Šç•Œ) + (*G).arcs[i][j].adj = 1; + + // 如果需è¦å½•å…¥å¼§çš„å…¶ä»–é™„åŠ ä¿¡æ¯ + if(IncInfo) { + // 最åŽå½•å…¥é™„åŠ ä¿¡æ¯ + Input(*G, &((*G).arcs[i][j].info)); + } + } + + // ä»Žæ–‡ä»¶ä¸­è¯»å–æ•°æ®æ—¶ï¼Œæœ€åŽå…¶å®žåº”当判断一下是å¦è¯»åˆ°äº†è¶³å¤Ÿçš„ä¿¡æ¯ + return OK; +} + +/* + * 录入边/å¼§çš„ç›¸å…³é™„åŠ ä¿¡æ¯ + */ +static void Input(MGraph G, InfoType** info) { + //录入边/弧的信æ¯ï¼Œæœ¬æµ‹è¯•涉åŠåˆ°çš„è¾¹/å¼§é»˜è®¤æ— å…¶ä»–é™„åŠ ä¿¡æ¯ +} + +/* + * 查找 + * + * 返回顶点u在图/网中的ä½ç½® + */ +int LocateVex(MGraph G, VertexType u) { + int i; + + for(i = 0; i < G.vexnum; i++) { + if(G.vexs[i] == u) { + return i; + } + } + + return -1; +} + +/* + * å–值 + * + * 返回索引v处的顶点值 + */ +VertexType GetVex(MGraph G, int v) { + if(v < 0 || v >= G.vexnum) { + return '\0'; // 指定的顶点ä¸å­˜åœ¨ + } + + return G.vexs[v]; +} + +/* + * 首个邻接点 + * + * 返回顶点v的首个邻接点 + */ +int FirstAdjVex(MGraph G, VertexType v) { + int kv, j; + VRType adj; + + kv = LocateVex(G, v); + if(kv == -1) { + return -1; // 指定的顶点ä¸å­˜åœ¨ + } + + // 确定一个éžè¿žé€šæ ‡è®° + if(G.kind == DG || G.kind == UDG) { + adj = 0; // 图 + } else if(G.kind == DN || G.kind == UDN) { + adj = INFINITE; // 网 + } else { + return -1; + } + + // 从头开始查找 + for(j = 0; j < G.vexnum; j++) { + // 找到与v直接连接的顶点 + if(G.arcs[kv][j].adj != adj) { + return j; + } + } + + return -1; +} + +/* + * 下一个邻接点 + * + * 返回顶点vçš„(相对于wçš„)下一个邻接点 + */ +int NextAdjVex(MGraph G, VertexType v, VertexType w) { + int kv, kw, j; + VRType adj; + + kv = LocateVex(G, v); + if(kv == -1) { + return -1; // 指定的顶点ä¸å­˜åœ¨ + } + + kw = LocateVex(G, w); + if(kw == -1) { + return -1; // 指定的顶点ä¸å­˜åœ¨ + } + + // 确定一个éžè¿žé€šæ ‡è®° + if(G.kind == DG || G.kind == UDG) { + adj = 0; // 图 + } else if(G.kind == DN || G.kind == UDN) { + adj = INFINITE; // 网 + } else { + return -1; + } + + // 从顶点wåŽå¼€å§‹æŸ¥æ‰¾ + for(j = kw + 1; j < G.vexnum; j++) { + // 找到与v直接连接的顶点 + if(G.arcs[kv][j].adj != adj) { + return j; + } + } + + return -1; +} + +/* + * 以图形化形å¼è¾“出当å‰ç»“æž„ + * + * 注:在网中,使用"-"æ¥è¡¨ç¤ºä¸¤é¡¶ç‚¹ä¸ç›´æŽ¥è¿žé€š + */ +void PrintGraph(MGraph G) { + int i, j; + + if(G.vexnum == 0) { + printf("空图,无需打å°ï¼\n"); + return; + } + + printf("当å‰å›¾/ç½‘åŒ…å« %2d 个顶点, %2d æ¡è¾¹/å¼§...\n", G.vexnum, G.arcnum); + + printf(" "); + for(i = 0; i < G.vexnum; i++) { + printf(" %c", G.vexs[i]); + } + printf("\n"); + + for(i = 0; i < G.vexnum; i++) { + printf("%c ", G.vexs[i]); + + for(j = 0; j < G.vexnum; j++) { + if(((G.kind == DG || G.kind == UDG) && G.arcs[i][j].adj == 0) || ((G.kind == DN || G.kind == UDN) && G.arcs[i][j].adj == INFINITE)) { + printf(" -"); + } else { + printf("%3d", G.arcs[i][j].adj); + } + } + + printf("\n"); + } +} diff --git a/CLion/ExerciseBook/07.30/MGraph.h b/CLion/ExerciseBook/07.30/MGraph.h new file mode 100644 index 0000000..4a33b72 --- /dev/null +++ b/CLion/ExerciseBook/07.30/MGraph.h @@ -0,0 +1,133 @@ +/*================================= + * 图的数组(邻接矩阵)存储表示 + * + * 包å«ç®—法: 7.1ã€7.2ã€7.4ã€7.5ã€7.6 + ==================================*/ + +#ifndef MGRAPH_H +#define MGRAPH_H + +#include +#include // æä¾›å®INT_MAX +#include // æä¾›memsetã€strcmp 原型 +#include // æä¾›å®va_listã€va_startã€va_argã€va_end +#include "Status.h" //**â–²01 绪论**// + +/* + * 注: + * + * 通常æ¥è®²ï¼Œæ— æƒå›¾è¢«ç®€ç§°ä¸ºã€å›¾ã€‘,有æƒå›¾è¢«ç®€ç§°ä¸ºã€ç½‘】。 + * æ— å‘图/网中的顶点关系被称为ã€è¾¹ã€‘,有å‘图/网中的顶点关系被称为ã€å¼§ã€‘,并区分弧头与弧尾。 + * 实际表述中,未必会严格éµå®ˆä»¥ä¸Šå‘½å。 + */ + +/* å®å®šä¹‰ */ +#define INFINITE INT_MAX // 最大值,用æ¥è¡¨ç¤ºç½‘中的两个顶点ä¸ç›´æŽ¥è¿žæŽ¥ +#define MAX_VERTEX_NUM 26 // 最大顶点个数 + + +// 图的类型 +typedef enum { + DG, // 0-有å‘图 + DN, // 1-有å‘网(带æƒå€¼) + UDG, // 2-æ— å‘图 + UDN // 3-æ— å‘网(带æƒå€¼) +} GraphKind; + +// 顶点类型 +typedef char VertexType; + +/* + * 顶点关系类型 + * + * 在无æƒå›¾ä¸­ï¼Œè¯¥å€¼é€šå¸¸ä¸º0或1,表示两顶点是å¦ç›´æŽ¥è¿žé€šï¼› + * 在有æƒå›¾ä¸­ï¼Œè¯¥å€¼é€šå¸¸ä¸ºæƒå€¼ã€‚ + */ +typedef int VRType; + +// è¾¹çš„ç›¸å…³é™„åŠ ä¿¡æ¯ +typedef struct { + // 如果有的è¯ï¼ŒåŽç»­ä¼šæ·»åŠ ç›¸åº”çš„å±žæ€§ +} InfoType; + +// è¾¹çš„ç±»åž‹ï¼Œæ¯æ¡è¾¹ä¸Šå¯èƒ½æœ‰é™„加信æ¯info +typedef struct ArcCell { + VRType adj; // 顶点关系,在有æƒå›¾è·Ÿæ— æƒå›¾ä¸­çš„å«ä¹‰ä¸åŒ + InfoType* info; // 边的附加信æ¯ï¼Œé€šå¸¸å¿½ç•¥ +} ArcCell; + +/* 图/网的数组(邻接矩阵)存储表示类型定义 */ +typedef struct { + VertexType vexs[MAX_VERTEX_NUM]; // 顶点å‘é‡ + ArcCell arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; // 邻接矩阵 + int vexnum, arcnum; // 图/网的顶点数和弧数 + GraphKind kind; // 图的类型标志 +} MGraph; + + +// è¾¹/弧上是å¦å­˜åœ¨é™„åŠ ä¿¡æ¯ +extern Boolean IncInfo; + + +/* + * ████████ 算法7.1 ████████ + * + * 创建 + * + *ã€å¤‡æ³¨ã€‘ + * + * æ•™æä¸­é»˜è®¤ä»ŽæŽ§åˆ¶å°è¯»å–æ•°æ®ã€‚ + * 这里为了方便测试,é¿å…æ¯æ¬¡è¿è¡Œéƒ½æ‰‹åŠ¨è¾“å…¥æ•°æ®ï¼Œ + * 因而å…许选择从预设的文件pathä¸­è¯»å–æµ‹è¯•æ•°æ®ã€‚ + * + * 如果需è¦ä»ŽæŽ§åˆ¶å°è¯»å–æ•°æ®ï¼Œåˆ™path为NULL,或path[kind]为""。 + * 如果需è¦ä»Žæ–‡ä»¶ä¸­è¯»å–æ•°æ®ï¼Œåˆ™éœ€è¦åœ¨path中填写文件åä¿¡æ¯ã€‚ + */ +Status CreateGraph(MGraph* G, char* path[]); + +/* + * 构造无å‘图 + */ +static Status CreateDG(MGraph* G); + +/* + * å½•å…¥è¾¹çš„ç›¸å…³é™„åŠ ä¿¡æ¯ + */ +static void Input(MGraph G, InfoType** info); + +/* + * 查找 + * + * 返回顶点u在图/网中的ä½ç½® + */ +int LocateVex(MGraph G, VertexType u); + +/* + * å–值 + * + * 返回索引v处的顶点值 + */ +VertexType GetVex(MGraph G, int v); + +/* + * 首个邻接点 + * + * 返回顶点v的首个邻接点 + */ +int FirstAdjVex(MGraph G, VertexType v); + +/* + * 下一个邻接点 + * + * 返回顶点vçš„(相对于wçš„)下一个邻接点 + */ +int NextAdjVex(MGraph G, VertexType v, VertexType w); + +/* + * 以图形化形å¼è¾“出当å‰ç»“æž„ + * + * 注:在网中,使用"-"æ¥è¡¨ç¤ºä¸¤é¡¶ç‚¹ä¸ç›´æŽ¥è¿žé€š + */ +void PrintGraph(MGraph G); + +#endif diff --git a/CLion/ExerciseBook/07.30/TestData_DG.txt b/CLion/ExerciseBook/07.30/TestData_DG.txt new file mode 100644 index 0000000..1602489 --- /dev/null +++ b/CLion/ExerciseBook/07.30/TestData_DG.txt @@ -0,0 +1,6 @@ +图类型→0(有å‘图) +顶点数→12 +弧数→16 +弧是å¦å¸¦æœ‰å…¶ä»–ä¿¡æ¯â†’0 +顶点集→ã€A,B,C,D,E,F,G,H,I,J,K,L】 +弧的集åˆâ†’ã€A,E】ã€B,E】ã€E,C】ã€C,F】ã€F,E】ã€D,E】ã€G,D】ã€E,H】ã€E,I】ã€I,H】ã€H,G】ã€J,G】ã€H,K】ã€L,I】ã€L,K】ã€K,J】 \ No newline at end of file diff --git a/CLion/ExerciseBook/07.31/07.31.c b/CLion/ExerciseBook/07.31/07.31.c new file mode 100644 index 0000000..2c8408c --- /dev/null +++ b/CLion/ExerciseBook/07.31/07.31.c @@ -0,0 +1,47 @@ +#include +#include "OLGraph.h" +#include "StronglyConnectedComponents.h" + +/* + * 求有å‘å›¾çš„å¼ºè¿žé€šåˆ†é‡ + */ +void Algo_7_31(OLGraph G); + + +int main(int argc, char* argv[]) { + OLGraph G; + + printf("████████ åˆ›å»ºå¹¶æ‰“å°æœ‰å‘图... \n"); + { + char* path[4]; + + path[0] = "TestData_DG.txt"; + path[1] = ""; + path[2] = ""; + path[3] = ""; + + CreateGraph(&G, path); + PrintGraph(G); + printf("\n"); + } + + printf("████████ 求有å‘图的强连通分é‡... \n"); + { + Algo_7_31(G); + printf("\n"); + } + + return 0; +} + + +/* + * 求有å‘å›¾çš„å¼ºè¿žé€šåˆ†é‡ + */ +void Algo_7_31(OLGraph G) { + printf("Tarjan算法:\n"); + Tarjan(G); + +// printf("Kosaraju算法:\n"); +// Kosaraju(G); +} diff --git a/CLion/ExerciseBook/07.31/07.31.png b/CLion/ExerciseBook/07.31/07.31.png new file mode 100644 index 0000000000000000000000000000000000000000..51f1816934785bad42bae40219de9d96274fca32 GIT binary patch literal 55908 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 P{<*89saPRz8T5Yu3gj_8 literal 0 HcmV?d00001 diff --git a/CLion/ExerciseBook/07.31/CMakeLists.txt b/CLion/ExerciseBook/07.31/CMakeLists.txt new file mode 100644 index 0000000..e6810c6 --- /dev/null +++ b/CLion/ExerciseBook/07.31/CMakeLists.txt @@ -0,0 +1,12 @@ +# 包å«å…¬å…±åº“ +include_directories(${CMAKE_SOURCE_DIR}/Status) + +# 生æˆå¯æ‰§è¡Œæ–‡ä»¶ +add_executable(07.31 OLGraph.h OLGraph.c StronglyConnectedComponents.h StronglyConnectedComponents.c 07.31.c) +# 链接公共库 +target_link_libraries(07.31 Scanf_lib) + +# è®°å½•è¦æ‹·è´åˆ°*.exeç›®å½•ä¸‹çš„èµ„æºæ–‡ä»¶ +file(GLOB TestData TestData*.txt) +# å°†èµ„æºæ–‡ä»¶æ‹·è´åˆ°*.exe目录下,ä¸ç„¶æ— æ³•加载 +file(COPY ${TestData} DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) diff --git a/CLion/ExerciseBook/07.31/OLGraph.c b/CLion/ExerciseBook/07.31/OLGraph.c new file mode 100644 index 0000000..f0bd34a --- /dev/null +++ b/CLion/ExerciseBook/07.31/OLGraph.c @@ -0,0 +1,509 @@ +/*==================== + * 图的å字链表存储表示 + * + * 包å«ç®—法: 7.3 + ====================*/ + +#include "OLGraph.h" + +// 录入数æ®çš„æºæ–‡ä»¶ï¼›fp为null时,说明需è¦ä»ŽæŽ§åˆ¶å°å½•å…¥ +static FILE* fp = NULL; + +/* + * IncInfo指示该图的边上是å¦å­˜åœ¨é™„加信æ¯ã€‚ + * 如果其值ä¸ä¸º0,则表示无附加信æ¯ï¼Œå¦åˆ™ï¼Œè¡¨ç¤ºå­˜åœ¨é™„加信æ¯ã€‚ + */ +Boolean IncInfo = FALSE; + +// 访问标志数组,记录访问过的顶点 +static Boolean visited[MAX_VERTEX_NUM]; + +// 函数å˜é‡ +static Status (* VisitFunc)(VertexType e); + + +/* + * 创建 + * + *ã€å¤‡æ³¨ã€‘ + * + * æ•™æä¸­é»˜è®¤ä»ŽæŽ§åˆ¶å°è¯»å–æ•°æ®ã€‚ + * 这里为了方便测试,é¿å…æ¯æ¬¡è¿è¡Œéƒ½æ‰‹åŠ¨è¾“å…¥æ•°æ®ï¼Œ + * 因而å…许选择从预设的文件pathä¸­è¯»å–æµ‹è¯•æ•°æ®ã€‚ + * + * 如果需è¦ä»ŽæŽ§åˆ¶å°è¯»å–æ•°æ®ï¼Œåˆ™path为NULL,或path[kind]为""。 + * 如果需è¦ä»Žæ–‡ä»¶ä¸­è¯»å–æ•°æ®ï¼Œåˆ™éœ€è¦åœ¨path中填写文件åä¿¡æ¯ã€‚ + */ +Status CreateGraph(OLGraph* G, char* path[]) { + int readFromConsole; // 是å¦ä»ŽæŽ§åˆ¶å°è¯»å–æ•°æ® + int kind; + Status flag; + + // ★★★此处固定为有å‘图 + kind = 0; + + // 如果没有文件路径信æ¯ï¼Œåˆ™ä»ŽæŽ§åˆ¶å°è¯»å–输入 + readFromConsole = (path == NULL) || strcmp(path[kind], "") == 0; + + // 需è¦ä»Žæ–‡ä»¶è¯»å– + if(readFromConsole) { + (*G).kind = kind; // 记录图/网的类型 + } else { + // æ‰“å¼€æ–‡ä»¶ï¼Œå‡†å¤‡è¯»å–æµ‹è¯•æ•°æ® + fp = fopen(path[kind], "r"); + if(fp == NULL) { + return ERROR; + } + + // 录入图的类型 + ReadData(fp, "%d", &((*G).kind)); + } + + // éšæœºåˆ›å»ºæœ‰å‘图/网或无å‘图/ç½‘çš„ä¸€ç§ + switch((*G).kind) { + case DG: + flag = CreateDG(G); + break; + default: + flag = ERROR; + break; + } + + if(fp != NULL) { + fclose(fp); + fp = NULL; + } + + return flag; +} + +/* + * ████████ 算法7.3 ████████ + * + * 构造有å‘图 + * + * 注: + * æ•™æä¸­ä½¿ç”¨äº†å¤´æ’æ³•æ¥æ’入弧,这ç§åšæ³•çš„å”¯ä¸€ä¼˜ç‚¹æ˜¯æ’入方便, + * 但是在涉åŠåˆ°åˆ é™¤æˆ–查找时,效率较低; + * 而且,"å¤´æ’æ³•"ä¾èµ–输入的顺åºï¼Œå¦‚果输入的边/弧是乱åºçš„, + * 则最终构造出的图/网中的边/弧也是无åºçš„。 + * + * 为了克æœä»¥ä¸Šç¼ºç‚¹ï¼Œè¿™é‡Œæ”¹ç”¨"å‡åº"æ’入法,ä¿è¯æ’入的弧是"å‡åº"的。 + * ä½†åŒæ—¶ï¼Œè¿™æ ·åšä¼šä½¿"æ’å…¥"算法å˜å¾—è¾ƒä¸ºå¤æ‚。 + */ +static Status CreateDG(OLGraph* G) { + int i, k; + int vexnum, arcnum; + VertexType v1, v2; + InfoType* info = NULL; + + (*G).vexnum = (*G).arcnum = 0; + + if(fp == NULL) { + printf("请输入有å‘图的顶点数:"); + scanf("%d", &vexnum); + printf("请输入有å‘图的弧数:"); + scanf("%d", &arcnum); + printf("该有å‘图的弧上是å¦åŒ…å«å…¶ä»–附加信æ¯(0-ä¸åŒ…å«â”‚1-包å«):"); + scanf("%d", &IncInfo); + + // 录入顶点集 + printf("请录入 %d 个顶点,ä¸åŒé¡¶ç‚¹ä¹‹é—´ç”¨ç©ºæ ¼éš”开:", vexnum); + for(i = 0; i < vexnum; i++) { + scanf("%c", &((*G).xlist[i].data)); + (*G).xlist[i].firstin = NULL; + (*G).xlist[i].firstout = NULL; + (*G).vexnum++; + } + } else { + ReadData(fp, "%d", &vexnum); // 录入顶点数 + ReadData(fp, "%d", &arcnum); // 录入弧数 + ReadData(fp, "%d", &IncInfo); // 判断弧上是å¦åŒ…å«é™„åŠ ä¿¡æ¯ + + // 录入顶点集 + for(i = 0; i < vexnum; i++) { + // 跳过空白,寻找下一个"å¯è¯»"ç¬¦å· + skipBlank(fp); + ReadData(fp, "%c", &((*G).xlist[i].data)); + (*G).xlist[i].firstin = NULL; + (*G).xlist[i].firstout = NULL; + (*G).vexnum++; + } + } + + // 仅在控制å°å½•å…¥ä¿¡æ¯æ—¶è¾“出此æç¤º + if(fp == NULL && arcnum != 0) { + printf("请为有å‘图便¬¡å½•å…¥ %d æ¡å¼§çš„ä¿¡æ¯ï¼Œé¡¶ç‚¹ä¹‹é—´ç”¨ç©ºæ ¼éš”开:\n", arcnum); + } + + // å½•å…¥å¼§çš„ä¿¡æ¯ + for(k = 0; k < arcnum; k++) { + if(fp == NULL) { + printf("第 %2d æ¡å¼§ï¼š", k + 1); + skipBlank(stdin); // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + scanf("%c", &v1); + skipBlank(stdin); // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + scanf("%c", &v2); + } else { + // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + skipBlank(fp); + ReadData(fp, "%c%c", &v1, &v2); + } + + // 如果需è¦å½•å…¥å¼§çš„å…¶ä»–é™„åŠ ä¿¡æ¯ + if(IncInfo) { + // 最åŽå½•å…¥é™„åŠ ä¿¡æ¯ + Input(*G, &info); + } + + // æ’入弧 + InsertArc(G, v1, v2, info); + } + + // ä»Žæ–‡ä»¶ä¸­è¯»å–æ•°æ®æ—¶ï¼Œæœ€åŽå…¶å®žåº”当判断一下是å¦è¯»åˆ°äº†è¶³å¤Ÿçš„ä¿¡æ¯ + return OK; +} + +/* + * å½•å…¥å¼§çš„ç›¸å…³é™„åŠ ä¿¡æ¯ + */ +static void Input(OLGraph G, InfoType** info) { + int weight; + + // 在"网"的情形下需è¦å½•å…¥æƒå€¼ä¿¡æ¯ + if(G.kind == DN || G.kind == UDN) { + *info = (InfoType*) malloc(sizeof(InfoType)); + + if(fp == NULL) { + scanf("%d", &weight); + } else { + ReadData(fp, "%d", &weight); + } + + (*info)->weight = weight; + } +} + +/* + * 查找 + * + * 返回顶点u在图/网中的ä½ç½® + */ +int LocateVex(OLGraph G, VertexType u) { + int i; + + for(i = 0; i < G.vexnum; i++) { + if(G.xlist[i].data == u) { + return i; + } + } + + return -1; +} + +/* + * å–值 + * + * 返回索引v处的顶点值 + */ +VertexType GetVex(OLGraph G, int v) { + if(v < 0 || v >= G.vexnum) { + return '\0'; // 指定的顶点ä¸å­˜åœ¨ + } + + return G.xlist[v].data; +} + +/* + * 首个邻接点 + * + * 返回顶点v的首个邻接点 + */ +int FirstAdjVex(OLGraph G, VertexType v) { + int k; + ArcBox* r; + + // 首先需è¦åˆ¤æ–­è¯¥é¡¶ç‚¹æ˜¯å¦å­˜åœ¨ + k = LocateVex(G, v); + if(k == -1) { + return -1; // 指定的顶点ä¸å­˜åœ¨ + } + + r = G.xlist[k].firstout; + if(r == NULL) { + return -1; + } else { + return r->headvex; + } +} + +/* + * 下一个邻接点 + * + * 返回顶点vçš„(相对于wçš„)下一个邻接点 + */ +int NextAdjVex(OLGraph G, VertexType v, VertexType w) { + int kv, kw; + ArcBox* r; + + // 首先需è¦åˆ¤æ–­è¯¥é¡¶ç‚¹æ˜¯å¦å­˜åœ¨ + kv = LocateVex(G, v); + if(kv == -1) { + return -1; // 指定的顶点ä¸å­˜åœ¨ + } + + // 首先需è¦åˆ¤æ–­è¯¥é¡¶ç‚¹æ˜¯å¦å­˜åœ¨ + kw = LocateVex(G, w); + if(kw == -1) { + return -1; // 指定的顶点ä¸å­˜åœ¨ + } + + r = G.xlist[kv].firstout; + if(r == NULL) { + return -1; // 链表为空 + } + + // 在链表中查找w + while(r != NULL && r->headvex < kw) { + r = r->tlink; + } + + // 如果没找到w + if(r == NULL) { + return -1; + } + + // 如果找到了w,但是wåŽé¢æ²¡æœ‰åˆ«çš„顶点,那么也无法返回邻接点 + if(r->headvex == kw && r->tlink != NULL) { + return r->tlink->headvex; + } + + return -1; +} + +/* + * 构造一个边/弧结点(ä»…é™å†…部使用) + */ +static ArcBox* newArcBoxPtr(int tailvex, int headvex, ArcBox* hlink, ArcBox* tlink, InfoType* info) { + ArcBox* p = (ArcBox*) malloc(sizeof(ArcBox)); + if(!p) { + exit(OVERFLOW); + } + + p->tailvex = tailvex; + p->headvex = headvex; + + p->hlink = hlink; + p->tlink = tlink; + + p->info = info; + + return p; +} + +/* + * æ’入边/å¼§ + * + * 如果当å‰å›¾/网是无å‘的,则æ’入一æ¡å¼§éœ€è¦å¢žåŠ ä¸¤ä¸ªé¡¶ç‚¹å…³ç³»ï¼Œä½†å¼§çš„æ•°é‡åªå¢žä¸€ã€‚ + * 对于图/网æ¥è¯´ï¼Œå¯ä»¥åœ¨å¯å˜å‚数中列出边/弧的附加信æ¯ã€‚ + * + * æ³¨ï¼šæ­¤å¤„æŽ¥æ”¶çš„å‚æ•°ä¸ŽMGraph有些ä¸ä¸€æ ·ï¼šç½‘的附加信æ¯ä¸­åŒ…å«äº†å„æ¡è¾¹/å¼§çš„æƒå€¼ã€‚ + */ +Status InsertArc(OLGraph* G, VertexType v, VertexType w, ...) { + int tail, head, k, count; + ArcBox* p; + ArcBox* pre; + ArcBox* r; + Boolean overlay = FALSE; // 是å¦ä¸ºè¦†ç›–添加 + InfoType* info = NULL; // è¾¹/å¼§çš„é™„åŠ ä¿¡æ¯ + va_list ap; + + tail = LocateVex(*G, v); // 获å–顶点v在顶点集中的ä½ç½® + if(tail == -1) { + return ERROR; // 指定的顶点ä¸å­˜åœ¨ + } + + head = LocateVex(*G, w); // 获å–顶点w在顶点集中的ä½ç½® + if(head == -1) { + return ERROR; // 指定的顶点ä¸å­˜åœ¨ + } + + // æ‹’ç»çޝ + if(tail == head) { + return ERROR; + } + + // 如果边/å¼§ä¸Šå­˜åœ¨é™„åŠ ä¿¡æ¯ + if(IncInfo) { + va_start(ap, w); // 在wåŽæŸ¥è¯¢é¦–个å¯å˜å‚æ•° + info = va_arg(ap, InfoType*); // 获å–é™„åŠ ä¿¡æ¯ + va_end(ap); + } + + /* 接下æ¥ï¼Œéœ€è¦æŸ¥æ‰¾åˆé€‚çš„æ’å…¥ä½ç½® */ + + for(count = 0; count < 2; count++) { + + // 在横å‘链表上查找åˆé€‚çš„æ’å…¥ä½ç½® + pre = NULL; + // 指å‘以tail为尾的首æ¡è¾¹/å¼§ + r = G->xlist[tail].firstout; + while(r != NULL && r->headvex < head) { + pre = r; + r = r->tlink; + } + + // é‡åˆ°äº†ç›¸åŒä½ç½®çš„结点 + if(r != NULL && r->headvex == head) { + r->info = info; // å¤ç”¨è¯¥ç»“点 + overlay = TRUE; // å‘生了覆盖 + } else { + p = newArcBoxPtr(tail, head, NULL, r, info); + + if(pre == NULL) { + G->xlist[tail].firstout = p; + } else { + pre->tlink = p; + } + } + + // 如果没有å‘生覆盖,说明æ’入了新结点,此时需è¦è€ƒè™‘其在纵å‘链表上的ä½ç½® + if(overlay == FALSE) { + // 在纵å‘链表上查找åˆé€‚çš„æ’å…¥ä½ç½® + pre = NULL; + // 指å‘以head为头的首æ¡è¾¹/å¼§ + r = G->xlist[head].firstin; + while(r != NULL && r->tailvex < tail) { + pre = r; + r = r->hlink; + } + + // é‡åˆ°äº†ç›¸åŒä½ç½®çš„结点 + if(r != NULL && r->tailvex == tail) { + // ä¸ä¼šæ‰§è¡Œåˆ°è¿™é‡Œï¼Œå› ä¸ºå¦‚æžœå‘生了覆盖,å‰é¢è¿›ä¸æ¥ + } else { + /* 至此,结点på·²ç»å­˜åœ¨äº† */ + + if(pre == NULL) { + p->hlink = G->xlist[head].firstin; + G->xlist[head].firstin = p; + } else { + p->hlink = pre->hlink; + pre->hlink = p; + } + } + } + + // 如果当å‰å›¾/网是无å‘的,需è¦è€ƒè™‘对称性 + if((G->kind == UDG || G->kind == UDN) && tail != head) { + // 颠倒iå’Œj + k = tail; + tail = head; + head = k; + } else { + break; // 如果是有å‘的,å¯ä»¥ç»“æŸäº† + } + } + + // 在éžè¦†ç›–的情形下,æ‰è€ƒè™‘æ›´æ–°è¾¹/å¼§çš„æ•°é‡ + if(!overlay) { + (*G).arcnum++; // ä¸è®ºæœ‰å‘æ— å‘,边/å¼§æ•°åªå¢žä¸€ + } + + return OK; +} + +/* + * 深度优先é历(此处借助递归实现) + */ +void DFSTraverse(OLGraph G, Status(Visit)(VertexType)) { + int v; + + // 使用全局å˜é‡VisitFunc,使得DFSä¸å¿…è®¾ç½®å‡½æ•°æŒ‡é’ˆå‚æ•° + VisitFunc = Visit; + + // 访问标志数组åˆå§‹åŒ– + for(v = 0; v < G.vexnum; v++) { + visited[v] = FALSE; + } + + // 此处需è¦é历的原因是并ä¸èƒ½ä¿è¯æ‰€æœ‰é¡¶ç‚¹éƒ½è¿žæŽ¥åœ¨äº†ä¸€èµ· + for(v = 0; v < G.vexnum; v++) { + if(!visited[v]) { + DFS(G, v); // 对尚未访问的顶点调用DFS + } + } +} + +/* + * 深度优先é历核心函数 + */ +static void DFS(OLGraph G, int v) { + int w; + + // 从第v个顶点出å‘递归地深度优先é历图G + visited[v] = TRUE; + + // 访问第v个顶点 + VisitFunc(G.xlist[v].data); + + for(w = FirstAdjVex(G, G.xlist[v].data); + w >= 0; + w = NextAdjVex(G, G.xlist[v].data, G.xlist[w].data)) { + if(!visited[w]) { + DFS(G, w); // 对尚未访问的顶点调用DFS + } + } +} + +/* + * 以图形化形å¼è¾“出当å‰ç»“æž„ + */ +void PrintGraph(OLGraph G) { + int i, head; + ArcBox* p; + + if(G.vexnum == 0) { + printf("空图,无需打å°ï¼\n"); + return; + } + + printf("当å‰å›¾/ç½‘åŒ…å« %2d 个顶点, %2d æ¡è¾¹/å¼§...\n", G.vexnum, G.arcnum); + + for(i = 0; i < G.vexnum; i++) { + printf("%c ===> ", G.xlist[i].data); + + head = 0; + p = G.xlist[i].firstout; + + while(p != NULL) { + if(head < p->headvex) { + if(IncInfo == 0) { + printf(" "); + + // 对于网,会从其附加信æ¯ä¸­èŽ·å–到æƒå€¼ + } else { + printf(" "); + } + } else { + if(IncInfo == 0) { + printf("<%c, %c>", G.xlist[p->tailvex].data, G.xlist[p->headvex].data); + + // 对于网,会从其附加信æ¯ä¸­èŽ·å–到æƒå€¼ + } else { + printf("<%c, %c, %2d>", G.xlist[p->tailvex].data, G.xlist[p->headvex].data, p->info->weight); + } + + p = p->tlink; + } + + head++; + + if(p != NULL) { + printf(" "); + } + } + + printf("\n"); + } +} diff --git a/CLion/ExerciseBook/07.31/OLGraph.h b/CLion/ExerciseBook/07.31/OLGraph.h new file mode 100644 index 0000000..9a9dc81 --- /dev/null +++ b/CLion/ExerciseBook/07.31/OLGraph.h @@ -0,0 +1,175 @@ +/*==================== + * 图的å字链表存储表示 + * + * 包å«ç®—法: 7.3 + ====================*/ + +#ifndef OLGRAPH_H +#define OLGRAPH_H + +#include +#include // æä¾›memsetã€strcmp 原型 +#include // æä¾›å®va_listã€va_startã€va_argã€va_end +#include // æä¾›mallocã€reallocã€freeã€exit原型 +#include "Status.h" //**â–²01 绪论**// + +/* + * 注: + * + * 通常æ¥è®²ï¼Œæ— æƒå›¾è¢«ç®€ç§°ä¸ºã€å›¾ã€‘,有æƒå›¾è¢«ç®€ç§°ä¸ºã€ç½‘】。 + * æ— å‘图/网中的顶点关系被称为ã€è¾¹ã€‘,有å‘图/网中的顶点关系被称为ã€å¼§ã€‘,并区分弧头与弧尾。 + * 实际表述中,未必会严格éµå®ˆä»¥ä¸Šå‘½å。 + * + * 当å‰ç»“构适åˆå­˜å‚¨æœ‰å‘图。 + * + * ★ æ’入边/å¼§çš„ä¿¡æ¯æ—¶ï¼Œè¿™é‡Œçš„实现是按"å‡åº"æ’入的,这使得æ’入的弧是按"å‡åº"排列的。 + */ + + +/* å®å®šä¹‰ */ +#define MAX_VERTEX_NUM 26 // 最大顶点个数 + + +// 图的类型 +typedef enum { + DG, // 0-有å‘图 + DN, // 1-有å‘网(带æƒå€¼) + UDG, // 2-æ— å‘图 + UDN // 3-æ— å‘网(带æƒå€¼) +} GraphKind; + +// 顶点类型 +typedef char VertexType; + +// è¾¹/å¼§çš„ç›¸å…³é™„åŠ ä¿¡æ¯ +typedef struct { + /* + * 注: + * æ•™æä¸­ç»™å‡ºçš„结构åªè€ƒè™‘了无æƒå›¾ï¼Œè€Œæ²¡è€ƒè™‘有æƒå›¾(网)。 + * 这里为了把“网â€çš„æƒ…形也考虑进去,特在附加信æ¯ä¸­å¢žåŠ äº†"æƒé‡"属性。 + */ + int weight; +} InfoType; + +/* è¾¹/弧结点 */ +typedef struct ArcBox { + int tailvex; // 弧头顶点ä½ç½® + int headvex; // 弧尾顶点ä½ç½® + struct ArcBox* hlink; // 指å‘下一个拥有相åŒå¼§å¤´çš„å¼§ + struct ArcBox* tlink; // 指å‘下一个拥有相åŒå¼§å°¾çš„å¼§ + InfoType* info; // è¯¥å¼§çš„ç›¸å…³é™„åŠ ä¿¡æ¯ +} ArcBox; + +// æ¯ä¸ªæ¨ªå‘链表的头结点 +typedef struct VexNode { + VertexType data; // 顶点 + ArcBox* firstin; // 指å‘该顶点的第一æ¡å…¥å¼§ + ArcBox* firstout; // 指å‘该顶点的第一æ¡å‡ºå¼§ +} VexNode; + +/* 图的å字链表存储表示类型定义 */ +typedef struct { + VexNode xlist[MAX_VERTEX_NUM]; // 表头å‘é‡ + int vexnum, arcnum; // 顶点数和弧数 + GraphKind kind; // 图的类型标志 +} OLGraph; + + +// è¾¹/弧上是å¦å­˜åœ¨é™„åŠ ä¿¡æ¯ +extern Boolean IncInfo; + + +/* + * 创建 + * + *ã€å¤‡æ³¨ã€‘ + * + * æ•™æä¸­é»˜è®¤ä»ŽæŽ§åˆ¶å°è¯»å–æ•°æ®ã€‚ + * 这里为了方便测试,é¿å…æ¯æ¬¡è¿è¡Œéƒ½æ‰‹åŠ¨è¾“å…¥æ•°æ®ï¼Œ + * 因而å…许选择从预设的文件pathä¸­è¯»å–æµ‹è¯•æ•°æ®ã€‚ + * + * 如果需è¦ä»ŽæŽ§åˆ¶å°è¯»å–æ•°æ®ï¼Œåˆ™path为NULL,或path[kind]为""。 + * 如果需è¦ä»Žæ–‡ä»¶ä¸­è¯»å–æ•°æ®ï¼Œåˆ™éœ€è¦åœ¨path中填写文件åä¿¡æ¯ã€‚ + */ +Status CreateGraph(OLGraph* G, char* path[]); + +/* + * ████████ 算法7.3 ████████ + * + * 构造有å‘图 + * + * 注: + * æ•™æä¸­ä½¿ç”¨äº†å¤´æ’æ³•æ¥æ’入弧,这ç§åšæ³•çš„å”¯ä¸€ä¼˜ç‚¹æ˜¯æ’入方便, + * 但是在涉åŠåˆ°åˆ é™¤æˆ–查找时,效率较低; + * 而且,"å¤´æ’æ³•"ä¾èµ–输入的顺åºï¼Œå¦‚果输入的边/弧是乱åºçš„, + * 则最终构造出的图/网中的边/弧也是无åºçš„。 + * + * 为了克æœä»¥ä¸Šç¼ºç‚¹ï¼Œè¿™é‡Œæ”¹ç”¨"å‡åº"æ’入法,ä¿è¯æ’入的弧是"å‡åº"的。 + * ä½†åŒæ—¶ï¼Œè¿™æ ·åšä¼šä½¿"æ’å…¥"算法å˜å¾—è¾ƒä¸ºå¤æ‚。 + */ +static Status CreateDG(OLGraph* G); + +/* + * å½•å…¥å¼§çš„ç›¸å…³é™„åŠ ä¿¡æ¯ + */ +static void Input(OLGraph G, InfoType** info); + +/* + * 查找 + * + * 返回顶点u在图/网中的ä½ç½® + */ +int LocateVex(OLGraph G, VertexType u); + +/* + * å–值 + * + * 返回索引v处的顶点值 + */ +VertexType GetVex(OLGraph G, int v); + +/* + * 首个邻接点 + * + * 返回顶点v的首个邻接点 + */ +int FirstAdjVex(OLGraph G, VertexType v); + +/* + * 下一个邻接点 + * + * 返回顶点vçš„(相对于wçš„)下一个邻接点 + */ +int NextAdjVex(OLGraph G, VertexType v, VertexType w); + +/* + * 构造一个边/弧结点(ä»…é™å†…部使用) + */ +static ArcBox* newArcBoxPtr(int tailvex, int headvex, ArcBox* hlink, ArcBox* tlink, InfoType* info); + +/* + * æ’入边/å¼§ + * + * 如果当å‰å›¾/网是无å‘的,则æ’入一æ¡å¼§éœ€è¦å¢žåŠ ä¸¤ä¸ªé¡¶ç‚¹å…³ç³»ï¼Œä½†å¼§çš„æ•°é‡åªå¢žä¸€ã€‚ + * 对于图/网æ¥è¯´ï¼Œå¯ä»¥åœ¨å¯å˜å‚数中列出边/弧的附加信æ¯ã€‚ + * + * æ³¨ï¼šæ­¤å¤„æŽ¥æ”¶çš„å‚æ•°ä¸ŽMGraph有些ä¸ä¸€æ ·ï¼šç½‘的附加信æ¯ä¸­åŒ…å«äº†å„æ¡è¾¹/å¼§çš„æƒå€¼ã€‚ + */ +Status InsertArc(OLGraph* G, VertexType v, VertexType w, ...); + +/* + * 深度优先é历(此处借助递归实现) + */ +void DFSTraverse(OLGraph G, Status(Visit)(VertexType)); + +/* + * 深度优先é历核心函数 + */ +static void DFS(OLGraph G, int v); + +/* + * 以图形化形å¼è¾“出当å‰ç»“æž„ + */ +void PrintGraph(OLGraph G); + +#endif diff --git a/CLion/ExerciseBook/07.31/StronglyConnectedComponents.c b/CLion/ExerciseBook/07.31/StronglyConnectedComponents.c new file mode 100644 index 0000000..c1b141b --- /dev/null +++ b/CLion/ExerciseBook/07.31/StronglyConnectedComponents.c @@ -0,0 +1,262 @@ +/*================== + * 有å‘å›¾çš„å¼ºè¿žé€šåˆ†é‡ + ===================*/ + +#include "StronglyConnectedComponents.h" + + +/* 全局å˜é‡ */ +static int count; // 对访问过的结点计数 + +// Kosaraju算法 +static Boolean visited[MAX_VERTEX_NUM]; // 访问标志数组,记录访问过的顶点 +static int finished[MAX_VERTEX_NUM]; // 存储深度优先é历中访问到的元素 + +// Tarjan算法 +static int dfs[MAX_VERTEX_NUM]; // 深度优先éåŽ†æ—¶ä¾æ¬¡è®¿é—®åˆ°çš„元素(çš„åºå·) +static int low[MAX_VERTEX_NUM]; // low[v] ==> 元素vå¯ä»¥å›žæº¯åˆ°çš„æœ€æ—©ç¥–å…ˆ +static int stack[MAX_VERTEX_NUM]; // 存储é历过程中é‡åˆ°çš„结点 + + +/* + * (1) Tarjan算法求å–å¼ºè¿žé€šåˆ†é‡ + * + * æ ¸å¿ƒæ€æƒ³æ˜¯æ·±åº¦ä¼˜å…ˆé历+回溯,与本章第8节求关节点的算法有类似之处 + */ +void Tarjan(OLGraph G) { + int i; + + count = -1; // åˆå§‹åŒ–计数 + + // åˆå§‹åŒ–顶点为尚未访问 + for(i = 0; i < G.vexnum; i++) { + dfs[i] = -1; + low[i] = -1; + } + + printf("打å°å½“剿œ‰å‘图中的å„组强连通分é‡ï¼š\n"); + + for(i = 0; i < G.vexnum; i++) { + if(dfs[i] == -1) { + DFS_Tarjan(G, i); + } + } +} + +/* + * 深度优先é历顶点vå¯è¾¾çš„æ‰€æœ‰å…ƒç´ ï¼Œå¹¶å°è¯•æ‰¾å‡ºå…¶ä¸­çš„å¼ºè¿žé€šåˆ†é‡ + */ +static void DFS_Tarjan(OLGraph G, int v) { + int min; + int w; + int i; + + ++count; + + // è®°å½•è®¿é—®æ¬¡åº + dfs[v] = min = count; + + // 记录é‡åˆ°çš„结点 + stack[count] = v; + + // 深度é历v起始的图 + for(w = FirstAdjVex(G, G.xlist[v].data); w >= 0; w = NextAdjVex(G, G.xlist[v].data, G.xlist[w].data)) { + // 如果w结点未访问 + if(dfs[w] == -1) { + DFS_Tarjan(G, w); // 对尚未访问的顶点调用DFS + + if(low[w] < min) { + min = low[w]; + } + + // é‡åˆ°å·²è®¿é—®è¿‡çš„结点 + } else { + // 如果w已被访问过,且w是våœ¨ç”Ÿæˆæ ‘上的祖先 + if(dfs[w] < min) { + min = dfs[w]; + } + } + } + + // 如果"祖先"结点还没有确定回溯祖先,则åªè®°å½•"祖先"ç»“ç‚¹ä¸Šçš„è®¿é—®æ¬¡åº + if(low[stack[min]]==-1) { + low[v] = min; + } else { + // 获å–"祖先"结点上的å¯å›žæº¯ç¥–å…ˆ + low[v] = low[stack[min]]; + } + + // 获å–当å‰å·²æœç´¢åˆ°çš„强连通å­é›† + if(low[v] == dfs[v]) { + for(i = count; i >= 0; i--) { + if(low[stack[i]] == dfs[v]) { + printf("%c ", GetVex(G, stack[i])); + count--; + } else { + break; + } + } + printf("\n"); + } +} + + +/* + * (2) Kosaraju算法求å–强连通分é‡ï¼Œè¿™æ˜¯æ•™æä¸­æåˆ°çš„算法 + * + * æ ¸å¿ƒæ€æƒ³æ˜¯ï¼š + * 1.从æŸé¡¶ç‚¹å‡ºå‘,深度é历有å‘图,得到一个访问åºåˆ—ï¼› + * 2.逆置有å‘图; + * 3.é历上é¢å¾—出的访问åºåˆ—,对其中的æ¯ä¸ªé¡¶ç‚¹è¿›è¡Œæ·±åº¦ä¼˜å…ˆé历。 + */ +void Kosaraju(OLGraph G) { + int i, v; + + count = 0; // åˆå§‹åŒ–计数 + + // 1.从æŸé¡¶ç‚¹å‡ºå‘,深度é历有å‘图,得到一个访问åºåˆ— + DFSTraverse(G, StoreElem); + + // 2.逆置有å‘图 + InverseGraph(&G); + + // 访问标志数组åˆå§‹åŒ– + for(i = 0; i < G.vexnum; i++) { + visited[i] = FALSE; + } + + printf("打å°å½“剿œ‰å‘图中的å„组强连通分é‡ï¼š\n"); + + // 3.é历上é¢å¾—出的访问åºåˆ—,对其中的æ¯ä¸ªé¡¶ç‚¹è¿›è¡Œæ·±åº¦ä¼˜å…ˆé历 + for(i = 0; i < count; i++) { + v = LocateVex(G, finished[i]); + + if(visited[v] == TRUE) { + continue; + } + + DFS_Inverse(G, v); + printf("\n"); + } +} + +/* + * 逆置有å‘图(å字链表存储结构),å³å°†æ‰€æœ‰å¼§çš„æ–¹å‘逆置 + * + * æ ¸å¿ƒæ€æƒ³æ˜¯ï¼š + * 1.创建一个ä¸åŒ…å«ä»»ä½•弧的空图; + * 2.便¬¡é历æ¯ä¸ªé¡¶ç‚¹çš„æ¯æ¡å…¥å¼§ï¼› + * 3.摘下é‡åˆ°çš„入弧,将其æ’å…¥åˆ°ç©ºå›¾ä¸­å˜æˆå‡ºå¼§ã€‚ + */ +static void InverseGraph(OLGraph* G) { + OLGraph newG = *G; + int i; + ArcBox* r; + ArcBox* pre, * p; + int tmp; + + for(i = 0; i < newG.vexnum; i++) { + newG.xlist[i].firstin = NULL; + newG.xlist[i].firstout = NULL; + } + + for(i = 0; i < (*G).vexnum; i++) { + while((*G).xlist[i].firstin != NULL) { + // 摘下é‡åˆ°çš„æŒ‡å‘顶点i的入弧 + r = (*G).xlist[i].firstin; + (*G).xlist[i].firstin = r->hlink; + + // é€†ç½®å¼§çš„æ–¹å‘ + tmp = r->headvex; + r->headvex = r->tailvex; + r->tailvex = tmp; + + r->hlink = NULL; + r->tlink = NULL; + + // æ’入到新图的纵å‘上 + pre = newG.xlist[r->headvex].firstin; + if(pre == NULL) { + newG.xlist[r->headvex].firstin = r; + } else { + if(r->tailvex < pre->tailvex) { + r->hlink = newG.xlist[r->headvex].firstin; + newG.xlist[r->headvex].firstin = r; + } else if(r->tailvex > pre->tailvex) { + p = pre->hlink; + + while(p != NULL && r->tailvex > p->tailvex) { + pre = p; + p = p->hlink; + } + + if(p == NULL || r->tailvex < p->tailvex) { + r->hlink = p; + pre->hlink = r; + } + } else { + // 等于时ä¸å¤„ç† + } + } + + // æ’入到新图的横å‘上 + pre = newG.xlist[r->tailvex].firstout; + if(pre == NULL) { + newG.xlist[r->tailvex].firstout = r; + } else { + if(r->headvex < pre->headvex) { + r->tlink = newG.xlist[r->tailvex].firstout; + newG.xlist[r->tailvex].firstout = r; + } else if(r->headvex > pre->headvex) { + p = pre->tlink; + + while(p != NULL && r->headvex > p->headvex) { + pre = p; + p = p->tlink; + } + + if(p == NULL || r->headvex < p->headvex) { + r->tlink = p; + pre->tlink = r; + } + } else { + // 等于时ä¸å¤„ç† + } + } + } + } + + *G = newG; +} + +/* + * 存储深度优先é历中访问到的元素 + */ +static Status StoreElem(VertexType c) { + finished[count++] = c; + return OK; +} + +/* + * 深度é历已ç»é€†ç½®åŽçš„图 + */ +static void DFS_Inverse(OLGraph G, int v) { + int w; + + // 如果已访问过,直接返回 + if(visited[v] == TRUE) { + return; + } + + // 从第v个顶点出å‘递归地深度优先é历图G + visited[v] = TRUE; + + // 打å°è®¿é—®åˆ°çš„顶点 + printf("%c ", GetVex(G, v)); + + for(w = FirstAdjVex(G, G.xlist[v].data); + w >= 0; + w = NextAdjVex(G, G.xlist[v].data, G.xlist[w].data)) { + DFS_Inverse(G, w); // 对尚未访问的顶点调用DFS + } +} diff --git a/CLion/ExerciseBook/07.31/StronglyConnectedComponents.h b/CLion/ExerciseBook/07.31/StronglyConnectedComponents.h new file mode 100644 index 0000000..140e9a8 --- /dev/null +++ b/CLion/ExerciseBook/07.31/StronglyConnectedComponents.h @@ -0,0 +1,56 @@ +/*================== + * 有å‘å›¾çš„å¼ºè¿žé€šåˆ†é‡ + ===================*/ + +#ifndef STRONGLYCONNECTEDCOMPONENTS_H +#define STRONGLYCONNECTEDCOMPONENTS_H + +#include +#include "OLGraph.h" //**â–²07 图**// + +/* + * (1) Tarjan算法 + * + * æ±‚å–æœ‰å‘å›¾çš„å¼ºè¿žé€šåˆ†é‡ + */ +void Tarjan(OLGraph G); + +/* + * 深度优先é历顶点vå¯è¾¾çš„æ‰€æœ‰å…ƒç´ ï¼Œå¹¶å°è¯•æ‰¾å‡ºå…¶ä¸­çš„å¼ºè¿žé€šåˆ†é‡ + */ +static void DFS_Tarjan(OLGraph G, int v); + + +/* + * (2) Kosaraju算法 + * + * æ±‚å–æœ‰å‘图的强连通分é‡ï¼Œè¿™æ˜¯æ•™æä¸­æåˆ°çš„算法 + * + * æ ¸å¿ƒæ€æƒ³æ˜¯ï¼š + * 1.从æŸé¡¶ç‚¹å‡ºå‘,深度é历有å‘图,得到一个访问åºåˆ—ï¼› + * 2.逆置有å‘图; + * 3.é历上é¢å¾—出的访问åºåˆ—,对其中的æ¯ä¸ªé¡¶ç‚¹è¿›è¡Œæ·±åº¦ä¼˜å…ˆé历。 + */ +void Kosaraju(OLGraph G); + +/* + * 逆置有å‘图(å字链表存储结构),å³å°†æ‰€æœ‰å¼§çš„æ–¹å‘逆置 + * + * æ ¸å¿ƒæ€æƒ³æ˜¯ï¼š + * 1.创建一个ä¸åŒ…å«ä»»ä½•弧的空图; + * 2.便¬¡é历æ¯ä¸ªé¡¶ç‚¹çš„æ¯æ¡å…¥å¼§ï¼› + * 3.摘下é‡åˆ°çš„入弧,将其æ’å…¥åˆ°ç©ºå›¾ä¸­å˜æˆå‡ºå¼§ã€‚ + */ +static void InverseGraph(OLGraph *G); + +/* + * 存储深度优先é历中访问到的元素 + */ +static Status StoreElem(VertexType c); + +/* + * 深度é历已ç»é€†ç½®åŽçš„图,仅é™å†…部使用 + */ +static void DFS_Inverse(OLGraph G, int v); + +#endif diff --git a/CLion/ExerciseBook/07.31/TestData_DG.txt b/CLion/ExerciseBook/07.31/TestData_DG.txt new file mode 100644 index 0000000..6a0b63b --- /dev/null +++ b/CLion/ExerciseBook/07.31/TestData_DG.txt @@ -0,0 +1,6 @@ +图类型→0(有å‘图) +顶点数→23 +弧数→32 +弧是å¦å¸¦æœ‰å…¶ä»–ä¿¡æ¯â†’0 +顶点集→ã€A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W】 +弧的集åˆâ†’ã€A,B】ã€B,D】ã€D,A】ã€B,C】ã€C,E】ã€E,F】ã€F,C】ã€C,G】ã€G,C】ã€E,U】ã€U,V】ã€V,W】ã€W,C】ã€V,E】ã€D,O】ã€D,I】ã€O,I】ã€I,J】ã€J,N】ã€N,O】ã€J,H】ã€N,R】ã€R,Q】ã€Q,R】ã€A,L】ã€L,M】ã€M,K】ã€K,L】ã€P,S】ã€S,P】ã€P,T】ã€T,S】 \ No newline at end of file diff --git a/CLion/ExerciseBook/07.32/07.32.c b/CLion/ExerciseBook/07.32/07.32.c new file mode 100644 index 0000000..5a5a38b --- /dev/null +++ b/CLion/ExerciseBook/07.32/07.32.c @@ -0,0 +1,46 @@ +#include +#include "CSTree.h" +#include "ALGraph.h" +#include "MinimumSpanningTree.h" + +/* + * 求无å‘网的最å°ç”Ÿæˆæ£®æž— + */ +void Algo_7_32(ALGraph G); + + +int main(int argc, char* argv[]) { + ALGraph G; + + printf("████████ åˆ›å»ºå¹¶æ‰“å°æ— å‘网... \n"); + { + char* path[4]; + + path[0] = ""; + path[1] = ""; + path[2] = ""; + path[3] = "TestData_UDN.txt"; + + CreateGraph(&G, path); + PrintGraph(G); + } + PressEnterToContinue(debug); + + printf("████████ ä½¿ç”¨æ™®é‡Œå§†ç®—æ³•èŽ·å–æœ€å°ç”Ÿæˆæ£®æž—... \n"); + { + Algo_7_32(G); + } + PressEnterToContinue(debug); + +} + + +/* + * 求无å‘网的最å°ç”Ÿæˆæ£®æž— + */ +void Algo_7_32(ALGraph G) { + CSTree T = MinSpanTree_PRIM(G); + + // 输出求å–的最å°ç”Ÿæˆæ£®æž—,此步骤å¯é€‰ + PrintTree(T); +} diff --git a/CLion/ExerciseBook/07.32/07.32.png b/CLion/ExerciseBook/07.32/07.32.png new file mode 100644 index 0000000000000000000000000000000000000000..efa1f3f0fdd5da47688fe5366d058d26e043cc72 GIT binary patch literal 14783 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 literal 0 HcmV?d00001 diff --git a/CLion/ExerciseBook/07.32/ALGraph.c b/CLion/ExerciseBook/07.32/ALGraph.c new file mode 100644 index 0000000..a81d7b7 --- /dev/null +++ b/CLion/ExerciseBook/07.32/ALGraph.c @@ -0,0 +1,326 @@ +/*================== + * 图的邻接表存储表示 + ===================*/ + +#include "ALGraph.h" + +// 录入数æ®çš„æºæ–‡ä»¶ï¼›fp为null时,说明需è¦ä»ŽæŽ§åˆ¶å°å½•å…¥ +static FILE* fp = NULL; + +/* + * IncInfo指示该图/网的边/弧上是å¦å­˜åœ¨é™„加信æ¯ã€‚ + * 如果其值ä¸ä¸º0,则表示无附加信æ¯ï¼Œå¦åˆ™ï¼Œè¡¨ç¤ºå­˜åœ¨é™„加信æ¯ã€‚ + */ +Boolean IncInfo = FALSE; + +// 访问标志数组,记录访问过的顶点 +static Boolean visited[MAX_VERTEX_NUM]; + +// 函数å˜é‡ +static Status (* VisitFunc)(VertexType e); + + +/* + * 创建 + * + *ã€å¤‡æ³¨ã€‘ + * + * æ•™æä¸­é»˜è®¤ä»ŽæŽ§åˆ¶å°è¯»å–æ•°æ®ã€‚ + * 这里为了方便测试,é¿å…æ¯æ¬¡è¿è¡Œéƒ½æ‰‹åŠ¨è¾“å…¥æ•°æ®ï¼Œ + * 因而å…许选择从预设的文件pathä¸­è¯»å–æµ‹è¯•æ•°æ®ã€‚ + * + * 如果需è¦ä»ŽæŽ§åˆ¶å°è¯»å–æ•°æ®ï¼Œåˆ™path为NULL,或path[kind]为""。 + * 如果需è¦ä»Žæ–‡ä»¶ä¸­è¯»å–æ•°æ®ï¼Œåˆ™éœ€è¦åœ¨path中填写文件åä¿¡æ¯ã€‚ + */ +Status CreateGraph(ALGraph* G, char* path[]) { + int readFromConsole; // 是å¦ä»ŽæŽ§åˆ¶å°è¯»å–æ•°æ® + int kind; + Status flag; + + // ★★★此处固定为无å‘图 + kind = 3; + + // 如果没有文件路径信æ¯ï¼Œåˆ™ä»ŽæŽ§åˆ¶å°è¯»å–输入 + readFromConsole = (path == NULL) || strcmp(path[kind], "") == 0; + + // 需è¦ä»Žæ–‡ä»¶è¯»å– + if(readFromConsole) { + (*G).kind = kind; // 记录图/网的类型 + } else { + // æ‰“å¼€æ–‡ä»¶ï¼Œå‡†å¤‡è¯»å–æµ‹è¯•æ•°æ® + fp = fopen(path[kind], "r"); + if(fp == NULL) { + return ERROR; + } + + // 录入图的类型 + ReadData(fp, "%d", &((*G).kind)); + } + + // éšæœºåˆ›å»ºæœ‰å‘图/网或无å‘图/ç½‘çš„ä¸€ç§ + switch((*G).kind) { + case UDN: + flag = CreateUDN(G); + break; + default: + flag = ERROR; + break; + } + + if(fp != NULL) { + fclose(fp); + fp = NULL; + } + + return flag; +} + +/* + * 构造无å‘网 + */ +static Status CreateUDN(ALGraph* G) { + int i, k; + int vexnum, arcnum; + VertexType v1, v2; + InfoType* info = NULL; + + (*G).vexnum = (*G).arcnum = 0; + + if(fp == NULL) { + printf("请输入无å‘网的顶点数:"); + scanf("%d", &vexnum); + printf("请输入无å‘网的边数:"); + scanf("%d", &arcnum); + printf("该无å‘网的边上必须包å«å…¶ä»–附加信æ¯ï¼Œå› ä¸ºæ­¤å¤„çš„æƒå€¼éœ€è¦å­˜å‚¨åˆ°é™„加信æ¯ä¸­...\n"); + IncInfo = 1; + + // 录入顶点集 + printf("请录入 %d 个顶点,ä¸åŒé¡¶ç‚¹ä¹‹é—´ç”¨ç©ºæ ¼éš”开:", vexnum); + for(i = 0; i < vexnum; i++) { + // 跳过空白,寻找下一个"å¯è¯»"ç¬¦å· + skipBlank(stdin); + scanf("%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } else { + ReadData(fp, "%d", &vexnum); // 录入顶点数 + ReadData(fp, "%d", &arcnum); // 录入边数 + ReadData(fp, "%d", &IncInfo);// 判断边上是å¦åŒ…å«é™„åŠ ä¿¡æ¯ + IncInfo = 1; // 强制将æƒå€¼å½•入到附加信æ¯ä¸­ + + // 录入顶点集 + for(i = 0; i < vexnum; i++) { + // 跳过空白,寻找下一个"å¯è¯»"ç¬¦å· + skipBlank(fp); + ReadData(fp, "%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } + + // 仅在控制å°å½•å…¥ä¿¡æ¯æ—¶è¾“出此æç¤º + if(fp == NULL && arcnum != 0) { + printf("请为无å‘ç½‘ä¾æ¬¡å½•å…¥ %d æ¡è¾¹(带æƒå€¼)的信æ¯ï¼Œé¡¶ç‚¹åŠæƒå€¼ä¹‹é—´ç”¨ç©ºæ ¼éš”开:\n", arcnum); + } + + // å½•å…¥è¾¹çš„ä¿¡æ¯ + for(k = 0; k < arcnum; k++) { + if(fp == NULL) { + printf("第 %2d æ¡è¾¹åŠå…¶æƒå€¼ï¼š", k + 1); + skipBlank(stdin); // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + scanf("%c", &v1); + skipBlank(stdin); // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + scanf("%c", &v2); + } else { + // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + skipBlank(fp); + ReadData(fp, "%c%c", &v1, &v2); + } + + // 如果需è¦å½•å…¥è¾¹çš„å…¶ä»–é™„åŠ ä¿¡æ¯ + if(IncInfo) { + // 最åŽå½•入附加信æ¯(此处需è¦å½•入网的æƒå€¼) + Input(*G, &info); + } + + // æ’入边 + InsertArc(G, v1, v2, info); + } + + // ä»Žæ–‡ä»¶ä¸­è¯»å–æ•°æ®æ—¶ï¼Œæœ€åŽå…¶å®žåº”当判断一下是å¦è¯»åˆ°äº†è¶³å¤Ÿçš„ä¿¡æ¯ + return OK; +} + +/* + * 录入边/å¼§çš„ç›¸å…³é™„åŠ ä¿¡æ¯ + */ +static void Input(ALGraph G, InfoType** info) { + int weight; + + // 在"网"的情形下需è¦å½•å…¥æƒå€¼ä¿¡æ¯ + if(G.kind == DN || G.kind == UDN) { + *info = (InfoType*) malloc(sizeof(InfoType)); + + if(fp == NULL) { + scanf("%d", &weight); + } else { + ReadData(fp, "%d", &weight); + } + + (*info)->weight = weight; + } +} + +/* + * 查找 + * + * 返回顶点u在图/网中的ä½ç½® + */ +int LocateVex(ALGraph G, VertexType u) { + int i; + + for(i = 0; i < G.vexnum; i++) { + if(G.vertices[i].data == u) { + return i; + } + } + + return -1; +} + +/* + * 构造一个边/弧结点(ä»…é™å†…部使用) + */ +static ArcNode* newArcNodePtr(int adjvex, ArcNode* nextarc, InfoType* info) { + ArcNode* p = (ArcNode*) malloc(sizeof(ArcNode)); + if(!p) { + exit(OVERFLOW); + } + + p->adjvex = adjvex; + + p->nextarc = nextarc; + + p->info = info; + + return p; +} + +/* + * æ’入边/å¼§ + * + * 如果当å‰å›¾/网是无å‘的,则æ’入一æ¡å¼§éœ€è¦å¢žåŠ ä¸¤ä¸ªé¡¶ç‚¹å…³ç³»ï¼Œä½†å¼§çš„æ•°é‡åªå¢žä¸€ã€‚ + * 对于图/网æ¥è¯´ï¼Œå¯ä»¥åœ¨å¯å˜å‚数中列出边/弧的附加信æ¯ã€‚ + * + * æ³¨ï¼šæ­¤å¤„æŽ¥æ”¶çš„å‚æ•°ä¸ŽMGraph有些ä¸ä¸€æ ·ï¼šç½‘的附加信æ¯ä¸­åŒ…å«äº†å„æ¡è¾¹/å¼§çš„æƒå€¼ã€‚ + */ +Status InsertArc(ALGraph* G, VertexType v, VertexType w, ...) { + int tail, head, k, count; + ArcNode* r; + ArcNode* pre; + Boolean overlay = FALSE; // 是å¦ä¸ºè¦†ç›–添加 + InfoType* info = NULL; // è¾¹/å¼§çš„é™„åŠ ä¿¡æ¯ + va_list ap; + + tail = LocateVex(*G, v); // 获å–顶点v在顶点集中的ä½ç½® + if(tail == -1) { + return ERROR; // 指定的顶点ä¸å­˜åœ¨ + } + + head = LocateVex(*G, w); // 获å–顶点w在顶点集中的ä½ç½® + if(head == -1) { + return ERROR; // 指定的顶点ä¸å­˜åœ¨ + } + + // æ‹’ç»çޝ + if(tail == head) { + return ERROR; + } + + // 如果边/å¼§ä¸Šå­˜åœ¨é™„åŠ ä¿¡æ¯ + if(IncInfo) { + va_start(ap, w); // 在wåŽæŸ¥è¯¢é¦–个å¯å˜å‚æ•° + info = va_arg(ap, InfoType*); // 获å–é™„åŠ ä¿¡æ¯ + va_end(ap); + } + + /* 接下æ¥ï¼Œéœ€è¦æŸ¥æ‰¾åˆé€‚çš„æ’å…¥ä½ç½® */ + + for(count = 0; count < 2; count++) { + pre = NULL; + // 指å‘以tail为尾的首æ¡è¾¹/å¼§ + r = G->vertices[tail].firstarc; + while(r != NULL && r->adjvex < head) { + pre = r; + r = r->nextarc; + } + + // é‡åˆ°äº†ç›¸åŒä½ç½®çš„结点 + if(r != NULL && r->adjvex == head) { + r->info = info; // å¤ç”¨è¯¥ç»“点 + overlay = TRUE; // å‘生了覆盖 + } else { + if(pre == NULL) { + G->vertices[tail].firstarc = newArcNodePtr(head, r, info); + } else { + pre->nextarc = newArcNodePtr(head, r, info); + } + } + + // 如果当å‰å›¾/网是无å‘的,需è¦è€ƒè™‘对称性 + if((G->kind == UDG || G->kind == UDN) && tail != head) { + // 颠倒iå’Œj + k = tail; + tail = head; + head = k; + } else { + break; // 如果是有å‘的,å¯ä»¥ç»“æŸäº† + } + } + + // 在éžè¦†ç›–的情形下,æ‰è€ƒè™‘æ›´æ–°è¾¹/å¼§çš„æ•°é‡ + if(!overlay) { + (*G).arcnum++; // ä¸è®ºæœ‰å‘æ— å‘,边/å¼§æ•°åªå¢žä¸€ + } + + return OK; +} + +/* + * 以图形化形å¼è¾“出当å‰ç»“æž„ + */ +void PrintGraph(ALGraph G) { + int i; + ArcNode* p; + + if(G.vexnum == 0) { + printf("空图,无需打å°ï¼\n"); + return; + } + + printf("当å‰å›¾/ç½‘åŒ…å« %2d 个顶点, %2d æ¡è¾¹/å¼§...\n", G.vexnum, G.arcnum); + + for(i = 0; i < G.vexnum; i++) { + printf("%c ===> ", G.vertices[i].data); + + p = G.vertices[i].firstarc; + while(p != NULL) { + if(IncInfo == 0) { + printf("%c ", G.vertices[p->adjvex].data); + + // 对于网,会从其附加信æ¯ä¸­èŽ·å–到æƒå€¼ + } else { + printf("%c[%2d] ", G.vertices[p->adjvex].data, p->info->weight); + } + + p = p->nextarc; + + if(p != NULL) { + printf("- "); + } + } + + printf("\n"); + } +} diff --git a/CLion/ExerciseBook/07.32/ALGraph.h b/CLion/ExerciseBook/07.32/ALGraph.h new file mode 100644 index 0000000..60f9bd1 --- /dev/null +++ b/CLion/ExerciseBook/07.32/ALGraph.h @@ -0,0 +1,128 @@ +/*================== + * 图的邻接表存储表示 + ===================*/ + +#ifndef ALGRAPH_H +#define ALGRAPH_H + +#include +#include // æä¾›memsetã€strcmp 原型 +#include // æä¾›å®va_listã€va_startã€va_argã€va_end +#include // æä¾›mallocã€reallocã€freeã€exit原型 +#include "Status.h" //**â–²01 绪论**// + +/* + * 注: + * + * 通常æ¥è®²ï¼Œæ— æƒå›¾è¢«ç®€ç§°ä¸ºã€å›¾ã€‘,有æƒå›¾è¢«ç®€ç§°ä¸ºã€ç½‘】。 + * æ— å‘图/网中的顶点关系被称为ã€è¾¹ã€‘,有å‘图/网中的顶点关系被称为ã€å¼§ã€‘,并区分弧头与弧尾。 + * 实际表述中,未必会严格éµå®ˆä»¥ä¸Šå‘½å。 + * + * 当å‰ç»“构适åˆå­˜å‚¨è¾¹/弧比较稀ç–的图/网。 + * + * ★ æ’入边/å¼§çš„ä¿¡æ¯æ—¶ï¼Œè¿™é‡Œçš„实现是按"å‡åº"æ’入的,这使得æ’入的弧是按"å‡åº"排列的。 + */ + + +/* å®å®šä¹‰ */ +#define MAX_VERTEX_NUM 26 // 最大顶点个数 + + +// 图的类型 +typedef enum { + DG, // 0-有å‘图 + DN, // 1-有å‘网(带æƒå€¼) + UDG, // 2-æ— å‘图 + UDN // 3-æ— å‘网(带æƒå€¼) +} GraphKind; + +// 顶点类型 +typedef char VertexType; + +// è¾¹/å¼§çš„ç›¸å…³é™„åŠ ä¿¡æ¯ +typedef struct { + /* + * 注: + * æ•™æä¸­ç»™å‡ºçš„结构åªè€ƒè™‘了无æƒå›¾ï¼Œè€Œæ²¡è€ƒè™‘有æƒå›¾(网)。 + * 这里为了把“网â€çš„æƒ…形也考虑进去,特在附加信æ¯ä¸­å¢žåŠ äº†"æƒé‡"属性。 + */ + int weight; +} InfoType; + +/* è¾¹/弧结点 */ +typedef struct ArcNode { + int adjvex; // 该弧所指å‘的顶点的ä½ç½® + struct ArcNode* nextarc; // 指å‘下一æ¡å¼§çš„æŒ‡é’ˆ + InfoType* info; // 弧的附加信æ¯ï¼Œé€šå¸¸å¿½ç•¥ +} ArcNode; + +// æ¯ä¸ªé“¾è¡¨çš„头结点 +typedef struct VNode { + VertexType data; // é¡¶ç‚¹ä¿¡æ¯ + ArcNode* firstarc; // 指å‘第一æ¡ä¾é™„该顶点的弧的指针 +} VNode; + +/* 图的邻接表存储表示类型定义 */ +typedef struct { + VNode vertices[MAX_VERTEX_NUM]; // 邻接表 + int vexnum, arcnum; // 图/网的顶点数和弧数 + GraphKind kind; // 图的类型标志 +} ALGraph; + + +// è¾¹/弧上是å¦å­˜åœ¨é™„åŠ ä¿¡æ¯ +extern Boolean IncInfo; + + +/* + * 创建 + * + *ã€å¤‡æ³¨ã€‘ + * + * æ•™æä¸­é»˜è®¤ä»ŽæŽ§åˆ¶å°è¯»å–æ•°æ®ã€‚ + * 这里为了方便测试,é¿å…æ¯æ¬¡è¿è¡Œéƒ½æ‰‹åŠ¨è¾“å…¥æ•°æ®ï¼Œ + * 因而å…许选择从预设的文件pathä¸­è¯»å–æµ‹è¯•æ•°æ®ã€‚ + * + * 如果需è¦ä»ŽæŽ§åˆ¶å°è¯»å–æ•°æ®ï¼Œåˆ™path为NULL,或path[kind]为""。 + * 如果需è¦ä»Žæ–‡ä»¶ä¸­è¯»å–æ•°æ®ï¼Œåˆ™éœ€è¦åœ¨path中填写文件åä¿¡æ¯ã€‚ + */ +Status CreateGraph(ALGraph* G, char* path[]); + +/* + * 构造无å‘网 + */ +static Status CreateUDN(ALGraph* G); + +/* + * 录入边/å¼§çš„ç›¸å…³é™„åŠ ä¿¡æ¯ + */ +static void Input(ALGraph G, InfoType** info); + +/* + * 查找 + * + * 返回顶点u在图/网中的ä½ç½® + */ +int LocateVex(ALGraph G, VertexType u); + +/* + * 构造一个边/弧结点(ä»…é™å†…部使用) + */ +static ArcNode* newArcNodePtr(int adjvex, ArcNode* nextarc, InfoType* info); + +/* + * æ’入边/å¼§ + * + * 如果当å‰å›¾/网是无å‘的,则æ’入一æ¡å¼§éœ€è¦å¢žåŠ ä¸¤ä¸ªé¡¶ç‚¹å…³ç³»ï¼Œä½†å¼§çš„æ•°é‡åªå¢žä¸€ã€‚ + * 对于图/网æ¥è¯´ï¼Œå¯ä»¥åœ¨å¯å˜å‚数中列出边/弧的附加信æ¯ã€‚ + * + * æ³¨ï¼šæ­¤å¤„æŽ¥æ”¶çš„å‚æ•°ä¸ŽMGraph有些ä¸ä¸€æ ·ï¼šç½‘的附加信æ¯ä¸­åŒ…å«äº†å„æ¡è¾¹/å¼§çš„æƒå€¼ã€‚ + */ +Status InsertArc(ALGraph* G, VertexType v, VertexType w, ...); + +/* + * 以图形化形å¼è¾“出当å‰ç»“æž„ + */ +void PrintGraph(ALGraph G); + +#endif diff --git a/CLion/ExerciseBook/07.32/CMakeLists.txt b/CLion/ExerciseBook/07.32/CMakeLists.txt new file mode 100644 index 0000000..a5b0a1e --- /dev/null +++ b/CLion/ExerciseBook/07.32/CMakeLists.txt @@ -0,0 +1,12 @@ +# 包å«å…¬å…±åº“ +include_directories(${CMAKE_SOURCE_DIR}/Status) + +# 生æˆå¯æ‰§è¡Œæ–‡ä»¶ +add_executable(07.32 CSTree.h CSTree.c MFSet.h MFSet.c ALGraph.h ALGraph.c MinimumSpanningTree.h MinimumSpanningTree.c 07.32.c) +# 链接公共库 +target_link_libraries(07.32 Scanf_lib) + +# è®°å½•è¦æ‹·è´åˆ°*.exeç›®å½•ä¸‹çš„èµ„æºæ–‡ä»¶ +file(GLOB TestData TestData*.txt) +# å°†èµ„æºæ–‡ä»¶æ‹·è´åˆ°*.exe目录下,ä¸ç„¶æ— æ³•加载 +file(COPY ${TestData} DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) diff --git a/CLion/ExerciseBook/07.32/CSTree.c b/CLion/ExerciseBook/07.32/CSTree.c new file mode 100644 index 0000000..f2a7635 --- /dev/null +++ b/CLion/ExerciseBook/07.32/CSTree.c @@ -0,0 +1,76 @@ +/*=================================== + * 树的二å‰é“¾è¡¨ï¼ˆå­©å­-兄弟)结构存储表示 + ====================================*/ + +#include "CSTree.h" + +int count = 0; + +/* + * åˆå§‹åŒ– + * + * 构造空树。 + */ +Status InitTree(CSTree* T) { + if(T == NULL) { + return ERROR; + } + + *T = NULL; + + return OK; +} + +/* + * 判空 + * + * 判断树是å¦ä¸ºç©ºæ ‘。 + */ +Status TreeEmpty(CSTree T) { + return T == NULL ? TRUE : FALSE; +} + + +/*â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”┠图形化输出 â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”*/ + +// 以图形化形å¼è¾“出当å‰ç»“æž„ +void PrintTree(CSTree T) { + + // é‡åˆ°ç©ºæ ‘则无需继续计算 + if(TreeEmpty(T)) { + printf("\n"); + return; + } + + Print(T, 0); + + printf("\n"); +} + +// 图形化输出当å‰ç»“构内部实现 +static void Print(CSTree T, int row) { + int k; + + if(T == NULL) { + return; + } + + if(row==0) { + printf("\n第 %d 棵树...\n", ++count); + } + + // 访问当å‰ç»“点 + printf("%c ", T->data); + + Print(T->firstchild, row + 1); + + if(T->nextsibling != NULL) { + printf("\n"); + + for(k = 0; k < row; k++) { + printf(". "); + } + + Print(T->nextsibling, row); + } +} diff --git a/CLion/ExerciseBook/07.32/CSTree.h b/CLion/ExerciseBook/07.32/CSTree.h new file mode 100644 index 0000000..a44e6fa --- /dev/null +++ b/CLion/ExerciseBook/07.32/CSTree.h @@ -0,0 +1,54 @@ +/*=================================== + * 树的二å‰é“¾è¡¨ï¼ˆå­©å­-兄弟)结构存储表示 + ====================================*/ + +#ifndef CSTREE_H +#define CSTREE_H + +#include +#include // æä¾› mallocã€free 原型 +#include // æä¾› memsetã€strcmp 原型 +#include "Status.h" //**â–²01 绪论**// +#include "ALGraph.h" + +/* å•ä¸ªç»“ç‚¹æœ€å¤§çš„å­©å­æ•°é‡ */ +#define MAX_CHILD_COUNT 8 + +/* 树的元素类型定义,这里å‡è®¾å…¶å…ƒç´ ç±»åž‹ä¸ºchar */ +typedef char TElemType; + +/* (å­©å­-兄弟)树的结点定义 */ +typedef struct CSNode { + TElemType data; + struct CSNode* firstchild; // 指å‘é•¿å­ + struct CSNode* nextsibling; // 指å‘å³å…„弟 +} CSNode; + +/* (å­©å­-兄弟)树类型定义 */ +typedef CSNode* CSTree; + + +/* + * åˆå§‹åŒ– + * + * 构造空树。 + */ +Status InitTree(CSTree* T); + +/* + * 判空 + * + * 判断树是å¦ä¸ºç©ºæ ‘。 + */ +Status TreeEmpty(CSTree T); + + +/*â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”┠图形化输出 â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”*/ + +// 以图形化形å¼è¾“出当å‰ç»“æž„ +void PrintTree(CSTree T); + +// 图形化输出当å‰ç»“构内部实现 +static void Print(CSTree T, int row); + +#endif diff --git a/CLion/ExerciseBook/07.32/MFSet.c b/CLion/ExerciseBook/07.32/MFSet.c new file mode 100644 index 0000000..2ee2468 --- /dev/null +++ b/CLion/ExerciseBook/07.32/MFSet.c @@ -0,0 +1,93 @@ +/*===== + * é›†åˆ + ======*/ + +#include "MFSet.h" + +/* + * åˆå§‹åŒ–一个由多个å­é›†ï¼ˆæ¯ä¸ªå­é›†åªåŒ…å«å•个æˆå‘˜ï¼‰æž„æˆçš„集åˆS。 + * + * + *ã€å¤‡æ³¨ã€‘ + * + * 这里对第6ç« çš„MFSetåšäº†æ”¹åŠ¨ï¼š + * 1.ç›´æŽ¥åœ¨å‚æ•°ä¸­ä¼ å…¥å­é›†æ•°é‡ + * 2.å­é›†ç¼–å·ä»Ž0开始计数,这会影å“到åŽé¢çš„函数中关于下标的判断 + */ +Status initial_mfset(MFSet* S, int n) { + int i; + + if(n <= 0) { + return ERROR; + } + + S->n = n; + S->r = 0; // 第一个å­é›†çš„ä½ç½®åœ¨0å·å•å…ƒ + + // å­é›†ç¼–å·ä»Ž0开始计数 + for(i = 0; i < n; i++) { + S->nodes[i].parent = -1; + } + + return OK; +} + +/* + * 求两个互ä¸ç›¸äº¤çš„å­é›†Siå’Œå­é›†Sj的并集。 + */ +Status merge_mfset(MFSet* S, int i, int j) { + + // 索引越界 + if(i < 0 || i > S->n - 1 || j < 0 || j > S->n - 1) { + return ERROR; + } + + // 相åŒçš„å­é›†æ— éœ€åˆå¹¶ï¼Œç›´æŽ¥è¿”回 + if(i == j) { + return OK; + } + + S->nodes[i].parent = j; + + return OK; +} + +/* + * 在集åˆS中查找元素i当剿‰€å±žçš„å­é›†ã€‚ + */ +int find_mfset(MFSet S, int i) { + int j; + + // 索引越界 + if(i < 0 || i > S.n - 1) { + return -1; + } + + // 查找i所属的å­é›†çš„æ ¹ç»“点 + for(j = i; S.nodes[j].parent >= 0; j = S.nodes[j].parent) { + // 从下往上查找 + } + + return j; +} + +/* + * æ ¹æ®ç­‰ä»·å…³ç³»Ræ¥æ•´ç†/建立集åˆS中的元素(å­é›†)。 + */ +Status build_mfset(MFSet* S, Relation R) { + int k; + int i, j; + + for(k = 0; k < R.n; k++) { + // 先获å–å­é›†æ ¹ç»“点 + i = find_mfset(*S, R.pairs[k].i); + j = find_mfset(*S, R.pairs[k].j); + + // 对两个互ä¸ç›¸äº¤çš„å­é›†è¿›è¡Œå½’å¹¶ + if(!merge_mfset(S, i, j)) { + return ERROR; + } + } + + return OK; +} diff --git a/CLion/ExerciseBook/07.32/MFSet.h b/CLion/ExerciseBook/07.32/MFSet.h new file mode 100644 index 0000000..a1369a0 --- /dev/null +++ b/CLion/ExerciseBook/07.32/MFSet.h @@ -0,0 +1,92 @@ +/*===== + * é›†åˆ + ======*/ + +#ifndef MFSET_H +#define MFSET_H + +#include +#include // æä¾› mallocã€free 原型 +#include // æä¾› memsetã€strcmp 原型 +#include // +#include "Status.h" //**â–²01 绪论**// + +/* 树的最大结点数,这里指示å­é›†æœ€å¤§æ•°é‡ */ +#define MAX_TREE_SIZE 1024 + +/* äºŒå…ƒå…³ç³»å¯¹æ•°é‡ */ +#define MAX_PAIR_SIZE 100 + +/* + * (åŒäº²)树的结点定义 + * + *ã€æ³¨ã€‘ + * 1.ä¾ç…§æ•™æçš„图示,åŒäº²æ ‘在集åˆçš„应用中,其模型已被简化:å³åŒäº²ç»“点ä¸å†ä¿ç•™æ•°æ®åŸŸã€‚ + * 2.结点的索引用æ¥è¡¨ç¤ºå®ƒæ˜¯å“ªä¸€ä¸ªå­é›†ï¼Œå®ƒä¼šä½œä¸ºæ›´å¤§å­é›†çš„一个元素存在。 + * 3.确定æŸä¸ªå­é›†å±žäºŽS中哪个更大的å­é›†æ—¶ï¼Œéœ€è¦å‘上追溯到更大å­é›†çš„æ ¹ã€‚ + * 4.实际使用中,æ¯ä¸ªå­é›†ä¼šåŒ…å«å¾ˆå¤šæ•°æ®å…ƒç´ ï¼Œæ­¤æ—¶å¯ä»¥å°†æ¯ä¸ªæ•°æ®å…ƒç´ ä¸Žå…¶æ‰€å±žçš„å­é›†å»ºç«‹å…³è”关系 + * å³æŠŠæ¯ä¸ªæ•°æ®å…ƒç´ ä¸Žé›†åˆS中å„结点的索引关è”èµ·æ¥ + */ +typedef struct PTNode { + int parent; // åŒäº²ä½ç½®åŸŸï¼Œç”¨æ¥æŒ‡ç¤ºè¯¥ç»“点所属的å­é›† +} PTNode; + +/* + * (åŒäº²)树类型定义 + * + *ã€æ³¨ã€‘ + * 1.树中结点在nodes中"ç´§é‚»"存储,没有空隙 + * 2.当å­é›†å­˜åœ¨æ—¶ï¼Œæ ‘æ ¹r设置为1,å¦åˆ™ï¼Œæ ‘æ ¹r设置为0 + * 3.é™¤æ ¹ç»“ç‚¹å¤–ï¼Œå…¶ä»–ç»“ç‚¹ä¾æ¬¡æŒ‰å±‚åºé¡ºç€æ ¹ç»“点往下排列 + * 5.这里å‡è®¾nodes空间是足够大的,å¯ä»¥è§†éœ€æ±‚将其改为动æ€åˆ†é…存储 + */ +typedef struct { + PTNode nodes[MAX_TREE_SIZE]; // 存储树中结点 + int r; // æ ‘æ ¹ä½ç½®(索引)ï¼Œè¿™é‡Œç”¨æ¥æŒ‡ç¤ºç¬¬ä¸€ä¸ªå­é›†çš„ä½ç½® + int n; // æ ‘çš„ç»“ç‚¹æ•°ï¼Œè¿™é‡Œç”¨æ¥æŒ‡ç¤ºæ‰€æœ‰ +} PTree; + +/* 集åˆç±»åž‹å®šä¹‰ */ +typedef PTree MFSet; + +/* å•个二元关系对 */ +typedef struct { + int i; + int j; +} Pair; + +/* 集åˆå†…的等价关系 */ +typedef struct { + Pair pairs[MAX_PAIR_SIZE]; // 足够大的空间存储二元关系 + int n; // å·²çŸ¥çš„ç­‰ä»·å…³ç³»æ•°é‡ +} Relation; + + +/* + * åˆå§‹åŒ–一个由多个å­é›†ï¼ˆæ¯ä¸ªå­é›†åªåŒ…å«å•个æˆå‘˜ï¼‰æž„æˆçš„集åˆS。 + * + * + *ã€å¤‡æ³¨ã€‘ + * + * 这里对第6ç« çš„MFSetåšäº†æ”¹åŠ¨ï¼š + * 1.ç›´æŽ¥åœ¨å‚æ•°ä¸­ä¼ å…¥å­é›†æ•°é‡ + * 2.å­é›†ç¼–å·ä»Ž0开始计数,这会影å“到åŽé¢çš„函数中关于下标的判断 + */ +Status initial_mfset(MFSet* S, int n); + +/* + * 求两个互ä¸ç›¸äº¤çš„å­é›†Siå’Œå­é›†Sj的并集。 + */ +Status merge_mfset(MFSet* S, int i, int j); + +/* + * 在集åˆS中查找元素i当剿‰€å±žçš„å­é›†ã€‚ + */ +int find_mfset(MFSet S, int i); + +/* + * æ ¹æ®ç­‰ä»·å…³ç³»Ræ¥æ•´ç†/建立集åˆS中的元素(å­é›†)。 + */ +Status build_mfset(MFSet* S, Relation R); + +#endif diff --git a/CLion/ExerciseBook/07.32/MinimumSpanningTree.c b/CLion/ExerciseBook/07.32/MinimumSpanningTree.c new file mode 100644 index 0000000..bdc1cb5 --- /dev/null +++ b/CLion/ExerciseBook/07.32/MinimumSpanningTree.c @@ -0,0 +1,118 @@ +/*=================== + * æ— å‘网的最å°ç”Ÿæˆæ£®æž— + ===================*/ + +#include "MinimumSpanningTree.h" + +/* + * 普里姆算法中用到的辅助数组, + * 用æ¥è®°å½•从顶点å­é›†U到顶点å­é›†V-U的代价最å°çš„è¾¹ + */ +static struct { + VertexType adjvex; // 顶点å­é›†U中的顶点 + int lowcost; // 顶点å­é›†V-U到当å‰é¡¶ç‚¹adjvex的边的æƒå€¼ +} closedge[MAX_VERTEX_NUM]; // 辅助数组 + + +/* + * 使用普里姆算法构造无å‘网G的最å°ç”Ÿæˆæ£®æž— + */ +CSTree MinSpanTree_PRIM(ALGraph G) { + int i, j, k; + ArcNode* p; + CSTree r; + CSTree T = NULL; + CSTree curRoot = NULL; // è¿½è¸ªæ£®æž—ä¸­å­æ ‘的根结点 + CSTree parent[MAX_VERTEX_NUM] = {NULL}; // 追踪å„顶点在森林中的ä½ç½®(用指针指å‘该顶点) + + // 辅助数组åˆå§‹åŒ–:åˆå§‹åŒ–所有æƒå€¼ä¸º0 + for(j=0; jfirstchild = r->nextsibling = NULL; + + // å‡ºçŽ°äº†æ–°çš„å­æ ‘ + if(k==-1) { + printf("----------\n"); + + // ç¡®å®šæ£®æž—ä¸­å­æ ‘的根 + for(k=0; kdata = G.vertices[k].data; + parent[k] = r; + + if(curRoot==NULL) { + T = curRoot = r; + } else { + // 链接到森林中下一棵树 + curRoot->nextsibling = r; + curRoot = r; + } + + break; + } + } + } else { + r->data = G.vertices[k].data; + + // 获å–父结点在图中的åºå· + j = LocateVex(G, closedge[k].adjvex); + if(parent[j]->firstchild==NULL) { + parent[j]->firstchild = r; + } else { + // ç›´æŽ¥é‡‡ç”¨å¤´æ’æ³•å³å¯ + r->nextsibling = parent[j]->firstchild->nextsibling; + parent[j]->firstchild->nextsibling = r; + } + + parent[k] = r; + + // 打å°é¡¶ç‚¹å’Œè¾¹çš„ä¿¡æ¯ + printf("%c --%2d-- %c\n", closedge[k].adjvex, closedge[k].lowcost, G.vertices[k].data); + } + + // 将顶点k加入到顶点å­é›†U + closedge[k].lowcost = 0; + + // 新顶点进入顶点å­é›†UåŽï¼Œéœ€è¦æ›´æ–°é¡¶ç‚¹å­é›†U与顶点å­é›†V-Uçš„è¾¹çš„ä¿¡æ¯ + for(p=G.vertices[k].firstarc; p!=NULL; p = p->nextarc) { + j = p->adjvex; + + if(p->info->weightinfo->weight; + } + } + } + + return T; +} + +/* + * 从顶点å­é›†V-U中选出下一个候选顶点以便åŽç»­åŠ å…¥åˆ°æœ€å°ç”Ÿæˆæ ‘ + * + * 选择顶点å­é›†U到顶点å­é›†V-Uçš„æƒå€¼æœ€å°çš„边, + * 并返回该边在顶点å­é›†V-U中那头的端点, + * 该端点åŽç»­ä¼šåŠ å…¥åˆ°é¡¶ç‚¹å­é›†U中,æˆä¸ºæœ€å°ç”Ÿæˆæ ‘的新结点。 + */ +static int minimum(ALGraph G) { + int i, k = -1; + int min = INT_MAX; + + // 从æƒå€¼ä¸ä¸º0çš„è¾¹ä¸­é€‰æ‹©æ‹¥æœ‰æœ€å°æƒå€¼çš„è¾¹ + for(i = 0; i < G.vexnum; i++) { + if(closedge[i].lowcost != 0 && closedge[i].lowcost < min) { + min = closedge[i].lowcost; + k = i; + } + } + + return k; +} diff --git a/CLion/ExerciseBook/07.32/MinimumSpanningTree.h b/CLion/ExerciseBook/07.32/MinimumSpanningTree.h new file mode 100644 index 0000000..8b92bf0 --- /dev/null +++ b/CLion/ExerciseBook/07.32/MinimumSpanningTree.h @@ -0,0 +1,30 @@ +/*=================== + * æ— å‘网的最å°ç”Ÿæˆæ£®æž— + ===================*/ + +#ifndef MINIMUMSPANNINGTREE_H +#define MINIMUMSPANNINGTREE_H + +#include +#include /* æä¾›INT_MAXå® */ +#include "MFSet.h" //**â–²06 æ ‘å’ŒäºŒå‰æ ‘**// +#include "ALGraph.h" //**â–²07 图**// +#include "CSTree.h" //**â–²06 æ ‘å’ŒäºŒå‰æ ‘**// + +/* + * 使用普里姆算法构造无å‘网G的最å°ç”Ÿæˆæ£®æž— + */ +CSTree MinSpanTree_PRIM(ALGraph G); + +/* + * 从顶点å­é›†V-U中选出下一个候选顶点以便åŽç»­åŠ å…¥åˆ°æœ€å°ç”Ÿæˆæ ‘ + * + * 选择顶点å­é›†U到顶点å­é›†V-Uçš„æƒå€¼æœ€å°çš„边, + * 并返回该边在顶点å­é›†V-U中那头的端点, + * 该端点åŽç»­ä¼šåŠ å…¥åˆ°é¡¶ç‚¹å­é›†U中,æˆä¸ºæœ€å°ç”Ÿæˆæ ‘的新结点。 + * + * 注:形å‚与教æä¸­ç»™å‡ºçš„æ¨¡æ¿æœ‰æ‰€ä¸åŒ + */ +static int minimum(ALGraph G); + +#endif diff --git a/CLion/ExerciseBook/07.32/TestData_UDN.txt b/CLion/ExerciseBook/07.32/TestData_UDN.txt new file mode 100644 index 0000000..8455e3c --- /dev/null +++ b/CLion/ExerciseBook/07.32/TestData_UDN.txt @@ -0,0 +1,6 @@ +图类型→3(无å‘网) +顶点数→13 +边数→13 +边是å¦å¸¦æœ‰å…¶ä»–ä¿¡æ¯â†’1 +顶点集→ã€A,B,C,D,E,F,G,H,I,J,K,M,N】 +边的集åˆâ†’ã€A,D,5】ã€A,B,1】ã€A,C,3】ã€A,N,7】ã€E,F,10】ã€G,I,1】ã€I,H,5】ã€G,J,2】ã€G,H,7】ã€D,K,4】ã€K,M,5】ã€K,N,2】ã€D,M,12】 \ No newline at end of file diff --git a/CLion/ExerciseBook/07.33/07.33.c b/CLion/ExerciseBook/07.33/07.33.c new file mode 100644 index 0000000..c5dade7 --- /dev/null +++ b/CLion/ExerciseBook/07.33/07.33.c @@ -0,0 +1,38 @@ +#include +#include "CSTree.h" +#include "MinimumSpanningTree.h" +#include "Graph.h" + +/* + * 求无å‘网的最å°ç”Ÿæˆæ ‘ + */ +void Algo_7_33(Graph G); + + +int main(int argc, char* argv[]) { + Graph G; + + printf("████████ åˆ›å»ºå¹¶æ‰“å°æ— å‘网... \n"); + { + CreateGraph(&G, "TestData_UDN.txt"); + PrintGraph(G); + printf("\n"); + } + + printf("████████ ä½¿ç”¨å…‹é²æ–¯å¡å°”ç®—æ³•èŽ·å–æœ€å°ç”Ÿæˆæ ‘... \n"); + { + Algo_7_33(G); + printf("\n"); + } +} + + +/* + * 求无å‘网的最å°ç”Ÿæˆæ ‘ + */ +void Algo_7_33(Graph G) { + CSTree T = MinSpanTree_KRUSKAL(G); + + // 输出求å–的最å°ç”Ÿæˆæ ‘,此步骤å¯é€‰ + PrintTree(T); +} diff --git a/CLion/ExerciseBook/07.33/07.33.png b/CLion/ExerciseBook/07.33/07.33.png new file mode 100644 index 0000000000000000000000000000000000000000..3c3b99a87eb5c3309a9d02b2686718cb859c314d GIT binary patch literal 34695 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 F{vRPR)V%-z literal 0 HcmV?d00001 diff --git a/CLion/ExerciseBook/07.33/CMakeLists.txt b/CLion/ExerciseBook/07.33/CMakeLists.txt new file mode 100644 index 0000000..26d8bf2 --- /dev/null +++ b/CLion/ExerciseBook/07.33/CMakeLists.txt @@ -0,0 +1,12 @@ +# 包å«å…¬å…±åº“ +include_directories(${CMAKE_SOURCE_DIR}/Status) + +# 生æˆå¯æ‰§è¡Œæ–‡ä»¶ +add_executable(07.33 SqQueue.h SqQueue.c CSTree.h CSTree.c MFSet.h MFSet.c Graph.h Graph.c MinimumSpanningTree.h MinimumSpanningTree.c 07.33.c) +# 链接公共库 +target_link_libraries(07.33 Scanf_lib) + +# è®°å½•è¦æ‹·è´åˆ°*.exeç›®å½•ä¸‹çš„èµ„æºæ–‡ä»¶ +file(GLOB TestData TestData*.txt) +# å°†èµ„æºæ–‡ä»¶æ‹·è´åˆ°*.exe目录下,ä¸ç„¶æ— æ³•加载 +file(COPY ${TestData} DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) diff --git a/CLion/ExerciseBook/07.33/CSTree.c b/CLion/ExerciseBook/07.33/CSTree.c new file mode 100644 index 0000000..f2a7635 --- /dev/null +++ b/CLion/ExerciseBook/07.33/CSTree.c @@ -0,0 +1,76 @@ +/*=================================== + * 树的二å‰é“¾è¡¨ï¼ˆå­©å­-兄弟)结构存储表示 + ====================================*/ + +#include "CSTree.h" + +int count = 0; + +/* + * åˆå§‹åŒ– + * + * 构造空树。 + */ +Status InitTree(CSTree* T) { + if(T == NULL) { + return ERROR; + } + + *T = NULL; + + return OK; +} + +/* + * 判空 + * + * 判断树是å¦ä¸ºç©ºæ ‘。 + */ +Status TreeEmpty(CSTree T) { + return T == NULL ? TRUE : FALSE; +} + + +/*â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”┠图形化输出 â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”*/ + +// 以图形化形å¼è¾“出当å‰ç»“æž„ +void PrintTree(CSTree T) { + + // é‡åˆ°ç©ºæ ‘则无需继续计算 + if(TreeEmpty(T)) { + printf("\n"); + return; + } + + Print(T, 0); + + printf("\n"); +} + +// 图形化输出当å‰ç»“构内部实现 +static void Print(CSTree T, int row) { + int k; + + if(T == NULL) { + return; + } + + if(row==0) { + printf("\n第 %d 棵树...\n", ++count); + } + + // 访问当å‰ç»“点 + printf("%c ", T->data); + + Print(T->firstchild, row + 1); + + if(T->nextsibling != NULL) { + printf("\n"); + + for(k = 0; k < row; k++) { + printf(". "); + } + + Print(T->nextsibling, row); + } +} diff --git a/CLion/ExerciseBook/07.33/CSTree.h b/CLion/ExerciseBook/07.33/CSTree.h new file mode 100644 index 0000000..7b8cf93 --- /dev/null +++ b/CLion/ExerciseBook/07.33/CSTree.h @@ -0,0 +1,53 @@ +/*=================================== + * 树的二å‰é“¾è¡¨ï¼ˆå­©å­-兄弟)结构存储表示 + ====================================*/ + +#ifndef CSTREE_H +#define CSTREE_H + +#include +#include // æä¾› mallocã€free 原型 +#include // æä¾› memsetã€strcmp 原型 +#include "Status.h" //**â–²01 绪论**// + +/* å•ä¸ªç»“ç‚¹æœ€å¤§çš„å­©å­æ•°é‡ */ +#define MAX_CHILD_COUNT 8 + +/* 树的元素类型定义,这里å‡è®¾å…¶å…ƒç´ ç±»åž‹ä¸ºchar */ +typedef char TElemType; + +/* (å­©å­-兄弟)树的结点定义 */ +typedef struct CSNode { + TElemType data; + struct CSNode* firstchild; // 指å‘é•¿å­ + struct CSNode* nextsibling; // 指å‘å³å…„弟 +} CSNode; + +/* (å­©å­-兄弟)树类型定义 */ +typedef CSNode* CSTree; + + +/* + * åˆå§‹åŒ– + * + * 构造空树。 + */ +Status InitTree(CSTree* T); + +/* + * 判空 + * + * 判断树是å¦ä¸ºç©ºæ ‘。 + */ +Status TreeEmpty(CSTree T); + + +/*â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”┠图形化输出 â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”*/ + +// 以图形化形å¼è¾“出当å‰ç»“æž„ +void PrintTree(CSTree T); + +// 图形化输出当å‰ç»“构内部实现 +static void Print(CSTree T, int row); + +#endif diff --git a/CLion/ExerciseBook/07.33/Graph.c b/CLion/ExerciseBook/07.33/Graph.c new file mode 100644 index 0000000..a011257 --- /dev/null +++ b/CLion/ExerciseBook/07.33/Graph.c @@ -0,0 +1,244 @@ +/*================================= + * 由题7.33çš„æè¿°åˆ›å»ºçš„ä¸€ç§æ— å‘网结构 + ==================================*/ + +#include "Graph.h" + +// 录入数æ®çš„æºæ–‡ä»¶ï¼›fp为null时,说明需è¦ä»ŽæŽ§åˆ¶å°å½•å…¥ +static FILE* fp = NULL; + + +/* + * 创建无å‘网 + * + * path为NULL或为""时,从控制å°è¯»å–图的åˆå§‹åŒ–ä¿¡æ¯ã€‚ + * å¦åˆ™ï¼Œä»Žé¢„设的文件中读å–图的åˆå§‹åŒ–ä¿¡æ¯ã€‚ + */ +Status CreateGraph(Graph* G, char* path) { + int readFromConsole; // 是å¦ä»ŽæŽ§åˆ¶å°è¯»å–æ•°æ® + + // 如果没有文件路径信æ¯ï¼Œåˆ™ä»ŽæŽ§åˆ¶å°è¯»å–输入 + readFromConsole = path == NULL || strcmp(path, "") == 0; + + // 需è¦ä»Žæ–‡ä»¶è¯»å– + if(!readFromConsole) { + // æ‰“å¼€æ–‡ä»¶ï¼Œå‡†å¤‡è¯»å–æµ‹è¯•æ•°æ® + fp = fopen(path, "r"); + if(fp == NULL) { + return ERROR; + } + } + + Create(G); + + if(fp != NULL) { + fclose(fp); + fp = NULL; + } + + return OK; +} + +/* + * 创建无å‘网的核心算法 + */ +static void Create(Graph* G) { + int u, v, k; + VertexType v1, v2; + int weight; + + // 从控制å°è¯»å– + if(fp == NULL) { + printf("请输入无å‘网的顶点数:"); + scanf("%d", &((*G).vexnum)); + printf("请输入无å‘网的边数:"); + scanf("%d", &((*G).arcnum)); + + // 录入顶点集 + printf("请录入 %d 个顶点,ä¸åŒé¡¶ç‚¹ä¹‹é—´ç”¨ç©ºæ ¼éš”开:", (*G).vexnum); + for(k = 0; k < (*G).vexnum; k++) { + // 跳过空白,寻找下一个"å¯è¯»"ç¬¦å· + skipBlank(stdin); + scanf("%c", &((*G).vexs[k])); + } + + // ä»Žæ–‡ä»¶è¯»å– + } else { + ReadData(fp, "%d", &((*G).vexnum)); // 录入顶点数 + ReadData(fp, "%d", &((*G).arcnum)); // 录入边数 + + // 录入顶点集 + for(k = 0; k < (*G).vexnum; k++) { + // 跳过空白,寻找下一个"å¯è¯»"ç¬¦å· + skipBlank(fp); + ReadData(fp, "%c", &((*G).vexs[k])); + } + } + + // 仅在控制å°å½•å…¥ä¿¡æ¯æ—¶è¾“出此æç¤º + if(fp == NULL && (*G).arcnum != 0) { + printf("请为无å‘ç½‘ä¾æ¬¡å½•å…¥ %d æ¡è¾¹çš„ä¿¡æ¯ï¼Œé¡¶ç‚¹ä¸Žæƒå€¼ä¹‹é—´ç”¨ç©ºæ ¼éš”开:\n", (*G).arcnum); + } + + // 构造边集结构,0å·å•å…ƒå­˜å‚¨è¾¹çš„æ•°é‡ + (*G).EdgeSet = (EdgeSetType*) malloc(((*G).arcnum + 1) * sizeof(EdgeSetType)); + if((*G).EdgeSet == NULL) { + exit(ERROR); + } + + // EdgeSetçš„0å·å•元存储了无å‘ç½‘ä¸­è¾¹çš„æ•°é‡ + (*G).EdgeSet[0].weight = (*G).arcnum; + + // å½•å…¥è¾¹çš„ä¿¡æ¯ + for(k = 0; k < (*G).arcnum; k++) { + if(fp == NULL) { + printf("第 %2d æ¡è¾¹ä¸Žæƒå€¼ï¼š", k + 1); + skipBlank(stdin); // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + scanf("%c", &v1); + skipBlank(stdin); // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + scanf("%c", &v2); + skipBlank(stdin); // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + scanf("%d", &weight); + } else { + // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + skipBlank(fp); + ReadData(fp, "%c%c%d", &v1, &v2, &weight); + } + + u = LocateVex(*G, v1); // 获å–顶点v1在顶点集中的ä½ç½® + v = LocateVex(*G, v2); // 获å–顶点v2在顶点集中的ä½ç½® + + (*G).EdgeSet[k + 1].u = u; + (*G).EdgeSet[k + 1].v = v; + (*G).EdgeSet[k + 1].weight = weight; + } +} + +/* + * 查找 + * + * 返回顶点u在无å‘网中的ä½ç½® + */ +int LocateVex(Graph G, VertexType u) { + int i; + + for(i = 0; i < G.vexnum; i++) { + if(G.vexs[i] == u) { + return i; + } + } + + return -1; +} + +/* + * 从边集EdgeSetä¸­èŽ·å–æœ€å°è¾¹çš„顶点uå’Œv,并返回TRUE。 + * 若边集为空,则返回FASLE。 + */ +Boolean GetMinEdge(EdgeSetType* EdgeSet, int* u, int* v) { + int i, j, k; + int min = INT_MAX; // 记录æƒå€¼çš„æœ€å¤§å€¼ + + // 边集为空 + if(EdgeSet[0].weight == 0) { + return FALSE; + } + + // 查找æƒå€¼æœ€å°çš„è¾¹ + for(k = 1; k <= EdgeSet[0].weight; k++) { + if(EdgeSet[k].weight < min) { + min = EdgeSet[k].weight; + i = EdgeSet[k].u; + j = EdgeSet[k].v; + } + } + + // è®°å½•é¡¶ç‚¹ä¿¡æ¯ + *u = i; + *v = j; + + return TRUE; +} + +/* + * 从边集中删除ä¾é™„于顶点uå’Œv的最å°è¾¹ã€‚ + * 删除æˆåŠŸè¿”å›žTRUE,å¦åˆ™ï¼Œè¿”回FALSE。 + */ +Boolean DelMinEdge(EdgeSetType* EdgeSet, int u, int v) { + int k; + Boolean found = FALSE; // æ˜¯å¦æ‰¾åˆ°äº†è¾¹ + + // 边集为空 + if(EdgeSet[0].weight == 0) { + return FALSE; + } + + // 先查找该æ¡è¾¹åœ¨è¾¹é›†ä¸­çš„ä½ç½® + for(k = 1; k <= EdgeSet[0].weight; k++) { + if((EdgeSet[k].u == u && EdgeSet[k].v == v) || (EdgeSet[k].u == v && EdgeSet[k].v == u)) { + found = TRUE; + break; + } + } + + if(found == FALSE) { + return FALSE; + } + + // è¿™é‡Œé‡‡ç”¨çš„åˆ é™¤æ–¹å¼æ˜¯ç›´æŽ¥ç”¨æœ€åŽä¸€æ¡è¾¹çš„ä¿¡æ¯è¦†ç›–å¾…åˆ é™¤è¾¹çš„ä¿¡æ¯ + EdgeSet[k] = EdgeSet[EdgeSet[0].weight]; + EdgeSet[0].weight--; + + return TRUE; +} + +/* + * æ‰“å°æ— å‘网结构 + */ +void PrintGraph(Graph G) { + int i, j, k, w; + int adjs[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; + + if(G.vexnum == 0) { + printf("空图,无需打å°ï¼\n"); + return; + } + + // åˆå§‹åŒ–è¾¹çš„ä¿¡æ¯ + for(i = 0; i < G.vexnum; i++) { + for(j = 0; j < G.vexnum; j++) { + adjs[i][j] = INFINITE; + } + } + + // 构造边集矩阵 + for(k = 1; k <= G.EdgeSet[0].weight; k++) { + i = G.EdgeSet[k].u; + j = G.EdgeSet[k].v; + w = G.EdgeSet[k].weight; + + adjs[i][j] = adjs[j][i] = w; + } + + printf("当剿— å‘ç½‘åŒ…å« %2d 个顶点, %2d æ¡è¾¹...\n", G.vexnum, G.arcnum); + + printf(" "); + for(i = 0; i < G.vexnum; i++) { + printf(" %c", G.vexs[i]); + } + printf("\n"); + + for(i = 0; i < G.vexnum; i++) { + printf("%c ", G.vexs[i]); + + for(j = 0; j < G.vexnum; j++) { + if(adjs[i][j] == INFINITE) { + printf(" -"); + } else { + printf("%3d", adjs[i][j]); + } + } + + printf("\n"); + } +} diff --git a/CLion/ExerciseBook/07.33/Graph.h b/CLion/ExerciseBook/07.33/Graph.h new file mode 100644 index 0000000..3f0e526 --- /dev/null +++ b/CLion/ExerciseBook/07.33/Graph.h @@ -0,0 +1,71 @@ +/*================================= + * 由题7.33çš„æè¿°åˆ›å»ºçš„ä¸€ç§æ— å‘网结构 + ==================================*/ + +#ifndef GRAPH_H +#define GRAPH_H + +#include +#include // æä¾›å®INT_MAX +#include // æä¾› mallocã€free 原型 +#include // æä¾› memsetã€strcmp 原型 +#include "Status.h" //**â–²01 绪论**// + +#define INFINITE INT_MAX // 最大值,用æ¥è¡¨ç¤ºç½‘中的两个顶点ä¸ç›´æŽ¥è¿žæŽ¥ +#define MAX_VERTEX_NUM 26 // 顶点个数最大值 + +// 顶点类型 +typedef char VertexType; + +// 边集类型 +typedef struct { + int u, v; // 顶点 + int weight; // æƒå€¼ +} EdgeSetType; + +// 有å‘图类型定义 +typedef struct Graph { + VertexType vexs[MAX_VERTEX_NUM]; // 顶点å‘é‡ + EdgeSetType* EdgeSet; // 边集 + int vexnum, arcnum; // 有å‘图的顶点数和弧数 +} Graph; + + +/* + * 创建有å‘图 + * + * path为NULL或为""时,从控制å°è¯»å–图的åˆå§‹åŒ–ä¿¡æ¯ã€‚ + * å¦åˆ™ï¼Œä»Žé¢„设的文件中读å–图的åˆå§‹åŒ–ä¿¡æ¯ã€‚ + */ +Status CreateGraph(Graph* G, char* path); + +/* + * 创建有å‘图的核心算法 + */ +static void Create(Graph* G); + +/* + * 查找 + * + * 返回顶点u在有å‘图中的ä½ç½® + */ +int LocateVex(Graph G, VertexType u); + +/* + * 从边集EdgeSetä¸­èŽ·å–æœ€å°è¾¹çš„顶点uå’Œv,并返回TRUE。 + * 若边集为空,则返回FASLE。 + */ +Boolean GetMinEdge(EdgeSetType* EdgeSet, int* u, int* v); + +/* + * 从边集中删除ä¾é™„于顶点uå’Œv的最å°è¾¹ã€‚ + * 删除æˆåŠŸè¿”å›žTRUE,å¦åˆ™ï¼Œè¿”回FALSE。 + */ +Boolean DelMinEdge(EdgeSetType* EdgeSet, int u, int v); + +/* + * æ‰“å°æœ‰å‘图结构 + */ +void PrintGraph(Graph G); + +#endif diff --git a/CLion/ExerciseBook/07.33/MFSet.c b/CLion/ExerciseBook/07.33/MFSet.c new file mode 100644 index 0000000..2ee2468 --- /dev/null +++ b/CLion/ExerciseBook/07.33/MFSet.c @@ -0,0 +1,93 @@ +/*===== + * é›†åˆ + ======*/ + +#include "MFSet.h" + +/* + * åˆå§‹åŒ–一个由多个å­é›†ï¼ˆæ¯ä¸ªå­é›†åªåŒ…å«å•个æˆå‘˜ï¼‰æž„æˆçš„集åˆS。 + * + * + *ã€å¤‡æ³¨ã€‘ + * + * 这里对第6ç« çš„MFSetåšäº†æ”¹åŠ¨ï¼š + * 1.ç›´æŽ¥åœ¨å‚æ•°ä¸­ä¼ å…¥å­é›†æ•°é‡ + * 2.å­é›†ç¼–å·ä»Ž0开始计数,这会影å“到åŽé¢çš„函数中关于下标的判断 + */ +Status initial_mfset(MFSet* S, int n) { + int i; + + if(n <= 0) { + return ERROR; + } + + S->n = n; + S->r = 0; // 第一个å­é›†çš„ä½ç½®åœ¨0å·å•å…ƒ + + // å­é›†ç¼–å·ä»Ž0开始计数 + for(i = 0; i < n; i++) { + S->nodes[i].parent = -1; + } + + return OK; +} + +/* + * 求两个互ä¸ç›¸äº¤çš„å­é›†Siå’Œå­é›†Sj的并集。 + */ +Status merge_mfset(MFSet* S, int i, int j) { + + // 索引越界 + if(i < 0 || i > S->n - 1 || j < 0 || j > S->n - 1) { + return ERROR; + } + + // 相åŒçš„å­é›†æ— éœ€åˆå¹¶ï¼Œç›´æŽ¥è¿”回 + if(i == j) { + return OK; + } + + S->nodes[i].parent = j; + + return OK; +} + +/* + * 在集åˆS中查找元素i当剿‰€å±žçš„å­é›†ã€‚ + */ +int find_mfset(MFSet S, int i) { + int j; + + // 索引越界 + if(i < 0 || i > S.n - 1) { + return -1; + } + + // 查找i所属的å­é›†çš„æ ¹ç»“点 + for(j = i; S.nodes[j].parent >= 0; j = S.nodes[j].parent) { + // 从下往上查找 + } + + return j; +} + +/* + * æ ¹æ®ç­‰ä»·å…³ç³»Ræ¥æ•´ç†/建立集åˆS中的元素(å­é›†)。 + */ +Status build_mfset(MFSet* S, Relation R) { + int k; + int i, j; + + for(k = 0; k < R.n; k++) { + // 先获å–å­é›†æ ¹ç»“点 + i = find_mfset(*S, R.pairs[k].i); + j = find_mfset(*S, R.pairs[k].j); + + // 对两个互ä¸ç›¸äº¤çš„å­é›†è¿›è¡Œå½’å¹¶ + if(!merge_mfset(S, i, j)) { + return ERROR; + } + } + + return OK; +} diff --git a/CLion/ExerciseBook/07.33/MFSet.h b/CLion/ExerciseBook/07.33/MFSet.h new file mode 100644 index 0000000..a1369a0 --- /dev/null +++ b/CLion/ExerciseBook/07.33/MFSet.h @@ -0,0 +1,92 @@ +/*===== + * é›†åˆ + ======*/ + +#ifndef MFSET_H +#define MFSET_H + +#include +#include // æä¾› mallocã€free 原型 +#include // æä¾› memsetã€strcmp 原型 +#include // +#include "Status.h" //**â–²01 绪论**// + +/* 树的最大结点数,这里指示å­é›†æœ€å¤§æ•°é‡ */ +#define MAX_TREE_SIZE 1024 + +/* äºŒå…ƒå…³ç³»å¯¹æ•°é‡ */ +#define MAX_PAIR_SIZE 100 + +/* + * (åŒäº²)树的结点定义 + * + *ã€æ³¨ã€‘ + * 1.ä¾ç…§æ•™æçš„图示,åŒäº²æ ‘在集åˆçš„应用中,其模型已被简化:å³åŒäº²ç»“点ä¸å†ä¿ç•™æ•°æ®åŸŸã€‚ + * 2.结点的索引用æ¥è¡¨ç¤ºå®ƒæ˜¯å“ªä¸€ä¸ªå­é›†ï¼Œå®ƒä¼šä½œä¸ºæ›´å¤§å­é›†çš„一个元素存在。 + * 3.确定æŸä¸ªå­é›†å±žäºŽS中哪个更大的å­é›†æ—¶ï¼Œéœ€è¦å‘上追溯到更大å­é›†çš„æ ¹ã€‚ + * 4.实际使用中,æ¯ä¸ªå­é›†ä¼šåŒ…å«å¾ˆå¤šæ•°æ®å…ƒç´ ï¼Œæ­¤æ—¶å¯ä»¥å°†æ¯ä¸ªæ•°æ®å…ƒç´ ä¸Žå…¶æ‰€å±žçš„å­é›†å»ºç«‹å…³è”关系 + * å³æŠŠæ¯ä¸ªæ•°æ®å…ƒç´ ä¸Žé›†åˆS中å„结点的索引关è”èµ·æ¥ + */ +typedef struct PTNode { + int parent; // åŒäº²ä½ç½®åŸŸï¼Œç”¨æ¥æŒ‡ç¤ºè¯¥ç»“点所属的å­é›† +} PTNode; + +/* + * (åŒäº²)树类型定义 + * + *ã€æ³¨ã€‘ + * 1.树中结点在nodes中"ç´§é‚»"存储,没有空隙 + * 2.当å­é›†å­˜åœ¨æ—¶ï¼Œæ ‘æ ¹r设置为1,å¦åˆ™ï¼Œæ ‘æ ¹r设置为0 + * 3.é™¤æ ¹ç»“ç‚¹å¤–ï¼Œå…¶ä»–ç»“ç‚¹ä¾æ¬¡æŒ‰å±‚åºé¡ºç€æ ¹ç»“点往下排列 + * 5.这里å‡è®¾nodes空间是足够大的,å¯ä»¥è§†éœ€æ±‚将其改为动æ€åˆ†é…存储 + */ +typedef struct { + PTNode nodes[MAX_TREE_SIZE]; // 存储树中结点 + int r; // æ ‘æ ¹ä½ç½®(索引)ï¼Œè¿™é‡Œç”¨æ¥æŒ‡ç¤ºç¬¬ä¸€ä¸ªå­é›†çš„ä½ç½® + int n; // æ ‘çš„ç»“ç‚¹æ•°ï¼Œè¿™é‡Œç”¨æ¥æŒ‡ç¤ºæ‰€æœ‰ +} PTree; + +/* 集åˆç±»åž‹å®šä¹‰ */ +typedef PTree MFSet; + +/* å•个二元关系对 */ +typedef struct { + int i; + int j; +} Pair; + +/* 集åˆå†…的等价关系 */ +typedef struct { + Pair pairs[MAX_PAIR_SIZE]; // 足够大的空间存储二元关系 + int n; // å·²çŸ¥çš„ç­‰ä»·å…³ç³»æ•°é‡ +} Relation; + + +/* + * åˆå§‹åŒ–一个由多个å­é›†ï¼ˆæ¯ä¸ªå­é›†åªåŒ…å«å•个æˆå‘˜ï¼‰æž„æˆçš„集åˆS。 + * + * + *ã€å¤‡æ³¨ã€‘ + * + * 这里对第6ç« çš„MFSetåšäº†æ”¹åŠ¨ï¼š + * 1.ç›´æŽ¥åœ¨å‚æ•°ä¸­ä¼ å…¥å­é›†æ•°é‡ + * 2.å­é›†ç¼–å·ä»Ž0开始计数,这会影å“到åŽé¢çš„函数中关于下标的判断 + */ +Status initial_mfset(MFSet* S, int n); + +/* + * 求两个互ä¸ç›¸äº¤çš„å­é›†Siå’Œå­é›†Sj的并集。 + */ +Status merge_mfset(MFSet* S, int i, int j); + +/* + * 在集åˆS中查找元素i当剿‰€å±žçš„å­é›†ã€‚ + */ +int find_mfset(MFSet S, int i); + +/* + * æ ¹æ®ç­‰ä»·å…³ç³»Ræ¥æ•´ç†/建立集åˆS中的元素(å­é›†)。 + */ +Status build_mfset(MFSet* S, Relation R); + +#endif diff --git a/CLion/ExerciseBook/07.33/MinimumSpanningTree.c b/CLion/ExerciseBook/07.33/MinimumSpanningTree.c new file mode 100644 index 0000000..26b3fec --- /dev/null +++ b/CLion/ExerciseBook/07.33/MinimumSpanningTree.c @@ -0,0 +1,142 @@ +/*================== + * æ— å‘网的最å°ç”Ÿæˆæ ‘ + * + * 包å«ç®—法: 7.9 + ==================*/ + +#include "MinimumSpanningTree.h" + +/* + * ä½¿ç”¨å…‹é²æ–¯å¡å°”ç®—æ³•æ±‚å–æœ€å°ç”Ÿæˆæ ‘ + */ +CSTree MinSpanTree_KRUSKAL(Graph G) { + int k; + int v1, v2; + int s1, s2; + + CSTree T = NULL; + CSTree parent[MAX_VERTEX_NUM] = {NULL}; // 追踪å„顶点在树中的ä½ç½®(用指针指å‘该顶点) + SqQueue queue; + int root; + + // 记录已ç»åŠ å…¥åˆ°æœ€å°ç”Ÿæˆæ ‘的顶点集,这里使用集åˆçš„目的是快速判断候选顶点是å¦ä¼šé€ æˆçŽ¯è·¯ + MFSet S; + Relation relation; + + // 存储有å‘网边集的一个副本 + EdgeSetType* EdgeSet; + + // 存储最å°ç”Ÿæˆæ ‘中包å«çš„边集 + EdgeSetType* tree; + EdgeSetType edge; + + // å¤åˆ¶æœ‰å‘网的边集 + EdgeSet = (EdgeSetType*) malloc((G.EdgeSet[0].weight * sizeof(EdgeSetType))); + for(k = 0; k <= G.EdgeSet[0].weight; k++) { + EdgeSet[k] = G.EdgeSet[k]; // 结构体å¯ä»¥ç›´æŽ¥å¤åˆ¶ + } + + // 最å°ç”Ÿæˆæ ‘中包å«çš„边的数é‡ä¸ºé¡¶ç‚¹æ•°-1,但这里多分é…了一个å•元,因为0å·å•å…ƒè¦å­˜å‚¨è¾¹çš„æ•°é‡ + tree = (EdgeSetType*) malloc(G.vexnum * sizeof(EdgeSetType)); + tree[0].weight = 0; + + // åˆå§‹åŒ–é¡¶ç‚¹é›†åˆ + initial_mfset(&S, G.vexnum); + + // ä»Žè¾¹é›†ä¸­ä¾æ¬¡é€‰æ‹©æƒå€¼æœ€å°ï¼Œä¸”䏿ž„æˆçŽ¯è·¯çš„è¾¹åŠ å…¥åˆ°æœ€å°ç”Ÿæˆæ ‘ + for(k = 0; k < G.arcnum; k++) { + // é€‰å‡ºä¸€æ¡æƒå€¼æœ€å°çš„è¾¹ + GetMinEdge(EdgeSet, &v1, &v2); + // 选完之åŽå°±å¯ä»¥ä»Žè¾¹é›†çš„副本中删掉这æ¡è¾¹äº†ï¼Œå› ä¸ºåŽç»­ä¸å†éœ€è¦å®ƒ + DelMinEdge(EdgeSet, v1, v2); + + s1 = find_mfset(S, v1); + s2 = find_mfset(S, v2); + + // 如果这两个端点ä½äºŽåŒä¸€ä¸ªé›†åˆï¼Œåˆ™è·³è¿‡è¯¥æ¡è¾¹ + if(s1 == s2) { + continue; + } + + // 构造二元关系 + relation.n = 1; + relation.pairs[0].i = v1; + relation.pairs[0].j = v2; + + build_mfset(&S, relation); + + // 打å°é¡¶ç‚¹å’Œè¾¹çš„ä¿¡æ¯ + printf("%c %c\n", G.vexs[v1], G.vexs[v2]); + + // 创建树结点v1 + if(parent[v1] == NULL) { + parent[v1] = (CSTree) malloc(sizeof(CSNode)); + parent[v1]->data = G.vexs[v1]; + parent[v1]->firstchild = parent[v1]->nextsibling = NULL; + } + + // 创建树结点v2 + if(parent[v2] == NULL) { + parent[v2] = (CSTree) malloc(sizeof(CSNode)); + parent[v2]->data = G.vexs[v2]; + parent[v2]->firstchild = parent[v2]->nextsibling = NULL; + } + + // å‘集åˆä¸­å­˜å‚¨æž„æˆæœ€å°ç”Ÿæˆæ ‘的边 + tree[0].weight++; + tree[tree[0].weight].u = v1; + tree[tree[0].weight].v = v2; + } + + + /* 接下æ¥ä½¿ç”¨å·²çŸ¥çš„è¾¹æ¥æž„造树的孩å­-兄弟链表存储结构 */ + + if(tree[0].weight<=0) { + return NULL; + } + + InitQueue(&queue); + + // 确定整棵树的根结点 + T = parent[tree[1].u]; + + // è¿½è¸ªæ¯æ£µå­æ ‘的根结点 + root = tree[1].u; + + while(tree[0].weight > 0) { + // 查找包å«ç«¯ç‚¹root的边 + for(k = 1; k <= tree[0].weight; k++) { + if(tree[k].u == root || tree[k].v == root) { + break; + } + } + + // 找到了这样的边 + if(k <= tree[0].weight) { + edge = tree[k]; + + // 移除这æ¡è¾¹ï¼Œæ­¤å¤„åªæ˜¯ç”¨æœ€åŽä¸€æ¡è¾¹çš„ä¿¡æ¯ç®€å•地覆盖这æ¡è¾¹çš„ä¿¡æ¯ + tree[k] = tree[tree[0].weight]; + tree[0].weight--; + + if(edge.u == root) { + // 把结点v添加为结点u的一个孩å­ç»“点,这里简å•åœ°ä½¿ç”¨å¤´æ’æ³• + parent[edge.v]->nextsibling = parent[edge.u]->firstchild; + parent[edge.u]->firstchild = parent[edge.v]; + + EnQueue(&queue, edge.v); + } else { + // 把结点u添加为结点v的一个孩å­ç»“点,这里简å•åœ°ä½¿ç”¨å¤´æ’æ³• + parent[edge.u]->nextsibling = parent[edge.v]->firstchild; + parent[edge.v]->firstchild = parent[edge.u]; + + EnQueue(&queue, edge.u); + } + } else { + // èŽ·å–æ–°çš„å­æ ‘çš„root + DeQueue(&queue, &root); + } + } + + return T; +} diff --git a/CLion/ExerciseBook/07.33/MinimumSpanningTree.h b/CLion/ExerciseBook/07.33/MinimumSpanningTree.h new file mode 100644 index 0000000..d4fc316 --- /dev/null +++ b/CLion/ExerciseBook/07.33/MinimumSpanningTree.h @@ -0,0 +1,22 @@ +/*================== + * æ— å‘网的最å°ç”Ÿæˆæ ‘ + * + * 包å«ç®—法: 7.9 + ==================*/ + +#ifndef MINIMUMSPANNINGTREE_H +#define MINIMUMSPANNINGTREE_H + +#include +#include // æä¾›INT_MAXå® +#include "SqQueue.h" //**â–²03 栈和队列**// +#include "MFSet.h" //**â–²06 æ ‘å’ŒäºŒå‰æ ‘**// +#include "CSTree.h" //**â–²06 æ ‘å’ŒäºŒå‰æ ‘**// +#include "Graph.h" + +/* + * ä½¿ç”¨å…‹é²æ–¯å¡å°”ç®—æ³•æ±‚å–æœ€å°ç”Ÿæˆæ ‘ + */ +CSTree MinSpanTree_KRUSKAL(Graph G); + +#endif diff --git a/CLion/ExerciseBook/07.33/SqQueue.c b/CLion/ExerciseBook/07.33/SqQueue.c new file mode 100644 index 0000000..27e1655 --- /dev/null +++ b/CLion/ExerciseBook/07.33/SqQueue.c @@ -0,0 +1,147 @@ +/*============================= + * 队列的顺åºå­˜å‚¨ç»“构(顺åºé˜Ÿåˆ—) + ==============================*/ + +#include "SqQueue.h" //**â–²03 栈和队列**// + +/* + * åˆå§‹åŒ– + * + * 构造一个空的顺åºé˜Ÿåˆ—。 + * åˆå§‹åŒ–æˆåŠŸåˆ™è¿”å›žOK,å¦åˆ™è¿”回ERROR。 + * + *ã€æ³¨ã€‘ + * 这里的队列是循环队列 + */ +Status InitQueue(SqQueue* Q) { + if(Q == NULL) { + return ERROR; + } + + (*Q).base = (QElemType*) malloc(MAXQSIZE * sizeof(QElemType)); + if(!(*Q).base) { + exit(OVERFLOW); + } + + (*Q).front = (*Q).rear = 0; + + return OK; +} + +/* + * 判空 + * + * 判断循环顺åºé˜Ÿåˆ—中是å¦åŒ…嫿œ‰æ•ˆæ•°æ®ã€‚ + * + * 返回值: + * TRUE : 循环顺åºé˜Ÿåˆ—为空 + * FALSE: 循环顺åºé˜Ÿåˆ—ä¸ä¸ºç©º + */ +Status QueueEmpty(SqQueue Q) { + // 队列空的标志 + if(Q.front == Q.rear) { + return TRUE; + } else { + return FALSE; + } +} + +/* + * 计数 + * + * 返回循环顺åºé˜Ÿåˆ—包å«çš„æœ‰æ•ˆå…ƒç´ çš„æ•°é‡ã€‚ + */ +int QueueLength(SqQueue Q) { + if(Q.base == NULL) { + return 0; + } + + // 队列长度 + return (Q.rear - Q.front + MAXQSIZE) % MAXQSIZE; +} + +/* + * å–值 + * + * 获å–队头元素,将其存储到e中。 + * 如果å¯ä»¥æ‰¾åˆ°ï¼Œè¿”回OK,å¦åˆ™ï¼Œè¿”回ERROR。 + */ +Status GetHead(SqQueue Q, QElemType* e) { + // 队列空的标志 + if(Q.base == NULL || Q.front == Q.rear) { + return ERROR; + } + + *e = Q.base[Q.front]; + + return OK; +} + +/* + * 入队 + * + * 将元素e添加到队列尾部。 + */ +Status EnQueue(SqQueue* Q, QElemType e) { + if(Q == NULL || (*Q).base == NULL) { + return ERROR; + } + + // 队列满的标志(会浪费一个空间æ¥åŒºåˆ†é˜Ÿåˆ—空和队列满) + if(((*Q).rear + 1) % MAXQSIZE == (*Q).front) { + return ERROR; + } + + // 入队 + (*Q).base[(*Q).rear] = e; + + // 尾指针å‰è¿› + (*Q).rear = ((*Q).rear + 1) % MAXQSIZE; + + return OK; +} + +/* + * 出队 + * + * 移除队列头部的元素,将其存储到e中。 + */ +Status DeQueue(SqQueue* Q, QElemType* e) { + if(Q == NULL || (*Q).base == NULL) { + return ERROR; + } + + // 队列空的标志 + if((*Q).front == (*Q).rear) { + return ERROR; + } + + // 出队 + *e = (*Q).base[(*Q).front]; + + // 头指针å‰è¿› + (*Q).front = ((*Q).front + 1) % MAXQSIZE; + + return OK; +} + +/* + * é历 + * + * 用visit函数访问队列Q + */ +Status QueueTraverse(SqQueue Q, void(Visit)(QElemType)) { + int i; + + if(Q.base == NULL) { + return ERROR; + } + + for(i = Q.front; i != Q.rear; i = (i + 1) % MAXQSIZE) { + Visit(Q.base[i]); + } + + printf("\n"); + + return OK; +} diff --git a/CLion/ExerciseBook/07.33/SqQueue.h b/CLion/ExerciseBook/07.33/SqQueue.h new file mode 100644 index 0000000..2ef7eb8 --- /dev/null +++ b/CLion/ExerciseBook/07.33/SqQueue.h @@ -0,0 +1,84 @@ +/*============================= + * 队列的顺åºå­˜å‚¨ç»“构(顺åºé˜Ÿåˆ—) + ==============================*/ + +#ifndef SQQUEUE_H +#define SQQUEUE_H + +#include +#include // æä¾›mallocã€reallocã€freeã€exit原型 +#include "Status.h" //**â–²01 绪论**// + +/* å®å®šä¹‰ */ +#define MAXQSIZE 1000 //最大队列长度 + +/* 循环队列元素类型定义 */ +typedef int QElemType; + +// 循环队列的顺åºå­˜å‚¨ç»“æž„ +typedef struct { + QElemType* base; // 动æ€åˆ†é…存储空间 + int front; // 头指针,若队列ä¸ç©ºï¼ŒæŒ‡å‘队头元素 + int rear; // 尾指针,若队列ä¸ç©ºï¼ŒæŒ‡å‘队列尾元素的下一个ä½ç½® +} SqQueue; + + +/* + * åˆå§‹åŒ– + * + * 构造一个空的顺åºé˜Ÿåˆ—。 + * åˆå§‹åŒ–æˆåŠŸåˆ™è¿”å›žOK,å¦åˆ™è¿”回ERROR。 + * + *ã€æ³¨ã€‘ + * 这里的队列是循环队列 + */ +Status InitQueue(SqQueue* Q); + +/* + * 判空 + * + * 判断循环顺åºé˜Ÿåˆ—中是å¦åŒ…嫿œ‰æ•ˆæ•°æ®ã€‚ + * + * 返回值: + * TRUE : 循环顺åºé˜Ÿåˆ—为空 + * FALSE: 循环顺åºé˜Ÿåˆ—ä¸ä¸ºç©º + */ +Status QueueEmpty(SqQueue Q); + +/* + * 计数 + * + * 返回循环顺åºé˜Ÿåˆ—包å«çš„æœ‰æ•ˆå…ƒç´ çš„æ•°é‡ã€‚ + */ +int QueueLength(SqQueue Q); + +/* + * å–值 + * + * 获å–队头元素,将其存储到e中。 + * 如果å¯ä»¥æ‰¾åˆ°ï¼Œè¿”回OK,å¦åˆ™ï¼Œè¿”回ERROR。 + */ +Status GetHead(SqQueue Q, QElemType* e); + +/* + * 入队 + * + * 将元素e添加到队列尾部。 + */ +Status EnQueue(SqQueue* Q, QElemType e); + +/* + * 出队 + * + * 移除队列头部的元素,将其存储到e中。 + */ +Status DeQueue(SqQueue* Q, QElemType* e); + +/* + * é历 + * + * 用visit函数访问队列Q + */ +Status QueueTraverse(SqQueue Q, void(Visit)(QElemType)); + +#endif diff --git a/CLion/ExerciseBook/07.33/TestData_UDN.txt b/CLion/ExerciseBook/07.33/TestData_UDN.txt new file mode 100644 index 0000000..5964715 --- /dev/null +++ b/CLion/ExerciseBook/07.33/TestData_UDN.txt @@ -0,0 +1,4 @@ +顶点数→6 +边数→10 +顶点集→ã€A,B,C,D,E,F】 +边的集åˆâ†’ã€A,B,6】ã€A,C,1】ã€A,D,5】ã€B,C,5】ã€B,E,3】ã€C,D,5】ã€C,E,6】ã€C,F,4】ã€D,F,2】ã€E,F,6】 \ No newline at end of file diff --git a/CLion/ExerciseBook/07.34/07.34.c b/CLion/ExerciseBook/07.34/07.34.c new file mode 100644 index 0000000..77d3373 --- /dev/null +++ b/CLion/ExerciseBook/07.34/07.34.c @@ -0,0 +1,131 @@ +#include +#include "Status.h" //**â–²01 绪论**// +#include "ALGraph.h" //**â–²07 图**// +#include "TopologicalSorting.h" //**â–²07 图**// + +/* + * å¯¹æœ‰å‘æ— çŽ¯å›¾ä¸­çš„é¡¶ç‚¹é€‚å½“åœ°ç¼–å·ï¼Œä½¿å…¶æ‰€æœ‰å¼§vi->vj满足ivj满足iadjvex]] = 1; + p = p->nextarc; + } + } + + + printf(" "); + for(i = 0; i < G.vexnum; i++) { + printf(" %c", G.vertices[topo[i]].data); + } + printf("\n"); + + for(i = 0; i < G.vexnum; i++) { + printf("%c ", G.vertices[topo[i]].data); + + for(j = 0; j < G.vexnum; j++) { + if(adjs[i][j] == 0) { + printf(" -"); + } else { + printf("%3d", adjs[i][j]); + } + } + + printf("\n"); + } +} diff --git a/CLion/ExerciseBook/07.34/07.34.png b/CLion/ExerciseBook/07.34/07.34.png new file mode 100644 index 0000000000000000000000000000000000000000..6bb19199dc12ec07185960e5914dd51744fe7485 GIT binary patch literal 16448 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 MqODx1Xchkd0f5#y;s5{u literal 0 HcmV?d00001 diff --git a/CLion/ExerciseBook/07.34/ALGraph.c b/CLion/ExerciseBook/07.34/ALGraph.c new file mode 100644 index 0000000..1c9c854 --- /dev/null +++ b/CLion/ExerciseBook/07.34/ALGraph.c @@ -0,0 +1,325 @@ +/*================== + * 图的邻接表存储表示 + ===================*/ + +#include "ALGraph.h" + +// 录入数æ®çš„æºæ–‡ä»¶ï¼›fp为null时,说明需è¦ä»ŽæŽ§åˆ¶å°å½•å…¥ +static FILE* fp = NULL; + +/* + * IncInfo指示该图/网的边/弧上是å¦å­˜åœ¨é™„加信æ¯ã€‚ + * 如果其值ä¸ä¸º0,则表示无附加信æ¯ï¼Œå¦åˆ™ï¼Œè¡¨ç¤ºå­˜åœ¨é™„加信æ¯ã€‚ + */ +Boolean IncInfo = FALSE; + +// 访问标志数组,记录访问过的顶点 +static Boolean visited[MAX_VERTEX_NUM]; + +// 函数å˜é‡ +static Status (* VisitFunc)(VertexType e); + + +/* + * 创建 + * + *ã€å¤‡æ³¨ã€‘ + * + * æ•™æä¸­é»˜è®¤ä»ŽæŽ§åˆ¶å°è¯»å–æ•°æ®ã€‚ + * 这里为了方便测试,é¿å…æ¯æ¬¡è¿è¡Œéƒ½æ‰‹åŠ¨è¾“å…¥æ•°æ®ï¼Œ + * 因而å…许选择从预设的文件pathä¸­è¯»å–æµ‹è¯•æ•°æ®ã€‚ + * + * 如果需è¦ä»ŽæŽ§åˆ¶å°è¯»å–æ•°æ®ï¼Œåˆ™path为NULL,或path[kind]为""。 + * 如果需è¦ä»Žæ–‡ä»¶ä¸­è¯»å–æ•°æ®ï¼Œåˆ™éœ€è¦åœ¨path中填写文件åä¿¡æ¯ã€‚ + */ +Status CreateGraph(ALGraph* G, char* path[]) { + int readFromConsole; // 是å¦ä»ŽæŽ§åˆ¶å°è¯»å–æ•°æ® + int kind; + Status flag; + + // ★★★此处固定为有å‘图 + kind = 0; + + // 如果没有文件路径信æ¯ï¼Œåˆ™ä»ŽæŽ§åˆ¶å°è¯»å–输入 + readFromConsole = (path == NULL) || strcmp(path[kind], "") == 0; + + // 需è¦ä»Žæ–‡ä»¶è¯»å– + if(readFromConsole) { + (*G).kind = kind; // 记录图/网的类型 + } else { + // æ‰“å¼€æ–‡ä»¶ï¼Œå‡†å¤‡è¯»å–æµ‹è¯•æ•°æ® + fp = fopen(path[kind], "r"); + if(fp == NULL) { + return ERROR; + } + + // 录入图的类型 + ReadData(fp, "%d", &((*G).kind)); + } + + // éšæœºåˆ›å»ºæœ‰å‘图/网或无å‘图/ç½‘çš„ä¸€ç§ + switch((*G).kind) { + case DG: + flag = CreateDG(G); + break; + default: + flag = ERROR; + break; + } + + if(fp != NULL) { + fclose(fp); + fp = NULL; + } + + return flag; +} + +/* + * 构造有å‘图 + */ +static Status CreateDG(ALGraph* G) { + int i, k; + int vexnum, arcnum; + VertexType v1, v2; + InfoType* info = NULL; + + (*G).vexnum = (*G).arcnum = 0; + + if(fp == NULL) { + printf("请输入有å‘图的顶点数:"); + scanf("%d", &vexnum); + printf("请输入有å‘图的弧数:"); + scanf("%d", &arcnum); + printf("该有å‘图的弧上是å¦åŒ…å«å…¶ä»–附加信æ¯(0-ä¸åŒ…å«â”‚1-包å«):"); + scanf("%d", &IncInfo); + + // 录入顶点集 + printf("请录入 %d 个顶点,ä¸åŒé¡¶ç‚¹ä¹‹é—´ç”¨ç©ºæ ¼éš”开:", vexnum); + for(i = 0; i < vexnum; i++) { + // 跳过空白,寻找下一个"å¯è¯»"ç¬¦å· + skipBlank(stdin); + scanf("%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } else { + ReadData(fp, "%d", &vexnum); // 录入顶点数 + ReadData(fp, "%d", &arcnum); // 录入弧数 + ReadData(fp, "%d", &IncInfo); // 判断弧上是å¦åŒ…å«é™„åŠ ä¿¡æ¯ + + // 录入顶点集 + for(i = 0; i < vexnum; i++) { + // 跳过空白,寻找下一个"å¯è¯»"ç¬¦å· + skipBlank(fp); + ReadData(fp, "%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } + + // 仅在控制å°å½•å…¥ä¿¡æ¯æ—¶è¾“出此æç¤º + if(fp == NULL && arcnum != 0) { + printf("请为有å‘图便¬¡å½•å…¥ %d æ¡å¼§çš„ä¿¡æ¯ï¼Œé¡¶ç‚¹ä¹‹é—´ç”¨ç©ºæ ¼éš”开:\n", arcnum); + } + + // å½•å…¥å¼§çš„ä¿¡æ¯ + for(k = 0; k < arcnum; k++) { + if(fp == NULL) { + printf("第 %2d æ¡å¼§ï¼š", k + 1); + skipBlank(stdin); // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + scanf("%c", &v1); + skipBlank(stdin); // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + scanf("%c", &v2); + } else { + // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + skipBlank(fp); + ReadData(fp, "%c%c", &v1, &v2); + } + + // 如果需è¦å½•å…¥å¼§çš„å…¶ä»–é™„åŠ ä¿¡æ¯ + if(IncInfo) { + // 最åŽå½•å…¥é™„åŠ ä¿¡æ¯ + Input(*G, &info); + } + + // æ’入弧 + InsertArc(G, v1, v2, info); + } + + // ä»Žæ–‡ä»¶ä¸­è¯»å–æ•°æ®æ—¶ï¼Œæœ€åŽå…¶å®žåº”当判断一下是å¦è¯»åˆ°äº†è¶³å¤Ÿçš„ä¿¡æ¯ + return OK; +} + +/* + * 录入边/å¼§çš„ç›¸å…³é™„åŠ ä¿¡æ¯ + */ +static void Input(ALGraph G, InfoType** info) { + int weight; + + // 在"网"的情形下需è¦å½•å…¥æƒå€¼ä¿¡æ¯ + if(G.kind == DN || G.kind == UDN) { + *info = (InfoType*) malloc(sizeof(InfoType)); + + if(fp == NULL) { + scanf("%d", &weight); + } else { + ReadData(fp, "%d", &weight); + } + + (*info)->weight = weight; + } +} + +/* + * 查找 + * + * 返回顶点u在图/网中的ä½ç½® + */ +int LocateVex(ALGraph G, VertexType u) { + int i; + + for(i = 0; i < G.vexnum; i++) { + if(G.vertices[i].data == u) { + return i; + } + } + + return -1; +} + +/* + * 构造一个边/弧结点(ä»…é™å†…部使用) + */ +static ArcNode* newArcNodePtr(int adjvex, ArcNode* nextarc, InfoType* info) { + ArcNode* p = (ArcNode*) malloc(sizeof(ArcNode)); + if(!p) { + exit(OVERFLOW); + } + + p->adjvex = adjvex; + + p->nextarc = nextarc; + + p->info = info; + + return p; +} + +/* + * æ’入边/å¼§ + * + * 如果当å‰å›¾/网是无å‘的,则æ’入一æ¡å¼§éœ€è¦å¢žåŠ ä¸¤ä¸ªé¡¶ç‚¹å…³ç³»ï¼Œä½†å¼§çš„æ•°é‡åªå¢žä¸€ã€‚ + * 对于图/网æ¥è¯´ï¼Œå¯ä»¥åœ¨å¯å˜å‚数中列出边/弧的附加信æ¯ã€‚ + * + * æ³¨ï¼šæ­¤å¤„æŽ¥æ”¶çš„å‚æ•°ä¸ŽMGraph有些ä¸ä¸€æ ·ï¼šç½‘的附加信æ¯ä¸­åŒ…å«äº†å„æ¡è¾¹/å¼§çš„æƒå€¼ã€‚ + */ +Status InsertArc(ALGraph* G, VertexType v, VertexType w, ...) { + int tail, head, k, count; + ArcNode* r; + ArcNode* pre; + Boolean overlay = FALSE; // 是å¦ä¸ºè¦†ç›–添加 + InfoType* info = NULL; // è¾¹/å¼§çš„é™„åŠ ä¿¡æ¯ + va_list ap; + + tail = LocateVex(*G, v); // 获å–顶点v在顶点集中的ä½ç½® + if(tail == -1) { + return ERROR; // 指定的顶点ä¸å­˜åœ¨ + } + + head = LocateVex(*G, w); // 获å–顶点w在顶点集中的ä½ç½® + if(head == -1) { + return ERROR; // 指定的顶点ä¸å­˜åœ¨ + } + + // æ‹’ç»çޝ + if(tail == head) { + return ERROR; + } + + // 如果边/å¼§ä¸Šå­˜åœ¨é™„åŠ ä¿¡æ¯ + if(IncInfo) { + va_start(ap, w); // 在wåŽæŸ¥è¯¢é¦–个å¯å˜å‚æ•° + info = va_arg(ap, InfoType*); // 获å–é™„åŠ ä¿¡æ¯ + va_end(ap); + } + + /* 接下æ¥ï¼Œéœ€è¦æŸ¥æ‰¾åˆé€‚çš„æ’å…¥ä½ç½® */ + + for(count = 0; count < 2; count++) { + pre = NULL; + // 指å‘以tail为尾的首æ¡è¾¹/å¼§ + r = G->vertices[tail].firstarc; + while(r != NULL && r->adjvex < head) { + pre = r; + r = r->nextarc; + } + + // é‡åˆ°äº†ç›¸åŒä½ç½®çš„结点 + if(r != NULL && r->adjvex == head) { + r->info = info; // å¤ç”¨è¯¥ç»“点 + overlay = TRUE; // å‘生了覆盖 + } else { + if(pre == NULL) { + G->vertices[tail].firstarc = newArcNodePtr(head, r, info); + } else { + pre->nextarc = newArcNodePtr(head, r, info); + } + } + + // 如果当å‰å›¾/网是无å‘的,需è¦è€ƒè™‘对称性 + if((G->kind == UDG || G->kind == UDN) && tail != head) { + // 颠倒iå’Œj + k = tail; + tail = head; + head = k; + } else { + break; // 如果是有å‘的,å¯ä»¥ç»“æŸäº† + } + } + + // 在éžè¦†ç›–的情形下,æ‰è€ƒè™‘æ›´æ–°è¾¹/å¼§çš„æ•°é‡ + if(!overlay) { + (*G).arcnum++; // ä¸è®ºæœ‰å‘æ— å‘,边/å¼§æ•°åªå¢žä¸€ + } + + return OK; +} + +/* + * 以图形化形å¼è¾“出当å‰ç»“æž„ + */ +void PrintGraph(ALGraph G) { + int i; + ArcNode* p; + + if(G.vexnum == 0) { + printf("空图,无需打å°ï¼\n"); + return; + } + + printf("当å‰å›¾/ç½‘åŒ…å« %2d 个顶点, %2d æ¡è¾¹/å¼§...\n", G.vexnum, G.arcnum); + + for(i = 0; i < G.vexnum; i++) { + printf("%c ===> ", G.vertices[i].data); + + p = G.vertices[i].firstarc; + while(p != NULL) { + if(IncInfo == 0) { + printf("%c ", G.vertices[p->adjvex].data); + + // 对于网,会从其附加信æ¯ä¸­èŽ·å–到æƒå€¼ + } else { + printf("%c[%2d] ", G.vertices[p->adjvex].data, p->info->weight); + } + + p = p->nextarc; + + if(p != NULL) { + printf("- "); + } + } + + printf("\n"); + } +} diff --git a/CLion/ExerciseBook/07.34/ALGraph.h b/CLion/ExerciseBook/07.34/ALGraph.h new file mode 100644 index 0000000..ce5d0a0 --- /dev/null +++ b/CLion/ExerciseBook/07.34/ALGraph.h @@ -0,0 +1,128 @@ +/*================== + * 图的邻接表存储表示 + ===================*/ + +#ifndef ALGRAPH_H +#define ALGRAPH_H + +#include +#include // æä¾›memsetã€strcmp 原型 +#include // æä¾›å®va_listã€va_startã€va_argã€va_end +#include // æä¾›mallocã€reallocã€freeã€exit原型 +#include "Status.h" //**â–²01 绪论**// + +/* + * 注: + * + * 通常æ¥è®²ï¼Œæ— æƒå›¾è¢«ç®€ç§°ä¸ºã€å›¾ã€‘,有æƒå›¾è¢«ç®€ç§°ä¸ºã€ç½‘】。 + * æ— å‘图/网中的顶点关系被称为ã€è¾¹ã€‘,有å‘图/网中的顶点关系被称为ã€å¼§ã€‘,并区分弧头与弧尾。 + * 实际表述中,未必会严格éµå®ˆä»¥ä¸Šå‘½å。 + * + * 当å‰ç»“构适åˆå­˜å‚¨è¾¹/弧比较稀ç–的图/网。 + * + * ★ æ’入边/å¼§çš„ä¿¡æ¯æ—¶ï¼Œè¿™é‡Œçš„实现是按"å‡åº"æ’入的,这使得æ’入的弧是按"å‡åº"排列的。 + */ + + +/* å®å®šä¹‰ */ +#define MAX_VERTEX_NUM 26 // 最大顶点个数 + + +// 图的类型 +typedef enum { + DG, // 0-有å‘图 + DN, // 1-有å‘网(带æƒå€¼) + UDG, // 2-æ— å‘图 + UDN // 3-æ— å‘网(带æƒå€¼) +} GraphKind; + +// 顶点类型 +typedef char VertexType; + +// è¾¹/å¼§çš„ç›¸å…³é™„åŠ ä¿¡æ¯ +typedef struct { + /* + * 注: + * æ•™æä¸­ç»™å‡ºçš„结构åªè€ƒè™‘了无æƒå›¾ï¼Œè€Œæ²¡è€ƒè™‘有æƒå›¾(网)。 + * 这里为了把“网â€çš„æƒ…形也考虑进去,特在附加信æ¯ä¸­å¢žåŠ äº†"æƒé‡"属性。 + */ + int weight; +} InfoType; + +/* è¾¹/弧结点 */ +typedef struct ArcNode { + int adjvex; // 该弧所指å‘的顶点的ä½ç½® + struct ArcNode* nextarc; // 指å‘下一æ¡å¼§çš„æŒ‡é’ˆ + InfoType* info; // 弧的附加信æ¯ï¼Œé€šå¸¸å¿½ç•¥ +} ArcNode; + +// æ¯ä¸ªé“¾è¡¨çš„头结点 +typedef struct VNode { + VertexType data; // é¡¶ç‚¹ä¿¡æ¯ + ArcNode* firstarc; // 指å‘第一æ¡ä¾é™„该顶点的弧的指针 +} VNode; + +/* 图的邻接表存储表示类型定义 */ +typedef struct { + VNode vertices[MAX_VERTEX_NUM]; // 邻接表 + int vexnum, arcnum; // 图/网的顶点数和弧数 + GraphKind kind; // 图的类型标志 +} ALGraph; + + +// è¾¹/弧上是å¦å­˜åœ¨é™„åŠ ä¿¡æ¯ +extern Boolean IncInfo; + + +/* + * 创建 + * + *ã€å¤‡æ³¨ã€‘ + * + * æ•™æä¸­é»˜è®¤ä»ŽæŽ§åˆ¶å°è¯»å–æ•°æ®ã€‚ + * 这里为了方便测试,é¿å…æ¯æ¬¡è¿è¡Œéƒ½æ‰‹åŠ¨è¾“å…¥æ•°æ®ï¼Œ + * 因而å…许选择从预设的文件pathä¸­è¯»å–æµ‹è¯•æ•°æ®ã€‚ + * + * 如果需è¦ä»ŽæŽ§åˆ¶å°è¯»å–æ•°æ®ï¼Œåˆ™path为NULL,或path[kind]为""。 + * 如果需è¦ä»Žæ–‡ä»¶ä¸­è¯»å–æ•°æ®ï¼Œåˆ™éœ€è¦åœ¨path中填写文件åä¿¡æ¯ã€‚ + */ +Status CreateGraph(ALGraph* G, char* path[]); + +/* + * 构造有å‘图 + */ +static Status CreateDG(ALGraph* G); + +/* + * 录入边/å¼§çš„ç›¸å…³é™„åŠ ä¿¡æ¯ + */ +static void Input(ALGraph G, InfoType** info); + +/* + * 查找 + * + * 返回顶点u在图/网中的ä½ç½® + */ +int LocateVex(ALGraph G, VertexType u); + +/* + * 构造一个边/弧结点(ä»…é™å†…部使用) + */ +static ArcNode* newArcNodePtr(int adjvex, ArcNode* nextarc, InfoType* info); + +/* + * æ’入边/å¼§ + * + * 如果当å‰å›¾/网是无å‘的,则æ’入一æ¡å¼§éœ€è¦å¢žåŠ ä¸¤ä¸ªé¡¶ç‚¹å…³ç³»ï¼Œä½†å¼§çš„æ•°é‡åªå¢žä¸€ã€‚ + * 对于图/网æ¥è¯´ï¼Œå¯ä»¥åœ¨å¯å˜å‚数中列出边/弧的附加信æ¯ã€‚ + * + * æ³¨ï¼šæ­¤å¤„æŽ¥æ”¶çš„å‚æ•°ä¸ŽMGraph有些ä¸ä¸€æ ·ï¼šç½‘的附加信æ¯ä¸­åŒ…å«äº†å„æ¡è¾¹/å¼§çš„æƒå€¼ã€‚ + */ +Status InsertArc(ALGraph* G, VertexType v, VertexType w, ...); + +/* + * 以图形化形å¼è¾“出当å‰ç»“æž„ + */ +void PrintGraph(ALGraph G); + +#endif diff --git a/CLion/ExerciseBook/07.34/CMakeLists.txt b/CLion/ExerciseBook/07.34/CMakeLists.txt new file mode 100644 index 0000000..a5e12ae --- /dev/null +++ b/CLion/ExerciseBook/07.34/CMakeLists.txt @@ -0,0 +1,12 @@ +# 包å«å…¬å…±åº“ +include_directories(${CMAKE_SOURCE_DIR}/Status) + +# 生æˆå¯æ‰§è¡Œæ–‡ä»¶ +add_executable(07.34 SqStack.h SqStack.c ALGraph.h ALGraph.c TopologicalSorting.h TopologicalSorting.c 07.34.c) +# 链接公共库 +target_link_libraries(07.34 Scanf_lib) + +# è®°å½•è¦æ‹·è´åˆ°*.exeç›®å½•ä¸‹çš„èµ„æºæ–‡ä»¶ +file(GLOB TestData TestData*.txt) +# å°†èµ„æºæ–‡ä»¶æ‹·è´åˆ°*.exe目录下,ä¸ç„¶æ— æ³•加载 +file(COPY ${TestData} DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) diff --git a/CLion/ExerciseBook/07.34/SqStack.c b/CLion/ExerciseBook/07.34/SqStack.c new file mode 100644 index 0000000..d709204 --- /dev/null +++ b/CLion/ExerciseBook/07.34/SqStack.c @@ -0,0 +1,90 @@ +/*========================= + * 栈的顺åºå­˜å‚¨ç»“æž„ï¼ˆé¡ºåºæ ˆï¼‰ + ==========================*/ + +#include "SqStack.h" //**â–²03 栈和队列**// + +/* + * åˆå§‹åŒ– + * + * 构造一个空栈。åˆå§‹åŒ–æˆåŠŸåˆ™è¿”å›žOK,å¦åˆ™è¿”回ERROR。 + */ +Status InitStack(SqStack* S) { + if(S == NULL) { + return ERROR; + } + + (*S).base = (SElemType*) malloc(STACK_INIT_SIZE * sizeof(SElemType)); + if((*S).base == NULL) { + exit(OVERFLOW); + } + + (*S).top = (*S).base; + (*S).stacksize = STACK_INIT_SIZE; + + return OK; +} + +/* + * 判空 + * + * åˆ¤æ–­é¡ºåºæ ˆä¸­æ˜¯å¦åŒ…嫿œ‰æ•ˆæ•°æ®ã€‚ + * + * 返回值: + * TRUE : é¡ºåºæ ˆä¸ºç©º + * FALSE: é¡ºåºæ ˆä¸ä¸ºç©º + */ +Status StackEmpty(SqStack S) { + if(S.top == S.base) { + return TRUE; + } else { + return FALSE; + } +} + +/* + * 入栈 + * + * 将元素e压入到栈顶。 + */ +Status Push(SqStack* S, SElemType e) { + if(S == NULL || (*S).base == NULL) { + return ERROR; + } + + // 栈满时,追加存储空间 + if((*S).top - (*S).base >= (*S).stacksize) { + (*S).base = (SElemType*) realloc((*S).base, ((*S).stacksize + STACKINCREMENT) * sizeof(SElemType)); + if((*S).base == NULL) { + exit(OVERFLOW); // 存储分é…失败 + } + + (*S).top = (*S).base + (*S).stacksize; + (*S).stacksize += STACKINCREMENT; + } + + // 进栈先赋值,栈顶指针å†è‡ªå¢ž + *(S->top++) = e; + + return OK; +} + +/* + * 出栈 + * + * 将栈顶元素弹出,并用e接收。 + */ +Status Pop(SqStack* S, SElemType* e) { + if(S == NULL || (*S).base == NULL) { + return ERROR; + } + + if((*S).top == (*S).base) { + return ERROR; + } + + // 出栈栈顶指针先递å‡ï¼Œå†èµ‹å€¼ + *e = *(--(*S).top); + + return OK; +} diff --git a/CLion/ExerciseBook/07.34/SqStack.h b/CLion/ExerciseBook/07.34/SqStack.h new file mode 100644 index 0000000..e840954 --- /dev/null +++ b/CLion/ExerciseBook/07.34/SqStack.h @@ -0,0 +1,59 @@ +/*========================= + * 栈的顺åºå­˜å‚¨ç»“æž„ï¼ˆé¡ºåºæ ˆï¼‰ + ==========================*/ + +#ifndef SQSTACK_H +#define SQSTACK_H + +#include +#include // æä¾›mallocã€reallocã€freeã€exit原型 +#include "Status.h" //**â–²01 绪论**// + +/* å®å®šä¹‰ */ +#define STACK_INIT_SIZE 100 // é¡ºåºæ ˆå­˜å‚¨ç©ºé—´çš„åˆå§‹åˆ†é…é‡ +#define STACKINCREMENT 10 // é¡ºåºæ ˆå­˜å‚¨ç©ºé—´çš„分é…å¢žé‡ + +/* é¡ºåºæ ˆå…ƒç´ ç±»åž‹å®šä¹‰ */ +typedef int SElemType; + +// é¡ºåºæ ˆå…ƒç´ ç»“æž„ +typedef struct { + SElemType* base; // 栈底指针 + SElemType* top; // 栈顶指针 + int stacksize; // 当å‰å·²åˆ†é…的存储空间,以元素为å•ä½ +} SqStack; + + +/* + * åˆå§‹åŒ– + * + * 构造一个空栈。åˆå§‹åŒ–æˆåŠŸåˆ™è¿”å›žOK,å¦åˆ™è¿”回ERROR。 + */ +Status InitStack(SqStack* S); + +/* + * 判空 + * + * åˆ¤æ–­é¡ºåºæ ˆä¸­æ˜¯å¦åŒ…嫿œ‰æ•ˆæ•°æ®ã€‚ + * + * 返回值: + * TRUE : é¡ºåºæ ˆä¸ºç©º + * FALSE: é¡ºåºæ ˆä¸ä¸ºç©º + */ +Status StackEmpty(SqStack S); + +/* + * 入栈 + * + * 将元素e压入到栈顶。 + */ +Status Push(SqStack* S, SElemType e); + +/* + * 出栈 + * + * 将栈顶元素弹出,并用e接收。 + */ +Status Pop(SqStack* S, SElemType* e); + +#endif diff --git a/CLion/ExerciseBook/07.34/TestData_DG.txt b/CLion/ExerciseBook/07.34/TestData_DG.txt new file mode 100644 index 0000000..9d20118 --- /dev/null +++ b/CLion/ExerciseBook/07.34/TestData_DG.txt @@ -0,0 +1,6 @@ +图类型→0(有å‘图) +顶点数→12 +弧数→16 +弧是å¦å¸¦æœ‰å…¶ä»–ä¿¡æ¯â†’0 +顶点集→ã€A,B,C,D,E,F,G,H,I,J,K,L】 +弧的集åˆâ†’ã€F,J】ã€F,B】ã€F,C】ã€F,A】ã€B,C】ã€J,I】ã€C,I】ã€C,H】ã€I,H】ã€C,G】ã€D,A】ã€D,L】ã€L,A】ã€D,K】ã€K,E】ã€E,G】 \ No newline at end of file diff --git a/CLion/ExerciseBook/07.34/TopologicalSorting.c b/CLion/ExerciseBook/07.34/TopologicalSorting.c new file mode 100644 index 0000000..b35a574 --- /dev/null +++ b/CLion/ExerciseBook/07.34/TopologicalSorting.c @@ -0,0 +1,96 @@ +/*======================= + * AOV-网(有å‘图)çš„æ‹“æ‰‘æŽ’åº + * + * 包å«ç®—法: 7.12 + ========================*/ + +#include "TopologicalSorting.h" + +/* + * ████████ 算法7.12 ████████ + * + * 如果有å‘图G无回路,则输出它的一个拓扑åºåˆ—并返回OKï¼›å¦åˆ™ï¼Œè¿”回FALSE。 + * 拓扑åºåˆ—通常ä¸å”¯ä¸€ï¼Œä½†æ˜¯å¿…é¡»ä¿è¯æŸäº›å…³é”®èŠ‚ç‚¹çš„å…ˆåŽæ¬¡åºã€‚ + * + * 注:与教æä¸åŒä¹‹å¤„在于,此处增加了一个topo数组åšå‚数。 + *   对于求出的拓扑åºåˆ—,ä¸ä¼šç›´æŽ¥è¾“出,而是会缓存到topo中。 + *   这样的åšçš„目的是åŽç»­çš„习题中会有多处用到该拓扑åºåˆ—。 + */ +Status TopologicalSort(ALGraph G, int topo[MAX_VERTEX_NUM]) { + int i, k, count; + int indegree[MAX_VERTEX_NUM]; + SqStack S; + ArcNode* p; + + // 对å„顶点求入度 + FindInDegree(G, indegree); + + // åˆå§‹åŒ–零入度顶点栈 + InitStack(&S); + + // 建立入度为0的顶点栈 + for(i = 0; i < G.vexnum; i++) { + // 将入度为0的顶点添加到栈中 + if(indegree[i] == 0) { + Push(&S, i); + } + } + + // 对拓扑åºåˆ—中的顶点计数 + count = 0; + + // é历顶点栈 + while(!StackEmpty(S)) { + // 获å–一个零入度顶点 + Pop(&S, &i); + + // å°†å„顶点的åºå·æš‚å­˜èµ·æ¥ + topo[count++] = i; + + // é历iå·é¡¶ç‚¹çš„邻接点 + for(p = G.vertices[i].firstarc; p != NULL; p = p->nextarc) { + // 获å–顶点åºå· + k = p->adjvex; + + /* + * å°†iå·é¡¶ç‚¹æ¯ä¸ªé‚»æŽ¥ç‚¹çš„入度å‡ä¸€ï¼Œè¿™ç›¸å½“于切段iå·é¡¶ç‚¹åˆ°å…¶å®ƒé‚»æŽ¥ç‚¹çš„è”系。 + * 如果出现了新的入度为0的顶点,继续将其入栈。 + */ + if((--indegree[k]) == 0) { + Push(&S, k); + } + } + } + + // 如果é‡åˆ°äº†å›žè·¯ï¼Œåˆ™è¿”回ERROR + if(count < G.vexnum) { + return ERROR; + } else { + return OK; + } +} + +/* + * 计算å„顶点的入度 + */ +static void FindInDegree(ALGraph G, int indegree[MAX_VERTEX_NUM]) { + int i; + ArcNode* p; + + // åˆå§‹åŒ–所有顶点的入度为0 + for(i = 0; i < G.vexnum; i++) { + indegree[i] = 0; + } + + // é历所有顶点 + for(i = 0; i < G.vexnum; i++) { + // 指å‘该顶点的首个邻接点 + p = G.vertices[i].firstarc; + + // é历该顶点的所有邻接点,统计å„顶点的入度 + while(p != NULL) { + indegree[p->adjvex]++; + p = p->nextarc; + } + } +} diff --git a/CLion/ExerciseBook/07.34/TopologicalSorting.h b/CLion/ExerciseBook/07.34/TopologicalSorting.h new file mode 100644 index 0000000..ecdde03 --- /dev/null +++ b/CLion/ExerciseBook/07.34/TopologicalSorting.h @@ -0,0 +1,28 @@ +/*======================= + * AOV-网(有å‘图)çš„æ‹“æ‰‘æŽ’åº + * + * 包å«ç®—法: 7.12 + ========================*/ + +#ifndef TOPOLOGICALSORTING_H +#define TOPOLOGICALSORTING_H + +#include +#include "Status.h" //**â–²01 绪论**// +#include "SqStack.h" //**â–²03 栈和队列**// +#include "ALGraph.h" //**â–²07 图**// + +/* + * ████████ 算法7.12 ████████ + * + * 如果有å‘图G无回路,则输出它的一个拓扑åºåˆ—并返回OKï¼›å¦åˆ™ï¼Œè¿”回FALSE。 + * 拓扑åºåˆ—通常ä¸å”¯ä¸€ï¼Œä½†æ˜¯å¿…é¡»ä¿è¯æŸäº›å…³é”®èŠ‚ç‚¹çš„å…ˆåŽæ¬¡åºã€‚ + */ +Status TopologicalSort(ALGraph G, int topo[MAX_VERTEX_NUM]); + +/* + * 计算å„顶点的入度 + */ +static void FindInDegree(ALGraph G, int indegree[MAX_VERTEX_NUM]); + +#endif diff --git a/CLion/ExerciseBook/07.35/07.35.c b/CLion/ExerciseBook/07.35/07.35.c new file mode 100644 index 0000000..7eefb6c --- /dev/null +++ b/CLion/ExerciseBook/07.35/07.35.c @@ -0,0 +1,94 @@ +#include +#include "ALGraph.h" //**â–²07 图**// + +/* + * è¿”å›žæœ‰å‘æ— çŽ¯å›¾çš„æ ¹åœ¨é¡¶ç‚¹å‘é‡ä¸­çš„åºå·ï¼Œå¦‚æžœä¸å­˜åœ¨ï¼Œè¿”回-1。 + * + * 注:如果根结点存在,则æ„味ç€è¯¥æ ¹ç»“点的入度一定为0。 + *   因为如果根的入度ä¸ä¸º0,那么必定会形æˆçŽ¯ã€‚ + * ã€€ã€€å› æ­¤ï¼Œæœ¬é¢˜æœ¬è´¨ä¸Šå°±æ˜¯å¯»æ‰¾æœ‰å‘æ— çŽ¯å›¾ä¸­å…¥åº¦ä¸º0的那个顶点。 + */ +int Algo_7_35(ALGraph G); + + +int main(int argc, char* argv[]) { + ALGraph G; + + printf("████████ 创建并输出图...\n"); + { + char* path[4]; + + path[0] = "TestData_DG.txt"; + path[1] = ""; + path[2] = ""; + path[3] = ""; + + CreateGraph(&G, path); + PrintGraph(G); + printf("\n"); + } + + printf("████████ æŸ¥æ‰¾æœ‰å‘æ— çŽ¯å›¾çš„æ ¹...\n"); + { + int r = Algo_7_35(G); + + if(r == -1) { + printf("给定的有å‘图无环图ä¸å­˜åœ¨æ ¹\n"); + } else { + printf("è¯¥æœ‰å‘æ— çŽ¯å›¾çš„æ ¹ä¸ºï¼š%c\n", G.vertices[r].data); + } + + printf("\n"); + } + + return 0; +} + + +/* + * è¿”å›žæœ‰å‘æ— çŽ¯å›¾çš„æ ¹åœ¨é¡¶ç‚¹å‘é‡ä¸­çš„åºå·ï¼Œå¦‚æžœä¸å­˜åœ¨ï¼Œè¿”回-1 + * + * 注:如果根结点存在,则æ„味ç€è¯¥æ ¹ç»“点的入度一定为0。 + *   因为如果根的入度ä¸ä¸º0,那么必定会形æˆçŽ¯ã€‚ + * ã€€ã€€å› æ­¤ï¼Œæœ¬é¢˜æœ¬è´¨ä¸Šå°±æ˜¯å¯»æ‰¾æœ‰å‘æ— çŽ¯å›¾ä¸­å…¥åº¦ä¸º0的那个顶点。 + */ +int Algo_7_35(ALGraph G) { + int i, count, root; + int indegree[MAX_VERTEX_NUM]; + ArcNode* p; + + // åˆå§‹åŒ–所有顶点的入度为0 + for(i = 0; i < G.vexnum; i++) { + indegree[i] = 0; + } + + // é历所有顶点 + for(i = 0; i < G.vexnum; i++) { + // 指å‘该顶点的首个邻接点 + p = G.vertices[i].firstarc; + + // é历该顶点的所有邻接点,统计å„顶点的入度 + while(p != NULL) { + indegree[p->adjvex]++; + p = p->nextarc; + } + } + + // 统计入度为0çš„é¡¶ç‚¹æ•°é‡ + count = 0; + root = -1; + + for(i = 0; i < G.vexnum; i++) { + if(indegree[i] == 0) { + count++; + root = i; + } + } + + // æœ€å¤šåªæœ‰ä¸€ä¸ªæ ¹ + if(count==1) { + return root; + } else { + return -1; + } +} diff --git a/CLion/ExerciseBook/07.35/07.35.png b/CLion/ExerciseBook/07.35/07.35.png new file mode 100644 index 0000000000000000000000000000000000000000..48cbc3678a34120a9a0f38eb9ee95a63122673c9 GIT binary patch literal 17387 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 D5Pw{E literal 0 HcmV?d00001 diff --git a/CLion/ExerciseBook/07.35/ALGraph.c b/CLion/ExerciseBook/07.35/ALGraph.c new file mode 100644 index 0000000..1c9c854 --- /dev/null +++ b/CLion/ExerciseBook/07.35/ALGraph.c @@ -0,0 +1,325 @@ +/*================== + * 图的邻接表存储表示 + ===================*/ + +#include "ALGraph.h" + +// 录入数æ®çš„æºæ–‡ä»¶ï¼›fp为null时,说明需è¦ä»ŽæŽ§åˆ¶å°å½•å…¥ +static FILE* fp = NULL; + +/* + * IncInfo指示该图/网的边/弧上是å¦å­˜åœ¨é™„加信æ¯ã€‚ + * 如果其值ä¸ä¸º0,则表示无附加信æ¯ï¼Œå¦åˆ™ï¼Œè¡¨ç¤ºå­˜åœ¨é™„加信æ¯ã€‚ + */ +Boolean IncInfo = FALSE; + +// 访问标志数组,记录访问过的顶点 +static Boolean visited[MAX_VERTEX_NUM]; + +// 函数å˜é‡ +static Status (* VisitFunc)(VertexType e); + + +/* + * 创建 + * + *ã€å¤‡æ³¨ã€‘ + * + * æ•™æä¸­é»˜è®¤ä»ŽæŽ§åˆ¶å°è¯»å–æ•°æ®ã€‚ + * 这里为了方便测试,é¿å…æ¯æ¬¡è¿è¡Œéƒ½æ‰‹åŠ¨è¾“å…¥æ•°æ®ï¼Œ + * 因而å…许选择从预设的文件pathä¸­è¯»å–æµ‹è¯•æ•°æ®ã€‚ + * + * 如果需è¦ä»ŽæŽ§åˆ¶å°è¯»å–æ•°æ®ï¼Œåˆ™path为NULL,或path[kind]为""。 + * 如果需è¦ä»Žæ–‡ä»¶ä¸­è¯»å–æ•°æ®ï¼Œåˆ™éœ€è¦åœ¨path中填写文件åä¿¡æ¯ã€‚ + */ +Status CreateGraph(ALGraph* G, char* path[]) { + int readFromConsole; // 是å¦ä»ŽæŽ§åˆ¶å°è¯»å–æ•°æ® + int kind; + Status flag; + + // ★★★此处固定为有å‘图 + kind = 0; + + // 如果没有文件路径信æ¯ï¼Œåˆ™ä»ŽæŽ§åˆ¶å°è¯»å–输入 + readFromConsole = (path == NULL) || strcmp(path[kind], "") == 0; + + // 需è¦ä»Žæ–‡ä»¶è¯»å– + if(readFromConsole) { + (*G).kind = kind; // 记录图/网的类型 + } else { + // æ‰“å¼€æ–‡ä»¶ï¼Œå‡†å¤‡è¯»å–æµ‹è¯•æ•°æ® + fp = fopen(path[kind], "r"); + if(fp == NULL) { + return ERROR; + } + + // 录入图的类型 + ReadData(fp, "%d", &((*G).kind)); + } + + // éšæœºåˆ›å»ºæœ‰å‘图/网或无å‘图/ç½‘çš„ä¸€ç§ + switch((*G).kind) { + case DG: + flag = CreateDG(G); + break; + default: + flag = ERROR; + break; + } + + if(fp != NULL) { + fclose(fp); + fp = NULL; + } + + return flag; +} + +/* + * 构造有å‘图 + */ +static Status CreateDG(ALGraph* G) { + int i, k; + int vexnum, arcnum; + VertexType v1, v2; + InfoType* info = NULL; + + (*G).vexnum = (*G).arcnum = 0; + + if(fp == NULL) { + printf("请输入有å‘图的顶点数:"); + scanf("%d", &vexnum); + printf("请输入有å‘图的弧数:"); + scanf("%d", &arcnum); + printf("该有å‘图的弧上是å¦åŒ…å«å…¶ä»–附加信æ¯(0-ä¸åŒ…å«â”‚1-包å«):"); + scanf("%d", &IncInfo); + + // 录入顶点集 + printf("请录入 %d 个顶点,ä¸åŒé¡¶ç‚¹ä¹‹é—´ç”¨ç©ºæ ¼éš”开:", vexnum); + for(i = 0; i < vexnum; i++) { + // 跳过空白,寻找下一个"å¯è¯»"ç¬¦å· + skipBlank(stdin); + scanf("%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } else { + ReadData(fp, "%d", &vexnum); // 录入顶点数 + ReadData(fp, "%d", &arcnum); // 录入弧数 + ReadData(fp, "%d", &IncInfo); // 判断弧上是å¦åŒ…å«é™„åŠ ä¿¡æ¯ + + // 录入顶点集 + for(i = 0; i < vexnum; i++) { + // 跳过空白,寻找下一个"å¯è¯»"ç¬¦å· + skipBlank(fp); + ReadData(fp, "%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } + + // 仅在控制å°å½•å…¥ä¿¡æ¯æ—¶è¾“出此æç¤º + if(fp == NULL && arcnum != 0) { + printf("请为有å‘图便¬¡å½•å…¥ %d æ¡å¼§çš„ä¿¡æ¯ï¼Œé¡¶ç‚¹ä¹‹é—´ç”¨ç©ºæ ¼éš”开:\n", arcnum); + } + + // å½•å…¥å¼§çš„ä¿¡æ¯ + for(k = 0; k < arcnum; k++) { + if(fp == NULL) { + printf("第 %2d æ¡å¼§ï¼š", k + 1); + skipBlank(stdin); // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + scanf("%c", &v1); + skipBlank(stdin); // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + scanf("%c", &v2); + } else { + // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + skipBlank(fp); + ReadData(fp, "%c%c", &v1, &v2); + } + + // 如果需è¦å½•å…¥å¼§çš„å…¶ä»–é™„åŠ ä¿¡æ¯ + if(IncInfo) { + // 最åŽå½•å…¥é™„åŠ ä¿¡æ¯ + Input(*G, &info); + } + + // æ’入弧 + InsertArc(G, v1, v2, info); + } + + // ä»Žæ–‡ä»¶ä¸­è¯»å–æ•°æ®æ—¶ï¼Œæœ€åŽå…¶å®žåº”当判断一下是å¦è¯»åˆ°äº†è¶³å¤Ÿçš„ä¿¡æ¯ + return OK; +} + +/* + * 录入边/å¼§çš„ç›¸å…³é™„åŠ ä¿¡æ¯ + */ +static void Input(ALGraph G, InfoType** info) { + int weight; + + // 在"网"的情形下需è¦å½•å…¥æƒå€¼ä¿¡æ¯ + if(G.kind == DN || G.kind == UDN) { + *info = (InfoType*) malloc(sizeof(InfoType)); + + if(fp == NULL) { + scanf("%d", &weight); + } else { + ReadData(fp, "%d", &weight); + } + + (*info)->weight = weight; + } +} + +/* + * 查找 + * + * 返回顶点u在图/网中的ä½ç½® + */ +int LocateVex(ALGraph G, VertexType u) { + int i; + + for(i = 0; i < G.vexnum; i++) { + if(G.vertices[i].data == u) { + return i; + } + } + + return -1; +} + +/* + * 构造一个边/弧结点(ä»…é™å†…部使用) + */ +static ArcNode* newArcNodePtr(int adjvex, ArcNode* nextarc, InfoType* info) { + ArcNode* p = (ArcNode*) malloc(sizeof(ArcNode)); + if(!p) { + exit(OVERFLOW); + } + + p->adjvex = adjvex; + + p->nextarc = nextarc; + + p->info = info; + + return p; +} + +/* + * æ’入边/å¼§ + * + * 如果当å‰å›¾/网是无å‘的,则æ’入一æ¡å¼§éœ€è¦å¢žåŠ ä¸¤ä¸ªé¡¶ç‚¹å…³ç³»ï¼Œä½†å¼§çš„æ•°é‡åªå¢žä¸€ã€‚ + * 对于图/网æ¥è¯´ï¼Œå¯ä»¥åœ¨å¯å˜å‚数中列出边/弧的附加信æ¯ã€‚ + * + * æ³¨ï¼šæ­¤å¤„æŽ¥æ”¶çš„å‚æ•°ä¸ŽMGraph有些ä¸ä¸€æ ·ï¼šç½‘的附加信æ¯ä¸­åŒ…å«äº†å„æ¡è¾¹/å¼§çš„æƒå€¼ã€‚ + */ +Status InsertArc(ALGraph* G, VertexType v, VertexType w, ...) { + int tail, head, k, count; + ArcNode* r; + ArcNode* pre; + Boolean overlay = FALSE; // 是å¦ä¸ºè¦†ç›–添加 + InfoType* info = NULL; // è¾¹/å¼§çš„é™„åŠ ä¿¡æ¯ + va_list ap; + + tail = LocateVex(*G, v); // 获å–顶点v在顶点集中的ä½ç½® + if(tail == -1) { + return ERROR; // 指定的顶点ä¸å­˜åœ¨ + } + + head = LocateVex(*G, w); // 获å–顶点w在顶点集中的ä½ç½® + if(head == -1) { + return ERROR; // 指定的顶点ä¸å­˜åœ¨ + } + + // æ‹’ç»çޝ + if(tail == head) { + return ERROR; + } + + // 如果边/å¼§ä¸Šå­˜åœ¨é™„åŠ ä¿¡æ¯ + if(IncInfo) { + va_start(ap, w); // 在wåŽæŸ¥è¯¢é¦–个å¯å˜å‚æ•° + info = va_arg(ap, InfoType*); // 获å–é™„åŠ ä¿¡æ¯ + va_end(ap); + } + + /* 接下æ¥ï¼Œéœ€è¦æŸ¥æ‰¾åˆé€‚çš„æ’å…¥ä½ç½® */ + + for(count = 0; count < 2; count++) { + pre = NULL; + // 指å‘以tail为尾的首æ¡è¾¹/å¼§ + r = G->vertices[tail].firstarc; + while(r != NULL && r->adjvex < head) { + pre = r; + r = r->nextarc; + } + + // é‡åˆ°äº†ç›¸åŒä½ç½®çš„结点 + if(r != NULL && r->adjvex == head) { + r->info = info; // å¤ç”¨è¯¥ç»“点 + overlay = TRUE; // å‘生了覆盖 + } else { + if(pre == NULL) { + G->vertices[tail].firstarc = newArcNodePtr(head, r, info); + } else { + pre->nextarc = newArcNodePtr(head, r, info); + } + } + + // 如果当å‰å›¾/网是无å‘的,需è¦è€ƒè™‘对称性 + if((G->kind == UDG || G->kind == UDN) && tail != head) { + // 颠倒iå’Œj + k = tail; + tail = head; + head = k; + } else { + break; // 如果是有å‘的,å¯ä»¥ç»“æŸäº† + } + } + + // 在éžè¦†ç›–的情形下,æ‰è€ƒè™‘æ›´æ–°è¾¹/å¼§çš„æ•°é‡ + if(!overlay) { + (*G).arcnum++; // ä¸è®ºæœ‰å‘æ— å‘,边/å¼§æ•°åªå¢žä¸€ + } + + return OK; +} + +/* + * 以图形化形å¼è¾“出当å‰ç»“æž„ + */ +void PrintGraph(ALGraph G) { + int i; + ArcNode* p; + + if(G.vexnum == 0) { + printf("空图,无需打å°ï¼\n"); + return; + } + + printf("当å‰å›¾/ç½‘åŒ…å« %2d 个顶点, %2d æ¡è¾¹/å¼§...\n", G.vexnum, G.arcnum); + + for(i = 0; i < G.vexnum; i++) { + printf("%c ===> ", G.vertices[i].data); + + p = G.vertices[i].firstarc; + while(p != NULL) { + if(IncInfo == 0) { + printf("%c ", G.vertices[p->adjvex].data); + + // 对于网,会从其附加信æ¯ä¸­èŽ·å–到æƒå€¼ + } else { + printf("%c[%2d] ", G.vertices[p->adjvex].data, p->info->weight); + } + + p = p->nextarc; + + if(p != NULL) { + printf("- "); + } + } + + printf("\n"); + } +} diff --git a/CLion/ExerciseBook/07.35/ALGraph.h b/CLion/ExerciseBook/07.35/ALGraph.h new file mode 100644 index 0000000..ce5d0a0 --- /dev/null +++ b/CLion/ExerciseBook/07.35/ALGraph.h @@ -0,0 +1,128 @@ +/*================== + * 图的邻接表存储表示 + ===================*/ + +#ifndef ALGRAPH_H +#define ALGRAPH_H + +#include +#include // æä¾›memsetã€strcmp 原型 +#include // æä¾›å®va_listã€va_startã€va_argã€va_end +#include // æä¾›mallocã€reallocã€freeã€exit原型 +#include "Status.h" //**â–²01 绪论**// + +/* + * 注: + * + * 通常æ¥è®²ï¼Œæ— æƒå›¾è¢«ç®€ç§°ä¸ºã€å›¾ã€‘,有æƒå›¾è¢«ç®€ç§°ä¸ºã€ç½‘】。 + * æ— å‘图/网中的顶点关系被称为ã€è¾¹ã€‘,有å‘图/网中的顶点关系被称为ã€å¼§ã€‘,并区分弧头与弧尾。 + * 实际表述中,未必会严格éµå®ˆä»¥ä¸Šå‘½å。 + * + * 当å‰ç»“构适åˆå­˜å‚¨è¾¹/弧比较稀ç–的图/网。 + * + * ★ æ’入边/å¼§çš„ä¿¡æ¯æ—¶ï¼Œè¿™é‡Œçš„实现是按"å‡åº"æ’入的,这使得æ’入的弧是按"å‡åº"排列的。 + */ + + +/* å®å®šä¹‰ */ +#define MAX_VERTEX_NUM 26 // 最大顶点个数 + + +// 图的类型 +typedef enum { + DG, // 0-有å‘图 + DN, // 1-有å‘网(带æƒå€¼) + UDG, // 2-æ— å‘图 + UDN // 3-æ— å‘网(带æƒå€¼) +} GraphKind; + +// 顶点类型 +typedef char VertexType; + +// è¾¹/å¼§çš„ç›¸å…³é™„åŠ ä¿¡æ¯ +typedef struct { + /* + * 注: + * æ•™æä¸­ç»™å‡ºçš„结构åªè€ƒè™‘了无æƒå›¾ï¼Œè€Œæ²¡è€ƒè™‘有æƒå›¾(网)。 + * 这里为了把“网â€çš„æƒ…形也考虑进去,特在附加信æ¯ä¸­å¢žåŠ äº†"æƒé‡"属性。 + */ + int weight; +} InfoType; + +/* è¾¹/弧结点 */ +typedef struct ArcNode { + int adjvex; // 该弧所指å‘的顶点的ä½ç½® + struct ArcNode* nextarc; // 指å‘下一æ¡å¼§çš„æŒ‡é’ˆ + InfoType* info; // 弧的附加信æ¯ï¼Œé€šå¸¸å¿½ç•¥ +} ArcNode; + +// æ¯ä¸ªé“¾è¡¨çš„头结点 +typedef struct VNode { + VertexType data; // é¡¶ç‚¹ä¿¡æ¯ + ArcNode* firstarc; // 指å‘第一æ¡ä¾é™„该顶点的弧的指针 +} VNode; + +/* 图的邻接表存储表示类型定义 */ +typedef struct { + VNode vertices[MAX_VERTEX_NUM]; // 邻接表 + int vexnum, arcnum; // 图/网的顶点数和弧数 + GraphKind kind; // 图的类型标志 +} ALGraph; + + +// è¾¹/弧上是å¦å­˜åœ¨é™„åŠ ä¿¡æ¯ +extern Boolean IncInfo; + + +/* + * 创建 + * + *ã€å¤‡æ³¨ã€‘ + * + * æ•™æä¸­é»˜è®¤ä»ŽæŽ§åˆ¶å°è¯»å–æ•°æ®ã€‚ + * 这里为了方便测试,é¿å…æ¯æ¬¡è¿è¡Œéƒ½æ‰‹åŠ¨è¾“å…¥æ•°æ®ï¼Œ + * 因而å…许选择从预设的文件pathä¸­è¯»å–æµ‹è¯•æ•°æ®ã€‚ + * + * 如果需è¦ä»ŽæŽ§åˆ¶å°è¯»å–æ•°æ®ï¼Œåˆ™path为NULL,或path[kind]为""。 + * 如果需è¦ä»Žæ–‡ä»¶ä¸­è¯»å–æ•°æ®ï¼Œåˆ™éœ€è¦åœ¨path中填写文件åä¿¡æ¯ã€‚ + */ +Status CreateGraph(ALGraph* G, char* path[]); + +/* + * 构造有å‘图 + */ +static Status CreateDG(ALGraph* G); + +/* + * 录入边/å¼§çš„ç›¸å…³é™„åŠ ä¿¡æ¯ + */ +static void Input(ALGraph G, InfoType** info); + +/* + * 查找 + * + * 返回顶点u在图/网中的ä½ç½® + */ +int LocateVex(ALGraph G, VertexType u); + +/* + * 构造一个边/弧结点(ä»…é™å†…部使用) + */ +static ArcNode* newArcNodePtr(int adjvex, ArcNode* nextarc, InfoType* info); + +/* + * æ’入边/å¼§ + * + * 如果当å‰å›¾/网是无å‘的,则æ’入一æ¡å¼§éœ€è¦å¢žåŠ ä¸¤ä¸ªé¡¶ç‚¹å…³ç³»ï¼Œä½†å¼§çš„æ•°é‡åªå¢žä¸€ã€‚ + * 对于图/网æ¥è¯´ï¼Œå¯ä»¥åœ¨å¯å˜å‚数中列出边/弧的附加信æ¯ã€‚ + * + * æ³¨ï¼šæ­¤å¤„æŽ¥æ”¶çš„å‚æ•°ä¸ŽMGraph有些ä¸ä¸€æ ·ï¼šç½‘的附加信æ¯ä¸­åŒ…å«äº†å„æ¡è¾¹/å¼§çš„æƒå€¼ã€‚ + */ +Status InsertArc(ALGraph* G, VertexType v, VertexType w, ...); + +/* + * 以图形化形å¼è¾“出当å‰ç»“æž„ + */ +void PrintGraph(ALGraph G); + +#endif diff --git a/CLion/ExerciseBook/07.35/CMakeLists.txt b/CLion/ExerciseBook/07.35/CMakeLists.txt new file mode 100644 index 0000000..fe18c3f --- /dev/null +++ b/CLion/ExerciseBook/07.35/CMakeLists.txt @@ -0,0 +1,12 @@ +# 包å«å…¬å…±åº“ +include_directories(${CMAKE_SOURCE_DIR}/Status) + +# 生æˆå¯æ‰§è¡Œæ–‡ä»¶ +add_executable(07.35 ALGraph.h ALGraph.c 07.35.c) +# 链接公共库 +target_link_libraries(07.35 Scanf_lib) + +# è®°å½•è¦æ‹·è´åˆ°*.exeç›®å½•ä¸‹çš„èµ„æºæ–‡ä»¶ +file(GLOB TestData TestData*.txt) +# å°†èµ„æºæ–‡ä»¶æ‹·è´åˆ°*.exe目录下,ä¸ç„¶æ— æ³•加载 +file(COPY ${TestData} DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) diff --git a/CLion/ExerciseBook/07.35/TestData_DG.txt b/CLion/ExerciseBook/07.35/TestData_DG.txt new file mode 100644 index 0000000..7d191f3 --- /dev/null +++ b/CLion/ExerciseBook/07.35/TestData_DG.txt @@ -0,0 +1,6 @@ +图类型→0(有å‘图) +顶点数→12 +弧数→17 +弧是å¦å¸¦æœ‰å…¶ä»–ä¿¡æ¯â†’0 +顶点集→ã€A,B,C,D,E,F,G,H,I,J,K,L】 +弧的集åˆâ†’ã€F,J】ã€F,B】ã€F,C】ã€F,A】ã€B,C】ã€J,I】ã€C,I】ã€C,H】ã€I,H】ã€C,G】ã€D,A】ã€D,L】ã€L,A】ã€D,K】ã€K,E】ã€E,G】ã€F,D】 \ No newline at end of file diff --git a/CLion/ExerciseBook/07.36-07.37/07.36-07.37.c b/CLion/ExerciseBook/07.36-07.37/07.36-07.37.c new file mode 100644 index 0000000..64ca877 --- /dev/null +++ b/CLion/ExerciseBook/07.36-07.37/07.36-07.37.c @@ -0,0 +1,167 @@ +#include +#include "Status.h" //**â–²01 绪论**// +#include "ALGraph.h" //**â–²07 图**// +#include "TopologicalSorting.h" //**â–²07 图**// + +/* + * æ±‚æœ‰å‘æ— çޝ图å„顶点的最长路径。 + * + * å¯ä»¥å€ŸåŠ©å…¶æ‹“æ‰‘åºåˆ—,从åŽå‘å‰é历å„顶点æ¥è®¡ç®—最长路径, + * åŽŸç†æ˜¯å¯¹äºŽä»»ä¸€é¡¶ç‚¹å‡ºå‘的最长路径p1,其邻接点的最长路径p2也必定在最长路径p1上, + * å³ï¼šæŸé¡¶ç‚¹çš„æœ€é•¿è·¯å¾„ = max{邻接点的最长路径} + * + * 这里没有将MPL域直接写在ALGraph结构中,而是将其å•独作为一个数组å–声明,在核心算法上没有任何区别。 + */ +void Algo_7_36(ALGraph G, int MPL[MAX_VERTEX_NUM][MAX_VERTEX_NUM + 1]); + +/* + * 打å°å„顶点的最长路径 + */ +static void PrintPath_7_36(ALGraph G, int MPL[MAX_VERTEX_NUM][MAX_VERTEX_NUM + 1]); + +/* + * æ±‚å–æœ‰å‘无环图的最长路径 + */ +void Algo_7_37(ALGraph G, int mpl[MAX_VERTEX_NUM + 1]); + + +int main(int argc, char* argv[]) { + ALGraph G; + + printf("████████ 创建并输出图...\n"); + { + char* path[4]; + + path[0] = "TestData_DG.txt"; + path[1] = ""; + path[2] = ""; + path[3] = ""; + + CreateGraph(&G, path); + PrintGraph(G); + printf("\n"); + } + + printf("████████ 题7.36ï¼šæ±‚å–æœ‰å‘无环图å„顶点的最长路径...\n"); + { + int MPL[MAX_VERTEX_NUM][MAX_VERTEX_NUM + 1]; + + Algo_7_36(G, MPL); + PrintPath_7_36(G, MPL); + printf("\n"); + } + + printf("████████ 题7.37ï¼šæ±‚å–æœ‰å‘无环图中的最长路径...\n"); + { + int mpl[MAX_VERTEX_NUM + 1]; + int i; + + Algo_7_37(G, mpl); + for(i = 1; i <= mpl[0] + 1; i++) { + printf("%c ", G.vertices[mpl[i]].data); + } + printf("\n"); + } + + return 0; +} + + +/* + * æ±‚æœ‰å‘æ— çޝ图å„顶点的最长路径。 + * + * å¯ä»¥å€ŸåŠ©å…¶æ‹“æ‰‘åºåˆ—,从åŽå‘å‰é历å„顶点æ¥è®¡ç®—最长路径, + * åŽŸç†æ˜¯å¯¹äºŽä»»ä¸€é¡¶ç‚¹å‡ºå‘的最长路径p1,其邻接点的最长路径p2也必定在最长路径p1上, + * å³ï¼šæŸé¡¶ç‚¹çš„æœ€é•¿è·¯å¾„长度 = max{邻接点的最长路径长度} + 1 + * + * 这里没有将MPL域直接写在ALGraph结构中,而是将其å•独作为一个数组å–声明,在核心算法上没有任何区别。 + */ +void Algo_7_36(ALGraph G, int MPL[MAX_VERTEX_NUM][MAX_VERTEX_NUM + 1]) { + int i, j, v, w; + int max, k; + int topo[MAX_VERTEX_NUM]; + ArcNode* p; + + if(TopologicalSort(G, topo) == ERROR) { + printf("给定的有å‘图存在回路,无法获å–其拓扑åºåˆ—...\n"); + return; + } + + // 逆åºé历拓扑åºåˆ— + for(i = G.vexnum - 1; i >= 0; i--) { + v = topo[i]; + + MPL[v][0] = 0; // 0å·å•元存储路径长度 + MPL[v][1] = v; // 1å·å•元存储路径的起始顶点åºå· + + p = G.vertices[v].firstarc; + + // 对于没有邻接点的顶点,其最长路径长度为0,无需å†ç ”究下去 + if(p == NULL) { + continue; + } + + max = -1; // 邻接点中最大路径长度 + k = -1; // 记录拥有最大路径长度的邻接点的åºå· + + // é历邻接点 + while(p != NULL) { + w = p->adjvex; // 邻接点åºå· + + // 如果有多æ¡ç›¸åŒé•¿åº¦çš„路径,则åªå–首先å‘çŽ°çš„ä¸€æ¡ + if(MPL[w][0] > max) { + max = MPL[w][0]; + k = w; + } + + p = p->nextarc; + } + + // 顶点最长路径长度 = max{邻接点的最长路径长度} + 1 + MPL[v][0] = max + 1; + + // 将邻接点出å‘的最长路径å¤åˆ¶åˆ°å½“å‰é¡¶ç‚¹çš„æœ€é•¿è·¯å¾„上 + for(j = 1; j <= max + 1; j++) { + MPL[v][j + 1] = MPL[k][j]; + } + } +} + +/* + * 打å°å„顶点的最长路径 + */ +static void PrintPath_7_36(ALGraph G, int MPL[MAX_VERTEX_NUM][MAX_VERTEX_NUM + 1]) { + int i, j; + + for(i = 0; i < G.vexnum; i++) { + printf("从顶点 %c 出å‘的最长路径为:", G.vertices[i].data); + for(j = 1; j <= MPL[i][0] + 1; j++) { + printf("%c ", G.vertices[MPL[i][j]].data); + } + printf("\n"); + } +} + +/* + * æ±‚å–æœ‰å‘无环图的最长路径 + */ +void Algo_7_37(ALGraph G, int mpl[MAX_VERTEX_NUM + 1]) { + int MPL[MAX_VERTEX_NUM][MAX_VERTEX_NUM + 1]; + int i, max, k; + + // æ±‚å–æ‰€æœ‰é¡¶ç‚¹çš„æœ€é•¿è·¯å¾„ + Algo_7_36(G, MPL); + + max = -1; + + for(i = 0; i < G.vexnum; i++) { + if(MPL[i][0] > max) { + max = MPL[i][0]; + k = i; + } + } + + for(i = 0; i <= MPL[k][0] + 1; i++) { + mpl[i] = MPL[k][i]; + } +} diff --git a/CLion/ExerciseBook/07.36-07.37/07.36-07.37.png b/CLion/ExerciseBook/07.36-07.37/07.36-07.37.png new file mode 100644 index 0000000000000000000000000000000000000000..6bb19199dc12ec07185960e5914dd51744fe7485 GIT binary patch literal 16448 zcmYMbby$?$_dQH^3?VRd35Ya9cMk|iNlAlrtCTcDH%d65G=c~S2+}P*G$P$7A|(9nq0;mUewXc%N@Xy`V07@(!EfZ;Rv zh5l4eO%bhfgnk?Rf#sl}rGSQ3olJOXjSc?B_k^1~MMER$zWqV(^C-1LLzA0US5`3a zv)FBQ^PrfSI~~p3E)Ra$wtx0R4DbEjz%XmlXS5}=N~e@Kr}Ab3J**{%?tu}_w)d!L zR+p+f%uXV`AL)AB+%J#QL407iR%@Zsclbgoyk0F#+V}8X!8gXy8kz5=eg2j2B+gPH zig<@OA`yt*&Q66^3*Q{6lExaCvgnJ>8pHT6Cx+#BN$=W;2DCEfpz1wnduxts(JO1~ z=H2|c@b5U|;D_1Q#=g%UGB@LwY_52>f9i96RJ}fT(LK}d<1BT;nPmG!=yl+=#pn6- zefA#CL{+7kDyO+8;`7<3qwTwLOxv#YL6{?kTno`n{k~}edG;x{`aiLbllE&iEQ zOM3OW3i-GxxXw5b(W3k|5<<%SFw#_-YvH=}LhrCV702PlIG2*SMlrGEV`Cj*xcuKM z*}0%0)5B7#xZSA`g!d=Y=HJf{3AiIs$CUo>)#`Lyo9odXlmgivs@aDk6~aCJ{2b?( z3m1*J-|@c)Ij60Vuc+sJsL{`r!kV=;SZ=R!$YhD*P`f)F5Ty3@6;>otA#if%glK)< zQc9%Q6sI;(uT7_c|DjgDdeb6b4zDp^`M2on`IEIpjZIE}XL3AeoI|ztWwkMC4F(^# z+RHrCAZ|kD4GOpe3r)x|GOl~rCPp`FZUjRl;=J2y?^pfXdncYgPwC@r>6F3vcWXG9 zE7e=im($PV5rHmwdb4xyrS-V2xuTG+G?L#}$TPkDk4)-H&(*n3uMg@fEjKmaTj>bL z80qxEb_r;Gi*cf!fN6o-*jckL4$sflyU-O+MDZk?hanYO!X=}SB~z`Q#AUtL*KIt> zMOg~eKlH!Ibcskl7AS@GP_$Z*ZeL!m$y#fQ;K}PJ;g}yLjwOyz5rL0VuKVj+8)#Yf z{OF_E9;*~mU%Oau_Pw+LJ=-%Sv{xvLA7>Xe25ZEiCn6cj(;j$oxFGQ*>8mz_XfGqB zyBIC83Ag&)sOn#CLT6j!-`~GunE!*)S4*nzbd}l5-X?X%c|Eea%EBsC+?H533yYA! zaYD21Z0OIM*#WEP%l+POACQLyx?2Hy?K;B!&*paP-IjHJW^-N?F)fL#k47w-?WOT# zvA@zNuKDz-$Z5`LvqQLF4ftU}kQfqCtev4>ex38P8D5+@UW7pL6Af*w&8JZL+tb-44g;>8a*X zliqUg{MLA8ZqWOV+@MSEKU3&06DFA^(O~PJOz})BGS-dbj1sC%MAkoFeUGZ>%f zvxhvitEFCIYBPMlAnn?Gnnjny@z(vbl=~!!G^s=O*@%5tJvV8-#eYM2sGRS)eAaKr zT>BxNWIy_)JJrXs3ITUFI<(t0Ry%7pw5<2u>_?OVM`kmO5997VmUCJ?xl^^OGAARu z)E?m}qBZ!ns9jK8?=@SCl_@x(JusC9ew)z9_-d`FDYC6P9c;3qQ2ds%jn(697v zO=~PHv~PF?z=N2h*#@|Ry+J)smdbGcYl>)Xl^HU9-ItT$`$8(?d4v~}m(%BE@sYD5 z&w8=lkoi+B6QV)Lf6;OSWS#o>&jLqD0nSwcqS-rr%$%a^@(7+F@MxmTJd2OIL-{wUqaLan4~N^}3T;E;dP%z8|Xl7xf=QnleNaZU%r z9G%*c%BcGd#mpt7NJ>7)y@Q|$soZKup z$5QQ^GukMDW5rcj+|~gBJm$DBtZU@kZVw*(3AAWI7+OqLy1x2)xo3S;a#dSt$(zpD zJQAgsa{uWi56u*jP)0y2-~ByKqHgiUK{gzEuIPxtG6SP8%)I=xPv+aKP0D{Ivvxm| zWa#rM$|cqh zvnH#tbBGngKVpuY=6OE$qn1WJuSfkR?YCKV{j&BK(K_UrrdP(!1Q`XJ0uPBQsoa@% zJ_))09%8p>ZW@m0&+Lo%n{Y-FHF`e?za^RmpFpXbsN?Va7f~lNGII} zOV1W0PiQAc7Rj|&wAev{pHn3>T(Q0rHpe!V@F@ZdqY)cJas&GNo+6d@=Xr*=>Cqu6 zCw#8EBn5XVIhj&ob%ZAf3mOAulkwu6up}Nss^kSme4cZ{Y|Y+kMdjNUkzsjFJ3pHI zWM6wPmv!UUN4JY%2dk&j3&8qR*kIXCK%<#GE?+E0v7Wj~gRdd;k!n--;lY58u%7bg zc@=rwk$Q?y2(?|)-X61V==!QYFd5$6S>WEIV-}%Rpai3HOp1OOg-i`xP+3fP3x5Wo za4vlPTlHNtPq>b7+VHl@B0?D*!C&vD=9BN(BeyiGh=OyhQ$433$1aeo78!IJyKP~9 zN&TF{yT0d12Y3ftzCAku-%k!QP77kM!f`H2g5T&+c@!KEUffukt(;>)B!;!&*MK3y zcFJtGUf@n1v{D-5WFywmd+3SntlF{)ny6E7`(PhpyL^nt!;oY~4W-#VF{Z;FMcgG7 z!a|r+3FnhIfzXSWTODHhBF zDWv3T$iD6}s4gPDN&UmNPjgJqONO0Sx7PzVQxU$i>L>ZGA>h&1qIZ4ENgZy()TAP8 zik`Y+>S)_e>XQM|J+m4NJSm}z%wzw@1+w*_e^k{W*8GJla^`8{gUGHR zK0$T%ZF;EospE}PDbzt7gX%e{d-O-=d9kHWAwDWL;aC12FA8*3slq?8&Ds_@v7v-@ z^hJP6;&f@%rOgJC+6*a5TwMawvd7ErGopF)zbZ6vJZ;aPB8{4g9Vnxb)s7G|PT){m zGqve5W2CF;?=P-HbTd2K13Lh+MDzt5iwKV8>;Q@v+d?ly!0 z{~(WsXfct6%Q(@HzOx^GgW&x+@_oP6+3=NWh!42FUirHBq;?YF-G8&bv=0Bt_n2=g zK_a~A)kl@ZlfNSYhm{ix(Kh>}mOFnRjdUiGwOWkAv@B{S**(OTtxKUttp4#$Zj>#I`<2e)4^`AUOMSo;;yIV%6@<6dJOE=t{;~80J6s61I~aZaxHz43#^>=vhVMx{Y0BxQ6^7jD8<;{-om+VI zfho+T(EQX;l|>49;c8t|edM{nvFHny!`eHxTJI*Sc^=3zQz*EEGV96038oStaPaa0 z7Hr-?ga}`IBf7`l+^Qemo0B<86QoCApgDfMwW}q z+QK@m%`E)W_l;jt4;;g>Xe-}F6_2o_wJ;?j$#U#?ex7#aIh;mKG$ac@5>DE!Ewr5K z?w!rWZEjq+Ya$R!KJZpiQjR<$M^`vJrC#c}7;PeM`0M)U}NCrLFOhK3*Gmi zBH9NJ9@JQoL&;}F+6B^JU@;x^DJbqwCGKOh(2E6FmKoG@V;4VRa^MtMFAuXn?-#a0 z`beOpid0iREwb7$va3ETgIXxOK!Pdj{eAEiP!661Igk`}!IycfzGIn^mU=9-B9VfTMSMSHiEFsZ$T<}(A~QvYCuZ_v0Y&jOKv-^fN~iHvWFI=qNQsTV^syk@*IR92!EsF$2RcC71<|n z%*HoGE38CR#qtwAzue09Kp5aHIQ6`E@uI}v+-bINwzTaY(@{zAe%sWEOMw|WUs%>x zvoeEkBnaE0^waat7)WuQ~XqcYJm}ndAcD?9DjK~KnVma!Nj611rp$FSd zVUVz)?)>o5ygeS%diZ}v`6`mJ+(}wz?toG&Dr&1Py`P*(QMI}l3&}=VWYI3MVk1_z zn?{}tdoi5(nal3 zCx7@fkI4n{i+Zwz$AzA&%Q8R3sU(biOUtejXW)WEtAm&xcsxa%7xFIpzI~D5{M#L$ zA8;Y&2f@*)p1TJk6#it?qy=%QCLFJss_94{mf6dHBMT~&N!%8g!r~w@8paETbsOJi zyG}dZH5G$}8c!ZjZBeB1uwJow@Ze&i^I)d*_7S?-QlaShJ~JuLc{{G1%j; zaT8yoZ9tYShDwLZi5`=Cp*dUCd~ZQvUfMv+uiYIm78sowGRwraClWSzf1XO22}(sU zzHgaW8+8N+6l8i4H2lug)YEYs3R-&jXX228A z_U0^*(=1?035%Gh_@OXOUfki5+5qOX^jdijc{wyj@NkDt&~mEv96Sh8|E6HK^50|Y z^{kaw^*8hZwkG9-blx5OvBN}iY?* zj6qBpXDd^SoN(qaE*B2p2vbC^#-Vkzr;;k*dpE}Ks5q4C`Hgek%$4E4Ff{KIb}Scu zttlI_KYS6R98J{2hT`RDlhv>6C*Q0S8W<;nJw7y_N*txHTaB|?;bv|vH{b>r>yYW4 zCjnL|>}h$7`C2KY10fOTI z<2q>Nz%a)Hc&MJU8E$&2V1#b4@h9j?N}(sc=zF7Qw-yqNf^ez#uf%TOY zG;P1FOrZ&6SR8?G@~;AS5~CvGjnsw(IP1E1MIl8_nodlYpP#Y_=5wK%fA8`3Jn`DL zttJwXe6zyNGZH8*?TtjoS2;+Mgo1#NzLFWk@7|ov2EDEY4o%sBD7&(DG)87NTt5xqc+i zB5tM-7&iBqi!zUXP)J_+FRM~|@^?}V#96Pey})6Av+q8iSpzc`ro8k9;Zu$V`#ixn ztuiWjQO;4GvIOcdSxwp8QTy62HmTir*wISKQgA0><~L>2&IKB{c$jBrXP6rVDV33t zIU65BJ(x@HRNj^U#%r04ljEFmNXmo^lg=}k6F}WLBzu0vt$CTud6-tEjLsy<8s9{g zs=&^C=UgC#_zw?@0+}s-z1z)M$c@;g##CyV%m`lgN-$W`-NsZNfrJ3y&qlJ(ls95xoUL2 z{nq;pX}loFZDF%1-l+Qrh3mHR!Y!Ao2rRVJ$!#mh>f1nnw4{4fO!;js&hGafIpu%= zx%rWQsgu!dM4N$rVAo?!6r_i-(dk9M{V12_Z7AVc=*x~rD*|zZiLicrkl*q>B>vmy zjAO$zc}b!YU=VNJ{rEt&B}g2q2EoczT?;gHmytH}s=r5~j=6`R!uBo2ypiYi`6xWdRdttd!#+-wnm97m43 zw+m{mpY1)^eAY(f(WmaoT}suK@LV;%iG>tw2|}FliEVbJl%Y+Xa+f-{Aya%v3h{i^ z8>Dq$d=12#`=|~cAdmUD%wWX`S(2X^3G7oE9X|1VFmLgQ+$56>IqulP|6+y(t z(+Py_p2{&Zu_)rTN-xY8p3|K(11oeW^!cyorIY}!NVVduRq=b zGg|}>n#CENpSjxEZpUrb)l)_V;8hC6qt^cDa2Si!arwHq8olQ2|qFFMMd3j;fr{Hkk}fZPSA z71x4#4_kD;jV!fQcEF}%vscAvf%#d)PLoWop754fnxHGXst7oB$k8Tt%=RX7RE474 z{tM`e(9TYi}zA6W)j;uZsu-Z|<4a?-o>d95iM{8H42{M)N%=c=%g9{K;=P0Qf&kxY+ zs6~fKq9@L{VBT#YNEV$}N|Tj-OXCV(-S!)sZ62p%u{}&BleVj4?0Q6US!IBzJ{>YDFb#S?-{xk<{m^FcqdlJ4 z=E0=O@jWWt;ad9+9TwJP3_Y*~>$t%4?)HB-@%wF$UeE1-T{{C03s6 z!R;X*pc!>PZQD;~VVKzY;*=Wju9Uhz6x~X+v%j$S$LpqMODXtoq+$jhyk00;))RYT|5U3T3B z1H!NyhA8kCB3WnvQP<_Zt%zv2o|5=HW+B`89mVA@+q=HLrct8gdM;B@0`AhrPG)udcy;S9O_I6=Q$$5_ zPg`B01(qnHiZc9{CyAn@EoQ0$W-(u}?OSIyCUuj5P)8tb~DnY1V7Noy}ics9QWjL1cHIUX8PZ*>3YY zY!Cjs&1ol=BdQIrni1CO?j!M-{IyyrwH$Io>hF^V_EEdzv@Vh5CbEo9(od)0y?iC!0K z-|;1%Nr%i4pRwMQ*MQw0!lI6w`ua(QY&jL?sH8%PjmdrYOv?A^l{*VgaUFM8Xu>E= z#Mu`n>OGQnsAwyo;ebJ$tUQ12qRYM%^LdCO5tpfaa$8=QzAvoLK?n+mH=4PNW}6Kt zkUwl}Dcdm$`UQ~`z_Oz&7BO!xaqW&cCwh*16633;E#XPjfSc3fF?Iv+vq>5M2Oa82 z^s$olD{;cOTuIMpOwTMX?;KSv9PMO}c;kDyqjXW#pFUyX-%Hmx33xLd%1&N%18yI# zzS^IEr&>LHA3vOlCwWg}qkcESSE0=v$>FT^Q4*epzJRHXVHDP_Y3_G6e|=OjsHD|w z#Qe5MExXA#*p>XrG?lO7d8`OdLyU>MBe;juS|8#dvzc68_X z5G9tIPy{ozf@*jR7P%1LFIINdyd^MQx)nOp@n4=_QVe&Kwa#L85wFAPy_!8&v^}{S zzIJ>`!cDu`DfFIB!X&B?!`cNfC3H!afQdYM@E^UArKPvlH1NUM_y_hZ1IYYP z$MSCfR`x}M@<&ODFHPX7_FN4Sinl#g0E)I{&PDmn`T<6Y1xlQl9dQ((uHguyg^M2; z$#V42O(j%&TJWojMn^~Yi>@ruFR?A<+xta=UaVo5Y>eTY!sNF^Bi8M6Hld~+&-3Z& z2iO3vj==nWlGcE!CZbiV!zJLsL6K)aj6Je*S5PG(v0Hc3R#96KWsC)!u)#{R7v~nT zKdnid)Da%Rf#ZP(xhCB|i)bn3u`y8yg(AuD#j7%vA?Fs2W?SFHp;1UOmD>hfKepdi zer!R>XwIrcD=ik@Tg*Euzq%6Naq69v=pk&*5lvWZ|aF-*+_^*WQvWBSsyf6V@MczvBuJ;OMzJ_Bs~a2)uLPu1p(4| zz~_hDarF$Y3`a6eC2U~g|p(a3gc%jq4+d}wuOLE@+4{rC^Kk~ztj&hOx+&ORDq;FrYA(!hvOSSDNCn;gyGKHbO~t3(-p<|Sj-jI z>7T+{%{98F5sF+(#WXn}HtMM{TyfQuQbZtAeK>}9%+1Zy;{?(0%gHKbxP3-#Yc53Bp1&GY=is{6oeqWtMSKaYNx_XKhF~B{kb4c$3 z0fq$n&vvOQBj+!WMzaxyjM5q3vAvsd7w$(>%>bL$JZi4prQoz4cZ9*TvM052QifP% zPUw(C^YOjynoo;ob_Rsg@&LExsMB1elVc+w`5PR4XG%8}dcs$8`-_<+PRxi`#cARZ z(rm}s;w%#KvQ4^!_uo=<1kZ=K(=6BII;#Ti64ozTq)ZehjhWcBJAZ1pnXku!IS(`- z{YK*D+=9<=#Jt`cmggU1-yt~j1^I?7#kUpL|EGIMC^6%EkZ){S<3`sQS?ZM78xO87 zjYm1-*V5lq(E8JDV$q$^Z^FEXX$Sxmly67V4T62Zu*#cS-M+aPyy0=&F(#7Q>Y$EQ_l-JO#Q2=T=%$nz>{>H2<%z9SU ziP)={Czd@jptW-6@6=scf*3}Co%2L2y#!hZ8qj%AI-oczQN}89Xj;eMY z?XgD1Jx20^&e=TmVHZq!6!Y6G-vv$}FVW?8>t|K3aZGNCrKm~Kj~4 zDoBsJiq8E0{K}NNsZ}oU&5*gxai)RilcCKTC!~!ly_1?~wmGe9EC&fh9{x2xX^k$Q z4u(I%5zqb>u*nZ83C=8GgBlgt(I#IBKHpIng%I`Q^w_$&X=x5);%RIQG0DxHqRKAD z5H=?fK7VYpsud96eDc z42L6OF^{7kL!*e=AnCK&@jsjTxCwO?gWVd%tg@tsctC960HLuk`Z>>jv047``T0U0 zf6$cmH?T~ag0+BbV$iBb@ul}6el@9m`Ls9vgTuJP`oN8VInE=-5+cJW{`h2NY2ebN z6O5LW;B)$4(SZ@twKo2CnyFR(q*q4oph!{^0d=mJy-01YU;FzPw8P?m^?vj?sI?Ql z{qy9{kIStC^p}ZBwCJ~*3WM@#aD8Y5Wm^?+FjWjNan z*LfV!s{Jk^5aT!62lS>&!r2C|^?eJ6#~)&q4cVa~#Q8y&m-kQl4@;af8)qx{!6K9d zRI&C|tln%dvUH$eY0z}H>P1|w$;9wt^G%VxGW1q@k-Qh)-jww)t7-|;a2>YJRwlD3 zCPH83SL=F;ad!V0`&P*@N^>6L&(pW{?nRvWuv72o%IoaMfh>I;LC(EER0LT4e*%k? z?N9S=RZHTwRa2i+IiyOWY6)^* zKK>sKlvR{$QT5I#6Nq8#+IdK;wvW=s+Z$$RfkK7rfXr5}Hz2fk) zu6(>ln!RouEat=sgcGsOC$si{+VnQJtj%&1aGvrhHv1ol128@Q*K0bPzd$1;4Z_-I zS3jlq#>8BIWwBa?ge(g@`y!?&_MfomeuR1ooyHf!nFeGs-Wak_%V>ektgsdvY>*aj zPtQCjqpeJ5fju_9BOlSF#rwBnjR=h=F6F=BWx@G0rno&pgI9BK+(+@ZJNrLc zjU@Zlg6gEJsG9qV;18Hzi9y$_n?S@9qYQ=qQ2*htO3!TO%Ui09{v8|{Phw@(pP7Gl zYt}21SJ9dLd)4MtiIBSE{Xdl!#|8zsZlex&nOaNM1a5i2(fQC(Ak<1IF|8m#i6=TC zXR3Cru|rF{&5Tr{6dW;D!eR{Em)nRP2=A&YL{(d~JTALrk7o%3%WeEPK;|A9=Qxa* zp9SsH?*8p5I6aXG&VXHUstDP&y%@eXt})(?fq>kZI(<}IaGuN`Q9FC;+}g$#&#sUU zEIeyojHl)wjJv?^7Ff`dzqksnKJTx=IMrA1cy`6zCxAzjIR!%A>MfFxqdzZV1OQoM zKtB-gHY2*?+HbDxWk*#C-M}g}D%QgvKveE%EQs;Y@QE)8WPtNXn!67yFe4PNfz=OU z&PoXNB&;}>7@Sp`LzqD3Q)vnA$6Z~C6<46r08t>f+t_SZI8q@=!HtKK0Bo5in_KuOd6=mk=xpDo$gvxG zW-LQ^TiwtMl-qpLR148JL&-a40Y7XQerIOZ^#UiS0%+@UUL&wY*jnW=$G(0)@;Bh^ z^U}HVu+IiAuDtt(nTF5rMXSZFh{~fq{cM{ONRN12>Wt042YcGF13`@$pJk)BO2BaF zK>VkCEKdMw#9FDeS%>bp?)p4t)KH8>rb;RgxzGEEW=C4diz;Ux!ZnJ?ljwcX-bR08 z7Ez#LE&m1avtU%~_XAYRirlpGoxKf7y=voE{4Zk^P;kQjE0;RjpLTqiN|DDjku1pU zJTA2Fl<8*Zjf59i{dOy+aQ>7pO+o4Xyekqh_TrZilTs)?ZaQRIk14c>7c(*P2wW%h|~i9!yg_#6Q(Y#m~{^kLoO! zmt`K0K&H~`Od?VC`8x8>9`mBCSJ=lS`E!LI%=kDrZN~147{#(y+nWU_tljDw=ouM- zdZ^E*?#}ZB@G_Y>bnr2{^$-9p` z*HOJ5FLczJ1gP6My}Up#s*Lkq^tOsko_!Bdk7K$9_B5%MPqnexr4L?2W%PUMY{LCFM{Kc*0L$wWYK4mcLby(JJ%dl`)JxcRIIg1F*eH%k5DDN$4e*z@&`nw-EID=zo^K?dVVz?JK|?+>ae z3}kixAvw8=asUW&Hf+-XsjaKvy1l9$f@~@7v-!5X{F#T4DfW$a51V^{LasXZRDv+h z>lYw>(b9L_CQCKH)Hyn|ChA_{#f|aJvM54#?wwt6-_Cb3Ei;&#pMS}(jOIuqdnb+Y zPgaVPKr5VdDj_obBg3JTshyyajB_pN;UTl_m;ekN$Z1MCk69n-2ybb(FMAO0Ile;K z^A0IqGIqXZKZn~GJ=HGYT(S;GRRnZD#x#Dak!)_XL7s%gw+zN$vImtAPE|Xu$R6wx z>TLv)ObG8=s(QoY0A=gHlUN6bFs*VDcVD(#Ry$fv{@XyB9_UR?mxLE4y7@0IE=rtO ziEZjQ+vIJ~IUNF0K~yaqmSOa3mtb)7cY~G)E4H%YaAD$<9WT(eNc8ijSS#0Nrt{!9 zt3nodWyXGgb*`gHq+^4Iw|Ft~9ukrh`f1P4^MACw@NI(4N95hiPW}kyNa5XJ>i`AHQfMJ`X#$hXQ1g4f z;!=;a=~w?XYVaKUR00LK-Ho{Kz-mm7>yHoOV;~aA8Cap)*ic-N^(^goYft7Q0VosGfsg=b+H;>W-ZSS(Y_-kYw5wcDuf8U6x}L7p(ITb zC4Y>F6Kp9~6AJf&=VhtId$8xS_6Te8$EZydKugI_0vPI8sU8QMM;sfI*W7*^e`l*8Qnj?W9=m+GHE3V?? zg1D1}AwacTi$--OKk!wqso=@UM$BvRPW+o56#S7&V= zknRimDa(HVf~u4-KoH!w3<+0|2BK#+Q)%$NZEdriFK?UcvF@f@{VEjVSR!VQ(`+OE1F%E z^7s;p>V}RNb)HVVp<38^fGDk_uJ6q zLmj`weNo%_(hS)8J7OnK{G_zQ^<%*)z(bIm^c-SP=DKi z0c*;zRS+ot#>Sj)|IDh2F*x&f~*nI>^v(_YluuafHoIr^~Sc&;-wOYK0hdY0# zvrfB@FM=+G!uq&5>4H6Ta%2pg{uisFch!KoqwB5ViA`xd%(MsTLM`c_)<*@o;V2#+ zLy(CAU~Y2<;V5;&6#qr7Mj*}1^n!7Che8Vx`s!s-H>(t@2$wf8e z`}5%|;Hmv&g4k}Z+eHab_!FA9i&}rTomQ^{^uL?4c*rSTdBX^dC<34 zbpJW$DWW9sfj;7H^TXROwx1*#sd^{?P8%luePDEV4qQIYoYgDF!k1VI@9ob|JSY)s z%Clq&<3wRPB$HREWy!l(tj6nANH}1hMF31->J5)OO`mPbyB70 zWTl{HhfciE)~zr+G-_OU=~~}*ukwWD>647Zg!bN!8x5%vlb$|dvpNX>pX@!MZ2Ok^ zc|p`2UA|bhC~LSFZGkb*S}_o2C0`AKA#j*J@owaiC1=Th`T>f*rS(QYZiHdhUq8+i z4`*nd>As~k;K{_D-UZz71w$lPZRYF!rk4lDCWG_^M)fJgG+aPJ@ah5l z2fd4G-QVG(3WTYTTK>IY0MsY(`Re{5cq%m6()Rf?Cn1Md9sq0Ar=Pc4 zRK;guuCZV#O@6YL>q~X9UjFD(^dG{qCg~|8mn4FD{`e{76stIz?46KFw+LF!xn8^& zg+?<~o7BjqB%uB2?vbjqYGccv52gl}{LkXoPicZB z_rf0sdhn%j&+Upn!;ny}GiCT(-tL5C`@ENRh7v{)yT{C?sgMid7TF(ML)Ybz$;mSB zvXAlOxA|W(rrZS@ZFr>HJh(_@rJ_s4~*X0@}*8RUcM(& z)}c$67-daU;cHw{-gr2H!04dO}C@25F<#uKJUM< z`uyY56FL(j373V~S~&lfS7D~a=7*R8&B>VY1Z8qdZAYA}=!bG#3r;YLeheEzQ=d=! zgGSloq8fhy97-iW^2)x}Y5w$}XI4U&TZZIJb`U>i0G^;Dg4ywIJmX$4^xNLjg~jBx zXmX0%VO|hF~G@+ALURsdbx+gCZ*HfuanHeJAx z@%=M0zG24KK%i{;b@_3Hxxa2hYe z2pf9iVsy|ud6uj2oHuhwC#hi+PuUnbx~w$0|3E)vJ|xMq7mz?L!lbXoR<(18u>;vB zm7i1xE|ffhq&UrO>N(j~uJa)h?9%M<{_%;dHA`F-S`g9}1g0kq$=enc+V|z_;xWJ1 zmY%WpM8FD8L1K;nAdn0mXW1)|(dfUh_Ik2s7NUSx>|_K9cYVZ|ls$2ke?z4Q*m0@M zX1uC(%6s01nlnV`bG~-RV-cO#E}3Nf%~8>Q`$A*xpHn@V*WzD%K+HX^nn{&e zQIijny&7UpIX)Rm`PfnXdZ%aBvy<}!NKJWGgd@J~@T(2l^8;7f+vB?8E1tV7aE%-?m`l?1-hkaDTC@P z5^sSN_5*a^HJ-C|wv7)lpX~8^nAHH4!K@}3dvV)MnFxk?d~xMmN3bbh&XUWj9!=qZ zAIp3=MubkAYE$heJ?MKqCVW5H*#~!e)(v4LyP3SoYUQ7Mg{;WrUwVi#dCa_yc&j zdW}6EWWzhf7X7w|6Z0P=x_G~!Q9$c0w*$svLY^C@)S-|x=EXT;SpMkNW8xzCt;bmm zm(L*haO_~!+r~#l+QL|PDbLN-y8GOHEkWtS4@8#ukPIunI?KIjB2Ziz6Gb`*5QGhV zJ0dU`Lp9-HE)dx{H^#H+B0fgcgs1ozynKX-qkAx+6#?~SrmOv@30i-f< zFB@bGfB<$9c8hwkcNVtJ&xd^jhyR*ueBT>!7bFLmY{ftYlz1no(0mo63!_amb(^pE zXpsx7;0oghm}@hD8M$RLiunkN)W8-1OO^#xo+V%(He_9}12D;VZ$b5O6`s5msPF>( z!4vBvJFw4$ZdV}!D+;-qZs;=O#Z$bPJ1#mz`hNOdO{fGj$A~ks7x=ydEL_5(5nr=no2FdTX#z7rIL&w|j5LJGbKZudamr?8(Ku^D60Y9=?V-P6u_ zPJg?9Sn`!nS=tr#t)RYO?k~jcKYFAqyzACHwmd4UYjrih(h^k189Dt>f)&w5<>O}e z_uT$hMG=*y_+M42>7Uz}_?Iuqo!jxCA{DVEC~5rd?xE(irX;o@cv~m10lQro-iA8D z9RF!5Cfbs#QH7(ULDIf^>wi!bq@e6^!`c>AV+ame9zV*3+wNPSdzgH1>kqEP3mU01 zC{Ws8-z-q8aVEXC8-4%9+h3n5FwLhKb?Xlo@K(9(Q?>bv53oI3SGX{UnDKf6Il3I(2mU#q@$6?U~?~bFYzFU%1zvqn3nK9GK?Y7;Fzv#0`bF z8(NVSTf~+eXk`39A3a1K4qQ6-GPQ0kU;E6y5tsU%#DIW!*8_X`PDW#|?gLl#MY?CK zqCOTE-@Tnjz%cZ(V{Afm8Ln!0n%>Ex@_*YwIN`5&vLK4A_`q;juP~0}Y6wlBpL7I7 zvEa4|{ks;i94P4oL$Z6^a!(O2mUb#Z9m_Ho{phu`rg5$U9t&9*QV?Hmr^BJHY^MXC zWn(zsUXvyKLW@kX-$Vh-jon$@T|~+kFu{sF`?n9oBfwfPUU-)bQKUi>v6U2TViIRT z4Bv5%;sk|G);}DV)2Tv0b#wXjT>2M?BK#A8m#}%I=6s94{Qt`j4R|6wMZ}aBWXZqu zXzr>52<=zQ?kU1s^6bwG4d?53=>Xb)A7f?cHWPWFQQY^t2mv9dD229xQq8QALy+wj zU@`74E&*i@*h!%J8$!-h3RM6)eXu9B+P}YI?$TUXZsz~&lB{(E;0>ob)88myMX3~88=g~WT0z_Udt!oIi1b@T*X~IH+x4hj z+t(A9;t8Cmgo<#CJbMJb5b2mB?B_|-dHeGI&fvHlCMY#9vV9kA|kM MqODx1Xchkd0f5#y;s5{u literal 0 HcmV?d00001 diff --git a/CLion/ExerciseBook/07.36-07.37/ALGraph.c b/CLion/ExerciseBook/07.36-07.37/ALGraph.c new file mode 100644 index 0000000..1c9c854 --- /dev/null +++ b/CLion/ExerciseBook/07.36-07.37/ALGraph.c @@ -0,0 +1,325 @@ +/*================== + * 图的邻接表存储表示 + ===================*/ + +#include "ALGraph.h" + +// 录入数æ®çš„æºæ–‡ä»¶ï¼›fp为null时,说明需è¦ä»ŽæŽ§åˆ¶å°å½•å…¥ +static FILE* fp = NULL; + +/* + * IncInfo指示该图/网的边/弧上是å¦å­˜åœ¨é™„加信æ¯ã€‚ + * 如果其值ä¸ä¸º0,则表示无附加信æ¯ï¼Œå¦åˆ™ï¼Œè¡¨ç¤ºå­˜åœ¨é™„加信æ¯ã€‚ + */ +Boolean IncInfo = FALSE; + +// 访问标志数组,记录访问过的顶点 +static Boolean visited[MAX_VERTEX_NUM]; + +// 函数å˜é‡ +static Status (* VisitFunc)(VertexType e); + + +/* + * 创建 + * + *ã€å¤‡æ³¨ã€‘ + * + * æ•™æä¸­é»˜è®¤ä»ŽæŽ§åˆ¶å°è¯»å–æ•°æ®ã€‚ + * 这里为了方便测试,é¿å…æ¯æ¬¡è¿è¡Œéƒ½æ‰‹åŠ¨è¾“å…¥æ•°æ®ï¼Œ + * 因而å…许选择从预设的文件pathä¸­è¯»å–æµ‹è¯•æ•°æ®ã€‚ + * + * 如果需è¦ä»ŽæŽ§åˆ¶å°è¯»å–æ•°æ®ï¼Œåˆ™path为NULL,或path[kind]为""。 + * 如果需è¦ä»Žæ–‡ä»¶ä¸­è¯»å–æ•°æ®ï¼Œåˆ™éœ€è¦åœ¨path中填写文件åä¿¡æ¯ã€‚ + */ +Status CreateGraph(ALGraph* G, char* path[]) { + int readFromConsole; // 是å¦ä»ŽæŽ§åˆ¶å°è¯»å–æ•°æ® + int kind; + Status flag; + + // ★★★此处固定为有å‘图 + kind = 0; + + // 如果没有文件路径信æ¯ï¼Œåˆ™ä»ŽæŽ§åˆ¶å°è¯»å–输入 + readFromConsole = (path == NULL) || strcmp(path[kind], "") == 0; + + // 需è¦ä»Žæ–‡ä»¶è¯»å– + if(readFromConsole) { + (*G).kind = kind; // 记录图/网的类型 + } else { + // æ‰“å¼€æ–‡ä»¶ï¼Œå‡†å¤‡è¯»å–æµ‹è¯•æ•°æ® + fp = fopen(path[kind], "r"); + if(fp == NULL) { + return ERROR; + } + + // 录入图的类型 + ReadData(fp, "%d", &((*G).kind)); + } + + // éšæœºåˆ›å»ºæœ‰å‘图/网或无å‘图/ç½‘çš„ä¸€ç§ + switch((*G).kind) { + case DG: + flag = CreateDG(G); + break; + default: + flag = ERROR; + break; + } + + if(fp != NULL) { + fclose(fp); + fp = NULL; + } + + return flag; +} + +/* + * 构造有å‘图 + */ +static Status CreateDG(ALGraph* G) { + int i, k; + int vexnum, arcnum; + VertexType v1, v2; + InfoType* info = NULL; + + (*G).vexnum = (*G).arcnum = 0; + + if(fp == NULL) { + printf("请输入有å‘图的顶点数:"); + scanf("%d", &vexnum); + printf("请输入有å‘图的弧数:"); + scanf("%d", &arcnum); + printf("该有å‘图的弧上是å¦åŒ…å«å…¶ä»–附加信æ¯(0-ä¸åŒ…å«â”‚1-包å«):"); + scanf("%d", &IncInfo); + + // 录入顶点集 + printf("请录入 %d 个顶点,ä¸åŒé¡¶ç‚¹ä¹‹é—´ç”¨ç©ºæ ¼éš”开:", vexnum); + for(i = 0; i < vexnum; i++) { + // 跳过空白,寻找下一个"å¯è¯»"ç¬¦å· + skipBlank(stdin); + scanf("%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } else { + ReadData(fp, "%d", &vexnum); // 录入顶点数 + ReadData(fp, "%d", &arcnum); // 录入弧数 + ReadData(fp, "%d", &IncInfo); // 判断弧上是å¦åŒ…å«é™„åŠ ä¿¡æ¯ + + // 录入顶点集 + for(i = 0; i < vexnum; i++) { + // 跳过空白,寻找下一个"å¯è¯»"ç¬¦å· + skipBlank(fp); + ReadData(fp, "%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } + + // 仅在控制å°å½•å…¥ä¿¡æ¯æ—¶è¾“出此æç¤º + if(fp == NULL && arcnum != 0) { + printf("请为有å‘图便¬¡å½•å…¥ %d æ¡å¼§çš„ä¿¡æ¯ï¼Œé¡¶ç‚¹ä¹‹é—´ç”¨ç©ºæ ¼éš”开:\n", arcnum); + } + + // å½•å…¥å¼§çš„ä¿¡æ¯ + for(k = 0; k < arcnum; k++) { + if(fp == NULL) { + printf("第 %2d æ¡å¼§ï¼š", k + 1); + skipBlank(stdin); // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + scanf("%c", &v1); + skipBlank(stdin); // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + scanf("%c", &v2); + } else { + // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + skipBlank(fp); + ReadData(fp, "%c%c", &v1, &v2); + } + + // 如果需è¦å½•å…¥å¼§çš„å…¶ä»–é™„åŠ ä¿¡æ¯ + if(IncInfo) { + // 最åŽå½•å…¥é™„åŠ ä¿¡æ¯ + Input(*G, &info); + } + + // æ’入弧 + InsertArc(G, v1, v2, info); + } + + // ä»Žæ–‡ä»¶ä¸­è¯»å–æ•°æ®æ—¶ï¼Œæœ€åŽå…¶å®žåº”当判断一下是å¦è¯»åˆ°äº†è¶³å¤Ÿçš„ä¿¡æ¯ + return OK; +} + +/* + * 录入边/å¼§çš„ç›¸å…³é™„åŠ ä¿¡æ¯ + */ +static void Input(ALGraph G, InfoType** info) { + int weight; + + // 在"网"的情形下需è¦å½•å…¥æƒå€¼ä¿¡æ¯ + if(G.kind == DN || G.kind == UDN) { + *info = (InfoType*) malloc(sizeof(InfoType)); + + if(fp == NULL) { + scanf("%d", &weight); + } else { + ReadData(fp, "%d", &weight); + } + + (*info)->weight = weight; + } +} + +/* + * 查找 + * + * 返回顶点u在图/网中的ä½ç½® + */ +int LocateVex(ALGraph G, VertexType u) { + int i; + + for(i = 0; i < G.vexnum; i++) { + if(G.vertices[i].data == u) { + return i; + } + } + + return -1; +} + +/* + * 构造一个边/弧结点(ä»…é™å†…部使用) + */ +static ArcNode* newArcNodePtr(int adjvex, ArcNode* nextarc, InfoType* info) { + ArcNode* p = (ArcNode*) malloc(sizeof(ArcNode)); + if(!p) { + exit(OVERFLOW); + } + + p->adjvex = adjvex; + + p->nextarc = nextarc; + + p->info = info; + + return p; +} + +/* + * æ’入边/å¼§ + * + * 如果当å‰å›¾/网是无å‘的,则æ’入一æ¡å¼§éœ€è¦å¢žåŠ ä¸¤ä¸ªé¡¶ç‚¹å…³ç³»ï¼Œä½†å¼§çš„æ•°é‡åªå¢žä¸€ã€‚ + * 对于图/网æ¥è¯´ï¼Œå¯ä»¥åœ¨å¯å˜å‚数中列出边/弧的附加信æ¯ã€‚ + * + * æ³¨ï¼šæ­¤å¤„æŽ¥æ”¶çš„å‚æ•°ä¸ŽMGraph有些ä¸ä¸€æ ·ï¼šç½‘的附加信æ¯ä¸­åŒ…å«äº†å„æ¡è¾¹/å¼§çš„æƒå€¼ã€‚ + */ +Status InsertArc(ALGraph* G, VertexType v, VertexType w, ...) { + int tail, head, k, count; + ArcNode* r; + ArcNode* pre; + Boolean overlay = FALSE; // 是å¦ä¸ºè¦†ç›–添加 + InfoType* info = NULL; // è¾¹/å¼§çš„é™„åŠ ä¿¡æ¯ + va_list ap; + + tail = LocateVex(*G, v); // 获å–顶点v在顶点集中的ä½ç½® + if(tail == -1) { + return ERROR; // 指定的顶点ä¸å­˜åœ¨ + } + + head = LocateVex(*G, w); // 获å–顶点w在顶点集中的ä½ç½® + if(head == -1) { + return ERROR; // 指定的顶点ä¸å­˜åœ¨ + } + + // æ‹’ç»çޝ + if(tail == head) { + return ERROR; + } + + // 如果边/å¼§ä¸Šå­˜åœ¨é™„åŠ ä¿¡æ¯ + if(IncInfo) { + va_start(ap, w); // 在wåŽæŸ¥è¯¢é¦–个å¯å˜å‚æ•° + info = va_arg(ap, InfoType*); // 获å–é™„åŠ ä¿¡æ¯ + va_end(ap); + } + + /* 接下æ¥ï¼Œéœ€è¦æŸ¥æ‰¾åˆé€‚çš„æ’å…¥ä½ç½® */ + + for(count = 0; count < 2; count++) { + pre = NULL; + // 指å‘以tail为尾的首æ¡è¾¹/å¼§ + r = G->vertices[tail].firstarc; + while(r != NULL && r->adjvex < head) { + pre = r; + r = r->nextarc; + } + + // é‡åˆ°äº†ç›¸åŒä½ç½®çš„结点 + if(r != NULL && r->adjvex == head) { + r->info = info; // å¤ç”¨è¯¥ç»“点 + overlay = TRUE; // å‘生了覆盖 + } else { + if(pre == NULL) { + G->vertices[tail].firstarc = newArcNodePtr(head, r, info); + } else { + pre->nextarc = newArcNodePtr(head, r, info); + } + } + + // 如果当å‰å›¾/网是无å‘的,需è¦è€ƒè™‘对称性 + if((G->kind == UDG || G->kind == UDN) && tail != head) { + // 颠倒iå’Œj + k = tail; + tail = head; + head = k; + } else { + break; // 如果是有å‘的,å¯ä»¥ç»“æŸäº† + } + } + + // 在éžè¦†ç›–的情形下,æ‰è€ƒè™‘æ›´æ–°è¾¹/å¼§çš„æ•°é‡ + if(!overlay) { + (*G).arcnum++; // ä¸è®ºæœ‰å‘æ— å‘,边/å¼§æ•°åªå¢žä¸€ + } + + return OK; +} + +/* + * 以图形化形å¼è¾“出当å‰ç»“æž„ + */ +void PrintGraph(ALGraph G) { + int i; + ArcNode* p; + + if(G.vexnum == 0) { + printf("空图,无需打å°ï¼\n"); + return; + } + + printf("当å‰å›¾/ç½‘åŒ…å« %2d 个顶点, %2d æ¡è¾¹/å¼§...\n", G.vexnum, G.arcnum); + + for(i = 0; i < G.vexnum; i++) { + printf("%c ===> ", G.vertices[i].data); + + p = G.vertices[i].firstarc; + while(p != NULL) { + if(IncInfo == 0) { + printf("%c ", G.vertices[p->adjvex].data); + + // 对于网,会从其附加信æ¯ä¸­èŽ·å–到æƒå€¼ + } else { + printf("%c[%2d] ", G.vertices[p->adjvex].data, p->info->weight); + } + + p = p->nextarc; + + if(p != NULL) { + printf("- "); + } + } + + printf("\n"); + } +} diff --git a/CLion/ExerciseBook/07.36-07.37/ALGraph.h b/CLion/ExerciseBook/07.36-07.37/ALGraph.h new file mode 100644 index 0000000..ce5d0a0 --- /dev/null +++ b/CLion/ExerciseBook/07.36-07.37/ALGraph.h @@ -0,0 +1,128 @@ +/*================== + * 图的邻接表存储表示 + ===================*/ + +#ifndef ALGRAPH_H +#define ALGRAPH_H + +#include +#include // æä¾›memsetã€strcmp 原型 +#include // æä¾›å®va_listã€va_startã€va_argã€va_end +#include // æä¾›mallocã€reallocã€freeã€exit原型 +#include "Status.h" //**â–²01 绪论**// + +/* + * 注: + * + * 通常æ¥è®²ï¼Œæ— æƒå›¾è¢«ç®€ç§°ä¸ºã€å›¾ã€‘,有æƒå›¾è¢«ç®€ç§°ä¸ºã€ç½‘】。 + * æ— å‘图/网中的顶点关系被称为ã€è¾¹ã€‘,有å‘图/网中的顶点关系被称为ã€å¼§ã€‘,并区分弧头与弧尾。 + * 实际表述中,未必会严格éµå®ˆä»¥ä¸Šå‘½å。 + * + * 当å‰ç»“构适åˆå­˜å‚¨è¾¹/弧比较稀ç–的图/网。 + * + * ★ æ’入边/å¼§çš„ä¿¡æ¯æ—¶ï¼Œè¿™é‡Œçš„实现是按"å‡åº"æ’入的,这使得æ’入的弧是按"å‡åº"排列的。 + */ + + +/* å®å®šä¹‰ */ +#define MAX_VERTEX_NUM 26 // 最大顶点个数 + + +// 图的类型 +typedef enum { + DG, // 0-有å‘图 + DN, // 1-有å‘网(带æƒå€¼) + UDG, // 2-æ— å‘图 + UDN // 3-æ— å‘网(带æƒå€¼) +} GraphKind; + +// 顶点类型 +typedef char VertexType; + +// è¾¹/å¼§çš„ç›¸å…³é™„åŠ ä¿¡æ¯ +typedef struct { + /* + * 注: + * æ•™æä¸­ç»™å‡ºçš„结构åªè€ƒè™‘了无æƒå›¾ï¼Œè€Œæ²¡è€ƒè™‘有æƒå›¾(网)。 + * 这里为了把“网â€çš„æƒ…形也考虑进去,特在附加信æ¯ä¸­å¢žåŠ äº†"æƒé‡"属性。 + */ + int weight; +} InfoType; + +/* è¾¹/弧结点 */ +typedef struct ArcNode { + int adjvex; // 该弧所指å‘的顶点的ä½ç½® + struct ArcNode* nextarc; // 指å‘下一æ¡å¼§çš„æŒ‡é’ˆ + InfoType* info; // 弧的附加信æ¯ï¼Œé€šå¸¸å¿½ç•¥ +} ArcNode; + +// æ¯ä¸ªé“¾è¡¨çš„头结点 +typedef struct VNode { + VertexType data; // é¡¶ç‚¹ä¿¡æ¯ + ArcNode* firstarc; // 指å‘第一æ¡ä¾é™„该顶点的弧的指针 +} VNode; + +/* 图的邻接表存储表示类型定义 */ +typedef struct { + VNode vertices[MAX_VERTEX_NUM]; // 邻接表 + int vexnum, arcnum; // 图/网的顶点数和弧数 + GraphKind kind; // 图的类型标志 +} ALGraph; + + +// è¾¹/弧上是å¦å­˜åœ¨é™„åŠ ä¿¡æ¯ +extern Boolean IncInfo; + + +/* + * 创建 + * + *ã€å¤‡æ³¨ã€‘ + * + * æ•™æä¸­é»˜è®¤ä»ŽæŽ§åˆ¶å°è¯»å–æ•°æ®ã€‚ + * 这里为了方便测试,é¿å…æ¯æ¬¡è¿è¡Œéƒ½æ‰‹åŠ¨è¾“å…¥æ•°æ®ï¼Œ + * 因而å…许选择从预设的文件pathä¸­è¯»å–æµ‹è¯•æ•°æ®ã€‚ + * + * 如果需è¦ä»ŽæŽ§åˆ¶å°è¯»å–æ•°æ®ï¼Œåˆ™path为NULL,或path[kind]为""。 + * 如果需è¦ä»Žæ–‡ä»¶ä¸­è¯»å–æ•°æ®ï¼Œåˆ™éœ€è¦åœ¨path中填写文件åä¿¡æ¯ã€‚ + */ +Status CreateGraph(ALGraph* G, char* path[]); + +/* + * 构造有å‘图 + */ +static Status CreateDG(ALGraph* G); + +/* + * 录入边/å¼§çš„ç›¸å…³é™„åŠ ä¿¡æ¯ + */ +static void Input(ALGraph G, InfoType** info); + +/* + * 查找 + * + * 返回顶点u在图/网中的ä½ç½® + */ +int LocateVex(ALGraph G, VertexType u); + +/* + * 构造一个边/弧结点(ä»…é™å†…部使用) + */ +static ArcNode* newArcNodePtr(int adjvex, ArcNode* nextarc, InfoType* info); + +/* + * æ’入边/å¼§ + * + * 如果当å‰å›¾/网是无å‘的,则æ’入一æ¡å¼§éœ€è¦å¢žåŠ ä¸¤ä¸ªé¡¶ç‚¹å…³ç³»ï¼Œä½†å¼§çš„æ•°é‡åªå¢žä¸€ã€‚ + * 对于图/网æ¥è¯´ï¼Œå¯ä»¥åœ¨å¯å˜å‚数中列出边/弧的附加信æ¯ã€‚ + * + * æ³¨ï¼šæ­¤å¤„æŽ¥æ”¶çš„å‚æ•°ä¸ŽMGraph有些ä¸ä¸€æ ·ï¼šç½‘的附加信æ¯ä¸­åŒ…å«äº†å„æ¡è¾¹/å¼§çš„æƒå€¼ã€‚ + */ +Status InsertArc(ALGraph* G, VertexType v, VertexType w, ...); + +/* + * 以图形化形å¼è¾“出当å‰ç»“æž„ + */ +void PrintGraph(ALGraph G); + +#endif diff --git a/CLion/ExerciseBook/07.36-07.37/CMakeLists.txt b/CLion/ExerciseBook/07.36-07.37/CMakeLists.txt new file mode 100644 index 0000000..5e78b16 --- /dev/null +++ b/CLion/ExerciseBook/07.36-07.37/CMakeLists.txt @@ -0,0 +1,12 @@ +# 包å«å…¬å…±åº“ +include_directories(${CMAKE_SOURCE_DIR}/Status) + +# 生æˆå¯æ‰§è¡Œæ–‡ä»¶ +add_executable(07.36-07.37 SqStack.h SqStack.c ALGraph.h ALGraph.c TopologicalSorting.h TopologicalSorting.c 07.36-07.37.c) +# 链接公共库 +target_link_libraries(07.36-07.37 Scanf_lib) + +# è®°å½•è¦æ‹·è´åˆ°*.exeç›®å½•ä¸‹çš„èµ„æºæ–‡ä»¶ +file(GLOB TestData TestData*.txt) +# å°†èµ„æºæ–‡ä»¶æ‹·è´åˆ°*.exe目录下,ä¸ç„¶æ— æ³•加载 +file(COPY ${TestData} DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) diff --git a/CLion/ExerciseBook/07.36-07.37/SqStack.c b/CLion/ExerciseBook/07.36-07.37/SqStack.c new file mode 100644 index 0000000..d709204 --- /dev/null +++ b/CLion/ExerciseBook/07.36-07.37/SqStack.c @@ -0,0 +1,90 @@ +/*========================= + * 栈的顺åºå­˜å‚¨ç»“æž„ï¼ˆé¡ºåºæ ˆï¼‰ + ==========================*/ + +#include "SqStack.h" //**â–²03 栈和队列**// + +/* + * åˆå§‹åŒ– + * + * 构造一个空栈。åˆå§‹åŒ–æˆåŠŸåˆ™è¿”å›žOK,å¦åˆ™è¿”回ERROR。 + */ +Status InitStack(SqStack* S) { + if(S == NULL) { + return ERROR; + } + + (*S).base = (SElemType*) malloc(STACK_INIT_SIZE * sizeof(SElemType)); + if((*S).base == NULL) { + exit(OVERFLOW); + } + + (*S).top = (*S).base; + (*S).stacksize = STACK_INIT_SIZE; + + return OK; +} + +/* + * 判空 + * + * åˆ¤æ–­é¡ºåºæ ˆä¸­æ˜¯å¦åŒ…嫿œ‰æ•ˆæ•°æ®ã€‚ + * + * 返回值: + * TRUE : é¡ºåºæ ˆä¸ºç©º + * FALSE: é¡ºåºæ ˆä¸ä¸ºç©º + */ +Status StackEmpty(SqStack S) { + if(S.top == S.base) { + return TRUE; + } else { + return FALSE; + } +} + +/* + * 入栈 + * + * 将元素e压入到栈顶。 + */ +Status Push(SqStack* S, SElemType e) { + if(S == NULL || (*S).base == NULL) { + return ERROR; + } + + // 栈满时,追加存储空间 + if((*S).top - (*S).base >= (*S).stacksize) { + (*S).base = (SElemType*) realloc((*S).base, ((*S).stacksize + STACKINCREMENT) * sizeof(SElemType)); + if((*S).base == NULL) { + exit(OVERFLOW); // 存储分é…失败 + } + + (*S).top = (*S).base + (*S).stacksize; + (*S).stacksize += STACKINCREMENT; + } + + // 进栈先赋值,栈顶指针å†è‡ªå¢ž + *(S->top++) = e; + + return OK; +} + +/* + * 出栈 + * + * 将栈顶元素弹出,并用e接收。 + */ +Status Pop(SqStack* S, SElemType* e) { + if(S == NULL || (*S).base == NULL) { + return ERROR; + } + + if((*S).top == (*S).base) { + return ERROR; + } + + // 出栈栈顶指针先递å‡ï¼Œå†èµ‹å€¼ + *e = *(--(*S).top); + + return OK; +} diff --git a/CLion/ExerciseBook/07.36-07.37/SqStack.h b/CLion/ExerciseBook/07.36-07.37/SqStack.h new file mode 100644 index 0000000..e840954 --- /dev/null +++ b/CLion/ExerciseBook/07.36-07.37/SqStack.h @@ -0,0 +1,59 @@ +/*========================= + * 栈的顺åºå­˜å‚¨ç»“æž„ï¼ˆé¡ºåºæ ˆï¼‰ + ==========================*/ + +#ifndef SQSTACK_H +#define SQSTACK_H + +#include +#include // æä¾›mallocã€reallocã€freeã€exit原型 +#include "Status.h" //**â–²01 绪论**// + +/* å®å®šä¹‰ */ +#define STACK_INIT_SIZE 100 // é¡ºåºæ ˆå­˜å‚¨ç©ºé—´çš„åˆå§‹åˆ†é…é‡ +#define STACKINCREMENT 10 // é¡ºåºæ ˆå­˜å‚¨ç©ºé—´çš„分é…å¢žé‡ + +/* é¡ºåºæ ˆå…ƒç´ ç±»åž‹å®šä¹‰ */ +typedef int SElemType; + +// é¡ºåºæ ˆå…ƒç´ ç»“æž„ +typedef struct { + SElemType* base; // 栈底指针 + SElemType* top; // 栈顶指针 + int stacksize; // 当å‰å·²åˆ†é…的存储空间,以元素为å•ä½ +} SqStack; + + +/* + * åˆå§‹åŒ– + * + * 构造一个空栈。åˆå§‹åŒ–æˆåŠŸåˆ™è¿”å›žOK,å¦åˆ™è¿”回ERROR。 + */ +Status InitStack(SqStack* S); + +/* + * 判空 + * + * åˆ¤æ–­é¡ºåºæ ˆä¸­æ˜¯å¦åŒ…嫿œ‰æ•ˆæ•°æ®ã€‚ + * + * 返回值: + * TRUE : é¡ºåºæ ˆä¸ºç©º + * FALSE: é¡ºåºæ ˆä¸ä¸ºç©º + */ +Status StackEmpty(SqStack S); + +/* + * 入栈 + * + * 将元素e压入到栈顶。 + */ +Status Push(SqStack* S, SElemType e); + +/* + * 出栈 + * + * 将栈顶元素弹出,并用e接收。 + */ +Status Pop(SqStack* S, SElemType* e); + +#endif diff --git a/CLion/ExerciseBook/07.36-07.37/TestData_DG.txt b/CLion/ExerciseBook/07.36-07.37/TestData_DG.txt new file mode 100644 index 0000000..9d20118 --- /dev/null +++ b/CLion/ExerciseBook/07.36-07.37/TestData_DG.txt @@ -0,0 +1,6 @@ +图类型→0(有å‘图) +顶点数→12 +弧数→16 +弧是å¦å¸¦æœ‰å…¶ä»–ä¿¡æ¯â†’0 +顶点集→ã€A,B,C,D,E,F,G,H,I,J,K,L】 +弧的集åˆâ†’ã€F,J】ã€F,B】ã€F,C】ã€F,A】ã€B,C】ã€J,I】ã€C,I】ã€C,H】ã€I,H】ã€C,G】ã€D,A】ã€D,L】ã€L,A】ã€D,K】ã€K,E】ã€E,G】 \ No newline at end of file diff --git a/CLion/ExerciseBook/07.36-07.37/TopologicalSorting.c b/CLion/ExerciseBook/07.36-07.37/TopologicalSorting.c new file mode 100644 index 0000000..b35a574 --- /dev/null +++ b/CLion/ExerciseBook/07.36-07.37/TopologicalSorting.c @@ -0,0 +1,96 @@ +/*======================= + * AOV-网(有å‘图)çš„æ‹“æ‰‘æŽ’åº + * + * 包å«ç®—法: 7.12 + ========================*/ + +#include "TopologicalSorting.h" + +/* + * ████████ 算法7.12 ████████ + * + * 如果有å‘图G无回路,则输出它的一个拓扑åºåˆ—并返回OKï¼›å¦åˆ™ï¼Œè¿”回FALSE。 + * 拓扑åºåˆ—通常ä¸å”¯ä¸€ï¼Œä½†æ˜¯å¿…é¡»ä¿è¯æŸäº›å…³é”®èŠ‚ç‚¹çš„å…ˆåŽæ¬¡åºã€‚ + * + * 注:与教æä¸åŒä¹‹å¤„在于,此处增加了一个topo数组åšå‚数。 + *   对于求出的拓扑åºåˆ—,ä¸ä¼šç›´æŽ¥è¾“出,而是会缓存到topo中。 + *   这样的åšçš„目的是åŽç»­çš„习题中会有多处用到该拓扑åºåˆ—。 + */ +Status TopologicalSort(ALGraph G, int topo[MAX_VERTEX_NUM]) { + int i, k, count; + int indegree[MAX_VERTEX_NUM]; + SqStack S; + ArcNode* p; + + // 对å„顶点求入度 + FindInDegree(G, indegree); + + // åˆå§‹åŒ–零入度顶点栈 + InitStack(&S); + + // 建立入度为0的顶点栈 + for(i = 0; i < G.vexnum; i++) { + // 将入度为0的顶点添加到栈中 + if(indegree[i] == 0) { + Push(&S, i); + } + } + + // 对拓扑åºåˆ—中的顶点计数 + count = 0; + + // é历顶点栈 + while(!StackEmpty(S)) { + // 获å–一个零入度顶点 + Pop(&S, &i); + + // å°†å„顶点的åºå·æš‚å­˜èµ·æ¥ + topo[count++] = i; + + // é历iå·é¡¶ç‚¹çš„邻接点 + for(p = G.vertices[i].firstarc; p != NULL; p = p->nextarc) { + // 获å–顶点åºå· + k = p->adjvex; + + /* + * å°†iå·é¡¶ç‚¹æ¯ä¸ªé‚»æŽ¥ç‚¹çš„入度å‡ä¸€ï¼Œè¿™ç›¸å½“于切段iå·é¡¶ç‚¹åˆ°å…¶å®ƒé‚»æŽ¥ç‚¹çš„è”系。 + * 如果出现了新的入度为0的顶点,继续将其入栈。 + */ + if((--indegree[k]) == 0) { + Push(&S, k); + } + } + } + + // 如果é‡åˆ°äº†å›žè·¯ï¼Œåˆ™è¿”回ERROR + if(count < G.vexnum) { + return ERROR; + } else { + return OK; + } +} + +/* + * 计算å„顶点的入度 + */ +static void FindInDegree(ALGraph G, int indegree[MAX_VERTEX_NUM]) { + int i; + ArcNode* p; + + // åˆå§‹åŒ–所有顶点的入度为0 + for(i = 0; i < G.vexnum; i++) { + indegree[i] = 0; + } + + // é历所有顶点 + for(i = 0; i < G.vexnum; i++) { + // 指å‘该顶点的首个邻接点 + p = G.vertices[i].firstarc; + + // é历该顶点的所有邻接点,统计å„顶点的入度 + while(p != NULL) { + indegree[p->adjvex]++; + p = p->nextarc; + } + } +} diff --git a/CLion/ExerciseBook/07.36-07.37/TopologicalSorting.h b/CLion/ExerciseBook/07.36-07.37/TopologicalSorting.h new file mode 100644 index 0000000..ecdde03 --- /dev/null +++ b/CLion/ExerciseBook/07.36-07.37/TopologicalSorting.h @@ -0,0 +1,28 @@ +/*======================= + * AOV-网(有å‘图)çš„æ‹“æ‰‘æŽ’åº + * + * 包å«ç®—法: 7.12 + ========================*/ + +#ifndef TOPOLOGICALSORTING_H +#define TOPOLOGICALSORTING_H + +#include +#include "Status.h" //**â–²01 绪论**// +#include "SqStack.h" //**â–²03 栈和队列**// +#include "ALGraph.h" //**â–²07 图**// + +/* + * ████████ 算法7.12 ████████ + * + * 如果有å‘图G无回路,则输出它的一个拓扑åºåˆ—并返回OKï¼›å¦åˆ™ï¼Œè¿”回FALSE。 + * 拓扑åºåˆ—通常ä¸å”¯ä¸€ï¼Œä½†æ˜¯å¿…é¡»ä¿è¯æŸäº›å…³é”®èŠ‚ç‚¹çš„å…ˆåŽæ¬¡åºã€‚ + */ +Status TopologicalSort(ALGraph G, int topo[MAX_VERTEX_NUM]); + +/* + * 计算å„顶点的入度 + */ +static void FindInDegree(ALGraph G, int indegree[MAX_VERTEX_NUM]); + +#endif diff --git a/CLion/ExerciseBook/07.38/07.38.c b/CLion/ExerciseBook/07.38/07.38.c new file mode 100644 index 0000000..83aa1d2 --- /dev/null +++ b/CLion/ExerciseBook/07.38/07.38.c @@ -0,0 +1,110 @@ +#include +#include "SqList.h" +#include "ALGraph.h" + +/* + * 获å–å­˜å‚¨åœ¨æœ‰å‘æ— çŽ¯å›¾ä¸­çš„è¡¨è¾¾å¼çš„é€†æ³¢å…°å¼ + * + * 注:表达å¼ç»“æž„å‚è€ƒæ•™ææ’å›¾7.23 + */ +void Algo_7_38(ALGraph G); + +/* + * 从顶点v出å‘èŽ·å–æœ‰å‘图中存储的表达å¼çš„逆波兰å¼ã€‚ + * 求å–的逆波兰å¼ä¼šå­˜å‚¨åœ¨RPN中。 + */ +static void AntiPolandFormula_7_38(ALGraph G, int v, SqList* RPN); + + +int main(int argc, char* argv[]) { + ALGraph G; + + printf("████████ åˆ›å»ºå¹¶æ‰“å°æœ‰å‘网... \n"); + { + char* path[4]; + + path[0] = "TestData_DG.txt"; + path[1] = ""; + path[2] = ""; + path[3] = ""; + + CreateGraph(&G, path); + PrintGraph(G); + printf("\n"); + } + + printf("████████ æ±‚å–æœ‰å‘网中存储的表达å¼çš„逆波兰å¼... \n"); + { + Algo_7_38(G); + printf("\n"); + } + + return 0; +} + + +/* + * 获å–å­˜å‚¨åœ¨æœ‰å‘æ— çŽ¯å›¾ä¸­çš„è¡¨è¾¾å¼çš„é€†æ³¢å…°å¼ + * + * 注:表达å¼ç»“æž„å‚è€ƒæ•™ææ’å›¾7.23 + */ +void Algo_7_38(ALGraph G) { + int i, root; + int indegree[MAX_VERTEX_NUM]; // æ‰€æœ‰é¡¶ç‚¹çš„å…¥åº¦ä¿¡æ¯ + ArcNode* p; + SqList RPN; // å­˜å‚¨é€†æ³¢å…°è¡¨è¾¾å¼ + ElemType e; + + // åˆå§‹åŒ–所有顶点的入度为0 + for(i = 0; i < G.vexnum; i++) { + indegree[i] = 0; + } + + // é历所有顶点 + for(i = 0; i < G.vexnum; i++) { + // 指å‘该顶点的首个邻接点 + p = G.vertices[i].firstarc; + + // é历该顶点的所有邻接点,统计å„顶点的入度 + while(p != NULL) { + indegree[p->adjvex]++; + p = p->nextarc; + } + } + + // 查找到根结点 + for(i = 0; i < G.vexnum; i++) { + if(indegree[i] == 0) { + root = i; + break; + } + } + + // åˆå§‹åŒ–长度为0的线性表 + InitList(&RPN); + + // ä»Žæœ‰å‘æ— çŽ¯å›¾çš„æ ¹ç»“ç‚¹å‡ºå‘,通过尾递归获å–到其中存储的表达å¼çš„é€†æ³¢å…°å¼ + AntiPolandFormula_7_38(G, root, &RPN); + + for(i = 1; i <= ListLength(RPN); i++) { + GetElem(RPN, i, &e); + printf("%c", ops[e]); + } + printf("\n"); +} + +/* + * 从顶点v出å‘èŽ·å–æœ‰å‘图中存储的表达å¼çš„逆波兰å¼ã€‚ + * 求å–的逆波兰å¼ä¼šå­˜å‚¨åœ¨RPN中。 + */ +void AntiPolandFormula_7_38(ALGraph G, int v, SqList* RPN) { + ArcNode* r; + + // å…ˆé历邻接点 + for(r = G.vertices[v].firstarc; r != NULL; r = r->nextarc) { + AntiPolandFormula_7_38(G, r->adjvex, RPN); + } + + // 当没有邻接点å¯é历时,存储该顶点 + ListInsert(RPN, ListLength(*RPN) + 1, v); +} diff --git a/CLion/ExerciseBook/07.38/07.38.png b/CLion/ExerciseBook/07.38/07.38.png new file mode 100644 index 0000000000000000000000000000000000000000..2b6df8a6e7f428f737000ebe395c8c43ff948fab GIT binary patch literal 27793 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 b*`=vzuIda`2N!sa*fsSBI?5G_R-yj|<&7Ks literal 0 HcmV?d00001 diff --git a/CLion/ExerciseBook/07.38/ALGraph.c b/CLion/ExerciseBook/07.38/ALGraph.c new file mode 100644 index 0000000..908415a --- /dev/null +++ b/CLion/ExerciseBook/07.38/ALGraph.c @@ -0,0 +1,344 @@ +/*================== + * 图的邻接表存储表示 + ===================*/ + +#include "ALGraph.h" + +// 录入数æ®çš„æºæ–‡ä»¶ï¼›fp为null时,说明需è¦ä»ŽæŽ§åˆ¶å°å½•å…¥ +static FILE* fp = NULL; + +/* + * IncInfo指示该图/网的边/弧上是å¦å­˜åœ¨é™„加信æ¯ã€‚ + * 如果其值ä¸ä¸º0,则表示无附加信æ¯ï¼Œå¦åˆ™ï¼Œè¡¨ç¤ºå­˜åœ¨é™„加信æ¯ã€‚ + */ +Boolean IncInfo = FALSE; + +// 访问标志数组,记录访问过的顶点 +static Boolean visited[MAX_VERTEX_NUM]; + +// 函数å˜é‡ +static Status (* VisitFunc)(VertexType e); + +// 与顶点一一对应的æ“作数与æ“作符 +char ops[MAX_VERTEX_NUM]; + + +/* + * 创建 + * + *ã€å¤‡æ³¨ã€‘ + * + * æ•™æä¸­é»˜è®¤ä»ŽæŽ§åˆ¶å°è¯»å–æ•°æ®ã€‚ + * 这里为了方便测试,é¿å…æ¯æ¬¡è¿è¡Œéƒ½æ‰‹åŠ¨è¾“å…¥æ•°æ®ï¼Œ + * 因而å…许选择从预设的文件pathä¸­è¯»å–æµ‹è¯•æ•°æ®ã€‚ + * + * 如果需è¦ä»ŽæŽ§åˆ¶å°è¯»å–æ•°æ®ï¼Œåˆ™path为NULL,或path[kind]为""。 + * 如果需è¦ä»Žæ–‡ä»¶ä¸­è¯»å–æ•°æ®ï¼Œåˆ™éœ€è¦åœ¨path中填写文件åä¿¡æ¯ã€‚ + */ +Status CreateGraph(ALGraph* G, char* path[]) { + int readFromConsole; // 是å¦ä»ŽæŽ§åˆ¶å°è¯»å–æ•°æ® + int kind; + Status flag; + + // ★★★此处固定为有å‘图 + kind = 0; + + // 如果没有文件路径信æ¯ï¼Œåˆ™ä»ŽæŽ§åˆ¶å°è¯»å–输入 + readFromConsole = (path == NULL) || strcmp(path[kind], "") == 0; + + // 需è¦ä»Žæ–‡ä»¶è¯»å– + if(readFromConsole) { + (*G).kind = kind; // 记录图/网的类型 + } else { + // æ‰“å¼€æ–‡ä»¶ï¼Œå‡†å¤‡è¯»å–æµ‹è¯•æ•°æ® + fp = fopen(path[kind], "r"); + if(fp == NULL) { + return ERROR; + } + + // 录入图的类型 + ReadData(fp, "%d", &((*G).kind)); + } + + // éšæœºåˆ›å»ºæœ‰å‘图/网或无å‘图/ç½‘çš„ä¸€ç§ + switch((*G).kind) { + case DG: + flag = CreateDG(G); + break; + default: + flag = ERROR; + break; + } + + if(fp != NULL) { + fclose(fp); + fp = NULL; + } + + return flag; +} + +/* + * 构造有å‘图 + */ +static Status CreateDG(ALGraph* G) { + int i, k; + int vexnum, arcnum; + VertexType v1, v2; + InfoType* info = NULL; + + (*G).vexnum = (*G).arcnum = 0; + + if(fp == NULL) { + printf("请输入有å‘图的顶点数:"); + scanf("%d", &vexnum); + printf("请输入有å‘图的弧数:"); + scanf("%d", &arcnum); + printf("该有å‘图的弧上是å¦åŒ…å«å…¶ä»–附加信æ¯(0-ä¸åŒ…å«â”‚1-包å«):"); + scanf("%d", &IncInfo); + + // 录入顶点集 + printf("请录入 %d 个顶点,ä¸åŒé¡¶ç‚¹ä¹‹é—´ç”¨ç©ºæ ¼éš”开:", vexnum); + for(i = 0; i < vexnum; i++) { + // 跳过空白,寻找下一个"å¯è¯»"ç¬¦å· + skipBlank(stdin); + scanf("%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } else { + ReadData(fp, "%d", &vexnum); // 录入顶点数 + ReadData(fp, "%d", &arcnum); // 录入弧数 + ReadData(fp, "%d", &IncInfo); // 判断弧上是å¦åŒ…å«é™„åŠ ä¿¡æ¯ + + // 录入顶点集 + for(i = 0; i < vexnum; i++) { + // 跳过空白,寻找下一个"å¯è¯»"ç¬¦å· + skipBlank(fp); + ReadData(fp, "%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } + + // 仅在控制å°å½•å…¥ä¿¡æ¯æ—¶è¾“出此æç¤º + if(fp == NULL && arcnum != 0) { + printf("请为有å‘图便¬¡å½•å…¥ %d æ¡å¼§çš„ä¿¡æ¯ï¼Œé¡¶ç‚¹ä¹‹é—´ç”¨ç©ºæ ¼éš”开:\n", arcnum); + } + + // å½•å…¥å¼§çš„ä¿¡æ¯ + for(k = 0; k < arcnum; k++) { + if(fp == NULL) { + printf("第 %2d æ¡å¼§ï¼š", k + 1); + skipBlank(stdin); // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + scanf("%c", &v1); + skipBlank(stdin); // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + scanf("%c", &v2); + } else { + // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + skipBlank(fp); + ReadData(fp, "%c%c", &v1, &v2); + } + + // 如果需è¦å½•å…¥å¼§çš„å…¶ä»–é™„åŠ ä¿¡æ¯ + if(IncInfo) { + // 最åŽå½•å…¥é™„åŠ ä¿¡æ¯ + Input(*G, &info); + } + + // æ’入弧 + InsertArc(G, v1, v2, info); + } + + // 录入与顶点对应的æ“作数与æ“作符 + if(fp == NULL) { + printf("请录入 %d 个与顶点一一对应的æ“作数/æ“作符,ä¸åŒæ“作数/æ“作符之间用空格隔开:", vexnum); + for(i = 0; i < vexnum; i++) { + // 跳过空白,寻找下一个"å¯è¯»"ç¬¦å· + skipBlank(stdin); + scanf("%c", &(ops[i])); + } + } else { + for(i = 0; i < vexnum; i++) { + // 跳过空白,寻找下一个"å¯è¯»"ç¬¦å· + skipBlank(fp); + ReadData(fp, "%c", &(ops[i])); + } + } + + // ä»Žæ–‡ä»¶ä¸­è¯»å–æ•°æ®æ—¶ï¼Œæœ€åŽå…¶å®žåº”当判断一下是å¦è¯»åˆ°äº†è¶³å¤Ÿçš„ä¿¡æ¯ + return OK; +} + +/* + * 录入边/å¼§çš„ç›¸å…³é™„åŠ ä¿¡æ¯ + */ +static void Input(ALGraph G, InfoType** info) { + int weight; + + // 在"网"的情形下需è¦å½•å…¥æƒå€¼ä¿¡æ¯ + if(G.kind == DN || G.kind == UDN) { + *info = (InfoType*) malloc(sizeof(InfoType)); + + if(fp == NULL) { + scanf("%d", &weight); + } else { + ReadData(fp, "%d", &weight); + } + + (*info)->weight = weight; + } +} + +/* + * 查找 + * + * 返回顶点u在图/网中的ä½ç½® + */ +int LocateVex(ALGraph G, VertexType u) { + int i; + + for(i = 0; i < G.vexnum; i++) { + if(G.vertices[i].data == u) { + return i; + } + } + + return -1; +} + +/* + * 构造一个边/弧结点(ä»…é™å†…部使用) + */ +static ArcNode* newArcNodePtr(int adjvex, ArcNode* nextarc, InfoType* info) { + ArcNode* p = (ArcNode*) malloc(sizeof(ArcNode)); + if(!p) { + exit(OVERFLOW); + } + + p->adjvex = adjvex; + + p->nextarc = nextarc; + + p->info = info; + + return p; +} + +/* + * æ’入边/å¼§ + * + * 如果当å‰å›¾/网是无å‘的,则æ’入一æ¡å¼§éœ€è¦å¢žåŠ ä¸¤ä¸ªé¡¶ç‚¹å…³ç³»ï¼Œä½†å¼§çš„æ•°é‡åªå¢žä¸€ã€‚ + * 对于图/网æ¥è¯´ï¼Œå¯ä»¥åœ¨å¯å˜å‚数中列出边/弧的附加信æ¯ã€‚ + * + * æ³¨ï¼šæ­¤å¤„æŽ¥æ”¶çš„å‚æ•°ä¸ŽMGraph有些ä¸ä¸€æ ·ï¼šç½‘的附加信æ¯ä¸­åŒ…å«äº†å„æ¡è¾¹/å¼§çš„æƒå€¼ã€‚ + */ +Status InsertArc(ALGraph* G, VertexType v, VertexType w, ...) { + int tail, head, k, count; + ArcNode* r; + ArcNode* pre; + Boolean overlay = FALSE; // 是å¦ä¸ºè¦†ç›–添加 + InfoType* info = NULL; // è¾¹/å¼§çš„é™„åŠ ä¿¡æ¯ + va_list ap; + + tail = LocateVex(*G, v); // 获å–顶点v在顶点集中的ä½ç½® + if(tail == -1) { + return ERROR; // 指定的顶点ä¸å­˜åœ¨ + } + + head = LocateVex(*G, w); // 获å–顶点w在顶点集中的ä½ç½® + if(head == -1) { + return ERROR; // 指定的顶点ä¸å­˜åœ¨ + } + + // æ‹’ç»çޝ + if(tail == head) { + return ERROR; + } + + // 如果边/å¼§ä¸Šå­˜åœ¨é™„åŠ ä¿¡æ¯ + if(IncInfo) { + va_start(ap, w); // 在wåŽæŸ¥è¯¢é¦–个å¯å˜å‚æ•° + info = va_arg(ap, InfoType*); // 获å–é™„åŠ ä¿¡æ¯ + va_end(ap); + } + + /* 接下æ¥ï¼Œéœ€è¦æŸ¥æ‰¾åˆé€‚çš„æ’å…¥ä½ç½® */ + + for(count = 0; count < 2; count++) { + pre = NULL; + // 指å‘以tail为尾的首æ¡è¾¹/å¼§ + r = G->vertices[tail].firstarc; + while(r != NULL && r->adjvex < head) { + pre = r; + r = r->nextarc; + } + + // é‡åˆ°äº†ç›¸åŒä½ç½®çš„结点 + if(r != NULL && r->adjvex == head) { + r->info = info; // å¤ç”¨è¯¥ç»“点 + overlay = TRUE; // å‘生了覆盖 + } else { + if(pre == NULL) { + G->vertices[tail].firstarc = newArcNodePtr(head, r, info); + } else { + pre->nextarc = newArcNodePtr(head, r, info); + } + } + + // 如果当å‰å›¾/网是无å‘的,需è¦è€ƒè™‘对称性 + if((G->kind == UDG || G->kind == UDN) && tail != head) { + // 颠倒iå’Œj + k = tail; + tail = head; + head = k; + } else { + break; // 如果是有å‘的,å¯ä»¥ç»“æŸäº† + } + } + + // 在éžè¦†ç›–的情形下,æ‰è€ƒè™‘æ›´æ–°è¾¹/å¼§çš„æ•°é‡ + if(!overlay) { + (*G).arcnum++; // ä¸è®ºæœ‰å‘æ— å‘,边/å¼§æ•°åªå¢žä¸€ + } + + return OK; +} + +/* + * 以图形化形å¼è¾“出当å‰ç»“æž„ + */ +void PrintGraph(ALGraph G) { + int i; + ArcNode* p; + + if(G.vexnum == 0) { + printf("空图,无需打å°ï¼\n"); + return; + } + + printf("当å‰å›¾/ç½‘åŒ…å« %2d 个顶点, %2d æ¡è¾¹/å¼§...\n", G.vexnum, G.arcnum); + + for(i = 0; i < G.vexnum; i++) { + printf("%c ===> ", G.vertices[i].data); + + p = G.vertices[i].firstarc; + while(p != NULL) { + if(IncInfo == 0) { + printf("%c ", G.vertices[p->adjvex].data); + + // 对于网,会从其附加信æ¯ä¸­èŽ·å–到æƒå€¼ + } else { + printf("%c[%2d] ", G.vertices[p->adjvex].data, p->info->weight); + } + + p = p->nextarc; + + if(p != NULL) { + printf("- "); + } + } + + printf("\n"); + } +} diff --git a/CLion/ExerciseBook/07.38/ALGraph.h b/CLion/ExerciseBook/07.38/ALGraph.h new file mode 100644 index 0000000..676d24c --- /dev/null +++ b/CLion/ExerciseBook/07.38/ALGraph.h @@ -0,0 +1,131 @@ +/*================== + * 图的邻接表存储表示 + ===================*/ + +#ifndef ALGRAPH_H +#define ALGRAPH_H + +#include +#include // æä¾›memsetã€strcmp 原型 +#include // æä¾›å®va_listã€va_startã€va_argã€va_end +#include // æä¾›mallocã€reallocã€freeã€exit原型 +#include "Status.h" //**â–²01 绪论**// + +/* + * 注: + * + * 通常æ¥è®²ï¼Œæ— æƒå›¾è¢«ç®€ç§°ä¸ºã€å›¾ã€‘,有æƒå›¾è¢«ç®€ç§°ä¸ºã€ç½‘】。 + * æ— å‘图/网中的顶点关系被称为ã€è¾¹ã€‘,有å‘图/网中的顶点关系被称为ã€å¼§ã€‘,并区分弧头与弧尾。 + * 实际表述中,未必会严格éµå®ˆä»¥ä¸Šå‘½å。 + * + * 当å‰ç»“构适åˆå­˜å‚¨è¾¹/弧比较稀ç–的图/网。 + * + * ★ æ’入边/å¼§çš„ä¿¡æ¯æ—¶ï¼Œè¿™é‡Œçš„实现是按"å‡åº"æ’入的,这使得æ’入的弧是按"å‡åº"排列的。 + */ + + +/* å®å®šä¹‰ */ +#define MAX_VERTEX_NUM 26 // 最大顶点个数 + + +// 图的类型 +typedef enum { + DG, // 0-有å‘图 + DN, // 1-有å‘网(带æƒå€¼) + UDG, // 2-æ— å‘图 + UDN // 3-æ— å‘网(带æƒå€¼) +} GraphKind; + +// 顶点类型 +typedef char VertexType; + +// è¾¹/å¼§çš„ç›¸å…³é™„åŠ ä¿¡æ¯ +typedef struct { + /* + * 注: + * æ•™æä¸­ç»™å‡ºçš„结构åªè€ƒè™‘了无æƒå›¾ï¼Œè€Œæ²¡è€ƒè™‘有æƒå›¾(网)。 + * 这里为了把“网â€çš„æƒ…形也考虑进去,特在附加信æ¯ä¸­å¢žåŠ äº†"æƒé‡"属性。 + */ + int weight; +} InfoType; + +/* è¾¹/弧结点 */ +typedef struct ArcNode { + int adjvex; // 该弧所指å‘的顶点的ä½ç½® + struct ArcNode* nextarc; // 指å‘下一æ¡å¼§çš„æŒ‡é’ˆ + InfoType* info; // 弧的附加信æ¯ï¼Œé€šå¸¸å¿½ç•¥ +} ArcNode; + +// æ¯ä¸ªé“¾è¡¨çš„头结点 +typedef struct VNode { + VertexType data; // é¡¶ç‚¹ä¿¡æ¯ + ArcNode* firstarc; // 指å‘第一æ¡ä¾é™„该顶点的弧的指针 +} VNode; + +/* 图的邻接表存储表示类型定义 */ +typedef struct { + VNode vertices[MAX_VERTEX_NUM]; // 邻接表 + int vexnum, arcnum; // 图/网的顶点数和弧数 + GraphKind kind; // 图的类型标志 +} ALGraph; + + +// è¾¹/弧上是å¦å­˜åœ¨é™„åŠ ä¿¡æ¯ +extern Boolean IncInfo; + +// 与顶点一一对应的æ“作数与æ“作符 +extern char ops[MAX_VERTEX_NUM]; + + +/* + * 创建 + * + *ã€å¤‡æ³¨ã€‘ + * + * æ•™æä¸­é»˜è®¤ä»ŽæŽ§åˆ¶å°è¯»å–æ•°æ®ã€‚ + * 这里为了方便测试,é¿å…æ¯æ¬¡è¿è¡Œéƒ½æ‰‹åŠ¨è¾“å…¥æ•°æ®ï¼Œ + * 因而å…许选择从预设的文件pathä¸­è¯»å–æµ‹è¯•æ•°æ®ã€‚ + * + * 如果需è¦ä»ŽæŽ§åˆ¶å°è¯»å–æ•°æ®ï¼Œåˆ™path为NULL,或path[kind]为""。 + * 如果需è¦ä»Žæ–‡ä»¶ä¸­è¯»å–æ•°æ®ï¼Œåˆ™éœ€è¦åœ¨path中填写文件åä¿¡æ¯ã€‚ + */ +Status CreateGraph(ALGraph* G, char* path[]); + +/* + * 构造有å‘图 + */ +static Status CreateDG(ALGraph* G); + +/* + * 录入边/å¼§çš„ç›¸å…³é™„åŠ ä¿¡æ¯ + */ +static void Input(ALGraph G, InfoType** info); + +/* + * 查找 + * + * 返回顶点u在图/网中的ä½ç½® + */ +int LocateVex(ALGraph G, VertexType u); + +/* + * 构造一个边/弧结点(ä»…é™å†…部使用) + */ +static ArcNode* newArcNodePtr(int adjvex, ArcNode* nextarc, InfoType* info); + +/* + * æ’入边/å¼§ + * + * 如果当å‰å›¾/网是无å‘的,则æ’入一æ¡å¼§éœ€è¦å¢žåŠ ä¸¤ä¸ªé¡¶ç‚¹å…³ç³»ï¼Œä½†å¼§çš„æ•°é‡åªå¢žä¸€ã€‚ + * 对于图/网æ¥è¯´ï¼Œå¯ä»¥åœ¨å¯å˜å‚数中列出边/弧的附加信æ¯ã€‚ + * + * æ³¨ï¼šæ­¤å¤„æŽ¥æ”¶çš„å‚æ•°ä¸ŽMGraph有些ä¸ä¸€æ ·ï¼šç½‘的附加信æ¯ä¸­åŒ…å«äº†å„æ¡è¾¹/å¼§çš„æƒå€¼ã€‚ + */ +Status InsertArc(ALGraph* G, VertexType v, VertexType w, ...); + +/* + * 以图形化形å¼è¾“出当å‰ç»“æž„ + */ +void PrintGraph(ALGraph G); + +#endif diff --git a/CLion/ExerciseBook/07.38/CMakeLists.txt b/CLion/ExerciseBook/07.38/CMakeLists.txt new file mode 100644 index 0000000..f6ec6aa --- /dev/null +++ b/CLion/ExerciseBook/07.38/CMakeLists.txt @@ -0,0 +1,12 @@ +# 包å«å…¬å…±åº“ +include_directories(${CMAKE_SOURCE_DIR}/Status) + +# 生æˆå¯æ‰§è¡Œæ–‡ä»¶ +add_executable(07.38 SqList.h SqList.c ALGraph.h ALGraph.c 07.38.c) +# 链接公共库 +target_link_libraries(07.38 Scanf_lib) + +# è®°å½•è¦æ‹·è´åˆ°*.exeç›®å½•ä¸‹çš„èµ„æºæ–‡ä»¶ +file(GLOB TestData TestData*.txt) +# å°†èµ„æºæ–‡ä»¶æ‹·è´åˆ°*.exe目录下,ä¸ç„¶æ— æ³•加载 +file(COPY ${TestData} DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) diff --git a/CLion/ExerciseBook/07.38/SqList.c b/CLion/ExerciseBook/07.38/SqList.c new file mode 100644 index 0000000..266dbe7 --- /dev/null +++ b/CLion/ExerciseBook/07.38/SqList.c @@ -0,0 +1,114 @@ +/*============================= + * 线性表的顺åºå­˜å‚¨ç»“构(顺åºè¡¨ï¼‰ + * + * 包å«ç®—法: 2.3ã€2.4ã€2.5ã€2.6 + =============================*/ + +#include "SqList.h" + +/* + * ████████ 算法2.3 ████████ + * + * åˆå§‹åŒ– + * + * åˆå§‹åŒ–æˆåŠŸåˆ™è¿”å›žOK,å¦åˆ™è¿”回ERROR。 + */ +Status InitList(SqList* L) { + // åˆ†é…æŒ‡å®šå®¹é‡çš„内存,如果分é…失败,则返回NULL + (*L).elem = (ElemType*) malloc(LIST_INIT_SIZE * sizeof(ElemType)); + if((*L).elem == NULL) { + // 存储内存失败 + exit(OVERFLOW); + } + + (*L).length = 0; // åˆå§‹åŒ–顺åºè¡¨é•¿åº¦ä¸º0 + (*L).listsize = LIST_INIT_SIZE; // 顺åºè¡¨åˆå§‹å†…存分é…é‡ + + return OK; // åˆå§‹åŒ–æˆåŠŸ +} + +/* + * 计数 + * + * 返回顺åºè¡¨åŒ…å«çš„æœ‰æ•ˆå…ƒç´ çš„æ•°é‡ã€‚ + */ +int ListLength(SqList L) { + return L.length; +} + +/* + * å–值 + * + * 获å–顺åºè¡¨ä¸­ç¬¬i个元素,将其存储到e中。 + * 如果å¯ä»¥æ‰¾åˆ°ï¼Œè¿”回OK,å¦åˆ™ï¼Œè¿”回ERROR。 + * + *ã€å¤‡æ³¨ã€‘ + * æ•™æä¸­içš„å«ä¹‰æ˜¯å…ƒç´ ä½ç½®ï¼Œä»Ž1开始计数,但这ä¸ç¬¦åˆç¼–ç çš„通用约定。 + * 通常,içš„å«ä¹‰åº”该指索引,å³ä»Ž0开始计数。 + */ +Status GetElem(SqList L, int i, ElemType* e) { + // 因为içš„å«ä¹‰æ˜¯ä½ç½®ï¼Œæ‰€ä»¥å…¶åˆæ³•范围是:[1, length] + if(i < 1 || i > L.length) { + return ERROR; //i值ä¸åˆæ³• + } + + *e = L.elem[i - 1]; + + return OK; +} + +/* + * ████████ 算法2.4 ████████ + * + * æ’å…¥ + * + * å‘顺åºè¡¨ç¬¬i个ä½ç½®ä¸Šæ’å…¥e,æ’å…¥æˆåŠŸåˆ™è¿”å›žOK,å¦åˆ™è¿”回ERROR。 + * + *ã€å¤‡æ³¨ã€‘ + * æ•™æä¸­içš„å«ä¹‰æ˜¯å…ƒç´ ä½ç½®ï¼Œä»Ž1开始计数 + */ +Status ListInsert(SqList* L, int i, ElemType e) { + ElemType* newbase; + ElemType* p, * q; + + // ç¡®ä¿é¡ºåºè¡¨ç»“构存在 + if(L == NULL || (*L).elem == NULL) { + return ERROR; + } + + // i值越界 + if(i < 1 || i > (*L).length + 1) { + return ERROR; + } + + // 若存储空间已满,则增加新空间 + if((*L).length >= (*L).listsize) { + // 基于现有空间扩容 + newbase = (ElemType*) realloc((*L).elem, ((*L).listsize + LISTINCREMENT) * sizeof(ElemType)); + if(newbase == NULL) { + // 存储内存失败 + exit(OVERFLOW); + } + + // æ–°åŸºå€ + (*L).elem = newbase; + // 存的存储空间 + (*L).listsize += LISTINCREMENT; + } + + // q为æ’å…¥ä½ç½® + q = &(*L).elem[i - 1]; + + // 1.å³ç§»å…ƒç´ ï¼Œè…¾å‡ºä½ç½® + for(p = &(*L).elem[(*L).length - 1]; p >= q; --p) { + *(p + 1) = *p; + } + + // 2.æ’å…¥e + *q = e; + + // 3.表长增1 + (*L).length++; + + return OK; +} diff --git a/CLion/ExerciseBook/07.38/SqList.h b/CLion/ExerciseBook/07.38/SqList.h new file mode 100644 index 0000000..f0efa6c --- /dev/null +++ b/CLion/ExerciseBook/07.38/SqList.h @@ -0,0 +1,73 @@ +/*============================= + * 线性表的顺åºå­˜å‚¨ç»“构(顺åºè¡¨ï¼‰ + * + * 包å«ç®—法: 2.3ã€2.4ã€2.5ã€2.6 + =============================*/ + +#ifndef SQLIST_H +#define SQLIST_H + +#include +#include // æä¾›mallocã€reallocã€freeã€exit原型 +#include "Status.h" //**â–²01 绪论**// + +/* å®å®šä¹‰ */ +#define LIST_INIT_SIZE 100 // 顺åºè¡¨å­˜å‚¨ç©ºé—´çš„åˆå§‹åˆ†é…é‡ +#define LISTINCREMENT 10 // 顺åºè¡¨å­˜å‚¨ç©ºé—´çš„分é…å¢žé‡ + +/* 顺åºè¡¨å…ƒç´ ç±»åž‹å®šä¹‰ */ +typedef int ElemType; + +/* + * 顺åºè¡¨ç»“æž„ + * + * 注:elem在使用å‰éœ€è¦å…ˆä¸ºå…¶åˆ†é…内存,且元素从elem[0]处开始存储 + */ +typedef struct { + ElemType* elem; // 顺åºè¡¨å­˜å‚¨ç©ºé—´çš„基å€ï¼ˆæŒ‡å‘顺åºè¡¨æ‰€å å†…存的起始ä½ç½®ï¼‰ + int length; // 当å‰é¡ºåºè¡¨é•¿åº¦ï¼ˆåŒ…å«å¤šå°‘元素) + int listsize; // 当å‰åˆ†é…的存储容é‡ï¼ˆå¯ä»¥å­˜å‚¨å¤šå°‘元素) +} SqList; + + +/* + * ████████ 算法2.3 ████████ + * + * åˆå§‹åŒ– + * + * åˆå§‹åŒ–æˆåŠŸåˆ™è¿”å›žOK,å¦åˆ™è¿”回ERROR。 + */ +Status InitList(SqList* L); + +/* + * 计数 + * + * 返回顺åºè¡¨åŒ…å«çš„æœ‰æ•ˆå…ƒç´ çš„æ•°é‡ã€‚ + */ +int ListLength(SqList L); + +/* + * å–值 + * + * 获å–顺åºè¡¨ä¸­ç¬¬i个元素,将其存储到e中。 + * 如果å¯ä»¥æ‰¾åˆ°ï¼Œè¿”回OK,å¦åˆ™ï¼Œè¿”回ERROR。 + * + *ã€å¤‡æ³¨ã€‘ + * æ•™æä¸­içš„å«ä¹‰æ˜¯å…ƒç´ ä½ç½®ï¼Œä»Ž1开始计数,但这ä¸ç¬¦åˆç¼–ç çš„通用约定。 + * 通常,içš„å«ä¹‰åº”该指索引,å³ä»Ž0开始计数。 + */ +Status GetElem(SqList L, int i, ElemType* e); + +/* + * ████████ 算法2.4 ████████ + * + * æ’å…¥ + * + * å‘顺åºè¡¨ç¬¬i个ä½ç½®ä¸Šæ’å…¥e,æ’å…¥æˆåŠŸåˆ™è¿”å›žOK,å¦åˆ™è¿”回ERROR。 + * + *ã€å¤‡æ³¨ã€‘ + * æ•™æä¸­içš„å«ä¹‰æ˜¯å…ƒç´ ä½ç½®ï¼Œä»Ž1开始计数 + */ +Status ListInsert(SqList* L, int i, ElemType e); + +#endif diff --git a/CLion/ExerciseBook/07.38/TestData_DG.txt b/CLion/ExerciseBook/07.38/TestData_DG.txt new file mode 100644 index 0000000..3c5825f --- /dev/null +++ b/CLion/ExerciseBook/07.38/TestData_DG.txt @@ -0,0 +1,8 @@ +图类型→0(有å‘图) +顶点数→12 +弧数→14 +弧是å¦å¸¦æœ‰å…¶ä»–ä¿¡æ¯â†’0 +顶点集→ã€A,B,C,D,E,F,G,H,I,J,K,L】 +弧的集åˆâ†’ã€A,B】ã€A,D】ã€B,C】ã€B,D】ã€C,E】ã€C,F】ã€F,G】ã€D,G】ã€D,H】ã€E,I】ã€E,J】ã€F,J】ã€G,K】ã€G,L】 + +与顶点对应的æ“作数与æ“作符→ã€*,+,*,*,+,*,+,e,a,b,c,d】 \ No newline at end of file diff --git a/CLion/ExerciseBook/07.39/07.39.c b/CLion/ExerciseBook/07.39/07.39.c new file mode 100644 index 0000000..49fb611 --- /dev/null +++ b/CLion/ExerciseBook/07.39/07.39.c @@ -0,0 +1,80 @@ +#include +#include "SqList.h" +#include "BiTree.h" + +/* + * 获å–å­˜å‚¨åœ¨äºŒå‰æ ‘中的表达å¼çš„é€†æ³¢å…°å¼ + * + * 注:表达å¼ç»“æž„å‚è€ƒæ•™ææ’å›¾7.22 + */ +void Algo_7_39(BiTree T); + +/* + * ä»ŽäºŒå‰æ ‘的根结点出å‘èŽ·å–æ ‘中存储的表达å¼çš„逆波兰å¼ã€‚ + * 求å–的逆波兰å¼ä¼šå­˜å‚¨åœ¨RPN中。 + * + * 注:使用了åŽç»­é历 + */ +static void AntiPolandFormula_7_39(BiTree T, SqList* RPN); + + +int main(int argc, char* argv[]) { + BiTree T; + + printf("████████ 创建并打å°äºŒå‰æ ‘... \n"); + { + InitBiTree(&T); + CreateBiTree(&T, "TestData_Pre.txt"); + PrintTree(T); + printf("\n"); + } + + printf("████████ 求å–äºŒå‰æ ‘中存储的表达å¼çš„逆波兰å¼... \n"); + { + Algo_7_39(T); + printf("\n"); + } + + return 0; +} + + +/* + * 获å–å­˜å‚¨åœ¨äºŒå‰æ ‘中的表达å¼çš„é€†æ³¢å…°å¼ + * + * 注:表达å¼ç»“æž„å‚è€ƒæ•™ææ’å›¾7.23 + */ +void Algo_7_39(BiTree T) { + int i; + SqList RPN; // å­˜å‚¨é€†æ³¢å…°è¡¨è¾¾å¼ + ElemType e; + + // åˆå§‹åŒ–长度为0的线性表 + InitList(&RPN); + + // ä»Žæœ‰å‘æ— çŽ¯å›¾çš„æ ¹ç»“ç‚¹å‡ºå‘,通过尾递归获å–到其中存储的表达å¼çš„é€†æ³¢å…°å¼ + AntiPolandFormula_7_39(T, &RPN); + + for(i = 1; i <= ListLength(RPN); i++) { + GetElem(RPN, i, &e); + printf("%c", e); + } + printf("\n"); +} + +/* + * ä»ŽäºŒå‰æ ‘的根结点出å‘èŽ·å–æ ‘中存储的表达å¼çš„逆波兰å¼ã€‚ + * 求å–的逆波兰å¼ä¼šå­˜å‚¨åœ¨RPN中。 + * + * 注:使用了åŽç»­é历 + */ +void AntiPolandFormula_7_39(BiTree T, SqList* RPN) { + if(T == NULL) { + return; + } + + AntiPolandFormula_7_39(T->lchild, RPN); + AntiPolandFormula_7_39(T->rchild, RPN); + // 当没有孩å­ç»“点å¯é历时,存储当å‰ç»“点 + ListInsert(RPN, ListLength(*RPN) + 1, T->data); +} diff --git a/CLion/ExerciseBook/07.39/07.39.png b/CLion/ExerciseBook/07.39/07.39.png new file mode 100644 index 0000000000000000000000000000000000000000..382fc999e12140b954c07f046d694aa27e551ce1 GIT binary patch literal 23608 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 zlchild); // æ±‚å·¦å­æ ‘深度 + RD = BiTreeDepth(T->rchild); // 求å³å­æ ‘深度 + + return (LD >= RD ? LD : RD) + 1; + } +} + + +/*â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â” ä»…é™å†…部使用的函数 â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”*/ + +// åˆ›å»ºäºŒå‰æ ‘的内部函数 +static void CreateTree(BiTree* T, FILE* fp) { + char ch; + + // 读å–当å‰ç»“点的值 + if(fp == NULL) { + scanf("%c", &ch); + } else { + ReadData(fp, "%c", &ch); + } + + if(ch == '^') { + *T = NULL; + } else { + // ç”Ÿæˆæ ¹ç»“点 + *T = (BiTree) malloc(sizeof(BiTNode)); + if(!(*T)) { + exit(OVERFLOW); + } + (*T)->data = ch; + CreateTree(&((*T)->lchild), fp); // åˆ›å»ºå·¦å­æ ‘ + CreateTree(&((*T)->rchild), fp); // 创建å³å­æ ‘ + } +} + + +/*â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”┠图形化输出 â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”*/ + +// 以图形化形å¼è¾“出当å‰ç»“构,仅é™å†…部测试使用 +void PrintTree(BiTree T) { + int level, width; + int i, j, k, w; + int begin; + int distance; + TElemType** tmp; + LinkQueue Q; + BiTree e; + + // é‡åˆ°ç©ºæ ‘则无需继续计算 + if(BiTreeEmpty(T)) { + printf("\n"); + return; + } + + level = BiTreeDepth(T); // ï¼ˆå®Œå…¨ï¼‰äºŒå‰æ ‘结构高度 + width = (int)pow(2, level)-1; // ï¼ˆå®Œå…¨ï¼‰äºŒå‰æ ‘结构宽度 + + // 动æ€åˆ›å»ºè¡Œ + tmp = (TElemType**)malloc(level* sizeof(TElemType*)); + + // 动æ€åˆ›å»ºåˆ— + for(i = 0; i < level; i++) { + tmp[i] = (TElemType*)malloc(width* sizeof(TElemType)); + + // åˆå§‹åŒ–内存值为空字符 + memset(tmp[i], '\0', width); + } + + // 借助队列实现层åºé历 + InitQueue(&Q); + EnQueue(&Q, T); + + // é历树中所有元素,将其安排到二维数组tmp中åˆé€‚çš„ä½ç½® + for(i = 0; i < level; i++) { + w = (int) pow(2, i); // äºŒå‰æ ‘当å‰å±‚的宽度 + distance = width / w; // äºŒå‰æ ‘当å‰å±‚的元素间隔 + begin = width / (int) pow(2, i + 1); // äºŒå‰æ ‘当å‰å±‚首个元素之å‰çš„空格数 + + for(k = 0; k < w; k++) { + DeQueue(&Q, &e); + + if(e == NULL) { + EnQueue(&Q, NULL); + EnQueue(&Q, NULL); + } else { + j = begin + k * (1 + distance); + tmp[i][j] = e->data; + + // 左孩å­å…¥é˜Ÿ + EnQueue(&Q, e->lchild); + + // å³å­©å­å…¥é˜Ÿ + EnQueue(&Q, e->rchild); + } + } + } + + for(i = 0; i < level; i++) { + for(j = 0; j < width; j++) { + if(tmp[i][j] != '\0') { + printf("%c", tmp[i][j]); + } else { + printf(" "); + } + } + printf("\n"); + } +} diff --git a/CLion/ExerciseBook/07.39/BiTree.h b/CLion/ExerciseBook/07.39/BiTree.h new file mode 100644 index 0000000..3a4dcb7 --- /dev/null +++ b/CLion/ExerciseBook/07.39/BiTree.h @@ -0,0 +1,83 @@ +/*============================= + * äºŒå‰æ ‘的二å‰é“¾è¡¨å­˜å‚¨ç»“æž„ + * + * 包å«ç®—法: 6.1ã€6.2ã€6.3ã€6.4 + =============================*/ + +#ifndef BITREE_H +#define BITREE_H + +#include +#include // æä¾› mallocã€free 原型 +#include // æä¾› memsetã€strcmp 原型 +#include // æä¾› pow 原型 +#include "Status.h" //**â–²01 绪论**// + +/* äºŒå‰æ ‘元素类型定义,这里å‡è®¾å…¶å…ƒç´ ç±»åž‹ä¸ºchar */ +typedef char TElemType; + +/* äºŒå‰æ ‘结点定义 */ +typedef struct BiTNode { + TElemType data; // 结点元素 + struct BiTNode* lchild; // 左孩孿Œ‡é’ˆ + struct BiTNode* rchild; // å³å­©å­æŒ‡é’ˆ +} BiTNode; + +/* 指å‘äºŒå‰æ ‘结点的指针 */ +typedef BiTNode* BiTree; + + +/* + * åˆå§‹åŒ– + * + * æž„é€ ç©ºäºŒå‰æ ‘。 + */ +Status InitBiTree(BiTree* T); + +/* + * ████████ 算法6.4 ████████ + * + * 创建 + * + * 按照预设的定义æ¥åˆ›å»ºäºŒå‰æ ‘。 + * 这里约定使用ã€å…ˆåºåºåˆ—】æ¥åˆ›å»ºäºŒå‰æ ‘。 + * + * + *ã€å¤‡æ³¨ã€‘ + * + * æ•™æä¸­é»˜è®¤ä»ŽæŽ§åˆ¶å°è¯»å–æ•°æ®ã€‚ + * 这里为了方便测试,é¿å…æ¯æ¬¡è¿è¡Œéƒ½æ‰‹åŠ¨è¾“å…¥æ•°æ®ï¼Œ + * 因而å…许选择从预设的文件pathä¸­è¯»å–æµ‹è¯•æ•°æ®ã€‚ + * + * 如果需è¦ä»ŽæŽ§åˆ¶å°è¯»å–æ•°æ®ï¼Œåˆ™path为NULL或者为空串, + * 如果需è¦ä»Žæ–‡ä»¶ä¸­è¯»å–æ•°æ®ï¼Œåˆ™éœ€è¦åœ¨path中填写文件åä¿¡æ¯ã€‚ + */ +Status CreateBiTree(BiTree* T, char* path); + +/* + * 判空 + * + * åˆ¤æ–­äºŒå‰æ ‘是å¦ä¸ºç©ºæ ‘。 + */ +Status BiTreeEmpty(BiTree T); + +/* + * æ ‘æ·± + * + * è¿”å›žäºŒå‰æ ‘的深度(层数)。 + */ +int BiTreeDepth(BiTree T); + + +/*â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â” ä»…é™å†…部使用的函数 â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”*/ + +// åˆ›å»ºäºŒå‰æ ‘的内部函数 +static void CreateTree(BiTree* T, FILE* fp); + + +/*â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”┠图形化输出 â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”â”*/ + +// 以图形化形å¼è¾“出当å‰ç»“构,仅é™å†…部测试使用 +void PrintTree(BiTree T); + +#endif diff --git a/CLion/ExerciseBook/07.39/CMakeLists.txt b/CLion/ExerciseBook/07.39/CMakeLists.txt new file mode 100644 index 0000000..38a6f1d --- /dev/null +++ b/CLion/ExerciseBook/07.39/CMakeLists.txt @@ -0,0 +1,12 @@ +# 包å«å…¬å…±åº“ +include_directories(${CMAKE_SOURCE_DIR}/Status) + +# 生æˆå¯æ‰§è¡Œæ–‡ä»¶ +add_executable(07.39 SqList.h SqList.c LinkQueue.h LinkQueue.c BiTree.h BiTree.c 07.39.c) +# 链接公共库 +target_link_libraries(07.39 Scanf_lib) + +# è®°å½•è¦æ‹·è´åˆ°*.exeç›®å½•ä¸‹çš„èµ„æºæ–‡ä»¶ +file(GLOB TestData TestData*.txt) +# å°†èµ„æºæ–‡ä»¶æ‹·è´åˆ°*.exe目录下,ä¸ç„¶æ— æ³•加载 +file(COPY ${TestData} DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) diff --git a/CLion/ExerciseBook/07.39/LinkQueue.c b/CLion/ExerciseBook/07.39/LinkQueue.c new file mode 100644 index 0000000..d4e8d40 --- /dev/null +++ b/CLion/ExerciseBook/07.39/LinkQueue.c @@ -0,0 +1,102 @@ +/*========================= + * 队列的链å¼å­˜å‚¨ç»“构(链队) + ==========================*/ + +#ifndef LINKQUEUE_C +#define LINKQUEUE_C + +#include "LinkQueue.h" //**â–²03 栈和队列**// + +/* + * åˆå§‹åŒ– + * + * 构造一个空的链队。 + * åˆå§‹åŒ–æˆåŠŸåˆ™è¿”å›žOK,å¦åˆ™è¿”回ERROR。 + * + *ã€æ³¨ã€‘ + * 这里的队列带有头结点 + */ +Status InitQueue(LinkQueue* Q) { + if(Q == NULL) { + return ERROR; + } + + (*Q).front = (*Q).rear = (QueuePtr) malloc(sizeof(QNode)); + if(!(*Q).front) { + exit(OVERFLOW); + } + + (*Q).front->next = NULL; + + return OK; +} + +/* + * 判空 + * + * 判断链队中是å¦åŒ…嫿œ‰æ•ˆæ•°æ®ã€‚ + * + * 返回值: + * TRUE : 链队为空 + * FALSE: 链队ä¸ä¸ºç©º + */ +Status QueueEmpty(LinkQueue Q) { + if(Q.front == Q.rear) { + return TRUE; + } else { + return FALSE; + } +} + +/* + * 入队 + * + * 将元素e添加到队列尾部。 + */ +Status EnQueue(LinkQueue* Q, QElemType e) { + QueuePtr p; + + if(Q == NULL || (*Q).front == NULL) { + return ERROR; + } + + p = (QueuePtr) malloc(sizeof(QNode)); + if(!p) { + exit(OVERFLOW); + } + + p->data = e; + p->next = NULL; + + (*Q).rear->next = p; + (*Q).rear = p; + + return OK; +} + +/* + * 出队 + * + * 移除队列头部的元素,将其存储到e中。 + */ +Status DeQueue(LinkQueue* Q, QElemType* e) { + QueuePtr p; + + if(Q == NULL || (*Q).front == NULL || (*Q).front == (*Q).rear) { + return ERROR; + } + + p = (*Q).front->next; + *e = p->data; + + (*Q).front->next = p->next; + if((*Q).rear == p) { + (*Q).rear = (*Q).front; + } + + free(p); + + return OK; +} + +#endif diff --git a/CLion/ExerciseBook/07.39/LinkQueue.h b/CLion/ExerciseBook/07.39/LinkQueue.h new file mode 100644 index 0000000..04cc75a --- /dev/null +++ b/CLion/ExerciseBook/07.39/LinkQueue.h @@ -0,0 +1,65 @@ +/*========================= + * 队列的链å¼å­˜å‚¨ç»“构(链队) + ==========================*/ + +#ifndef LINKQUEUE_H +#define LINKQUEUE_H + +#include +#include // æä¾›mallocã€reallocã€freeã€exit原型 +#include "Status.h" //**â–²01 绪论**// +#include "BiTree.h" //**â–²06 æ ‘å’ŒäºŒå‰æ ‘**// + +/* 链队元素类型定义 */ +typedef BiTree QElemType; + +// 队列元素结构 +typedef struct QNode { + QElemType data; + struct QNode* next; +} QNode, * QueuePtr; + +// 队列结构 +typedef struct { + QueuePtr front; // 队头指针 + QueuePtr rear; // 队尾指针 +} LinkQueue; // 队列的链å¼å­˜å‚¨è¡¨ç¤º + + +/* + * åˆå§‹åŒ– + * + * 构造一个空的链队。 + * åˆå§‹åŒ–æˆåŠŸåˆ™è¿”å›žOK,å¦åˆ™è¿”回ERROR。 + * + *ã€æ³¨ã€‘ + * 这里的队列带有头结点 + */ +Status InitQueue(LinkQueue* Q); + +/* + * 判空 + * + * 判断链队中是å¦åŒ…嫿œ‰æ•ˆæ•°æ®ã€‚ + * + * 返回值: + * TRUE : 链队为空 + * FALSE: 链队ä¸ä¸ºç©º + */ +Status QueueEmpty(LinkQueue Q); + +/* + * 入队 + * + * 将元素e添加到队列尾部。 + */ +Status EnQueue(LinkQueue* Q, QElemType e); + +/* + * 出队 + * + * 移除队列头部的元素,将其存储到e中。 + */ +Status DeQueue(LinkQueue* Q, QElemType* e); + +#endif diff --git a/CLion/ExerciseBook/07.39/SqList.c b/CLion/ExerciseBook/07.39/SqList.c new file mode 100644 index 0000000..266dbe7 --- /dev/null +++ b/CLion/ExerciseBook/07.39/SqList.c @@ -0,0 +1,114 @@ +/*============================= + * 线性表的顺åºå­˜å‚¨ç»“构(顺åºè¡¨ï¼‰ + * + * 包å«ç®—法: 2.3ã€2.4ã€2.5ã€2.6 + =============================*/ + +#include "SqList.h" + +/* + * ████████ 算法2.3 ████████ + * + * åˆå§‹åŒ– + * + * åˆå§‹åŒ–æˆåŠŸåˆ™è¿”å›žOK,å¦åˆ™è¿”回ERROR。 + */ +Status InitList(SqList* L) { + // åˆ†é…æŒ‡å®šå®¹é‡çš„内存,如果分é…失败,则返回NULL + (*L).elem = (ElemType*) malloc(LIST_INIT_SIZE * sizeof(ElemType)); + if((*L).elem == NULL) { + // 存储内存失败 + exit(OVERFLOW); + } + + (*L).length = 0; // åˆå§‹åŒ–顺åºè¡¨é•¿åº¦ä¸º0 + (*L).listsize = LIST_INIT_SIZE; // 顺åºè¡¨åˆå§‹å†…存分é…é‡ + + return OK; // åˆå§‹åŒ–æˆåŠŸ +} + +/* + * 计数 + * + * 返回顺åºè¡¨åŒ…å«çš„æœ‰æ•ˆå…ƒç´ çš„æ•°é‡ã€‚ + */ +int ListLength(SqList L) { + return L.length; +} + +/* + * å–值 + * + * 获å–顺åºè¡¨ä¸­ç¬¬i个元素,将其存储到e中。 + * 如果å¯ä»¥æ‰¾åˆ°ï¼Œè¿”回OK,å¦åˆ™ï¼Œè¿”回ERROR。 + * + *ã€å¤‡æ³¨ã€‘ + * æ•™æä¸­içš„å«ä¹‰æ˜¯å…ƒç´ ä½ç½®ï¼Œä»Ž1开始计数,但这ä¸ç¬¦åˆç¼–ç çš„通用约定。 + * 通常,içš„å«ä¹‰åº”该指索引,å³ä»Ž0开始计数。 + */ +Status GetElem(SqList L, int i, ElemType* e) { + // 因为içš„å«ä¹‰æ˜¯ä½ç½®ï¼Œæ‰€ä»¥å…¶åˆæ³•范围是:[1, length] + if(i < 1 || i > L.length) { + return ERROR; //i值ä¸åˆæ³• + } + + *e = L.elem[i - 1]; + + return OK; +} + +/* + * ████████ 算法2.4 ████████ + * + * æ’å…¥ + * + * å‘顺åºè¡¨ç¬¬i个ä½ç½®ä¸Šæ’å…¥e,æ’å…¥æˆåŠŸåˆ™è¿”å›žOK,å¦åˆ™è¿”回ERROR。 + * + *ã€å¤‡æ³¨ã€‘ + * æ•™æä¸­içš„å«ä¹‰æ˜¯å…ƒç´ ä½ç½®ï¼Œä»Ž1开始计数 + */ +Status ListInsert(SqList* L, int i, ElemType e) { + ElemType* newbase; + ElemType* p, * q; + + // ç¡®ä¿é¡ºåºè¡¨ç»“构存在 + if(L == NULL || (*L).elem == NULL) { + return ERROR; + } + + // i值越界 + if(i < 1 || i > (*L).length + 1) { + return ERROR; + } + + // 若存储空间已满,则增加新空间 + if((*L).length >= (*L).listsize) { + // 基于现有空间扩容 + newbase = (ElemType*) realloc((*L).elem, ((*L).listsize + LISTINCREMENT) * sizeof(ElemType)); + if(newbase == NULL) { + // 存储内存失败 + exit(OVERFLOW); + } + + // æ–°åŸºå€ + (*L).elem = newbase; + // 存的存储空间 + (*L).listsize += LISTINCREMENT; + } + + // q为æ’å…¥ä½ç½® + q = &(*L).elem[i - 1]; + + // 1.å³ç§»å…ƒç´ ï¼Œè…¾å‡ºä½ç½® + for(p = &(*L).elem[(*L).length - 1]; p >= q; --p) { + *(p + 1) = *p; + } + + // 2.æ’å…¥e + *q = e; + + // 3.表长增1 + (*L).length++; + + return OK; +} diff --git a/CLion/ExerciseBook/07.39/SqList.h b/CLion/ExerciseBook/07.39/SqList.h new file mode 100644 index 0000000..f0efa6c --- /dev/null +++ b/CLion/ExerciseBook/07.39/SqList.h @@ -0,0 +1,73 @@ +/*============================= + * 线性表的顺åºå­˜å‚¨ç»“构(顺åºè¡¨ï¼‰ + * + * 包å«ç®—法: 2.3ã€2.4ã€2.5ã€2.6 + =============================*/ + +#ifndef SQLIST_H +#define SQLIST_H + +#include +#include // æä¾›mallocã€reallocã€freeã€exit原型 +#include "Status.h" //**â–²01 绪论**// + +/* å®å®šä¹‰ */ +#define LIST_INIT_SIZE 100 // 顺åºè¡¨å­˜å‚¨ç©ºé—´çš„åˆå§‹åˆ†é…é‡ +#define LISTINCREMENT 10 // 顺åºè¡¨å­˜å‚¨ç©ºé—´çš„分é…å¢žé‡ + +/* 顺åºè¡¨å…ƒç´ ç±»åž‹å®šä¹‰ */ +typedef int ElemType; + +/* + * 顺åºè¡¨ç»“æž„ + * + * 注:elem在使用å‰éœ€è¦å…ˆä¸ºå…¶åˆ†é…内存,且元素从elem[0]处开始存储 + */ +typedef struct { + ElemType* elem; // 顺åºè¡¨å­˜å‚¨ç©ºé—´çš„基å€ï¼ˆæŒ‡å‘顺åºè¡¨æ‰€å å†…存的起始ä½ç½®ï¼‰ + int length; // 当å‰é¡ºåºè¡¨é•¿åº¦ï¼ˆåŒ…å«å¤šå°‘元素) + int listsize; // 当å‰åˆ†é…的存储容é‡ï¼ˆå¯ä»¥å­˜å‚¨å¤šå°‘元素) +} SqList; + + +/* + * ████████ 算法2.3 ████████ + * + * åˆå§‹åŒ– + * + * åˆå§‹åŒ–æˆåŠŸåˆ™è¿”å›žOK,å¦åˆ™è¿”回ERROR。 + */ +Status InitList(SqList* L); + +/* + * 计数 + * + * 返回顺åºè¡¨åŒ…å«çš„æœ‰æ•ˆå…ƒç´ çš„æ•°é‡ã€‚ + */ +int ListLength(SqList L); + +/* + * å–值 + * + * 获å–顺åºè¡¨ä¸­ç¬¬i个元素,将其存储到e中。 + * 如果å¯ä»¥æ‰¾åˆ°ï¼Œè¿”回OK,å¦åˆ™ï¼Œè¿”回ERROR。 + * + *ã€å¤‡æ³¨ã€‘ + * æ•™æä¸­içš„å«ä¹‰æ˜¯å…ƒç´ ä½ç½®ï¼Œä»Ž1开始计数,但这ä¸ç¬¦åˆç¼–ç çš„通用约定。 + * 通常,içš„å«ä¹‰åº”该指索引,å³ä»Ž0开始计数。 + */ +Status GetElem(SqList L, int i, ElemType* e); + +/* + * ████████ 算法2.4 ████████ + * + * æ’å…¥ + * + * å‘顺åºè¡¨ç¬¬i个ä½ç½®ä¸Šæ’å…¥e,æ’å…¥æˆåŠŸåˆ™è¿”å›žOK,å¦åˆ™è¿”回ERROR。 + * + *ã€å¤‡æ³¨ã€‘ + * æ•™æä¸­içš„å«ä¹‰æ˜¯å…ƒç´ ä½ç½®ï¼Œä»Ž1开始计数 + */ +Status ListInsert(SqList* L, int i, ElemType e); + +#endif diff --git a/CLion/ExerciseBook/07.39/TestData_Pre.txt b/CLion/ExerciseBook/07.39/TestData_Pre.txt new file mode 100644 index 0000000..dede480 --- /dev/null +++ b/CLion/ExerciseBook/07.39/TestData_Pre.txt @@ -0,0 +1 @@ +å…ˆåºåºåˆ—(æœä¸Šçš„三角代表空结点):*+*+a^^b^^*b^^+c^^d^^*+c^^d^^e^^*+c^^d^^e^^ \ No newline at end of file diff --git a/CLion/ExerciseBook/07.40/07.40.c b/CLion/ExerciseBook/07.40/07.40.c new file mode 100644 index 0000000..f0a3266 --- /dev/null +++ b/CLion/ExerciseBook/07.40/07.40.c @@ -0,0 +1,193 @@ +#include +#include +#include "SqList.h" +#include "ALGraph.h" + +/* + * 获å–å­˜å‚¨åœ¨æœ‰å‘æ— çŽ¯å›¾ä¸­çš„è¡¨è¾¾å¼çš„é€†æ³¢å…°å¼ + * + * 注:表达å¼ç»“æž„å‚è€ƒæ•™ææ’å›¾7.23 + */ +void Algo_7_40(ALGraph G, SqList* RPN); + +/* + * 从顶点v出å‘èŽ·å–æœ‰å‘图中存储的表达å¼çš„逆波兰å¼ã€‚ + * 求å–的逆波兰å¼ä¼šå­˜å‚¨åœ¨RPN中。 + */ +static void AntiPolandFormula_7_40(ALGraph G, int v, SqList* RPN); + +/* + * 计算逆波兰å¼çš„值 + */ +int Evaluation_7_40(SqList RPN); + + +int main(int argc, char* argv[]) { + ALGraph G; + SqList RPN; // å­˜å‚¨é€†æ³¢å…°è¡¨è¾¾å¼ + + printf("████████ åˆ›å»ºå¹¶æ‰“å°æœ‰å‘网... \n"); + { + char* path[4]; + + path[0] = "TestData_DG.txt"; + path[1] = ""; + path[2] = ""; + path[3] = ""; + + CreateGraph(&G, path); + PrintGraph(G); + printf("\n"); + } + + printf("████████ æ±‚å–æœ‰å‘网中存储的表达å¼çš„逆波兰å¼... \n"); + { + Algo_7_40(G, &RPN); + printf("\n"); + } + + printf("████████ 计算逆波兰å¼çš„值... \n"); + { + printf("计算上述逆波兰å¼çš„值为:%d\n", Evaluation_7_40(RPN)); + printf("\n"); + } + + return 0; +} + + +/* + * 获å–å­˜å‚¨åœ¨æœ‰å‘æ— çŽ¯å›¾ä¸­çš„è¡¨è¾¾å¼çš„é€†æ³¢å…°å¼ + * + * 注:表达å¼ç»“æž„å‚è€ƒæ•™ææ’å›¾7.23 + */ +void Algo_7_40(ALGraph G, SqList* RPN) { + int i, root; + int indegree[MAX_VERTEX_NUM]; // æ‰€æœ‰é¡¶ç‚¹çš„å…¥åº¦ä¿¡æ¯ + ArcNode* p; + ElemType e; + + // åˆå§‹åŒ–所有顶点的入度为0 + for(i = 0; i < G.vexnum; i++) { + indegree[i] = 0; + } + + // é历所有顶点 + for(i = 0; i < G.vexnum; i++) { + // 指å‘该顶点的首个邻接点 + p = G.vertices[i].firstarc; + + // é历该顶点的所有邻接点,统计å„顶点的入度 + while(p != NULL) { + indegree[p->adjvex]++; + p = p->nextarc; + } + } + + // 查找到根结点 + for(i = 0; i < G.vexnum; i++) { + if(indegree[i] == 0) { + root = i; + break; + } + } + + // åˆå§‹åŒ–长度为0的线性表 + InitList(RPN); + + // ä»Žæœ‰å‘æ— çŽ¯å›¾çš„æ ¹ç»“ç‚¹å‡ºå‘,通过尾递归获å–到其中存储的表达å¼çš„é€†æ³¢å…°å¼ + AntiPolandFormula_7_40(G, root, RPN); + + // è¾“å‡ºé€†æ³¢å…°å¼ + for(i = 1; i <= ListLength(*RPN); i++) { + GetElem(*RPN, i, &e); + + if(e.type == Operand) { + printf("%d ", e.op); // æ“作数 + } else { + printf("%c ", e.op); // æ“作符 + } + } + printf("\n"); +} + +/* + * 从顶点v出å‘èŽ·å–æœ‰å‘图中存储的表达å¼çš„逆波兰å¼ã€‚ + * 求å–的逆波兰å¼ä¼šå­˜å‚¨åœ¨RPN中。 + */ +void AntiPolandFormula_7_40(ALGraph G, int v, SqList* RPN) { + ArcNode* r; + Vertex vex; + + // å…ˆé历邻接点 + for(r = G.vertices[v].firstarc; r != NULL; r = r->nextarc) { + AntiPolandFormula_7_40(G, r->adjvex, RPN); + } + + // èŽ·å–æ“作符/æ“作数 + vex = G.vertices[v].context; + + // 当没有邻接点å¯é历时,存储该顶点 + ListInsert(RPN, ListLength(*RPN) + 1, vex); +} + +/* + * 计算逆波兰å¼çš„值,如果å‘生错误,返回INT_MIN。 + */ +int Evaluation_7_40(SqList RPN) { + int stack[MAX_VERTEX_NUM]; // 模拟一个栈,用æ¥å­˜å‚¨è¡¨è¾¾å¼çš„计算结果 + int top = 0; // 栈顶游标 + int a, b; + ElemType e; + int i; + Boolean hasError = FALSE; // 计算过程中出现了错误 + + for(i = 1; i <= ListLength(RPN) && !hasError; i++) { + GetElem(RPN, i, &e); + + // æ“作数 + if(e.type == Operand) { + stack[top++] = e.op; + + // æ“作符 + } else { + if(top > 0) { + b = stack[--top]; + } else { + return INT_MIN; + } + + if(top > 0) { + a = stack[--top]; + } else { + return INT_MIN; + } + + switch(e.op) { + case '+': + stack[top++] = a + b; + break; + case '-': + stack[top++] = a - b; + break; + case '*': + stack[top++] = a * b; + break; + case '/': + stack[top++] = a / b; + break; + default: + printf("无法识别的æ“作符:%c\n", e.op); + hasError = TRUE; + break; + } + } + } + + // 栈中最åŽåªåº”该剩一个值 + if(hasError || top != 1) { + return INT_MIN; + } + + return stack[0]; +} diff --git a/CLion/ExerciseBook/07.40/07.40.png b/CLion/ExerciseBook/07.40/07.40.png new file mode 100644 index 0000000000000000000000000000000000000000..635f7db6052dc2e508bf9a201c23fb136629d8fe GIT binary patch literal 28101 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 + InsertArc(G, v1, v2, info); + } + + + + /* 添加下é¢ä»£ç ï¼Œä»¥åº”对修改åŽçš„结构 */ + + // 录入顶点对应的æ“作符/æ“作数 + if(fp == NULL) { + printf("请为å„顶点录入æ“作符/æ“作数信æ¯ï¼š\n"); + printf(" 如果顶点是æ“作符,示范输入为:0 +\n"); + printf(" 如果顶点是æ“作数,示范输入为:1 12\n"); + for(i = 0; i < vexnum; i++) { + printf("请输入顶点 %c 对应的数æ®ä¿¡æ¯ï¼š", G->vertices[i].data); + + // 跳过空白,寻找下一个"å¯è¯»"ç¬¦å· + skipBlank(stdin); + scanf("%d", &type); + + // æ“作符 + if(type == 0) { + (*G).vertices[i].context.type = Operator; + scanf("%c", &o); + (*G).vertices[i].context.op = o; + } else if(type == 1) { + (*G).vertices[i].context.type = Operand; + scanf("%d", &((*G).vertices[i].context.op)); + } else { + printf("无法识别的顶点数æ®...\n"); + return ERROR; + } + } + } else { + for(i = 0; i < vexnum; i++) { + // 跳过空白,寻找下一个"å¯è¯»"ç¬¦å· + skipBlank(fp); + ReadData(fp, "%d", &type); + + // æ“作符 + if(type == 0) { + (*G).vertices[i].context.type = Operator; + ReadData(fp, "%c", &o); + (*G).vertices[i].context.op = o; + } else if(type == 1) { + (*G).vertices[i].context.type = Operand; + ReadData(fp, "%d", &((*G).vertices[i].context.op)); + } else { + printf("无法识别的顶点数æ®...\n"); + return ERROR; + } + } + } + + // ä»Žæ–‡ä»¶ä¸­è¯»å–æ•°æ®æ—¶ï¼Œæœ€åŽå…¶å®žåº”当判断一下是å¦è¯»åˆ°äº†è¶³å¤Ÿçš„ä¿¡æ¯ + return OK; +} + +/* + * 录入边/å¼§çš„ç›¸å…³é™„åŠ ä¿¡æ¯ + */ +static void Input(ALGraph G, InfoType** info) { + int weight; + + // 在"网"的情形下需è¦å½•å…¥æƒå€¼ä¿¡æ¯ + if(G.kind == DN || G.kind == UDN) { + *info = (InfoType*) malloc(sizeof(InfoType)); + + if(fp == NULL) { + scanf("%d", &weight); + } else { + ReadData(fp, "%d", &weight); + } + + (*info)->weight = weight; + } +} + +/* + * 查找 + * + * 返回顶点u在图/网中的ä½ç½® + */ +int LocateVex(ALGraph G, VertexType u) { + int i; + + for(i = 0; i < G.vexnum; i++) { + if(G.vertices[i].data == u) { + return i; + } + } + + return -1; +} + +/* + * 构造一个边/弧结点(ä»…é™å†…部使用) + */ +static ArcNode* newArcNodePtr(int adjvex, ArcNode* nextarc, InfoType* info) { + ArcNode* p = (ArcNode*) malloc(sizeof(ArcNode)); + if(!p) { + exit(OVERFLOW); + } + + p->adjvex = adjvex; + + p->nextarc = nextarc; + + p->info = info; + + return p; +} + +/* + * æ’入边/å¼§ + * + * 如果当å‰å›¾/网是无å‘的,则æ’入一æ¡å¼§éœ€è¦å¢žåŠ ä¸¤ä¸ªé¡¶ç‚¹å…³ç³»ï¼Œä½†å¼§çš„æ•°é‡åªå¢žä¸€ã€‚ + * 对于图/网æ¥è¯´ï¼Œå¯ä»¥åœ¨å¯å˜å‚数中列出边/弧的附加信æ¯ã€‚ + * + * æ³¨ï¼šæ­¤å¤„æŽ¥æ”¶çš„å‚æ•°ä¸ŽMGraph有些ä¸ä¸€æ ·ï¼šç½‘的附加信æ¯ä¸­åŒ…å«äº†å„æ¡è¾¹/å¼§çš„æƒå€¼ã€‚ + */ +Status InsertArc(ALGraph* G, VertexType v, VertexType w, ...) { + int tail, head, k, count; + ArcNode* r; + ArcNode* pre; + Boolean overlay = FALSE; // 是å¦ä¸ºè¦†ç›–添加 + InfoType* info = NULL; // è¾¹/å¼§çš„é™„åŠ ä¿¡æ¯ + va_list ap; + + tail = LocateVex(*G, v); // 获å–顶点v在顶点集中的ä½ç½® + if(tail == -1) { + return ERROR; // 指定的顶点ä¸å­˜åœ¨ + } + + head = LocateVex(*G, w); // 获å–顶点w在顶点集中的ä½ç½® + if(head == -1) { + return ERROR; // 指定的顶点ä¸å­˜åœ¨ + } + + // æ‹’ç»çޝ + if(tail == head) { + return ERROR; + } + + // 如果边/å¼§ä¸Šå­˜åœ¨é™„åŠ ä¿¡æ¯ + if(IncInfo) { + va_start(ap, w); // 在wåŽæŸ¥è¯¢é¦–个å¯å˜å‚æ•° + info = va_arg(ap, InfoType*); // 获å–é™„åŠ ä¿¡æ¯ + va_end(ap); + } + + /* 接下æ¥ï¼Œéœ€è¦æŸ¥æ‰¾åˆé€‚çš„æ’å…¥ä½ç½® */ + + for(count = 0; count < 2; count++) { + pre = NULL; + // 指å‘以tail为尾的首æ¡è¾¹/å¼§ + r = G->vertices[tail].firstarc; + while(r != NULL && r->adjvex < head) { + pre = r; + r = r->nextarc; + } + + // é‡åˆ°äº†ç›¸åŒä½ç½®çš„结点 + if(r != NULL && r->adjvex == head) { + r->info = info; // å¤ç”¨è¯¥ç»“点 + overlay = TRUE; // å‘生了覆盖 + } else { + if(pre == NULL) { + G->vertices[tail].firstarc = newArcNodePtr(head, r, info); + } else { + pre->nextarc = newArcNodePtr(head, r, info); + } + } + + // 如果当å‰å›¾/网是无å‘的,需è¦è€ƒè™‘对称性 + if((G->kind == UDG || G->kind == UDN) && tail != head) { + // 颠倒iå’Œj + k = tail; + tail = head; + head = k; + } else { + break; // 如果是有å‘的,å¯ä»¥ç»“æŸäº† + } + } + + // 在éžè¦†ç›–的情形下,æ‰è€ƒè™‘æ›´æ–°è¾¹/å¼§çš„æ•°é‡ + if(!overlay) { + (*G).arcnum++; // ä¸è®ºæœ‰å‘æ— å‘,边/å¼§æ•°åªå¢žä¸€ + } + + return OK; +} + +/* + * 以图形化形å¼è¾“出当å‰ç»“æž„ + */ +void PrintGraph(ALGraph G) { + int i; + ArcNode* p; + + if(G.vexnum == 0) { + printf("空图,无需打å°ï¼\n"); + return; + } + + printf("当å‰å›¾/ç½‘åŒ…å« %2d 个顶点, %2d æ¡è¾¹/å¼§...\n", G.vexnum, G.arcnum); + + for(i = 0; i < G.vexnum; i++) { + printf("%c ===> ", G.vertices[i].data); + + p = G.vertices[i].firstarc; + while(p != NULL) { + if(IncInfo == 0) { + printf("%c ", G.vertices[p->adjvex].data); + + // 对于网,会从其附加信æ¯ä¸­èŽ·å–到æƒå€¼ + } else { + printf("%c[%2d] ", G.vertices[p->adjvex].data, p->info->weight); + } + + p = p->nextarc; + + if(p != NULL) { + printf("- "); + } + } + + printf("\n"); + } +} diff --git a/CLion/ExerciseBook/07.40/ALGraph.h b/CLion/ExerciseBook/07.40/ALGraph.h new file mode 100644 index 0000000..df26103 --- /dev/null +++ b/CLion/ExerciseBook/07.40/ALGraph.h @@ -0,0 +1,141 @@ +/*================== + * 图的邻接表存储表示 + ===================*/ + +#ifndef ALGRAPH_H +#define ALGRAPH_H + +#include +#include // æä¾›memsetã€strcmp 原型 +#include // æä¾›å®va_listã€va_startã€va_argã€va_end +#include // æä¾›mallocã€reallocã€freeã€exit原型 +#include "Status.h" //**â–²01 绪论**// + +/* + * 注: + * + * 通常æ¥è®²ï¼Œæ— æƒå›¾è¢«ç®€ç§°ä¸ºã€å›¾ã€‘,有æƒå›¾è¢«ç®€ç§°ä¸ºã€ç½‘】。 + * æ— å‘图/网中的顶点关系被称为ã€è¾¹ã€‘,有å‘图/网中的顶点关系被称为ã€å¼§ã€‘,并区分弧头与弧尾。 + * 实际表述中,未必会严格éµå®ˆä»¥ä¸Šå‘½å。 + * + * 当å‰ç»“构适åˆå­˜å‚¨è¾¹/弧比较稀ç–的图/网。 + * + * ★ æ’入边/å¼§çš„ä¿¡æ¯æ—¶ï¼Œè¿™é‡Œçš„实现是按"å‡åº"æ’入的,这使得æ’入的弧是按"å‡åº"排列的。 + */ + + +/* å®å®šä¹‰ */ +#define MAX_VERTEX_NUM 26 // 最大顶点个数 + + +// 图的类型 +typedef enum { + DG, // 0-有å‘图 + DN, // 1-有å‘网(带æƒå€¼) + UDG, // 2-æ— å‘图 + UDN // 3-æ— å‘网(带æƒå€¼) +} GraphKind; + +// 顶点的数æ®ç±»åž‹ +typedef enum { + Operator, // æ“作符,用字符表示,但å¯ä»¥å­˜å‚¨åˆ°æ•´åž‹ä¸­ + Operand // æ“ä½œæ•°ï¼Œç”¨æ•´æ•°è¡¨ç¤ºï¼Œå¦‚æžœå°†æ¥æ‰©å……到浮点数,å¯ä»¥ç»Ÿä¸€ä½¿ç”¨æµ®ç‚¹åž‹å­˜å‚¨ +} Type; + +// 顶点编å·ç±»åž‹ +typedef char VertexType; + +// é¡¶ç‚¹å­˜å‚¨çš„æ•°æ® +typedef struct Vertex { + Type type; // 指示当å‰é¡¶ç‚¹æ˜¯æ“作符还是æ“作数 + int op; // 存储当å‰é¡¶ç‚¹å¯¹åº”çš„æ“作符/æ“作数 +} Vertex; + +// è¾¹/å¼§çš„ç›¸å…³é™„åŠ ä¿¡æ¯ +typedef struct { + /* + * 注: + * æ•™æä¸­ç»™å‡ºçš„结构åªè€ƒè™‘了无æƒå›¾ï¼Œè€Œæ²¡è€ƒè™‘有æƒå›¾(网)。 + * 这里为了把“网â€çš„æƒ…形也考虑进去,特在附加信æ¯ä¸­å¢žåŠ äº†"æƒé‡"属性。 + */ + int weight; +} InfoType; + +/* è¾¹/弧结点 */ +typedef struct ArcNode { + int adjvex; // 该弧所指å‘的顶点的ä½ç½® + struct ArcNode* nextarc; // 指å‘下一æ¡å¼§çš„æŒ‡é’ˆ + InfoType* info; // 弧的附加信æ¯ï¼Œé€šå¸¸å¿½ç•¥ +} ArcNode; + +// æ¯ä¸ªé“¾è¡¨çš„头结点 +typedef struct VNode { + VertexType data; // é¡¶ç‚¹ä¿¡æ¯ + Vertex context; // 与该顶点对应的æ“作符/æ“作数 + ArcNode* firstarc; // 指å‘第一æ¡ä¾é™„该顶点的弧的指针 +} VNode; + +/* 图的邻接表存储表示类型定义 */ +typedef struct { + VNode vertices[MAX_VERTEX_NUM]; // 邻接表 + int vexnum, arcnum; // 图/网的顶点数和弧数 + GraphKind kind; // 图的类型标志 +} ALGraph; + + +// è¾¹/弧上是å¦å­˜åœ¨é™„åŠ ä¿¡æ¯ +extern Boolean IncInfo; + + +/* + * 创建 + * + *ã€å¤‡æ³¨ã€‘ + * + * æ•™æä¸­é»˜è®¤ä»ŽæŽ§åˆ¶å°è¯»å–æ•°æ®ã€‚ + * 这里为了方便测试,é¿å…æ¯æ¬¡è¿è¡Œéƒ½æ‰‹åŠ¨è¾“å…¥æ•°æ®ï¼Œ + * 因而å…许选择从预设的文件pathä¸­è¯»å–æµ‹è¯•æ•°æ®ã€‚ + * + * 如果需è¦ä»ŽæŽ§åˆ¶å°è¯»å–æ•°æ®ï¼Œåˆ™path为NULL,或path[kind]为""。 + * 如果需è¦ä»Žæ–‡ä»¶ä¸­è¯»å–æ•°æ®ï¼Œåˆ™éœ€è¦åœ¨path中填写文件åä¿¡æ¯ã€‚ + */ +Status CreateGraph(ALGraph* G, char* path[]); + +/* + * 构造有å‘图 + */ +static Status CreateDG(ALGraph* G); + +/* + * 录入边/å¼§çš„ç›¸å…³é™„åŠ ä¿¡æ¯ + */ +static void Input(ALGraph G, InfoType** info); + +/* + * 查找 + * + * 返回顶点u在图/网中的ä½ç½® + */ +int LocateVex(ALGraph G, VertexType u); + +/* + * 构造一个边/弧结点(ä»…é™å†…部使用) + */ +static ArcNode* newArcNodePtr(int adjvex, ArcNode* nextarc, InfoType* info); + +/* + * æ’入边/å¼§ + * + * 如果当å‰å›¾/网是无å‘的,则æ’入一æ¡å¼§éœ€è¦å¢žåŠ ä¸¤ä¸ªé¡¶ç‚¹å…³ç³»ï¼Œä½†å¼§çš„æ•°é‡åªå¢žä¸€ã€‚ + * 对于图/网æ¥è¯´ï¼Œå¯ä»¥åœ¨å¯å˜å‚数中列出边/弧的附加信æ¯ã€‚ + * + * æ³¨ï¼šæ­¤å¤„æŽ¥æ”¶çš„å‚æ•°ä¸ŽMGraph有些ä¸ä¸€æ ·ï¼šç½‘的附加信æ¯ä¸­åŒ…å«äº†å„æ¡è¾¹/å¼§çš„æƒå€¼ã€‚ + */ +Status InsertArc(ALGraph* G, VertexType v, VertexType w, ...); + +/* + * 以图形化形å¼è¾“出当å‰ç»“æž„ + */ +void PrintGraph(ALGraph G); + +#endif diff --git a/CLion/ExerciseBook/07.40/CMakeLists.txt b/CLion/ExerciseBook/07.40/CMakeLists.txt new file mode 100644 index 0000000..b70be85 --- /dev/null +++ b/CLion/ExerciseBook/07.40/CMakeLists.txt @@ -0,0 +1,12 @@ +# 包å«å…¬å…±åº“ +include_directories(${CMAKE_SOURCE_DIR}/Status) + +# 生æˆå¯æ‰§è¡Œæ–‡ä»¶ +add_executable(07.40 SqList.h SqList.c ALGraph.h ALGraph.c 07.40.c) +# 链接公共库 +target_link_libraries(07.40 Scanf_lib) + +# è®°å½•è¦æ‹·è´åˆ°*.exeç›®å½•ä¸‹çš„èµ„æºæ–‡ä»¶ +file(GLOB TestData TestData*.txt) +# å°†èµ„æºæ–‡ä»¶æ‹·è´åˆ°*.exe目录下,ä¸ç„¶æ— æ³•加载 +file(COPY ${TestData} DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) diff --git a/CLion/ExerciseBook/07.40/SqList.c b/CLion/ExerciseBook/07.40/SqList.c new file mode 100644 index 0000000..266dbe7 --- /dev/null +++ b/CLion/ExerciseBook/07.40/SqList.c @@ -0,0 +1,114 @@ +/*============================= + * 线性表的顺åºå­˜å‚¨ç»“构(顺åºè¡¨ï¼‰ + * + * 包å«ç®—法: 2.3ã€2.4ã€2.5ã€2.6 + =============================*/ + +#include "SqList.h" + +/* + * ████████ 算法2.3 ████████ + * + * åˆå§‹åŒ– + * + * åˆå§‹åŒ–æˆåŠŸåˆ™è¿”å›žOK,å¦åˆ™è¿”回ERROR。 + */ +Status InitList(SqList* L) { + // åˆ†é…æŒ‡å®šå®¹é‡çš„内存,如果分é…失败,则返回NULL + (*L).elem = (ElemType*) malloc(LIST_INIT_SIZE * sizeof(ElemType)); + if((*L).elem == NULL) { + // 存储内存失败 + exit(OVERFLOW); + } + + (*L).length = 0; // åˆå§‹åŒ–顺åºè¡¨é•¿åº¦ä¸º0 + (*L).listsize = LIST_INIT_SIZE; // 顺åºè¡¨åˆå§‹å†…存分é…é‡ + + return OK; // åˆå§‹åŒ–æˆåŠŸ +} + +/* + * 计数 + * + * 返回顺åºè¡¨åŒ…å«çš„æœ‰æ•ˆå…ƒç´ çš„æ•°é‡ã€‚ + */ +int ListLength(SqList L) { + return L.length; +} + +/* + * å–值 + * + * 获å–顺åºè¡¨ä¸­ç¬¬i个元素,将其存储到e中。 + * 如果å¯ä»¥æ‰¾åˆ°ï¼Œè¿”回OK,å¦åˆ™ï¼Œè¿”回ERROR。 + * + *ã€å¤‡æ³¨ã€‘ + * æ•™æä¸­içš„å«ä¹‰æ˜¯å…ƒç´ ä½ç½®ï¼Œä»Ž1开始计数,但这ä¸ç¬¦åˆç¼–ç çš„通用约定。 + * 通常,içš„å«ä¹‰åº”该指索引,å³ä»Ž0开始计数。 + */ +Status GetElem(SqList L, int i, ElemType* e) { + // 因为içš„å«ä¹‰æ˜¯ä½ç½®ï¼Œæ‰€ä»¥å…¶åˆæ³•范围是:[1, length] + if(i < 1 || i > L.length) { + return ERROR; //i值ä¸åˆæ³• + } + + *e = L.elem[i - 1]; + + return OK; +} + +/* + * ████████ 算法2.4 ████████ + * + * æ’å…¥ + * + * å‘顺åºè¡¨ç¬¬i个ä½ç½®ä¸Šæ’å…¥e,æ’å…¥æˆåŠŸåˆ™è¿”å›žOK,å¦åˆ™è¿”回ERROR。 + * + *ã€å¤‡æ³¨ã€‘ + * æ•™æä¸­içš„å«ä¹‰æ˜¯å…ƒç´ ä½ç½®ï¼Œä»Ž1开始计数 + */ +Status ListInsert(SqList* L, int i, ElemType e) { + ElemType* newbase; + ElemType* p, * q; + + // ç¡®ä¿é¡ºåºè¡¨ç»“构存在 + if(L == NULL || (*L).elem == NULL) { + return ERROR; + } + + // i值越界 + if(i < 1 || i > (*L).length + 1) { + return ERROR; + } + + // 若存储空间已满,则增加新空间 + if((*L).length >= (*L).listsize) { + // 基于现有空间扩容 + newbase = (ElemType*) realloc((*L).elem, ((*L).listsize + LISTINCREMENT) * sizeof(ElemType)); + if(newbase == NULL) { + // 存储内存失败 + exit(OVERFLOW); + } + + // æ–°åŸºå€ + (*L).elem = newbase; + // 存的存储空间 + (*L).listsize += LISTINCREMENT; + } + + // q为æ’å…¥ä½ç½® + q = &(*L).elem[i - 1]; + + // 1.å³ç§»å…ƒç´ ï¼Œè…¾å‡ºä½ç½® + for(p = &(*L).elem[(*L).length - 1]; p >= q; --p) { + *(p + 1) = *p; + } + + // 2.æ’å…¥e + *q = e; + + // 3.表长增1 + (*L).length++; + + return OK; +} diff --git a/CLion/ExerciseBook/07.40/SqList.h b/CLion/ExerciseBook/07.40/SqList.h new file mode 100644 index 0000000..70c5b39 --- /dev/null +++ b/CLion/ExerciseBook/07.40/SqList.h @@ -0,0 +1,74 @@ +/*============================= + * 线性表的顺åºå­˜å‚¨ç»“构(顺åºè¡¨ï¼‰ + * + * 包å«ç®—法: 2.3ã€2.4ã€2.5ã€2.6 + =============================*/ + +#ifndef SQLIST_H +#define SQLIST_H + +#include +#include // æä¾›mallocã€reallocã€freeã€exit原型 +#include "Status.h" //**â–²01 绪论**// +#include "ALGraph.h" //**â–²07 图**// + +/* å®å®šä¹‰ */ +#define LIST_INIT_SIZE 100 // 顺åºè¡¨å­˜å‚¨ç©ºé—´çš„åˆå§‹åˆ†é…é‡ +#define LISTINCREMENT 10 // 顺åºè¡¨å­˜å‚¨ç©ºé—´çš„分é…å¢žé‡ + +/* 顺åºè¡¨å…ƒç´ ç±»åž‹å®šä¹‰ */ +typedef Vertex ElemType; + +/* + * 顺åºè¡¨ç»“æž„ + * + * 注:elem在使用å‰éœ€è¦å…ˆä¸ºå…¶åˆ†é…内存,且元素从elem[0]处开始存储 + */ +typedef struct { + ElemType* elem; // 顺åºè¡¨å­˜å‚¨ç©ºé—´çš„基å€ï¼ˆæŒ‡å‘顺åºè¡¨æ‰€å å†…存的起始ä½ç½®ï¼‰ + int length; // 当å‰é¡ºåºè¡¨é•¿åº¦ï¼ˆåŒ…å«å¤šå°‘元素) + int listsize; // 当å‰åˆ†é…的存储容é‡ï¼ˆå¯ä»¥å­˜å‚¨å¤šå°‘元素) +} SqList; + + +/* + * ████████ 算法2.3 ████████ + * + * åˆå§‹åŒ– + * + * åˆå§‹åŒ–æˆåŠŸåˆ™è¿”å›žOK,å¦åˆ™è¿”回ERROR。 + */ +Status InitList(SqList* L); + +/* + * 计数 + * + * 返回顺åºè¡¨åŒ…å«çš„æœ‰æ•ˆå…ƒç´ çš„æ•°é‡ã€‚ + */ +int ListLength(SqList L); + +/* + * å–值 + * + * 获å–顺åºè¡¨ä¸­ç¬¬i个元素,将其存储到e中。 + * 如果å¯ä»¥æ‰¾åˆ°ï¼Œè¿”回OK,å¦åˆ™ï¼Œè¿”回ERROR。 + * + *ã€å¤‡æ³¨ã€‘ + * æ•™æä¸­içš„å«ä¹‰æ˜¯å…ƒç´ ä½ç½®ï¼Œä»Ž1开始计数,但这ä¸ç¬¦åˆç¼–ç çš„通用约定。 + * 通常,içš„å«ä¹‰åº”该指索引,å³ä»Ž0开始计数。 + */ +Status GetElem(SqList L, int i, ElemType* e); + +/* + * ████████ 算法2.4 ████████ + * + * æ’å…¥ + * + * å‘顺åºè¡¨ç¬¬i个ä½ç½®ä¸Šæ’å…¥e,æ’å…¥æˆåŠŸåˆ™è¿”å›žOK,å¦åˆ™è¿”回ERROR。 + * + *ã€å¤‡æ³¨ã€‘ + * æ•™æä¸­içš„å«ä¹‰æ˜¯å…ƒç´ ä½ç½®ï¼Œä»Ž1开始计数 + */ +Status ListInsert(SqList* L, int i, ElemType e); + +#endif diff --git a/CLion/ExerciseBook/07.40/TestData_DG.txt b/CLion/ExerciseBook/07.40/TestData_DG.txt new file mode 100644 index 0000000..14eca5e --- /dev/null +++ b/CLion/ExerciseBook/07.40/TestData_DG.txt @@ -0,0 +1,8 @@ +图类型→0(有å‘图) +顶点数→12 +弧数→14 +弧是å¦å¸¦æœ‰å…¶ä»–ä¿¡æ¯â†’0 +顶点集→ã€A,B,C,D,E,F,G,H,I,J,K,L】 +弧的集åˆâ†’ã€A,B】ã€A,D】ã€B,C】ã€B,D】ã€C,E】ã€C,F】ã€F,G】ã€D,G】ã€D,H】ã€E,I】ã€E,J】ã€F,J】ã€G,K】ã€G,L】 + +与顶点对应的æ“作数与æ“作符→ã€0,*】ã€0,+】ã€0,*】ã€0,*】ã€0,+】ã€0,*】ã€0,+】ã€1,12】ã€1,3】ã€1,4】ã€1,5】ã€1,6】 \ No newline at end of file diff --git a/CLion/ExerciseBook/07.41/07.41.c b/CLion/ExerciseBook/07.41/07.41.c new file mode 100644 index 0000000..0dfebbf --- /dev/null +++ b/CLion/ExerciseBook/07.41/07.41.c @@ -0,0 +1,160 @@ +#include +#include "SqStack.h" +#include "ALGraph.h" + +// 缓存已找到的æƒå€¼å’Œæœ€å¤§çš„路径的æƒå€¼å’Œ +static int MAX = -1; + + +/* + * æ±‚å–æœ‰å‘网中的关键路径(CPM) + * + * 此处利用深度优先éåŽ†çš„æ€æƒ³æ¥æ±‚å–å…³é”®è·¯å¾„ï¼Œå…¶åŸºæœ¬åŽŸç†æ˜¯ï¼šå…³é”®è·¯å¾„ = æƒå€¼å’Œæœ€å¤§çš„路径 + * + * 注:教æä¸­åº”è¯¥æ˜¯ç¬”è¯¯ï¼Œä¸æ˜¯æ±‚有å‘图的关键路径,而是求有å‘网的最长路径 + */ +void Algo_7_41(ALGraph G); + +/* + * 查找关键路径上的æºç‚¹ + * + * 此处使用å¦å¤–ä¸€ç§æ–¹å¼æ±‚æºç‚¹ï¼Œè€Œä¸æ˜¯åƒä¹‹å‰ä¸€æ ·é€šè¿‡å…¥åº¦ä¿¡æ¯æ±‚æºç‚¹ï¼Œ + * ä¸è¿‡è¿™ä¸¤ç§æ–¹æ³•是殊途åŒå½’的。 + */ +static int FindBegin_7_41(ALGraph G); + +/* + * 通过深度优先é历查找图中从顶点v出å‘çš„æƒå€¼æœ€é•¿çš„路径(关键路径)。 + * + * sumå’ŒS用æ¥ç¼“存路径æƒå€¼å’Œä¸Žå·²ç»æ‰¾åˆ°çš„路径, + * path用æ¥è®°å½•当剿‰¾åˆ°çš„æƒå€¼å’Œæœ€å¤§çš„è·¯å¾„ï¼Œpath[0]上存储顶点数é‡ã€‚ + */ +static void FindPath_7_41(ALGraph G, int v, int sum, SqStack* S, int path[MAX_VERTEX_NUM + 1]); + + +int main(int argc, char* argv[]) { + ALGraph G; + + printf("████████ åˆ›å»ºå¹¶æ‰“å°æœ‰å‘网... \n"); + { + char* path[4]; + + path[0] = ""; + path[1] = "TestData_DN.txt"; + path[2] = ""; + path[3] = ""; + + CreateGraph(&G, path); + PrintGraph(G); + } + PressEnterToContinue(debug); + + printf("████████ æ±‚å–æœ‰å‘网的关键路径... \n"); + { + Algo_7_41(G); + } + PressEnterToContinue(debug); + + return 0; +} + + +/* + * æ±‚å–æœ‰å‘网中的关键路径(CPM) + * + * 此处利用深度优先éåŽ†çš„æ€æƒ³æ¥æ±‚å–å…³é”®è·¯å¾„ï¼Œå…¶åŸºæœ¬åŽŸç†æ˜¯ï¼šå…³é”®è·¯å¾„ = æƒå€¼å’Œæœ€å¤§çš„路径 + * + * 注:教æä¸­åº”è¯¥æ˜¯ç¬”è¯¯ï¼Œä¸æ˜¯æ±‚有å‘图的关键路径,而是求有å‘网的最长路径 + */ +void Algo_7_41(ALGraph G) { + int i; + int begin; // 关键路径上的æºç‚¹ + int path[MAX_VERTEX_NUM + 1] = {-1}; // 存储æƒå€¼å’Œæœ€å¤§çš„路径,0好å•元存储æƒå€¼å’Œ + SqStack S; + + // 查找关键路径上的æºç‚¹ + begin = FindBegin_7_41(G); + + InitStack(&S); + + FindPath_7_41(G, begin, 0, &S, path); + + printf("已找到的æƒå€¼å’Œæœ€å¤§çš„路径(关键路径)为:"); + for(i = 1; i <= path[0]; i++) { + printf("%c ", G.vertices[path[i]].data); + } + printf("\n"); +} + +/* + * 查找关键路径上的æºç‚¹ + * + * 此处使用å¦å¤–ä¸€ç§æ–¹å¼æ±‚æºç‚¹ï¼Œè€Œä¸æ˜¯åƒä¹‹å‰ä¸€æ ·é€šè¿‡å…¥åº¦ä¿¡æ¯æ±‚æºç‚¹ï¼Œ + * ä¸è¿‡è¿™ä¸¤ç§æ–¹æ³•是殊途åŒå½’的。 + */ +static int FindBegin_7_41(ALGraph G) { + int k; + ArcNode* p; + Boolean isAdj[MAX_VERTEX_NUM] = {FALSE}; // 记录哪些顶点åšäº†é‚»æŽ¥ç‚¹ + + // 找到所有邻接点 + for(k = 0; k < G.vexnum; k++) { + for(p = G.vertices[k].firstarc; p != NULL; p = p->nextarc) { + isAdj[p->adjvex] = TRUE; + } + } + + // 关键路径上的æºç‚¹æ²¡æœ‰å…¥å¼§ï¼Œæ‰€ä»¥ä¹Ÿä¸ä¼šæˆä¸ºåˆ«çš„顶点的邻接点 + for(k = 0; k < G.vexnum; k++) { + if(isAdj[k] == FALSE) { + return k; + } + } + + return -1; +} + +/* + * 通过深度优先é历查找图中从顶点v出å‘çš„æƒå€¼æœ€é•¿çš„路径(关键路径)。 + * + * sumå’ŒS用æ¥ç¼“存路径æƒå€¼å’Œä¸Žå·²ç»æ‰¾åˆ°çš„路径, + * path用æ¥è®°å½•当剿‰¾åˆ°çš„æƒå€¼å’Œæœ€å¤§çš„è·¯å¾„ï¼Œpath[0]上存储顶点数é‡ã€‚ + */ +static void FindPath_7_41(ALGraph G, int v, int sum, SqStack* S, int path[MAX_VERTEX_NUM + 1]) { + int i; + ArcNode* p; + SElemType e; + + // å°†é‡åˆ°çš„顶点暂存到路径栈 + Push(S, v); + + // 深度优先é历 + for(p = G.vertices[v].firstarc; p != NULL; p = p->nextarc) { + sum += p->info->weight; + FindPath_7_41(G, p->adjvex, sum, S, path); + sum -= p->info->weight; + } + + /* + * 至此,此路径已é历到了尽头, + * 如果该路径的æƒå€¼å’Œæ¯”之剿‰¾åˆ°çš„路径æƒå€¼å’Œæ›´å¤§ï¼Œåˆ™éœ€è¦æŠŠè¯¥è·¯å¾„完整地ä¿å­˜åˆ°path中, + * ä¿å­˜å®ŒæˆåŽï¼Œå°†å½“å‰é¡¶ç‚¹v退栈 + */ + + // 如果该顶点是终点(表现为没有邻接点) + if(G.vertices[v].firstarc == NULL) { + // å‘现了æƒå€¼å’Œæ›´å¤§çš„路径 + if(sum > MAX) { + MAX = sum; + + path[0] = StackLength(*S); + + // 将栈中ä¿å­˜çš„路径å¤åˆ¶åˆ°path中 + for(i = 0; i < StackLength(*S); i++) { + path[i + 1] = S->base[i]; + } + } + } + + Pop(S, &e); +} diff --git a/CLion/ExerciseBook/07.41/07.41.png b/CLion/ExerciseBook/07.41/07.41.png new file mode 100644 index 0000000000000000000000000000000000000000..3ed9f7963757766a92efdbd61a2ad0480732600d GIT binary patch literal 36952 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 + InsertArc(G, v1, v2, info); + } + + // ä»Žæ–‡ä»¶ä¸­è¯»å–æ•°æ®æ—¶ï¼Œæœ€åŽå…¶å®žåº”当判断一下是å¦è¯»åˆ°äº†è¶³å¤Ÿçš„ä¿¡æ¯ + return OK; +} + +/* + * 录入边/å¼§çš„ç›¸å…³é™„åŠ ä¿¡æ¯ + */ +static void Input(ALGraph G, InfoType** info) { + int weight; + + // 在"网"的情形下需è¦å½•å…¥æƒå€¼ä¿¡æ¯ + if(G.kind == DN || G.kind == UDN) { + *info = (InfoType*) malloc(sizeof(InfoType)); + + if(fp == NULL) { + scanf("%d", &weight); + } else { + ReadData(fp, "%d", &weight); + } + + (*info)->weight = weight; + } +} + +/* + * 查找 + * + * 返回顶点u在图/网中的ä½ç½® + */ +int LocateVex(ALGraph G, VertexType u) { + int i; + + for(i = 0; i < G.vexnum; i++) { + if(G.vertices[i].data == u) { + return i; + } + } + + return -1; +} + +/* + * 构造一个边/弧结点(ä»…é™å†…部使用) + */ +static ArcNode* newArcNodePtr(int adjvex, ArcNode* nextarc, InfoType* info) { + ArcNode* p = (ArcNode*) malloc(sizeof(ArcNode)); + if(!p) { + exit(OVERFLOW); + } + + p->adjvex = adjvex; + + p->nextarc = nextarc; + + p->info = info; + + return p; +} + +/* + * æ’入边/å¼§ + * + * 如果当å‰å›¾/网是无å‘的,则æ’入一æ¡å¼§éœ€è¦å¢žåŠ ä¸¤ä¸ªé¡¶ç‚¹å…³ç³»ï¼Œä½†å¼§çš„æ•°é‡åªå¢žä¸€ã€‚ + * 对于图/网æ¥è¯´ï¼Œå¯ä»¥åœ¨å¯å˜å‚数中列出边/弧的附加信æ¯ã€‚ + * + * æ³¨ï¼šæ­¤å¤„æŽ¥æ”¶çš„å‚æ•°ä¸ŽMGraph有些ä¸ä¸€æ ·ï¼šç½‘的附加信æ¯ä¸­åŒ…å«äº†å„æ¡è¾¹/å¼§çš„æƒå€¼ã€‚ + */ +Status InsertArc(ALGraph* G, VertexType v, VertexType w, ...) { + int tail, head, k, count; + ArcNode* r; + ArcNode* pre; + Boolean overlay = FALSE; // 是å¦ä¸ºè¦†ç›–添加 + InfoType* info = NULL; // è¾¹/å¼§çš„é™„åŠ ä¿¡æ¯ + va_list ap; + + tail = LocateVex(*G, v); // 获å–顶点v在顶点集中的ä½ç½® + if(tail == -1) { + return ERROR; // 指定的顶点ä¸å­˜åœ¨ + } + + head = LocateVex(*G, w); // 获å–顶点w在顶点集中的ä½ç½® + if(head == -1) { + return ERROR; // 指定的顶点ä¸å­˜åœ¨ + } + + // æ‹’ç»çޝ + if(tail == head) { + return ERROR; + } + + // 如果边/å¼§ä¸Šå­˜åœ¨é™„åŠ ä¿¡æ¯ + if(IncInfo) { + va_start(ap, w); // 在wåŽæŸ¥è¯¢é¦–个å¯å˜å‚æ•° + info = va_arg(ap, InfoType*); // 获å–é™„åŠ ä¿¡æ¯ + va_end(ap); + } + + /* 接下æ¥ï¼Œéœ€è¦æŸ¥æ‰¾åˆé€‚çš„æ’å…¥ä½ç½® */ + + for(count = 0; count < 2; count++) { + pre = NULL; + // 指å‘以tail为尾的首æ¡è¾¹/å¼§ + r = G->vertices[tail].firstarc; + while(r != NULL && r->adjvex < head) { + pre = r; + r = r->nextarc; + } + + // é‡åˆ°äº†ç›¸åŒä½ç½®çš„结点 + if(r != NULL && r->adjvex == head) { + r->info = info; // å¤ç”¨è¯¥ç»“点 + overlay = TRUE; // å‘生了覆盖 + } else { + if(pre == NULL) { + G->vertices[tail].firstarc = newArcNodePtr(head, r, info); + } else { + pre->nextarc = newArcNodePtr(head, r, info); + } + } + + // 如果当å‰å›¾/网是无å‘的,需è¦è€ƒè™‘对称性 + if((G->kind == UDG || G->kind == UDN) && tail != head) { + // 颠倒iå’Œj + k = tail; + tail = head; + head = k; + } else { + break; // 如果是有å‘的,å¯ä»¥ç»“æŸäº† + } + } + + // 在éžè¦†ç›–的情形下,æ‰è€ƒè™‘æ›´æ–°è¾¹/å¼§çš„æ•°é‡ + if(!overlay) { + (*G).arcnum++; // ä¸è®ºæœ‰å‘æ— å‘,边/å¼§æ•°åªå¢žä¸€ + } + + return OK; +} + +/* + * 以图形化形å¼è¾“出当å‰ç»“æž„ + */ +void PrintGraph(ALGraph G) { + int i; + ArcNode* p; + + if(G.vexnum == 0) { + printf("空图,无需打å°ï¼\n"); + return; + } + + printf("当å‰å›¾/ç½‘åŒ…å« %2d 个顶点, %2d æ¡è¾¹/å¼§...\n", G.vexnum, G.arcnum); + + for(i = 0; i < G.vexnum; i++) { + printf("%c ===> ", G.vertices[i].data); + + p = G.vertices[i].firstarc; + while(p != NULL) { + if(IncInfo == 0) { + printf("%c ", G.vertices[p->adjvex].data); + + // 对于网,会从其附加信æ¯ä¸­èŽ·å–到æƒå€¼ + } else { + printf("%c[%2d] ", G.vertices[p->adjvex].data, p->info->weight); + } + + p = p->nextarc; + + if(p != NULL) { + printf("- "); + } + } + + printf("\n"); + } +} diff --git a/CLion/ExerciseBook/07.41/ALGraph.h b/CLion/ExerciseBook/07.41/ALGraph.h new file mode 100644 index 0000000..4a1686c --- /dev/null +++ b/CLion/ExerciseBook/07.41/ALGraph.h @@ -0,0 +1,128 @@ +/*================== + * 图的邻接表存储表示 + ===================*/ + +#ifndef ALGRAPH_H +#define ALGRAPH_H + +#include +#include // æä¾›memsetã€strcmp 原型 +#include // æä¾›å®va_listã€va_startã€va_argã€va_end +#include // æä¾›mallocã€reallocã€freeã€exit原型 +#include "Status.h" //**â–²01 绪论**// + +/* + * 注: + * + * 通常æ¥è®²ï¼Œæ— æƒå›¾è¢«ç®€ç§°ä¸ºã€å›¾ã€‘,有æƒå›¾è¢«ç®€ç§°ä¸ºã€ç½‘】。 + * æ— å‘图/网中的顶点关系被称为ã€è¾¹ã€‘,有å‘图/网中的顶点关系被称为ã€å¼§ã€‘,并区分弧头与弧尾。 + * 实际表述中,未必会严格éµå®ˆä»¥ä¸Šå‘½å。 + * + * 当å‰ç»“构适åˆå­˜å‚¨è¾¹/弧比较稀ç–的图/网。 + * + * ★ æ’入边/å¼§çš„ä¿¡æ¯æ—¶ï¼Œè¿™é‡Œçš„实现是按"å‡åº"æ’入的,这使得æ’入的弧是按"å‡åº"排列的。 + */ + + +/* å®å®šä¹‰ */ +#define MAX_VERTEX_NUM 26 // 最大顶点个数 + + +// 图的类型 +typedef enum { + DG, // 0-有å‘图 + DN, // 1-有å‘网(带æƒå€¼) + UDG, // 2-æ— å‘图 + UDN // 3-æ— å‘网(带æƒå€¼) +} GraphKind; + +// 顶点类型 +typedef char VertexType; + +// è¾¹/å¼§çš„ç›¸å…³é™„åŠ ä¿¡æ¯ +typedef struct { + /* + * 注: + * æ•™æä¸­ç»™å‡ºçš„结构åªè€ƒè™‘了无æƒå›¾ï¼Œè€Œæ²¡è€ƒè™‘有æƒå›¾(网)。 + * 这里为了把“网â€çš„æƒ…形也考虑进去,特在附加信æ¯ä¸­å¢žåŠ äº†"æƒé‡"属性。 + */ + int weight; +} InfoType; + +/* è¾¹/弧结点 */ +typedef struct ArcNode { + int adjvex; // 该弧所指å‘的顶点的ä½ç½® + struct ArcNode* nextarc; // 指å‘下一æ¡å¼§çš„æŒ‡é’ˆ + InfoType* info; // 弧的附加信æ¯ï¼Œé€šå¸¸å¿½ç•¥ +} ArcNode; + +// æ¯ä¸ªé“¾è¡¨çš„头结点 +typedef struct VNode { + VertexType data; // é¡¶ç‚¹ä¿¡æ¯ + ArcNode* firstarc; // 指å‘第一æ¡ä¾é™„该顶点的弧的指针 +} VNode; + +/* 图的邻接表存储表示类型定义 */ +typedef struct { + VNode vertices[MAX_VERTEX_NUM]; // 邻接表 + int vexnum, arcnum; // 图/网的顶点数和弧数 + GraphKind kind; // 图的类型标志 +} ALGraph; + + +// è¾¹/弧上是å¦å­˜åœ¨é™„åŠ ä¿¡æ¯ +extern Boolean IncInfo; + + +/* + * 创建 + * + *ã€å¤‡æ³¨ã€‘ + * + * æ•™æä¸­é»˜è®¤ä»ŽæŽ§åˆ¶å°è¯»å–æ•°æ®ã€‚ + * 这里为了方便测试,é¿å…æ¯æ¬¡è¿è¡Œéƒ½æ‰‹åŠ¨è¾“å…¥æ•°æ®ï¼Œ + * 因而å…许选择从预设的文件pathä¸­è¯»å–æµ‹è¯•æ•°æ®ã€‚ + * + * 如果需è¦ä»ŽæŽ§åˆ¶å°è¯»å–æ•°æ®ï¼Œåˆ™path为NULL,或path[kind]为""。 + * 如果需è¦ä»Žæ–‡ä»¶ä¸­è¯»å–æ•°æ®ï¼Œåˆ™éœ€è¦åœ¨path中填写文件åä¿¡æ¯ã€‚ + */ +Status CreateGraph(ALGraph* G, char* path[]); + +/* + * 构造有å‘网 + */ +static Status CreateDN(ALGraph* G); + +/* + * 录入边/å¼§çš„ç›¸å…³é™„åŠ ä¿¡æ¯ + */ +static void Input(ALGraph G, InfoType** info); + +/* + * 查找 + * + * 返回顶点u在图/网中的ä½ç½® + */ +int LocateVex(ALGraph G, VertexType u); + +/* + * 构造一个边/弧结点(ä»…é™å†…部使用) + */ +static ArcNode* newArcNodePtr(int adjvex, ArcNode* nextarc, InfoType* info); + +/* + * æ’入边/å¼§ + * + * 如果当å‰å›¾/网是无å‘的,则æ’入一æ¡å¼§éœ€è¦å¢žåŠ ä¸¤ä¸ªé¡¶ç‚¹å…³ç³»ï¼Œä½†å¼§çš„æ•°é‡åªå¢žä¸€ã€‚ + * 对于图/网æ¥è¯´ï¼Œå¯ä»¥åœ¨å¯å˜å‚数中列出边/弧的附加信æ¯ã€‚ + * + * æ³¨ï¼šæ­¤å¤„æŽ¥æ”¶çš„å‚æ•°ä¸ŽMGraph有些ä¸ä¸€æ ·ï¼šç½‘的附加信æ¯ä¸­åŒ…å«äº†å„æ¡è¾¹/å¼§çš„æƒå€¼ã€‚ + */ +Status InsertArc(ALGraph* G, VertexType v, VertexType w, ...); + +/* + * 以图形化形å¼è¾“出当å‰ç»“æž„ + */ +void PrintGraph(ALGraph G); + +#endif diff --git a/CLion/ExerciseBook/07.41/CMakeLists.txt b/CLion/ExerciseBook/07.41/CMakeLists.txt new file mode 100644 index 0000000..4915bc7 --- /dev/null +++ b/CLion/ExerciseBook/07.41/CMakeLists.txt @@ -0,0 +1,12 @@ +# 包å«å…¬å…±åº“ +include_directories(${CMAKE_SOURCE_DIR}/Status) + +# 生æˆå¯æ‰§è¡Œæ–‡ä»¶ +add_executable(07.41 SqStack.h SqStack.c ALGraph.h ALGraph.c 07.41.c) +# 链接公共库 +target_link_libraries(07.41 Scanf_lib) + +# è®°å½•è¦æ‹·è´åˆ°*.exeç›®å½•ä¸‹çš„èµ„æºæ–‡ä»¶ +file(GLOB TestData TestData*.txt) +# å°†èµ„æºæ–‡ä»¶æ‹·è´åˆ°*.exe目录下,ä¸ç„¶æ— æ³•加载 +file(COPY ${TestData} DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) diff --git a/CLion/ExerciseBook/07.41/SqStack.c b/CLion/ExerciseBook/07.41/SqStack.c new file mode 100644 index 0000000..8b615a8 --- /dev/null +++ b/CLion/ExerciseBook/07.41/SqStack.c @@ -0,0 +1,103 @@ +/*========================= + * 栈的顺åºå­˜å‚¨ç»“æž„ï¼ˆé¡ºåºæ ˆï¼‰ + ==========================*/ + +#include "SqStack.h" //**â–²03 栈和队列**// + +/* + * åˆå§‹åŒ– + * + * 构造一个空栈。åˆå§‹åŒ–æˆåŠŸåˆ™è¿”å›žOK,å¦åˆ™è¿”回ERROR。 + */ +Status InitStack(SqStack* S) { + if(S == NULL) { + return ERROR; + } + + (*S).base = (SElemType*) malloc(STACK_INIT_SIZE * sizeof(SElemType)); + if((*S).base == NULL) { + exit(OVERFLOW); + } + + (*S).top = (*S).base; + (*S).stacksize = STACK_INIT_SIZE; + + return OK; +} + +/* + * 判空 + * + * åˆ¤æ–­é¡ºåºæ ˆä¸­æ˜¯å¦åŒ…嫿œ‰æ•ˆæ•°æ®ã€‚ + * + * 返回值: + * TRUE : é¡ºåºæ ˆä¸ºç©º + * FALSE: é¡ºåºæ ˆä¸ä¸ºç©º + */ +Status StackEmpty(SqStack S) { + if(S.top == S.base) { + return TRUE; + } else { + return FALSE; + } +} + +/* + * 计数 + * + * è¿”å›žé¡ºåºæ ˆåŒ…å«çš„æœ‰æ•ˆå…ƒç´ çš„æ•°é‡ã€‚ + */ +int StackLength(SqStack S) { + if(S.base == NULL) { + return 0; + } + + return (int) (S.top - S.base); +} + +/* + * 入栈 + * + * 将元素e压入到栈顶。 + */ +Status Push(SqStack* S, SElemType e) { + if(S == NULL || (*S).base == NULL) { + return ERROR; + } + + // 栈满时,追加存储空间 + if((*S).top - (*S).base >= (*S).stacksize) { + (*S).base = (SElemType*) realloc((*S).base, ((*S).stacksize + STACKINCREMENT) * sizeof(SElemType)); + if((*S).base == NULL) { + exit(OVERFLOW); // 存储分é…失败 + } + + (*S).top = (*S).base + (*S).stacksize; + (*S).stacksize += STACKINCREMENT; + } + + // 进栈先赋值,栈顶指针å†è‡ªå¢ž + *(S->top++) = e; + + return OK; +} + +/* + * 出栈 + * + * 将栈顶元素弹出,并用e接收。 + */ +Status Pop(SqStack* S, SElemType* e) { + if(S == NULL || (*S).base == NULL) { + return ERROR; + } + + if((*S).top == (*S).base) { + return ERROR; + } + + // 出栈栈顶指针先递å‡ï¼Œå†èµ‹å€¼ + *e = *(--(*S).top); + + return OK; +} diff --git a/CLion/ExerciseBook/07.41/SqStack.h b/CLion/ExerciseBook/07.41/SqStack.h new file mode 100644 index 0000000..7b77f67 --- /dev/null +++ b/CLion/ExerciseBook/07.41/SqStack.h @@ -0,0 +1,66 @@ +/*========================= + * 栈的顺åºå­˜å‚¨ç»“æž„ï¼ˆé¡ºåºæ ˆï¼‰ + ==========================*/ + +#ifndef SQSTACK_H +#define SQSTACK_H + +#include +#include // æä¾›mallocã€reallocã€freeã€exit原型 +#include "Status.h" //**â–²01 绪论**// + +/* å®å®šä¹‰ */ +#define STACK_INIT_SIZE 100 // é¡ºåºæ ˆå­˜å‚¨ç©ºé—´çš„åˆå§‹åˆ†é…é‡ +#define STACKINCREMENT 10 // é¡ºåºæ ˆå­˜å‚¨ç©ºé—´çš„分é…å¢žé‡ + +/* é¡ºåºæ ˆå…ƒç´ ç±»åž‹å®šä¹‰ */ +typedef int SElemType; + +// é¡ºåºæ ˆå…ƒç´ ç»“æž„ +typedef struct { + SElemType* base; // 栈底指针 + SElemType* top; // 栈顶指针 + int stacksize; // 当å‰å·²åˆ†é…的存储空间,以元素为å•ä½ +} SqStack; + + +/* + * åˆå§‹åŒ– + * + * 构造一个空栈。åˆå§‹åŒ–æˆåŠŸåˆ™è¿”å›žOK,å¦åˆ™è¿”回ERROR。 + */ +Status InitStack(SqStack* S); + +/* + * 判空 + * + * åˆ¤æ–­é¡ºåºæ ˆä¸­æ˜¯å¦åŒ…嫿œ‰æ•ˆæ•°æ®ã€‚ + * + * 返回值: + * TRUE : é¡ºåºæ ˆä¸ºç©º + * FALSE: é¡ºåºæ ˆä¸ä¸ºç©º + */ +Status StackEmpty(SqStack S); + +/* + * 计数 + * + * è¿”å›žé¡ºåºæ ˆåŒ…å«çš„æœ‰æ•ˆå…ƒç´ çš„æ•°é‡ã€‚ + */ +int StackLength(SqStack S); + +/* + * 入栈 + * + * 将元素e压入到栈顶。 + */ +Status Push(SqStack* S, SElemType e); + +/* + * 出栈 + * + * 将栈顶元素弹出,并用e接收。 + */ +Status Pop(SqStack* S, SElemType* e); + +#endif diff --git a/CLion/ExerciseBook/07.41/TestData_DN.txt b/CLion/ExerciseBook/07.41/TestData_DN.txt new file mode 100644 index 0000000..990edae --- /dev/null +++ b/CLion/ExerciseBook/07.41/TestData_DN.txt @@ -0,0 +1,6 @@ +图类型→1(有å‘网) +顶点数→13 +弧数→24 +弧是å¦å¸¦æœ‰å…¶ä»–ä¿¡æ¯â†’1 +顶点集→ã€M,A,B,C,D,E,F,G,H,I,J,K,N】 +弧的集åˆâ†’ã€M,A,1】ã€M,B,6】ã€M,D,3】ã€M,F,4】ã€M,G,3】ã€M,I,1】ã€A,C,6】ã€B,C,2】ã€D,C,7】ã€D,E,8】ã€D,J,6】ã€F,E,11】ã€F,H,5】ã€G,N,21】ã€G,H,10】ã€I,H,6】ã€H,J,4】ã€H,K,9】ã€K,J,9】ã€J,N,12】ã€J,E,3】ã€E,N,10】ã€H,C,4】ã€C,E,8】 \ No newline at end of file diff --git a/CLion/ExerciseBook/07.42/07.42.c b/CLion/ExerciseBook/07.42/07.42.c new file mode 100644 index 0000000..96ea649 --- /dev/null +++ b/CLion/ExerciseBook/07.42/07.42.c @@ -0,0 +1,54 @@ +#include +#include "ALGraph.h" +#include "ShortestPaths.h" + +/* + * 使用Dijkstraç®—æ³•è®¡ç®—ä»Žå•æºé¡¶ç‚¹å‡ºå‘的最短路径 + */ +void Algo_7_42(ALGraph G, int v0, PathMatrix_DIJ P, ShortPathTable_DIJ D); + + +int main(int argc, char* argv[]) { + ALGraph G; + + printf("████████ åˆ›å»ºå¹¶æ‰“å°æ— å‘图/网... \n"); + { + char* path[4]; + + path[0] = "TestData_DG.txt"; + path[1] = "TestData_DN.txt"; + path[2] = "TestData_UDG.txt"; + path[3] = "TestData_UDN.txt"; + + CreateGraph(&G, path); + PrintGraph(G); + printf("\n"); + } + + printf("████████ è¿ªæ°æ–¯ç‰¹æ‹‰ç®—æ³•æ±‚å•æºæœ€çŸ­è·¯å¾„... \n"); + { + VertexType v0 = 'A'; + PathMatrix_DIJ P; + ShortPathTable_DIJ D; + + printf("输出从顶点 %c 到其余顶点的最短路径:\n", v0); + Algo_7_42(G, LocateVex(G, v0), P, D); + printf("\n"); + } +} + + +/* + * 使用Dijkstraç®—æ³•è®¡ç®—ä»Žå•æºé¡¶ç‚¹å‡ºå‘的最短路径 + */ +void Algo_7_42(ALGraph G, int v0, PathMatrix_DIJ P, ShortPathTable_DIJ D) { + + // ★★必须首先调用此函数计算å„顶点之间的关系 + GetAdjs(G); + + // 最短路径算法 + ShortestPath_DIJ(G, v0, P, D); + + // 打å°è®¡ç®—出的结果(此步骤å¯é€‰ï¼‰ + PrintPath_DIJ(G, v0, P, D); +} diff --git a/CLion/ExerciseBook/07.42/07.42.png b/CLion/ExerciseBook/07.42/07.42.png new file mode 100644 index 0000000000000000000000000000000000000000..537bcefcbb165e4fd77199b0c048b35d0f38e339 GIT binary patch literal 55687 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 literal 0 HcmV?d00001 diff --git a/CLion/ExerciseBook/07.42/ALGraph.c b/CLion/ExerciseBook/07.42/ALGraph.c new file mode 100644 index 0000000..b72979a --- /dev/null +++ b/CLion/ExerciseBook/07.42/ALGraph.c @@ -0,0 +1,583 @@ +/*================== + * 图的邻接表存储表示 + ===================*/ + +#include "ALGraph.h" + +// 录入数æ®çš„æºæ–‡ä»¶ï¼›fp为null时,说明需è¦ä»ŽæŽ§åˆ¶å°å½•å…¥ +static FILE* fp = NULL; + +/* + * IncInfo指示该图/网的边/弧上是å¦å­˜åœ¨é™„加信æ¯ã€‚ + * 如果其值ä¸ä¸º0,则表示无附加信æ¯ï¼Œå¦åˆ™ï¼Œè¡¨ç¤ºå­˜åœ¨é™„加信æ¯ã€‚ + */ +Boolean IncInfo = FALSE; + +// 访问标志数组,记录访问过的顶点 +static Boolean visited[MAX_VERTEX_NUM]; + +// 函数å˜é‡ +static Status (* VisitFunc)(VertexType e); + + +/* + * 创建 + * + *ã€å¤‡æ³¨ã€‘ + * + * æ•™æä¸­é»˜è®¤ä»ŽæŽ§åˆ¶å°è¯»å–æ•°æ®ã€‚ + * 这里为了方便测试,é¿å…æ¯æ¬¡è¿è¡Œéƒ½æ‰‹åŠ¨è¾“å…¥æ•°æ®ï¼Œ + * 因而å…许选择从预设的文件pathä¸­è¯»å–æµ‹è¯•æ•°æ®ã€‚ + * + * 如果需è¦ä»ŽæŽ§åˆ¶å°è¯»å–æ•°æ®ï¼Œåˆ™path为NULL,或path[kind]为""。 + * 如果需è¦ä»Žæ–‡ä»¶ä¸­è¯»å–æ•°æ®ï¼Œåˆ™éœ€è¦åœ¨path中填写文件åä¿¡æ¯ã€‚ + */ +Status CreateGraph(ALGraph* G, char* path[]) { + int readFromConsole; // 是å¦ä»ŽæŽ§åˆ¶å°è¯»å–æ•°æ® + int kind; + Status flag; + + printf("请输入图的类型(0-有å‘图 │ 1-有å‘网 │ 2-æ— å‘图 │ 3-æ— å‘网):"); + scanf("%d", &kind); + + // 类型ä¸åˆè§„ + if(kind < 0 || kind > 3) { + return ERROR; + } + + // 如果没有文件路径信æ¯ï¼Œåˆ™ä»ŽæŽ§åˆ¶å°è¯»å–输入 + readFromConsole = (path == NULL) || strcmp(path[kind], "") == 0; + + // 需è¦ä»Žæ–‡ä»¶è¯»å– + if(readFromConsole) { + (*G).kind = kind; // 记录图/网的类型 + } else { + // æ‰“å¼€æ–‡ä»¶ï¼Œå‡†å¤‡è¯»å–æµ‹è¯•æ•°æ® + fp = fopen(path[kind], "r"); + if(fp == NULL) { + return ERROR; + } + + // 录入图的类型 + ReadData(fp, "%d", &((*G).kind)); + } + + // éšæœºåˆ›å»ºæœ‰å‘图/网或无å‘图/ç½‘çš„ä¸€ç§ + switch((*G).kind) { + case DG: + flag = CreateDG(G); + break; + case DN: + flag = CreateDN(G); + break; + case UDG: + flag = CreateUDG(G); + break; + case UDN: + flag = CreateUDN(G); + break; + default: + flag = ERROR; + break; + } + + if(fp != NULL) { + fclose(fp); + fp = NULL; + } + + return flag; +} + +/* + * 构造有å‘图 + */ +static Status CreateDG(ALGraph* G) { + int i, k; + int vexnum, arcnum; + VertexType v1, v2; + InfoType* info = NULL; + + (*G).vexnum = (*G).arcnum = 0; + + if(fp == NULL) { + printf("请输入有å‘图的顶点数:"); + scanf("%d", &vexnum); + printf("请输入有å‘图的弧数:"); + scanf("%d", &arcnum); + printf("该有å‘图的弧上是å¦åŒ…å«å…¶ä»–附加信æ¯(0-ä¸åŒ…å«â”‚1-包å«):"); + scanf("%d", &IncInfo); + + // 录入顶点集 + printf("请录入 %d 个顶点,ä¸åŒé¡¶ç‚¹ä¹‹é—´ç”¨ç©ºæ ¼éš”开:", vexnum); + for(i = 0; i < vexnum; i++) { + // 跳过空白,寻找下一个"å¯è¯»"ç¬¦å· + skipBlank(stdin); + scanf("%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } else { + ReadData(fp, "%d", &vexnum); // 录入顶点数 + ReadData(fp, "%d", &arcnum); // 录入弧数 + ReadData(fp, "%d", &IncInfo); // 判断弧上是å¦åŒ…å«é™„åŠ ä¿¡æ¯ + + // 录入顶点集 + for(i = 0; i < vexnum; i++) { + // 跳过空白,寻找下一个"å¯è¯»"ç¬¦å· + skipBlank(fp); + ReadData(fp, "%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } + + // 仅在控制å°å½•å…¥ä¿¡æ¯æ—¶è¾“出此æç¤º + if(fp == NULL && arcnum != 0) { + printf("请为有å‘图便¬¡å½•å…¥ %d æ¡å¼§çš„ä¿¡æ¯ï¼Œé¡¶ç‚¹ä¹‹é—´ç”¨ç©ºæ ¼éš”开:\n", arcnum); + } + + // å½•å…¥å¼§çš„ä¿¡æ¯ + for(k = 0; k < arcnum; k++) { + if(fp == NULL) { + printf("第 %2d æ¡å¼§ï¼š", k + 1); + skipBlank(stdin); // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + scanf("%c", &v1); + skipBlank(stdin); // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + scanf("%c", &v2); + } else { + // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + skipBlank(fp); + ReadData(fp, "%c%c", &v1, &v2); + } + + // 如果需è¦å½•å…¥å¼§çš„å…¶ä»–é™„åŠ ä¿¡æ¯ + if(IncInfo) { + // 最åŽå½•å…¥é™„åŠ ä¿¡æ¯ + Input(*G, &info); + } + + // æ’入弧 + InsertArc(G, v1, v2, info); + } + + // ä»Žæ–‡ä»¶ä¸­è¯»å–æ•°æ®æ—¶ï¼Œæœ€åŽå…¶å®žåº”当判断一下是å¦è¯»åˆ°äº†è¶³å¤Ÿçš„ä¿¡æ¯ + return OK; +} + +/* + * 构造有å‘网 + */ +static Status CreateDN(ALGraph* G) { + int i, k; + int vexnum, arcnum; + VertexType v1, v2; + InfoType* info = NULL; + + (*G).vexnum = (*G).arcnum = 0; + + if(fp == NULL) { + printf("请输入有å‘网的顶点数:"); + scanf("%d", &vexnum); + printf("请输入有å‘网的弧数:"); + scanf("%d", &arcnum); + printf("该有å‘网的弧上必须包å«å…¶ä»–附加信æ¯ï¼Œå› ä¸ºæ­¤å¤„çš„æƒå€¼éœ€è¦å­˜å‚¨åˆ°é™„加信æ¯ä¸­...\n"); + IncInfo = 1; + + // 录入顶点集 + printf("请录入 %d 个顶点,ä¸åŒé¡¶ç‚¹ä¹‹é—´ç”¨ç©ºæ ¼éš”开:", vexnum); + for(i = 0; i < vexnum; i++) { + // 跳过空白,寻找下一个"å¯è¯»"ç¬¦å· + skipBlank(stdin); + scanf("%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } else { + ReadData(fp, "%d", &vexnum); // 录入顶点数 + ReadData(fp, "%d", &arcnum); // 录入弧数 + ReadData(fp, "%d", &IncInfo);// 判断弧上是å¦åŒ…å«é™„加信æ¯(此处应当包å«) + IncInfo = 1; // 强制将æƒå€¼å½•入到附加信æ¯ä¸­ + + // 录入顶点集 + for(i = 0; i < vexnum; i++) { + // 跳过空白,寻找下一个"å¯è¯»"ç¬¦å· + skipBlank(fp); + ReadData(fp, "%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } + + // 仅在控制å°å½•å…¥ä¿¡æ¯æ—¶è¾“出此æç¤º + if(fp == NULL && arcnum != 0) { + printf("请为有å‘ç½‘ä¾æ¬¡å½•å…¥ %d æ¡å¼§(带æƒå€¼)的信æ¯ï¼Œé¡¶ç‚¹åŠæƒå€¼ä¹‹é—´ç”¨ç©ºæ ¼éš”开:\n", arcnum); + } + + // å½•å…¥å¼§çš„ä¿¡æ¯ + for(k = 0; k < arcnum; k++) { + if(fp == NULL) { + printf("第 %2d æ¡å¼§åŠå…¶æƒå€¼ï¼š", k + 1); + skipBlank(stdin); // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + scanf("%c", &v1); + skipBlank(stdin); // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + scanf("%c", &v2); + } else { + // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + skipBlank(fp); + ReadData(fp, "%c%c", &v1, &v2); + } + + // 如果需è¦å½•å…¥å¼§çš„å…¶ä»–é™„åŠ ä¿¡æ¯ + if(IncInfo) { + // 最åŽå½•入附加信æ¯(此处需è¦å½•入网的æƒå€¼) + Input(*G, &info); + } + + // æ’入弧 + InsertArc(G, v1, v2, info); + } + + // ä»Žæ–‡ä»¶ä¸­è¯»å–æ•°æ®æ—¶ï¼Œæœ€åŽå…¶å®žåº”当判断一下是å¦è¯»åˆ°äº†è¶³å¤Ÿçš„ä¿¡æ¯ + return OK; +} + +/* + * 构造无å‘图 + */ +static Status CreateUDG(ALGraph* G) { + int i, k; + int vexnum, arcnum; + VertexType v1, v2; + InfoType* info = NULL; + + (*G).vexnum = (*G).arcnum = 0; + + if(fp == NULL) { + printf("请输入无å‘图的顶点数:"); + scanf("%d", &vexnum); + printf("请输入无å‘图的边数:"); + scanf("%d", &arcnum); + printf("该无å‘图的边上是å¦åŒ…å«å…¶ä»–附加信æ¯(0-ä¸åŒ…å«â”‚1-包å«):"); + scanf("%d", &IncInfo); + + // 录入顶点集 + printf("请录入 %d 个顶点,ä¸åŒé¡¶ç‚¹ä¹‹é—´ç”¨ç©ºæ ¼éš”开:", vexnum); + for(i = 0; i < vexnum; i++) { + // 跳过空白,寻找下一个"å¯è¯»"ç¬¦å· + skipBlank(stdin); + scanf("%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } else { + ReadData(fp, "%d", &vexnum); // 录入顶点数 + ReadData(fp, "%d", &arcnum); // 录入边数 + ReadData(fp, "%d", &IncInfo);// 判断边上是å¦åŒ…å«é™„åŠ ä¿¡æ¯ + + // 录入顶点集 + for(i = 0; i < vexnum; i++) { + // 跳过空白,寻找下一个"å¯è¯»"ç¬¦å· + skipBlank(fp); + ReadData(fp, "%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } + + // 仅在控制å°å½•å…¥ä¿¡æ¯æ—¶è¾“出此æç¤º + if(fp == NULL && arcnum != 0) { + printf("请为无å‘图便¬¡å½•å…¥ %d æ¡è¾¹çš„ä¿¡æ¯ï¼Œé¡¶ç‚¹ä¹‹é—´ç”¨ç©ºæ ¼éš”开:\n", arcnum); + } + + // å½•å…¥è¾¹çš„ä¿¡æ¯ + for(k = 0; k < arcnum; k++) { + if(fp == NULL) { + printf("第 %2d æ¡è¾¹ï¼š", k + 1); + skipBlank(stdin); // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + scanf("%c", &v1); + skipBlank(stdin); // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + scanf("%c", &v2); + } else { + // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + skipBlank(fp); + ReadData(fp, "%c%c", &v1, &v2); + } + + // 如果需è¦å½•å…¥è¾¹çš„å…¶ä»–é™„åŠ ä¿¡æ¯ + if(IncInfo) { + // 最åŽå½•å…¥é™„åŠ ä¿¡æ¯ + Input(*G, &info); + + } + + // æ’入边 + InsertArc(G, v1, v2, info); + } + + // ä»Žæ–‡ä»¶ä¸­è¯»å–æ•°æ®æ—¶ï¼Œæœ€åŽå…¶å®žåº”当判断一下是å¦è¯»åˆ°äº†è¶³å¤Ÿçš„ä¿¡æ¯ + return OK; +} + +/* + * 构造无å‘网 + */ +static Status CreateUDN(ALGraph* G) { + int i, k; + int vexnum, arcnum; + VertexType v1, v2; + InfoType* info = NULL; + + (*G).vexnum = (*G).arcnum = 0; + + if(fp == NULL) { + printf("请输入无å‘网的顶点数:"); + scanf("%d", &vexnum); + printf("请输入无å‘网的边数:"); + scanf("%d", &arcnum); + printf("该无å‘网的边上必须包å«å…¶ä»–附加信æ¯ï¼Œå› ä¸ºæ­¤å¤„çš„æƒå€¼éœ€è¦å­˜å‚¨åˆ°é™„加信æ¯ä¸­...\n"); + IncInfo = 1; + + // 录入顶点集 + printf("请录入 %d 个顶点,ä¸åŒé¡¶ç‚¹ä¹‹é—´ç”¨ç©ºæ ¼éš”开:", vexnum); + for(i = 0; i < vexnum; i++) { + // 跳过空白,寻找下一个"å¯è¯»"ç¬¦å· + skipBlank(stdin); + scanf("%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } else { + ReadData(fp, "%d", &vexnum); // 录入顶点数 + ReadData(fp, "%d", &arcnum); // 录入边数 + ReadData(fp, "%d", &IncInfo);// 判断边上是å¦åŒ…å«é™„åŠ ä¿¡æ¯ + IncInfo = 1; // 强制将æƒå€¼å½•入到附加信æ¯ä¸­ + + // 录入顶点集 + for(i = 0; i < vexnum; i++) { + // 跳过空白,寻找下一个"å¯è¯»"ç¬¦å· + skipBlank(fp); + ReadData(fp, "%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } + + // 仅在控制å°å½•å…¥ä¿¡æ¯æ—¶è¾“出此æç¤º + if(fp == NULL && arcnum != 0) { + printf("请为无å‘ç½‘ä¾æ¬¡å½•å…¥ %d æ¡è¾¹(带æƒå€¼)的信æ¯ï¼Œé¡¶ç‚¹åŠæƒå€¼ä¹‹é—´ç”¨ç©ºæ ¼éš”开:\n", arcnum); + } + + // å½•å…¥è¾¹çš„ä¿¡æ¯ + for(k = 0; k < arcnum; k++) { + if(fp == NULL) { + printf("第 %2d æ¡è¾¹åŠå…¶æƒå€¼ï¼š", k + 1); + skipBlank(stdin); // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + scanf("%c", &v1); + skipBlank(stdin); // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + scanf("%c", &v2); + } else { + // 跳过空白,寻找下一个å¯è¯»ç¬¦å· + skipBlank(fp); + ReadData(fp, "%c%c", &v1, &v2); + } + + // 如果需è¦å½•å…¥è¾¹çš„å…¶ä»–é™„åŠ ä¿¡æ¯ + if(IncInfo) { + // 最åŽå½•入附加信æ¯(此处需è¦å½•入网的æƒå€¼) + Input(*G, &info); + } + + // æ’入边 + InsertArc(G, v1, v2, info); + } + + // ä»Žæ–‡ä»¶ä¸­è¯»å–æ•°æ®æ—¶ï¼Œæœ€åŽå…¶å®žåº”当判断一下是å¦è¯»åˆ°äº†è¶³å¤Ÿçš„ä¿¡æ¯ + return OK; +} + +/* + * 录入边/å¼§çš„ç›¸å…³é™„åŠ ä¿¡æ¯ + */ +static void Input(ALGraph G, InfoType** info) { + int weight; + + // 在"网"的情形下需è¦å½•å…¥æƒå€¼ä¿¡æ¯ + if(G.kind == DN || G.kind == UDN) { + *info = (InfoType*) malloc(sizeof(InfoType)); + + if(fp == NULL) { + scanf("%d", &weight); + } else { + ReadData(fp, "%d", &weight); + } + + (*info)->weight = weight; + } +} + +/* + * 查找 + * + * 返回顶点u在图/网中的ä½ç½® + */ +int LocateVex(ALGraph G, VertexType u) { + int i; + + for(i = 0; i < G.vexnum; i++) { + if(G.vertices[i].data == u) { + return i; + } + } + + return -1; +} + +/* + * å–值 + * + * 返回索引v处的顶点值 + */ +VertexType GetVex(ALGraph G, int v) { + if(v < 0 || v >= G.vexnum) { + return '\0'; // 指定的顶点ä¸å­˜åœ¨ + } + + return G.vertices[v].data; +} + +/* + * 构造一个边/弧结点(ä»…é™å†…部使用) + */ +static ArcNode* newArcNodePtr(int adjvex, ArcNode* nextarc, InfoType* info) { + ArcNode* p = (ArcNode*) malloc(sizeof(ArcNode)); + if(!p) { + exit(OVERFLOW); + } + + p->adjvex = adjvex; + + p->nextarc = nextarc; + + p->info = info; + + return p; +} + +/* + * æ’入边/å¼§ + * + * 如果当å‰å›¾/网是无å‘的,则æ’入一æ¡å¼§éœ€è¦å¢žåŠ ä¸¤ä¸ªé¡¶ç‚¹å…³ç³»ï¼Œä½†å¼§çš„æ•°é‡åªå¢žä¸€ã€‚ + * 对于图/网æ¥è¯´ï¼Œå¯ä»¥åœ¨å¯å˜å‚数中列出边/弧的附加信æ¯ã€‚ + * + * æ³¨ï¼šæ­¤å¤„æŽ¥æ”¶çš„å‚æ•°ä¸ŽMGraph有些ä¸ä¸€æ ·ï¼šç½‘的附加信æ¯ä¸­åŒ…å«äº†å„æ¡è¾¹/å¼§çš„æƒå€¼ã€‚ + */ +Status InsertArc(ALGraph* G, VertexType v, VertexType w, ...) { + int tail, head, k, count; + ArcNode* r; + ArcNode* pre; + Boolean overlay = FALSE; // 是å¦ä¸ºè¦†ç›–添加 + InfoType* info = NULL; // è¾¹/å¼§çš„é™„åŠ ä¿¡æ¯ + va_list ap; + + tail = LocateVex(*G, v); // 获å–顶点v在顶点集中的ä½ç½® + if(tail == -1) { + return ERROR; // 指定的顶点ä¸å­˜åœ¨ + } + + head = LocateVex(*G, w); // 获å–顶点w在顶点集中的ä½ç½® + if(head == -1) { + return ERROR; // 指定的顶点ä¸å­˜åœ¨ + } + + // æ‹’ç»çޝ + if(tail == head) { + return ERROR; + } + + // 如果边/å¼§ä¸Šå­˜åœ¨é™„åŠ ä¿¡æ¯ + if(IncInfo) { + va_start(ap, w); // 在wåŽæŸ¥è¯¢é¦–个å¯å˜å‚æ•° + info = va_arg(ap, InfoType*); // 获å–é™„åŠ ä¿¡æ¯ + va_end(ap); + } + + /* 接下æ¥ï¼Œéœ€è¦æŸ¥æ‰¾åˆé€‚çš„æ’å…¥ä½ç½® */ + + for(count = 0; count < 2; count++) { + pre = NULL; + // 指å‘以tail为尾的首æ¡è¾¹/å¼§ + r = G->vertices[tail].firstarc; + while(r != NULL && r->adjvex < head) { + pre = r; + r = r->nextarc; + } + + // é‡åˆ°äº†ç›¸åŒä½ç½®çš„结点 + if(r != NULL && r->adjvex == head) { + r->info = info; // å¤ç”¨è¯¥ç»“点 + overlay = TRUE; // å‘生了覆盖 + } else { + if(pre == NULL) { + G->vertices[tail].firstarc = newArcNodePtr(head, r, info); + } else { + pre->nextarc = newArcNodePtr(head, r, info); + } + } + + // 如果当å‰å›¾/网是无å‘的,需è¦è€ƒè™‘对称性 + if((G->kind == UDG || G->kind == UDN) && tail != head) { + // 颠倒iå’Œj + k = tail; + tail = head; + head = k; + } else { + break; // 如果是有å‘的,å¯ä»¥ç»“æŸäº† + } + } + + // 在éžè¦†ç›–的情形下,æ‰è€ƒè™‘æ›´æ–°è¾¹/å¼§çš„æ•°é‡ + if(!overlay) { + (*G).arcnum++; // ä¸è®ºæœ‰å‘æ— å‘,边/å¼§æ•°åªå¢žä¸€ + } + + return OK; +} + +/* + * 以图形化形å¼è¾“出当å‰ç»“æž„ + */ +void PrintGraph(ALGraph G) { + int i; + ArcNode* p; + + if(G.vexnum == 0) { + printf("空图,无需打å°ï¼\n"); + return; + } + + printf("当å‰å›¾/ç½‘åŒ…å« %2d 个顶点, %2d æ¡è¾¹/å¼§...\n", G.vexnum, G.arcnum); + + for(i = 0; i < G.vexnum; i++) { + printf("%c ===> ", G.vertices[i].data); + + p = G.vertices[i].firstarc; + while(p != NULL) { + if(IncInfo == 0) { + printf("%c ", G.vertices[p->adjvex].data); + + // 对于网,会从其附加信æ¯ä¸­èŽ·å–到æƒå€¼ + } else { + printf("%c[%2d] ", G.vertices[p->adjvex].data, p->info->weight); + } + + p = p->nextarc; + + if(p != NULL) { + printf("- "); + } + } + + printf("\n"); + } +} diff --git a/CLion/ExerciseBook/07.42/ALGraph.h b/CLion/ExerciseBook/07.42/ALGraph.h new file mode 100644 index 0000000..d8476d2 --- /dev/null +++ b/CLion/ExerciseBook/07.42/ALGraph.h @@ -0,0 +1,150 @@ +/*================== + * 图的邻接表存储表示 + ===================*/ + +#ifndef ALGRAPH_H +#define ALGRAPH_H + +#include +#include // æä¾›memsetã€strcmp 原型 +#include // æä¾›å®va_listã€va_startã€va_argã€va_end +#include // æä¾›mallocã€reallocã€freeã€exit原型 +#include "Status.h" //**â–²01 绪论**// + +/* + * 注: + * + * 通常æ¥è®²ï¼Œæ— æƒå›¾è¢«ç®€ç§°ä¸ºã€å›¾ã€‘,有æƒå›¾è¢«ç®€ç§°ä¸ºã€ç½‘】。 + * æ— å‘图/网中的顶点关系被称为ã€è¾¹ã€‘,有å‘图/网中的顶点关系被称为ã€å¼§ã€‘,并区分弧头与弧尾。 + * 实际表述中,未必会严格éµå®ˆä»¥ä¸Šå‘½å。 + * + * 当å‰ç»“构适åˆå­˜å‚¨è¾¹/弧比较稀ç–的图/网。 + * + * ★ æ’入边/å¼§çš„ä¿¡æ¯æ—¶ï¼Œè¿™é‡Œçš„实现是按"å‡åº"æ’入的,这使得æ’入的弧是按"å‡åº"排列的。 + */ + + +/* å®å®šä¹‰ */ +#define MAX_VERTEX_NUM 26 // 最大顶点个数 + + +// 图的类型 +typedef enum { + DG, // 0-有å‘图 + DN, // 1-有å‘网(带æƒå€¼) + UDG, // 2-æ— å‘图 + UDN // 3-æ— å‘网(带æƒå€¼) +} GraphKind; + +// 顶点类型 +typedef char VertexType; + +// è¾¹/å¼§çš„ç›¸å…³é™„åŠ ä¿¡æ¯ +typedef struct { + /* + * 注: + * æ•™æä¸­ç»™å‡ºçš„结构åªè€ƒè™‘了无æƒå›¾ï¼Œè€Œæ²¡è€ƒè™‘有æƒå›¾(网)。 + * 这里为了把“网â€çš„æƒ…形也考虑进去,特在附加信æ¯ä¸­å¢žåŠ äº†"æƒé‡"属性。 + */ + int weight; +} InfoType; + +/* è¾¹/弧结点 */ +typedef struct ArcNode { + int adjvex; // 该弧所指å‘的顶点的ä½ç½® + struct ArcNode* nextarc; // 指å‘下一æ¡å¼§çš„æŒ‡é’ˆ + InfoType* info; // 弧的附加信æ¯ï¼Œé€šå¸¸å¿½ç•¥ +} ArcNode; + +// æ¯ä¸ªé“¾è¡¨çš„头结点 +typedef struct VNode { + VertexType data; // é¡¶ç‚¹ä¿¡æ¯ + ArcNode* firstarc; // 指å‘第一æ¡ä¾é™„该顶点的弧的指针 +} VNode; + +/* 图的邻接表存储表示类型定义 */ +typedef struct { + VNode vertices[MAX_VERTEX_NUM]; // 邻接表 + int vexnum, arcnum; // 图/网的顶点数和弧数 + GraphKind kind; // 图的类型标志 +} ALGraph; + + +// è¾¹/弧上是å¦å­˜åœ¨é™„åŠ ä¿¡æ¯ +extern Boolean IncInfo; + + +/* + * 创建 + * + *ã€å¤‡æ³¨ã€‘ + * + * æ•™æä¸­é»˜è®¤ä»ŽæŽ§åˆ¶å°è¯»å–æ•°æ®ã€‚ + * 这里为了方便测试,é¿å…æ¯æ¬¡è¿è¡Œéƒ½æ‰‹åŠ¨è¾“å…¥æ•°æ®ï¼Œ + * 因而å…许选择从预设的文件pathä¸­è¯»å–æµ‹è¯•æ•°æ®ã€‚ + * + * 如果需è¦ä»ŽæŽ§åˆ¶å°è¯»å–æ•°æ®ï¼Œåˆ™path为NULL,或path[kind]为""。 + * 如果需è¦ä»Žæ–‡ä»¶ä¸­è¯»å–æ•°æ®ï¼Œåˆ™éœ€è¦åœ¨path中填写文件åä¿¡æ¯ã€‚ + */ +Status CreateGraph(ALGraph* G, char* path[]); + +/* + * 构造有å‘图 + */ +static Status CreateDG(ALGraph* G); + +/* + * 构造有å‘网 + */ +static Status CreateDN(ALGraph* G); + +/* + * 构造无å‘图 + */ +static Status CreateUDG(ALGraph* G); + +/* + * 构造无å‘网 + */ +static Status CreateUDN(ALGraph* G); + +/* + * 录入边/å¼§çš„ç›¸å…³é™„åŠ ä¿¡æ¯ + */ +static void Input(ALGraph G, InfoType** info); + +/* + * 查找 + * + * 返回顶点u在图/网中的ä½ç½® + */ +int LocateVex(ALGraph G, VertexType u); + +/* + * å–值 + * + * 返回索引v处的顶点值 + */ +VertexType GetVex(ALGraph G, int v); + +/* + * 构造一个边/弧结点(ä»…é™å†…部使用) + */ +static ArcNode* newArcNodePtr(int adjvex, ArcNode* nextarc, InfoType* info); + +/* + * æ’入边/å¼§ + * + * 如果当å‰å›¾/网是无å‘的,则æ’入一æ¡å¼§éœ€è¦å¢žåŠ ä¸¤ä¸ªé¡¶ç‚¹å…³ç³»ï¼Œä½†å¼§çš„æ•°é‡åªå¢žä¸€ã€‚ + * 对于图/网æ¥è¯´ï¼Œå¯ä»¥åœ¨å¯å˜å‚数中列出边/弧的附加信æ¯ã€‚ + * + * æ³¨ï¼šæ­¤å¤„æŽ¥æ”¶çš„å‚æ•°ä¸ŽMGraph有些ä¸ä¸€æ ·ï¼šç½‘的附加信æ¯ä¸­åŒ…å«äº†å„æ¡è¾¹/å¼§çš„æƒå€¼ã€‚ + */ +Status InsertArc(ALGraph* G, VertexType v, VertexType w, ...); + +/* + * 以图形化形å¼è¾“出当å‰ç»“æž„ + */ +void PrintGraph(ALGraph G); + +#endif diff --git a/CLion/ExerciseBook/07.42/CMakeLists.txt b/CLion/ExerciseBook/07.42/CMakeLists.txt new file mode 100644 index 0000000..f3aa3ee --- /dev/null +++ b/CLion/ExerciseBook/07.42/CMakeLists.txt @@ -0,0 +1,12 @@ +# 包å«å…¬å…±åº“ +include_directories(${CMAKE_SOURCE_DIR}/Status) + +# 生æˆå¯æ‰§è¡Œæ–‡ä»¶ +add_executable(07.42 ALGraph.h ALGraph.c ShortestPaths.h ShortestPaths.c 07.42.c) +# 链接公共库 +target_link_libraries(07.42 Scanf_lib) + +# è®°å½•è¦æ‹·è´åˆ°*.exeç›®å½•ä¸‹çš„èµ„æºæ–‡ä»¶ +file(GLOB TestData TestData*.txt) +# å°†èµ„æºæ–‡ä»¶æ‹·è´åˆ°*.exe目录下,ä¸ç„¶æ— æ³•加载 +file(COPY ${TestData} DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) diff --git a/CLion/ExerciseBook/07.42/ShortestPaths.c b/CLion/ExerciseBook/07.42/ShortestPaths.c new file mode 100644 index 0000000..2756d30 --- /dev/null +++ b/CLion/ExerciseBook/07.42/ShortestPaths.c @@ -0,0 +1,334 @@ +/*==================== + * 最短路径算法 + * + * 包å«ç®—法: 7.15ã€7.16 + =====================*/ + +#include "ShortestPaths.h" + +/* + * 存储å„对顶点之间的关系。 + * + * 对于图æ¥è¯´ï¼Œå­˜å‚¨0表示两顶点ä¸ç›´æŽ¥è¿žé€šï¼Œå­˜å‚¨1表示两顶点直接连通; + * 对于网æ¥è¯´ï¼Œå­˜å‚¨çš„æ˜¯é¡¶ç‚¹ä¹‹é—´çš„æƒå€¼ï¼Œæƒå€¼ä¸ºINFINITE表示两顶点ä¸ç›´æŽ¥è¿žé€šã€‚ + */ +static int adjs[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; + + +/* + * åº”å½“åœ¨æ‰§è¡Œè¿ªæ°æ–¯ç‰¹æ‹‰ç®—法之å‰è¢«è°ƒç”¨ï¼Œç”¨æ¥è®¡ç®—å„顶点之间的关系。 + */ +void GetAdjs(ALGraph G) { + int i, j; + ArcNode* p; + + for(i = 0; i < G.vexnum; i++) { + // åˆå§‹åŒ–顶点关系 + for(j = 0; j < G.vexnum; j++) { + // 如果是网,åªèµ°æ­¤åˆ†æ”¯ + if(G.kind == DN || G.kind == UDN) { + adjs[i][j] = INFINITE; + } + + // 如果是图,åªèµ°æ­¤åˆ†æ”¯ + if(G.kind == DG || G.kind == UDG) { + adjs[i][j] = 0; + } + } + + // 处ç†ç›´æŽ¥è¿žæŽ¥çš„顶点 + for(p = G.vertices[i].firstarc; p != NULL; p = p->nextarc) { + // 如果是网,åªèµ°æ­¤åˆ†æ”¯ + if(G.kind == DN || G.kind == UDN) { + adjs[i][p->adjvex] = p->info->weight; + } + + // 如果是图,åªèµ°æ­¤åˆ†æ”¯ + if(G.kind == DG || G.kind == UDG) { + adjs[i][p->adjvex] = 1; + } + } + } +} + +/* + * ████████ 算法7.15 ████████ + * + * è¿ªæ°æ–¯ç‰¹æ‹‰(Dijkstra)ç®—æ³•æ±‚å•æºæœ€çŸ­è·¯å¾„ + * + * @param G å¾…é历的图。 + * @param v0 啿ºæœ€çŸ­è·¯å¾„的起点。 + * @param P 存储从v0到其余å„顶点的最短路径信æ¯ã€‚ + * P[j][k]==TRUE代表从v0->j的最短路径会ç»è¿‡é¡¶ç‚¹kï¼›å¦åˆ™ï¼Œä»£è¡¨ä¸ç»è¿‡ã€‚ + * 注: + * 1.该数组åªåæ˜ äº†é¡¶ç‚¹çš„å­˜åœ¨æ€§ï¼Œè€Œæœªåæ˜ é¡¶ç‚¹åœ¨è·¯å¾„上的次åºã€‚ + * 2.å¦‚æžœä¸¤é¡¶ç‚¹ä¹‹é—´æœ‰å¤šæ¡æœ€çŸ­è·¯å¾„,åªä¼šé€‰å–ä¸€æ¡ + * @param D 存储从v0到其余å„顶点的最短路径代价,在图中,该代价是步长和,在网中,该代价是æƒå€¼å’Œã€‚ + */ +void ShortestPath_DIJ(ALGraph G, int v0, PathMatrix_DIJ P, ShortPathTable_DIJ D) { + int v, w, i, j, min; + Status final[MAX_VERTEX_NUM]; // ç”¨æ¥æ ‡è®°å½“å‰ç»“点是å¦å·²ç»è®¿é—®è¿‡ï¼Œå³æ˜¯å¦å·²åŠ å…¥æœ€çŸ­è·¯å¾„ + + /* + * 预设已访问过的顶点集为S,未访问过的顶点集为V-S + * åˆå§‹æ—¶ï¼Œé¡¶ç‚¹é›†S为空,而顶点集V-S为所有顶点的集åˆV + */ + for(v = 0; v < G.vexnum; v++) { + // åˆå§‹æ—¶ï¼Œæ‰€æœ‰é¡¶ç‚¹å‡æœªè®¿é—®è¿‡ + final[v] = FALSE; + + // åˆå§‹åŒ–v0->v的路径代价 + D[v] = adjs[v0][v]; + + // 预设从v0->vä¸éœ€è¦ç»è¿‡é¡¶ç‚¹w,å³è®¾ç©ºè·¯å¾„ + for(w = 0; w < G.vexnum; w++) { + P[v][w] = FALSE; + } + + // 如果是网,åªèµ°æ­¤åˆ†æ”¯(æ•™æåªå¤„ç†äº†æ­¤ç§æƒ…å½¢) + if(G.kind == DN || G.kind == UDN) { + // 如果v0->v直接连通 + if(D[v] < INFINITE) { + P[v][v0] = TRUE; // 指示v0->vå¿…å°†ç»è¿‡é¡¶ç‚¹v0(端点一) + P[v][v] = TRUE; // 指示v0->vå¿…å°†ç»è¿‡é¡¶ç‚¹v(端点二) + } + } + + // 如果是图,åªèµ°æ­¤åˆ†æ”¯ + if(G.kind == DG || G.kind == UDG) { + // 如果v0到v直接连通 + if(D[v] != 0) { + P[v][v0] = TRUE; // 指示v0->vå¿…å°†ç»è¿‡é¡¶ç‚¹v0(端点一) + P[v][v] = TRUE; // 指示v0->vå¿…å°†ç»è¿‡é¡¶ç‚¹v(端点二) + } + } + } + + // åˆå§‹åŒ–,v0进入顶点集S + D[v0] = 0; + final[v0] = TRUE; + + /* + * 开始主循环,é历其余G1.vexnum-1个顶点。 + * æ¯æ¬¡æ±‚å¾—v0到æŸä¸ªé¡¶ç‚¹çš„æœ€çŸ­è·¯å¾„,则将该顶点从顶点集V-S中挪到顶点集S中 + */ + for(i = 1; i < G.vexnum; i++) { + /* + * æ¯æ¬¡è¿›å…¥é€‰å–最近顶点之å‰ï¼Œéƒ½åº”当将vé‡ç½®ä¸ºä¸€ä¸ªæ­£å¸¸é¡¶ç‚¹åºå·ä¹‹å¤–的值 + * (æ•™æä¸­æ— æ­¤æ­¥éª¤ï¼Œéœ€è¦è¡¥ä¸Šï¼Œå¦åˆ™ä¼šè¿›è¡Œå¾ˆå¤šæ¬¡æ— æ•ˆçš„循环) + */ + v = -1; + + // 记录å„顶点与顶点v0的最短è·ç¦» + min = INFINITE; + + // é历顶点集V-S(所有未加入路径的顶点),从中选出è·ç¦»v0更近的顶点 + for(w = 0; w < G.vexnum; w++) { + // 如果w顶点在V-S中(未加入最短路径) + if(!final[w]) { + // 对于图æ¥è¯´ï¼Œè·ç¦»ä¸º0æ„味ç€ä¸¤é¡¶ç‚¹ä¸è¿žé€š + if((G.kind == DG || G.kind == UDG) && D[w] == 0) { + continue; + } + + // 如果v0到wçš„è·ç¦»D[w]å°äºŽå½“å‰é¢„设的最å°è·ç¦»ï¼Œåˆ™éœ€è¦æ›´æ–°é¡¶ç‚¹å’Œè·ç¦»ä¿¡æ¯ + if(D[w] < min) { + v = w; // 记下未访问的顶点中è·ç¦»v0更近的顶点,或者å¯ä»¥ç†è§£ä¸ºè®°ä¸‹é¡¶ç‚¹é›†V-S中è·ç¦»é¡¶ç‚¹é›†S更近的顶点 + min = D[w]; // 记下更近的è·ç¦» + } + } + } + + // 找到了更近的顶点 + if(v != -1) { + // 将顶点集V-S中当å‰è·ç¦»v0顶点最近的v加入S集 + final[v] = TRUE; + } else { + // 如果没找到更近的顶点,说明顶点v0与V-S中的剩余顶点没有连接,此时å¯ä»¥ç›´æŽ¥ç»“æŸç¨‹åºäº† + return; + } + + // 以上述的顶点våšè·³æ¿ï¼Œæ›´æ–°é¡¶ç‚¹v0到V-S集中其余点顶点的最短路径 + for(w = 0; w < G.vexnum; w++) { + // 如果是网,åªèµ°æ­¤åˆ†æ”¯(æ•™æåªå¤„ç†äº†æ­¤ç§æƒ…å½¢) + if(G.kind == DN || G.kind == UDN) { + /* + * 为了é¿å…溢出,需è¦ç¡®ä¿adjs[v][w]ä¸ä¸ºINFINITE。 + * 此处其实没必è¦åˆ¤æ–­min!=INFINITE,因为如果没找到更近的顶点时,上é¢å°±æå‰è¿”回了。 + * (æ•™æçš„伪ç ä¸­æœªå¤„ç†æº¢å‡ºï¼Œæ•…需è¦è‡ªè¡Œæ·»åŠ ) + */ + if(min != INFINITE && adjs[v][w] != INFINITE) { + // 更新顶点集S到顶点集V-S的最近è·ç¦» + if(!final[w] && (min + adjs[v][w] < D[w])) { + // æ›´æ–°è·ç¦»ï¼šç”±äºŽé¡¶ç‚¹v0->wç»ç”±våŽä¼šèŽ·å¾—æ›´çŸ­çš„è·ç¦»ï¼Œæ•…此处需è¦è®°ä¸‹è¯¥è·ç¦» + D[w] = min + adjs[v][w]; + + /* 更新路径:P[w] = P[v] + [w] */ + + // 先将v0->w的路径更新为v0->j的路径 + for(j = 0; j < G.vexnum; j++) { + P[w][j] = P[v][j]; + } + + // å†å°†w添加到v0->w的路径中 + P[w][w] = TRUE; + } + } + } + + // 如果是图,åªèµ°æ­¤åˆ†æ”¯ + if(G.kind == DG || G.kind == UDG) { + // 更新顶点集S到顶点集V-S的最近è·ç¦» + if(!final[w] && adjs[v][w] != 0 && D[w] == 0) { + // æ›´æ–°è·ç¦»ï¼šç”±äºŽé¡¶ç‚¹v0->wç»ç”±våŽä¼šèŽ·å¾—æ›´çŸ­çš„è·ç¦»ï¼Œæ•…此处需è¦è®°ä¸‹è¯¥è·ç¦» + D[w] = D[v] + 1; // 图中相邻顶点步长为1 + + /* 更新路径:P[w] = P[v] + [w] */ + + // 先将v0->w的路径更新为v0->j的路径 + for(j = 0; j < G.vexnum; j++) { + P[w][j] = P[v][j]; + } + + // å†å°†w添加到v0->w的路径中 + P[w][w] = TRUE; + } + } + } + } +} + +/* + * 打å°ä½¿ç”¨è¿ªæ°æ–¯ç‰¹æ‹‰(Dijkstra)算法求å–çš„å•æºæœ€çŸ­è·¯å¾„ + */ +void PrintPath_DIJ(ALGraph G, int v0, PathMatrix_DIJ P, ShortPathTable_DIJ D) { + int j; + + // é历所有路径 + for(j = 0; j < G.vexnum; j++) { + if(P[j][v0] == FALSE) { + printf("%c 到 %c 之间没有通路\n", GetVex(G, v0), GetVex(G, j)); + continue; + } + + printf("%c 到 %c 之间的最短è·ç¦»ä¸º%2d,其最短路径为:", GetVex(G, v0), GetVex(G, j), D[j]); + + /* + * å°†v0->j之间的无åºé¡¶ç‚¹æŽ’列æˆä¸€æ¡æœ‰åºè·¯å¾„åŽæ‰“å° + * P[i]指示v0->jè¿™æ¡è·¯å¾„上ç»è¿‡çš„顶点 + */ + PrintPath(G, v0, j, P[j]); + } +} + +/* + * 打å°ä»Ža到b的路径,该路径的顶点信æ¯ä½äºŽP中 + */ +static void PrintPath(ALGraph G, int a, int b, Boolean P[MAX_VERTEX_NUM]) { + int i; + int vexs[MAX_VERTEX_NUM + 1]; + int path[MAX_VERTEX_NUM + 1]; + + vexs[0] = 0; + + // 获å–v0->iè¿™æ¡é€”径上的所有顶点,å¯èƒ½æ˜¯æ— åºçš„ + for(i = 0; i < G.vexnum; i++) { + if(P[i] == TRUE) { + vexs[0]++; + vexs[vexs[0]] = i; + } + } + + // åªæœ‰ä¸¤ä¸ªé¡¶ç‚¹çš„æƒ…å½¢ä¸‹å¿«é€Ÿå¤„ç† + if(vexs[0] == 2) { + path[0] = 2; + path[1] = a; + path[2] = b; + goto print; + } + + // åªæœ‰ä¸‰ä¸ªé¡¶ç‚¹çš„æƒ…å½¢ä¸‹å¿«é€Ÿå¤„ç† + if(vexs[0] == 3) { + path[0] = 3; + path[1] = a; + for(i = 1; i <= vexs[0]; i++) { + if(vexs[i] != a && vexs[i] != b) { + path[2] = vexs[i]; + break; + } + } + path[3] = b; + goto print; + } + + path[0] = 1; + path[1] = a; + + for(i = 1; i <= vexs[0]; i++) { + if(vexs[i] == a) { + vexs[i] = -1; + break; + } + } + + Find(G, a, b, vexs, path); + +print: + // æ‰“å°æŽ’åˆ—å¥½çš„è·¯å¾„ + for(i = 1; i <= path[0]; i++) { + printf("%c ", GetVex(G, path[i])); + } + + printf("\n"); +} + +/* + * 利用广度预先æœç´¢æ‰¾åˆ°ä¸€æ¡ä»Žpre到b的路径,该路径上路过的所有顶点ä½äºŽvexs中,找出的路径存储到path中 + */ +static Status Find(ALGraph G, int pre, int b, int vexs[MAX_VERTEX_NUM + 1], int path[MAX_VERTEX_NUM + 1]) { + int i; + int tmp; + Status s; + + for(i = 1; i <= vexs[0]; i++) { + // 已加入到路径 + if(vexs[i] == -1) { + continue; + } + + // ä¸è¿žé€š + if(((G.kind == DN || G.kind == UDN) && adjs[pre][vexs[i]] == INFINITE) + || ((G.kind == DG || G.kind == UDG) && adjs[pre][vexs[i]] == 0)) { + continue; + } + + path[0]++; + path[path[0]] = vexs[i]; + + // é‡åˆ°ç»ˆç‚¹ + if(vexs[i] == b) { + // 找到了最短路径 + if(path[0] == vexs[0]) { + return OK; + } else { + path[0]--; + continue; + } + } + + tmp = vexs[i]; + vexs[i] = -1; + + s = Find(G, tmp, b, vexs, path); + + if(s == OK) { + return OK; + } else { + // æ¢å¤è¯¥é¡¶ç‚¹ï¼Œä»¥ä¾¿åŽç»­é‡æ–°æœç´¢ + vexs[i] = tmp; + path[0]--; + } + } + + return ERROR; +} diff --git a/CLion/ExerciseBook/07.42/ShortestPaths.h b/CLion/ExerciseBook/07.42/ShortestPaths.h new file mode 100644 index 0000000..8c175a5 --- /dev/null +++ b/CLion/ExerciseBook/07.42/ShortestPaths.h @@ -0,0 +1,59 @@ +/*==================== + * 最短路径算法 + * + * 包å«ç®—法: 7.15ã€7.16 + =====================*/ + +#ifndef SHORTESTPATHS_H +#define SHORTESTPATHS_H + +#include +#include +#include "Status.h" //**â–²01 绪论**// +#include "ALGraph.h" //**â–²07 图**// + +// æƒå€¼çš„æœ€å¤§å€¼ï¼Œç”¨åœ¨ç½‘中,表示两顶点ä¸ç›´æŽ¥è¿žé€š +#define INFINITE INT_MAX + + +// Dijkstra算法中的最短路径矩阵,是一个二维数组 +typedef Boolean PathMatrix_DIJ[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; +// Dijkstra算法中的最短路径代价,该代价å¯èƒ½æ˜¯æ­¥é•¿å’Œï¼Œä¹Ÿå¯èƒ½æ˜¯æƒå€¼å’Œ +typedef int ShortPathTable_DIJ[MAX_VERTEX_NUM]; + + +/* + * åº”å½“åœ¨æ‰§è¡Œè¿ªæ°æ–¯ç‰¹æ‹‰ç®—法之å‰è¢«è°ƒç”¨ï¼Œç”¨æ¥è®¡ç®—å„顶点之间的关系。 + */ +void GetAdjs(ALGraph G); + +/* + * ████████ 算法7.15 ████████ + * + * è¿ªæ°æ–¯ç‰¹æ‹‰(Dijkstra)ç®—æ³•æ±‚å•æºæœ€çŸ­è·¯å¾„ + * + * @param G å¾…é历的图。 + * @param v0 啿ºæœ€çŸ­è·¯å¾„的起点。 + * @param P 存储从v0到其余å„顶点的最短路径信æ¯ã€‚ + * P[j][k]==TRUE代表从v0->j的最短路径会ç»è¿‡é¡¶ç‚¹kï¼›å¦åˆ™ï¼Œä»£è¡¨ä¸ç»è¿‡ã€‚ + * 注:该数组åªåæ˜ äº†é¡¶ç‚¹çš„å­˜åœ¨æ€§ï¼Œè€Œæœªåæ˜ é¡¶ç‚¹åœ¨è·¯å¾„上的次åºã€‚ + * @param D 存储从v0到其余å„顶点的最短路径代价,在图中,该代价是步长和,在网中,该代价是æƒå€¼å’Œã€‚ + */ +void ShortestPath_DIJ(ALGraph G, int v0, PathMatrix_DIJ P, ShortPathTable_DIJ D); + +/* + * 打å°ä½¿ç”¨è¿ªæ°æ–¯ç‰¹æ‹‰(Dijkstra)算法求å–çš„å•æºæœ€çŸ­è·¯å¾„ + */ +void PrintPath_DIJ(ALGraph G, int v0, PathMatrix_DIJ P, ShortPathTable_DIJ D); + +/* + * 打å°ä»Ža到b的路径,该路径的顶点信æ¯ä½äºŽP中 + */ +static void PrintPath(ALGraph G, int a, int b, Boolean P[MAX_VERTEX_NUM]) ; + +/* + * 利用广度预先æœç´¢æ‰¾åˆ°ä¸€æ¡ä»Žpre到b的路径,该路径上路过的所有顶点ä½äºŽvexs中,找出的路径存储到path中 + */ +static Status Find(ALGraph G, int pre, int b, int vexs[MAX_VERTEX_NUM], int path[MAX_VERTEX_NUM]); + +#endif diff --git a/CLion/ExerciseBook/07.42/TestData_DG.txt b/CLion/ExerciseBook/07.42/TestData_DG.txt new file mode 100644 index 0000000..0173cf8 --- /dev/null +++ b/CLion/ExerciseBook/07.42/TestData_DG.txt @@ -0,0 +1,6 @@ +图类型→0(有å‘图) +顶点数→14 +弧数→20 +弧是å¦å¸¦æœ‰å…¶ä»–ä¿¡æ¯â†’0 +顶点集→ã€A,B,C,D,E,F,G,H,I,J,K,L,M,N】 +弧的集åˆâ†’ã€A,C】ã€A,F】ã€B,A】ã€B,H】ã€C,B】ã€D,G】ã€E,H】ã€E,C】ã€F,I】ã€F,G】ã€H,E】ã€H,J】ã€I,E】ã€I,D】ã€I,G】ã€J,D】ã€L,N】ã€N,M】ã€M,L】ã€M,K】 \ No newline at end of file diff --git a/CLion/ExerciseBook/07.42/TestData_DN.txt b/CLion/ExerciseBook/07.42/TestData_DN.txt new file mode 100644 index 0000000..23165c3 --- /dev/null +++ b/CLion/ExerciseBook/07.42/TestData_DN.txt @@ -0,0 +1,6 @@ +图类型→1(有å‘网) +顶点数→14 +弧数→20 +弧是å¦å¸¦æœ‰å…¶ä»–ä¿¡æ¯â†’1 +顶点集→ã€A,B,C,D,E,F,G,H,I,J,K,L,M,N】 +弧的集åˆâ†’ã€A,C,15】ã€A,F,1】ã€B,A,5】ã€B,H,4】ã€C,B,5】ã€D,G,2】ã€E,H,20】ã€E,C,4】ã€F,I,5】ã€F,G,15】ã€H,E,2】ã€H,J,1】ã€I,E,3】ã€I,D,3】ã€I,G,8】ã€J,D,2】ã€L,N,2】ã€N,M,3】ã€M,L,1】ã€M,K,4】 \ No newline at end of file diff --git a/CLion/ExerciseBook/07.42/TestData_UDG.txt b/CLion/ExerciseBook/07.42/TestData_UDG.txt new file mode 100644 index 0000000..a513bf8 --- /dev/null +++ b/CLion/ExerciseBook/07.42/TestData_UDG.txt @@ -0,0 +1,6 @@ +图类型→2(无å‘图) +顶点数→14 +边数→18 +边是å¦å¸¦æœ‰å…¶ä»–ä¿¡æ¯â†’0 +顶点集→ã€A,B,C,D,E,F,G,H,I,J,K,L,M,N】 +边的集åˆâ†’ã€A,C】ã€C,E】ã€E,I】ã€I,G】ã€G,D】ã€A,B】ã€C,B】ã€E,B】ã€E,H】ã€H,J】ã€J,D】ã€A,F】ã€F,I】ã€F,G】ã€L,M】ã€L,N】ã€M,N】ã€M,K】 \ No newline at end of file diff --git a/CLion/ExerciseBook/07.42/TestData_UDN.txt b/CLion/ExerciseBook/07.42/TestData_UDN.txt new file mode 100644 index 0000000..94e2fd6 --- /dev/null +++ b/CLion/ExerciseBook/07.42/TestData_UDN.txt @@ -0,0 +1,6 @@ +图类型→3(无å‘网) +顶点数→14 +边数→18 +边是å¦å¸¦æœ‰å…¶ä»–ä¿¡æ¯â†’1 +顶点集→ã€A,B,C,D,E,F,G,H,I,J,K,L,M,N】 +边的集åˆâ†’ã€A,C,2】ã€C,E,8】ã€E,I,4】ã€I,G,5】ã€G,D,2】ã€A,B,10】ã€C,B,5】ã€E,B,3】ã€E,H,3】ã€H,J,1】ã€J,D,2】ã€A,F,15】ã€F,I,3】ã€F,G,4】ã€L,M,10】ã€L,N,3】ã€M,N,2】ã€M,K,1】 \ No newline at end of file diff --git a/CLion/ExerciseBook/CMakeLists.txt b/CLion/ExerciseBook/CMakeLists.txt index 83092aa..35d6eff 100644 --- a/CLion/ExerciseBook/CMakeLists.txt +++ b/CLion/ExerciseBook/CMakeLists.txt @@ -122,3 +122,29 @@ add_subdirectory(06.71) add_subdirectory(06.72) add_subdirectory(06.73-06.74) add_subdirectory(06.75-06.76) + +add_subdirectory(07.14+07.16) +add_subdirectory(07.15) +add_subdirectory(07.17) +add_subdirectory(07.18-07.19) +add_subdirectory(07.20) +add_subdirectory(07.21) +add_subdirectory(07.22-07.23) +add_subdirectory(07.24) +add_subdirectory(07.25) +add_subdirectory(07.26) +add_subdirectory(07.27) +add_subdirectory(07.28) +add_subdirectory(07.29) +add_subdirectory(07.30) +add_subdirectory(07.31) +add_subdirectory(07.32) +add_subdirectory(07.33) +add_subdirectory(07.34) +add_subdirectory(07.35) +add_subdirectory(07.36-07.37) +add_subdirectory(07.38) +add_subdirectory(07.39) +add_subdirectory(07.40) +add_subdirectory(07.41) +add_subdirectory(07.42) diff --git a/Dev-C++/ExerciseBook/07.14+07.16/07.14+07.16.cpp b/Dev-C++/ExerciseBook/07.14+07.16/07.14+07.16.cpp new file mode 100644 index 0000000..9255fac --- /dev/null +++ b/Dev-C++/ExerciseBook/07.14+07.16/07.14+07.16.cpp @@ -0,0 +1,181 @@ +#include +#include // Ìṩºêva_list¡¢va_start¡¢va_arg¡¢va_end +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// +#include "ALGraph.h" //**¡ø07 ͼ**// + +/* + * ´´½¨Í¼/±í + */ +Status CreateGraph_7_14(ALGraph* G, char* path[]); + +/* + * ²åÈë¶¥µã + * + * ½«Ö¸¶¨µÄ¶¥µãv×·¼Óµ½¶¥µã¼¯ÖУ¬Î´½¨Á¢¸Ã¶¥µãÓëÆäËû¶¥µãµÄ¹ØÏµ + */ +Status InsertVex_7_16(ALGraph* G, VertexType v); + +/* + * ɾ³ý¶¥µã + * + * ´Ó¶¥µã¼¯ÖÐɾ³ýÖ¸¶¨µÄ¶¥µãv£¬×¢ÒâÐèÒª¸üÐÂÏà¹ØµÄ¶¥µã¹ØÏµ + */ +Status DeleteVex_7_16(ALGraph* G, VertexType v); + +/* + * ²åÈë±ß/»¡ + * + * Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬Ôò²åÈëÒ»Ìõ»¡ÐèÒªÔö¼ÓÁ½¸ö¶¥µã¹ØÏµ£¬µ«»¡µÄÊýÁ¿Ö»ÔöÒ»¡£ + * + * ¶ÔÓÚͼÀ´Ëµ£¬¿ÉÒÔÔڿɱä²ÎÊýÖÐÁгö±ß/»¡µÄ¸½¼ÓÐÅÏ¢£» + * ¶ÔÓÚÍøÀ´Ëµ£¬¿ÉÒÔÔڿɱä²ÎÊýÖÐÒÀ´ÎÁгö±ß/»¡µÄȨֵÒÔ¼°¸½¼ÓÐÅÏ¢¡£ + */ +Status InsertArc_7_16(ALGraph* G, VertexType v, VertexType w, ...); + +/* + * ɾ³ý±ß/»¡ + * + * ´Ëɾ³ýÖ»ÊǸüбß/»¡µÄÁ¬Í¨¹ØÏµ + */ +Status DeleteArc_7_16(ALGraph* G, VertexType v, VertexType w); + + +int main(int argc, char* argv[]) { + ALGraph G; + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ´´½¨²¢Êä³öͼ/Íø...\n"); + { + char* path[4]; + + path[0] = "TestData_DG.txt"; + path[1] = "TestData_DN.txt"; + path[2] = "TestData_UDG.txt"; + path[3] = "TestData_UDN.txt"; + + CreateGraph_7_14(&G, path); + PrintGraph(G); + printf("\n"); + } + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ɾ³ý¶¥µã...\n"); + { + VertexType v = 'X'; + + printf("ɾ³ý¶¥µã '%c' ºóµÄͼΪ£º\n", v); + DeleteVex_7_16(&G, v); + PrintGraph(G); + printf("\n"); + } + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ²åÈë¶¥µã...\n"); + { + VertexType v = 'Y'; + + printf("²åÈë¶¥µã '%c' ºóµÄͼΪ£º\n", v); + InsertVex_7_16(&G, v); + PrintGraph(G); + printf("\n"); + } + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ²åÈë±ß/»¡...\n"); + { + // ×¢£ºÊÇÖØ¸´µÄ±ß + VertexType v[10] = {'B', 'C', 'E', 'Y', 'Y', 'Y', 'D', 'D', 'E', 'E'}; + VertexType w[10] = {'Y', 'Y', 'Y', 'A', 'B', 'D', 'C', 'A', 'B', 'D'}; + InfoType info[10] = {{8}, {5}, {1}, {11}, {2}, {6}, {3}, {7}, {2}, {9}}; + int k; + + // ͼ + if(G.kind == DG || G.kind == UDG) { + for(k = 0; k < 10; k++) { + printf("²åÈëÎÞȨֵµÄ±ß£º<%c, %c>...\n", v[k], w[k]); + InsertArc_7_16(&G, v[k], w[k]); + } + + // Íø + } else if(G.kind == DN || G.kind == UDN) { + for(k = 0; k < 10; k++) { + printf("²åÈë´øÈ¨ÖµµÄ±ß£º<%c, %c, %d>...\n", v[k], w[k], info[k].weight); + InsertArc_7_16(&G, v[k], w[k], &info[k]); + } + } else { + return ERROR; + } + + PrintGraph(G); + printf("\n"); + } + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ɾ³ý±ß/»¡...\n"); + { + VertexType v[3] = {'D', 'E', 'F'}; + VertexType w[3] = {'A', 'B', 'B'}; + int k; + + for(k = 0; k < 3; k++) { + printf("ɾ³ý±ß£º<%c, %c>...\n", v[k], w[k]); + DeleteArc_7_16(&G, v[k], w[k]); + } + PrintGraph(G); + printf("\n"); + } + + return 0; +} + + +/* + * ´´½¨Í¼/±í + */ +Status CreateGraph_7_14(ALGraph* G, char* path[]) { + return CreateGraph(G, path); +} + +/* + * ²åÈë¶¥µã + * + * ½«Ö¸¶¨µÄ¶¥µãv×·¼Óµ½¶¥µã¼¯ÖУ¬Î´½¨Á¢¸Ã¶¥µãÓëÆäËû¶¥µãµÄ¹ØÏµ + */ +Status InsertVex_7_16(ALGraph* G, VertexType v) { + return InsertVex(G, v); +} + +/* + * ɾ³ý¶¥µã + * + * ´Ó¶¥µã¼¯ÖÐɾ³ýÖ¸¶¨µÄ¶¥µãv£¬×¢ÒâÐèÒª¸üÐÂÏà¹ØµÄ¶¥µã¹ØÏµ + */ +Status DeleteVex_7_16(ALGraph* G, VertexType v) { + return DeleteVex(G, v); +} + +/* + * ²åÈë±ß/»¡ + * + * Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬Ôò²åÈëÒ»Ìõ»¡ÐèÒªÔö¼ÓÁ½¸ö¶¥µã¹ØÏµ£¬µ«»¡µÄÊýÁ¿Ö»ÔöÒ»¡£ + * + * ¶ÔÓÚͼÀ´Ëµ£¬¿ÉÒÔÔڿɱä²ÎÊýÖÐÁгö±ß/»¡µÄ¸½¼ÓÐÅÏ¢£» + * ¶ÔÓÚÍøÀ´Ëµ£¬¿ÉÒÔÔڿɱä²ÎÊýÖÐÒÀ´ÎÁгö±ß/»¡µÄȨֵÒÔ¼°¸½¼ÓÐÅÏ¢¡£ + */ +Status InsertArc_7_16(ALGraph* G, VertexType v, VertexType w, ...) { + va_list ap; + InfoType* info = NULL; // ±ß/»¡µÄ¸½¼ÓÐÅÏ¢ + + // Èç¹û±ß/»¡ÉÏ´æÔÚ¸½¼ÓÐÅÏ¢ + if(IncInfo) { + va_start(ap, w); // ÔÚwºó²éѯÊ׸ö¿É±ä²ÎÊý + info = va_arg(ap, InfoType*); // »ñÈ¡¸½¼ÓÐÅÏ¢ + va_end(ap); + } + + return InsertArc(G, v, w, info); +} + +/* + * ɾ³ý±ß/»¡ + * + * ´Ëɾ³ýÖ»ÊǸüбß/»¡µÄÁ¬Í¨¹ØÏµ + */ +Status DeleteArc_7_16(ALGraph* G, VertexType v, VertexType w) { + return DeleteArc(G, v, w); +} diff --git a/Dev-C++/ExerciseBook/07.14+07.16/07.14+07.16.dev b/Dev-C++/ExerciseBook/07.14+07.16/07.14+07.16.dev new file mode 100644 index 0000000..f976fbc --- /dev/null +++ b/Dev-C++/ExerciseBook/07.14+07.16/07.14+07.16.dev @@ -0,0 +1,118 @@ +[Project] +FileName=07.14+07.16.dev +Name=07.14+07.16 +Type=1 +Ver=2 +ObjFiles= +Includes= +Libs= +PrivateResource= +ResourceIncludes= +MakeIncludes= +Compiler= +CppCompiler= +Linker= +IsCpp=0 +Icon= +ExeOutput= +ObjectOutput= +LogOutput= +LogOutputEnabled=0 +OverrideOutput=0 +OverrideOutputName= +HostApplication= +UseCustomMakefile=0 +CustomMakefile= +CommandLine= +Folders= +IncludeVersionInfo=0 +SupportXPThemes=0 +CompilerSet=1 +CompilerSettings=0000000000000000001000000 +UnitCount=7 + +[VersionInfo] +Major=1 +Minor=0 +Release=0 +Build=0 +LanguageID=1033 +CharsetID=1252 +CompanyName= +FileVersion= +FileDescription=Developed using the Dev-C++ IDE +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion= +AutoIncBuildNr=0 +SyncProduct=1 + +[Unit1] +FileName=07.14+07.16.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit2] +FileName=ALGraph.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit3] +FileName=ALGraph.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit4] +FileName=TestData_DG.txt +Folder= +Compile=0 +Link=0 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit5] +FileName=TestData_DN.txt +Folder= +Compile=0 +Link=0 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit6] +FileName=TestData_UDG.txt +Folder= +Compile=0 +Link=0 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit7] +FileName=TestData_UDN.txt +Folder= +Compile=0 +Link=0 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + diff --git a/Dev-C++/ExerciseBook/07.14+07.16/ALGraph.cpp b/Dev-C++/ExerciseBook/07.14+07.16/ALGraph.cpp new file mode 100644 index 0000000..3b0515d --- /dev/null +++ b/Dev-C++/ExerciseBook/07.14+07.16/ALGraph.cpp @@ -0,0 +1,737 @@ +/*================== + * ͼµÄÁÚ½Ó±í´æ´¢±íʾ + ===================*/ + +#include "ALGraph.h" + +// ¼ÈëÊý¾ÝµÄÔ´Îļþ£»fpΪnullʱ£¬ËµÃ÷ÐèÒª´Ó¿ØÖÆÌ¨Â¼Èë +static FILE* fp = NULL; + +/* + * IncInfoָʾ¸Ãͼ/ÍøµÄ±ß/»¡ÉÏÊÇ·ñ´æÔÚ¸½¼ÓÐÅÏ¢¡£ + * Èç¹ûÆäÖµ²»Îª0£¬Ôò±íʾÎÞ¸½¼ÓÐÅÏ¢£¬·ñÔò£¬±íʾ´æÔÚ¸½¼ÓÐÅÏ¢¡£ + */ +Boolean IncInfo = FALSE; + +// ·ÃÎʱêÖ¾Êý×飬¼Ç¼·ÃÎʹýµÄ¶¥µã +static Boolean visited[MAX_VERTEX_NUM]; + +// º¯Êý±äÁ¿ +static Status (* VisitFunc)(VertexType e); + + +/* + * ´´½¨ + * + *¡¾±¸×¢¡¿ + * + * ½Ì²ÄÖÐĬÈÏ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý¡£ + * ÕâÀïΪÁË·½±ã²âÊÔ£¬±ÜÃâÿ´ÎÔËÐж¼ÊÖ¶¯ÊäÈëÊý¾Ý£¬ + * Òò¶øÔÊÐíÑ¡Ôñ´ÓÔ¤ÉèµÄÎļþpathÖжÁÈ¡²âÊÔÊý¾Ý¡£ + * + * Èç¹ûÐèÒª´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý£¬ÔòpathΪNULL£¬»òpath[kind]Ϊ""¡£ + * Èç¹ûÐèÒª´ÓÎļþÖжÁÈ¡Êý¾Ý£¬ÔòÐèÒªÔÚpathÖÐÌîдÎļþÃûÐÅÏ¢¡£ + */ +Status CreateGraph(ALGraph* G, char* path[]) { + int readFromConsole; // ÊÇ·ñ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý + int kind; + Status flag; + + printf("ÇëÊäÈëͼµÄÀàÐÍ(0-ÓÐÏòͼ ©¦ 1-ÓÐÏòÍø ©¦ 2-ÎÞÏòͼ ©¦ 3-ÎÞÏòÍø)£º"); + scanf("%d", &kind); + + // ÀàÐͲ»ºÏ¹æ + if(kind < 0 || kind > 3) { + return ERROR; + } + + // Èç¹ûûÓÐÎļþ·¾¶ÐÅÏ¢£¬Ôò´Ó¿ØÖÆÌ¨¶ÁÈ¡ÊäÈë + readFromConsole = (path == NULL) || strcmp(path[kind], "") == 0; + + // ÐèÒª´ÓÎļþ¶ÁÈ¡ + if(readFromConsole) { + (*G).kind = GraphKind(kind); // ¼Ç¼ͼ/ÍøµÄÀàÐÍ + } else { + // ´ò¿ªÎļþ£¬×¼±¸¶ÁÈ¡²âÊÔÊý¾Ý + fp = fopen(path[kind], "r"); + if(fp == NULL) { + return ERROR; + } + + // ¼ÈëͼµÄÀàÐÍ + ReadData(fp, "%d", &((*G).kind)); + } + + // Ëæ»ú´´½¨ÓÐÏòͼ/Íø»òÎÞÏòͼ/ÍøµÄÒ»ÖÖ + switch((*G).kind) { + case DG: + flag = CreateDG(G); + break; + case DN: + flag = CreateDN(G); + break; + case UDG: + flag = CreateUDG(G); + break; + case UDN: + flag = CreateUDN(G); + break; + default: + flag = ERROR; + break; + } + + if(fp != NULL) { + fclose(fp); + fp = NULL; + } + + return flag; +} + +/* + * ¹¹ÔìÓÐÏòͼ + */ +static Status CreateDG(ALGraph* G) { + int i, k; + int vexnum, arcnum; + VertexType v1, v2; + InfoType* info = NULL; + + (*G).vexnum = (*G).arcnum = 0; + + if(fp == NULL) { + printf("ÇëÊäÈëÓÐÏòͼµÄ¶¥µãÊý£º"); + scanf("%d", &vexnum); + printf("ÇëÊäÈëÓÐÏòͼµÄ»¡Êý£º"); + scanf("%d", &arcnum); + printf("¸ÃÓÐÏòͼµÄ»¡ÉÏÊÇ·ñ°üº¬ÆäËû¸½¼ÓÐÅÏ¢(0-²»°üº¬©¦1-°üº¬)£º"); + scanf("%d", &IncInfo); + + // ¼Èë¶¥µã¼¯ + printf("Çë¼Èë %d ¸ö¶¥µã£¬²»Í¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º", vexnum); + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(stdin); + scanf("%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } else { + ReadData(fp, "%d", &vexnum); // ¼Èë¶¥µãÊý + ReadData(fp, "%d", &arcnum); // ¼È뻡Êý + ReadData(fp, "%d", &IncInfo); // Åжϻ¡ÉÏÊÇ·ñ°üº¬¸½¼ÓÐÅÏ¢ + + // ¼Èë¶¥µã¼¯ + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(fp); + ReadData(fp, "%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } + + // ½öÔÚ¿ØÖÆÌ¨Â¼ÈëÐÅϢʱÊä³ö´ËÌáʾ + if(fp == NULL && arcnum != 0) { + printf("ÇëΪÓÐÏòͼÒÀ´Î¼Èë %d Ìõ»¡µÄÐÅÏ¢£¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º\n", arcnum); + } + + // ¼È뻡µÄÐÅÏ¢ + for(k = 0; k < arcnum; k++) { + if(fp == NULL) { + printf("µÚ %2d Ìõ»¡£º", k + 1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v2); + } else { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + skipBlank(fp); + ReadData(fp, "%c%c", &v1, &v2); + } + + // Èç¹ûÐèҪ¼È뻡µÄÆäËû¸½¼ÓÐÅÏ¢ + if(IncInfo) { + // ×îºó¼È븽¼ÓÐÅÏ¢ + Input(*G, &info); + } + + // ²åÈ뻡 + InsertArc(G, v1, v2, info); + } + + // ´ÓÎļþÖжÁÈ¡Êý¾Ýʱ£¬×îºóÆäʵӦµ±ÅжÏÒ»ÏÂÊÇ·ñ¶Áµ½ÁË×ã¹»µÄÐÅÏ¢ + return OK; +} + +/* + * ¹¹ÔìÓÐÏòÍø + */ +static Status CreateDN(ALGraph* G) { + int i, k; + int vexnum, arcnum; + VertexType v1, v2; + InfoType* info = NULL; + + (*G).vexnum = (*G).arcnum = 0; + + if(fp == NULL) { + printf("ÇëÊäÈëÓÐÏòÍøµÄ¶¥µãÊý£º"); + scanf("%d", &vexnum); + printf("ÇëÊäÈëÓÐÏòÍøµÄ»¡Êý£º"); + scanf("%d", &arcnum); + printf("¸ÃÓÐÏòÍøµÄ»¡ÉϱØÐë°üº¬ÆäËû¸½¼ÓÐÅÏ¢£¬ÒòΪ´Ë´¦µÄȨֵÐèÒª´æ´¢µ½¸½¼ÓÐÅÏ¢ÖÐ...\n"); + IncInfo = 1; + + // ¼Èë¶¥µã¼¯ + printf("Çë¼Èë %d ¸ö¶¥µã£¬²»Í¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º", vexnum); + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(stdin); + scanf("%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } else { + ReadData(fp, "%d", &vexnum); // ¼Èë¶¥µãÊý + ReadData(fp, "%d", &arcnum); // ¼È뻡Êý + ReadData(fp, "%d", &IncInfo);// Åжϻ¡ÉÏÊÇ·ñ°üº¬¸½¼ÓÐÅÏ¢(´Ë´¦Ó¦µ±°üº¬) + IncInfo = 1; // Ç¿ÖÆ½«È¨ÖµÂ¼Èëµ½¸½¼ÓÐÅÏ¢ÖÐ + + // ¼Èë¶¥µã¼¯ + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(fp); + ReadData(fp, "%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } + + // ½öÔÚ¿ØÖÆÌ¨Â¼ÈëÐÅϢʱÊä³ö´ËÌáʾ + if(fp == NULL && arcnum != 0) { + printf("ÇëΪÓÐÏòÍøÒÀ´Î¼Èë %d Ìõ»¡(´øÈ¨Öµ)µÄÐÅÏ¢£¬¶¥µã¼°È¨ÖµÖ®¼äÓÿոñ¸ô¿ª£º\n", arcnum); + } + + // ¼È뻡µÄÐÅÏ¢ + for(k = 0; k < arcnum; k++) { + if(fp == NULL) { + printf("µÚ %2d Ìõ»¡¼°ÆäȨֵ£º", k + 1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v2); + } else { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + skipBlank(fp); + ReadData(fp, "%c%c", &v1, &v2); + } + + // Èç¹ûÐèҪ¼È뻡µÄÆäËû¸½¼ÓÐÅÏ¢ + if(IncInfo) { + // ×îºó¼È븽¼ÓÐÅÏ¢(´Ë´¦ÐèҪ¼ÈëÍøµÄȨֵ) + Input(*G, &info); + } + + // ²åÈ뻡 + InsertArc(G, v1, v2, info); + } + + // ´ÓÎļþÖжÁÈ¡Êý¾Ýʱ£¬×îºóÆäʵӦµ±ÅжÏÒ»ÏÂÊÇ·ñ¶Áµ½ÁË×ã¹»µÄÐÅÏ¢ + return OK; +} + +/* + * ¹¹ÔìÎÞÏòͼ + */ +static Status CreateUDG(ALGraph* G) { + int i, k; + int vexnum, arcnum; + VertexType v1, v2; + InfoType* info = NULL; + + (*G).vexnum = (*G).arcnum = 0; + + if(fp == NULL) { + printf("ÇëÊäÈëÎÞÏòͼµÄ¶¥µãÊý£º"); + scanf("%d", &vexnum); + printf("ÇëÊäÈëÎÞÏòͼµÄ±ßÊý£º"); + scanf("%d", &arcnum); + printf("¸ÃÎÞÏòͼµÄ±ßÉÏÊÇ·ñ°üº¬ÆäËû¸½¼ÓÐÅÏ¢(0-²»°üº¬©¦1-°üº¬)£º"); + scanf("%d", &IncInfo); + + // ¼Èë¶¥µã¼¯ + printf("Çë¼Èë %d ¸ö¶¥µã£¬²»Í¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º", vexnum); + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(stdin); + scanf("%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } else { + ReadData(fp, "%d", &vexnum); // ¼Èë¶¥µãÊý + ReadData(fp, "%d", &arcnum); // ¼Èë±ßÊý + ReadData(fp, "%d", &IncInfo);// ÅжϱßÉÏÊÇ·ñ°üº¬¸½¼ÓÐÅÏ¢ + + // ¼Èë¶¥µã¼¯ + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(fp); + ReadData(fp, "%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } + + // ½öÔÚ¿ØÖÆÌ¨Â¼ÈëÐÅϢʱÊä³ö´ËÌáʾ + if(fp == NULL && arcnum != 0) { + printf("ÇëΪÎÞÏòͼÒÀ´Î¼Èë %d Ìõ±ßµÄÐÅÏ¢£¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º\n", arcnum); + } + + // ¼Èë±ßµÄÐÅÏ¢ + for(k = 0; k < arcnum; k++) { + if(fp == NULL) { + printf("µÚ %2d Ìõ±ß£º", k + 1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v2); + } else { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + skipBlank(fp); + ReadData(fp, "%c%c", &v1, &v2); + } + + // Èç¹ûÐèҪ¼Èë±ßµÄÆäËû¸½¼ÓÐÅÏ¢ + if(IncInfo) { + // ×îºó¼È븽¼ÓÐÅÏ¢ + Input(*G, &info); + + } + + // ²åÈë±ß + InsertArc(G, v1, v2, info); + } + + // ´ÓÎļþÖжÁÈ¡Êý¾Ýʱ£¬×îºóÆäʵӦµ±ÅжÏÒ»ÏÂÊÇ·ñ¶Áµ½ÁË×ã¹»µÄÐÅÏ¢ + return OK; +} + +/* + * ¹¹ÔìÎÞÏòÍø + */ +static Status CreateUDN(ALGraph* G) { + int i, k; + int vexnum, arcnum; + VertexType v1, v2; + InfoType* info = NULL; + + (*G).vexnum = (*G).arcnum = 0; + + if(fp == NULL) { + printf("ÇëÊäÈëÎÞÏòÍøµÄ¶¥µãÊý£º"); + scanf("%d", &vexnum); + printf("ÇëÊäÈëÎÞÏòÍøµÄ±ßÊý£º"); + scanf("%d", &arcnum); + printf("¸ÃÎÞÏòÍøµÄ±ßÉϱØÐë°üº¬ÆäËû¸½¼ÓÐÅÏ¢£¬ÒòΪ´Ë´¦µÄȨֵÐèÒª´æ´¢µ½¸½¼ÓÐÅÏ¢ÖÐ...\n"); + IncInfo = 1; + + // ¼Èë¶¥µã¼¯ + printf("Çë¼Èë %d ¸ö¶¥µã£¬²»Í¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º", vexnum); + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(stdin); + scanf("%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } else { + ReadData(fp, "%d", &vexnum); // ¼Èë¶¥µãÊý + ReadData(fp, "%d", &arcnum); // ¼Èë±ßÊý + ReadData(fp, "%d", &IncInfo);// ÅжϱßÉÏÊÇ·ñ°üº¬¸½¼ÓÐÅÏ¢ + IncInfo = 1; // Ç¿ÖÆ½«È¨ÖµÂ¼Èëµ½¸½¼ÓÐÅÏ¢ÖÐ + + // ¼Èë¶¥µã¼¯ + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(fp); + ReadData(fp, "%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } + + // ½öÔÚ¿ØÖÆÌ¨Â¼ÈëÐÅϢʱÊä³ö´ËÌáʾ + if(fp == NULL && arcnum != 0) { + printf("ÇëΪÎÞÏòÍøÒÀ´Î¼Èë %d Ìõ±ß(´øÈ¨Öµ)µÄÐÅÏ¢£¬¶¥µã¼°È¨ÖµÖ®¼äÓÿոñ¸ô¿ª£º\n", arcnum); + } + + // ¼Èë±ßµÄÐÅÏ¢ + for(k = 0; k < arcnum; k++) { + if(fp == NULL) { + printf("µÚ %2d Ìõ±ß¼°ÆäȨֵ£º", k + 1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v2); + } else { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + skipBlank(fp); + ReadData(fp, "%c%c", &v1, &v2); + } + + // Èç¹ûÐèҪ¼Èë±ßµÄÆäËû¸½¼ÓÐÅÏ¢ + if(IncInfo) { + // ×îºó¼È븽¼ÓÐÅÏ¢(´Ë´¦ÐèҪ¼ÈëÍøµÄȨֵ) + Input(*G, &info); + } + + // ²åÈë±ß + InsertArc(G, v1, v2, info); + } + + // ´ÓÎļþÖжÁÈ¡Êý¾Ýʱ£¬×îºóÆäʵӦµ±ÅжÏÒ»ÏÂÊÇ·ñ¶Áµ½ÁË×ã¹»µÄÐÅÏ¢ + return OK; +} + +/* + * ¼Èë±ß/»¡µÄÏà¹Ø¸½¼ÓÐÅÏ¢ + */ +static void Input(ALGraph G, InfoType** info) { + int weight; + + // ÔÚ"Íø"µÄÇéÐÎÏÂÐèҪ¼ÈëȨֵÐÅÏ¢ + if(G.kind == DN || G.kind == UDN) { + *info = (InfoType*) malloc(sizeof(InfoType)); + + if(fp == NULL) { + scanf("%d", &weight); + } else { + ReadData(fp, "%d", &weight); + } + + (*info)->weight = weight; + } +} + +/* + * ²éÕÒ + * + * ·µ»Ø¶¥µãuÔÚͼ/ÍøÖеÄλÖà + */ +int LocateVex(ALGraph G, VertexType u) { + int i; + + for(i = 0; i < G.vexnum; i++) { + if(G.vertices[i].data == u) { + return i; + } + } + + return -1; +} + +/* + * ²åÈë¶¥µã + * + * ½«Ö¸¶¨µÄ¶¥µãv×·¼Óµ½¶¥µã¼¯ÖУ¬Î´½¨Á¢¸Ã¶¥µãÓëÆäËû¶¥µãµÄ¹ØÏµ + */ +Status InsertVex(ALGraph* G, VertexType v) { + int k; + + // ¶¥µãÊý¹ý¶à + if((*G).vexnum == MAX_VERTEX_NUM) { + return ERROR; + } + + // Ê×ÏÈÐèÒªÅжϸö¥µãÊÇ·ñ´æÔÚ + k = LocateVex(*G, v); + if(k >= 0) { + return ERROR; // Ö¸¶¨µÄ¶¥µã´æÔÚʱ£¬ÎÞÐèÖØ¸´Ìí¼Ó + } + + G->vertices[(*G).vexnum].data = v; + G->vertices[(*G).vexnum].firstarc = NULL; + + (*G).vexnum++; + + return OK; +} + +/* + * ɾ³ý¶¥µã + * + * ´Ó¶¥µã¼¯ÖÐɾ³ýÖ¸¶¨µÄ¶¥µãv£¬×¢ÒâÐèÒª¸üÐÂÏà¹ØµÄ¶¥µã¹ØÏµ + */ +Status DeleteVex(ALGraph* G, VertexType v) { + int k, i; + ArcNode* pre, * r; + + // Ê×ÏÈÐèÒªÅжϸö¥µãÊÇ·ñ´æÔÚ + k = LocateVex(*G, v); + if(k == -1) { + return ERROR; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + // ÕÒµ½ÒÔ½áµãv³ö·¢µÄÁ´±í£¬ÊͷŸÃÁ´±íÉÏËùÓнáµã + r = G->vertices[k].firstarc; + while(r != NULL) { + pre = r; + r = r->nextarc; + free(pre); + + (*G).arcnum--; + } + + G->vertices[k].firstarc = NULL; + + // ±éÀúÆäËüËùÓÐÁ´±í£¬É¾³ýÄÇЩָÏò¶¥µãvµÄ»¡£»¶øÇÒ£¬Ï±곬¹ýkµÄ¶¥µã£¬ÆäϱêÖµÐèÒªµÝ¼õ + for(i = 0; i < G->vexnum; i++) { + pre = NULL; + r = G->vertices[i].firstarc; + while(r != NULL && r->adjvex < k) { + pre = r; + r = r->nextarc; + } + + // Á´±íÉÏËùÓж¥µãµÄϱê¾ùСÓÚk + if(r == NULL) { + continue; + } + + if(r->adjvex == k) { + // ´Ó¿ªÍ·É¾µô½áµãv + if(pre == NULL) { + G->vertices[i].firstarc = r->nextarc; + + // ´ÓÖмäij¸öλÖÃɾµô½áµãv + } else { + pre->nextarc = r->nextarc; + } + + free(r); + + // Èç¹ûÕâÊÇÓÐÏòµÄͼ/Íø£¬ÒÀÈ»ÐèÒªµÝ¼õ±ß/»¡µÄÊýÁ¿ + if((*G).kind == DG || (*G).kind == DN) { + (*G).arcnum--; + } + } + + // ÔÙ´ÎÈ·¶¨rµÄλÖà + if(pre == NULL) { + r = G->vertices[i].firstarc; + } else { + r = pre->nextarc; + } + + // ϱ곬¹ýkµÄ¶¥µã£¬ÐèÒªµÝ¼õÆäϱê + while(r != NULL && r->adjvex > k) { + r->adjvex -= 1; + r = r->nextarc; + } + } + + // ¶¥µã¼¯Ç°ÒÆ + for(i = k + 1; i < (*G).vexnum; i++) { + G->vertices[i - 1] = G->vertices[i]; + } + + // ¶¥µãÊýµÝ¼õ + (*G).vexnum--; + + return OK; +} + +/* + * ¹¹ÔìÒ»¸ö±ß/»¡½áµã(½öÏÞÄÚ²¿Ê¹ÓÃ) + */ +static ArcNode* newArcNodePtr(int adjvex, ArcNode* nextarc, InfoType* info) { + ArcNode* p = (ArcNode*) malloc(sizeof(ArcNode)); + if(!p) { + exit(OVERFLOW); + } + + p->adjvex = adjvex; + + p->nextarc = nextarc; + + p->info = info; + + return p; +} + +/* + * ²åÈë±ß/»¡ + * + * Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬Ôò²åÈëÒ»Ìõ»¡ÐèÒªÔö¼ÓÁ½¸ö¶¥µã¹ØÏµ£¬µ«»¡µÄÊýÁ¿Ö»ÔöÒ»¡£ + * ¶ÔÓÚͼ/ÍøÀ´Ëµ£¬¿ÉÒÔÔڿɱä²ÎÊýÖÐÁгö±ß/»¡µÄ¸½¼ÓÐÅÏ¢¡£ + * + * ×¢£º´Ë´¦½ÓÊյIJÎÊýÓëMGraphÓÐЩ²»Ò»Ñù£ºÍøµÄ¸½¼ÓÐÅÏ¢Öаüº¬Á˸÷Ìõ±ß/»¡µÄȨֵ¡£ + */ +Status InsertArc(ALGraph* G, VertexType v, VertexType w, ...) { + int tail, head, k, count; + ArcNode* r; + ArcNode* pre; + Boolean overlay = FALSE; // ÊÇ·ñΪ¸²¸ÇÌí¼Ó + InfoType* info = NULL; // ±ß/»¡µÄ¸½¼ÓÐÅÏ¢ + va_list ap; + + tail = LocateVex(*G, v); // »ñÈ¡¶¥µãvÔÚ¶¥µã¼¯ÖеÄλÖà + if(tail == -1) { + return ERROR; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + head = LocateVex(*G, w); // »ñÈ¡¶¥µãwÔÚ¶¥µã¼¯ÖеÄλÖà + if(head == -1) { + return ERROR; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + // ¾Ü¾ø»· + if(tail == head) { + return ERROR; + } + + // Èç¹û±ß/»¡ÉÏ´æÔÚ¸½¼ÓÐÅÏ¢ + if(IncInfo) { + va_start(ap, w); // ÔÚwºó²éѯÊ׸ö¿É±ä²ÎÊý + info = va_arg(ap, InfoType*); // »ñÈ¡¸½¼ÓÐÅÏ¢ + va_end(ap); + } + + /* ½ÓÏÂÀ´£¬ÐèÒª²éÕÒºÏÊʵIJåÈëλÖà */ + + for(count = 0; count < 2; count++) { + pre = NULL; + // Ö¸ÏòÒÔtailΪβµÄÊ×Ìõ±ß/»¡ + r = G->vertices[tail].firstarc; + while(r != NULL && r->adjvex < head) { + pre = r; + r = r->nextarc; + } + + // Óöµ½ÁËÏàͬλÖõĽáµã + if(r != NULL && r->adjvex == head) { + r->info = info; // ¸´Óøýáµã + overlay = TRUE; // ·¢ÉúÁ˸²¸Ç + } else { + if(pre == NULL) { + G->vertices[tail].firstarc = newArcNodePtr(head, r, info); + } else { + pre->nextarc = newArcNodePtr(head, r, info); + } + } + + // Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬ÐèÒª¿¼ÂǶԳÆÐÔ + if((G->kind == UDG || G->kind == UDN) && tail != head) { + // µßµ¹iºÍj + k = tail; + tail = head; + head = k; + } else { + break; // Èç¹ûÊÇÓÐÏòµÄ£¬¿ÉÒÔ½áÊøÁË + } + } + + // ÔڷǸ²¸ÇµÄÇéÐÎÏ£¬²Å¿¼ÂǸüбß/»¡µÄÊýÁ¿ + if(!overlay) { + (*G).arcnum++; // ²»ÂÛÓÐÏòÎÞÏò£¬±ß/»¡ÊýÖ»ÔöÒ» + } + + return OK; +} + +/* + * ɾ³ý±ß/»¡ + */ +Status DeleteArc(ALGraph* G, VertexType v, VertexType w) { + int tail, head, k, count; + ArcNode* r; + ArcNode* pre; + + tail = LocateVex(*G, v); + if(tail == -1) { + return ERROR; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + head = LocateVex(*G, w); + if(head == -1) { + return ERROR; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + for(count = 0; count < 2; count++) { + pre = NULL; + // ÔÚµ±Ç°Á´±íÖÐÕÒµ½´ýɾ³ýµÄ±ß/»¡ + r = G->vertices[tail].firstarc; + while(r != NULL && r->adjvex < head) { + pre = r; + r = r->nextarc; + } + + // ÕÒµ½ÁË´ýɾ³ýµÄ±ß/»¡ + if(r != NULL && r->adjvex == head) { + if(pre == NULL) { + G->vertices[tail].firstarc = r->nextarc; + } else { + pre->nextarc = r->nextarc; + } + + free(r); + } else { + return ERROR; // ûÕÒµ½ + } + + // Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬ÐèÒª¿¼ÂǶԳÆÐÔ + if((G->kind == UDG || G->kind == UDN) && tail != head) { + // µßµ¹tailºÍhead + k = tail; + tail = head; + head = k; + } else { + break; // Èç¹ûÊÇÓÐÏòµÄ£¬¿ÉÒÔ½áÊøÁË + } + } + + (*G).arcnum--; // ²»ÂÛÓÐÏòÎÞÏò£¬±ß/»¡ÊýÖ»¼õÒ» + + return OK; +} + +/* + * ÒÔͼÐλ¯ÐÎʽÊä³öµ±Ç°½á¹¹ + */ +void PrintGraph(ALGraph G) { + int i; + ArcNode* p; + + if(G.vexnum == 0) { + printf("¿Õͼ£¬ÎÞÐè´òÓ¡£¡\n"); + return; + } + + printf("µ±Ç°Í¼/Íø°üº¬ %2d ¸ö¶¥µã£¬ %2d Ìõ±ß/»¡...\n", G.vexnum, G.arcnum); + + for(i = 0; i < G.vexnum; i++) { + printf("%c ===> ", G.vertices[i].data); + + p = G.vertices[i].firstarc; + while(p != NULL) { + if(IncInfo == 0) { + printf("%c ", G.vertices[p->adjvex].data); + + // ¶ÔÓÚÍø£¬»á´ÓÆä¸½¼ÓÐÅÏ¢ÖлñÈ¡µ½È¨Öµ + } else { + printf("%c[%2d] ", G.vertices[p->adjvex].data, p->info->weight); + } + + p = p->nextarc; + + if(p != NULL) { + printf("- "); + } + } + + printf("\n"); + } +} diff --git a/Dev-C++/ExerciseBook/07.14+07.16/ALGraph.h b/Dev-C++/ExerciseBook/07.14+07.16/ALGraph.h new file mode 100644 index 0000000..954d08c --- /dev/null +++ b/Dev-C++/ExerciseBook/07.14+07.16/ALGraph.h @@ -0,0 +1,162 @@ +/*================== + * ͼµÄÁÚ½Ó±í´æ´¢±íʾ + ===================*/ + +#ifndef ALGRAPH_H +#define ALGRAPH_H + +#include +#include // Ìṩmemset¡¢strcmp Ô­ÐÍ +#include // Ìṩºêva_list¡¢va_start¡¢va_arg¡¢va_end +#include // Ìṩmalloc¡¢realloc¡¢free¡¢exitÔ­ÐÍ +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// + +/* + * ×¢£º + * + * ͨ³£À´½²£¬ÎÞȨͼ±»¼ò³ÆÎª¡¾Í¼¡¿£¬ÓÐȨͼ±»¼ò³ÆÎª¡¾Íø¡¿¡£ + * ÎÞÏòͼ/ÍøÖеĶ¥µã¹ØÏµ±»³ÆÎª¡¾±ß¡¿£¬ÓÐÏòͼ/ÍøÖеĶ¥µã¹ØÏµ±»³ÆÎª¡¾»¡¡¿£¬²¢Çø·Ö»¡Í·Ó뻡β¡£ + * ʵ¼Ê±íÊöÖУ¬Î´±Ø»áÑϸñ×ñÊØÒÔÉÏÃüÃû¡£ + * + * µ±Ç°½á¹¹Êʺϴ洢±ß/»¡±È½ÏÏ¡ÊèµÄͼ/Íø¡£ + * + * ¡ï ²åÈë±ß/»¡µÄÐÅϢʱ£¬ÕâÀïµÄʵÏÖÊǰ´"ÉýÐò"²åÈëµÄ£¬ÕâʹµÃ²åÈëµÄ»¡Êǰ´"ÉýÐò"ÅÅÁеġ£ + */ + + +/* ºê¶¨Òå */ +#define MAX_VERTEX_NUM 26 // ×î´ó¶¥µã¸öÊý + + +// ͼµÄÀàÐÍ +typedef enum { + DG, // 0-ÓÐÏòͼ + DN, // 1-ÓÐÏòÍø(´øÈ¨Öµ) + UDG, // 2-ÎÞÏòͼ + UDN // 3-ÎÞÏòÍø(´øÈ¨Öµ) +} GraphKind; + +// ¶¥µãÀàÐÍ +typedef char VertexType; + +// ±ß/»¡µÄÏà¹Ø¸½¼ÓÐÅÏ¢ +typedef struct { + /* + * ×¢£º + * ½Ì²ÄÖиø³öµÄ½á¹¹Ö»¿¼ÂÇÁËÎÞȨͼ£¬¶øÃ»¿¼ÂÇÓÐȨͼ(Íø)¡£ + * ÕâÀïΪÁ˰ѡ°Íø¡±µÄÇéÐÎÒ²¿¼ÂǽøÈ¥£¬ÌØÔÚ¸½¼ÓÐÅÏ¢ÖÐÔö¼ÓÁË"È¨ÖØ"ÊôÐÔ¡£ + */ + int weight; +} InfoType; + +/* ±ß/»¡½áµã */ +typedef struct ArcNode { + int adjvex; // ¸Ã»¡ËùÖ¸ÏòµÄ¶¥µãµÄλÖà + struct ArcNode* nextarc; // Ö¸ÏòÏÂÒ»Ìõ»¡µÄÖ¸Õë + InfoType* info; // »¡µÄ¸½¼ÓÐÅÏ¢£¬Í¨³£ºöÂÔ +} ArcNode; + +// ÿ¸öÁ´±íµÄÍ·½áµã +typedef struct VNode { + VertexType data; // ¶¥µãÐÅÏ¢ + ArcNode* firstarc; // Ö¸ÏòµÚÒ»ÌõÒÀ¸½¸Ã¶¥µãµÄ»¡µÄÖ¸Õë +} VNode; + +/* ͼµÄÁÚ½Ó±í´æ´¢±íʾÀàÐͶ¨Òå */ +typedef struct { + VNode vertices[MAX_VERTEX_NUM]; // ÁÚ½Ó±í + int vexnum, arcnum; // ͼ/ÍøµÄ¶¥µãÊýºÍ»¡Êý + GraphKind kind; // ͼµÄÀàÐͱêÖ¾ +} ALGraph; + + +// ±ß/»¡ÉÏÊÇ·ñ´æÔÚ¸½¼ÓÐÅÏ¢ +extern Boolean IncInfo; + + +/* + * ´´½¨ + * + *¡¾±¸×¢¡¿ + * + * ½Ì²ÄÖÐĬÈÏ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý¡£ + * ÕâÀïΪÁË·½±ã²âÊÔ£¬±ÜÃâÿ´ÎÔËÐж¼ÊÖ¶¯ÊäÈëÊý¾Ý£¬ + * Òò¶øÔÊÐíÑ¡Ôñ´ÓÔ¤ÉèµÄÎļþpathÖжÁÈ¡²âÊÔÊý¾Ý¡£ + * + * Èç¹ûÐèÒª´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý£¬ÔòpathΪNULL£¬»òpath[kind]Ϊ""¡£ + * Èç¹ûÐèÒª´ÓÎļþÖжÁÈ¡Êý¾Ý£¬ÔòÐèÒªÔÚpathÖÐÌîдÎļþÃûÐÅÏ¢¡£ + */ +Status CreateGraph(ALGraph* G, char* path[]); + +/* + * ¹¹ÔìÓÐÏòͼ + */ +static Status CreateDG(ALGraph* G); + +/* + * ¹¹ÔìÓÐÏòÍø + */ +static Status CreateDN(ALGraph* G); + +/* + * ¹¹ÔìÎÞÏòͼ + */ +static Status CreateUDG(ALGraph* G); + +/* + * ¹¹ÔìÎÞÏòÍø + */ +static Status CreateUDN(ALGraph* G); + +/* + * ¼Èë±ß/»¡µÄÏà¹Ø¸½¼ÓÐÅÏ¢ + */ +static void Input(ALGraph G, InfoType** info); + +/* + * ²éÕÒ + * + * ·µ»Ø¶¥µãuÔÚͼ/ÍøÖеÄλÖà + */ +int LocateVex(ALGraph G, VertexType u); + +/* + * ²åÈë¶¥µã + * + * ½«Ö¸¶¨µÄ¶¥µãv×·¼Óµ½¶¥µã¼¯ÖУ¬Î´½¨Á¢¸Ã¶¥µãÓëÆäËû¶¥µãµÄ¹ØÏµ + */ +Status InsertVex(ALGraph* G, VertexType v); + +/* + * ɾ³ý¶¥µã + * + * ´Ó¶¥µã¼¯ÖÐɾ³ýÖ¸¶¨µÄ¶¥µãv£¬×¢ÒâÐèÒª¸üÐÂÏà¹ØµÄ¶¥µã¹ØÏµ + */ +Status DeleteVex(ALGraph* G, VertexType v); + +/* + * ¹¹ÔìÒ»¸ö±ß/»¡½áµã(½öÏÞÄÚ²¿Ê¹ÓÃ) + */ +static ArcNode* newArcNodePtr(int adjvex, ArcNode* nextarc, InfoType* info); + +/* + * ²åÈë±ß/»¡ + * + * Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬Ôò²åÈëÒ»Ìõ»¡ÐèÒªÔö¼ÓÁ½¸ö¶¥µã¹ØÏµ£¬µ«»¡µÄÊýÁ¿Ö»ÔöÒ»¡£ + * ¶ÔÓÚͼ/ÍøÀ´Ëµ£¬¿ÉÒÔÔڿɱä²ÎÊýÖÐÁгö±ß/»¡µÄ¸½¼ÓÐÅÏ¢¡£ + * + * ×¢£º´Ë´¦½ÓÊյIJÎÊýÓëMGraphÓÐЩ²»Ò»Ñù£ºÍøµÄ¸½¼ÓÐÅÏ¢Öаüº¬Á˸÷Ìõ±ß/»¡µÄȨֵ¡£ + */ +Status InsertArc(ALGraph* G, VertexType v, VertexType w, ...); + +/* + * ɾ³ý±ß/»¡ + */ +Status DeleteArc(ALGraph* G, VertexType v, VertexType w); + +/* + * ÒÔͼÐλ¯ÐÎʽÊä³öµ±Ç°½á¹¹ + */ +void PrintGraph(ALGraph G); + +#endif diff --git a/Dev-C++/ExerciseBook/07.14+07.16/TestData_DG.txt b/Dev-C++/ExerciseBook/07.14+07.16/TestData_DG.txt new file mode 100644 index 0000000..ae011ea --- /dev/null +++ b/Dev-C++/ExerciseBook/07.14+07.16/TestData_DG.txt @@ -0,0 +1,6 @@ +ͼÀàÐÍ¡ú0£¨ÓÐÏòͼ£© +¶¥µãÊý¡ú6 +»¡Êý¡ú14 +»¡ÊÇ·ñ´øÓÐÆäËûÐÅÏ¢¡ú0 +¶¥µã¼¯¡ú¡¾A£¬X£¬B£¬C£¬D£¬E¡¿ +»¡µÄ¼¯ºÏ¡ú¡¾A£¬B¡¿¡¾A£¬C¡¿¡¾A£¬D¡¿¡¾B£¬C¡¿¡¾B£¬D¡¿¡¾B£¬E¡¿¡¾C£¬B¡¿¡¾C£¬E¡¿¡¾C£¬X¡¿¡¾E£¬A¡¿¡¾E£¬D¡¿¡¾E£¬X¡¿¡¾X£¬A¡¿¡¾X£¬D¡¿ \ No newline at end of file diff --git a/Dev-C++/ExerciseBook/07.14+07.16/TestData_DN.txt b/Dev-C++/ExerciseBook/07.14+07.16/TestData_DN.txt new file mode 100644 index 0000000..c41b879 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.14+07.16/TestData_DN.txt @@ -0,0 +1,6 @@ +ͼÀàÐÍ¡ú1£¨ÓÐÏòÍø£© +¶¥µãÊý¡ú6 +»¡Êý¡ú14 +»¡ÊÇ·ñ´øÓÐÆäËûÐÅÏ¢¡ú1 +¶¥µã¼¯¡ú¡¾A£¬X£¬B£¬C£¬D£¬E¡¿ +»¡µÄ¼¯ºÏ¡ú¡¾A£¬B£¬3¡¿¡¾A£¬C£¬8¡¿¡¾A£¬D£¬11¡¿¡¾B£¬C£¬7¡¿¡¾B£¬D£¬4¡¿¡¾B£¬E£¬1¡¿¡¾C£¬B£¬5¡¿¡¾C£¬E£¬17¡¿¡¾C£¬X£¬3¡¿¡¾E£¬A£¬6¡¿¡¾E£¬D£¬4¡¿¡¾E£¬X£¬2¡¿¡¾X£¬A£¬8¡¿¡¾X£¬D£¬10¡¿ \ No newline at end of file diff --git a/Dev-C++/ExerciseBook/07.14+07.16/TestData_UDG.txt b/Dev-C++/ExerciseBook/07.14+07.16/TestData_UDG.txt new file mode 100644 index 0000000..6c08d74 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.14+07.16/TestData_UDG.txt @@ -0,0 +1,6 @@ +ͼÀàÐÍ¡ú2£¨ÎÞÏòͼ£© +¶¥µãÊý¡ú6 +±ßÊý¡ú13 +±ßÊÇ·ñ´øÓÐÆäËûÐÅÏ¢¡ú0 +¶¥µã¼¯¡ú¡¾A£¬X£¬B£¬C£¬D£¬E¡¿ +±ßµÄ¼¯ºÏ¡ú¡¾A£¬B¡¿¡¾A£¬C¡¿¡¾A£¬D¡¿¡¾B£¬C¡¿¡¾B£¬D¡¿¡¾B£¬E¡¿¡¾C£¬E¡¿¡¾C£¬X¡¿¡¾E£¬A¡¿¡¾E£¬D¡¿¡¾E£¬X¡¿¡¾X£¬A¡¿¡¾X£¬D¡¿ \ No newline at end of file diff --git a/Dev-C++/ExerciseBook/07.14+07.16/TestData_UDN.txt b/Dev-C++/ExerciseBook/07.14+07.16/TestData_UDN.txt new file mode 100644 index 0000000..2117df2 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.14+07.16/TestData_UDN.txt @@ -0,0 +1,6 @@ +ͼÀàÐÍ¡ú3£¨ÎÞÏòÍø£© +¶¥µãÊý¡ú6 +±ßÊý¡ú13 +±ßÊÇ·ñ´øÓÐÆäËûÐÅÏ¢¡ú1 +¶¥µã¼¯¡ú¡¾A£¬X£¬B£¬C£¬D£¬E¡¿ +±ßµÄ¼¯ºÏ¡ú¡¾A£¬B£¬3¡¿¡¾A£¬C£¬8¡¿¡¾A£¬D£¬11¡¿¡¾B£¬C£¬7¡¿¡¾B£¬D£¬4¡¿¡¾B£¬E£¬1¡¿¡¾C£¬E£¬17¡¿¡¾C£¬X£¬3¡¿¡¾E£¬A£¬6¡¿¡¾E£¬D£¬4¡¿¡¾E£¬X£¬2¡¿¡¾X£¬A£¬8¡¿¡¾X£¬D£¬10¡¿ \ No newline at end of file diff --git a/Dev-C++/ExerciseBook/07.15/07.15.cpp b/Dev-C++/ExerciseBook/07.15/07.15.cpp new file mode 100644 index 0000000..b59fb02 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.15/07.15.cpp @@ -0,0 +1,191 @@ +#include +#include // Ìṩºêva_list¡¢va_start¡¢va_arg¡¢va_end +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// +#include "MGraph.h" //**¡ø07 ͼ**// + +/* + * ²åÈë¶¥µã + * + * ½«Ö¸¶¨µÄ¶¥µãv×·¼Óµ½¶¥µã¼¯ÖУ¬Î´½¨Á¢¸Ã¶¥µãÓëÆäËû¶¥µãµÄ¹ØÏµ + */ +Status InsertVex_7_15(MGraph* G, VertexType v); + +/* + * ɾ³ý¶¥µã + * + * ´Ó¶¥µã¼¯ÖÐɾ³ýÖ¸¶¨µÄ¶¥µãv£¬×¢ÒâÐèÒª¸üÐÂÏà¹ØµÄ¶¥µã¹ØÏµ + */ +Status DeleteVex_7_15(MGraph* G, VertexType v); + +/* + * ²åÈë±ß/»¡ + * + * Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬Ôò²åÈëÒ»Ìõ»¡ÐèÒªÔö¼ÓÁ½¸ö¶¥µã¹ØÏµ£¬µ«»¡µÄÊýÁ¿Ö»ÔöÒ»¡£ + * + * ¶ÔÓÚͼÀ´Ëµ£¬¿ÉÒÔÔڿɱä²ÎÊýÖÐÁгö±ß/»¡µÄ¸½¼ÓÐÅÏ¢£» + * ¶ÔÓÚÍøÀ´Ëµ£¬¿ÉÒÔÔڿɱä²ÎÊýÖÐÒÀ´ÎÁгö±ß/»¡µÄȨֵÒÔ¼°¸½¼ÓÐÅÏ¢¡£ + */ +Status InsertArc_7_15(MGraph* G, VertexType v, VertexType w, ...); + +/* + * ɾ³ý±ß/»¡ + * + * ´Ëɾ³ýÖ»ÊǸüбß/»¡µÄÁ¬Í¨¹ØÏµ + */ +Status DeleteArc_7_15(MGraph* G, VertexType v, VertexType w); + + +int main(int argc, char* argv[]) { + MGraph G; + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ´´½¨²¢Êä³öͼ/Íø...\n"); + { + char* path[4]; + + path[0] = "TestData_DG.txt"; + path[1] = "TestData_DN.txt"; + path[2] = "TestData_UDG.txt"; + path[3] = "TestData_UDN.txt"; + + CreateGraph(&G, path); + PrintGraph(G); + printf("\n"); + } + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ɾ³ý¶¥µã...\n"); + { + VertexType v = 'X'; + + printf("ɾ³ý¶¥µã '%c' ºóµÄͼΪ£º\n", v); + DeleteVex_7_15(&G, v); + PrintGraph(G); + printf("\n"); + } + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ²åÈë¶¥µã...\n"); + { + VertexType v = 'Y'; + + printf("²åÈë¶¥µã '%c' ºóµÄͼΪ£º\n", v); + InsertVex_7_15(&G, v); + PrintGraph(G); + printf("\n"); + } + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ²åÈë±ß/»¡...\n"); + { + // ×¢£ºÊÇÖØ¸´µÄ±ß + VertexType v[10] = {'B', 'C', 'E', 'Y', 'Y', 'Y', 'D', 'D', 'E', 'E'}; + VertexType w[10] = {'Y', 'Y', 'Y', 'A', 'B', 'D', 'C', 'A', 'B', 'D'}; + VRType adj[10] = {8, 5, 1, 11, 2, 6, 3, 7, 2, 9}; + int k; + + // ͼ + if(G.kind == DG || G.kind == UDG) { + for(k = 0; k < 10; k++) { + printf("²åÈëÎÞȨֵµÄ±ß£º<%c, %c>...\n", v[k], w[k]); + InsertArc_7_15(&G, v[k], w[k]); + } + + // Íø + } else if(G.kind == DN || G.kind == UDN) { + for(k = 0; k < 10; k++) { + printf("²åÈë´øÈ¨ÖµµÄ±ß£º<%c, %c, %d>...\n", v[k], w[k], adj[k]); + InsertArc_7_15(&G, v[k], w[k], adj[k]); + } + } else { + return ERROR; + } + + PrintGraph(G); + printf("\n"); + } + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ɾ³ý±ß/»¡...\n"); + { + VertexType v[3] = {'D', 'E', 'F'}; + VertexType w[3] = {'A', 'B', 'B'}; + int k; + + for(k = 0; k < 3; k++) { + printf("ɾ³ý±ß£º<%c, %c>...\n", v[k], w[k]); + DeleteArc_7_15(&G, v[k], w[k]); + } + PrintGraph(G); + printf("\n"); + } + + return 0; +} + + +/* + * ²åÈë¶¥µã + * + * ½«Ö¸¶¨µÄ¶¥µãv×·¼Óµ½¶¥µã¼¯ÖУ¬Î´½¨Á¢¸Ã¶¥µãÓëÆäËû¶¥µãµÄ¹ØÏµ + */ +Status InsertVex_7_15(MGraph* G, VertexType v) { + return InsertVex(G, v); +} + +/* + * ɾ³ý¶¥µã + * + * ´Ó¶¥µã¼¯ÖÐɾ³ýÖ¸¶¨µÄ¶¥µãv£¬×¢ÒâÐèÒª¸üÐÂÏà¹ØµÄ¶¥µã¹ØÏµ + */ +Status DeleteVex_7_15(MGraph* G, VertexType v) { + return DeleteVex(G, v); +} + +/* + * ²åÈë±ß/»¡ + * + * Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬Ôò²åÈëÒ»Ìõ»¡ÐèÒªÔö¼ÓÁ½¸ö¶¥µã¹ØÏµ£¬µ«»¡µÄÊýÁ¿Ö»ÔöÒ»¡£ + * + * ¶ÔÓÚͼÀ´Ëµ£¬¿ÉÒÔÔڿɱä²ÎÊýÖÐÁгö±ß/»¡µÄ¸½¼ÓÐÅÏ¢£» + * ¶ÔÓÚÍøÀ´Ëµ£¬¿ÉÒÔÔڿɱä²ÎÊýÖÐÒÀ´ÎÁгö±ß/»¡µÄȨֵÒÔ¼°¸½¼ÓÐÅÏ¢¡£ + */ +Status InsertArc_7_15(MGraph* G, VertexType v, VertexType w, ...) { + va_list ap; + VRType adj; + InfoType* info = NULL; // ±ß/»¡µÄ¸½¼ÓÐÅÏ¢ + + // ͼ + if((*G).kind == DG || (*G).kind == UDG) { + + // Èç¹û±ß/»¡ÉÏ´æÔÚ¸½¼ÓÐÅÏ¢ + if(IncInfo) { + va_start(ap, w); // ÔÚwºó²éѯÊ׸ö¿É±ä²ÎÊý + info = va_arg(ap, InfoType*); // »ñÈ¡¸½¼ÓÐÅÏ¢ + va_end(ap); + } + + return InsertArc(G, v, w, info); + + // Íø + } else if((*G).kind == DN || (*G).kind == UDN) { + va_start(ap, w); // ÔÚwºó²éѯÊ׸ö¿É±ä²ÎÊý + + adj = va_arg(ap, VRType); // »ñȡȨֵÐÅÏ¢ + + // Èç¹û±ß/»¡ÉÏ´æÔÚ¸½¼ÓÐÅÏ¢ + if(IncInfo) { + info = va_arg(ap, InfoType*); // »ñÈ¡¸½¼ÓÐÅÏ¢ + } + + va_end(ap); + + return InsertArc(G, v, w, adj, info); + } else { + return ERROR; + } +} + +/* + * ɾ³ý±ß/»¡ + * + * ´Ëɾ³ýÖ»ÊǸüбß/»¡µÄÁ¬Í¨¹ØÏµ + */ +Status DeleteArc_7_15(MGraph* G, VertexType v, VertexType w) { + return DeleteArc(G, v, w); +} diff --git a/Dev-C++/ExerciseBook/07.15/07.15.dev b/Dev-C++/ExerciseBook/07.15/07.15.dev new file mode 100644 index 0000000..9af10da --- /dev/null +++ b/Dev-C++/ExerciseBook/07.15/07.15.dev @@ -0,0 +1,118 @@ +[Project] +FileName=07.15.dev +Name=07.15 +Type=1 +Ver=2 +ObjFiles= +Includes= +Libs= +PrivateResource= +ResourceIncludes= +MakeIncludes= +Compiler= +CppCompiler= +Linker= +IsCpp=0 +Icon= +ExeOutput= +ObjectOutput= +LogOutput= +LogOutputEnabled=0 +OverrideOutput=0 +OverrideOutputName= +HostApplication= +UseCustomMakefile=0 +CustomMakefile= +CommandLine= +Folders= +IncludeVersionInfo=0 +SupportXPThemes=0 +CompilerSet=1 +CompilerSettings=0000000000000000001000000 +UnitCount=7 + +[VersionInfo] +Major=1 +Minor=0 +Release=0 +Build=0 +LanguageID=1033 +CharsetID=1252 +CompanyName= +FileVersion= +FileDescription=Developed using the Dev-C++ IDE +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion= +AutoIncBuildNr=0 +SyncProduct=1 + +[Unit1] +FileName=07.15.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit2] +FileName=MGraph.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit3] +FileName=MGraph.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit4] +FileName=TestData_DG.txt +Folder= +Compile=0 +Link=0 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit5] +FileName=TestData_DN.txt +Folder= +Compile=0 +Link=0 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit6] +FileName=TestData_UDG.txt +Folder= +Compile=0 +Link=0 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit7] +FileName=TestData_UDN.txt +Folder= +Compile=0 +Link=0 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + diff --git a/Dev-C++/ExerciseBook/07.15/MGraph.cpp b/Dev-C++/ExerciseBook/07.15/MGraph.cpp new file mode 100644 index 0000000..33ec721 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.15/MGraph.cpp @@ -0,0 +1,719 @@ +/*================================= + * ͼµÄÊý×é(ÁÚ½Ó¾ØÕó)´æ´¢±íʾ + * + * °üº¬Ëã·¨: 7.1¡¢7.2¡¢7.4¡¢7.5¡¢7.6 + ==================================*/ + +#include "MGraph.h" //**¡ø07 ͼ**// + +// ¼ÈëÊý¾ÝµÄÔ´Îļþ£»fpΪnullʱ£¬ËµÃ÷ÐèÒª´Ó¿ØÖÆÌ¨Â¼Èë +static FILE* fp = NULL; + +/* + * IncInfoָʾ¸Ãͼ/ÍøµÄ±ß/»¡ÉÏÊÇ·ñ´æÔÚ¸½¼ÓÐÅÏ¢¡£ + * Èç¹ûÆäÖµ²»Îª0£¬Ôò±íʾÎÞ¸½¼ÓÐÅÏ¢£¬·ñÔò£¬±íʾ´æÔÚ¸½¼ÓÐÅÏ¢¡£ + */ +Boolean IncInfo = FALSE; + +// ·ÃÎʱêÖ¾Êý×飬¼Ç¼·ÃÎʹýµÄ¶¥µã +static Boolean visited[MAX_VERTEX_NUM]; + +// º¯Êý±äÁ¿ +static Status (* VisitFunc)(VertexType e); + + +/* + * ¨€¨€¨€¨€¨€¨€¨€¨€ Ëã·¨7.1 ¨€¨€¨€¨€¨€¨€¨€¨€ + * + * ´´½¨Í¼/±í + * + *¡¾±¸×¢¡¿ + * + * ½Ì²ÄÖÐĬÈÏ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý¡£ + * ÕâÀïΪÁË·½±ã²âÊÔ£¬±ÜÃâÿ´ÎÔËÐж¼ÊÖ¶¯ÊäÈëÊý¾Ý£¬ + * Òò¶øÔÊÐíÑ¡Ôñ´ÓÔ¤ÉèµÄÎļþpathÖжÁÈ¡²âÊÔÊý¾Ý¡£ + * + * Èç¹ûÐèÒª´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý£¬ÔòpathΪNULL£¬»òpath[kind]Ϊ""¡£ + * Èç¹ûÐèÒª´ÓÎļþÖжÁÈ¡Êý¾Ý£¬ÔòÐèÒªÔÚpathÖÐÌîдÎļþÃûÐÅÏ¢¡£ + */ +Status CreateGraph(MGraph* G, char* path[]) { + int readFromConsole; // ÊÇ·ñ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý + int kind; + Status flag; + + printf("ÇëÊäÈëͼµÄÀàÐÍ(0-ÓÐÏòͼ ©¦ 1-ÓÐÏòÍø ©¦ 2-ÎÞÏòͼ ©¦ 3-ÎÞÏòÍø)£º"); + scanf("%d", &kind); + + // ÀàÐͲ»ºÏ¹æ + if(kind < 0 || kind > 3) { + return ERROR; + } + + // Èç¹ûûÓÐÎļþ·¾¶ÐÅÏ¢£¬Ôò´Ó¿ØÖÆÌ¨¶ÁÈ¡ÊäÈë + readFromConsole = (path == NULL) || strcmp(path[kind], "") == 0; + + // ÐèÒª´ÓÎļþ¶ÁÈ¡ + if(readFromConsole) { + (*G).kind = GraphKind(kind); // ¼Ç¼ͼ/ÍøµÄÀàÐÍ + } else { + // ´ò¿ªÎļþ£¬×¼±¸¶ÁÈ¡²âÊÔÊý¾Ý + fp = fopen(path[kind], "r"); + if(fp == NULL) { + return ERROR; + } + + // ¼ÈëͼµÄÀàÐÍ + ReadData(fp, "%d", &((*G).kind)); + } + + // Ëæ»ú´´½¨ÓÐÏòͼ/Íø»òÎÞÏòͼ/ÍøµÄÒ»ÖÖ + switch((*G).kind) { + case DG: + flag = CreateDG(G); + break; + case DN: + flag = CreateDN(G); + break; + case UDG: + flag = CreateUDG(G); + break; + case UDN: + flag = CreateUDN(G); + break; + default: + flag = ERROR; + break; + } + + if(fp != NULL) { + fclose(fp); + fp = NULL; + } + + return flag; +} + +/* + * ¹¹ÔìÓÐÏòͼ + */ +static Status CreateDG(MGraph* G) { + int i, j, k; + ArcCell arcs = {0, NULL}; // ÓÐÏòͼÿÌõ±ßµÄ³õʼֵ + VertexType v1, v2; + + if(fp == NULL) { + printf("ÇëÊäÈëÓÐÏòͼµÄ¶¥µãÊý£º"); + scanf("%d", &((*G).vexnum)); + printf("ÇëÊäÈëÓÐÏòͼµÄ»¡Êý£º"); + scanf("%d", &((*G).arcnum)); + printf("¸ÃÓÐÏòͼµÄ»¡ÉÏÊÇ·ñ°üº¬ÆäËû¸½¼ÓÐÅÏ¢(0-²»°üº¬©¦1-°üº¬)£º"); + scanf("%d", &IncInfo); + + // ¼Èë¶¥µã¼¯ + printf("Çë¼Èë %d ¸ö¶¥µã£¬²»Í¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º", (*G).vexnum); + for(i = 0; i < (*G).vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(stdin); + scanf("%c", &((*G).vexs[i])); + } + } else { + ReadData(fp, "%d", &((*G).vexnum)); // ¼Èë¶¥µãÊý + ReadData(fp, "%d", &((*G).arcnum)); // ¼È뻡Êý + ReadData(fp, "%d", &IncInfo); // Åжϻ¡ÉÏÊÇ·ñ°üº¬¸½¼ÓÐÅÏ¢ + + // ¼Èë¶¥µã¼¯ + for(i = 0; i < (*G).vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(fp); + ReadData(fp, "%c", &((*G).vexs[i])); + } + } + + // ³õʼ»¯ÓÐÏòͼµÄÁÚ½Ó¾ØÕó + for(i = 0; i < (*G).vexnum; i++) { + for(j = 0; j < (*G).vexnum; j++) { + (*G).arcs[i][j] = arcs; + } + } + + // ½öÔÚ¿ØÖÆÌ¨Â¼ÈëÐÅϢʱÊä³ö´ËÌáʾ + if(fp == NULL && (*G).arcnum != 0) { + printf("ÇëΪÓÐÏòͼÒÀ´Î¼Èë %d Ìõ»¡µÄÐÅÏ¢£¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º\n", (*G).arcnum); + } + + // ¼È뻡µÄÐÅÏ¢ + for(k = 0; k < (*G).arcnum; k++) { + if(fp == NULL) { + printf("µÚ %2d Ìõ»¡£º", k + 1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v2); + } else { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + skipBlank(fp); + ReadData(fp, "%c%c", &v1, &v2); + } + + i = LocateVex(*G, v1); // »ñÈ¡¶¥µãv1ÔÚ¶¥µã¼¯ÖеÄλÖà + j = LocateVex(*G, v2); // »ñÈ¡¶¥µãv2ÔÚ¶¥µã¼¯ÖеÄλÖà + + // ½«Ö¸¶¨µÄ¶¥µã¹ØÏµÉèÖÃΪ1£¬Ö¸Ê¾ÕâÁ½¸ö¶¥µãÊÇÖ±½ÓÁ¬½ÓµÄ(×¢£ºÕâÀïûÓÐÑé֤ϱêÊÇ·ñÔ½½ç) + (*G).arcs[i][j].adj = 1; + + // Èç¹ûÐèҪ¼È뻡µÄÆäËû¸½¼ÓÐÅÏ¢ + if(IncInfo) { + // ×îºó¼È븽¼ÓÐÅÏ¢ + Input(*G, &((*G).arcs[i][j].info)); + } + } + + // ´ÓÎļþÖжÁÈ¡Êý¾Ýʱ£¬×îºóÆäʵӦµ±ÅжÏÒ»ÏÂÊÇ·ñ¶Áµ½ÁË×ã¹»µÄÐÅÏ¢ + return OK; +} + +/* + * ¹¹ÔìÓÐÏòÍø + */ +static Status CreateDN(MGraph* G) { + int i, j, k; + ArcCell arcs = {INFINITE, NULL}; // ÓÐÏòÍøÃ¿Ìõ»¡µÄ³õʼֵ + VertexType v1, v2; + VRType w; + + if(fp == NULL) { + printf("ÇëÊäÈëÓÐÏòÍøµÄ¶¥µãÊý£º"); + scanf("%d", &((*G).vexnum)); + printf("ÇëÊäÈëÓÐÏòÍøµÄ»¡Êý£º"); + scanf("%d", &((*G).arcnum)); + printf("¸ÃÓÐÏòÍøµÄ»¡ÉÏÊÇ·ñ°üº¬ÆäËû¸½¼ÓÐÅÏ¢(0-²»°üº¬©¦1-°üº¬)£º"); + scanf("%d", &IncInfo); + + // ¼Èë¶¥µã¼¯ + printf("Çë¼Èë %d ¸ö¶¥µã£¬²»Í¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º", (*G).vexnum); + for(i = 0; i < (*G).vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(stdin); + scanf("%c", &((*G).vexs[i])); + } + } else { + ReadData(fp, "%d", &((*G).vexnum)); // ¼Èë¶¥µãÊý + ReadData(fp, "%d", &((*G).arcnum)); // ¼È뻡Êý + ReadData(fp, "%d", &IncInfo); // Åжϻ¡ÉÏÊÇ·ñ°üº¬¸½¼ÓÐÅÏ¢ + + // ¼Èë¶¥µã¼¯ + for(i = 0; i < (*G).vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(fp); + ReadData(fp, "%c", &((*G).vexs[i])); + } + } + + // ³õʼ»¯ÓÐÏòÍøµÄÁÚ½Ó¾ØÕó + for(i = 0; i < (*G).vexnum; i++) { + for(j = 0; j < (*G).vexnum; j++) { + (*G).arcs[i][j] = arcs; + } + } + + // ½öÔÚ¿ØÖÆÌ¨Â¼ÈëÐÅϢʱÊä³ö´ËÌáʾ + if(fp == NULL && (*G).arcnum != 0) { + printf("ÇëΪÓÐÏòÍøÒÀ´Î¼Èë %d Ìõ»¡(´øÈ¨Öµ)µÄÐÅÏ¢£¬¶¥µã¼°È¨ÖµÖ®¼äÓÿոñ¸ô¿ª£º\n", (*G).arcnum); + } + + // ¼È뻡µÄÐÅÏ¢ + for(k = 0; k < (*G).arcnum; k++) { + if(fp == NULL) { + printf("µÚ %2d Ìõ»¡¼°ÆäȨֵ£º", k + 1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v2); + scanf("%d", &w); + } else { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + skipBlank(fp); + ReadData(fp, "%c%c%d", &v1, &v2, &w); + } + + i = LocateVex(*G, v1); // »ñÈ¡¶¥µãv1ÔÚ¶¥µã¼¯ÖеÄλÖà + j = LocateVex(*G, v2); // »ñÈ¡¶¥µãv2ÔÚ¶¥µã¼¯ÖеÄλÖà + + // ÔÚÖ¸¶¨µÄ¶¥µã¹ØÏµÉϼǼȨֵ(×¢£ºÕâÀïûÓÐÑé֤ϱêÊÇ·ñÔ½½ç) + (*G).arcs[i][j].adj = w; + + // Èç¹ûÐèҪ¼È뻡µÄÆäËû¸½¼ÓÐÅÏ¢ + if(IncInfo) { + // ×îºó¼È븽¼ÓÐÅÏ¢ + Input(*G, &((*G).arcs[i][j].info)); + } + } + + // ´ÓÎļþÖжÁÈ¡Êý¾Ýʱ£¬×îºóÆäʵӦµ±ÅжÏÒ»ÏÂÊÇ·ñ¶Áµ½ÁË×ã¹»µÄÐÅÏ¢ + return OK; +} + +/* + * ¹¹ÔìÎÞÏòͼ + */ +static Status CreateUDG(MGraph* G) { + int i, j, k; + ArcCell arcs = {0, NULL}; // ÎÞÏòͼÿÌõ±ßµÄ³õʼֵ + VertexType v1, v2; + + if(fp == NULL) { + printf("ÇëÊäÈëÎÞÏòͼµÄ¶¥µãÊý£º"); + scanf("%d", &((*G).vexnum)); + printf("ÇëÊäÈëÎÞÏòͼµÄ±ßÊý£º"); + scanf("%d", &((*G).arcnum)); + printf("¸ÃÎÞÏòͼµÄ±ßÉÏÊÇ·ñ°üº¬ÆäËû¸½¼ÓÐÅÏ¢(0-²»°üº¬©¦1-°üº¬)£º"); + scanf("%d", &IncInfo); + + // ¼Èë¶¥µã¼¯ + printf("Çë¼Èë %d ¸ö¶¥µã£¬²»Í¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º", (*G).vexnum); + for(i = 0; i < (*G).vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(stdin); + scanf("%c", &((*G).vexs[i])); + } + } else { + ReadData(fp, "%d", &((*G).vexnum)); // ¼Èë¶¥µãÊý + ReadData(fp, "%d", &((*G).arcnum)); // ¼Èë±ßÊý + ReadData(fp, "%d", &IncInfo); // ÅжϱßÉÏÊÇ·ñ°üº¬¸½¼ÓÐÅÏ¢ + + // ¼Èë¶¥µã¼¯ + for(i = 0; i < (*G).vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(fp); + ReadData(fp, "%c", &((*G).vexs[i])); + } + } + + // ³õʼ»¯ÎÞÏòͼµÄÁÚ½Ó¾ØÕó + for(i = 0; i < (*G).vexnum; i++) { + for(j = 0; j < (*G).vexnum; j++) { + (*G).arcs[i][j] = arcs; + } + } + + // ½öÔÚ¿ØÖÆÌ¨Â¼ÈëÐÅϢʱÊä³ö´ËÌáʾ + if(fp == NULL && (*G).arcnum != 0) { + printf("ÇëΪÎÞÏòͼÒÀ´Î¼Èë %d Ìõ±ßµÄÐÅÏ¢£¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º\n", (*G).arcnum); + } + + // ¼Èë±ßµÄÐÅÏ¢ + for(k = 0; k < (*G).arcnum; k++) { + if(fp == NULL) { + printf("µÚ %2d Ìõ±ß£º", k + 1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v2); + } else { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + skipBlank(fp); + ReadData(fp, "%c%c", &v1, &v2); + } + + i = LocateVex(*G, v1); // »ñÈ¡¶¥µãv1ÔÚ¶¥µã¼¯ÖеÄλÖà + j = LocateVex(*G, v2); // »ñÈ¡¶¥µãv2ÔÚ¶¥µã¼¯ÖеÄλÖà + + // ½«Ö¸¶¨µÄ¶¥µã¹ØÏµÉèÖÃΪ1£¬Ö¸Ê¾ÕâÁ½¸ö¶¥µãÊÇÖ±½ÓÁ¬½ÓµÄ(×¢£ºÕâÀïûÓÐÑé֤ϱêÊÇ·ñÔ½½ç) + (*G).arcs[i][j].adj = 1; + + // Èç¹ûÐèҪ¼Èë±ßµÄÆäËû¸½¼ÓÐÅÏ¢ + if(IncInfo) { + // ×îºó¼È븽¼ÓÐÅÏ¢ + Input(*G, &((*G).arcs[i][j].info)); + } + + // Ìî³ä¶Ô³Æµã + (*G).arcs[j][i] = (*G).arcs[i][j]; + } + + // ´ÓÎļþÖжÁÈ¡Êý¾Ýʱ£¬×îºóÆäʵӦµ±ÅжÏÒ»ÏÂÊÇ·ñ¶Áµ½ÁË×ã¹»µÄÐÅÏ¢ + return OK; +} + +/* + * ¨€¨€¨€¨€¨€¨€¨€¨€ Ëã·¨7.2 ¨€¨€¨€¨€¨€¨€¨€¨€ + * + * ¹¹ÔìÎÞÏòÍø + */ +static Status CreateUDN(MGraph* G) { + int i, j, k; + ArcCell arcs = {INFINITE, NULL}; // ÎÞÏòÍøÃ¿Ìõ±ßµÄ³õʼֵ + VertexType v1, v2; + VRType w; + + if(fp == NULL) { + printf("ÇëÊäÈëÎÞÏòÍøµÄ¶¥µãÊý£º"); + scanf("%d", &((*G).vexnum)); + printf("ÇëÊäÈëÎÞÏòÍøµÄ±ßÊý£º"); + scanf("%d", &((*G).arcnum)); + printf("¸ÃÎÞÏòÍøµÄ±ßÉÏÊÇ·ñ°üº¬ÆäËû¸½¼ÓÐÅÏ¢(0-²»°üº¬©¦1-°üº¬)£º"); + scanf("%d", &IncInfo); + + // ¼Èë¶¥µã¼¯ + printf("Çë¼Èë %d ¸ö¶¥µã£¬²»Í¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º", (*G).vexnum); + for(i = 0; i < (*G).vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(stdin); + scanf("%c", &((*G).vexs[i])); + } + } else { + ReadData(fp, "%d", &((*G).vexnum)); // ¼Èë¶¥µãÊý + ReadData(fp, "%d", &((*G).arcnum)); // ¼Èë±ßÊý + ReadData(fp, "%d", &IncInfo); // ÅжϱßÉÏÊÇ·ñ°üº¬¸½¼ÓÐÅÏ¢ + + // ¼Èë¶¥µã¼¯ + for(i = 0; i < (*G).vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(fp); + ReadData(fp, "%c", &((*G).vexs[i])); + } + } + + // ³õʼ»¯ÎÞÏòÍøµÄÁÚ½Ó¾ØÕó + for(i = 0; i < (*G).vexnum; i++) { + for(j = 0; j < (*G).vexnum; j++) { + (*G).arcs[i][j] = arcs; + } + } + + // ½öÔÚ¿ØÖÆÌ¨Â¼ÈëÐÅϢʱÊä³ö´ËÌáʾ + if(fp == NULL && (*G).arcnum != 0) { + printf("ÇëΪÎÞÏòÍøÒÀ´Î¼Èë %d Ìõ±ß(´øÈ¨Öµ)µÄÐÅÏ¢£¬¶¥µã¼°È¨ÖµÖ®¼äÓÿոñ¸ô¿ª£º\n", (*G).arcnum); + } + + // ¼Èë±ßµÄÐÅÏ¢ + for(k = 0; k < (*G).arcnum; k++) { + if(fp == NULL) { + printf("µÚ %2d Ìõ±ß¼°ÆäȨֵ£º", k + 1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v2); + scanf("%d", &w); + } else { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + skipBlank(fp); + ReadData(fp, "%c%c%d", &v1, &v2, &w); + } + + i = LocateVex(*G, v1); // »ñÈ¡¶¥µãv1ÔÚ¶¥µã¼¯ÖеÄλÖà + j = LocateVex(*G, v2); // »ñÈ¡¶¥µãv2ÔÚ¶¥µã¼¯ÖеÄλÖà + + // ÔÚÖ¸¶¨µÄ¶¥µã¹ØÏµÉϼǼȨֵ(×¢£ºÕâÀïûÓÐÑé֤ϱêÊÇ·ñÔ½½ç) + (*G).arcs[i][j].adj = w; + + // Èç¹ûÐèҪ¼Èë±ßµÄÆäËû¸½¼ÓÐÅÏ¢ + if(IncInfo) { + // ×îºó¼È븽¼ÓÐÅÏ¢ + Input(*G, &((*G).arcs[i][j].info)); + } + + // Ìî³ä¶Ô³Æµã + (*G).arcs[j][i] = (*G).arcs[i][j]; + } + + // ´ÓÎļþÖжÁÈ¡Êý¾Ýʱ£¬×îºóÆäʵӦµ±ÅжÏÒ»ÏÂÊÇ·ñ¶Áµ½ÁË×ã¹»µÄÐÅÏ¢ + return OK; +} + +/* + * ¼Èë±ß/»¡µÄÏà¹Ø¸½¼ÓÐÅÏ¢ + */ +static void Input(MGraph G, InfoType** info) { + //¼Èë±ß/»¡µÄÐÅÏ¢£¬±¾²âÊÔÉæ¼°µ½µÄ±ß/»¡Ä¬ÈÏÎÞÆäËû¸½¼ÓÐÅÏ¢ +} + +/* + * ²éÕÒ + * + * ·µ»Ø¶¥µãuÔÚͼ/ÍøÖеÄλÖà + */ +int LocateVex(MGraph G, VertexType u) { + int i; + + for(i = 0; i < G.vexnum; i++) { + if(G.vexs[i] == u) { + return i; + } + } + + return -1; +} + +/* + * ²åÈë¶¥µã + * + * ½«Ö¸¶¨µÄ¶¥µãv×·¼Óµ½¶¥µã¼¯ÖУ¬Î´½¨Á¢¸Ã¶¥µãÓëÆäËû¶¥µãµÄ¹ØÏµ + */ +Status InsertVex(MGraph* G, VertexType v) { + int i, k; + VRType adj; + + // ¶¥µãÊý¹ý¶à + if((*G).vexnum == MAX_VERTEX_NUM) { + return ERROR; + } + + // Ê×ÏÈÐèÒªÅжϸö¥µãÊÇ·ñ´æÔÚ + k = LocateVex(*G, v); + if(k >= 0) { + return ERROR; // Ö¸¶¨µÄ¶¥µã´æÔÚʱ£¬ÎÞÐèÖØ¸´Ìí¼Ó + } + + // È·¶¨Ò»¸ö·ÇÁ¬Í¨±ê¼Ç + if((*G).kind == DG || (*G).kind == UDG) { + adj = 0; // ͼ + } else if((*G).kind == DN || (*G).kind == UDN) { + adj = INFINITE; // Íø + } else { + return ERROR; + } + + (*G).vexs[(*G).vexnum] = v; + (*G).vexnum++; + + for(i = 0; i < (*G).vexnum; i++) { + (*G).arcs[i][(*G).vexnum - 1].adj = adj; + (*G).arcs[(*G).vexnum - 1][i].adj = adj; + } + + return OK; +} + +/* + * ɾ³ý¶¥µã + * + * ´Ó¶¥µã¼¯ÖÐɾ³ýÖ¸¶¨µÄ¶¥µãv£¬×¢ÒâÐèÒª¸üÐÂÏà¹ØµÄ¶¥µã¹ØÏµ + */ +Status DeleteVex(MGraph* G, VertexType v) { + int i, j, k; + VRType adj; + + k = LocateVex(*G, v); + if(k == -1) { + return ERROR; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + // È·¶¨Ò»¸ö·ÇÁ¬Í¨±ê¼Ç + if((*G).kind == DG || (*G).kind == UDG) { + adj = 0; // ͼ + } else if((*G).kind == DN || (*G).kind == UDN) { + adj = INFINITE; // Íø + } else { + return ERROR; + } + + // ¸üбß/»¡µÄÊýÁ¿ + for(i = 0; i < (*G).vexnum; i++) { + // Èç¹û´æÔÚ´Ó¶¥µãv³ö·¢µÄ±ß£¬Ôò±ßµÄÊýÁ¿¼õÒ» + if((*G).arcs[k][i].adj != adj) { + (*G).arcnum--; + } + + // Èç¹ûÕâÊÇÓÐÏòµÄͼ/Íø£¬ÒÀÈ»ÐèÒª¸üбß/»¡µÄÊýÁ¿ + if((*G).kind == DG || (*G).kind == DN) { + // Èç¹û´æÔÚµ½´ï¶¥µãvµÄ±ß£¬Ôò±ßµÄÊýÁ¿¼õÒ» + if((*G).arcs[i][k].adj != adj) { + (*G).arcnum--; + } + } + } + + // ½«ÁÚ½Ó¾ØÕóÖеĶ¥µã¹ØÏµ×óÒÆ + for(j = k + 1; j < (*G).vexnum; j++) { + for(i = 0; i < (*G).vexnum; i++) { + (*G).arcs[i][j - 1] = (*G).arcs[i][j]; // ÓұߵÄÁÐŲµ½×ó±ßµÄÁÐ + } + } + + // ½«ÁÚ½Ó¾ØÕóÖеĶ¥µã¹ØÏµÉÏÒÆ + for(i = k + 1; i < (*G).vexnum; i++) { + // ×¢£¬ÓÉÓÚÉÏÃæ½øÐÐ×óÒÆµÄ¹ØÏµ£¬ËùÒÔÕâÀïµÄjÊÇСÓÚ(*G).vexnum - 1 + for(j = 0; j < (*G).vexnum - 1; j++) { + (*G).arcs[i - 1][j] = (*G).arcs[i][j]; // ÏÂÒ»ÐÐŲµ½ÉÏÒ»ÐÐ + } + } + + // ½«¸Ã¶¥µã´Ó¶¥µã¼¯ÖÐÒÆ³ý + for(i = k + 1; i < (*G).vexnum; i++) { + (*G).vexs[i - 1] = (*G).vexs[i]; + } + + // ¶¥µãÊý¼õÒ» + (*G).vexnum--; + + return OK; +} + +/* + * ²åÈë±ß/»¡ + * + * Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬Ôò²åÈëÒ»Ìõ»¡ÐèÒªÔö¼ÓÁ½¸ö¶¥µã¹ØÏµ£¬µ«»¡µÄÊýÁ¿Ö»ÔöÒ»¡£ + * + * ¶ÔÓÚͼÀ´Ëµ£¬¿ÉÒÔÔڿɱä²ÎÊýÖÐÁгö±ß/»¡µÄ¸½¼ÓÐÅÏ¢£» + * ¶ÔÓÚÍøÀ´Ëµ£¬¿ÉÒÔÔڿɱä²ÎÊýÖÐÒÀ´ÎÁгö±ß/»¡µÄȨֵÒÔ¼°¸½¼ÓÐÅÏ¢¡£ + */ +Status InsertArc(MGraph* G, VertexType v, VertexType w, ...) { + int kv, kw; + VRType adj; // ¶¥µã¹ØÏµ + Boolean overlay = FALSE; // ÊÇ·ñΪ¸²¸ÇÌí¼Ó + InfoType* info = NULL; // ±ß/»¡µÄ¸½¼ÓÐÅÏ¢ + va_list ap; + + kv = LocateVex(*G, v); + if(kv == -1) { + return ERROR; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + kw = LocateVex(*G, w); + if(kw == -1) { + return ERROR; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + // ¾Ü¾ø»· + if(kv == kw) { + return ERROR; + } + + /* È·¶¨Ò»¸ö¶¥µã¹ØÏµ */ + + // ¶ÔÓÚͼÀ´Ëµ£¬Á¬Í¨¹ØÏµÓÃ1±íʾ + if((*G).kind == DG || (*G).kind == UDG) { + adj = 1; + + // Èç¹û±ß/»¡ÉÏ´æÔÚ¸½¼ÓÐÅÏ¢ + if(IncInfo) { + va_start(ap, w); // ÔÚwºó²éѯÊ׸ö¿É±ä²ÎÊý + info = va_arg(ap, InfoType*); // »ñÈ¡¸½¼ÓÐÅÏ¢ + va_end(ap); + } + + overlay = (*G).arcs[kv][kw].adj != 0; + + // ¶ÔÓÚÍøÀ´Ëµ£¬´Ë´¦ÐèÒª´Ó¿É±ä²ÎÊýÖлñȡȨֵÐÅÏ¢ + } else if((*G).kind == DN || (*G).kind == UDN) { + va_start(ap, w); // ÔÚwºó²éѯÊ׸ö¿É±ä²ÎÊý + + adj = va_arg(ap, VRType); // »ñȡȨֵÐÅÏ¢ + + // Èç¹û±ß/»¡ÉÏ´æÔÚ¸½¼ÓÐÅÏ¢ + if(IncInfo) { + info = va_arg(ap, InfoType*); // »ñÈ¡¸½¼ÓÐÅÏ¢ + } + + va_end(ap); + + overlay = (*G).arcs[kv][kw].adj != INFINITE; + } else { + return ERROR; + } + + (*G).arcs[kv][kw].adj = adj; // ¼Ç¼¶¥µã¹ØÏµ + + // Èç¹û±ß/»¡ÉÏ´æÔÚ¸½¼ÓÐÅÏ¢£¬Ôò¼Ç¼¸½¼Ó¹ØÏµ + if(IncInfo) { + (*G).arcs[kv][kw].info = info; + } + + // Èç¹ûÊÇÎÞÏòͼ/Íø£¬ÐèÒª¿¼ÂǶԳÆÐÔ + if((*G).kind == UDG || (*G).kind == UDN) { + (*G).arcs[kw][kv] = (*G).arcs[kv][kw]; + } + + // ÔڷǸ²¸ÇµÄÇéÐÎÏ£¬²Å¿¼ÂǸüбß/»¡µÄÊýÁ¿ + if(!overlay) { + (*G).arcnum++; // ²»ÂÛÓÐÏòÎÞÏò£¬±ß/»¡ÊýÖ»ÔöÒ» + } + + return OK; +} + +/* + * ɾ³ý±ß/»¡ + * + * ´Ëɾ³ýÖ»ÊǸüбß/»¡µÄÁ¬Í¨¹ØÏµ + */ +Status DeleteArc(MGraph* G, VertexType v, VertexType w) { + int kv, kw; + VRType adj; + Boolean found = FALSE; // ÊÇ·ñ´æÔÚ´ýɾ³ýµÄ±ß/»¡ + + kv = LocateVex(*G, v); + if(kv == -1) { + return ERROR; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + kw = LocateVex(*G, w); + if(kw == -1) { + return ERROR; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + // È·¶¨Ò»¸ö·ÇÁ¬Í¨±ê¼Ç + if((*G).kind == DG || (*G).kind == UDG) { + adj = 0; // ͼ + + found = (*G).arcs[kv][kw].adj != 0; + } else if((*G).kind == DN || (*G).kind == UDN) { + adj = INFINITE; // Íø + + found = (*G).arcs[kv][kw].adj != INFINITE; + } else { + return ERROR; + } + + // ±ê¼ÇÕâÁ½¸ö¶¥µãÒѶϿªÁ¬½Ó + (*G).arcs[kv][kw].adj = adj; + + // Èç¹ûÊÇÎÞÏòͼ/Íø£¬ÐèÒª¿¼ÂǶԳÆÐÔ + if((*G).kind == UDG || (*G).kind == UDN) { + (*G).arcs[kw][kv] = (*G).arcs[kv][kw]; + } + + // ÔÚÕÒµ½ÁËÖ¸¶¨µÄ»¡Ê±£¬²Å¿¼ÂǸüбß/»¡µÄÊýÁ¿ + if(found) { + (*G).arcnum--; // ²»ÂÛÓÐÏòÎÞÏò£¬±ß/»¡ÊýÖ»¼õÒ» + } + + return OK; +} + +/* + * ÒÔͼÐλ¯ÐÎʽÊä³öµ±Ç°½á¹¹ + * + * ×¢£ºÔÚͼ/ÍøÖУ¬Ê¹ÓÃ"-"À´±íʾÁ½¶¥µã²»Ö±½ÓÁ¬Í¨ + */ +void PrintGraph(MGraph G) { + int i, j; + + if(G.vexnum == 0) { + printf("¿Õͼ£¬ÎÞÐè´òÓ¡£¡\n"); + return; + } + + printf("µ±Ç°Í¼/Íø°üº¬ %2d ¸ö¶¥µã£¬ %2d Ìõ±ß/»¡...\n", G.vexnum, G.arcnum); + + printf(" "); + for(i = 0; i < G.vexnum; i++) { + printf(" %c", G.vexs[i]); + } + printf("\n"); + + for(i = 0; i < G.vexnum; i++) { + printf("%c ", G.vexs[i]); + + for(j = 0; j < G.vexnum; j++) { + if(((G.kind == DG || G.kind == UDG) && G.arcs[i][j].adj == 0) || ((G.kind == DN || G.kind == UDN) && G.arcs[i][j].adj == INFINITE)) { + printf(" -"); + } else { + printf("%3d", G.arcs[i][j].adj); + } + } + + printf("\n"); + } +} diff --git a/Dev-C++/ExerciseBook/07.15/MGraph.h b/Dev-C++/ExerciseBook/07.15/MGraph.h new file mode 100644 index 0000000..9a8a555 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.15/MGraph.h @@ -0,0 +1,160 @@ +/*================================= + * ͼµÄÊý×é(ÁÚ½Ó¾ØÕó)´æ´¢±íʾ + * + * °üº¬Ëã·¨: 7.1¡¢7.2¡¢7.4¡¢7.5¡¢7.6 + ==================================*/ + +#ifndef MGRAPH_H +#define MGRAPH_H + +#include +#include // ÌṩºêINT_MAX +#include // Ìṩmemset¡¢strcmp Ô­ÐÍ +#include // Ìṩºêva_list¡¢va_start¡¢va_arg¡¢va_end +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// + +/* + * ×¢£º + * + * ͨ³£À´½²£¬ÎÞȨͼ±»¼ò³ÆÎª¡¾Í¼¡¿£¬ÓÐȨͼ±»¼ò³ÆÎª¡¾Íø¡¿¡£ + * ÎÞÏòͼ/ÍøÖеĶ¥µã¹ØÏµ±»³ÆÎª¡¾±ß¡¿£¬ÓÐÏòͼ/ÍøÖеĶ¥µã¹ØÏµ±»³ÆÎª¡¾»¡¡¿£¬²¢Çø·Ö»¡Í·Ó뻡β¡£ + * ʵ¼Ê±íÊöÖУ¬Î´±Ø»áÑϸñ×ñÊØÒÔÉÏÃüÃû¡£ + */ + +/* ºê¶¨Òå */ +#define INFINITE INT_MAX // ×î´óÖµ£¬ÓÃÀ´±íÊ¾ÍøÖеÄÁ½¸ö¶¥µã²»Ö±½ÓÁ¬½Ó +#define MAX_VERTEX_NUM 26 // ×î´ó¶¥µã¸öÊý + + +// ͼµÄÀàÐÍ +typedef enum { + DG, // 0-ÓÐÏòͼ + DN, // 1-ÓÐÏòÍø(´øÈ¨Öµ) + UDG, // 2-ÎÞÏòͼ + UDN // 3-ÎÞÏòÍø(´øÈ¨Öµ) +} GraphKind; + +// ¶¥µãÀàÐÍ +typedef char VertexType; + +/* + * ¶¥µã¹ØÏµÀàÐÍ + * + * ÔÚÎÞȨͼÖУ¬¸Ãֵͨ³£Îª0»ò1£¬±íʾÁ½¶¥µãÊÇ·ñÖ±½ÓÁ¬Í¨£» + * ÔÚÓÐȨͼÖУ¬¸Ãֵͨ³£ÎªÈ¨Öµ¡£ + */ +typedef int VRType; + +// ±ßµÄÏà¹Ø¸½¼ÓÐÅÏ¢ +typedef struct { + // Èç¹ûÓеϰ£¬ºóÐø»áÌí¼ÓÏàÓ¦µÄÊôÐÔ +} InfoType; + +// ±ßµÄÀàÐÍ£¬Ã¿Ìõ±ßÉÏ¿ÉÄÜÓи½¼ÓÐÅÏ¢info +typedef struct ArcCell { + VRType adj; // ¶¥µã¹ØÏµ£¬ÔÚÓÐȨͼ¸úÎÞȨͼÖеĺ¬Ò岻ͬ + InfoType* info; // ±ßµÄ¸½¼ÓÐÅÏ¢£¬Í¨³£ºöÂÔ +} ArcCell; + +/* ͼ/ÍøµÄÊý×é(ÁÚ½Ó¾ØÕó)´æ´¢±íʾÀàÐͶ¨Òå */ +typedef struct { + VertexType vexs[MAX_VERTEX_NUM]; // ¶¥µãÏòÁ¿ + ArcCell arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; // ÁÚ½Ó¾ØÕó + int vexnum, arcnum; // ͼ/ÍøµÄ¶¥µãÊýºÍ»¡Êý + GraphKind kind; // ͼµÄÀàÐͱêÖ¾ +} MGraph; + + +// ±ß/»¡ÉÏÊÇ·ñ´æÔÚ¸½¼ÓÐÅÏ¢ +extern Boolean IncInfo; + + +/* + * ¨€¨€¨€¨€¨€¨€¨€¨€ Ëã·¨7.1 ¨€¨€¨€¨€¨€¨€¨€¨€ + * + * ´´½¨ + * + *¡¾±¸×¢¡¿ + * + * ½Ì²ÄÖÐĬÈÏ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý¡£ + * ÕâÀïΪÁË·½±ã²âÊÔ£¬±ÜÃâÿ´ÎÔËÐж¼ÊÖ¶¯ÊäÈëÊý¾Ý£¬ + * Òò¶øÔÊÐíÑ¡Ôñ´ÓÔ¤ÉèµÄÎļþpathÖжÁÈ¡²âÊÔÊý¾Ý¡£ + * + * Èç¹ûÐèÒª´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý£¬ÔòpathΪNULL£¬»òpath[kind]Ϊ""¡£ + * Èç¹ûÐèÒª´ÓÎļþÖжÁÈ¡Êý¾Ý£¬ÔòÐèÒªÔÚpathÖÐÌîдÎļþÃûÐÅÏ¢¡£ + */ +Status CreateGraph(MGraph* G, char* path[]); + +/* + * ¹¹ÔìÓÐÏòͼ + */ +static Status CreateDG(MGraph* G); + +/* + * ¹¹ÔìÓÐÏòÍø + */ +static Status CreateDN(MGraph* G); + +/* + * ¹¹ÔìÎÞÏòͼ + */ +static Status CreateUDG(MGraph* G); + +/* + * ¨€¨€¨€¨€¨€¨€¨€¨€ Ëã·¨7.2 ¨€¨€¨€¨€¨€¨€¨€¨€ + * + * ¹¹ÔìÎÞÏòÍø + */ +static Status CreateUDN(MGraph* G); + +/* + * ¼Èë±ßµÄÏà¹Ø¸½¼ÓÐÅÏ¢ + */ +static void Input(MGraph G, InfoType** info); + +/* + * ²éÕÒ + * + * ·µ»Ø¶¥µãuÔÚͼ/ÍøÖеÄλÖà + */ +int LocateVex(MGraph G, VertexType u); + +/* + * ²åÈë¶¥µã + * + * ½«Ö¸¶¨µÄ¶¥µãv×·¼Óµ½¶¥µã¼¯ÖУ¬Î´½¨Á¢¸Ã¶¥µãÓëÆäËû¶¥µãµÄ¹ØÏµ + */ +Status InsertVex(MGraph* G, VertexType v); + +/* + * ɾ³ý¶¥µã + * + * ´Ó¶¥µã¼¯ÖÐɾ³ýÖ¸¶¨µÄ¶¥µãv£¬×¢ÒâÐèÒª¸üÐÂÏà¹ØµÄ¶¥µã¹ØÏµ + */ +Status DeleteVex(MGraph* G, VertexType v); + +/* + * ²åÈë±ß/»¡ + * + * Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬Ôò²åÈëÒ»Ìõ»¡ÐèÒªÔö¼ÓÁ½¸ö¶¥µã¹ØÏµ£¬µ«»¡µÄÊýÁ¿Ö»ÔöÒ»¡£ + * + * ¶ÔÓÚͼÀ´Ëµ£¬¿ÉÒÔÔڿɱä²ÎÊýÖÐÁгö±ß/»¡µÄ¸½¼ÓÐÅÏ¢£» + * ¶ÔÓÚÍøÀ´Ëµ£¬¿ÉÒÔÔڿɱä²ÎÊýÖÐÒÀ´ÎÁгö±ß/»¡µÄȨֵÒÔ¼°¸½¼ÓÐÅÏ¢¡£ + */ +Status InsertArc(MGraph* G, VertexType v, VertexType w, ...); + +/* + * ɾ³ý±ß/»¡ + * + * ´Ëɾ³ýÖ»ÊǸüбß/»¡µÄÁ¬Í¨¹ØÏµ + */ +Status DeleteArc(MGraph* G, VertexType v, VertexType w); + +/* + * ÒÔͼÐλ¯ÐÎʽÊä³öµ±Ç°½á¹¹ + * + * ×¢£ºÔÚͼ/ÍøÖУ¬Ê¹ÓÃ"-"À´±íʾÁ½¶¥µã²»Ö±½ÓÁ¬Í¨ + */ +void PrintGraph(MGraph G); + +#endif diff --git a/Dev-C++/ExerciseBook/07.15/TestData_DG.txt b/Dev-C++/ExerciseBook/07.15/TestData_DG.txt new file mode 100644 index 0000000..ae011ea --- /dev/null +++ b/Dev-C++/ExerciseBook/07.15/TestData_DG.txt @@ -0,0 +1,6 @@ +ͼÀàÐÍ¡ú0£¨ÓÐÏòͼ£© +¶¥µãÊý¡ú6 +»¡Êý¡ú14 +»¡ÊÇ·ñ´øÓÐÆäËûÐÅÏ¢¡ú0 +¶¥µã¼¯¡ú¡¾A£¬X£¬B£¬C£¬D£¬E¡¿ +»¡µÄ¼¯ºÏ¡ú¡¾A£¬B¡¿¡¾A£¬C¡¿¡¾A£¬D¡¿¡¾B£¬C¡¿¡¾B£¬D¡¿¡¾B£¬E¡¿¡¾C£¬B¡¿¡¾C£¬E¡¿¡¾C£¬X¡¿¡¾E£¬A¡¿¡¾E£¬D¡¿¡¾E£¬X¡¿¡¾X£¬A¡¿¡¾X£¬D¡¿ \ No newline at end of file diff --git a/Dev-C++/ExerciseBook/07.15/TestData_DN.txt b/Dev-C++/ExerciseBook/07.15/TestData_DN.txt new file mode 100644 index 0000000..4baec42 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.15/TestData_DN.txt @@ -0,0 +1,6 @@ +ͼÀàÐÍ¡ú1£¨ÓÐÏòÍø£© +¶¥µãÊý¡ú6 +»¡Êý¡ú14 +»¡ÊÇ·ñ´øÓÐÆäËûÐÅÏ¢¡ú0 +¶¥µã¼¯¡ú¡¾A£¬X£¬B£¬C£¬D£¬E¡¿ +»¡µÄ¼¯ºÏ¡ú¡¾A£¬B£¬3¡¿¡¾A£¬C£¬8¡¿¡¾A£¬D£¬11¡¿¡¾B£¬C£¬7¡¿¡¾B£¬D£¬4¡¿¡¾B£¬E£¬1¡¿¡¾C£¬B£¬5¡¿¡¾C£¬E£¬17¡¿¡¾C£¬X£¬3¡¿¡¾E£¬A£¬6¡¿¡¾E£¬D£¬4¡¿¡¾E£¬X£¬2¡¿¡¾X£¬A£¬8¡¿¡¾X£¬D£¬10¡¿ \ No newline at end of file diff --git a/Dev-C++/ExerciseBook/07.15/TestData_UDG.txt b/Dev-C++/ExerciseBook/07.15/TestData_UDG.txt new file mode 100644 index 0000000..6c08d74 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.15/TestData_UDG.txt @@ -0,0 +1,6 @@ +ͼÀàÐÍ¡ú2£¨ÎÞÏòͼ£© +¶¥µãÊý¡ú6 +±ßÊý¡ú13 +±ßÊÇ·ñ´øÓÐÆäËûÐÅÏ¢¡ú0 +¶¥µã¼¯¡ú¡¾A£¬X£¬B£¬C£¬D£¬E¡¿ +±ßµÄ¼¯ºÏ¡ú¡¾A£¬B¡¿¡¾A£¬C¡¿¡¾A£¬D¡¿¡¾B£¬C¡¿¡¾B£¬D¡¿¡¾B£¬E¡¿¡¾C£¬E¡¿¡¾C£¬X¡¿¡¾E£¬A¡¿¡¾E£¬D¡¿¡¾E£¬X¡¿¡¾X£¬A¡¿¡¾X£¬D¡¿ \ No newline at end of file diff --git a/Dev-C++/ExerciseBook/07.15/TestData_UDN.txt b/Dev-C++/ExerciseBook/07.15/TestData_UDN.txt new file mode 100644 index 0000000..ed04fb4 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.15/TestData_UDN.txt @@ -0,0 +1,6 @@ +ͼÀàÐÍ¡ú3£¨ÎÞÏòÍø£© +¶¥µãÊý¡ú6 +±ßÊý¡ú13 +±ßÊÇ·ñ´øÓÐÆäËûÐÅÏ¢¡ú0 +¶¥µã¼¯¡ú¡¾A£¬X£¬B£¬C£¬D£¬E¡¿ +±ßµÄ¼¯ºÏ¡ú¡¾A£¬B£¬3¡¿¡¾A£¬C£¬8¡¿¡¾A£¬D£¬11¡¿¡¾B£¬C£¬7¡¿¡¾B£¬D£¬4¡¿¡¾B£¬E£¬1¡¿¡¾C£¬E£¬17¡¿¡¾C£¬X£¬3¡¿¡¾E£¬A£¬6¡¿¡¾E£¬D£¬4¡¿¡¾E£¬X£¬2¡¿¡¾X£¬A£¬8¡¿¡¾X£¬D£¬10¡¿ \ No newline at end of file diff --git a/Dev-C++/ExerciseBook/07.17/07.17.cpp b/Dev-C++/ExerciseBook/07.17/07.17.cpp new file mode 100644 index 0000000..384edfe --- /dev/null +++ b/Dev-C++/ExerciseBook/07.17/07.17.cpp @@ -0,0 +1,169 @@ +#include +#include // Ìṩºêva_list¡¢va_start¡¢va_arg¡¢va_end +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// +#include "OLGraph.h" //**¡ø07 ͼ**// + +/* + * ²åÈë¶¥µã + * + * ½«Ö¸¶¨µÄ¶¥µãv×·¼Óµ½¶¥µã¼¯ÖУ¬Î´½¨Á¢¸Ã¶¥µãÓëÆäËû¶¥µãµÄ¹ØÏµ + */ +Status InsertVex_7_17(OLGraph* G, VertexType v); + +/* + * ɾ³ý¶¥µã + * + * ´Ó¶¥µã¼¯ÖÐɾ³ýÖ¸¶¨µÄ¶¥µãv£¬×¢ÒâÐèÒª¸üÐÂÏà¹ØµÄ¶¥µã¹ØÏµ + */ +Status DeleteVex_7_17(OLGraph* G, VertexType v); + +/* + * ²åÈë±ß/»¡ + * + * Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬Ôò²åÈëÒ»Ìõ»¡ÐèÒªÔö¼ÓÁ½¸ö¶¥µã¹ØÏµ£¬µ«»¡µÄÊýÁ¿Ö»ÔöÒ»¡£ + * + * ¶ÔÓÚͼÀ´Ëµ£¬¿ÉÒÔÔڿɱä²ÎÊýÖÐÁгö±ß/»¡µÄ¸½¼ÓÐÅÏ¢£» + * ¶ÔÓÚÍøÀ´Ëµ£¬¿ÉÒÔÔڿɱä²ÎÊýÖÐÒÀ´ÎÁгö±ß/»¡µÄȨֵÒÔ¼°¸½¼ÓÐÅÏ¢¡£ + */ +Status InsertArc_7_17(OLGraph* G, VertexType v, VertexType w, ...); + +/* + * ɾ³ý±ß/»¡ + * + * ´Ëɾ³ýÖ»ÊǸüбß/»¡µÄÁ¬Í¨¹ØÏµ + */ +Status DeleteArc_7_17(OLGraph* G, VertexType v, VertexType w); + + +int main(int argc, char* argv[]) { + OLGraph G; + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ´´½¨²¢Êä³öͼ/Íø...\n"); + { + char* path[4]; + + path[0] = "TestData_DG.txt"; + path[1] = "TestData_DN.txt"; + path[2] = "TestData_UDG.txt"; + path[3] = "TestData_UDN.txt"; + + CreateGraph(&G, path); + PrintGraph(G); + printf("\n"); + } + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ɾ³ý¶¥µã...\n"); + { + VertexType v = 'X'; + + printf("ɾ³ý¶¥µã '%c' ºóµÄͼΪ£º\n", v); + DeleteVex_7_17(&G, v); + PrintGraph(G); + printf("\n"); + } + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ²åÈë¶¥µã...\n"); + { + VertexType v = 'Y'; + + printf("²åÈë¶¥µã '%c' ºóµÄͼΪ£º\n", v); + InsertVex_7_17(&G, v); + PrintGraph(G); + printf("\n"); + } + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ²åÈë±ß/»¡...\n"); + { + // ×¢£ºÊÇÖØ¸´µÄ±ß + VertexType v[10] = {'B', 'C', 'E', 'Y', 'Y', 'Y', 'D', 'D', 'E', 'E'}; + VertexType w[10] = {'Y', 'Y', 'Y', 'A', 'B', 'D', 'C', 'A', 'B', 'D'}; + InfoType info[10] = {{8}, {5}, {1}, {11}, {2}, {6}, {3}, {7}, {2}, {9}}; + int k; + + // ͼ + if(G.kind == DG || G.kind == UDG) { + for(k = 0; k < 10; k++) { + printf("²åÈëÎÞȨֵµÄ±ß£º<%c, %c>...\n", v[k], w[k]); + InsertArc_7_17(&G, v[k], w[k]); + } + + // Íø + } else if(G.kind == DN || G.kind == UDN) { + for(k = 0; k < 10; k++) { + printf("²åÈë´øÈ¨ÖµµÄ±ß£º<%c, %c, %d>...\n", v[k], w[k], info[k].weight); + InsertArc_7_17(&G, v[k], w[k], &info[k]); + } + } else { + return ERROR; + } + + PrintGraph(G); + printf("\n"); + } + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ɾ³ý±ß/»¡...\n"); + { + VertexType v[3] = {'D', 'E', 'F'}; + VertexType w[3] = {'A', 'B', 'B'}; + int k; + + for(k = 0; k < 3; k++) { + printf("ɾ³ý±ß£º<%c, %c>...\n", v[k], w[k]); + DeleteArc_7_17(&G, v[k], w[k]); + } + PrintGraph(G); + printf("\n"); + } + + return 0; +} + + +/* + * ²åÈë¶¥µã + * + * ½«Ö¸¶¨µÄ¶¥µãv×·¼Óµ½¶¥µã¼¯ÖУ¬Î´½¨Á¢¸Ã¶¥µãÓëÆäËû¶¥µãµÄ¹ØÏµ + */ +Status InsertVex_7_17(OLGraph* G, VertexType v) { + return InsertVex(G, v); +} + +/* + * ɾ³ý¶¥µã + * + * ´Ó¶¥µã¼¯ÖÐɾ³ýÖ¸¶¨µÄ¶¥µãv£¬×¢ÒâÐèÒª¸üÐÂÏà¹ØµÄ¶¥µã¹ØÏµ + */ +Status DeleteVex_7_17(OLGraph* G, VertexType v) { + return DeleteVex(G, v); +} + +/* + * ²åÈë±ß/»¡ + * + * Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬Ôò²åÈëÒ»Ìõ»¡ÐèÒªÔö¼ÓÁ½¸ö¶¥µã¹ØÏµ£¬µ«»¡µÄÊýÁ¿Ö»ÔöÒ»¡£ + * + * ¶ÔÓÚͼÀ´Ëµ£¬¿ÉÒÔÔڿɱä²ÎÊýÖÐÁгö±ß/»¡µÄ¸½¼ÓÐÅÏ¢£» + * ¶ÔÓÚÍøÀ´Ëµ£¬¿ÉÒÔÔڿɱä²ÎÊýÖÐÒÀ´ÎÁгö±ß/»¡µÄȨֵÒÔ¼°¸½¼ÓÐÅÏ¢¡£ + */ +Status InsertArc_7_17(OLGraph* G, VertexType v, VertexType w, ...) { + va_list ap; + InfoType* info = NULL; // ±ß/»¡µÄ¸½¼ÓÐÅÏ¢ + + // Èç¹û±ß/»¡ÉÏ´æÔÚ¸½¼ÓÐÅÏ¢ + if(IncInfo) { + va_start(ap, w); // ÔÚwºó²éѯÊ׸ö¿É±ä²ÎÊý + info = va_arg(ap, InfoType*); // »ñÈ¡¸½¼ÓÐÅÏ¢ + va_end(ap); + } + + return InsertArc(G, v, w, info); +} + +/* + * ɾ³ý±ß/»¡ + * + * ´Ëɾ³ýÖ»ÊǸüбß/»¡µÄÁ¬Í¨¹ØÏµ + */ +Status DeleteArc_7_17(OLGraph* G, VertexType v, VertexType w) { + return DeleteArc(G, v, w); +} diff --git a/Dev-C++/ExerciseBook/07.17/07.17.dev b/Dev-C++/ExerciseBook/07.17/07.17.dev new file mode 100644 index 0000000..c3cdc31 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.17/07.17.dev @@ -0,0 +1,118 @@ +[Project] +FileName=07.17.dev +Name=07.17 +Type=1 +Ver=2 +ObjFiles= +Includes= +Libs= +PrivateResource= +ResourceIncludes= +MakeIncludes= +Compiler= +CppCompiler= +Linker= +IsCpp=0 +Icon= +ExeOutput= +ObjectOutput= +LogOutput= +LogOutputEnabled=0 +OverrideOutput=0 +OverrideOutputName= +HostApplication= +UseCustomMakefile=0 +CustomMakefile= +CommandLine= +Folders= +IncludeVersionInfo=0 +SupportXPThemes=0 +CompilerSet=1 +CompilerSettings=0000000000000000001000000 +UnitCount=7 + +[VersionInfo] +Major=1 +Minor=0 +Release=0 +Build=0 +LanguageID=1033 +CharsetID=1252 +CompanyName= +FileVersion= +FileDescription=Developed using the Dev-C++ IDE +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion= +AutoIncBuildNr=0 +SyncProduct=1 + +[Unit1] +FileName=07.17.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit2] +FileName=OLGraph.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit3] +FileName=OLGraph.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit4] +FileName=TestData_DG.txt +Folder= +Compile=0 +Link=0 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit5] +FileName=TestData_DN.txt +Folder= +Compile=0 +Link=0 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit6] +FileName=TestData_UDG.txt +Folder= +Compile=0 +Link=0 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit7] +FileName=TestData_UDN.txt +Folder= +Compile=0 +Link=0 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + diff --git a/Dev-C++/ExerciseBook/07.17/OLGraph.cpp b/Dev-C++/ExerciseBook/07.17/OLGraph.cpp new file mode 100644 index 0000000..b2cee58 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.17/OLGraph.cpp @@ -0,0 +1,861 @@ +/*==================== + * ͼµÄÊ®×ÖÁ´±í´æ´¢±íʾ + * + * °üº¬Ëã·¨: 7.3 + ====================*/ + +#include "OLGraph.h" + +// ¼ÈëÊý¾ÝµÄÔ´Îļþ£»fpΪnullʱ£¬ËµÃ÷ÐèÒª´Ó¿ØÖÆÌ¨Â¼Èë +static FILE* fp = NULL; + +/* + * IncInfoָʾ¸ÃͼµÄ±ßÉÏÊÇ·ñ´æÔÚ¸½¼ÓÐÅÏ¢¡£ + * Èç¹ûÆäÖµ²»Îª0£¬Ôò±íʾÎÞ¸½¼ÓÐÅÏ¢£¬·ñÔò£¬±íʾ´æÔÚ¸½¼ÓÐÅÏ¢¡£ + */ +Boolean IncInfo = FALSE; + +// ·ÃÎʱêÖ¾Êý×飬¼Ç¼·ÃÎʹýµÄ¶¥µã +static Boolean visited[MAX_VERTEX_NUM]; + +// º¯Êý±äÁ¿ +static Status (* VisitFunc)(VertexType e); + + +/* + * ´´½¨ + * + *¡¾±¸×¢¡¿ + * + * ½Ì²ÄÖÐĬÈÏ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý¡£ + * ÕâÀïΪÁË·½±ã²âÊÔ£¬±ÜÃâÿ´ÎÔËÐж¼ÊÖ¶¯ÊäÈëÊý¾Ý£¬ + * Òò¶øÔÊÐíÑ¡Ôñ´ÓÔ¤ÉèµÄÎļþpathÖжÁÈ¡²âÊÔÊý¾Ý¡£ + * + * Èç¹ûÐèÒª´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý£¬ÔòpathΪNULL£¬»òpath[kind]Ϊ""¡£ + * Èç¹ûÐèÒª´ÓÎļþÖжÁÈ¡Êý¾Ý£¬ÔòÐèÒªÔÚpathÖÐÌîдÎļþÃûÐÅÏ¢¡£ + */ +Status CreateGraph(OLGraph* G, char* path[]) { + int readFromConsole; // ÊÇ·ñ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý + int kind; + Status flag; + + printf("ÇëÊäÈëͼµÄÀàÐÍ(0-ÓÐÏòͼ ©¦ 1-ÓÐÏòÍø ©¦ 2-ÎÞÏòͼ ©¦ 3-ÎÞÏòÍø)£º"); + scanf("%d", &kind); + + // ÀàÐͲ»ºÏ¹æ + if(kind < 0 || kind > 3) { + return ERROR; + } + + // Èç¹ûûÓÐÎļþ·¾¶ÐÅÏ¢£¬Ôò´Ó¿ØÖÆÌ¨¶ÁÈ¡ÊäÈë + readFromConsole = (path == NULL) || strcmp(path[kind], "") == 0; + + // ÐèÒª´ÓÎļþ¶ÁÈ¡ + if(readFromConsole) { + (*G).kind = GraphKind(kind); // ¼Ç¼ͼ/ÍøµÄÀàÐÍ + } else { + // ´ò¿ªÎļþ£¬×¼±¸¶ÁÈ¡²âÊÔÊý¾Ý + fp = fopen(path[kind], "r"); + if(fp == NULL) { + return ERROR; + } + + // ¼ÈëͼµÄÀàÐÍ + ReadData(fp, "%d", &((*G).kind)); + } + + // Ëæ»ú´´½¨ÓÐÏòͼ/Íø»òÎÞÏòͼ/ÍøµÄÒ»ÖÖ + switch((*G).kind) { + case DG: + flag = CreateDG(G); + break; + case DN: + flag = CreateDN(G); + break; + case UDG: + flag = CreateUDG(G); + break; + case UDN: + flag = CreateUDN(G); + break; + default: + flag = ERROR; + break; + } + + if(fp != NULL) { + fclose(fp); + fp = NULL; + } + + return flag; +} + +/* + * ¨€¨€¨€¨€¨€¨€¨€¨€ Ëã·¨7.3 ¨€¨€¨€¨€¨€¨€¨€¨€ + * + * ¹¹ÔìÓÐÏòͼ + * + * ×¢£º + * ½Ì²ÄÖÐʹÓÃÁËÍ·²å·¨À´²åÈ뻡£¬ÕâÖÖ×ö·¨µÄΨһÓŵãÊDzåÈë·½±ã£¬ + * µ«ÊÇÔÚÉæ¼°µ½É¾³ý»ò²éÕÒʱ£¬Ð§Âʽϵͣ» + * ¶øÇÒ£¬"Í·²å·¨"ÒÀÀµÊäÈëµÄ˳Ðò£¬Èç¹ûÊäÈëµÄ±ß/»¡ÊÇÂÒÐòµÄ£¬ + * Ôò×îÖÕ¹¹Ôì³öµÄͼ/ÍøÖеıß/»¡Ò²ÊÇÎÞÐòµÄ¡£ + * + * ΪÁ˿˷þÒÔÉÏȱµã£¬ÕâÀï¸ÄÓÃ"ÉýÐò"²åÈë·¨£¬±£Ö¤²åÈëµÄ»¡ÊÇ"ÉýÐò"µÄ¡£ + * µ«Í¬Ê±£¬ÕâÑù×ö»áʹ"²åÈë"Ëã·¨±äµÃ½ÏΪ¸´ÔÓ¡£ + */ +static Status CreateDG(OLGraph* G) { + int i, k; + int vexnum, arcnum; + VertexType v1, v2; + InfoType* info = NULL; + + (*G).vexnum = (*G).arcnum = 0; + + if(fp == NULL) { + printf("ÇëÊäÈëÓÐÏòͼµÄ¶¥µãÊý£º"); + scanf("%d", &vexnum); + printf("ÇëÊäÈëÓÐÏòͼµÄ»¡Êý£º"); + scanf("%d", &arcnum); + printf("¸ÃÓÐÏòͼµÄ»¡ÉÏÊÇ·ñ°üº¬ÆäËû¸½¼ÓÐÅÏ¢(0-²»°üº¬©¦1-°üº¬)£º"); + scanf("%d", &IncInfo); + + // ¼Èë¶¥µã¼¯ + printf("Çë¼Èë %d ¸ö¶¥µã£¬²»Í¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º", vexnum); + for(i = 0; i < vexnum; i++) { + scanf("%c", &((*G).xlist[i].data)); + (*G).xlist[i].firstin = NULL; + (*G).xlist[i].firstout = NULL; + (*G).vexnum++; + } + } else { + ReadData(fp, "%d", &vexnum); // ¼Èë¶¥µãÊý + ReadData(fp, "%d", &arcnum); // ¼È뻡Êý + ReadData(fp, "%d", &IncInfo); // Åжϻ¡ÉÏÊÇ·ñ°üº¬¸½¼ÓÐÅÏ¢ + + // ¼Èë¶¥µã¼¯ + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(fp); + ReadData(fp, "%c", &((*G).xlist[i].data)); + (*G).xlist[i].firstin = NULL; + (*G).xlist[i].firstout = NULL; + (*G).vexnum++; + } + } + + // ½öÔÚ¿ØÖÆÌ¨Â¼ÈëÐÅϢʱÊä³ö´ËÌáʾ + if(fp == NULL && arcnum != 0) { + printf("ÇëΪÓÐÏòͼÒÀ´Î¼Èë %d Ìõ»¡µÄÐÅÏ¢£¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º\n", arcnum); + } + + // ¼È뻡µÄÐÅÏ¢ + for(k = 0; k < arcnum; k++) { + if(fp == NULL) { + printf("µÚ %2d Ìõ»¡£º", k + 1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v2); + } else { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + skipBlank(fp); + ReadData(fp, "%c%c", &v1, &v2); + } + + // Èç¹ûÐèҪ¼È뻡µÄÆäËû¸½¼ÓÐÅÏ¢ + if(IncInfo) { + // ×îºó¼È븽¼ÓÐÅÏ¢ + Input(*G, &info); + } + + // ²åÈ뻡 + InsertArc(G, v1, v2, info); + } + + // ´ÓÎļþÖжÁÈ¡Êý¾Ýʱ£¬×îºóÆäʵӦµ±ÅжÏÒ»ÏÂÊÇ·ñ¶Áµ½ÁË×ã¹»µÄÐÅÏ¢ + return OK; +} + +/* + * ¹¹ÔìÓÐÏòÍø + */ +static Status CreateDN(OLGraph* G) { + int i, k; + int vexnum, arcnum; + VertexType v1, v2; + InfoType* info = NULL; + + (*G).vexnum = (*G).arcnum = 0; + + if(fp == NULL) { + printf("ÇëÊäÈëÓÐÏòͼµÄ¶¥µãÊý£º"); + scanf("%d", &vexnum); + printf("ÇëÊäÈëÓÐÏòÍøµÄ»¡Êý£º"); + scanf("%d", &arcnum); + printf("¸ÃÓÐÏòÍøµÄ»¡ÉϱØÐë°üº¬ÆäËû¸½¼ÓÐÅÏ¢£¬ÒòΪ´Ë´¦µÄȨֵÐèÒª´æ´¢µ½¸½¼ÓÐÅÏ¢ÖÐ...\n"); + IncInfo = 1; + + // ¼Èë¶¥µã¼¯ + printf("Çë¼Èë %d ¸ö¶¥µã£¬²»Í¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º", vexnum); + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(stdin); + scanf("%c", &((*G).xlist[i].data)); + (*G).xlist[i].firstin = NULL; + (*G).xlist[i].firstout = NULL; + (*G).vexnum++; + } + } else { + ReadData(fp, "%d", &vexnum); // ¼Èë¶¥µãÊý + ReadData(fp, "%d", &arcnum); // ¼È뻡Êý + ReadData(fp, "%d", &IncInfo);// Åжϻ¡ÉÏÊÇ·ñ°üº¬¸½¼ÓÐÅÏ¢(´Ë´¦Ó¦µ±°üº¬) + IncInfo = 1; // Ç¿ÖÆ½«È¨ÖµÂ¼Èëµ½¸½¼ÓÐÅÏ¢ÖÐ + + // ¼Èë¶¥µã¼¯ + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(fp); + ReadData(fp, "%c", &((*G).xlist[i].data)); + (*G).xlist[i].firstin = NULL; + (*G).xlist[i].firstout = NULL; + (*G).vexnum++; + } + } + + // ½öÔÚ¿ØÖÆÌ¨Â¼ÈëÐÅϢʱÊä³ö´ËÌáʾ + if(fp == NULL && arcnum != 0) { + printf("ÇëΪÓÐÏòÍøÒÀ´Î¼Èë %d Ìõ»¡(´øÈ¨Öµ)µÄÐÅÏ¢£¬¶¥µã¼°È¨ÖµÖ®¼äÓÿոñ¸ô¿ª£º\n", arcnum); + } + + // ¼È뻡µÄÐÅÏ¢ + for(k = 0; k < arcnum; k++) { + if(fp == NULL) { + printf("µÚ %2d Ìõ»¡¼°ÆäȨֵ£º", k + 1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v2); + } else { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + skipBlank(fp); + ReadData(fp, "%c%c", &v1, &v2); + } + + // Èç¹ûÐèҪ¼È뻡µÄÆäËû¸½¼ÓÐÅÏ¢ + if(IncInfo) { + // ×îºó¼È븽¼ÓÐÅÏ¢(´Ë´¦ÐèҪ¼ÈëÍøµÄȨֵ) + Input(*G, &info); + } + + // ²åÈ뻡 + InsertArc(G, v1, v2, info); + } + + // ´ÓÎļþÖжÁÈ¡Êý¾Ýʱ£¬×îºóÆäʵӦµ±ÅжÏÒ»ÏÂÊÇ·ñ¶Áµ½ÁË×ã¹»µÄÐÅÏ¢ + return OK; +} + +/* + * ¹¹ÔìÎÞÏòͼ + */ +static Status CreateUDG(OLGraph* G) { + int i, k; + int vexnum, arcnum; + VertexType v1, v2; + InfoType* info = NULL; + + (*G).vexnum = (*G).arcnum = 0; + + if(fp == NULL) { + printf("ÇëÊäÈëÎÞÏòͼµÄ¶¥µãÊý£º"); + scanf("%d", &vexnum); + printf("ÇëÊäÈëÎÞÏòͼµÄ±ßÊý£º"); + scanf("%d", &arcnum); + printf("¸ÃÎÞÏòͼµÄ±ßÉÏÊÇ·ñ°üº¬ÆäËû¸½¼ÓÐÅÏ¢(0-²»°üº¬©¦1-°üº¬)£º"); + scanf("%d", &IncInfo); + + // ¼Èë¶¥µã¼¯ + printf("Çë¼Èë %d ¸ö¶¥µã£¬²»Í¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º", vexnum); + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(stdin); + scanf("%c", &((*G).xlist[i].data)); + (*G).xlist[i].firstin = NULL; + (*G).xlist[i].firstout = NULL; + (*G).vexnum++; + } + } else { + ReadData(fp, "%d", &vexnum); // ¼Èë¶¥µãÊý + ReadData(fp, "%d", &arcnum); // ¼Èë±ßÊý + ReadData(fp, "%d", &IncInfo);// ÅжϱßÉÏÊÇ·ñ°üº¬¸½¼ÓÐÅÏ¢ + + // ¼Èë¶¥µã¼¯ + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(fp); + ReadData(fp, "%c", &((*G).xlist[i].data)); + (*G).xlist[i].firstin = NULL; + (*G).xlist[i].firstout = NULL; + (*G).vexnum++; + } + } + + // ½öÔÚ¿ØÖÆÌ¨Â¼ÈëÐÅϢʱÊä³ö´ËÌáʾ + if(fp == NULL && arcnum != 0) { + printf("ÇëΪÎÞÏòͼÒÀ´Î¼Èë %d Ìõ±ßµÄÐÅÏ¢£¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º\n", arcnum); + } + + // ¼Èë±ßµÄÐÅÏ¢ + for(k = 0; k < arcnum; k++) { + if(fp == NULL) { + printf("µÚ %2d Ìõ±ß£º", k + 1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v2); + } else { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + skipBlank(fp); + ReadData(fp, "%c%c", &v1, &v2); + } + + // Èç¹ûÐèҪ¼Èë±ßµÄÆäËû¸½¼ÓÐÅÏ¢ + if(IncInfo) { + // ×îºó¼È븽¼ÓÐÅÏ¢ + Input(*G, &info); + } + + // ²åÈë±ß + InsertArc(G, v1, v2, info); + } + + // ´ÓÎļþÖжÁÈ¡Êý¾Ýʱ£¬×îºóÆäʵӦµ±ÅжÏÒ»ÏÂÊÇ·ñ¶Áµ½ÁË×ã¹»µÄÐÅÏ¢ + return OK; +} + +/* + * ¹¹ÔìÎÞÏòÍø + */ +static Status CreateUDN(OLGraph* G) { + int i, k; + int vexnum, arcnum; + VertexType v1, v2; + InfoType* info = NULL; + + (*G).vexnum = (*G).arcnum = 0; + + if(fp == NULL) { + printf("ÇëÊäÈëÎÞÏòÍøµÄ¶¥µãÊý£º"); + scanf("%d", &vexnum); + printf("ÇëÊäÈëÎÞÏòÍøµÄ±ßÊý£º"); + scanf("%d", &arcnum); + printf("¸ÃÎÞÏòÍøµÄ±ßÉϱØÐë°üº¬ÆäËû¸½¼ÓÐÅÏ¢£¬ÒòΪ´Ë´¦µÄȨֵÐèÒª´æ´¢µ½¸½¼ÓÐÅÏ¢ÖÐ...\n"); + IncInfo = 1; + + // ¼Èë¶¥µã¼¯ + printf("Çë¼Èë %d ¸ö¶¥µã£¬²»Í¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º", vexnum); + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(stdin); + scanf("%c", &((*G).xlist[i].data)); + (*G).xlist[i].firstin = NULL; + (*G).xlist[i].firstout = NULL; + (*G).vexnum++; + } + } else { + ReadData(fp, "%d", &vexnum); // ¼Èë¶¥µãÊý + ReadData(fp, "%d", &arcnum); // ¼Èë±ßÊý + ReadData(fp, "%d", &IncInfo);// ÅжϱßÉÏÊÇ·ñ°üº¬¸½¼ÓÐÅÏ¢ + IncInfo = 1; // Ç¿ÖÆ½«È¨ÖµÂ¼Èëµ½¸½¼ÓÐÅÏ¢ÖÐ + + // ¼Èë¶¥µã¼¯ + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(fp); + ReadData(fp, "%c", &((*G).xlist[i].data)); + (*G).xlist[i].firstin = NULL; + (*G).xlist[i].firstout = NULL; + (*G).vexnum++; + } + } + + // ½öÔÚ¿ØÖÆÌ¨Â¼ÈëÐÅϢʱÊä³ö´ËÌáʾ + if(fp == NULL && arcnum != 0) { + printf("ÇëΪÎÞÏòÍøÒÀ´Î¼Èë %d Ìõ±ß(´øÈ¨Öµ)µÄÐÅÏ¢£¬¶¥µã¼°È¨ÖµÖ®¼äÓÿոñ¸ô¿ª£º\n", arcnum); + } + + // ¼Èë±ßµÄÐÅÏ¢ + for(k = 0; k < arcnum; k++) { + if(fp == NULL) { + printf("µÚ %2d Ìõ±ß¼°ÆäȨֵ£º", k + 1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v2); + } else { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + skipBlank(fp); + ReadData(fp, "%c%c", &v1, &v2); + } + + // Èç¹ûÐèҪ¼Èë±ßµÄÆäËû¸½¼ÓÐÅÏ¢ + if(IncInfo) { + // ×îºó¼È븽¼ÓÐÅÏ¢(´Ë´¦ÐèҪ¼ÈëÍøµÄȨֵ) + Input(*G, &info); + } + + // ²åÈë±ß + InsertArc(G, v1, v2, info); + } + + // ´ÓÎļþÖжÁÈ¡Êý¾Ýʱ£¬×îºóÆäʵӦµ±ÅжÏÒ»ÏÂÊÇ·ñ¶Áµ½ÁË×ã¹»µÄÐÅÏ¢ + return OK; +} + +/* + * ¼È뻡µÄÏà¹Ø¸½¼ÓÐÅÏ¢ + */ +static void Input(OLGraph G, InfoType** info) { + int weight; + + // ÔÚ"Íø"µÄÇéÐÎÏÂÐèҪ¼ÈëȨֵÐÅÏ¢ + if(G.kind == DN || G.kind == UDN) { + *info = (InfoType*) malloc(sizeof(InfoType)); + + if(fp == NULL) { + scanf("%d", &weight); + } else { + ReadData(fp, "%d", &weight); + } + + (*info)->weight = weight; + } +} + +/* + * ²éÕÒ + * + * ·µ»Ø¶¥µãuÔÚͼ/ÍøÖеÄλÖà + */ +int LocateVex(OLGraph G, VertexType u) { + int i; + + for(i = 0; i < G.vexnum; i++) { + if(G.xlist[i].data == u) { + return i; + } + } + + return -1; +} + +/* + * ²åÈë¶¥µã + * + * ½«Ö¸¶¨µÄ¶¥µãv×·¼Óµ½¶¥µã¼¯ÖУ¬Î´½¨Á¢¸Ã¶¥µãÓëÆäËû¶¥µãµÄ¹ØÏµ + */ +Status InsertVex(OLGraph* G, VertexType v) { + int k; + + // ¶¥µãÊý¹ý¶à + if((*G).vexnum == MAX_VERTEX_NUM) { + return ERROR; + } + + // Ê×ÏÈÐèÒªÅжϸö¥µãÊÇ·ñ´æÔÚ + k = LocateVex(*G, v); + if(k >= 0) { + return ERROR; // Ö¸¶¨µÄ¶¥µã´æÔÚʱ£¬ÎÞÐèÖØ¸´Ìí¼Ó + } + + G->xlist[(*G).vexnum].data = v; + G->xlist[(*G).vexnum].firstin = NULL; + G->xlist[(*G).vexnum].firstout = NULL; + + (*G).vexnum++; + + return OK; +} + +/* + * ɾ³ý¶¥µã + * + * ´Ó¶¥µã¼¯ÖÐɾ³ýÖ¸¶¨µÄ¶¥µãv£¬×¢ÒâÐèÒª¸üÐÂÏà¹ØµÄ¶¥µã¹ØÏµ + */ +Status DeleteVex(OLGraph* G, VertexType v) { + int k, i; + ArcBox* pre, * r; + ArcBox* pre2, * r2; + + // Ê×ÏÈÐèÒªÅжϸö¥µãÊÇ·ñ´æÔÚ + k = LocateVex(*G, v); + if(k == -1) { + return ERROR; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + // ÕÒµ½ÒÔ½áµãv³ö·¢µÄÁ´±í£¬ÊͷŸÃÁ´±íÉÏËùÓнáµã + r = G->xlist[k].firstout; + while(r != NULL) { + pre = r; + r = r->tlink; + + // ÔÚ×ÝÏòÁ´±íÉϲéÕÒpreµÄλÖà + pre2 = NULL; + r2 = G->xlist[pre->headvex].firstin; // ÖÁ´Ë£¬r2Ò»¶¨²»ÎªNULL + while(r2 != NULL && r2->tailvex != k) { + pre2 = r2; + r2 = r2->hlink; + } + + // ÖÁ´Ë£¬r2Ò»¶¨Ö¸ÏòÁË´ýɾ³ýµÄ»¡ + if(pre2 == NULL) { + G->xlist[pre->headvex].firstin = r2->hlink; + } else { + pre2->hlink = r2->hlink; + } + + free(pre); + + (*G).arcnum--; + } + + G->xlist[k].firstout = NULL; + + // ±éÀúÆäËüËùÓÐÁ´±í£¬É¾³ýÄÇЩָÏò¶¥µãvµÄ»¡£»¶øÇÒ£¬Ï±곬¹ýkµÄ¶¥µã£¬ÆäϱêÖµÐèÒªµÝ¼õ + for(i = 0; i < G->vexnum; i++) { + pre = NULL; + r = G->xlist[i].firstout; + while(r != NULL && r->headvex < k) { + if(r->tailvex > k) { + r->tailvex -= 1; + } + pre = r; + r = r->tlink; + } + + // Á´±íÉÏËùÓж¥µãµÄϱê¾ùСÓÚk + if(r == NULL) { + continue; + } + + if(r->headvex == k) { + // ´Ó¿ªÍ·É¾µô½áµãv + if(pre == NULL) { + G->xlist[i].firstout = r->tlink; + + // ´ÓÖмäij¸öλÖÃɾµô½áµãv + } else { + pre->tlink = r->tlink; + } + + // ÔÚ×ÝÏòÁ´±íÉϲéÕÒrµÄλÖà + pre2 = NULL; + r2 = G->xlist[k].firstin; // ÖÁ´Ë£¬r2Ò»¶¨²»ÎªNULL + while(r2 != NULL && r2->tailvex != r->tailvex) { + pre2 = r2; + r2 = r2->hlink; + } + + // ÖÁ´Ë£¬r2Ò»¶¨Ö¸ÏòÁË´ýɾ³ýµÄ»¡ + if(pre2 == NULL) { + G->xlist[k].firstin = r2->hlink; + } else { + pre2->hlink = r2->hlink; + } + + free(r); + + // Èç¹ûÕâÊÇÓÐÏòµÄͼ/Íø£¬ÒÀÈ»ÐèÒªµÝ¼õ±ß/»¡µÄÊýÁ¿ + if((*G).kind == DG || (*G).kind == DN) { + (*G).arcnum--; + } + } + + // ÔÙ´ÎÈ·¶¨rµÄλÖà + if(pre == NULL) { + r = G->xlist[i].firstout; + } else { + r = pre->tlink; + } + + // ϱ곬¹ýkµÄ¶¥µã£¬ÐèÒªµÝ¼õÆäϱê + while(r != NULL) { + if(r->tailvex > k) { + r->tailvex -= 1; + } + + if(r->headvex > k) { + r->headvex -= 1; + } + + r = r->tlink; + } + } + + // ¶¥µã¼¯Ç°ÒÆ + for(i = k + 1; i < (*G).vexnum; i++) { + G->xlist[i - 1] = G->xlist[i]; + } + + // ¶¥µãÊýµÝ¼õ + (*G).vexnum--; + + return OK; +} + +/* + * ¹¹ÔìÒ»¸ö±ß/»¡½áµã(½öÏÞÄÚ²¿Ê¹ÓÃ) + */ +static ArcBox* newArcBoxPtr(int tailvex, int headvex, ArcBox* hlink, ArcBox* tlink, InfoType* info) { + ArcBox* p = (ArcBox*) malloc(sizeof(ArcBox)); + if(!p) { + exit(OVERFLOW); + } + + p->tailvex = tailvex; + p->headvex = headvex; + + p->hlink = hlink; + p->tlink = tlink; + + p->info = info; + + return p; +} + +/* + * ²åÈë±ß/»¡ + * + * Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬Ôò²åÈëÒ»Ìõ»¡ÐèÒªÔö¼ÓÁ½¸ö¶¥µã¹ØÏµ£¬µ«»¡µÄÊýÁ¿Ö»ÔöÒ»¡£ + * ¶ÔÓÚͼ/ÍøÀ´Ëµ£¬¿ÉÒÔÔڿɱä²ÎÊýÖÐÁгö±ß/»¡µÄ¸½¼ÓÐÅÏ¢¡£ + * + * ×¢£º´Ë´¦½ÓÊյIJÎÊýÓëMGraphÓÐЩ²»Ò»Ñù£ºÍøµÄ¸½¼ÓÐÅÏ¢Öаüº¬Á˸÷Ìõ±ß/»¡µÄȨֵ¡£ + */ +Status InsertArc(OLGraph* G, VertexType v, VertexType w, ...) { + int tail, head, k, count; + ArcBox* p; + ArcBox* pre; + ArcBox* r; + Boolean overlay = FALSE; // ÊÇ·ñΪ¸²¸ÇÌí¼Ó + InfoType* info = NULL; // ±ß/»¡µÄ¸½¼ÓÐÅÏ¢ + va_list ap; + + tail = LocateVex(*G, v); // »ñÈ¡¶¥µãvÔÚ¶¥µã¼¯ÖеÄλÖà + if(tail == -1) { + return ERROR; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + head = LocateVex(*G, w); // »ñÈ¡¶¥µãwÔÚ¶¥µã¼¯ÖеÄλÖà + if(head == -1) { + return ERROR; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + // ¾Ü¾ø»· + if(tail == head) { + return ERROR; + } + + // Èç¹û±ß/»¡ÉÏ´æÔÚ¸½¼ÓÐÅÏ¢ + if(IncInfo) { + va_start(ap, w); // ÔÚwºó²éѯÊ׸ö¿É±ä²ÎÊý + info = va_arg(ap, InfoType*); // »ñÈ¡¸½¼ÓÐÅÏ¢ + va_end(ap); + } + + /* ½ÓÏÂÀ´£¬ÐèÒª²éÕÒºÏÊʵIJåÈëλÖà */ + + for(count = 0; count < 2; count++) { + + // ÔÚºáÏòÁ´±íÉϲéÕÒºÏÊʵIJåÈëλÖà + pre = NULL; + // Ö¸ÏòÒÔtailΪβµÄÊ×Ìõ±ß/»¡ + r = G->xlist[tail].firstout; + while(r != NULL && r->headvex < head) { + pre = r; + r = r->tlink; + } + + // Óöµ½ÁËÏàͬλÖõĽáµã + if(r != NULL && r->headvex == head) { + r->info = info; // ¸´Óøýáµã + overlay = TRUE; // ·¢ÉúÁ˸²¸Ç + } else { + p = newArcBoxPtr(tail, head, NULL, r, info); + + if(pre == NULL) { + G->xlist[tail].firstout = p; + } else { + pre->tlink = p; + } + } + + // Èç¹ûûÓз¢Éú¸²¸Ç£¬ËµÃ÷²åÈëÁËнáµã£¬´ËʱÐèÒª¿¼ÂÇÆäÔÚ×ÝÏòÁ´±íÉϵÄλÖà + if(overlay == FALSE) { + // ÔÚ×ÝÏòÁ´±íÉϲéÕÒºÏÊʵIJåÈëλÖà + pre = NULL; + // Ö¸ÏòÒÔheadΪͷµÄÊ×Ìõ±ß/»¡ + r = G->xlist[head].firstin; + while(r != NULL && r->tailvex < tail) { + pre = r; + r = r->hlink; + } + + // Óöµ½ÁËÏàͬλÖõĽáµã + if(r != NULL && r->tailvex == tail) { + // ²»»áÖ´Ðе½ÕâÀÒòΪÈç¹û·¢ÉúÁ˸²¸Ç£¬Ç°Ãæ½ø²»À´ + } else { + /* ÖÁ´Ë£¬½áµãpÒѾ­´æÔÚÁË */ + + if(pre == NULL) { + p->hlink = G->xlist[head].firstin; + G->xlist[head].firstin = p; + } else { + p->hlink = pre->hlink; + pre->hlink = p; + } + } + } + + // Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬ÐèÒª¿¼ÂǶԳÆÐÔ + if((G->kind == UDG || G->kind == UDN) && tail != head) { + // µßµ¹iºÍj + k = tail; + tail = head; + head = k; + } else { + break; // Èç¹ûÊÇÓÐÏòµÄ£¬¿ÉÒÔ½áÊøÁË + } + } + + // ÔڷǸ²¸ÇµÄÇéÐÎÏ£¬²Å¿¼ÂǸüбß/»¡µÄÊýÁ¿ + if(!overlay) { + (*G).arcnum++; // ²»ÂÛÓÐÏòÎÞÏò£¬±ß/»¡ÊýÖ»ÔöÒ» + } + + return OK; +} + +/* + * ɾ³ý±ß/»¡ + */ +Status DeleteArc(OLGraph* G, VertexType v, VertexType w) { + int tail, head, k, count; + ArcBox* pre, * r; + ArcBox* pre2, * r2; + + tail = LocateVex(*G, v); + if(tail == -1) { + return ERROR; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + head = LocateVex(*G, w); + if(head == -1) { + return ERROR; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + for(count = 0; count < 2; count++) { + pre = NULL; + // ÔÚºáÏòÁ´±íÖÐÕÒµ½´ýɾ³ýµÄ±ß/»¡ + r = G->xlist[tail].firstout; + while(r != NULL && r->headvex < head) { + pre = r; + r = r->tlink; + } + + // ÕÒµ½ÁË´ýɾ³ýµÄ±ß/»¡ + if(r != NULL && r->headvex == head) { + if(pre == NULL) { + G->xlist[tail].firstout = r->tlink; + } else { + pre->tlink = r->tlink; + } + + // ÔÚ×ÝÏòÁ´±íÉϲéÕÒrµÄλÖà + pre2 = NULL; + r2 = G->xlist[head].firstin; // ÖÁ´Ë£¬r2Ò»¶¨²»ÎªNULL + while(r2 != NULL && r2->tailvex != r->tailvex) { + pre2 = r2; + r2 = r2->hlink; + } + + // ÖÁ´Ë£¬r2Ò»¶¨Ö¸ÏòÁË´ýɾ³ýµÄ»¡ + if(pre2 == NULL) { + G->xlist[head].firstin = r2->hlink; + } else { + pre2->hlink = r2->hlink; + } + + free(r); + } else { + return ERROR; // ûÕÒµ½ + } + + // Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬ÐèÒª¿¼ÂǶԳÆÐÔ + if((G->kind == UDG || G->kind == UDN) && tail != head) { + // µßµ¹tailºÍhead + k = tail; + tail = head; + head = k; + } else { + break; // Èç¹ûÊÇÓÐÏòµÄ£¬¿ÉÒÔ½áÊøÁË + } + } + + (*G).arcnum--; // ²»ÂÛÓÐÏòÎÞÏò£¬±ß/»¡ÊýÖ»¼õÒ» + + return OK; +} + +/* + * ÒÔͼÐλ¯ÐÎʽÊä³öµ±Ç°½á¹¹ + */ +void PrintGraph(OLGraph G) { + int i, head; + ArcBox* p; + + if(G.vexnum == 0) { + printf("¿Õͼ£¬ÎÞÐè´òÓ¡£¡\n"); + return; + } + + printf("µ±Ç°Í¼/Íø°üº¬ %2d ¸ö¶¥µã£¬ %2d Ìõ±ß/»¡...\n", G.vexnum, G.arcnum); + + for(i = 0; i < G.vexnum; i++) { + printf("%c ===> ", G.xlist[i].data); + + head = 0; + p = G.xlist[i].firstout; + + while(p != NULL) { + if(head < p->headvex) { + if(IncInfo == 0) { + printf(" "); + + // ¶ÔÓÚÍø£¬»á´ÓÆä¸½¼ÓÐÅÏ¢ÖлñÈ¡µ½È¨Öµ + } else { + printf(" "); + } + } else { + if(IncInfo == 0) { + printf("<%c, %c>", G.xlist[p->tailvex].data, G.xlist[p->headvex].data); + + // ¶ÔÓÚÍø£¬»á´ÓÆä¸½¼ÓÐÅÏ¢ÖлñÈ¡µ½È¨Öµ + } else { + printf("<%c, %c, %2d>", G.xlist[p->tailvex].data, G.xlist[p->headvex].data, p->info->weight); + } + + p = p->tlink; + } + + head++; + + if(p != NULL) { + printf(" "); + } + } + + printf("\n"); + } +} diff --git a/Dev-C++/ExerciseBook/07.17/OLGraph.h b/Dev-C++/ExerciseBook/07.17/OLGraph.h new file mode 100644 index 0000000..dc80aba --- /dev/null +++ b/Dev-C++/ExerciseBook/07.17/OLGraph.h @@ -0,0 +1,178 @@ +/*==================== + * ͼµÄÊ®×ÖÁ´±í´æ´¢±íʾ + * + * °üº¬Ëã·¨: 7.3 + ====================*/ + +#ifndef OLGRAPH_H +#define OLGRAPH_H + +#include +#include // Ìṩmemset¡¢strcmp Ô­ÐÍ +#include // Ìṩºêva_list¡¢va_start¡¢va_arg¡¢va_end +#include // Ìṩmalloc¡¢realloc¡¢free¡¢exitÔ­ÐÍ +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// + +/* + * ×¢£º + * + * ͨ³£À´½²£¬ÎÞȨͼ±»¼ò³ÆÎª¡¾Í¼¡¿£¬ÓÐȨͼ±»¼ò³ÆÎª¡¾Íø¡¿¡£ + * ÎÞÏòͼ/ÍøÖеĶ¥µã¹ØÏµ±»³ÆÎª¡¾±ß¡¿£¬ÓÐÏòͼ/ÍøÖеĶ¥µã¹ØÏµ±»³ÆÎª¡¾»¡¡¿£¬²¢Çø·Ö»¡Í·Ó뻡β¡£ + * ʵ¼Ê±íÊöÖУ¬Î´±Ø»áÑϸñ×ñÊØÒÔÉÏÃüÃû¡£ + * + * µ±Ç°½á¹¹Êʺϴ洢ÓÐÏòͼ¡£ + * + * ¡ï ²åÈë±ß/»¡µÄÐÅϢʱ£¬ÕâÀïµÄʵÏÖÊǰ´"ÉýÐò"²åÈëµÄ£¬ÕâʹµÃ²åÈëµÄ»¡Êǰ´"ÉýÐò"ÅÅÁеġ£ + */ + + +/* ºê¶¨Òå */ +#define MAX_VERTEX_NUM 26 // ×î´ó¶¥µã¸öÊý + + +// ͼµÄÀàÐÍ +typedef enum { + DG, // 0-ÓÐÏòͼ + DN, // 1-ÓÐÏòÍø(´øÈ¨Öµ) + UDG, // 2-ÎÞÏòͼ + UDN // 3-ÎÞÏòÍø(´øÈ¨Öµ) +} GraphKind; + +// ¶¥µãÀàÐÍ +typedef char VertexType; + +// ±ß/»¡µÄÏà¹Ø¸½¼ÓÐÅÏ¢ +typedef struct { + /* + * ×¢£º + * ½Ì²ÄÖиø³öµÄ½á¹¹Ö»¿¼ÂÇÁËÎÞȨͼ£¬¶øÃ»¿¼ÂÇÓÐȨͼ(Íø)¡£ + * ÕâÀïΪÁ˰ѡ°Íø¡±µÄÇéÐÎÒ²¿¼ÂǽøÈ¥£¬ÌØÔÚ¸½¼ÓÐÅÏ¢ÖÐÔö¼ÓÁË"È¨ÖØ"ÊôÐÔ¡£ + */ + int weight; +} InfoType; + +/* ±ß/»¡½áµã */ +typedef struct ArcBox { + int tailvex; // »¡Í·¶¥µãλÖà + int headvex; // »¡Î²¶¥µãλÖà + struct ArcBox* hlink; // Ö¸ÏòÏÂÒ»¸öÓµÓÐÏàͬ»¡Í·µÄ»¡ + struct ArcBox* tlink; // Ö¸ÏòÏÂÒ»¸öÓµÓÐÏàͬ»¡Î²µÄ»¡ + InfoType* info; // ¸Ã»¡µÄÏà¹Ø¸½¼ÓÐÅÏ¢ +} ArcBox; + +// ÿ¸öºáÏòÁ´±íµÄÍ·½áµã +typedef struct VexNode { + VertexType data; // ¶¥µã + ArcBox* firstin; // Ö¸Ïò¸Ã¶¥µãµÄµÚÒ»ÌõÈ뻡 + ArcBox* firstout; // Ö¸Ïò¸Ã¶¥µãµÄµÚÒ»Ìõ³ö»¡ +} VexNode; + +/* ͼµÄÊ®×ÖÁ´±í´æ´¢±íʾÀàÐͶ¨Òå */ +typedef struct { + VexNode xlist[MAX_VERTEX_NUM]; // ±íÍ·ÏòÁ¿ + int vexnum, arcnum; // ¶¥µãÊýºÍ»¡Êý + GraphKind kind; // ͼµÄÀàÐͱêÖ¾ +} OLGraph; + + +// ±ß/»¡ÉÏÊÇ·ñ´æÔÚ¸½¼ÓÐÅÏ¢ +extern Boolean IncInfo; + + +/* + * ´´½¨ + * + *¡¾±¸×¢¡¿ + * + * ½Ì²ÄÖÐĬÈÏ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý¡£ + * ÕâÀïΪÁË·½±ã²âÊÔ£¬±ÜÃâÿ´ÎÔËÐж¼ÊÖ¶¯ÊäÈëÊý¾Ý£¬ + * Òò¶øÔÊÐíÑ¡Ôñ´ÓÔ¤ÉèµÄÎļþpathÖжÁÈ¡²âÊÔÊý¾Ý¡£ + * + * Èç¹ûÐèÒª´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý£¬ÔòpathΪNULL£¬»òpath[kind]Ϊ""¡£ + * Èç¹ûÐèÒª´ÓÎļþÖжÁÈ¡Êý¾Ý£¬ÔòÐèÒªÔÚpathÖÐÌîдÎļþÃûÐÅÏ¢¡£ + */ +Status CreateGraph(OLGraph* G, char* path[]); + +/* + * ¨€¨€¨€¨€¨€¨€¨€¨€ Ëã·¨7.3 ¨€¨€¨€¨€¨€¨€¨€¨€ + * + * ¹¹ÔìÓÐÏòͼ + * + * ×¢£º + * ½Ì²ÄÖÐʹÓÃÁËÍ·²å·¨À´²åÈ뻡£¬ÕâÖÖ×ö·¨µÄΨһÓŵãÊDzåÈë·½±ã£¬ + * µ«ÊÇÔÚÉæ¼°µ½É¾³ý»ò²éÕÒʱ£¬Ð§Âʽϵͣ» + * ¶øÇÒ£¬"Í·²å·¨"ÒÀÀµÊäÈëµÄ˳Ðò£¬Èç¹ûÊäÈëµÄ±ß/»¡ÊÇÂÒÐòµÄ£¬ + * Ôò×îÖÕ¹¹Ôì³öµÄͼ/ÍøÖеıß/»¡Ò²ÊÇÎÞÐòµÄ¡£ + * + * ΪÁ˿˷þÒÔÉÏȱµã£¬ÕâÀï¸ÄÓÃ"ÉýÐò"²åÈë·¨£¬±£Ö¤²åÈëµÄ»¡ÊÇ"ÉýÐò"µÄ¡£ + * µ«Í¬Ê±£¬ÕâÑù×ö»áʹ"²åÈë"Ëã·¨±äµÃ½ÏΪ¸´ÔÓ¡£ + */ +static Status CreateDG(OLGraph* G); + +/* + * ¹¹ÔìÓÐÏòÍø + */ +static Status CreateDN(OLGraph* G); + +/* + * ¹¹ÔìÎÞÏòͼ + */ +static Status CreateUDG(OLGraph* G); + +/* + * ¹¹ÔìÎÞÏòÍø + */ +static Status CreateUDN(OLGraph* G); + +/* + * ¼È뻡µÄÏà¹Ø¸½¼ÓÐÅÏ¢ + */ +static void Input(OLGraph G, InfoType** info); + +/* + * ²éÕÒ + * + * ·µ»Ø¶¥µãuÔÚͼ/ÍøÖеÄλÖà + */ +int LocateVex(OLGraph G, VertexType u); + +/* + * ²åÈë¶¥µã + * + * ½«Ö¸¶¨µÄ¶¥µãv×·¼Óµ½¶¥µã¼¯ÖУ¬Î´½¨Á¢¸Ã¶¥µãÓëÆäËû¶¥µãµÄ¹ØÏµ + */ +Status InsertVex(OLGraph* G, VertexType v); + +/* + * ɾ³ý¶¥µã + * + * ´Ó¶¥µã¼¯ÖÐɾ³ýÖ¸¶¨µÄ¶¥µãv£¬×¢ÒâÐèÒª¸üÐÂÏà¹ØµÄ¶¥µã¹ØÏµ + */ +Status DeleteVex(OLGraph* G, VertexType v); + +/* + * ¹¹ÔìÒ»¸ö±ß/»¡½áµã(½öÏÞÄÚ²¿Ê¹ÓÃ) + */ +static ArcBox* newArcBoxPtr(int tailvex, int headvex, ArcBox* hlink, ArcBox* tlink, InfoType* info); + +/* + * ²åÈë±ß/»¡ + * + * Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬Ôò²åÈëÒ»Ìõ»¡ÐèÒªÔö¼ÓÁ½¸ö¶¥µã¹ØÏµ£¬µ«»¡µÄÊýÁ¿Ö»ÔöÒ»¡£ + * ¶ÔÓÚͼ/ÍøÀ´Ëµ£¬¿ÉÒÔÔڿɱä²ÎÊýÖÐÁгö±ß/»¡µÄ¸½¼ÓÐÅÏ¢¡£ + * + * ×¢£º´Ë´¦½ÓÊյIJÎÊýÓëMGraphÓÐЩ²»Ò»Ñù£ºÍøµÄ¸½¼ÓÐÅÏ¢Öаüº¬Á˸÷Ìõ±ß/»¡µÄȨֵ¡£ + */ +Status InsertArc(OLGraph* G, VertexType v, VertexType w, ...); + +/* + * ɾ³ý±ß/»¡ + */ +Status DeleteArc(OLGraph* G, VertexType v, VertexType w); + +/* + * ÒÔͼÐλ¯ÐÎʽÊä³öµ±Ç°½á¹¹ + */ +void PrintGraph(OLGraph G); + +#endif diff --git a/Dev-C++/ExerciseBook/07.17/TestData_DG.txt b/Dev-C++/ExerciseBook/07.17/TestData_DG.txt new file mode 100644 index 0000000..ae011ea --- /dev/null +++ b/Dev-C++/ExerciseBook/07.17/TestData_DG.txt @@ -0,0 +1,6 @@ +ͼÀàÐÍ¡ú0£¨ÓÐÏòͼ£© +¶¥µãÊý¡ú6 +»¡Êý¡ú14 +»¡ÊÇ·ñ´øÓÐÆäËûÐÅÏ¢¡ú0 +¶¥µã¼¯¡ú¡¾A£¬X£¬B£¬C£¬D£¬E¡¿ +»¡µÄ¼¯ºÏ¡ú¡¾A£¬B¡¿¡¾A£¬C¡¿¡¾A£¬D¡¿¡¾B£¬C¡¿¡¾B£¬D¡¿¡¾B£¬E¡¿¡¾C£¬B¡¿¡¾C£¬E¡¿¡¾C£¬X¡¿¡¾E£¬A¡¿¡¾E£¬D¡¿¡¾E£¬X¡¿¡¾X£¬A¡¿¡¾X£¬D¡¿ \ No newline at end of file diff --git a/Dev-C++/ExerciseBook/07.17/TestData_DN.txt b/Dev-C++/ExerciseBook/07.17/TestData_DN.txt new file mode 100644 index 0000000..c41b879 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.17/TestData_DN.txt @@ -0,0 +1,6 @@ +ͼÀàÐÍ¡ú1£¨ÓÐÏòÍø£© +¶¥µãÊý¡ú6 +»¡Êý¡ú14 +»¡ÊÇ·ñ´øÓÐÆäËûÐÅÏ¢¡ú1 +¶¥µã¼¯¡ú¡¾A£¬X£¬B£¬C£¬D£¬E¡¿ +»¡µÄ¼¯ºÏ¡ú¡¾A£¬B£¬3¡¿¡¾A£¬C£¬8¡¿¡¾A£¬D£¬11¡¿¡¾B£¬C£¬7¡¿¡¾B£¬D£¬4¡¿¡¾B£¬E£¬1¡¿¡¾C£¬B£¬5¡¿¡¾C£¬E£¬17¡¿¡¾C£¬X£¬3¡¿¡¾E£¬A£¬6¡¿¡¾E£¬D£¬4¡¿¡¾E£¬X£¬2¡¿¡¾X£¬A£¬8¡¿¡¾X£¬D£¬10¡¿ \ No newline at end of file diff --git a/Dev-C++/ExerciseBook/07.17/TestData_UDG.txt b/Dev-C++/ExerciseBook/07.17/TestData_UDG.txt new file mode 100644 index 0000000..6c08d74 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.17/TestData_UDG.txt @@ -0,0 +1,6 @@ +ͼÀàÐÍ¡ú2£¨ÎÞÏòͼ£© +¶¥µãÊý¡ú6 +±ßÊý¡ú13 +±ßÊÇ·ñ´øÓÐÆäËûÐÅÏ¢¡ú0 +¶¥µã¼¯¡ú¡¾A£¬X£¬B£¬C£¬D£¬E¡¿ +±ßµÄ¼¯ºÏ¡ú¡¾A£¬B¡¿¡¾A£¬C¡¿¡¾A£¬D¡¿¡¾B£¬C¡¿¡¾B£¬D¡¿¡¾B£¬E¡¿¡¾C£¬E¡¿¡¾C£¬X¡¿¡¾E£¬A¡¿¡¾E£¬D¡¿¡¾E£¬X¡¿¡¾X£¬A¡¿¡¾X£¬D¡¿ \ No newline at end of file diff --git a/Dev-C++/ExerciseBook/07.17/TestData_UDN.txt b/Dev-C++/ExerciseBook/07.17/TestData_UDN.txt new file mode 100644 index 0000000..2117df2 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.17/TestData_UDN.txt @@ -0,0 +1,6 @@ +ͼÀàÐÍ¡ú3£¨ÎÞÏòÍø£© +¶¥µãÊý¡ú6 +±ßÊý¡ú13 +±ßÊÇ·ñ´øÓÐÆäËûÐÅÏ¢¡ú1 +¶¥µã¼¯¡ú¡¾A£¬X£¬B£¬C£¬D£¬E¡¿ +±ßµÄ¼¯ºÏ¡ú¡¾A£¬B£¬3¡¿¡¾A£¬C£¬8¡¿¡¾A£¬D£¬11¡¿¡¾B£¬C£¬7¡¿¡¾B£¬D£¬4¡¿¡¾B£¬E£¬1¡¿¡¾C£¬E£¬17¡¿¡¾C£¬X£¬3¡¿¡¾E£¬A£¬6¡¿¡¾E£¬D£¬4¡¿¡¾E£¬X£¬2¡¿¡¾X£¬A£¬8¡¿¡¾X£¬D£¬10¡¿ \ No newline at end of file diff --git a/Dev-C++/ExerciseBook/07.18-07.19/07.18-07.19.cpp b/Dev-C++/ExerciseBook/07.18-07.19/07.18-07.19.cpp new file mode 100644 index 0000000..fb299e2 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.18-07.19/07.18-07.19.cpp @@ -0,0 +1,181 @@ +#include +#include // Ìṩºêva_list¡¢va_start¡¢va_arg¡¢va_end +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// +#include "AMLGraph.h" //**¡ø07 ͼ**// + +/* + * ´´½¨Í¼/±í + */ +Status CreateGraph_7_19(AMLGraph* G, char* path[]); + +/* + * ²åÈë¶¥µã + * + * ½«Ö¸¶¨µÄ¶¥µãv×·¼Óµ½¶¥µã¼¯ÖУ¬Î´½¨Á¢¸Ã¶¥µãÓëÆäËû¶¥µãµÄ¹ØÏµ + */ +Status InsertVex_7_18(AMLGraph* G, VertexType v); + +/* + * ɾ³ý¶¥µã + * + * ´Ó¶¥µã¼¯ÖÐɾ³ýÖ¸¶¨µÄ¶¥µãv£¬×¢ÒâÐèÒª¸üÐÂÏà¹ØµÄ¶¥µã¹ØÏµ + */ +Status DeleteVex_7_18(AMLGraph* G, VertexType v); + +/* + * ²åÈë±ß/»¡ + * + * Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬Ôò²åÈëÒ»Ìõ»¡ÐèÒªÔö¼ÓÁ½¸ö¶¥µã¹ØÏµ£¬µ«»¡µÄÊýÁ¿Ö»ÔöÒ»¡£ + * + * ¶ÔÓÚͼÀ´Ëµ£¬¿ÉÒÔÔڿɱä²ÎÊýÖÐÁгö±ß/»¡µÄ¸½¼ÓÐÅÏ¢£» + * ¶ÔÓÚÍøÀ´Ëµ£¬¿ÉÒÔÔڿɱä²ÎÊýÖÐÒÀ´ÎÁгö±ß/»¡µÄȨֵÒÔ¼°¸½¼ÓÐÅÏ¢¡£ + */ +Status InsertArc_7_18(AMLGraph* G, VertexType v, VertexType w, ...); + +/* + * ɾ³ý±ß/»¡ + * + * ´Ëɾ³ýÖ»ÊǸüбß/»¡µÄÁ¬Í¨¹ØÏµ + */ +Status DeleteArc_7_18(AMLGraph* G, VertexType v, VertexType w); + + +int main(int argc, char* argv[]) { + AMLGraph G; + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ´´½¨²¢Êä³öͼ/Íø...\n"); + { + char* path[4]; + + path[0] = ""; + path[1] = ""; + path[2] = "TestData_UDG.txt"; + path[3] = "TestData_UDN.txt"; + + CreateGraph_7_19(&G, path); + PrintGraph(G); + printf("\n"); + } + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ɾ³ý¶¥µã...\n"); + { + VertexType v = 'X'; + + printf("ɾ³ý¶¥µã '%c' ºóµÄͼΪ£º\n", v); + DeleteVex_7_18(&G, v); + PrintGraph(G); + printf("\n"); + } + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ²åÈë¶¥µã...\n"); + { + VertexType v = 'Y'; + + printf("²åÈë¶¥µã '%c' ºóµÄͼΪ£º\n", v); + InsertVex_7_18(&G, v); + PrintGraph(G); + printf("\n"); + } + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ²åÈë±ß/»¡...\n"); + { + // ×¢£ºÊÇÖØ¸´µÄ±ß + VertexType v[10] = {'B', 'C', 'E', 'Y', 'Y', 'Y', 'D', 'D', 'E', 'E'}; + VertexType w[10] = {'Y', 'Y', 'Y', 'A', 'B', 'D', 'C', 'A', 'B', 'D'}; + InfoType info[10] = {{8}, {5}, {1}, {11}, {2}, {6}, {3}, {7}, {2}, {9}}; + int k; + + // ͼ + if(G.kind == DG || G.kind == UDG) { + for(k = 0; k < 10; k++) { + printf("²åÈëÎÞȨֵµÄ±ß£º<%c, %c>...\n", v[k], w[k]); + InsertArc_7_18(&G, v[k], w[k]); + } + + // Íø + } else if(G.kind == DN || G.kind == UDN) { + for(k = 0; k < 10; k++) { + printf("²åÈë´øÈ¨ÖµµÄ±ß£º<%c, %c, %d>...\n", v[k], w[k], info[k].weight); + InsertArc_7_18(&G, v[k], w[k], &info[k]); + } + } else { + return ERROR; + } + + PrintGraph(G); + printf("\n"); + } + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ɾ³ý±ß/»¡...\n"); + { + VertexType v[3] = {'D', 'E', 'F'}; + VertexType w[3] = {'A', 'B', 'B'}; + int k; + + for(k = 0; k < 3; k++) { + printf("ɾ³ý±ß£º<%c, %c>...\n", v[k], w[k]); + DeleteArc_7_18(&G, v[k], w[k]); + } + PrintGraph(G); + printf("\n"); + } + + return 0; +} + + +/* + * ´´½¨Í¼/±í + */ +Status CreateGraph_7_19(AMLGraph* G, char* path[]) { + return CreateGraph(G, path); +} + +/* + * ²åÈë¶¥µã + * + * ½«Ö¸¶¨µÄ¶¥µãv×·¼Óµ½¶¥µã¼¯ÖУ¬Î´½¨Á¢¸Ã¶¥µãÓëÆäËû¶¥µãµÄ¹ØÏµ + */ +Status InsertVex_7_18(AMLGraph* G, VertexType v) { + return InsertVex(G, v); +} + +/* + * ɾ³ý¶¥µã + * + * ´Ó¶¥µã¼¯ÖÐɾ³ýÖ¸¶¨µÄ¶¥µãv£¬×¢ÒâÐèÒª¸üÐÂÏà¹ØµÄ¶¥µã¹ØÏµ + */ +Status DeleteVex_7_18(AMLGraph* G, VertexType v) { + return DeleteVex(G, v); +} + +/* + * ²åÈë±ß/»¡ + * + * Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬Ôò²åÈëÒ»Ìõ»¡ÐèÒªÔö¼ÓÁ½¸ö¶¥µã¹ØÏµ£¬µ«»¡µÄÊýÁ¿Ö»ÔöÒ»¡£ + * + * ¶ÔÓÚͼÀ´Ëµ£¬¿ÉÒÔÔڿɱä²ÎÊýÖÐÁгö±ß/»¡µÄ¸½¼ÓÐÅÏ¢£» + * ¶ÔÓÚÍøÀ´Ëµ£¬¿ÉÒÔÔڿɱä²ÎÊýÖÐÒÀ´ÎÁгö±ß/»¡µÄȨֵÒÔ¼°¸½¼ÓÐÅÏ¢¡£ + */ +Status InsertArc_7_18(AMLGraph* G, VertexType v, VertexType w, ...) { + va_list ap; + InfoType* info = NULL; // ±ß/»¡µÄ¸½¼ÓÐÅÏ¢ + + // Èç¹û±ß/»¡ÉÏ´æÔÚ¸½¼ÓÐÅÏ¢ + if(IncInfo) { + va_start(ap, w); // ÔÚwºó²éѯÊ׸ö¿É±ä²ÎÊý + info = va_arg(ap, InfoType*); // »ñÈ¡¸½¼ÓÐÅÏ¢ + va_end(ap); + } + + return InsertArc(G, v, w, info); +} + +/* + * ɾ³ý±ß/»¡ + * + * ´Ëɾ³ýÖ»ÊǸüбß/»¡µÄÁ¬Í¨¹ØÏµ + */ +Status DeleteArc_7_18(AMLGraph* G, VertexType v, VertexType w) { + return DeleteArc(G, v, w); +} diff --git a/Dev-C++/ExerciseBook/07.18-07.19/07.18-07.19.dev b/Dev-C++/ExerciseBook/07.18-07.19/07.18-07.19.dev new file mode 100644 index 0000000..aa541ed --- /dev/null +++ b/Dev-C++/ExerciseBook/07.18-07.19/07.18-07.19.dev @@ -0,0 +1,100 @@ +[Project] +FileName=07.18-07.19.dev +Name=07.18-07.19 +Type=1 +Ver=2 +ObjFiles= +Includes= +Libs= +PrivateResource= +ResourceIncludes= +MakeIncludes= +Compiler= +CppCompiler= +Linker= +IsCpp=0 +Icon= +ExeOutput= +ObjectOutput= +LogOutput= +LogOutputEnabled=0 +OverrideOutput=0 +OverrideOutputName= +HostApplication= +UseCustomMakefile=0 +CustomMakefile= +CommandLine= +Folders= +IncludeVersionInfo=0 +SupportXPThemes=0 +CompilerSet=1 +CompilerSettings=0000000000000000001000000 +UnitCount=5 + +[VersionInfo] +Major=1 +Minor=0 +Release=0 +Build=0 +LanguageID=1033 +CharsetID=1252 +CompanyName= +FileVersion= +FileDescription=Developed using the Dev-C++ IDE +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion= +AutoIncBuildNr=0 +SyncProduct=1 + +[Unit1] +FileName=07.18-07.19.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit2] +FileName=AMLGraph.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit3] +FileName=AMLGraph.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit4] +FileName=TestData_UDG.txt +Folder= +Compile=0 +Link=0 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit5] +FileName=TestData_UDN.txt +Folder= +Compile=0 +Link=0 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + diff --git a/Dev-C++/ExerciseBook/07.18-07.19/AMLGraph.cpp b/Dev-C++/ExerciseBook/07.18-07.19/AMLGraph.cpp new file mode 100644 index 0000000..013d271 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.18-07.19/AMLGraph.cpp @@ -0,0 +1,715 @@ +/*===================== + * ͼµÄÁÚ½Ó¶àÖØ±í´æ´¢±íʾ + ======================*/ + +#include "AMLGraph.h" + +// ¼ÈëÊý¾ÝµÄÔ´Îļþ£»fpΪnullʱ£¬ËµÃ÷ÐèÒª´Ó¿ØÖÆÌ¨Â¼Èë +static FILE* fp = NULL; + +/* + * IncInfoָʾ¸ÃͼµÄ±ßÉÏÊÇ·ñ´æÔÚ¸½¼ÓÐÅÏ¢¡£ + * Èç¹ûÆäÖµ²»Îª0£¬Ôò±íʾÎÞ¸½¼ÓÐÅÏ¢£¬·ñÔò£¬±íʾ´æÔÚ¸½¼ÓÐÅÏ¢¡£ + */ +Boolean IncInfo = FALSE; + +// ·ÃÎʱêÖ¾Êý×飬¼Ç¼·ÃÎʹýµÄ¶¥µã +static Boolean visited[MAX_VERTEX_NUM]; + +// º¯Êý±äÁ¿ +static Status (* VisitFunc)(VertexType e); + + +/* + * ´´½¨ + * + *¡¾±¸×¢¡¿ + * + * ½Ì²ÄÖÐĬÈÏ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý¡£ + * ÕâÀïΪÁË·½±ã²âÊÔ£¬±ÜÃâÿ´ÎÔËÐж¼ÊÖ¶¯ÊäÈëÊý¾Ý£¬ + * Òò¶øÔÊÐíÑ¡Ôñ´ÓÔ¤ÉèµÄÎļþpathÖжÁÈ¡²âÊÔÊý¾Ý¡£ + * + * Èç¹ûÐèÒª´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý£¬ÔòpathΪNULL£¬»òpath[kind]Ϊ""¡£ + * Èç¹ûÐèÒª´ÓÎļþÖжÁÈ¡Êý¾Ý£¬ÔòÐèÒªÔÚpathÖÐÌîдÎļþÃûÐÅÏ¢¡£ + */ +Status CreateGraph(AMLGraph* G, char* path[]) { + int readFromConsole; // ÊÇ·ñ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý + int kind; + Status flag; + + printf("ÇëÊäÈëͼµÄÀàÐÍ(2-ÎÞÏòͼ ©¦ 3-ÎÞÏòÍø)£º"); + scanf("%d", &kind); + + // ÀàÐͲ»ºÏ¹æ(Ö»½ÓÊÜÎÞÏòµÄͼ/Íø) + if(kind < 2 || kind > 3) { + return ERROR; + } + + // Èç¹ûûÓÐÎļþ·¾¶ÐÅÏ¢£¬Ôò´Ó¿ØÖÆÌ¨¶ÁÈ¡ÊäÈë + readFromConsole = (path == NULL) || strcmp(path[kind], "") == 0; + + // ÐèÒª´ÓÎļþ¶ÁÈ¡ + if(readFromConsole) { + (*G).kind = GraphKind(kind); // ¼Ç¼ͼ/ÍøµÄÀàÐÍ + } else { + // ´ò¿ªÎļþ£¬×¼±¸¶ÁÈ¡²âÊÔÊý¾Ý + fp = fopen(path[kind], "r"); + if(fp == NULL) { + return ERROR; + } + + // ¼ÈëͼµÄÀàÐÍ + ReadData(fp, "%d", &((*G).kind)); + } + + // Ëæ»ú´´½¨ÎÞÏòͼ»òÎÞÏòÍøµÄÒ»ÖÖ + switch((*G).kind) { + case UDG: + flag = CreateUDG(G); + break; + case UDN: + flag = CreateUDN(G); + break; + default: + flag = ERROR; + break; + } + + if(fp != NULL) { + fclose(fp); + fp = NULL; + } + + return flag; +} + +/* + * ¹¹ÔìÎÞÏòͼ + */ +static Status CreateUDG(AMLGraph* G) { + int i, k; + int vexnum, arcnum; + VertexType v1, v2; + InfoType* info = NULL; + + (*G).vexnum = (*G).edgenum = 0; + + if(fp == NULL) { + printf("ÇëÊäÈëÎÞÏòͼµÄ¶¥µãÊý£º"); + scanf("%d", &vexnum); + printf("ÇëÊäÈëÎÞÏòͼµÄ±ßÊý£º"); + scanf("%d", &arcnum); + printf("¸ÃÎÞÏòͼµÄ±ßÉÏÊÇ·ñ°üº¬ÆäËû¸½¼ÓÐÅÏ¢(0-²»°üº¬©¦1-°üº¬)£º"); + scanf("%d", &IncInfo); + + // ¼Èë¶¥µã¼¯ + printf("Çë¼Èë %d ¸ö¶¥µã£¬²»Í¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º", vexnum); + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(stdin); + scanf("%c", &((*G).adjmulist[i].data)); + (*G).adjmulist[i].firstedge = NULL; + (*G).vexnum++; + } + } else { + ReadData(fp, "%d", &vexnum); // ¼Èë¶¥µãÊý + ReadData(fp, "%d", &arcnum); // ¼Èë±ßÊý + ReadData(fp, "%d", &IncInfo);// ÅжϱßÉÏÊÇ·ñ°üº¬¸½¼ÓÐÅÏ¢ + + // ¼Èë¶¥µã¼¯ + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(fp); + ReadData(fp, "%c", &((*G).adjmulist[i].data)); + (*G).adjmulist[i].firstedge = NULL; + (*G).vexnum++; + } + } + + // ½öÔÚ¿ØÖÆÌ¨Â¼ÈëÐÅϢʱÊä³ö´ËÌáʾ + if(fp == NULL && arcnum != 0) { + printf("ÇëΪÎÞÏòͼÒÀ´Î¼Èë %d Ìõ±ßµÄÐÅÏ¢£¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º\n", arcnum); + } + + // ¼Èë±ßµÄÐÅÏ¢ + for(k = 0; k < arcnum; k++) { + if(fp == NULL) { + printf("µÚ %2d Ìõ±ß£º", k + 1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v2); + } else { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + skipBlank(fp); + ReadData(fp, "%c%c", &v1, &v2); + } + + // Èç¹ûÐèҪ¼Èë±ßµÄÆäËû¸½¼ÓÐÅÏ¢ + if(IncInfo) { + // ×îºó¼È븽¼ÓÐÅÏ¢ + Input(*G, &info); + } + + // ²åÈë±ß + InsertArc(G, v1, v2, info); + } + + // ´ÓÎļþÖжÁÈ¡Êý¾Ýʱ£¬×îºóÆäʵӦµ±ÅжÏÒ»ÏÂÊÇ·ñ¶Áµ½ÁË×ã¹»µÄÐÅÏ¢ + return OK; +} + +/* + * ¹¹ÔìÎÞÏòÍø + */ +static Status CreateUDN(AMLGraph* G) { + int i, k; + int vexnum, arcnum; + VertexType v1, v2; + InfoType* info = NULL; + + (*G).vexnum = (*G).edgenum = 0; + + if(fp == NULL) { + printf("ÇëÊäÈëÎÞÏòÍøµÄ¶¥µãÊý£º"); + scanf("%d", &vexnum); + printf("ÇëÊäÈëÎÞÏòÍøµÄ±ßÊý£º"); + scanf("%d", &arcnum); + printf("¸ÃÎÞÏòÍøµÄ±ßÉϱØÐë°üº¬ÆäËû¸½¼ÓÐÅÏ¢£¬ÒòΪ´Ë´¦µÄȨֵÐèÒª´æ´¢µ½¸½¼ÓÐÅÏ¢ÖÐ...\n"); + IncInfo = 1; + + // ¼Èë¶¥µã¼¯ + printf("Çë¼Èë %d ¸ö¶¥µã£¬²»Í¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º", vexnum); + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(stdin); + scanf("%c", &((*G).adjmulist[i].data)); + (*G).adjmulist[i].firstedge = NULL; + (*G).vexnum++; + } + } else { + ReadData(fp, "%d", &vexnum); // ¼Èë¶¥µãÊý + ReadData(fp, "%d", &arcnum); // ¼Èë±ßÊý + ReadData(fp, "%d", &IncInfo);// ÅжϱßÉÏÊÇ·ñ°üº¬¸½¼ÓÐÅÏ¢ + IncInfo = 1; // Ç¿ÖÆ½«È¨ÖµÂ¼Èëµ½¸½¼ÓÐÅÏ¢ÖÐ + + // ¼Èë¶¥µã¼¯ + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(fp); + ReadData(fp, "%c", &((*G).adjmulist[i].data)); + (*G).adjmulist[i].firstedge = NULL; + (*G).vexnum++; + } + } + + // ½öÔÚ¿ØÖÆÌ¨Â¼ÈëÐÅϢʱÊä³ö´ËÌáʾ + if(fp == NULL && arcnum != 0) { + printf("ÇëΪÎÞÏòÍøÒÀ´Î¼Èë %d Ìõ±ß(´øÈ¨Öµ)µÄÐÅÏ¢£¬¶¥µã¼°È¨ÖµÖ®¼äÓÿոñ¸ô¿ª£º\n", arcnum); + } + + // ¼Èë±ßµÄÐÅÏ¢ + for(k = 0; k < arcnum; k++) { + if(fp == NULL) { + printf("µÚ %2d Ìõ±ß¼°ÆäȨֵ£º", k + 1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v2); + } else { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + skipBlank(fp); + ReadData(fp, "%c%c", &v1, &v2); + } + + // Èç¹ûÐèҪ¼Èë±ßµÄÆäËû¸½¼ÓÐÅÏ¢ + if(IncInfo) { + // ×îºó¼È븽¼ÓÐÅÏ¢(´Ë´¦ÐèҪ¼ÈëÍøµÄȨֵ) + Input(*G, &info); + } + + // ²åÈë±ß + InsertArc(G, v1, v2, info); + } + + // ´ÓÎļþÖжÁÈ¡Êý¾Ýʱ£¬×îºóÆäʵӦµ±ÅжÏÒ»ÏÂÊÇ·ñ¶Áµ½ÁË×ã¹»µÄÐÅÏ¢ + return OK; +} + +/* + * ¼Èë±ßµÄÏà¹Ø¸½¼ÓÐÅÏ¢ + */ +static void Input(AMLGraph G, InfoType** info) { + int weight; + + // ÔÚ"Íø"µÄÇéÐÎÏÂÐèҪ¼ÈëȨֵÐÅÏ¢ + if(G.kind == UDN) { + *info = (InfoType*) malloc(sizeof(InfoType)); + + if(fp == NULL) { + scanf("%d", &weight); + } else { + ReadData(fp, "%d", &weight); + } + + (*info)->weight = weight; + } +} + +/* + * ²éÕÒ + * + * ·µ»Ø¶¥µãuÔÚͼ/ÍøÖеÄλÖà + */ +int LocateVex(AMLGraph G, VertexType u) { + int i; + + for(i = 0; i < G.vexnum; i++) { + if(G.adjmulist[i].data == u) { + return i; + } + } + + return -1; +} + +/* + * ²åÈë¶¥µã + * + * ½«Ö¸¶¨µÄ¶¥µãv×·¼Óµ½¶¥µã¼¯ÖУ¬Î´½¨Á¢¸Ã¶¥µãÓëÆäËû¶¥µãµÄ¹ØÏµ + */ +Status InsertVex(AMLGraph* G, VertexType v) { + int k; + + // ¶¥µãÊý¹ý¶à + if((*G).vexnum == MAX_VERTEX_NUM) { + return ERROR; + } + + // Ê×ÏÈÐèÒªÅжϸö¥µãÊÇ·ñ´æÔÚ + k = LocateVex(*G, v); + if(k >= 0) { + return ERROR; // Ö¸¶¨µÄ¶¥µã´æÔÚʱ£¬ÎÞÐèÖØ¸´Ìí¼Ó + } + + G->adjmulist[(*G).vexnum].data = v; + G->adjmulist[(*G).vexnum].firstedge = NULL; + + (*G).vexnum++; + + return OK; +} + +/* + * ɾ³ý¶¥µã + * + * ´Ó¶¥µã¼¯ÖÐɾ³ýÖ¸¶¨µÄ¶¥µãv£¬×¢ÒâÐèÒª¸üÐÂÏà¹ØµÄ¶¥µã¹ØÏµ + */ +Status DeleteVex(AMLGraph* G, VertexType v) { + int i, k, other; + EBox* p; + EBox* pre, * r; + + // Ê×ÏÈÐèÒªÅжϸö¥µãÊÇ·ñ´æÔÚ + k = LocateVex(*G, v); + if(k == -1) { + return ERROR; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + while((p = G->adjmulist[k].firstedge) != NULL) { + if(p->ivex == k) { + G->adjmulist[k].firstedge = p->ilink; + other = p->jvex; + } else if(p->jvex == k) { + G->adjmulist[k].firstedge = p->jlink; + other = p->ivex; + } else { + // ûÓÐÆäËû¿ÉÄÜ + } + + pre = NULL; + r = G->adjmulist[other].firstedge; + + // ²éÕұߣ¬¿Ï¶¨ÄÜÕÒµ½ + while(r != NULL) { + if(r->ivex == other && r->jvex < k) { + pre = r; + r = r->ilink; + } else if(r->jvex == other && r->ivex < k) { + pre = r; + r = r->jlink; + } else { + break; + } + } + + if(r != NULL && r->ivex == other && r->jvex == k) { + if(pre == NULL) { + G->adjmulist[other].firstedge = r->ilink; + } else { + if(pre->ivex == other) { + pre->ilink = r->ilink; + } else if(pre->jvex == other) { + pre->jlink = r->ilink; + } else { + // ûÓÐÆäËû¿ÉÄÜ + } + } + } else if(r != NULL && r->jvex == other && r->ivex == k) { + if(pre == NULL) { + G->adjmulist[other].firstedge = r->jlink; + } else { + if(pre->ivex == other) { + pre->ilink = r->jlink; + } else if(pre->jvex == other) { + pre->jlink = r->jlink; + } else { + // ûÓÐÆäËû¿ÉÄÜ + } + } + } else { + // ²»»áÖÁ´Ë£¬ÒòΪ¿Ï¶¨ÄÜÕÒµ½ + } + + free(p); + + (*G).edgenum--; // ±ßÊý¼õÒ» + } + + // ϱ곬¹ýkµÄ¶¥µã£¬ÐèÒªµÝ¼õÆäϱê + for(i = k + 1; i < (*G).vexnum; i++) { + r = G->adjmulist[i].firstedge; + + while(r!=NULL){ + if(r->ivex==i) { + r->ivex--; + r = r->ilink; + } else if(r->jvex==i) { + r->jvex--; + r = r->jlink; + } else { + // ²»»áÖÁ´Ë + } + } + } + + // ¶¥µã¼¯Ç°ÒÆ + for(i = k + 1; i < (*G).vexnum; i++) { + G->adjmulist[i - 1] = G->adjmulist[i]; + } + + // ¶¥µãÊýµÝ¼õ + (*G).vexnum--; + + return OK; +} + +/* + * ¹¹ÔìÒ»¸ö±ß½áµã(½öÏÞÄÚ²¿Ê¹ÓÃ) + */ +static EBox* newEBoxPtr(VisitIf mark, int ivex, int jvex, EBox* ilink, EBox* jlink, InfoType* info) { + EBox* p = (EBox*) malloc(sizeof(EBox)); + if(!p) { + exit(OVERFLOW); + } + + p->mark = mark; + + p->ivex = ivex; + p->jvex = jvex; + + p->ilink = ilink; + p->jlink = jlink; + + p->info = info; + + return p; +} + +/* + * ²åÈë±ß + * + * µ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬ÇÒÓÉÓÚÌØÊâµÄ½á¹¹£¬Ê¹µÃ²åÈëÒ»Ìõ±ßʱֻÐèÒªÔö¼ÓÒ»¶Ô¶¥µã¹ØÏµ£¬±ßµÄÊýÁ¿ÒÀÈ»ÔöÒ»¡£ + * ¶ÔÓÚͼ/ÍøÀ´Ëµ£¬¿ÉÒÔÔڿɱä²ÎÊýÖÐÁгö±ßµÄ¸½¼ÓÐÅÏ¢¡£ + * + * ×¢£º´Ë´¦½ÓÊյIJÎÊýÓëMGraphÓÐЩ²»Ò»Ñù£ºÍøµÄ¸½¼ÓÐÅÏ¢Öаüº¬Á˸÷Ìõ±ßµÄȨֵ¡£ + */ +Status InsertArc(AMLGraph* G, VertexType v, VertexType w, ...) { + int tail, head, k; + EBox* p; + EBox* pre; + EBox* r; + Boolean overlay = FALSE; // ÊÇ·ñΪ¸²¸ÇÌí¼Ó + InfoType* info = NULL; // ±ßµÄ¸½¼ÓÐÅÏ¢ + va_list ap; + + tail = LocateVex(*G, v); // »ñÈ¡¶¥µãvÔÚ¶¥µã¼¯ÖеÄλÖà + if(tail == -1) { + return ERROR; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + head = LocateVex(*G, w); // »ñÈ¡¶¥µãwÔÚ¶¥µã¼¯ÖеÄλÖà + if(head == -1) { + return ERROR; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + // ¾Ü¾ø»· + if(tail == head) { + return ERROR; + } + + // Èç¹û±ßÉÏ´æÔÚ¸½¼ÓÐÅÏ¢ + if(IncInfo) { + va_start(ap, w); // ÔÚwºó²éѯÊ׸ö¿É±ä²ÎÊý + info = va_arg(ap, InfoType*); // »ñÈ¡¸½¼ÓÐÅÏ¢ + va_end(ap); + } + + /* ½ÓÏÂÀ´£¬ÐèÒª²éÕÒºÏÊʵIJåÈëλÖà */ + + pre = NULL; + r = G->adjmulist[tail].firstedge; + + while(r != NULL) { + if(r->ivex == tail && r->jvex < head) { + pre = r; + r = r->ilink; + } else if(r->jvex == tail && r->ivex < head) { + pre = r; + r = r->jlink; + } else { + break; + } + } + + if(r != NULL && r->ivex == tail && r->jvex == head) { + r->info = info; // ¸´Óøýáµã + overlay = TRUE; // ·¢ÉúÁ˸²¸Ç + } else if(r != NULL && r->jvex == tail && r->ivex == head) { + r->info = info; // ¸´Óøýáµã + overlay = TRUE; // ·¢ÉúÁ˸²¸Ç + } else { + p = newEBoxPtr(unvisit, tail, head, r, NULL, info); + + if(pre == NULL) { + G->adjmulist[tail].firstedge = p; + } else { + if(pre->ivex == tail) { + pre->ilink = p; + } else if(pre->jvex == tail) { + pre->jlink = p; + } else { + // ûÓÐÆäËû¿ÉÄÜ + } + } + } + + if(!overlay) { + pre = NULL; + r = G->adjmulist[head].firstedge; + + while(r != NULL) { + if(r->ivex == head && r->jvex < tail) { + pre = r; + r = r->ilink; + } else if(r->jvex == head && r->ivex < tail) { + pre = r; + r = r->jlink; + } else { + break; + } + } + + p->jlink = r; + + if(pre == NULL) { + G->adjmulist[head].firstedge = p; + } else { + if(pre->ivex == head) { + pre->ilink = p; + } else if(pre->jvex == head) { + pre->jlink = p; + } else { + // ûÓÐÆäËû¿ÉÄÜ + } + } + } + + (*G).edgenum++; // ±ßÊýÔöÒ» + + return OK; +} + +/* + * ɾ³ý±ß + */ +Status DeleteArc(AMLGraph* G, VertexType v, VertexType w) { + int tail, head; + EBox* r; + EBox* pre; + + tail = LocateVex(*G, v); + if(tail == -1) { + return ERROR; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + head = LocateVex(*G, w); + if(head == -1) { + return ERROR; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + pre = NULL; + r = G->adjmulist[tail].firstedge; + + while(r != NULL) { + if(r->ivex == tail && r->jvex < head) { + pre = r; + r = r->ilink; + } else if(r->jvex == tail && r->ivex < head) { + pre = r; + r = r->jlink; + } else { + break; + } + } + + if(r != NULL && r->ivex == tail && r->jvex == head) { + if(pre == NULL) { + G->adjmulist[tail].firstedge = r->ilink; + } else { + if(pre->ivex == tail) { + pre->ilink = r->ilink; + } else if(pre->jvex == tail) { + pre->jlink = r->ilink; + } else { + // ûÓÐÆäËû¿ÉÄÜ + } + } + } else if(r != NULL && r->jvex == tail && r->ivex == head) { + if(pre == NULL) { + G->adjmulist[tail].firstedge = r->jlink; + } else { + if(pre->ivex == tail) { + pre->ilink = r->jlink; + } else if(pre->jvex == tail) { + pre->jlink = r->jlink; + } else { + // ûÓÐÆäËû¿ÉÄÜ + } + } + } else { + return ERROR; // δÕÒµ½ + } + + + pre = NULL; + r = G->adjmulist[head].firstedge; + + while(r != NULL) { + if(r->ivex == head && r->jvex < tail) { + pre = r; + r = r->ilink; + } else if(r->jvex == head && r->ivex < tail) { + pre = r; + r = r->jlink; + } else { + break; + } + } + + if(r != NULL && r->ivex == head && r->jvex == tail) { + if(pre == NULL) { + G->adjmulist[head].firstedge = r->ilink; + } else { + if(pre->ivex == head) { + pre->ilink = r->ilink; + } else if(pre->jvex == head) { + pre->jlink = r->ilink; + } else { + // ûÓÐÆäËû¿ÉÄÜ + } + } + } else if(r != NULL && r->jvex == head && r->ivex == tail) { + if(pre == NULL) { + G->adjmulist[head].firstedge = r->jlink; + } else { + if(pre->ivex == head) { + pre->ilink = r->jlink; + } else if(pre->jvex == head) { + pre->jlink = r->jlink; + } else { + // ûÓÐÆäËû¿ÉÄÜ + } + } + } else { + // ²»»áÖÁ´Ë£¬ÒòÎªÇ°ÃæÕÒµ½ÁË£¬´Ë´¦¿Ï¶¨Ò²ÄÜÕÒµ½ + } + + free(r); // ÊÍ·ÅÄÚ´æ + + (*G).edgenum--; // ±ßÊý¼õÒ» + + return OK; +} + +/* + * ÒÔͼÐλ¯ÐÎʽÊä³öµ±Ç°½á¹¹ + */ +void PrintGraph(AMLGraph G) { + int i, cur, pos; + EBox* p; + + if(G.vexnum == 0) { + printf("¿Õͼ£¬ÎÞÐè´òÓ¡£¡\n"); + return; + } + + printf("µ±Ç°Í¼/Íø°üº¬ %2d ¸ö¶¥µã£¬ %2d Ìõ±ß...\n", G.vexnum, G.edgenum); + + for(i = 0; i < G.vexnum; i++) { + printf("%c ===> ", G.adjmulist[i].data); + + cur = 0; + p = G.adjmulist[i].firstedge; + + while(p != NULL) { + if(p->ivex == i) { + pos = p->jvex; + } else { + pos = p->ivex; + } + + if(cur < pos) { + if(IncInfo == 0) { + printf(" "); + + // ¶ÔÓÚÍø£¬»á´ÓÆä¸½¼ÓÐÅÏ¢ÖлñÈ¡µ½È¨Öµ + } else { + printf(" "); + } + } else { + if(IncInfo == 0) { + printf("%c", G.adjmulist[pos].data); + + // ¶ÔÓÚÍø£¬»á´ÓÆä¸½¼ÓÐÅÏ¢ÖлñÈ¡µ½È¨Öµ + } else { + printf("%c[%2d]", G.adjmulist[pos].data, p->info->weight); + } + + if(p->ivex == i) { + p = p->ilink; + } else { + p = p->jlink; + } + } + + cur++; + + if(p != NULL) { + printf(" "); + } + } + + printf("\n"); + } +} diff --git a/Dev-C++/ExerciseBook/07.18-07.19/AMLGraph.h b/Dev-C++/ExerciseBook/07.18-07.19/AMLGraph.h new file mode 100644 index 0000000..5045840 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.18-07.19/AMLGraph.h @@ -0,0 +1,162 @@ +/*===================== + * ͼµÄÁÚ½Ó¶àÖØ±í´æ´¢±íʾ + ======================*/ + +#ifndef AMLGRAPH_H +#define AMLGRAPH_H + +#include +#include // Ìṩmemset¡¢strcmp Ô­ÐÍ +#include // Ìṩºêva_list¡¢va_start¡¢va_arg¡¢va_end +#include // Ìṩmalloc¡¢realloc¡¢free¡¢exitÔ­ÐÍ +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// + +/* + * ×¢£º + * + * ͨ³£À´½²£¬ÎÞȨͼ±»¼ò³ÆÎª¡¾Í¼¡¿£¬ÓÐȨͼ±»¼ò³ÆÎª¡¾Íø¡¿¡£ + * ÎÞÏòͼ/ÍøÖеĶ¥µã¹ØÏµ±»³ÆÎª¡¾±ß¡¿£¬ÓÐÏòͼ/ÍøÖеĶ¥µã¹ØÏµ±»³ÆÎª¡¾»¡¡¿£¬²¢Çø·Ö»¡Í·Ó뻡β¡£ + * ʵ¼Ê±íÊöÖУ¬Î´±Ø»áÑϸñ×ñÊØÒÔÉÏÃüÃû¡£ + * + * µ±Ç°½á¹¹Êʺϴ洢ÎÞÏòͼ/Íø¡£ + * + * ¡ï ²åÈë±ß/»¡µÄÐÅϢʱ£¬ÕâÀïµÄʵÏÖÊǰ´"ÉýÐò"²åÈëµÄ£¬ÕâʹµÃ²åÈëµÄ»¡Êǰ´"ÉýÐò"ÅÅÁеġ£ + */ + + +/* ºê¶¨Òå */ +#define MAX_VERTEX_NUM 26 // ×î´ó¶¥µã¸öÊý + + +// ͼµÄÀàÐÍ +// ͼµÄÀàÐÍ +typedef enum { + DG, // 0-ÓÐÏòͼ£»´Ë´¦²»Ö§³Ö + DN, // 1-ÓÐÏòÍø(´øÈ¨Öµ)£»´Ë´¦²»Ö§³Ö + UDG, // 2-ÎÞÏòͼ + UDN // 3-ÎÞÏòÍø(´øÈ¨Öµ) +} GraphKind; + + +/* ÎÞÏòͼ£¨ÁÚ½Ó¶àÖØ±í£©ÀàÐͶ¨Òå */ +typedef enum { + unvisit, visit +} VisitIf; + +// ¶¥µãÀàÐÍ +typedef char VertexType; + +// ±ßµÄÏà¹Ø¸½¼ÓÐÅÏ¢ +typedef struct { + /* + * ×¢£º + * ½Ì²ÄÖиø³öµÄ½á¹¹Ö»¿¼ÂÇÁËÎÞȨͼ£¬¶øÃ»¿¼ÂÇÓÐȨͼ(Íø)¡£ + * ÕâÀïΪÁ˰ѡ°Íø¡±µÄÇéÐÎÒ²¿¼ÂǽøÈ¥£¬ÌØÔÚ¸½¼ÓÐÅÏ¢ÖÐÔö¼ÓÁË"È¨ÖØ"ÊôÐÔ¡£ + */ + int weight; +} InfoType; + +/* ±ß½áµã */ +typedef struct EBox { + VisitIf mark; // ·ÃÎʱê¼Ç + int ivex; // ¸Ã±ßÒÀ¸½µÄÁ½¸ö¶¥µãµÄλÖà + int jvex; // ¸Ã±ßÒÀ¸½µÄÁ½¸ö¶¥µãµÄλÖà + struct EBox* ilink; // ·Ö±ðÖ¸ÏòÒÀ¸½ÕâÁ½¸ö¶¥µãµÄÏÂÒ»Ìõ±ß + struct EBox* jlink; // ·Ö±ðÖ¸ÏòÒÀ¸½ÕâÁ½¸ö¶¥µãµÄÏÂÒ»Ìõ±ß + InfoType* info; +} EBox; + +// ÿ¸öÁ´±íµÄÍ·½áµã +typedef struct VexBox { + VertexType data; // ¶¥µãÐÅÏ¢ + EBox* firstedge; // Ö¸ÏòµÚÒ»ÌõÒÀ¸½¸Ã¶¥µãµÄ±ßµÄÖ¸Õë +} VexBox; + +/* ͼµÄÁÚ½Ó¶àÖØ±í´æ´¢±íʾÀàÐͶ¨Òå */ +typedef struct { + VexBox adjmulist[MAX_VERTEX_NUM]; // ±íÍ·ÏòÁ¿ + int vexnum, edgenum; // ͼ/ÍøµÄ¶¥µãÊýºÍ±ßÊý + GraphKind kind; // ͼµÄÀàÐͱêÖ¾ +} AMLGraph; + + +// ±ß/»¡ÉÏÊÇ·ñ´æÔÚ¸½¼ÓÐÅÏ¢ +extern Boolean IncInfo; + + +/* + * ´´½¨ + * + *¡¾±¸×¢¡¿ + * + * ½Ì²ÄÖÐĬÈÏ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý¡£ + * ÕâÀïΪÁË·½±ã²âÊÔ£¬±ÜÃâÿ´ÎÔËÐж¼ÊÖ¶¯ÊäÈëÊý¾Ý£¬ + * Òò¶øÔÊÐíÑ¡Ôñ´ÓÔ¤ÉèµÄÎļþpathÖжÁÈ¡²âÊÔÊý¾Ý¡£ + * + * Èç¹ûÐèÒª´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý£¬ÔòpathΪNULL£¬»òpath[kind]Ϊ""¡£ + * Èç¹ûÐèÒª´ÓÎļþÖжÁÈ¡Êý¾Ý£¬ÔòÐèÒªÔÚpathÖÐÌîдÎļþÃûÐÅÏ¢¡£ + */ +Status CreateGraph(AMLGraph* G, char* path[]); + +/* + * ¹¹ÔìÎÞÏòͼ + */ +static Status CreateUDG(AMLGraph* G); + +/* + * ¹¹ÔìÎÞÏòÍø + */ +static Status CreateUDN(AMLGraph* G); + +/* + * ¼Èë±ßµÄÏà¹Ø¸½¼ÓÐÅÏ¢ + */ +static void Input(AMLGraph G, InfoType** info); + +/* + * ²éÕÒ + * + * ·µ»Ø¶¥µãuÔÚͼ/ÍøÖеÄλÖà + */ +int LocateVex(AMLGraph G, VertexType u); + +/* + * ²åÈë¶¥µã + * + * ½«Ö¸¶¨µÄ¶¥µãv×·¼Óµ½¶¥µã¼¯ÖУ¬Î´½¨Á¢¸Ã¶¥µãÓëÆäËû¶¥µãµÄ¹ØÏµ + */ +Status InsertVex(AMLGraph* G, VertexType v); + +/* + * ɾ³ý¶¥µã + * + * ´Ó¶¥µã¼¯ÖÐɾ³ýÖ¸¶¨µÄ¶¥µãv£¬×¢ÒâÐèÒª¸üÐÂÏà¹ØµÄ¶¥µã¹ØÏµ + */ +Status DeleteVex(AMLGraph* G, VertexType v); + +/* + * ¹¹ÔìÒ»¸ö±ß½áµã(½öÏÞÄÚ²¿Ê¹ÓÃ) + */ +static EBox* newEBoxPtr(VisitIf mark, int ivex, int jvex, EBox* ilink, EBox* jlink, InfoType* info); + +/* + * ²åÈë±ß + * + * µ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬ÇÒÓÉÓÚÌØÊâµÄ½á¹¹£¬Ê¹µÃ²åÈëÒ»Ìõ±ßʱֻÐèÒªÔö¼ÓÒ»¶Ô¶¥µã¹ØÏµ£¬±ßµÄÊýÁ¿ÒÀÈ»ÔöÒ»¡£ + * ¶ÔÓÚͼ/ÍøÀ´Ëµ£¬¿ÉÒÔÔڿɱä²ÎÊýÖÐÁгö±ßµÄ¸½¼ÓÐÅÏ¢¡£ + * + * ×¢£º´Ë´¦½ÓÊյIJÎÊýÓëMGraphÓÐЩ²»Ò»Ñù£ºÍøµÄ¸½¼ÓÐÅÏ¢Öаüº¬Á˸÷Ìõ±ßµÄȨֵ¡£ + */ +Status InsertArc(AMLGraph* G, VertexType v, VertexType w, ...); + +/* + * ɾ³ý±ß + */ +Status DeleteArc(AMLGraph* G, VertexType v, VertexType w); + +/* + * ÒÔͼÐλ¯ÐÎʽÊä³öµ±Ç°½á¹¹ + */ +void PrintGraph(AMLGraph G); + +#endif diff --git a/Dev-C++/ExerciseBook/07.18-07.19/TestData_UDG.txt b/Dev-C++/ExerciseBook/07.18-07.19/TestData_UDG.txt new file mode 100644 index 0000000..6c08d74 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.18-07.19/TestData_UDG.txt @@ -0,0 +1,6 @@ +ͼÀàÐÍ¡ú2£¨ÎÞÏòͼ£© +¶¥µãÊý¡ú6 +±ßÊý¡ú13 +±ßÊÇ·ñ´øÓÐÆäËûÐÅÏ¢¡ú0 +¶¥µã¼¯¡ú¡¾A£¬X£¬B£¬C£¬D£¬E¡¿ +±ßµÄ¼¯ºÏ¡ú¡¾A£¬B¡¿¡¾A£¬C¡¿¡¾A£¬D¡¿¡¾B£¬C¡¿¡¾B£¬D¡¿¡¾B£¬E¡¿¡¾C£¬E¡¿¡¾C£¬X¡¿¡¾E£¬A¡¿¡¾E£¬D¡¿¡¾E£¬X¡¿¡¾X£¬A¡¿¡¾X£¬D¡¿ \ No newline at end of file diff --git a/Dev-C++/ExerciseBook/07.18-07.19/TestData_UDN.txt b/Dev-C++/ExerciseBook/07.18-07.19/TestData_UDN.txt new file mode 100644 index 0000000..2117df2 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.18-07.19/TestData_UDN.txt @@ -0,0 +1,6 @@ +ͼÀàÐÍ¡ú3£¨ÎÞÏòÍø£© +¶¥µãÊý¡ú6 +±ßÊý¡ú13 +±ßÊÇ·ñ´øÓÐÆäËûÐÅÏ¢¡ú1 +¶¥µã¼¯¡ú¡¾A£¬X£¬B£¬C£¬D£¬E¡¿ +±ßµÄ¼¯ºÏ¡ú¡¾A£¬B£¬3¡¿¡¾A£¬C£¬8¡¿¡¾A£¬D£¬11¡¿¡¾B£¬C£¬7¡¿¡¾B£¬D£¬4¡¿¡¾B£¬E£¬1¡¿¡¾C£¬E£¬17¡¿¡¾C£¬X£¬3¡¿¡¾E£¬A£¬6¡¿¡¾E£¬D£¬4¡¿¡¾E£¬X£¬2¡¿¡¾X£¬A£¬8¡¿¡¾X£¬D£¬10¡¿ \ No newline at end of file diff --git a/Dev-C++/ExerciseBook/07.20/07.20.cpp b/Dev-C++/ExerciseBook/07.20/07.20.cpp new file mode 100644 index 0000000..8412f5a --- /dev/null +++ b/Dev-C++/ExerciseBook/07.20/07.20.cpp @@ -0,0 +1,78 @@ +#include +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// +#include "MGraph.h" //**¡ø07 ͼ**// + +/* + * ÅжÏͼGÊÇ·ñ¿É´«µÝ + */ +Status Algo_7_20(MGraph G); + + +int main(int argc, char* argv[]) { + MGraph G; + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ´´½¨²¢Êä³öͼ...\n"); + { + char* path[4]; + + path[0] = "TestData_DG.txt"; + path[1] = "TestData_DN.txt"; + path[2] = "TestData_UDG.txt"; + path[3] = "TestData_UDN.txt"; + + CreateGraph(&G, path); + PrintGraph(G); + printf("\n"); + } + + Algo_7_20(G) ? printf("ͼG¿É´«µÝ£¡\n") : printf("ͼG²»¿É´«µÝ£¡\n"); + printf("\n"); + + return 0; +} + + +/* + * ÅжÏͼGÊÇ·ñ¿É´«µÝ + */ +Status Algo_7_20(MGraph G) { + Status trans; + int x, y, z; + int flag; // ²»Á¬Í¨µÄ±ê¼Ç + + // ¶ÔÓÚͼ£¬²»Á¬Í¨±ê¼ÇÊÇ0 + if(G.kind == DG || G.kind == UDG) { + flag = 0; + + // ¶ÔÓÚÍø£¬²»Á¬Í¨±ê¼ÇÊÇINFINITE + } else if(G.kind == DN || G.kind == UDN) { + flag = INFINITE; + } else { + return ERROR; + } + + // Ô¤ÉèΪ¿É´«µÝ + trans = TRUE; + + // ¶ÔÓÚVÖÐÿ¸öx + for(x = 0; x < G.vexnum; x++) { + // N(x)ÖÐÿ¸öy + for(y = 0; y < G.vexnum; y++) { + if(G.arcs[x][y].adj != flag) { + // N(y)Öв»µÈÓÚxµÄÿ¸öz + for(z = 0; z < G.vexnum; z++) { + if(G.arcs[y][z].adj != flag && z != x) { + // z²»ÔÚN(x)ÖÐ + if(G.arcs[x][z].adj == flag) { + // ²»¿É´«µÝ + trans = FALSE; + return trans; + } + } + } + } + } + } + + return trans; +} diff --git a/Dev-C++/ExerciseBook/07.20/07.20.dev b/Dev-C++/ExerciseBook/07.20/07.20.dev new file mode 100644 index 0000000..2ec7f04 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.20/07.20.dev @@ -0,0 +1,118 @@ +[Project] +FileName=07.20.dev +Name=07.20 +Type=1 +Ver=2 +ObjFiles= +Includes= +Libs= +PrivateResource= +ResourceIncludes= +MakeIncludes= +Compiler= +CppCompiler= +Linker= +IsCpp=0 +Icon= +ExeOutput= +ObjectOutput= +LogOutput= +LogOutputEnabled=0 +OverrideOutput=0 +OverrideOutputName= +HostApplication= +UseCustomMakefile=0 +CustomMakefile= +CommandLine= +Folders= +IncludeVersionInfo=0 +SupportXPThemes=0 +CompilerSet=1 +CompilerSettings=0000000000000000001000000 +UnitCount=7 + +[VersionInfo] +Major=1 +Minor=0 +Release=0 +Build=0 +LanguageID=1033 +CharsetID=1252 +CompanyName= +FileVersion= +FileDescription=Developed using the Dev-C++ IDE +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion= +AutoIncBuildNr=0 +SyncProduct=1 + +[Unit1] +FileName=07.20.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit2] +FileName=MGraph.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit3] +FileName=MGraph.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit4] +FileName=TestData_DG.txt +Folder= +Compile=0 +Link=0 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit5] +FileName=TestData_DN.txt +Folder= +Compile=0 +Link=0 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit6] +FileName=TestData_UDG.txt +Folder= +Compile=0 +Link=0 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit7] +FileName=TestData_UDN.txt +Folder= +Compile=0 +Link=0 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + diff --git a/Dev-C++/ExerciseBook/07.20/07.20.png b/Dev-C++/ExerciseBook/07.20/07.20.png new file mode 100644 index 0000000000000000000000000000000000000000..29a4418760cc5fd0d0e3904258af3a0fd49246d9 GIT binary patch literal 16161 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 literal 0 HcmV?d00001 diff --git a/Dev-C++/ExerciseBook/07.20/MGraph.cpp b/Dev-C++/ExerciseBook/07.20/MGraph.cpp new file mode 100644 index 0000000..c57dfc9 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.20/MGraph.cpp @@ -0,0 +1,482 @@ +/*================================= + * ͼµÄÊý×é(ÁÚ½Ó¾ØÕó)´æ´¢±íʾ + * + * °üº¬Ëã·¨: 7.1¡¢7.2¡¢7.4¡¢7.5¡¢7.6 + ==================================*/ + +#include "MGraph.h" //**¡ø07 ͼ**// + +// ¼ÈëÊý¾ÝµÄÔ´Îļþ£»fpΪnullʱ£¬ËµÃ÷ÐèÒª´Ó¿ØÖÆÌ¨Â¼Èë +static FILE* fp = NULL; + +/* + * IncInfoָʾ¸Ãͼ/ÍøµÄ±ß/»¡ÉÏÊÇ·ñ´æÔÚ¸½¼ÓÐÅÏ¢¡£ + * Èç¹ûÆäÖµ²»Îª0£¬Ôò±íʾÎÞ¸½¼ÓÐÅÏ¢£¬·ñÔò£¬±íʾ´æÔÚ¸½¼ÓÐÅÏ¢¡£ + */ +Boolean IncInfo = FALSE; + +// ·ÃÎʱêÖ¾Êý×飬¼Ç¼·ÃÎʹýµÄ¶¥µã +static Boolean visited[MAX_VERTEX_NUM]; + +// º¯Êý±äÁ¿ +static Status (* VisitFunc)(VertexType e); + + +/* + * ¨€¨€¨€¨€¨€¨€¨€¨€ Ëã·¨7.1 ¨€¨€¨€¨€¨€¨€¨€¨€ + * + * ´´½¨Í¼/±í + * + *¡¾±¸×¢¡¿ + * + * ½Ì²ÄÖÐĬÈÏ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý¡£ + * ÕâÀïΪÁË·½±ã²âÊÔ£¬±ÜÃâÿ´ÎÔËÐж¼ÊÖ¶¯ÊäÈëÊý¾Ý£¬ + * Òò¶øÔÊÐíÑ¡Ôñ´ÓÔ¤ÉèµÄÎļþpathÖжÁÈ¡²âÊÔÊý¾Ý¡£ + * + * Èç¹ûÐèÒª´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý£¬ÔòpathΪNULL£¬»òpath[kind]Ϊ""¡£ + * Èç¹ûÐèÒª´ÓÎļþÖжÁÈ¡Êý¾Ý£¬ÔòÐèÒªÔÚpathÖÐÌîдÎļþÃûÐÅÏ¢¡£ + */ +Status CreateGraph(MGraph* G, char* path[]) { + int readFromConsole; // ÊÇ·ñ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý + int kind; + Status flag; + + printf("ÇëÊäÈëͼµÄÀàÐÍ(0-ÓÐÏòͼ ©¦ 1-ÓÐÏòÍø ©¦ 2-ÎÞÏòͼ ©¦ 3-ÎÞÏòÍø)£º"); + scanf("%d", &kind); + + // ÀàÐͲ»ºÏ¹æ + if(kind < 0 || kind > 3) { + return ERROR; + } + + // Èç¹ûûÓÐÎļþ·¾¶ÐÅÏ¢£¬Ôò´Ó¿ØÖÆÌ¨¶ÁÈ¡ÊäÈë + readFromConsole = (path == NULL) || strcmp(path[kind], "") == 0; + + // ÐèÒª´ÓÎļþ¶ÁÈ¡ + if(readFromConsole) { + (*G).kind = GraphKind(kind); // ¼Ç¼ͼ/ÍøµÄÀàÐÍ + } else { + // ´ò¿ªÎļþ£¬×¼±¸¶ÁÈ¡²âÊÔÊý¾Ý + fp = fopen(path[kind], "r"); + if(fp == NULL) { + return ERROR; + } + + // ¼ÈëͼµÄÀàÐÍ + ReadData(fp, "%d", &((*G).kind)); + } + + // Ëæ»ú´´½¨ÓÐÏòͼ/Íø»òÎÞÏòͼ/ÍøµÄÒ»ÖÖ + switch((*G).kind) { + case DG: + flag = CreateDG(G); + break; + case DN: + flag = CreateDN(G); + break; + case UDG: + flag = CreateUDG(G); + break; + case UDN: + flag = CreateUDN(G); + break; + default: + flag = ERROR; + break; + } + + if(fp != NULL) { + fclose(fp); + fp = NULL; + } + + return flag; +} + +/* + * ¹¹ÔìÓÐÏòͼ + */ +static Status CreateDG(MGraph* G) { + int i, j, k; + ArcCell arcs = {0, NULL}; // ÓÐÏòͼÿÌõ±ßµÄ³õʼֵ + VertexType v1, v2; + + if(fp == NULL) { + printf("ÇëÊäÈëÓÐÏòͼµÄ¶¥µãÊý£º"); + scanf("%d", &((*G).vexnum)); + printf("ÇëÊäÈëÓÐÏòͼµÄ»¡Êý£º"); + scanf("%d", &((*G).arcnum)); + printf("¸ÃÓÐÏòͼµÄ»¡ÉÏÊÇ·ñ°üº¬ÆäËû¸½¼ÓÐÅÏ¢(0-²»°üº¬©¦1-°üº¬)£º"); + scanf("%d", &IncInfo); + + // ¼Èë¶¥µã¼¯ + printf("Çë¼Èë %d ¸ö¶¥µã£¬²»Í¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º", (*G).vexnum); + for(i = 0; i < (*G).vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(stdin); + scanf("%c", &((*G).vexs[i])); + } + } else { + ReadData(fp, "%d", &((*G).vexnum)); // ¼Èë¶¥µãÊý + ReadData(fp, "%d", &((*G).arcnum)); // ¼È뻡Êý + ReadData(fp, "%d", &IncInfo); // Åжϻ¡ÉÏÊÇ·ñ°üº¬¸½¼ÓÐÅÏ¢ + + // ¼Èë¶¥µã¼¯ + for(i = 0; i < (*G).vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(fp); + ReadData(fp, "%c", &((*G).vexs[i])); + } + } + + // ³õʼ»¯ÓÐÏòͼµÄÁÚ½Ó¾ØÕó + for(i = 0; i < (*G).vexnum; i++) { + for(j = 0; j < (*G).vexnum; j++) { + (*G).arcs[i][j] = arcs; + } + } + + // ½öÔÚ¿ØÖÆÌ¨Â¼ÈëÐÅϢʱÊä³ö´ËÌáʾ + if(fp == NULL && (*G).arcnum != 0) { + printf("ÇëΪÓÐÏòͼÒÀ´Î¼Èë %d Ìõ»¡µÄÐÅÏ¢£¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º\n", (*G).arcnum); + } + + // ¼È뻡µÄÐÅÏ¢ + for(k = 0; k < (*G).arcnum; k++) { + if(fp == NULL) { + printf("µÚ %2d Ìõ»¡£º", k + 1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v2); + } else { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + skipBlank(fp); + ReadData(fp, "%c%c", &v1, &v2); + } + + i = LocateVex(*G, v1); // »ñÈ¡¶¥µãv1ÔÚ¶¥µã¼¯ÖеÄλÖà + j = LocateVex(*G, v2); // »ñÈ¡¶¥µãv2ÔÚ¶¥µã¼¯ÖеÄλÖà + + // ½«Ö¸¶¨µÄ¶¥µã¹ØÏµÉèÖÃΪ1£¬Ö¸Ê¾ÕâÁ½¸ö¶¥µãÊÇÖ±½ÓÁ¬½ÓµÄ(×¢£ºÕâÀïûÓÐÑé֤ϱêÊÇ·ñÔ½½ç) + (*G).arcs[i][j].adj = 1; + + // Èç¹ûÐèҪ¼È뻡µÄÆäËû¸½¼ÓÐÅÏ¢ + if(IncInfo) { + // ×îºó¼È븽¼ÓÐÅÏ¢ + Input(*G, &((*G).arcs[i][j].info)); + } + } + + // ´ÓÎļþÖжÁÈ¡Êý¾Ýʱ£¬×îºóÆäʵӦµ±ÅжÏÒ»ÏÂÊÇ·ñ¶Áµ½ÁË×ã¹»µÄÐÅÏ¢ + return OK; +} + +/* + * ¹¹ÔìÓÐÏòÍø + */ +static Status CreateDN(MGraph* G) { + int i, j, k; + ArcCell arcs = {INFINITE, NULL}; // ÓÐÏòÍøÃ¿Ìõ»¡µÄ³õʼֵ + VertexType v1, v2; + VRType w; + + if(fp == NULL) { + printf("ÇëÊäÈëÓÐÏòÍøµÄ¶¥µãÊý£º"); + scanf("%d", &((*G).vexnum)); + printf("ÇëÊäÈëÓÐÏòÍøµÄ»¡Êý£º"); + scanf("%d", &((*G).arcnum)); + printf("¸ÃÓÐÏòÍøµÄ»¡ÉÏÊÇ·ñ°üº¬ÆäËû¸½¼ÓÐÅÏ¢(0-²»°üº¬©¦1-°üº¬)£º"); + scanf("%d", &IncInfo); + + // ¼Èë¶¥µã¼¯ + printf("Çë¼Èë %d ¸ö¶¥µã£¬²»Í¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º", (*G).vexnum); + for(i = 0; i < (*G).vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(stdin); + scanf("%c", &((*G).vexs[i])); + } + } else { + ReadData(fp, "%d", &((*G).vexnum)); // ¼Èë¶¥µãÊý + ReadData(fp, "%d", &((*G).arcnum)); // ¼È뻡Êý + ReadData(fp, "%d", &IncInfo); // Åжϻ¡ÉÏÊÇ·ñ°üº¬¸½¼ÓÐÅÏ¢ + + // ¼Èë¶¥µã¼¯ + for(i = 0; i < (*G).vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(fp); + ReadData(fp, "%c", &((*G).vexs[i])); + } + } + + // ³õʼ»¯ÓÐÏòÍøµÄÁÚ½Ó¾ØÕó + for(i = 0; i < (*G).vexnum; i++) { + for(j = 0; j < (*G).vexnum; j++) { + (*G).arcs[i][j] = arcs; + } + } + + // ½öÔÚ¿ØÖÆÌ¨Â¼ÈëÐÅϢʱÊä³ö´ËÌáʾ + if(fp == NULL && (*G).arcnum != 0) { + printf("ÇëΪÓÐÏòÍøÒÀ´Î¼Èë %d Ìõ»¡(´øÈ¨Öµ)µÄÐÅÏ¢£¬¶¥µã¼°È¨ÖµÖ®¼äÓÿոñ¸ô¿ª£º\n", (*G).arcnum); + } + + // ¼È뻡µÄÐÅÏ¢ + for(k = 0; k < (*G).arcnum; k++) { + if(fp == NULL) { + printf("µÚ %2d Ìõ»¡¼°ÆäȨֵ£º", k + 1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v2); + scanf("%d", &w); + } else { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + skipBlank(fp); + ReadData(fp, "%c%c%d", &v1, &v2, &w); + } + + i = LocateVex(*G, v1); // »ñÈ¡¶¥µãv1ÔÚ¶¥µã¼¯ÖеÄλÖà + j = LocateVex(*G, v2); // »ñÈ¡¶¥µãv2ÔÚ¶¥µã¼¯ÖеÄλÖà + + // ÔÚÖ¸¶¨µÄ¶¥µã¹ØÏµÉϼǼȨֵ(×¢£ºÕâÀïûÓÐÑé֤ϱêÊÇ·ñÔ½½ç) + (*G).arcs[i][j].adj = w; + + // Èç¹ûÐèҪ¼È뻡µÄÆäËû¸½¼ÓÐÅÏ¢ + if(IncInfo) { + // ×îºó¼È븽¼ÓÐÅÏ¢ + Input(*G, &((*G).arcs[i][j].info)); + } + } + + // ´ÓÎļþÖжÁÈ¡Êý¾Ýʱ£¬×îºóÆäʵӦµ±ÅжÏÒ»ÏÂÊÇ·ñ¶Áµ½ÁË×ã¹»µÄÐÅÏ¢ + return OK; +} + +/* + * ¹¹ÔìÎÞÏòͼ + */ +static Status CreateUDG(MGraph* G) { + int i, j, k; + ArcCell arcs = {0, NULL}; // ÎÞÏòͼÿÌõ±ßµÄ³õʼֵ + VertexType v1, v2; + + if(fp == NULL) { + printf("ÇëÊäÈëÎÞÏòͼµÄ¶¥µãÊý£º"); + scanf("%d", &((*G).vexnum)); + printf("ÇëÊäÈëÎÞÏòͼµÄ±ßÊý£º"); + scanf("%d", &((*G).arcnum)); + printf("¸ÃÎÞÏòͼµÄ±ßÉÏÊÇ·ñ°üº¬ÆäËû¸½¼ÓÐÅÏ¢(0-²»°üº¬©¦1-°üº¬)£º"); + scanf("%d", &IncInfo); + + // ¼Èë¶¥µã¼¯ + printf("Çë¼Èë %d ¸ö¶¥µã£¬²»Í¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º", (*G).vexnum); + for(i = 0; i < (*G).vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(stdin); + scanf("%c", &((*G).vexs[i])); + } + } else { + ReadData(fp, "%d", &((*G).vexnum)); // ¼Èë¶¥µãÊý + ReadData(fp, "%d", &((*G).arcnum)); // ¼Èë±ßÊý + ReadData(fp, "%d", &IncInfo); // ÅжϱßÉÏÊÇ·ñ°üº¬¸½¼ÓÐÅÏ¢ + + // ¼Èë¶¥µã¼¯ + for(i = 0; i < (*G).vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(fp); + ReadData(fp, "%c", &((*G).vexs[i])); + } + } + + // ³õʼ»¯ÎÞÏòͼµÄÁÚ½Ó¾ØÕó + for(i = 0; i < (*G).vexnum; i++) { + for(j = 0; j < (*G).vexnum; j++) { + (*G).arcs[i][j] = arcs; + } + } + + // ½öÔÚ¿ØÖÆÌ¨Â¼ÈëÐÅϢʱÊä³ö´ËÌáʾ + if(fp == NULL && (*G).arcnum != 0) { + printf("ÇëΪÎÞÏòͼÒÀ´Î¼Èë %d Ìõ±ßµÄÐÅÏ¢£¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º\n", (*G).arcnum); + } + + // ¼Èë±ßµÄÐÅÏ¢ + for(k = 0; k < (*G).arcnum; k++) { + if(fp == NULL) { + printf("µÚ %2d Ìõ±ß£º", k + 1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v2); + } else { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + skipBlank(fp); + ReadData(fp, "%c%c", &v1, &v2); + } + + i = LocateVex(*G, v1); // »ñÈ¡¶¥µãv1ÔÚ¶¥µã¼¯ÖеÄλÖà + j = LocateVex(*G, v2); // »ñÈ¡¶¥µãv2ÔÚ¶¥µã¼¯ÖеÄλÖà + + // ½«Ö¸¶¨µÄ¶¥µã¹ØÏµÉèÖÃΪ1£¬Ö¸Ê¾ÕâÁ½¸ö¶¥µãÊÇÖ±½ÓÁ¬½ÓµÄ(×¢£ºÕâÀïûÓÐÑé֤ϱêÊÇ·ñÔ½½ç) + (*G).arcs[i][j].adj = 1; + + // Èç¹ûÐèҪ¼Èë±ßµÄÆäËû¸½¼ÓÐÅÏ¢ + if(IncInfo) { + // ×îºó¼È븽¼ÓÐÅÏ¢ + Input(*G, &((*G).arcs[i][j].info)); + } + + // Ìî³ä¶Ô³Æµã + (*G).arcs[j][i] = (*G).arcs[i][j]; + } + + // ´ÓÎļþÖжÁÈ¡Êý¾Ýʱ£¬×îºóÆäʵӦµ±ÅжÏÒ»ÏÂÊÇ·ñ¶Áµ½ÁË×ã¹»µÄÐÅÏ¢ + return OK; +} + +/* + * ¨€¨€¨€¨€¨€¨€¨€¨€ Ëã·¨7.2 ¨€¨€¨€¨€¨€¨€¨€¨€ + * + * ¹¹ÔìÎÞÏòÍø + */ +static Status CreateUDN(MGraph* G) { + int i, j, k; + ArcCell arcs = {INFINITE, NULL}; // ÎÞÏòÍøÃ¿Ìõ±ßµÄ³õʼֵ + VertexType v1, v2; + VRType w; + + if(fp == NULL) { + printf("ÇëÊäÈëÎÞÏòÍøµÄ¶¥µãÊý£º"); + scanf("%d", &((*G).vexnum)); + printf("ÇëÊäÈëÎÞÏòÍøµÄ±ßÊý£º"); + scanf("%d", &((*G).arcnum)); + printf("¸ÃÎÞÏòÍøµÄ±ßÉÏÊÇ·ñ°üº¬ÆäËû¸½¼ÓÐÅÏ¢(0-²»°üº¬©¦1-°üº¬)£º"); + scanf("%d", &IncInfo); + + // ¼Èë¶¥µã¼¯ + printf("Çë¼Èë %d ¸ö¶¥µã£¬²»Í¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º", (*G).vexnum); + for(i = 0; i < (*G).vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(stdin); + scanf("%c", &((*G).vexs[i])); + } + } else { + ReadData(fp, "%d", &((*G).vexnum)); // ¼Èë¶¥µãÊý + ReadData(fp, "%d", &((*G).arcnum)); // ¼Èë±ßÊý + ReadData(fp, "%d", &IncInfo); // ÅжϱßÉÏÊÇ·ñ°üº¬¸½¼ÓÐÅÏ¢ + + // ¼Èë¶¥µã¼¯ + for(i = 0; i < (*G).vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(fp); + ReadData(fp, "%c", &((*G).vexs[i])); + } + } + + // ³õʼ»¯ÎÞÏòÍøµÄÁÚ½Ó¾ØÕó + for(i = 0; i < (*G).vexnum; i++) { + for(j = 0; j < (*G).vexnum; j++) { + (*G).arcs[i][j] = arcs; + } + } + + // ½öÔÚ¿ØÖÆÌ¨Â¼ÈëÐÅϢʱÊä³ö´ËÌáʾ + if(fp == NULL && (*G).arcnum != 0) { + printf("ÇëΪÎÞÏòÍøÒÀ´Î¼Èë %d Ìõ±ß(´øÈ¨Öµ)µÄÐÅÏ¢£¬¶¥µã¼°È¨ÖµÖ®¼äÓÿոñ¸ô¿ª£º\n", (*G).arcnum); + } + + // ¼Èë±ßµÄÐÅÏ¢ + for(k = 0; k < (*G).arcnum; k++) { + if(fp == NULL) { + printf("µÚ %2d Ìõ±ß¼°ÆäȨֵ£º", k + 1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v2); + scanf("%d", &w); + } else { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + skipBlank(fp); + ReadData(fp, "%c%c%d", &v1, &v2, &w); + } + + i = LocateVex(*G, v1); // »ñÈ¡¶¥µãv1ÔÚ¶¥µã¼¯ÖеÄλÖà + j = LocateVex(*G, v2); // »ñÈ¡¶¥µãv2ÔÚ¶¥µã¼¯ÖеÄλÖà + + // ÔÚÖ¸¶¨µÄ¶¥µã¹ØÏµÉϼǼȨֵ(×¢£ºÕâÀïûÓÐÑé֤ϱêÊÇ·ñÔ½½ç) + (*G).arcs[i][j].adj = w; + + // Èç¹ûÐèҪ¼Èë±ßµÄÆäËû¸½¼ÓÐÅÏ¢ + if(IncInfo) { + // ×îºó¼È븽¼ÓÐÅÏ¢ + Input(*G, &((*G).arcs[i][j].info)); + } + + // Ìî³ä¶Ô³Æµã + (*G).arcs[j][i] = (*G).arcs[i][j]; + } + + // ´ÓÎļþÖжÁÈ¡Êý¾Ýʱ£¬×îºóÆäʵӦµ±ÅжÏÒ»ÏÂÊÇ·ñ¶Áµ½ÁË×ã¹»µÄÐÅÏ¢ + return OK; +} + +/* + * ¼Èë±ß/»¡µÄÏà¹Ø¸½¼ÓÐÅÏ¢ + */ +static void Input(MGraph G, InfoType** info) { + //¼Èë±ß/»¡µÄÐÅÏ¢£¬±¾²âÊÔÉæ¼°µ½µÄ±ß/»¡Ä¬ÈÏÎÞÆäËû¸½¼ÓÐÅÏ¢ +} + +/* + * ²éÕÒ + * + * ·µ»Ø¶¥µãuÔÚͼ/ÍøÖеÄλÖà + */ +int LocateVex(MGraph G, VertexType u) { + int i; + + for(i = 0; i < G.vexnum; i++) { + if(G.vexs[i] == u) { + return i; + } + } + + return -1; +} + +/* + * ÒÔͼÐλ¯ÐÎʽÊä³öµ±Ç°½á¹¹ + * + * ×¢£ºÔÚͼ/ÍøÖУ¬Ê¹ÓÃ"-"À´±íʾÁ½¶¥µã²»Ö±½ÓÁ¬Í¨ + */ +void PrintGraph(MGraph G) { + int i, j; + + if(G.vexnum == 0) { + printf("¿Õͼ£¬ÎÞÐè´òÓ¡£¡\n"); + return; + } + + printf("µ±Ç°Í¼/Íø°üº¬ %2d ¸ö¶¥µã£¬ %2d Ìõ±ß/»¡...\n", G.vexnum, G.arcnum); + + printf(" "); + for(i = 0; i < G.vexnum; i++) { + printf(" %c", G.vexs[i]); + } + printf("\n"); + + for(i = 0; i < G.vexnum; i++) { + printf("%c ", G.vexs[i]); + + for(j = 0; j < G.vexnum; j++) { + if(((G.kind == DG || G.kind == UDG) && G.arcs[i][j].adj == 0) || ((G.kind == DN || G.kind == UDN) && G.arcs[i][j].adj == INFINITE)) { + printf(" -"); + } else { + printf("%3d", G.arcs[i][j].adj); + } + } + + printf("\n"); + } +} diff --git a/Dev-C++/ExerciseBook/07.20/MGraph.h b/Dev-C++/ExerciseBook/07.20/MGraph.h new file mode 100644 index 0000000..fb30392 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.20/MGraph.h @@ -0,0 +1,129 @@ +/*================================= + * ͼµÄÊý×é(ÁÚ½Ó¾ØÕó)´æ´¢±íʾ + * + * °üº¬Ëã·¨: 7.1¡¢7.2¡¢7.4¡¢7.5¡¢7.6 + ==================================*/ + +#ifndef MGRAPH_H +#define MGRAPH_H + +#include +#include // ÌṩºêINT_MAX +#include // Ìṩmemset¡¢strcmp Ô­ÐÍ +#include // Ìṩºêva_list¡¢va_start¡¢va_arg¡¢va_end +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// + +/* + * ×¢£º + * + * ͨ³£À´½²£¬ÎÞȨͼ±»¼ò³ÆÎª¡¾Í¼¡¿£¬ÓÐȨͼ±»¼ò³ÆÎª¡¾Íø¡¿¡£ + * ÎÞÏòͼ/ÍøÖеĶ¥µã¹ØÏµ±»³ÆÎª¡¾±ß¡¿£¬ÓÐÏòͼ/ÍøÖеĶ¥µã¹ØÏµ±»³ÆÎª¡¾»¡¡¿£¬²¢Çø·Ö»¡Í·Ó뻡β¡£ + * ʵ¼Ê±íÊöÖУ¬Î´±Ø»áÑϸñ×ñÊØÒÔÉÏÃüÃû¡£ + */ + +/* ºê¶¨Òå */ +#define INFINITE INT_MAX // ×î´óÖµ£¬ÓÃÀ´±íÊ¾ÍøÖеÄÁ½¸ö¶¥µã²»Ö±½ÓÁ¬½Ó +#define MAX_VERTEX_NUM 26 // ×î´ó¶¥µã¸öÊý + + +// ͼµÄÀàÐÍ +typedef enum { + DG, // 0-ÓÐÏòͼ + DN, // 1-ÓÐÏòÍø(´øÈ¨Öµ) + UDG, // 2-ÎÞÏòͼ + UDN // 3-ÎÞÏòÍø(´øÈ¨Öµ) +} GraphKind; + +// ¶¥µãÀàÐÍ +typedef char VertexType; + +/* + * ¶¥µã¹ØÏµÀàÐÍ + * + * ÔÚÎÞȨͼÖУ¬¸Ãֵͨ³£Îª0»ò1£¬±íʾÁ½¶¥µãÊÇ·ñÖ±½ÓÁ¬Í¨£» + * ÔÚÓÐȨͼÖУ¬¸Ãֵͨ³£ÎªÈ¨Öµ¡£ + */ +typedef int VRType; + +// ±ßµÄÏà¹Ø¸½¼ÓÐÅÏ¢ +typedef struct { + // Èç¹ûÓеϰ£¬ºóÐø»áÌí¼ÓÏàÓ¦µÄÊôÐÔ +} InfoType; + +// ±ßµÄÀàÐÍ£¬Ã¿Ìõ±ßÉÏ¿ÉÄÜÓи½¼ÓÐÅÏ¢info +typedef struct ArcCell { + VRType adj; // ¶¥µã¹ØÏµ£¬ÔÚÓÐȨͼ¸úÎÞȨͼÖеĺ¬Ò岻ͬ + InfoType* info; // ±ßµÄ¸½¼ÓÐÅÏ¢£¬Í¨³£ºöÂÔ +} ArcCell; + +/* ͼ/ÍøµÄÊý×é(ÁÚ½Ó¾ØÕó)´æ´¢±íʾÀàÐͶ¨Òå */ +typedef struct { + VertexType vexs[MAX_VERTEX_NUM]; // ¶¥µãÏòÁ¿ + ArcCell arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; // ÁÚ½Ó¾ØÕó + int vexnum, arcnum; // ͼ/ÍøµÄ¶¥µãÊýºÍ»¡Êý + GraphKind kind; // ͼµÄÀàÐͱêÖ¾ +} MGraph; + + +// ±ß/»¡ÉÏÊÇ·ñ´æÔÚ¸½¼ÓÐÅÏ¢ +extern Boolean IncInfo; + + +/* + * ¨€¨€¨€¨€¨€¨€¨€¨€ Ëã·¨7.1 ¨€¨€¨€¨€¨€¨€¨€¨€ + * + * ´´½¨ + * + *¡¾±¸×¢¡¿ + * + * ½Ì²ÄÖÐĬÈÏ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý¡£ + * ÕâÀïΪÁË·½±ã²âÊÔ£¬±ÜÃâÿ´ÎÔËÐж¼ÊÖ¶¯ÊäÈëÊý¾Ý£¬ + * Òò¶øÔÊÐíÑ¡Ôñ´ÓÔ¤ÉèµÄÎļþpathÖжÁÈ¡²âÊÔÊý¾Ý¡£ + * + * Èç¹ûÐèÒª´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý£¬ÔòpathΪNULL£¬»òpath[kind]Ϊ""¡£ + * Èç¹ûÐèÒª´ÓÎļþÖжÁÈ¡Êý¾Ý£¬ÔòÐèÒªÔÚpathÖÐÌîдÎļþÃûÐÅÏ¢¡£ + */ +Status CreateGraph(MGraph* G, char* path[]); + +/* + * ¹¹ÔìÓÐÏòͼ + */ +static Status CreateDG(MGraph* G); + +/* + * ¹¹ÔìÓÐÏòÍø + */ +static Status CreateDN(MGraph* G); + +/* + * ¹¹ÔìÎÞÏòͼ + */ +static Status CreateUDG(MGraph* G); + +/* + * ¨€¨€¨€¨€¨€¨€¨€¨€ Ëã·¨7.2 ¨€¨€¨€¨€¨€¨€¨€¨€ + * + * ¹¹ÔìÎÞÏòÍø + */ +static Status CreateUDN(MGraph* G); + +/* + * ¼Èë±ßµÄÏà¹Ø¸½¼ÓÐÅÏ¢ + */ +static void Input(MGraph G, InfoType** info); + +/* + * ²éÕÒ + * + * ·µ»Ø¶¥µãuÔÚͼ/ÍøÖеÄλÖà + */ +int LocateVex(MGraph G, VertexType u); + +/* + * ÒÔͼÐλ¯ÐÎʽÊä³öµ±Ç°½á¹¹ + * + * ×¢£ºÔÚͼ/ÍøÖУ¬Ê¹ÓÃ"-"À´±íʾÁ½¶¥µã²»Ö±½ÓÁ¬Í¨ + */ +void PrintGraph(MGraph G); + +#endif diff --git a/Dev-C++/ExerciseBook/07.20/TestData_DG.txt b/Dev-C++/ExerciseBook/07.20/TestData_DG.txt new file mode 100644 index 0000000..b8bfff7 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.20/TestData_DG.txt @@ -0,0 +1,6 @@ +ͼÀàÐÍ¡ú0£¨ÓÐÏòͼ£© +¶¥µãÊý¡ú5 +»¡Êý¡ú10 +»¡ÊÇ·ñ´øÓÐÆäËûÐÅÏ¢¡ú0 +¶¥µã¼¯¡ú¡¾A£¬B£¬C£¬D£¬E¡¿ +»¡µÄ¼¯ºÏ¡ú¡¾A£¬B¡¿¡¾A£¬C¡¿¡¾A£¬D¡¿¡¾A£¬E¡¿¡¾B£¬A¡¿¡¾B£¬C¡¿¡¾B£¬D¡¿¡¾B£¬E¡¿¡¾C£¬D¡¿¡¾E£¬D¡¿ \ No newline at end of file diff --git a/Dev-C++/ExerciseBook/07.20/TestData_DN.txt b/Dev-C++/ExerciseBook/07.20/TestData_DN.txt new file mode 100644 index 0000000..bf8212d --- /dev/null +++ b/Dev-C++/ExerciseBook/07.20/TestData_DN.txt @@ -0,0 +1,6 @@ +ͼÀàÐÍ¡ú1£¨ÓÐÏòÍø£© +¶¥µãÊý¡ú5 +»¡Êý¡ú10 +»¡ÊÇ·ñ´øÓÐÆäËûÐÅÏ¢¡ú0 +¶¥µã¼¯¡ú¡¾A£¬B£¬C£¬D£¬E¡¿ +»¡µÄ¼¯ºÏ¡ú¡¾A£¬B£¬5¡¿¡¾A£¬C£¬1¡¿¡¾A£¬D£¬2¡¿¡¾A£¬E£¬6¡¿¡¾B£¬A£¬5¡¿¡¾B£¬C£¬2¡¿¡¾B£¬D£¬8¡¿¡¾B£¬E£¬7¡¿¡¾C£¬D£¬2¡¿¡¾E£¬D£¬3¡¿ \ No newline at end of file diff --git a/Dev-C++/ExerciseBook/07.20/TestData_UDG.txt b/Dev-C++/ExerciseBook/07.20/TestData_UDG.txt new file mode 100644 index 0000000..35622d5 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.20/TestData_UDG.txt @@ -0,0 +1,6 @@ +ͼÀàÐÍ¡ú2£¨ÎÞÏòͼ£© +¶¥µãÊý¡ú5 +±ßÊý¡ú10 +±ßÊÇ·ñ´øÓÐÆäËûÐÅÏ¢¡ú0 +¶¥µã¼¯¡ú¡¾A£¬B£¬C£¬D£¬E¡¿ +±ßµÄ¼¯ºÏ¡ú¡¾A£¬B¡¿¡¾A£¬C¡¿¡¾A£¬D¡¿¡¾A£¬E¡¿¡¾B£¬C¡¿¡¾B£¬D¡¿¡¾B£¬E¡¿¡¾C£¬D¡¿¡¾C£¬E¡¿¡¾D£¬E¡¿ \ No newline at end of file diff --git a/Dev-C++/ExerciseBook/07.20/TestData_UDN.txt b/Dev-C++/ExerciseBook/07.20/TestData_UDN.txt new file mode 100644 index 0000000..eb2425f --- /dev/null +++ b/Dev-C++/ExerciseBook/07.20/TestData_UDN.txt @@ -0,0 +1,6 @@ +ͼÀàÐÍ¡ú3£¨ÎÞÏòÍø£© +¶¥µãÊý¡ú5 +±ßÊý¡ú10 +±ßÊÇ·ñ´øÓÐÆäËûÐÅÏ¢¡ú0 +¶¥µã¼¯¡ú¡¾A£¬B£¬C£¬D£¬E¡¿ +±ßµÄ¼¯ºÏ¡ú¡¾A£¬B£¬1¡¿¡¾A£¬C£¬3¡¿¡¾A£¬D£¬2¡¿¡¾A£¬E£¬1¡¿¡¾B£¬C£¬5¡¿¡¾B£¬D£¬3¡¿¡¾B£¬E£¬6¡¿¡¾C£¬D£¬8¡¿¡¾C£¬E£¬4¡¿¡¾D£¬E£¬7¡¿ \ No newline at end of file diff --git a/Dev-C++/ExerciseBook/07.21/07.21.cpp b/Dev-C++/ExerciseBook/07.21/07.21.cpp new file mode 100644 index 0000000..0b8f01c --- /dev/null +++ b/Dev-C++/ExerciseBook/07.21/07.21.cpp @@ -0,0 +1,75 @@ +#include +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// +#include "ALGraph.h" //**¡ø07 ͼ**// + +/* + * ÅжÏͼGÊÇ·ñ¿É´«µÝ + */ +Status Algo_7_21(ALGraph G); + + +int main(int argc, char* argv[]) { + ALGraph G; + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ´´½¨²¢Êä³öͼ...\n"); + { + char* path[4]; + + path[0] = "TestData_DG.txt"; + path[1] = "TestData_DN.txt"; + path[2] = "TestData_UDG.txt"; + path[3] = "TestData_UDN.txt"; + + CreateGraph(&G, path); + PrintGraph(G); + printf("\n"); + } + + Algo_7_21(G) ? printf("ͼG¿É´«µÝ£¡\n") : printf("ͼG²»¿É´«µÝ£¡\n"); + printf("\n"); + + return 0; +} + + +/* + * ÅжÏͼGÊÇ·ñ¿É´«µÝ + */ +Status Algo_7_21(ALGraph G) { + Status trans; + int x, y, z; + ArcNode* py, * pz, * px; + + // Ô¤ÉèΪ¿É´«µÝ + trans = TRUE; + + // ¶ÔÓÚVÖÐÿ¸öx + for(x = 0; x < G.vexnum; x++) { + // N(x)ÖÐÿ¸öy + for(py = G.vertices[x].firstarc; py != NULL; py = py->nextarc) { + y = py->adjvex; + + for(pz = G.vertices[y].firstarc; pz != NULL; pz = pz->nextarc) { + z = pz->adjvex; + + // ÅųýÓëxÏàµÈµÄz + if(z != x) { + for(px = G.vertices[x].firstarc; px != NULL; px = px->nextarc) { + if(px->adjvex == z) { + break; // ÕÒµ½zºó¼°Ê±Ìø³ö + } + } + + // Èç¹ûz²»ÔÚN(x)ÖÐ + if(px == NULL) { + trans = FALSE; + return trans; + } + } + + } + } + } + + return trans; +} diff --git a/Dev-C++/ExerciseBook/07.21/07.21.dev b/Dev-C++/ExerciseBook/07.21/07.21.dev new file mode 100644 index 0000000..b15bf78 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.21/07.21.dev @@ -0,0 +1,118 @@ +[Project] +FileName=07.21.dev +Name=07.21 +Type=1 +Ver=2 +ObjFiles= +Includes= +Libs= +PrivateResource= +ResourceIncludes= +MakeIncludes= +Compiler= +CppCompiler= +Linker= +IsCpp=0 +Icon= +ExeOutput= +ObjectOutput= +LogOutput= +LogOutputEnabled=0 +OverrideOutput=0 +OverrideOutputName= +HostApplication= +UseCustomMakefile=0 +CustomMakefile= +CommandLine= +Folders= +IncludeVersionInfo=0 +SupportXPThemes=0 +CompilerSet=1 +CompilerSettings=0000000000000000001000000 +UnitCount=7 + +[VersionInfo] +Major=1 +Minor=0 +Release=0 +Build=0 +LanguageID=1033 +CharsetID=1252 +CompanyName= +FileVersion= +FileDescription=Developed using the Dev-C++ IDE +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion= +AutoIncBuildNr=0 +SyncProduct=1 + +[Unit1] +FileName=07.21.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit2] +FileName=ALGraph.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit3] +FileName=ALGraph.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit4] +FileName=TestData_DG.txt +Folder= +Compile=0 +Link=0 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit5] +FileName=TestData_DN.txt +Folder= +Compile=0 +Link=0 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit6] +FileName=TestData_UDG.txt +Folder= +Compile=0 +Link=0 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit7] +FileName=TestData_UDN.txt +Folder= +Compile=0 +Link=0 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + diff --git a/Dev-C++/ExerciseBook/07.21/07.21.png b/Dev-C++/ExerciseBook/07.21/07.21.png new file mode 100644 index 0000000000000000000000000000000000000000..29a4418760cc5fd0d0e3904258af3a0fd49246d9 GIT binary patch literal 16161 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 literal 0 HcmV?d00001 diff --git a/Dev-C++/ExerciseBook/07.21/ALGraph.cpp b/Dev-C++/ExerciseBook/07.21/ALGraph.cpp new file mode 100644 index 0000000..d0f6788 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.21/ALGraph.cpp @@ -0,0 +1,570 @@ +/*================== + * ͼµÄÁÚ½Ó±í´æ´¢±íʾ + ===================*/ + +#include "ALGraph.h" + +// ¼ÈëÊý¾ÝµÄÔ´Îļþ£»fpΪnullʱ£¬ËµÃ÷ÐèÒª´Ó¿ØÖÆÌ¨Â¼Èë +static FILE* fp = NULL; + +/* + * IncInfoָʾ¸Ãͼ/ÍøµÄ±ß/»¡ÉÏÊÇ·ñ´æÔÚ¸½¼ÓÐÅÏ¢¡£ + * Èç¹ûÆäÖµ²»Îª0£¬Ôò±íʾÎÞ¸½¼ÓÐÅÏ¢£¬·ñÔò£¬±íʾ´æÔÚ¸½¼ÓÐÅÏ¢¡£ + */ +Boolean IncInfo = FALSE; + +// ·ÃÎʱêÖ¾Êý×飬¼Ç¼·ÃÎʹýµÄ¶¥µã +static Boolean visited[MAX_VERTEX_NUM]; + +// º¯Êý±äÁ¿ +static Status (* VisitFunc)(VertexType e); + + +/* + * ´´½¨ + * + *¡¾±¸×¢¡¿ + * + * ½Ì²ÄÖÐĬÈÏ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý¡£ + * ÕâÀïΪÁË·½±ã²âÊÔ£¬±ÜÃâÿ´ÎÔËÐж¼ÊÖ¶¯ÊäÈëÊý¾Ý£¬ + * Òò¶øÔÊÐíÑ¡Ôñ´ÓÔ¤ÉèµÄÎļþpathÖжÁÈ¡²âÊÔÊý¾Ý¡£ + * + * Èç¹ûÐèÒª´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý£¬ÔòpathΪNULL£¬»òpath[kind]Ϊ""¡£ + * Èç¹ûÐèÒª´ÓÎļþÖжÁÈ¡Êý¾Ý£¬ÔòÐèÒªÔÚpathÖÐÌîдÎļþÃûÐÅÏ¢¡£ + */ +Status CreateGraph(ALGraph* G, char* path[]) { + int readFromConsole; // ÊÇ·ñ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý + int kind; + Status flag; + + printf("ÇëÊäÈëͼµÄÀàÐÍ(0-ÓÐÏòͼ ©¦ 1-ÓÐÏòÍø ©¦ 2-ÎÞÏòͼ ©¦ 3-ÎÞÏòÍø)£º"); + scanf("%d", &kind); + + // ÀàÐͲ»ºÏ¹æ + if(kind < 0 || kind > 3) { + return ERROR; + } + + // Èç¹ûûÓÐÎļþ·¾¶ÐÅÏ¢£¬Ôò´Ó¿ØÖÆÌ¨¶ÁÈ¡ÊäÈë + readFromConsole = (path == NULL) || strcmp(path[kind], "") == 0; + + // ÐèÒª´ÓÎļþ¶ÁÈ¡ + if(readFromConsole) { + (*G).kind = GraphKind(kind); // ¼Ç¼ͼ/ÍøµÄÀàÐÍ + } else { + // ´ò¿ªÎļþ£¬×¼±¸¶ÁÈ¡²âÊÔÊý¾Ý + fp = fopen(path[kind], "r"); + if(fp == NULL) { + return ERROR; + } + + // ¼ÈëͼµÄÀàÐÍ + ReadData(fp, "%d", &((*G).kind)); + } + + // Ëæ»ú´´½¨ÓÐÏòͼ/Íø»òÎÞÏòͼ/ÍøµÄÒ»ÖÖ + switch((*G).kind) { + case DG: + flag = CreateDG(G); + break; + case DN: + flag = CreateDN(G); + break; + case UDG: + flag = CreateUDG(G); + break; + case UDN: + flag = CreateUDN(G); + break; + default: + flag = ERROR; + break; + } + + if(fp != NULL) { + fclose(fp); + fp = NULL; + } + + return flag; +} + +/* + * ¹¹ÔìÓÐÏòͼ + */ +static Status CreateDG(ALGraph* G) { + int i, k; + int vexnum, arcnum; + VertexType v1, v2; + InfoType* info = NULL; + + (*G).vexnum = (*G).arcnum = 0; + + if(fp == NULL) { + printf("ÇëÊäÈëÓÐÏòͼµÄ¶¥µãÊý£º"); + scanf("%d", &vexnum); + printf("ÇëÊäÈëÓÐÏòͼµÄ»¡Êý£º"); + scanf("%d", &arcnum); + printf("¸ÃÓÐÏòͼµÄ»¡ÉÏÊÇ·ñ°üº¬ÆäËû¸½¼ÓÐÅÏ¢(0-²»°üº¬©¦1-°üº¬)£º"); + scanf("%d", &IncInfo); + + // ¼Èë¶¥µã¼¯ + printf("Çë¼Èë %d ¸ö¶¥µã£¬²»Í¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º", vexnum); + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(stdin); + scanf("%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } else { + ReadData(fp, "%d", &vexnum); // ¼Èë¶¥µãÊý + ReadData(fp, "%d", &arcnum); // ¼È뻡Êý + ReadData(fp, "%d", &IncInfo); // Åжϻ¡ÉÏÊÇ·ñ°üº¬¸½¼ÓÐÅÏ¢ + + // ¼Èë¶¥µã¼¯ + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(fp); + ReadData(fp, "%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } + + // ½öÔÚ¿ØÖÆÌ¨Â¼ÈëÐÅϢʱÊä³ö´ËÌáʾ + if(fp == NULL && arcnum != 0) { + printf("ÇëΪÓÐÏòͼÒÀ´Î¼Èë %d Ìõ»¡µÄÐÅÏ¢£¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º\n", arcnum); + } + + // ¼È뻡µÄÐÅÏ¢ + for(k = 0; k < arcnum; k++) { + if(fp == NULL) { + printf("µÚ %2d Ìõ»¡£º", k + 1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v2); + } else { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + skipBlank(fp); + ReadData(fp, "%c%c", &v1, &v2); + } + + // Èç¹ûÐèҪ¼È뻡µÄÆäËû¸½¼ÓÐÅÏ¢ + if(IncInfo) { + // ×îºó¼È븽¼ÓÐÅÏ¢ + Input(*G, &info); + } + + // ²åÈ뻡 + InsertArc(G, v1, v2, info); + } + + // ´ÓÎļþÖжÁÈ¡Êý¾Ýʱ£¬×îºóÆäʵӦµ±ÅжÏÒ»ÏÂÊÇ·ñ¶Áµ½ÁË×ã¹»µÄÐÅÏ¢ + return OK; +} + +/* + * ¹¹ÔìÓÐÏòÍø + */ +static Status CreateDN(ALGraph* G) { + int i, k; + int vexnum, arcnum; + VertexType v1, v2; + InfoType* info = NULL; + + (*G).vexnum = (*G).arcnum = 0; + + if(fp == NULL) { + printf("ÇëÊäÈëÓÐÏòÍøµÄ¶¥µãÊý£º"); + scanf("%d", &vexnum); + printf("ÇëÊäÈëÓÐÏòÍøµÄ»¡Êý£º"); + scanf("%d", &arcnum); + printf("¸ÃÓÐÏòÍøµÄ»¡ÉϱØÐë°üº¬ÆäËû¸½¼ÓÐÅÏ¢£¬ÒòΪ´Ë´¦µÄȨֵÐèÒª´æ´¢µ½¸½¼ÓÐÅÏ¢ÖÐ...\n"); + IncInfo = 1; + + // ¼Èë¶¥µã¼¯ + printf("Çë¼Èë %d ¸ö¶¥µã£¬²»Í¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º", vexnum); + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(stdin); + scanf("%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } else { + ReadData(fp, "%d", &vexnum); // ¼Èë¶¥µãÊý + ReadData(fp, "%d", &arcnum); // ¼È뻡Êý + ReadData(fp, "%d", &IncInfo);// Åжϻ¡ÉÏÊÇ·ñ°üº¬¸½¼ÓÐÅÏ¢(´Ë´¦Ó¦µ±°üº¬) + IncInfo = 1; // Ç¿ÖÆ½«È¨ÖµÂ¼Èëµ½¸½¼ÓÐÅÏ¢ÖÐ + + // ¼Èë¶¥µã¼¯ + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(fp); + ReadData(fp, "%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } + + // ½öÔÚ¿ØÖÆÌ¨Â¼ÈëÐÅϢʱÊä³ö´ËÌáʾ + if(fp == NULL && arcnum != 0) { + printf("ÇëΪÓÐÏòÍøÒÀ´Î¼Èë %d Ìõ»¡(´øÈ¨Öµ)µÄÐÅÏ¢£¬¶¥µã¼°È¨ÖµÖ®¼äÓÿոñ¸ô¿ª£º\n", arcnum); + } + + // ¼È뻡µÄÐÅÏ¢ + for(k = 0; k < arcnum; k++) { + if(fp == NULL) { + printf("µÚ %2d Ìõ»¡¼°ÆäȨֵ£º", k + 1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v2); + } else { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + skipBlank(fp); + ReadData(fp, "%c%c", &v1, &v2); + } + + // Èç¹ûÐèҪ¼È뻡µÄÆäËû¸½¼ÓÐÅÏ¢ + if(IncInfo) { + // ×îºó¼È븽¼ÓÐÅÏ¢(´Ë´¦ÐèҪ¼ÈëÍøµÄȨֵ) + Input(*G, &info); + } + + // ²åÈ뻡 + InsertArc(G, v1, v2, info); + } + + // ´ÓÎļþÖжÁÈ¡Êý¾Ýʱ£¬×îºóÆäʵӦµ±ÅжÏÒ»ÏÂÊÇ·ñ¶Áµ½ÁË×ã¹»µÄÐÅÏ¢ + return OK; +} + +/* + * ¹¹ÔìÎÞÏòͼ + */ +static Status CreateUDG(ALGraph* G) { + int i, k; + int vexnum, arcnum; + VertexType v1, v2; + InfoType* info = NULL; + + (*G).vexnum = (*G).arcnum = 0; + + if(fp == NULL) { + printf("ÇëÊäÈëÎÞÏòͼµÄ¶¥µãÊý£º"); + scanf("%d", &vexnum); + printf("ÇëÊäÈëÎÞÏòͼµÄ±ßÊý£º"); + scanf("%d", &arcnum); + printf("¸ÃÎÞÏòͼµÄ±ßÉÏÊÇ·ñ°üº¬ÆäËû¸½¼ÓÐÅÏ¢(0-²»°üº¬©¦1-°üº¬)£º"); + scanf("%d", &IncInfo); + + // ¼Èë¶¥µã¼¯ + printf("Çë¼Èë %d ¸ö¶¥µã£¬²»Í¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º", vexnum); + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(stdin); + scanf("%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } else { + ReadData(fp, "%d", &vexnum); // ¼Èë¶¥µãÊý + ReadData(fp, "%d", &arcnum); // ¼Èë±ßÊý + ReadData(fp, "%d", &IncInfo);// ÅжϱßÉÏÊÇ·ñ°üº¬¸½¼ÓÐÅÏ¢ + + // ¼Èë¶¥µã¼¯ + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(fp); + ReadData(fp, "%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } + + // ½öÔÚ¿ØÖÆÌ¨Â¼ÈëÐÅϢʱÊä³ö´ËÌáʾ + if(fp == NULL && arcnum != 0) { + printf("ÇëΪÎÞÏòͼÒÀ´Î¼Èë %d Ìõ±ßµÄÐÅÏ¢£¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º\n", arcnum); + } + + // ¼Èë±ßµÄÐÅÏ¢ + for(k = 0; k < arcnum; k++) { + if(fp == NULL) { + printf("µÚ %2d Ìõ±ß£º", k + 1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v2); + } else { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + skipBlank(fp); + ReadData(fp, "%c%c", &v1, &v2); + } + + // Èç¹ûÐèҪ¼Èë±ßµÄÆäËû¸½¼ÓÐÅÏ¢ + if(IncInfo) { + // ×îºó¼È븽¼ÓÐÅÏ¢ + Input(*G, &info); + + } + + // ²åÈë±ß + InsertArc(G, v1, v2, info); + } + + // ´ÓÎļþÖжÁÈ¡Êý¾Ýʱ£¬×îºóÆäʵӦµ±ÅжÏÒ»ÏÂÊÇ·ñ¶Áµ½ÁË×ã¹»µÄÐÅÏ¢ + return OK; +} + +/* + * ¹¹ÔìÎÞÏòÍø + */ +static Status CreateUDN(ALGraph* G) { + int i, k; + int vexnum, arcnum; + VertexType v1, v2; + InfoType* info = NULL; + + (*G).vexnum = (*G).arcnum = 0; + + if(fp == NULL) { + printf("ÇëÊäÈëÎÞÏòÍøµÄ¶¥µãÊý£º"); + scanf("%d", &vexnum); + printf("ÇëÊäÈëÎÞÏòÍøµÄ±ßÊý£º"); + scanf("%d", &arcnum); + printf("¸ÃÎÞÏòÍøµÄ±ßÉϱØÐë°üº¬ÆäËû¸½¼ÓÐÅÏ¢£¬ÒòΪ´Ë´¦µÄȨֵÐèÒª´æ´¢µ½¸½¼ÓÐÅÏ¢ÖÐ...\n"); + IncInfo = 1; + + // ¼Èë¶¥µã¼¯ + printf("Çë¼Èë %d ¸ö¶¥µã£¬²»Í¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º", vexnum); + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(stdin); + scanf("%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } else { + ReadData(fp, "%d", &vexnum); // ¼Èë¶¥µãÊý + ReadData(fp, "%d", &arcnum); // ¼Èë±ßÊý + ReadData(fp, "%d", &IncInfo);// ÅжϱßÉÏÊÇ·ñ°üº¬¸½¼ÓÐÅÏ¢ + IncInfo = 1; // Ç¿ÖÆ½«È¨ÖµÂ¼Èëµ½¸½¼ÓÐÅÏ¢ÖÐ + + // ¼Èë¶¥µã¼¯ + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(fp); + ReadData(fp, "%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } + + // ½öÔÚ¿ØÖÆÌ¨Â¼ÈëÐÅϢʱÊä³ö´ËÌáʾ + if(fp == NULL && arcnum != 0) { + printf("ÇëΪÎÞÏòÍøÒÀ´Î¼Èë %d Ìõ±ß(´øÈ¨Öµ)µÄÐÅÏ¢£¬¶¥µã¼°È¨ÖµÖ®¼äÓÿոñ¸ô¿ª£º\n", arcnum); + } + + // ¼Èë±ßµÄÐÅÏ¢ + for(k = 0; k < arcnum; k++) { + if(fp == NULL) { + printf("µÚ %2d Ìõ±ß¼°ÆäȨֵ£º", k + 1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v2); + } else { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + skipBlank(fp); + ReadData(fp, "%c%c", &v1, &v2); + } + + // Èç¹ûÐèҪ¼Èë±ßµÄÆäËû¸½¼ÓÐÅÏ¢ + if(IncInfo) { + // ×îºó¼È븽¼ÓÐÅÏ¢(´Ë´¦ÐèҪ¼ÈëÍøµÄȨֵ) + Input(*G, &info); + } + + // ²åÈë±ß + InsertArc(G, v1, v2, info); + } + + // ´ÓÎļþÖжÁÈ¡Êý¾Ýʱ£¬×îºóÆäʵӦµ±ÅжÏÒ»ÏÂÊÇ·ñ¶Áµ½ÁË×ã¹»µÄÐÅÏ¢ + return OK; +} + +/* + * ¼Èë±ß/»¡µÄÏà¹Ø¸½¼ÓÐÅÏ¢ + */ +static void Input(ALGraph G, InfoType** info) { + int weight; + + // ÔÚ"Íø"µÄÇéÐÎÏÂÐèҪ¼ÈëȨֵÐÅÏ¢ + if(G.kind == DN || G.kind == UDN) { + *info = (InfoType*) malloc(sizeof(InfoType)); + + if(fp == NULL) { + scanf("%d", &weight); + } else { + ReadData(fp, "%d", &weight); + } + + (*info)->weight = weight; + } +} + +/* + * ²éÕÒ + * + * ·µ»Ø¶¥µãuÔÚͼ/ÍøÖеÄλÖà + */ +int LocateVex(ALGraph G, VertexType u) { + int i; + + for(i = 0; i < G.vexnum; i++) { + if(G.vertices[i].data == u) { + return i; + } + } + + return -1; +} + +/* + * ¹¹ÔìÒ»¸ö±ß/»¡½áµã(½öÏÞÄÚ²¿Ê¹ÓÃ) + */ +static ArcNode* newArcNodePtr(int adjvex, ArcNode* nextarc, InfoType* info) { + ArcNode* p = (ArcNode*) malloc(sizeof(ArcNode)); + if(!p) { + exit(OVERFLOW); + } + + p->adjvex = adjvex; + + p->nextarc = nextarc; + + p->info = info; + + return p; +} + +/* + * ²åÈë±ß/»¡ + * + * Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬Ôò²åÈëÒ»Ìõ»¡ÐèÒªÔö¼ÓÁ½¸ö¶¥µã¹ØÏµ£¬µ«»¡µÄÊýÁ¿Ö»ÔöÒ»¡£ + * ¶ÔÓÚͼ/ÍøÀ´Ëµ£¬¿ÉÒÔÔڿɱä²ÎÊýÖÐÁгö±ß/»¡µÄ¸½¼ÓÐÅÏ¢¡£ + * + * ×¢£º´Ë´¦½ÓÊյIJÎÊýÓëMGraphÓÐЩ²»Ò»Ñù£ºÍøµÄ¸½¼ÓÐÅÏ¢Öаüº¬Á˸÷Ìõ±ß/»¡µÄȨֵ¡£ + */ +Status InsertArc(ALGraph* G, VertexType v, VertexType w, ...) { + int tail, head, k, count; + ArcNode* r; + ArcNode* pre; + Boolean overlay = FALSE; // ÊÇ·ñΪ¸²¸ÇÌí¼Ó + InfoType* info = NULL; // ±ß/»¡µÄ¸½¼ÓÐÅÏ¢ + va_list ap; + + tail = LocateVex(*G, v); // »ñÈ¡¶¥µãvÔÚ¶¥µã¼¯ÖеÄλÖà + if(tail == -1) { + return ERROR; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + head = LocateVex(*G, w); // »ñÈ¡¶¥µãwÔÚ¶¥µã¼¯ÖеÄλÖà + if(head == -1) { + return ERROR; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + // ¾Ü¾ø»· + if(tail == head) { + return ERROR; + } + + // Èç¹û±ß/»¡ÉÏ´æÔÚ¸½¼ÓÐÅÏ¢ + if(IncInfo) { + va_start(ap, w); // ÔÚwºó²éѯÊ׸ö¿É±ä²ÎÊý + info = va_arg(ap, InfoType*); // »ñÈ¡¸½¼ÓÐÅÏ¢ + va_end(ap); + } + + /* ½ÓÏÂÀ´£¬ÐèÒª²éÕÒºÏÊʵIJåÈëλÖà */ + + for(count = 0; count < 2; count++) { + pre = NULL; + // Ö¸ÏòÒÔtailΪβµÄÊ×Ìõ±ß/»¡ + r = G->vertices[tail].firstarc; + while(r != NULL && r->adjvex < head) { + pre = r; + r = r->nextarc; + } + + // Óöµ½ÁËÏàͬλÖõĽáµã + if(r != NULL && r->adjvex == head) { + r->info = info; // ¸´Óøýáµã + overlay = TRUE; // ·¢ÉúÁ˸²¸Ç + } else { + if(pre == NULL) { + G->vertices[tail].firstarc = newArcNodePtr(head, r, info); + } else { + pre->nextarc = newArcNodePtr(head, r, info); + } + } + + // Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬ÐèÒª¿¼ÂǶԳÆÐÔ + if((G->kind == UDG || G->kind == UDN) && tail != head) { + // µßµ¹iºÍj + k = tail; + tail = head; + head = k; + } else { + break; // Èç¹ûÊÇÓÐÏòµÄ£¬¿ÉÒÔ½áÊøÁË + } + } + + // ÔڷǸ²¸ÇµÄÇéÐÎÏ£¬²Å¿¼ÂǸüбß/»¡µÄÊýÁ¿ + if(!overlay) { + (*G).arcnum++; // ²»ÂÛÓÐÏòÎÞÏò£¬±ß/»¡ÊýÖ»ÔöÒ» + } + + return OK; +} + +/* + * ÒÔͼÐλ¯ÐÎʽÊä³öµ±Ç°½á¹¹ + */ +void PrintGraph(ALGraph G) { + int i; + ArcNode* p; + + if(G.vexnum == 0) { + printf("¿Õͼ£¬ÎÞÐè´òÓ¡£¡\n"); + return; + } + + printf("µ±Ç°Í¼/Íø°üº¬ %2d ¸ö¶¥µã£¬ %2d Ìõ±ß/»¡...\n", G.vexnum, G.arcnum); + + for(i = 0; i < G.vexnum; i++) { + printf("%c ===> ", G.vertices[i].data); + + p = G.vertices[i].firstarc; + while(p != NULL) { + if(IncInfo == 0) { + printf("%c ", G.vertices[p->adjvex].data); + + // ¶ÔÓÚÍø£¬»á´ÓÆä¸½¼ÓÐÅÏ¢ÖлñÈ¡µ½È¨Öµ + } else { + printf("%c[%2d] ", G.vertices[p->adjvex].data, p->info->weight); + } + + p = p->nextarc; + + if(p != NULL) { + printf("- "); + } + } + + printf("\n"); + } +} diff --git a/Dev-C++/ExerciseBook/07.21/ALGraph.h b/Dev-C++/ExerciseBook/07.21/ALGraph.h new file mode 100644 index 0000000..aa625ae --- /dev/null +++ b/Dev-C++/ExerciseBook/07.21/ALGraph.h @@ -0,0 +1,143 @@ +/*================== + * ͼµÄÁÚ½Ó±í´æ´¢±íʾ + ===================*/ + +#ifndef ALGRAPH_H +#define ALGRAPH_H + +#include +#include // Ìṩmemset¡¢strcmp Ô­ÐÍ +#include // Ìṩºêva_list¡¢va_start¡¢va_arg¡¢va_end +#include // Ìṩmalloc¡¢realloc¡¢free¡¢exitÔ­ÐÍ +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// + +/* + * ×¢£º + * + * ͨ³£À´½²£¬ÎÞȨͼ±»¼ò³ÆÎª¡¾Í¼¡¿£¬ÓÐȨͼ±»¼ò³ÆÎª¡¾Íø¡¿¡£ + * ÎÞÏòͼ/ÍøÖеĶ¥µã¹ØÏµ±»³ÆÎª¡¾±ß¡¿£¬ÓÐÏòͼ/ÍøÖеĶ¥µã¹ØÏµ±»³ÆÎª¡¾»¡¡¿£¬²¢Çø·Ö»¡Í·Ó뻡β¡£ + * ʵ¼Ê±íÊöÖУ¬Î´±Ø»áÑϸñ×ñÊØÒÔÉÏÃüÃû¡£ + * + * µ±Ç°½á¹¹Êʺϴ洢±ß/»¡±È½ÏÏ¡ÊèµÄͼ/Íø¡£ + * + * ¡ï ²åÈë±ß/»¡µÄÐÅϢʱ£¬ÕâÀïµÄʵÏÖÊǰ´"ÉýÐò"²åÈëµÄ£¬ÕâʹµÃ²åÈëµÄ»¡Êǰ´"ÉýÐò"ÅÅÁеġ£ + */ + + +/* ºê¶¨Òå */ +#define MAX_VERTEX_NUM 26 // ×î´ó¶¥µã¸öÊý + + +// ͼµÄÀàÐÍ +typedef enum { + DG, // 0-ÓÐÏòͼ + DN, // 1-ÓÐÏòÍø(´øÈ¨Öµ) + UDG, // 2-ÎÞÏòͼ + UDN // 3-ÎÞÏòÍø(´øÈ¨Öµ) +} GraphKind; + +// ¶¥µãÀàÐÍ +typedef char VertexType; + +// ±ß/»¡µÄÏà¹Ø¸½¼ÓÐÅÏ¢ +typedef struct { + /* + * ×¢£º + * ½Ì²ÄÖиø³öµÄ½á¹¹Ö»¿¼ÂÇÁËÎÞȨͼ£¬¶øÃ»¿¼ÂÇÓÐȨͼ(Íø)¡£ + * ÕâÀïΪÁ˰ѡ°Íø¡±µÄÇéÐÎÒ²¿¼ÂǽøÈ¥£¬ÌØÔÚ¸½¼ÓÐÅÏ¢ÖÐÔö¼ÓÁË"È¨ÖØ"ÊôÐÔ¡£ + */ + int weight; +} InfoType; + +/* ±ß/»¡½áµã */ +typedef struct ArcNode { + int adjvex; // ¸Ã»¡ËùÖ¸ÏòµÄ¶¥µãµÄλÖà + struct ArcNode* nextarc; // Ö¸ÏòÏÂÒ»Ìõ»¡µÄÖ¸Õë + InfoType* info; // »¡µÄ¸½¼ÓÐÅÏ¢£¬Í¨³£ºöÂÔ +} ArcNode; + +// ÿ¸öÁ´±íµÄÍ·½áµã +typedef struct VNode { + VertexType data; // ¶¥µãÐÅÏ¢ + ArcNode* firstarc; // Ö¸ÏòµÚÒ»ÌõÒÀ¸½¸Ã¶¥µãµÄ»¡µÄÖ¸Õë +} VNode; + +/* ͼµÄÁÚ½Ó±í´æ´¢±íʾÀàÐͶ¨Òå */ +typedef struct { + VNode vertices[MAX_VERTEX_NUM]; // ÁÚ½Ó±í + int vexnum, arcnum; // ͼ/ÍøµÄ¶¥µãÊýºÍ»¡Êý + GraphKind kind; // ͼµÄÀàÐͱêÖ¾ +} ALGraph; + + +// ±ß/»¡ÉÏÊÇ·ñ´æÔÚ¸½¼ÓÐÅÏ¢ +extern Boolean IncInfo; + + +/* + * ´´½¨ + * + *¡¾±¸×¢¡¿ + * + * ½Ì²ÄÖÐĬÈÏ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý¡£ + * ÕâÀïΪÁË·½±ã²âÊÔ£¬±ÜÃâÿ´ÎÔËÐж¼ÊÖ¶¯ÊäÈëÊý¾Ý£¬ + * Òò¶øÔÊÐíÑ¡Ôñ´ÓÔ¤ÉèµÄÎļþpathÖжÁÈ¡²âÊÔÊý¾Ý¡£ + * + * Èç¹ûÐèÒª´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý£¬ÔòpathΪNULL£¬»òpath[kind]Ϊ""¡£ + * Èç¹ûÐèÒª´ÓÎļþÖжÁÈ¡Êý¾Ý£¬ÔòÐèÒªÔÚpathÖÐÌîдÎļþÃûÐÅÏ¢¡£ + */ +Status CreateGraph(ALGraph* G, char* path[]); + +/* + * ¹¹ÔìÓÐÏòͼ + */ +static Status CreateDG(ALGraph* G); + +/* + * ¹¹ÔìÓÐÏòÍø + */ +static Status CreateDN(ALGraph* G); + +/* + * ¹¹ÔìÎÞÏòͼ + */ +static Status CreateUDG(ALGraph* G); + +/* + * ¹¹ÔìÎÞÏòÍø + */ +static Status CreateUDN(ALGraph* G); + +/* + * ¼Èë±ß/»¡µÄÏà¹Ø¸½¼ÓÐÅÏ¢ + */ +static void Input(ALGraph G, InfoType** info); + +/* + * ²éÕÒ + * + * ·µ»Ø¶¥µãuÔÚͼ/ÍøÖеÄλÖà + */ +int LocateVex(ALGraph G, VertexType u); + +/* + * ¹¹ÔìÒ»¸ö±ß/»¡½áµã(½öÏÞÄÚ²¿Ê¹ÓÃ) + */ +static ArcNode* newArcNodePtr(int adjvex, ArcNode* nextarc, InfoType* info); + +/* + * ²åÈë±ß/»¡ + * + * Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬Ôò²åÈëÒ»Ìõ»¡ÐèÒªÔö¼ÓÁ½¸ö¶¥µã¹ØÏµ£¬µ«»¡µÄÊýÁ¿Ö»ÔöÒ»¡£ + * ¶ÔÓÚͼ/ÍøÀ´Ëµ£¬¿ÉÒÔÔڿɱä²ÎÊýÖÐÁгö±ß/»¡µÄ¸½¼ÓÐÅÏ¢¡£ + * + * ×¢£º´Ë´¦½ÓÊյIJÎÊýÓëMGraphÓÐЩ²»Ò»Ñù£ºÍøµÄ¸½¼ÓÐÅÏ¢Öаüº¬Á˸÷Ìõ±ß/»¡µÄȨֵ¡£ + */ +Status InsertArc(ALGraph* G, VertexType v, VertexType w, ...); + +/* + * ÒÔͼÐλ¯ÐÎʽÊä³öµ±Ç°½á¹¹ + */ +void PrintGraph(ALGraph G); + +#endif diff --git a/Dev-C++/ExerciseBook/07.21/TestData_DG.txt b/Dev-C++/ExerciseBook/07.21/TestData_DG.txt new file mode 100644 index 0000000..b8bfff7 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.21/TestData_DG.txt @@ -0,0 +1,6 @@ +ͼÀàÐÍ¡ú0£¨ÓÐÏòͼ£© +¶¥µãÊý¡ú5 +»¡Êý¡ú10 +»¡ÊÇ·ñ´øÓÐÆäËûÐÅÏ¢¡ú0 +¶¥µã¼¯¡ú¡¾A£¬B£¬C£¬D£¬E¡¿ +»¡µÄ¼¯ºÏ¡ú¡¾A£¬B¡¿¡¾A£¬C¡¿¡¾A£¬D¡¿¡¾A£¬E¡¿¡¾B£¬A¡¿¡¾B£¬C¡¿¡¾B£¬D¡¿¡¾B£¬E¡¿¡¾C£¬D¡¿¡¾E£¬D¡¿ \ No newline at end of file diff --git a/Dev-C++/ExerciseBook/07.21/TestData_DN.txt b/Dev-C++/ExerciseBook/07.21/TestData_DN.txt new file mode 100644 index 0000000..ad267ed --- /dev/null +++ b/Dev-C++/ExerciseBook/07.21/TestData_DN.txt @@ -0,0 +1,6 @@ +ͼÀàÐÍ¡ú1£¨ÓÐÏòÍø£© +¶¥µãÊý¡ú5 +»¡Êý¡ú10 +»¡ÊÇ·ñ´øÓÐÆäËûÐÅÏ¢¡ú1 +¶¥µã¼¯¡ú¡¾A£¬B£¬C£¬D£¬E¡¿ +»¡µÄ¼¯ºÏ¡ú¡¾A£¬B£¬5¡¿¡¾A£¬C£¬1¡¿¡¾A£¬D£¬2¡¿¡¾A£¬E£¬6¡¿¡¾B£¬A£¬5¡¿¡¾B£¬C£¬2¡¿¡¾B£¬D£¬8¡¿¡¾B£¬E£¬7¡¿¡¾C£¬D£¬2¡¿¡¾E£¬D£¬3¡¿ \ No newline at end of file diff --git a/Dev-C++/ExerciseBook/07.21/TestData_UDG.txt b/Dev-C++/ExerciseBook/07.21/TestData_UDG.txt new file mode 100644 index 0000000..35622d5 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.21/TestData_UDG.txt @@ -0,0 +1,6 @@ +ͼÀàÐÍ¡ú2£¨ÎÞÏòͼ£© +¶¥µãÊý¡ú5 +±ßÊý¡ú10 +±ßÊÇ·ñ´øÓÐÆäËûÐÅÏ¢¡ú0 +¶¥µã¼¯¡ú¡¾A£¬B£¬C£¬D£¬E¡¿ +±ßµÄ¼¯ºÏ¡ú¡¾A£¬B¡¿¡¾A£¬C¡¿¡¾A£¬D¡¿¡¾A£¬E¡¿¡¾B£¬C¡¿¡¾B£¬D¡¿¡¾B£¬E¡¿¡¾C£¬D¡¿¡¾C£¬E¡¿¡¾D£¬E¡¿ \ No newline at end of file diff --git a/Dev-C++/ExerciseBook/07.21/TestData_UDN.txt b/Dev-C++/ExerciseBook/07.21/TestData_UDN.txt new file mode 100644 index 0000000..0cd5c13 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.21/TestData_UDN.txt @@ -0,0 +1,6 @@ +ͼÀàÐÍ¡ú3£¨ÎÞÏòÍø£© +¶¥µãÊý¡ú5 +±ßÊý¡ú10 +±ßÊÇ·ñ´øÓÐÆäËûÐÅÏ¢¡ú1 +¶¥µã¼¯¡ú¡¾A£¬B£¬C£¬D£¬E¡¿ +±ßµÄ¼¯ºÏ¡ú¡¾A£¬B£¬1¡¿¡¾A£¬C£¬3¡¿¡¾A£¬D£¬2¡¿¡¾A£¬E£¬1¡¿¡¾B£¬C£¬5¡¿¡¾B£¬D£¬3¡¿¡¾B£¬E£¬6¡¿¡¾C£¬D£¬8¡¿¡¾C£¬E£¬4¡¿¡¾D£¬E£¬7¡¿ \ No newline at end of file diff --git a/Dev-C++/ExerciseBook/07.22-07.23/07.22-07.23.cpp b/Dev-C++/ExerciseBook/07.22-07.23/07.22-07.23.cpp new file mode 100644 index 0000000..bd95121 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.22-07.23/07.22-07.23.cpp @@ -0,0 +1,213 @@ +#include +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// +#include "ALGraph.h" //**¡ø07 ͼ**// + +// ·ÃÎʱêÖ¾Êý×飬¼Ç¼·ÃÎʹýµÄ¶¥µã +static Boolean visited[MAX_VERTEX_NUM]; + + +/* + * ͨ¹ýÉî¶ÈÓÅÏȱéÀú£¬Êä³ö¶¥µãviµ½vjÖ®¼äµÄ·¾¶ + */ +void Algo_7_22(ALGraph G, VertexType vi, VertexType vj); + +/* + * Éî¶ÈÓÅÏȱéÀúͼG£¬²éÕÒ¶¥µãiµ½¶¥µãjÖ®¼äµÄ·¾¶´æÈëpath + */ +static Status DFS_7_22(ALGraph G, int i, int j, int path[MAX_VERTEX_NUM + 1]); + +/* + * ͨ¹ý¹ã¶ÈÓÅÏȱéÀú£¬Êä³ö¶¥µãviµ½vjÖ®¼äµÄ·¾¶ + */ +void Algo_7_23(ALGraph G, VertexType vi, VertexType vj); + +/* + * ¹ã¶ÈÓÅÏȱéÀúͼG£¬²éÕÒ¶¥µãiµ½¶¥µãjÖ®¼äµÄ·¾¶´æÈëpath + */ +static Status BFS_7_23(ALGraph G, int i, int j, int path[MAX_VERTEX_NUM + 1]); + + +int main(int argc, char* argv[]) { + ALGraph G; + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ´´½¨²¢Êä³öͼ...\n"); + { + char* path[4]; + + path[0] = "TestData_DG.txt"; + path[1] = ""; + path[2] = ""; + path[3] = ""; + + CreateGraph(&G, path); + PrintGraph(G); + printf("\n"); + } + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ Ìâ7.22£ºÍ¨¹ýÉî¶ÈÓÅÏȱéÀúÅжÏÁ½¶¥µã¼äÊÇ·ñ´æÔÚ·¾¶...\n"); + { + VertexType vi = 'A'; + VertexType vj = 'F'; + + Algo_7_22(G, vi, vj); + printf("\n"); + } + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ Ìâ7.23£ºÍ¨¹ý¹ã¶ÈÓÅÏȱéÀúÅжÏÁ½¶¥µã¼äÊÇ·ñ´æÔÚ·¾¶...\n"); + { + VertexType vi = 'A'; + VertexType vj = 'F'; + + Algo_7_23(G, vi, vj); + printf("\n"); + } + + return 0; +} + + +/* + * ͨ¹ýÉî¶ÈÓÅÏȱéÀú£¬Åж϶¥µãviµ½vjÖ®¼äÊÇ·ñ´æÔÚ·¾¶ + */ +void Algo_7_22(ALGraph G, VertexType vi, VertexType vj) { + int i, j, k; + int path[MAX_VERTEX_NUM + 1]; + + for(k = 0; k < G.vexnum; k++) { + visited[k] = FALSE; + } + + i = LocateVex(G, vi); + j = LocateVex(G, vj); + + path[0] = 0; + + if(DFS_7_22(G, i, j, path) == ERROR) { + printf("%c µ½ %c Ö®¼ä²»´æÔÚͨ·£¡\n", vi, vj); + return; + } + + printf("%c µ½ %c Ö®¼äµÄͨ·Ϊ£º", vi, vj); + for(k = 1; k <= path[0]; k++) { + printf("%c ", GetVex(G, path[k])); + } + printf("\n"); +} + +/* + * Éî¶ÈÓÅÏȱéÀúͼG£¬²éÕÒ¶¥µãiµ½¶¥µãjÖ®¼äµÄ·¾¶´æÈëpath + */ +static Status DFS_7_22(ALGraph G, int i, int j, int path[MAX_VERTEX_NUM + 1]) { + int w; + + // ½«¶¥µãi¼ÓÈë·¾¶ + visited[i] = TRUE; + path[0]++; + path[path[0]] = i; + + if(i == j) { + return OK; + } + + // ±éÀúviËùÓÐÁÚ½Óµã + for(w = FirstAdjVex(G, GetVex(G, i)); w >= 0; w = NextAdjVex(G, GetVex(G, i), GetVex(G, w))) { + // Ìø¹ýÒÑ·ÃÎʵĶ¥µã + if(visited[w]) { + continue; + } + + // µÝ¹é(Éî¶ÈÓÅÏÈ) + if(DFS_7_22(G, w, j, path) == OK) { + return OK; + } + } + + // ÒÆ³ý¶¥µãi + visited[i] = FALSE; + path[0]--; + + return ERROR; +} + +/* + * ͨ¹ý¹ã¶ÈÓÅÏȱéÀú£¬Åж϶¥µãviµ½vjÖ®¼äÊÇ·ñ´æÔÚ·¾¶ + */ +void Algo_7_23(ALGraph G, VertexType vi, VertexType vj) { + int i, j, k; + int path[MAX_VERTEX_NUM + 1]; + + for(k = 0; k < G.vexnum; k++) { + visited[k] = FALSE; + } + + i = LocateVex(G, vi); + j = LocateVex(G, vj); + + path[0] = 0; + + if(BFS_7_23(G, i, j, path) == ERROR) { + printf("%c µ½ %c Ö®¼ä²»´æÔÚͨ·£¡\n", vi, vj); + return; + } + + printf("%c µ½ %c Ö®¼äµÄͨ·Ϊ£º", vi, vj); + for(k = 1; k <= path[0]; k++) { + printf("%c ", GetVex(G, path[k])); + } + printf("\n"); +} + +/* + * ¹ã¶ÈÓÅÏȱéÀúͼG£¬²éÕÒ¶¥µãiµ½¶¥µãjÖ®¼äµÄ·¾¶´æÈëpath + */ +static Status BFS_7_23(ALGraph G, int i, int j, int path[MAX_VERTEX_NUM + 1]) { + int w; + LinkQueue Q; + QElemType e; + + // ½«¶¥µãi¼ÓÈë·¾¶ + visited[i] = TRUE; + path[0]++; + path[path[0]] = i; + + if(i == j) { + return OK; + } + + // Öÿո¨Öú¶ÓÁÐ + InitQueue(&Q); + + // ±éÀúviËùÓÐÁÚ½Óµã + for(w = FirstAdjVex(G, GetVex(G, i)); w >= 0; w = NextAdjVex(G, GetVex(G, i), GetVex(G, w))) { + // Ìø¹ýÒÑ·ÃÎʵĶ¥µã + if(visited[w]) { + continue; + } + + if(w == j) { + // ½«¶¥µãw¼ÓÈë·¾¶ + visited[w] = TRUE; + path[0]++; + path[path[0]] = w; + return OK; + } + + EnQueue(&Q, w); + } + + // ´ÓÁÚ½Óµã³ö·¢£¬¼ÌÐøÑ°ÕÒÄ¿±ê·¾¶ + while(!QueueEmpty(Q)) { + DeQueue(&Q, &e); + + // µÝ¹é(¹ã¶ÈÓÅÏÈ) + if(BFS_7_23(G, e, j, path) == OK) { + return OK; + } + } + + // ÒÆ³ý¶¥µãi + visited[i] = FALSE; + path[0]--; + + return ERROR; +} diff --git a/Dev-C++/ExerciseBook/07.22-07.23/07.22-07.23.dev b/Dev-C++/ExerciseBook/07.22-07.23/07.22-07.23.dev new file mode 100644 index 0000000..c4827a5 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.22-07.23/07.22-07.23.dev @@ -0,0 +1,111 @@ +[Project] +FileName=07.22-07.23.dev +Name=07.22-07.23 +Type=1 +Ver=2 +ObjFiles= +Includes= +Libs= +PrivateResource= +ResourceIncludes= +MakeIncludes= +Compiler= +CppCompiler= +Linker= +IsCpp=0 +Icon= +ExeOutput= +ObjectOutput= +LogOutput= +LogOutputEnabled=0 +OverrideOutput=0 +OverrideOutputName= +HostApplication= +UseCustomMakefile=0 +CustomMakefile= +CommandLine= +Folders= +IncludeVersionInfo=0 +SupportXPThemes=0 +CompilerSet=1 +CompilerSettings=0000000000000000001000000 +UnitCount=6 + +[VersionInfo] +Major=1 +Minor=0 +Release=0 +Build=0 +LanguageID=1033 +CharsetID=1252 +CompanyName= +FileVersion= +FileDescription=Developed using the Dev-C++ IDE +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion= +AutoIncBuildNr=0 +SyncProduct=1 + +[Unit1] +FileName=07.22-07.23.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit2] +FileName=ALGraph.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit3] +FileName=ALGraph.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit4] +FileName=LinkQueue.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit5] +FileName=LinkQueue.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit6] +FileName=TestData_DG.txt +Folder= +Compile=0 +Link=0 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + diff --git a/Dev-C++/ExerciseBook/07.22-07.23/07.22-07.23.png b/Dev-C++/ExerciseBook/07.22-07.23/07.22-07.23.png new file mode 100644 index 0000000000000000000000000000000000000000..cfe4c39968b1c8e22b3675a030cdf7d1da88b0f6 GIT binary patch literal 8413 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 S1n!XpJoP8qDrNAOsQ&|B!4&TR literal 0 HcmV?d00001 diff --git a/Dev-C++/ExerciseBook/07.22-07.23/ALGraph.cpp b/Dev-C++/ExerciseBook/07.22-07.23/ALGraph.cpp new file mode 100644 index 0000000..d447465 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.22-07.23/ALGraph.cpp @@ -0,0 +1,405 @@ +/*================== + * ͼµÄÁÚ½Ó±í´æ´¢±íʾ + ===================*/ + +#include "ALGraph.h" + +// ¼ÈëÊý¾ÝµÄÔ´Îļþ£»fpΪnullʱ£¬ËµÃ÷ÐèÒª´Ó¿ØÖÆÌ¨Â¼Èë +static FILE* fp = NULL; + +/* + * IncInfoָʾ¸Ãͼ/ÍøµÄ±ß/»¡ÉÏÊÇ·ñ´æÔÚ¸½¼ÓÐÅÏ¢¡£ + * Èç¹ûÆäÖµ²»Îª0£¬Ôò±íʾÎÞ¸½¼ÓÐÅÏ¢£¬·ñÔò£¬±íʾ´æÔÚ¸½¼ÓÐÅÏ¢¡£ + */ +Boolean IncInfo = FALSE; + +// ·ÃÎʱêÖ¾Êý×飬¼Ç¼·ÃÎʹýµÄ¶¥µã +static Boolean visited[MAX_VERTEX_NUM]; + +// º¯Êý±äÁ¿ +static Status (* VisitFunc)(VertexType e); + + +/* + * ´´½¨ + * + *¡¾±¸×¢¡¿ + * + * ½Ì²ÄÖÐĬÈÏ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý¡£ + * ÕâÀïΪÁË·½±ã²âÊÔ£¬±ÜÃâÿ´ÎÔËÐж¼ÊÖ¶¯ÊäÈëÊý¾Ý£¬ + * Òò¶øÔÊÐíÑ¡Ôñ´ÓÔ¤ÉèµÄÎļþpathÖжÁÈ¡²âÊÔÊý¾Ý¡£ + * + * Èç¹ûÐèÒª´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý£¬ÔòpathΪNULL£¬»òpath[kind]Ϊ""¡£ + * Èç¹ûÐèÒª´ÓÎļþÖжÁÈ¡Êý¾Ý£¬ÔòÐèÒªÔÚpathÖÐÌîдÎļþÃûÐÅÏ¢¡£ + */ +Status CreateGraph(ALGraph* G, char* path[]) { + int readFromConsole; // ÊÇ·ñ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý + int kind; + Status flag; + + // ¡ï¡ï¡ï´Ë´¦¹Ì¶¨ÎªÓÐÏòͼ + kind = 0; + + // Èç¹ûûÓÐÎļþ·¾¶ÐÅÏ¢£¬Ôò´Ó¿ØÖÆÌ¨¶ÁÈ¡ÊäÈë + readFromConsole = (path == NULL) || strcmp(path[kind], "") == 0; + + // ÐèÒª´ÓÎļþ¶ÁÈ¡ + if(readFromConsole) { + (*G).kind = GraphKind(kind); // ¼Ç¼ͼ/ÍøµÄÀàÐÍ + } else { + // ´ò¿ªÎļþ£¬×¼±¸¶ÁÈ¡²âÊÔÊý¾Ý + fp = fopen(path[kind], "r"); + if(fp == NULL) { + return ERROR; + } + + // ¼ÈëͼµÄÀàÐÍ + ReadData(fp, "%d", &((*G).kind)); + } + + // Ëæ»ú´´½¨ÓÐÏòͼ/Íø»òÎÞÏòͼ/ÍøµÄÒ»ÖÖ + switch((*G).kind) { + case DG: + flag = CreateDG(G); + break; + default: + flag = ERROR; + break; + } + + if(fp != NULL) { + fclose(fp); + fp = NULL; + } + + return flag; +} + +/* + * ¹¹ÔìÓÐÏòͼ + */ +static Status CreateDG(ALGraph* G) { + int i, k; + int vexnum, arcnum; + VertexType v1, v2; + InfoType* info = NULL; + + (*G).vexnum = (*G).arcnum = 0; + + if(fp == NULL) { + printf("ÇëÊäÈëÓÐÏòͼµÄ¶¥µãÊý£º"); + scanf("%d", &vexnum); + printf("ÇëÊäÈëÓÐÏòͼµÄ»¡Êý£º"); + scanf("%d", &arcnum); + printf("¸ÃÓÐÏòͼµÄ»¡ÉÏÊÇ·ñ°üº¬ÆäËû¸½¼ÓÐÅÏ¢(0-²»°üº¬©¦1-°üº¬)£º"); + scanf("%d", &IncInfo); + + // ¼Èë¶¥µã¼¯ + printf("Çë¼Èë %d ¸ö¶¥µã£¬²»Í¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º", vexnum); + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(stdin); + scanf("%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } else { + ReadData(fp, "%d", &vexnum); // ¼Èë¶¥µãÊý + ReadData(fp, "%d", &arcnum); // ¼È뻡Êý + ReadData(fp, "%d", &IncInfo); // Åжϻ¡ÉÏÊÇ·ñ°üº¬¸½¼ÓÐÅÏ¢ + + // ¼Èë¶¥µã¼¯ + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(fp); + ReadData(fp, "%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } + + // ½öÔÚ¿ØÖÆÌ¨Â¼ÈëÐÅϢʱÊä³ö´ËÌáʾ + if(fp == NULL && arcnum != 0) { + printf("ÇëΪÓÐÏòͼÒÀ´Î¼Èë %d Ìõ»¡µÄÐÅÏ¢£¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º\n", arcnum); + } + + // ¼È뻡µÄÐÅÏ¢ + for(k = 0; k < arcnum; k++) { + if(fp == NULL) { + printf("µÚ %2d Ìõ»¡£º", k + 1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v2); + } else { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + skipBlank(fp); + ReadData(fp, "%c%c", &v1, &v2); + } + + // Èç¹ûÐèҪ¼È뻡µÄÆäËû¸½¼ÓÐÅÏ¢ + if(IncInfo) { + // ×îºó¼È븽¼ÓÐÅÏ¢ + Input(*G, &info); + } + + // ²åÈ뻡 + InsertArc(G, v1, v2, info); + } + + // ´ÓÎļþÖжÁÈ¡Êý¾Ýʱ£¬×îºóÆäʵӦµ±ÅжÏÒ»ÏÂÊÇ·ñ¶Áµ½ÁË×ã¹»µÄÐÅÏ¢ + return OK; +} + +/* + * ¼Èë±ß/»¡µÄÏà¹Ø¸½¼ÓÐÅÏ¢ + */ +static void Input(ALGraph G, InfoType** info) { + int weight; + + // ÔÚ"Íø"µÄÇéÐÎÏÂÐèҪ¼ÈëȨֵÐÅÏ¢ + if(G.kind == DN || G.kind == UDN) { + *info = (InfoType*) malloc(sizeof(InfoType)); + + if(fp == NULL) { + scanf("%d", &weight); + } else { + ReadData(fp, "%d", &weight); + } + + (*info)->weight = weight; + } +} + +/* + * ²éÕÒ + * + * ·µ»Ø¶¥µãuÔÚͼ/ÍøÖеÄλÖà + */ +int LocateVex(ALGraph G, VertexType u) { + int i; + + for(i = 0; i < G.vexnum; i++) { + if(G.vertices[i].data == u) { + return i; + } + } + + return -1; +} + +/* + * ȡֵ + * + * ·µ»ØË÷Òýv´¦µÄ¶¥µãÖµ + */ +VertexType GetVex(ALGraph G, int v) { + if(v < 0 || v >= G.vexnum) { + return '\0'; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + return G.vertices[v].data; +} + +/* + * Ê׸öÁÚ½Óµã + * + * ·µ»Ø¶¥µãvµÄÊ׸öÁÚ½Óµã + */ +int FirstAdjVex(ALGraph G, VertexType v) { + int k; + ArcNode* r; + + // Ê×ÏÈÐèÒªÅжϸö¥µãÊÇ·ñ´æÔÚ + k = LocateVex(G, v); + if(k == -1) { + return -1; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + r = G.vertices[k].firstarc; + if(r == NULL) { + return -1; + } else { + return r->adjvex; + } +} + +/* + * ÏÂÒ»¸öÁÚ½Óµã + * + * ·µ»Ø¶¥µãvµÄ(Ïà¶ÔÓÚwµÄ)ÏÂÒ»¸öÁÚ½Óµã + */ +int NextAdjVex(ALGraph G, VertexType v, VertexType w) { + int kv, kw; + ArcNode* r; + + // Ê×ÏÈÐèÒªÅжϸö¥µãÊÇ·ñ´æÔÚ + kv = LocateVex(G, v); + if(kv == -1) { + return -1; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + // Ê×ÏÈÐèÒªÅжϸö¥µãÊÇ·ñ´æÔÚ + kw = LocateVex(G, w); + if(kw == -1) { + return -1; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + r = G.vertices[kv].firstarc; + if(r == NULL) { + return -1; // Á´±íΪ¿Õ + } + + // ÔÚÁ´±íÖвéÕÒw + while(r != NULL && r->adjvex < kw) { + r = r->nextarc; + } + + // Èç¹ûûÕÒµ½w + if(r == NULL) { + return -1; + } + + // Èç¹ûÕÒµ½ÁËw£¬µ«ÊÇwºóÃæÃ»ÓбðµÄ¶¥µã£¬ÄÇôҲÎÞ·¨·µ»ØÁÚ½Óµã + if(r->adjvex == kw && r->nextarc != NULL) { + return r->nextarc->adjvex; + } + + return -1; +} + +/* + * ¹¹ÔìÒ»¸ö±ß/»¡½áµã(½öÏÞÄÚ²¿Ê¹ÓÃ) + */ +static ArcNode* newArcNodePtr(int adjvex, ArcNode* nextarc, InfoType* info) { + ArcNode* p = (ArcNode*) malloc(sizeof(ArcNode)); + if(!p) { + exit(OVERFLOW); + } + + p->adjvex = adjvex; + + p->nextarc = nextarc; + + p->info = info; + + return p; +} + +/* + * ²åÈë±ß/»¡ + * + * Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬Ôò²åÈëÒ»Ìõ»¡ÐèÒªÔö¼ÓÁ½¸ö¶¥µã¹ØÏµ£¬µ«»¡µÄÊýÁ¿Ö»ÔöÒ»¡£ + * ¶ÔÓÚͼ/ÍøÀ´Ëµ£¬¿ÉÒÔÔڿɱä²ÎÊýÖÐÁгö±ß/»¡µÄ¸½¼ÓÐÅÏ¢¡£ + * + * ×¢£º´Ë´¦½ÓÊյIJÎÊýÓëMGraphÓÐЩ²»Ò»Ñù£ºÍøµÄ¸½¼ÓÐÅÏ¢Öаüº¬Á˸÷Ìõ±ß/»¡µÄȨֵ¡£ + */ +Status InsertArc(ALGraph* G, VertexType v, VertexType w, ...) { + int tail, head, k, count; + ArcNode* r; + ArcNode* pre; + Boolean overlay = FALSE; // ÊÇ·ñΪ¸²¸ÇÌí¼Ó + InfoType* info = NULL; // ±ß/»¡µÄ¸½¼ÓÐÅÏ¢ + va_list ap; + + tail = LocateVex(*G, v); // »ñÈ¡¶¥µãvÔÚ¶¥µã¼¯ÖеÄλÖà + if(tail == -1) { + return ERROR; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + head = LocateVex(*G, w); // »ñÈ¡¶¥µãwÔÚ¶¥µã¼¯ÖеÄλÖà + if(head == -1) { + return ERROR; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + // ¾Ü¾ø»· + if(tail == head) { + return ERROR; + } + + // Èç¹û±ß/»¡ÉÏ´æÔÚ¸½¼ÓÐÅÏ¢ + if(IncInfo) { + va_start(ap, w); // ÔÚwºó²éѯÊ׸ö¿É±ä²ÎÊý + info = va_arg(ap, InfoType*); // »ñÈ¡¸½¼ÓÐÅÏ¢ + va_end(ap); + } + + /* ½ÓÏÂÀ´£¬ÐèÒª²éÕÒºÏÊʵIJåÈëλÖà */ + + for(count = 0; count < 2; count++) { + pre = NULL; + // Ö¸ÏòÒÔtailΪβµÄÊ×Ìõ±ß/»¡ + r = G->vertices[tail].firstarc; + while(r != NULL && r->adjvex < head) { + pre = r; + r = r->nextarc; + } + + // Óöµ½ÁËÏàͬλÖõĽáµã + if(r != NULL && r->adjvex == head) { + r->info = info; // ¸´Óøýáµã + overlay = TRUE; // ·¢ÉúÁ˸²¸Ç + } else { + if(pre == NULL) { + G->vertices[tail].firstarc = newArcNodePtr(head, r, info); + } else { + pre->nextarc = newArcNodePtr(head, r, info); + } + } + + // Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬ÐèÒª¿¼ÂǶԳÆÐÔ + if((G->kind == UDG || G->kind == UDN) && tail != head) { + // µßµ¹iºÍj + k = tail; + tail = head; + head = k; + } else { + break; // Èç¹ûÊÇÓÐÏòµÄ£¬¿ÉÒÔ½áÊøÁË + } + } + + // ÔڷǸ²¸ÇµÄÇéÐÎÏ£¬²Å¿¼ÂǸüбß/»¡µÄÊýÁ¿ + if(!overlay) { + (*G).arcnum++; // ²»ÂÛÓÐÏòÎÞÏò£¬±ß/»¡ÊýÖ»ÔöÒ» + } + + return OK; +} + +/* + * ÒÔͼÐλ¯ÐÎʽÊä³öµ±Ç°½á¹¹ + */ +void PrintGraph(ALGraph G) { + int i; + ArcNode* p; + + if(G.vexnum == 0) { + printf("¿Õͼ£¬ÎÞÐè´òÓ¡£¡\n"); + return; + } + + printf("µ±Ç°Í¼/Íø°üº¬ %2d ¸ö¶¥µã£¬ %2d Ìõ±ß/»¡...\n", G.vexnum, G.arcnum); + + for(i = 0; i < G.vexnum; i++) { + printf("%c ===> ", G.vertices[i].data); + + p = G.vertices[i].firstarc; + while(p != NULL) { + if(IncInfo == 0) { + printf("%c ", G.vertices[p->adjvex].data); + + // ¶ÔÓÚÍø£¬»á´ÓÆä¸½¼ÓÐÅÏ¢ÖлñÈ¡µ½È¨Öµ + } else { + printf("%c[%2d] ", G.vertices[p->adjvex].data, p->info->weight); + } + + p = p->nextarc; + + if(p != NULL) { + printf("- "); + } + } + + printf("\n"); + } +} diff --git a/Dev-C++/ExerciseBook/07.22-07.23/ALGraph.h b/Dev-C++/ExerciseBook/07.22-07.23/ALGraph.h new file mode 100644 index 0000000..beac42a --- /dev/null +++ b/Dev-C++/ExerciseBook/07.22-07.23/ALGraph.h @@ -0,0 +1,150 @@ +/*================== + * ͼµÄÁÚ½Ó±í´æ´¢±íʾ + ===================*/ + +#ifndef ALGRAPH_H +#define ALGRAPH_H + +#include +#include // Ìṩmemset¡¢strcmp Ô­ÐÍ +#include // Ìṩºêva_list¡¢va_start¡¢va_arg¡¢va_end +#include // Ìṩmalloc¡¢realloc¡¢free¡¢exitÔ­ÐÍ +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// +#include "LinkQueue.h" //**¡ø03 Õ»ºÍ¶ÓÁÐ**// + +/* + * ×¢£º + * + * ͨ³£À´½²£¬ÎÞȨͼ±»¼ò³ÆÎª¡¾Í¼¡¿£¬ÓÐȨͼ±»¼ò³ÆÎª¡¾Íø¡¿¡£ + * ÎÞÏòͼ/ÍøÖеĶ¥µã¹ØÏµ±»³ÆÎª¡¾±ß¡¿£¬ÓÐÏòͼ/ÍøÖеĶ¥µã¹ØÏµ±»³ÆÎª¡¾»¡¡¿£¬²¢Çø·Ö»¡Í·Ó뻡β¡£ + * ʵ¼Ê±íÊöÖУ¬Î´±Ø»áÑϸñ×ñÊØÒÔÉÏÃüÃû¡£ + * + * µ±Ç°½á¹¹Êʺϴ洢±ß/»¡±È½ÏÏ¡ÊèµÄͼ/Íø¡£ + * + * ¡ï ²åÈë±ß/»¡µÄÐÅϢʱ£¬ÕâÀïµÄʵÏÖÊǰ´"ÉýÐò"²åÈëµÄ£¬ÕâʹµÃ²åÈëµÄ»¡Êǰ´"ÉýÐò"ÅÅÁеġ£ + */ + + +/* ºê¶¨Òå */ +#define MAX_VERTEX_NUM 26 // ×î´ó¶¥µã¸öÊý + + +// ͼµÄÀàÐÍ +typedef enum { + DG, // 0-ÓÐÏòͼ + DN, // 1-ÓÐÏòÍø(´øÈ¨Öµ) + UDG, // 2-ÎÞÏòͼ + UDN // 3-ÎÞÏòÍø(´øÈ¨Öµ) +} GraphKind; + +// ¶¥µãÀàÐÍ +typedef char VertexType; + +// ±ß/»¡µÄÏà¹Ø¸½¼ÓÐÅÏ¢ +typedef struct { + /* + * ×¢£º + * ½Ì²ÄÖиø³öµÄ½á¹¹Ö»¿¼ÂÇÁËÎÞȨͼ£¬¶øÃ»¿¼ÂÇÓÐȨͼ(Íø)¡£ + * ÕâÀïΪÁ˰ѡ°Íø¡±µÄÇéÐÎÒ²¿¼ÂǽøÈ¥£¬ÌØÔÚ¸½¼ÓÐÅÏ¢ÖÐÔö¼ÓÁË"È¨ÖØ"ÊôÐÔ¡£ + */ + int weight; +} InfoType; + +/* ±ß/»¡½áµã */ +typedef struct ArcNode { + int adjvex; // ¸Ã»¡ËùÖ¸ÏòµÄ¶¥µãµÄλÖà + struct ArcNode* nextarc; // Ö¸ÏòÏÂÒ»Ìõ»¡µÄÖ¸Õë + InfoType* info; // »¡µÄ¸½¼ÓÐÅÏ¢£¬Í¨³£ºöÂÔ +} ArcNode; + +// ÿ¸öÁ´±íµÄÍ·½áµã +typedef struct VNode { + VertexType data; // ¶¥µãÐÅÏ¢ + ArcNode* firstarc; // Ö¸ÏòµÚÒ»ÌõÒÀ¸½¸Ã¶¥µãµÄ»¡µÄÖ¸Õë +} VNode; + +/* ͼµÄÁÚ½Ó±í´æ´¢±íʾÀàÐͶ¨Òå */ +typedef struct { + VNode vertices[MAX_VERTEX_NUM]; // ÁÚ½Ó±í + int vexnum, arcnum; // ͼ/ÍøµÄ¶¥µãÊýºÍ»¡Êý + GraphKind kind; // ͼµÄÀàÐͱêÖ¾ +} ALGraph; + + +// ±ß/»¡ÉÏÊÇ·ñ´æÔÚ¸½¼ÓÐÅÏ¢ +extern Boolean IncInfo; + + +/* + * ´´½¨ + * + *¡¾±¸×¢¡¿ + * + * ½Ì²ÄÖÐĬÈÏ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý¡£ + * ÕâÀïΪÁË·½±ã²âÊÔ£¬±ÜÃâÿ´ÎÔËÐж¼ÊÖ¶¯ÊäÈëÊý¾Ý£¬ + * Òò¶øÔÊÐíÑ¡Ôñ´ÓÔ¤ÉèµÄÎļþpathÖжÁÈ¡²âÊÔÊý¾Ý¡£ + * + * Èç¹ûÐèÒª´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý£¬ÔòpathΪNULL£¬»òpath[kind]Ϊ""¡£ + * Èç¹ûÐèÒª´ÓÎļþÖжÁÈ¡Êý¾Ý£¬ÔòÐèÒªÔÚpathÖÐÌîдÎļþÃûÐÅÏ¢¡£ + */ +Status CreateGraph(ALGraph* G, char* path[]); + +/* + * ¹¹ÔìÓÐÏòͼ + */ +static Status CreateDG(ALGraph* G); + +/* + * ¼Èë±ß/»¡µÄÏà¹Ø¸½¼ÓÐÅÏ¢ + */ +static void Input(ALGraph G, InfoType** info); + +/* + * ²éÕÒ + * + * ·µ»Ø¶¥µãuÔÚͼ/ÍøÖеÄλÖà + */ +int LocateVex(ALGraph G, VertexType u); + +/* + * ȡֵ + * + * ·µ»ØË÷Òýv´¦µÄ¶¥µãÖµ + */ +VertexType GetVex(ALGraph G, int v); + +/* + * Ê׸öÁÚ½Óµã + * + * ·µ»Ø¶¥µãvµÄÊ׸öÁÚ½Óµã + */ +int FirstAdjVex(ALGraph G, VertexType v); + +/* + * ÏÂÒ»¸öÁÚ½Óµã + * + * ·µ»Ø¶¥µãvµÄ(Ïà¶ÔÓÚwµÄ)ÏÂÒ»¸öÁÚ½Óµã + */ +int NextAdjVex(ALGraph G, VertexType v, VertexType w); + +/* + * ¹¹ÔìÒ»¸ö±ß/»¡½áµã(½öÏÞÄÚ²¿Ê¹ÓÃ) + */ +static ArcNode* newArcNodePtr(int adjvex, ArcNode* nextarc, InfoType* info); + +/* + * ²åÈë±ß/»¡ + * + * Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬Ôò²åÈëÒ»Ìõ»¡ÐèÒªÔö¼ÓÁ½¸ö¶¥µã¹ØÏµ£¬µ«»¡µÄÊýÁ¿Ö»ÔöÒ»¡£ + * ¶ÔÓÚͼ/ÍøÀ´Ëµ£¬¿ÉÒÔÔڿɱä²ÎÊýÖÐÁгö±ß/»¡µÄ¸½¼ÓÐÅÏ¢¡£ + * + * ×¢£º´Ë´¦½ÓÊյIJÎÊýÓëMGraphÓÐЩ²»Ò»Ñù£ºÍøµÄ¸½¼ÓÐÅÏ¢Öаüº¬Á˸÷Ìõ±ß/»¡µÄȨֵ¡£ + */ +Status InsertArc(ALGraph* G, VertexType v, VertexType w, ...); + +/* + * ÒÔͼÐλ¯ÐÎʽÊä³öµ±Ç°½á¹¹ + */ +void PrintGraph(ALGraph G); + +#endif diff --git a/Dev-C++/ExerciseBook/07.22-07.23/LinkQueue.cpp b/Dev-C++/ExerciseBook/07.22-07.23/LinkQueue.cpp new file mode 100644 index 0000000..ac47060 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.22-07.23/LinkQueue.cpp @@ -0,0 +1,102 @@ +/*========================= + * ¶ÓÁеÄÁ´Ê½´æ´¢½á¹¹£¨Á´¶Ó£© + ==========================*/ + +#ifndef LINKQUEUE_C +#define LINKQUEUE_C + +#include "LinkQueue.h" //**¡ø03 Õ»ºÍ¶ÓÁÐ**// + +/* + * ³õʼ»¯ + * + * ¹¹ÔìÒ»¸ö¿ÕµÄÁ´¶Ó¡£ + * ³õʼ»¯³É¹¦Ôò·µ»ØOK£¬·ñÔò·µ»ØERROR¡£ + * + *¡¾×¢¡¿ + * ÕâÀïµÄ¶ÓÁдøÓÐÍ·½áµã + */ +Status InitQueue(LinkQueue* Q) { + if(Q == NULL) { + return ERROR; + } + + (*Q).front = (*Q).rear = (QueuePtr) malloc(sizeof(QNode)); + if(!(*Q).front) { + exit(OVERFLOW); + } + + (*Q).front->next = NULL; + + return OK; +} + +/* + * ÅÐ¿Õ + * + * ÅжÏÁ´¶ÓÖÐÊÇ·ñ°üº¬ÓÐЧÊý¾Ý¡£ + * + * ·µ»ØÖµ£º + * TRUE : Á´¶ÓΪ¿Õ + * FALSE: Á´¶Ó²»Îª¿Õ + */ +Status QueueEmpty(LinkQueue Q) { + if(Q.front == Q.rear) { + return TRUE; + } else { + return FALSE; + } +} + +/* + * Èë¶Ó + * + * ½«ÔªËØeÌí¼Óµ½¶ÓÁÐβ²¿¡£ + */ +Status EnQueue(LinkQueue* Q, QElemType e) { + QueuePtr p; + + if(Q == NULL || (*Q).front == NULL) { + return ERROR; + } + + p = (QueuePtr) malloc(sizeof(QNode)); + if(!p) { + exit(OVERFLOW); + } + + p->data = e; + p->next = NULL; + + (*Q).rear->next = p; + (*Q).rear = p; + + return OK; +} + +/* + * ³ö¶Ó + * + * ÒÆ³ý¶ÓÁÐÍ·²¿µÄÔªËØ£¬½«Æä´æ´¢µ½eÖС£ + */ +Status DeQueue(LinkQueue* Q, QElemType* e) { + QueuePtr p; + + if(Q == NULL || (*Q).front == NULL || (*Q).front == (*Q).rear) { + return ERROR; + } + + p = (*Q).front->next; + *e = p->data; + + (*Q).front->next = p->next; + if((*Q).rear == p) { + (*Q).rear = (*Q).front; + } + + free(p); + + return OK; +} + +#endif diff --git a/Dev-C++/ExerciseBook/07.22-07.23/LinkQueue.h b/Dev-C++/ExerciseBook/07.22-07.23/LinkQueue.h new file mode 100644 index 0000000..a380617 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.22-07.23/LinkQueue.h @@ -0,0 +1,64 @@ +/*========================= + * ¶ÓÁеÄÁ´Ê½´æ´¢½á¹¹£¨Á´¶Ó£© + ==========================*/ + +#ifndef LINKQUEUE_H +#define LINKQUEUE_H + +#include +#include // Ìṩmalloc¡¢realloc¡¢free¡¢exitÔ­ÐÍ +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// + +/* Á´¶ÓÔªËØÀàÐͶ¨Òå */ +typedef int QElemType; + +// ¶ÓÁÐÔªËØ½á¹¹ +typedef struct QNode { + QElemType data; + struct QNode* next; +} QNode, * QueuePtr; + +// ¶ÓÁнṹ +typedef struct { + QueuePtr front; // ¶ÓÍ·Ö¸Õë + QueuePtr rear; // ¶ÓβָÕë +} LinkQueue; // ¶ÓÁеÄÁ´Ê½´æ´¢±íʾ + + +/* + * ³õʼ»¯ + * + * ¹¹ÔìÒ»¸ö¿ÕµÄÁ´¶Ó¡£ + * ³õʼ»¯³É¹¦Ôò·µ»ØOK£¬·ñÔò·µ»ØERROR¡£ + * + *¡¾×¢¡¿ + * ÕâÀïµÄ¶ÓÁдøÓÐÍ·½áµã + */ +Status InitQueue(LinkQueue* Q); + +/* + * ÅÐ¿Õ + * + * ÅжÏÁ´¶ÓÖÐÊÇ·ñ°üº¬ÓÐЧÊý¾Ý¡£ + * + * ·µ»ØÖµ£º + * TRUE : Á´¶ÓΪ¿Õ + * FALSE: Á´¶Ó²»Îª¿Õ + */ +Status QueueEmpty(LinkQueue Q); + +/* + * Èë¶Ó + * + * ½«ÔªËØeÌí¼Óµ½¶ÓÁÐβ²¿¡£ + */ +Status EnQueue(LinkQueue* Q, QElemType e); + +/* + * ³ö¶Ó + * + * ÒÆ³ý¶ÓÁÐÍ·²¿µÄÔªËØ£¬½«Æä´æ´¢µ½eÖС£ + */ +Status DeQueue(LinkQueue* Q, QElemType* e); + +#endif diff --git a/Dev-C++/ExerciseBook/07.22-07.23/TestData_DG.txt b/Dev-C++/ExerciseBook/07.22-07.23/TestData_DG.txt new file mode 100644 index 0000000..c17bb67 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.22-07.23/TestData_DG.txt @@ -0,0 +1,6 @@ +ͼÀàÐÍ¡ú0£¨ÓÐÏòͼ£© +¶¥µãÊý¡ú6 +»¡Êý¡ú11 +»¡ÊÇ·ñ´øÓÐÆäËûÐÅÏ¢¡ú0 +¶¥µã¼¯¡ú¡¾A£¬B£¬C£¬D£¬E£¬F¡¿ +»¡µÄ¼¯ºÏ¡ú¡¾A£¬C¡¿¡¾A£¬D¡¿¡¾B£¬D¡¿¡¾C£¬D¡¿¡¾C£¬E¡¿¡¾D£¬C¡¿¡¾E£¬A¡¿¡¾E£¬B¡¿¡¾E£¬F¡¿¡¾F£¬B¡¿¡¾F£¬D¡¿ \ No newline at end of file diff --git a/Dev-C++/ExerciseBook/07.24/07.24.cpp b/Dev-C++/ExerciseBook/07.24/07.24.cpp new file mode 100644 index 0000000..c01fdb0 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.24/07.24.cpp @@ -0,0 +1,91 @@ +#include +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// +#include "SqStack.h" //**¡ø03 Õ»ºÍ¶ÓÁÐ**// +#include "MGraph.h" //**¡ø07 ͼ**// + +// ·ÃÎʱêÖ¾Êý×飬¼Ç¼·ÃÎʹýµÄ¶¥µã +static Boolean visited[MAX_VERTEX_NUM]; + + +/* + * ÀûÓÃÕ»¶ÔÓÐÏòÇ¿Á¬Í¨Í¼½øÐÐÉî¶ÈÓÅÏȱéÀú£¬ + * ϰÌâÖÐÖ¸³ö²»¾ÐÄàÓÚ¾ßÌåµÄͼ½á¹¹£¬µ«ÊÇÕâÀïÒÀ¾É²ÉÓÃÁËÁÚ½Ó¾ØÕó´æ´¢µÄͼ×÷ΪʾÀý¡£ + */ +Status Algo_7_24(MGraph G); + + +int main(int argc, char* argv[]) { + MGraph G; + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ´´½¨²¢Êä³öͼ...\n"); + { + char* path[4]; + + path[0] = "TestData_DG.txt"; + path[1] = ""; + path[2] = ""; + path[3] = ""; + + CreateGraph(&G, path); + PrintGraph(G); + printf("\n"); + } + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ Éî¶ÈÓÅÏȱéÀúͼ...\n"); + { + Algo_7_24(G); + printf("\n"); + } + + return 0; +} + + +/* + * ÀûÓÃÕ»¶ÔÓÐÏòÇ¿Á¬Í¨Í¼½øÐÐÉî¶ÈÓÅÏȱéÀú£¬ + * ϰÌâÖÐÖ¸³ö²»¾ÐÄàÓÚ¾ßÌåµÄͼ½á¹¹£¬µ«ÊÇÕâÀïÒÀ¾É²ÉÓÃÁËÁÚ½Ó¾ØÕó´æ´¢µÄͼ×÷ΪʾÀý¡£ + */ +Status Algo_7_24(MGraph G) { + SqStack S; + SElemType e; + int i; + + if(G.vexnum < 1) { + return ERROR; + } + + for(i = 0; i < G.vexnum; i++) { + visited[i] = FALSE; + } + + InitStack(&S); + + // µÚÒ»¸ö¶¥µãÈëÕ» + Push(&S, 0); + visited[0] = TRUE; + printf("%c ", G.vexs[0]); + + while(!StackEmpty(S)) { + GetTop(S, &e); + + for(i = 0; i < G.vexnum; i++) { + if(G.arcs[e][i].adj!=0 && visited[i]==FALSE) { + Push(&S, i); + visited[i] = TRUE; + printf("%c ", G.vexs[i]); + + // Á¢¿ÌÌø³öµ±Ç°Ñ­»·£¬½øÐÐÏÂÒ»ÂÖÉî¶ÈËÑѰ + break; + } + } + + // Èç¹û¶¥µãeûÓÐδ·ÃÎʵÄÁÚ½ÓµãÁË£¬Ôò½«¸Ã¶¥µã³öÕ» + if(i == G.vexnum) { + Pop(&S, &e); + } + } + + printf("\n"); + + return OK; +} diff --git a/Dev-C++/ExerciseBook/07.24/07.24.dev b/Dev-C++/ExerciseBook/07.24/07.24.dev new file mode 100644 index 0000000..ba47d82 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.24/07.24.dev @@ -0,0 +1,111 @@ +[Project] +FileName=07.24.dev +Name=07.24 +Type=1 +Ver=2 +ObjFiles= +Includes= +Libs= +PrivateResource= +ResourceIncludes= +MakeIncludes= +Compiler= +CppCompiler= +Linker= +IsCpp=0 +Icon= +ExeOutput= +ObjectOutput= +LogOutput= +LogOutputEnabled=0 +OverrideOutput=0 +OverrideOutputName= +HostApplication= +UseCustomMakefile=0 +CustomMakefile= +CommandLine= +Folders= +IncludeVersionInfo=0 +SupportXPThemes=0 +CompilerSet=1 +CompilerSettings=0000000000000000001000000 +UnitCount=6 + +[VersionInfo] +Major=1 +Minor=0 +Release=0 +Build=0 +LanguageID=1033 +CharsetID=1252 +CompanyName= +FileVersion= +FileDescription=Developed using the Dev-C++ IDE +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion= +AutoIncBuildNr=0 +SyncProduct=1 + +[Unit1] +FileName=07.24.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit2] +FileName=MGraph.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit3] +FileName=MGraph.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit4] +FileName=SqStack.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit5] +FileName=SqStack.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit6] +FileName=TestData_DG.txt +Folder= +Compile=0 +Link=0 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + diff --git a/Dev-C++/ExerciseBook/07.24/07.24.png b/Dev-C++/ExerciseBook/07.24/07.24.png new file mode 100644 index 0000000000000000000000000000000000000000..ff528b7b145bad37a63ed8525603b8a93b51006b GIT binary patch literal 12105 zcmb`tbzfD__dX0Fb!g=P(g=bcq(KlwQc9Y$=>`RkC`e05cPZUnn+B1RmXK}*x0X?my1!>^*zU%$hZ^)^)83R92KGfKkHG(9j5EWh7P6(9px69|q11sH8~7 zjt%-lw^fxEM=S25UV&b2nu#fhp`n$9Nb#c#y9vs-~qi%{x_J0Nw zdKV{b8yk3cQc3HicDpoD=eIZnyy!E`bb#RC;1w#9s#N85+A7)<1zmv-yfFHJWd`5` zR~0U{PoWx}N)M1ohX4Osumw^o&e*p_mhDe#^y_X?IC;Mk`6ys(N9Q!R%xbn7BrL%K`zQe=BOw{!=Ag+) zIpXrFu7vYWz3aP&7pHqgS2V6|@owAXj-PFHP{&168@h$j_jdS2-rsl-l3X%PvuI_# zK6khfTj&_%-#Rngm9B4f@ou9YH$}Wt*W%)CSlxx3(Bylz{2+Q`&ypI10cex;tiRDU z3hxDfiet#E_T2XLXM?`#LqEIzOADbN;N+!?PbU4TG|=7M9V(SMkH&}2@#f8&T}NWV zv9U2_fl*X6c}&~T(9m$M(uq)jISz>E$7rHy#4+Hke4UGQ?9k+1aBVELXe(gRf8Umj zJ@FnZ;vI|u?CNW53KO}UWj(IwRUd6{$9lRcKIc6+IB4l$TyE`F%>AOHD4)vdt=;~H z>t(%jeHj0q!J3J>hDP^-ji7Lfe2Vm3PmG9Nj3&DyU$Wx8Nb;aIi-3?TLJ~v@;9EB2 zVDhrJ`kwFp+99>Wlrr{)2Gj6wA-CUg+4J5)vR=asUwVaWZ0{civGsa$lzmtXbU=+! zrY001e#=!(3iBe4myJv|=@Q?cELAKh?&O`U*l~sPYandh5>3Tal^qcFZyN+Js&Z5D zp8XDKEa4+tb)+wsf9d4|7leT}@iK7>bDPT%BQnPRgy-O@@Ao3ylDheq9doq$W&Ld# zd@+_+wHNM;fbUy5guO)$@5x4ctT@lwEvG%*1xB2LL8nf~5xS z-g+Yy#>XM|gf1WXgAQUDh%%ox>SqL3|abck; z_sV9gFb8_08MnqM8&xRI3&5!Q>tdpInaRjv&#Orou{!+IX#1kKgHJAcni~H`>kgA* z=ZgM2Ez)5{z{sasxCV=@{HpTus+`Ys}F`~WlHv9ZfU)JCj2_@euUmaL0< zoj0g&-P5}l(F-s*^!<2_98FmyFA>>Q&{D@_O?JA7<|)Gau+doY>=mpqT1iXI@}((2 z;Yc6YF2v_~LHs7>c||E4lxHcU=7UJ zTkExssecJL0?!guCyZ35f+yE;8$)zL6J3m2>8OUrI8%X1u{(qKdnP;aecbaw4V}6qkcfG$wxr%$4l@*~Ff}^+kgYcc z-oI=q-tOt!kmE4VN9<26*ZWEhaWzo5f3`{`)`={xvJbFS58tYLZE0zDr{FHXq~HA{ zZU4AwK_)T{)}IOX^=h{aiXNJB-#*Xtfg!ZuRGF2@cqFmCK7We}Dh%7V$UB@5F^8K;po!kF_gjF+_$}Yq6+q!8lHX;tD{` zB>lV@677Io^H<$rwKl?O^~jt^btS5wDb&F->ajzC#dMrLAJSr>AR6N z<>loq;R;SUsYtl~S6$%b+y&&vm`yJRS-LAN4=F{gL&|_QYuKyTui4_Ca3p=-oYMeK zTt81(mNy1%6Xtg*L6zcrzG|@IiR0~%u7am$+P^~i-M_u@yJNO{@}w#XgSpVx*LP

=-L3vq)SMxuB^K0oUTLHW6vn{7_@Ts3NF%tv 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 D-4|Tz literal 0 HcmV?d00001 diff --git a/Dev-C++/ExerciseBook/07.24/MGraph.cpp b/Dev-C++/ExerciseBook/07.24/MGraph.cpp new file mode 100644 index 0000000..214a9fd --- /dev/null +++ b/Dev-C++/ExerciseBook/07.24/MGraph.cpp @@ -0,0 +1,219 @@ +/*================================= + * ͼµÄÊý×é(ÁÚ½Ó¾ØÕó)´æ´¢±íʾ + * + * °üº¬Ëã·¨: 7.1¡¢7.2¡¢7.4¡¢7.5¡¢7.6 + ==================================*/ + +#include "MGraph.h" //**¡ø07 ͼ**// + +// ¼ÈëÊý¾ÝµÄÔ´Îļþ£»fpΪnullʱ£¬ËµÃ÷ÐèÒª´Ó¿ØÖÆÌ¨Â¼Èë +static FILE* fp = NULL; + +/* + * IncInfoָʾ¸Ãͼ/ÍøµÄ±ß/»¡ÉÏÊÇ·ñ´æÔÚ¸½¼ÓÐÅÏ¢¡£ + * Èç¹ûÆäÖµ²»Îª0£¬Ôò±íʾÎÞ¸½¼ÓÐÅÏ¢£¬·ñÔò£¬±íʾ´æÔÚ¸½¼ÓÐÅÏ¢¡£ + */ +Boolean IncInfo = FALSE; + +// ·ÃÎʱêÖ¾Êý×飬¼Ç¼·ÃÎʹýµÄ¶¥µã +static Boolean visited[MAX_VERTEX_NUM]; + +// º¯Êý±äÁ¿ +static Status (* VisitFunc)(VertexType e); + + +/* + * ¨€¨€¨€¨€¨€¨€¨€¨€ Ëã·¨7.1 ¨€¨€¨€¨€¨€¨€¨€¨€ + * + * ´´½¨Í¼/±í + * + *¡¾±¸×¢¡¿ + * + * ½Ì²ÄÖÐĬÈÏ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý¡£ + * ÕâÀïΪÁË·½±ã²âÊÔ£¬±ÜÃâÿ´ÎÔËÐж¼ÊÖ¶¯ÊäÈëÊý¾Ý£¬ + * Òò¶øÔÊÐíÑ¡Ôñ´ÓÔ¤ÉèµÄÎļþpathÖжÁÈ¡²âÊÔÊý¾Ý¡£ + * + * Èç¹ûÐèÒª´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý£¬ÔòpathΪNULL£¬»òpath[kind]Ϊ""¡£ + * Èç¹ûÐèÒª´ÓÎļþÖжÁÈ¡Êý¾Ý£¬ÔòÐèÒªÔÚpathÖÐÌîдÎļþÃûÐÅÏ¢¡£ + */ +Status CreateGraph(MGraph* G, char* path[]) { + int readFromConsole; // ÊÇ·ñ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý + int kind; + Status flag; + + // ¡ï¡ï¡ï´Ë´¦¹Ì¶¨ÎªÓÐÏòͼ + kind = 0; + + // Èç¹ûûÓÐÎļþ·¾¶ÐÅÏ¢£¬Ôò´Ó¿ØÖÆÌ¨¶ÁÈ¡ÊäÈë + readFromConsole = (path == NULL) || strcmp(path[kind], "") == 0; + + // ÐèÒª´ÓÎļþ¶ÁÈ¡ + if(readFromConsole) { + (*G).kind = GraphKind(kind); // ¼Ç¼ͼ/ÍøµÄÀàÐÍ + } else { + // ´ò¿ªÎļþ£¬×¼±¸¶ÁÈ¡²âÊÔÊý¾Ý + fp = fopen(path[kind], "r"); + if(fp == NULL) { + return ERROR; + } + + // ¼ÈëͼµÄÀàÐÍ + ReadData(fp, "%d", &((*G).kind)); + } + + // Ëæ»ú´´½¨ÓÐÏòͼ/Íø»òÎÞÏòͼ/ÍøµÄÒ»ÖÖ + switch((*G).kind) { + case DG: + flag = CreateDG(G); + break; + default: + flag = ERROR; + break; + } + + if(fp != NULL) { + fclose(fp); + fp = NULL; + } + + return flag; +} + +/* + * ¹¹ÔìÓÐÏòͼ + */ +static Status CreateDG(MGraph* G) { + int i, j, k; + ArcCell arcs = {0, NULL}; // ÓÐÏòͼÿÌõ±ßµÄ³õʼֵ + VertexType v1, v2; + + if(fp == NULL) { + printf("ÇëÊäÈëÓÐÏòͼµÄ¶¥µãÊý£º"); + scanf("%d", &((*G).vexnum)); + printf("ÇëÊäÈëÓÐÏòͼµÄ»¡Êý£º"); + scanf("%d", &((*G).arcnum)); + printf("¸ÃÓÐÏòͼµÄ»¡ÉÏÊÇ·ñ°üº¬ÆäËû¸½¼ÓÐÅÏ¢(0-²»°üº¬©¦1-°üº¬)£º"); + scanf("%d", &IncInfo); + + // ¼Èë¶¥µã¼¯ + printf("Çë¼Èë %d ¸ö¶¥µã£¬²»Í¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º", (*G).vexnum); + for(i = 0; i < (*G).vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(stdin); + scanf("%c", &((*G).vexs[i])); + } + } else { + ReadData(fp, "%d", &((*G).vexnum)); // ¼Èë¶¥µãÊý + ReadData(fp, "%d", &((*G).arcnum)); // ¼È뻡Êý + ReadData(fp, "%d", &IncInfo); // Åжϻ¡ÉÏÊÇ·ñ°üº¬¸½¼ÓÐÅÏ¢ + + // ¼Èë¶¥µã¼¯ + for(i = 0; i < (*G).vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(fp); + ReadData(fp, "%c", &((*G).vexs[i])); + } + } + + // ³õʼ»¯ÓÐÏòͼµÄÁÚ½Ó¾ØÕó + for(i = 0; i < (*G).vexnum; i++) { + for(j = 0; j < (*G).vexnum; j++) { + (*G).arcs[i][j] = arcs; + } + } + + // ½öÔÚ¿ØÖÆÌ¨Â¼ÈëÐÅϢʱÊä³ö´ËÌáʾ + if(fp == NULL && (*G).arcnum != 0) { + printf("ÇëΪÓÐÏòͼÒÀ´Î¼Èë %d Ìõ»¡µÄÐÅÏ¢£¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º\n", (*G).arcnum); + } + + // ¼È뻡µÄÐÅÏ¢ + for(k = 0; k < (*G).arcnum; k++) { + if(fp == NULL) { + printf("µÚ %2d Ìõ»¡£º", k + 1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v2); + } else { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + skipBlank(fp); + ReadData(fp, "%c%c", &v1, &v2); + } + + i = LocateVex(*G, v1); // »ñÈ¡¶¥µãv1ÔÚ¶¥µã¼¯ÖеÄλÖà + j = LocateVex(*G, v2); // »ñÈ¡¶¥µãv2ÔÚ¶¥µã¼¯ÖеÄλÖà + + // ½«Ö¸¶¨µÄ¶¥µã¹ØÏµÉèÖÃΪ1£¬Ö¸Ê¾ÕâÁ½¸ö¶¥µãÊÇÖ±½ÓÁ¬½ÓµÄ(×¢£ºÕâÀïûÓÐÑé֤ϱêÊÇ·ñÔ½½ç) + (*G).arcs[i][j].adj = 1; + + // Èç¹ûÐèҪ¼È뻡µÄÆäËû¸½¼ÓÐÅÏ¢ + if(IncInfo) { + // ×îºó¼È븽¼ÓÐÅÏ¢ + Input(*G, &((*G).arcs[i][j].info)); + } + } + + // ´ÓÎļþÖжÁÈ¡Êý¾Ýʱ£¬×îºóÆäʵӦµ±ÅжÏÒ»ÏÂÊÇ·ñ¶Áµ½ÁË×ã¹»µÄÐÅÏ¢ + return OK; +} + +/* + * ¼Èë±ß/»¡µÄÏà¹Ø¸½¼ÓÐÅÏ¢ + */ +static void Input(MGraph G, InfoType** info) { + //¼Èë±ß/»¡µÄÐÅÏ¢£¬±¾²âÊÔÉæ¼°µ½µÄ±ß/»¡Ä¬ÈÏÎÞÆäËû¸½¼ÓÐÅÏ¢ +} + +/* + * ²éÕÒ + * + * ·µ»Ø¶¥µãuÔÚͼ/ÍøÖеÄλÖà + */ +int LocateVex(MGraph G, VertexType u) { + int i; + + for(i = 0; i < G.vexnum; i++) { + if(G.vexs[i] == u) { + return i; + } + } + + return -1; +} + +/* + * ÒÔͼÐλ¯ÐÎʽÊä³öµ±Ç°½á¹¹ + * + * ×¢£ºÔÚͼ/ÍøÖУ¬Ê¹ÓÃ"-"À´±íʾÁ½¶¥µã²»Ö±½ÓÁ¬Í¨ + */ +void PrintGraph(MGraph G) { + int i, j; + + if(G.vexnum == 0) { + printf("¿Õͼ£¬ÎÞÐè´òÓ¡£¡\n"); + return; + } + + printf("µ±Ç°Í¼/Íø°üº¬ %2d ¸ö¶¥µã£¬ %2d Ìõ±ß/»¡...\n", G.vexnum, G.arcnum); + + printf(" "); + for(i = 0; i < G.vexnum; i++) { + printf(" %c", G.vexs[i]); + } + printf("\n"); + + for(i = 0; i < G.vexnum; i++) { + printf("%c ", G.vexs[i]); + + for(j = 0; j < G.vexnum; j++) { + if(((G.kind == DG || G.kind == UDG) && G.arcs[i][j].adj == 0) || ((G.kind == DN || G.kind == UDN) && G.arcs[i][j].adj == INFINITE)) { + printf(" -"); + } else { + printf("%3d", G.arcs[i][j].adj); + } + } + + printf("\n"); + } +} diff --git a/Dev-C++/ExerciseBook/07.24/MGraph.h b/Dev-C++/ExerciseBook/07.24/MGraph.h new file mode 100644 index 0000000..7ba1b84 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.24/MGraph.h @@ -0,0 +1,112 @@ +/*================================= + * ͼµÄÊý×é(ÁÚ½Ó¾ØÕó)´æ´¢±íʾ + * + * °üº¬Ëã·¨: 7.1¡¢7.2¡¢7.4¡¢7.5¡¢7.6 + ==================================*/ + +#ifndef MGRAPH_H +#define MGRAPH_H + +#include +#include // ÌṩºêINT_MAX +#include // Ìṩmemset¡¢strcmp Ô­ÐÍ +#include // Ìṩºêva_list¡¢va_start¡¢va_arg¡¢va_end +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// + +/* + * ×¢£º + * + * ͨ³£À´½²£¬ÎÞȨͼ±»¼ò³ÆÎª¡¾Í¼¡¿£¬ÓÐȨͼ±»¼ò³ÆÎª¡¾Íø¡¿¡£ + * ÎÞÏòͼ/ÍøÖеĶ¥µã¹ØÏµ±»³ÆÎª¡¾±ß¡¿£¬ÓÐÏòͼ/ÍøÖеĶ¥µã¹ØÏµ±»³ÆÎª¡¾»¡¡¿£¬²¢Çø·Ö»¡Í·Ó뻡β¡£ + * ʵ¼Ê±íÊöÖУ¬Î´±Ø»áÑϸñ×ñÊØÒÔÉÏÃüÃû¡£ + */ + +/* ºê¶¨Òå */ +#define INFINITE INT_MAX // ×î´óÖµ£¬ÓÃÀ´±íÊ¾ÍøÖеÄÁ½¸ö¶¥µã²»Ö±½ÓÁ¬½Ó +#define MAX_VERTEX_NUM 26 // ×î´ó¶¥µã¸öÊý + + +// ͼµÄÀàÐÍ +typedef enum { + DG, // 0-ÓÐÏòͼ + DN, // 1-ÓÐÏòÍø(´øÈ¨Öµ) + UDG, // 2-ÎÞÏòͼ + UDN // 3-ÎÞÏòÍø(´øÈ¨Öµ) +} GraphKind; + +// ¶¥µãÀàÐÍ +typedef char VertexType; + +/* + * ¶¥µã¹ØÏµÀàÐÍ + * + * ÔÚÎÞȨͼÖУ¬¸Ãֵͨ³£Îª0»ò1£¬±íʾÁ½¶¥µãÊÇ·ñÖ±½ÓÁ¬Í¨£» + * ÔÚÓÐȨͼÖУ¬¸Ãֵͨ³£ÎªÈ¨Öµ¡£ + */ +typedef int VRType; + +// ±ßµÄÏà¹Ø¸½¼ÓÐÅÏ¢ +typedef struct { + // Èç¹ûÓеϰ£¬ºóÐø»áÌí¼ÓÏàÓ¦µÄÊôÐÔ +} InfoType; + +// ±ßµÄÀàÐÍ£¬Ã¿Ìõ±ßÉÏ¿ÉÄÜÓи½¼ÓÐÅÏ¢info +typedef struct ArcCell { + VRType adj; // ¶¥µã¹ØÏµ£¬ÔÚÓÐȨͼ¸úÎÞȨͼÖеĺ¬Ò岻ͬ + InfoType* info; // ±ßµÄ¸½¼ÓÐÅÏ¢£¬Í¨³£ºöÂÔ +} ArcCell; + +/* ͼ/ÍøµÄÊý×é(ÁÚ½Ó¾ØÕó)´æ´¢±íʾÀàÐͶ¨Òå */ +typedef struct { + VertexType vexs[MAX_VERTEX_NUM]; // ¶¥µãÏòÁ¿ + ArcCell arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; // ÁÚ½Ó¾ØÕó + int vexnum, arcnum; // ͼ/ÍøµÄ¶¥µãÊýºÍ»¡Êý + GraphKind kind; // ͼµÄÀàÐͱêÖ¾ +} MGraph; + + +// ±ß/»¡ÉÏÊÇ·ñ´æÔÚ¸½¼ÓÐÅÏ¢ +extern Boolean IncInfo; + + +/* + * ¨€¨€¨€¨€¨€¨€¨€¨€ Ëã·¨7.1 ¨€¨€¨€¨€¨€¨€¨€¨€ + * + * ´´½¨ + * + *¡¾±¸×¢¡¿ + * + * ½Ì²ÄÖÐĬÈÏ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý¡£ + * ÕâÀïΪÁË·½±ã²âÊÔ£¬±ÜÃâÿ´ÎÔËÐж¼ÊÖ¶¯ÊäÈëÊý¾Ý£¬ + * Òò¶øÔÊÐíÑ¡Ôñ´ÓÔ¤ÉèµÄÎļþpathÖжÁÈ¡²âÊÔÊý¾Ý¡£ + * + * Èç¹ûÐèÒª´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý£¬ÔòpathΪNULL£¬»òpath[kind]Ϊ""¡£ + * Èç¹ûÐèÒª´ÓÎļþÖжÁÈ¡Êý¾Ý£¬ÔòÐèÒªÔÚpathÖÐÌîдÎļþÃûÐÅÏ¢¡£ + */ +Status CreateGraph(MGraph* G, char* path[]); + +/* + * ¹¹ÔìÓÐÏòͼ + */ +static Status CreateDG(MGraph* G); + +/* + * ¼Èë±ßµÄÏà¹Ø¸½¼ÓÐÅÏ¢ + */ +static void Input(MGraph G, InfoType** info); + +/* + * ²éÕÒ + * + * ·µ»Ø¶¥µãuÔÚͼ/ÍøÖеÄλÖà + */ +int LocateVex(MGraph G, VertexType u); + +/* + * ÒÔͼÐλ¯ÐÎʽÊä³öµ±Ç°½á¹¹ + * + * ×¢£ºÔÚͼ/ÍøÖУ¬Ê¹ÓÃ"-"À´±íʾÁ½¶¥µã²»Ö±½ÓÁ¬Í¨ + */ +void PrintGraph(MGraph G); + +#endif diff --git a/Dev-C++/ExerciseBook/07.24/SqStack.cpp b/Dev-C++/ExerciseBook/07.24/SqStack.cpp new file mode 100644 index 0000000..f0b3b3d --- /dev/null +++ b/Dev-C++/ExerciseBook/07.24/SqStack.cpp @@ -0,0 +1,106 @@ +/*========================= + * Õ»µÄ˳Ðò´æ´¢½á¹¹£¨Ë³ÐòÕ»£© + ==========================*/ + +#include "SqStack.h" //**¡ø03 Õ»ºÍ¶ÓÁÐ**// + +/* + * ³õʼ»¯ + * + * ¹¹ÔìÒ»¸ö¿ÕÕ»¡£³õʼ»¯³É¹¦Ôò·µ»ØOK£¬·ñÔò·µ»ØERROR¡£ + */ +Status InitStack(SqStack* S) { + if(S == NULL) { + return ERROR; + } + + (*S).base = (SElemType*) malloc(STACK_INIT_SIZE * sizeof(SElemType)); + if((*S).base == NULL) { + exit(OVERFLOW); + } + + (*S).top = (*S).base; + (*S).stacksize = STACK_INIT_SIZE; + + return OK; +} + +/* + * ÅÐ¿Õ + * + * ÅжÏ˳ÐòÕ»ÖÐÊÇ·ñ°üº¬ÓÐЧÊý¾Ý¡£ + * + * ·µ»ØÖµ£º + * TRUE : ˳ÐòջΪ¿Õ + * FALSE: ˳ÐòÕ»²»Îª¿Õ + */ +Status StackEmpty(SqStack S) { + if(S.top == S.base) { + return TRUE; + } else { + return FALSE; + } +} + +/* + * ȡֵ + * + * ·µ»ØÕ»¶¥ÔªËØ£¬²¢ÓÃe½ÓÊÕ¡£ + */ +Status GetTop(SqStack S, SElemType* e) { + if(S.base == NULL || S.top == S.base) { + return 0; + } + + // ²»»á¸Ä±äÕ»ÖÐÔªËØ + *e = *(S.top - 1); + + return OK; +} + +/* + * ÈëÕ» + * + * ½«ÔªËØeѹÈëµ½Õ»¶¥¡£ + */ +Status Push(SqStack* S, SElemType e) { + if(S == NULL || (*S).base == NULL) { + return ERROR; + } + + // Õ»Âúʱ£¬×·¼Ó´æ´¢¿Õ¼ä + if((*S).top - (*S).base >= (*S).stacksize) { + (*S).base = (SElemType*) realloc((*S).base, ((*S).stacksize + STACKINCREMENT) * sizeof(SElemType)); + if((*S).base == NULL) { + exit(OVERFLOW); // ´æ´¢·ÖÅäʧ°Ü + } + + (*S).top = (*S).base + (*S).stacksize; + (*S).stacksize += STACKINCREMENT; + } + + // ½øÕ»Ïȸ³Öµ£¬Õ»¶¥Ö¸ÕëÔÙ×ÔÔö + *(S->top++) = e; + + return OK; +} + +/* + * ³öÕ» + * + * ½«Õ»¶¥ÔªËص¯³ö£¬²¢ÓÃe½ÓÊÕ¡£ + */ +Status Pop(SqStack* S, SElemType* e) { + if(S == NULL || (*S).base == NULL) { + return ERROR; + } + + if((*S).top == (*S).base) { + return ERROR; + } + + // ³öÕ»Õ»¶¥Ö¸ÕëÏȵݼõ£¬ÔÙ¸³Öµ + *e = *(--(*S).top); + + return OK; +} diff --git a/Dev-C++/ExerciseBook/07.24/SqStack.h b/Dev-C++/ExerciseBook/07.24/SqStack.h new file mode 100644 index 0000000..a7a5f21 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.24/SqStack.h @@ -0,0 +1,66 @@ +/*========================= + * Õ»µÄ˳Ðò´æ´¢½á¹¹£¨Ë³ÐòÕ»£© + ==========================*/ + +#ifndef SQSTACK_H +#define SQSTACK_H + +#include +#include // Ìṩmalloc¡¢realloc¡¢free¡¢exitÔ­ÐÍ +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// + +/* ºê¶¨Òå */ +#define STACK_INIT_SIZE 100 // ˳ÐòÕ»´æ´¢¿Õ¼äµÄ³õʼ·ÖÅäÁ¿ +#define STACKINCREMENT 10 // ˳ÐòÕ»´æ´¢¿Õ¼äµÄ·ÖÅäÔöÁ¿ + +/* ˳ÐòÕ»ÔªËØÀàÐͶ¨Òå */ +typedef int SElemType; + +// ˳ÐòÕ»ÔªËØ½á¹¹ +typedef struct { + SElemType* base; // Õ»µ×Ö¸Õë + SElemType* top; // Õ»¶¥Ö¸Õë + int stacksize; // µ±Ç°ÒÑ·ÖÅäµÄ´æ´¢¿Õ¼ä£¬ÒÔÔªËØÎªµ¥Î» +} SqStack; + + +/* + * ³õʼ»¯ + * + * ¹¹ÔìÒ»¸ö¿ÕÕ»¡£³õʼ»¯³É¹¦Ôò·µ»ØOK£¬·ñÔò·µ»ØERROR¡£ + */ +Status InitStack(SqStack* S); + +/* + * ÅÐ¿Õ + * + * ÅжÏ˳ÐòÕ»ÖÐÊÇ·ñ°üº¬ÓÐЧÊý¾Ý¡£ + * + * ·µ»ØÖµ£º + * TRUE : ˳ÐòջΪ¿Õ + * FALSE: ˳ÐòÕ»²»Îª¿Õ + */ +Status StackEmpty(SqStack S); + +/* + * ȡֵ + * + * ·µ»ØÕ»¶¥ÔªËØ£¬²¢ÓÃe½ÓÊÕ¡£ + */ +Status GetTop(SqStack S, SElemType* e); + +/* + * ÈëÕ» + * + * ½«ÔªËØeѹÈëµ½Õ»¶¥¡£ + */ +Status Push(SqStack* S, SElemType e); + +/* + * ³öÕ» + * + * ½«Õ»¶¥ÔªËص¯³ö£¬²¢ÓÃe½ÓÊÕ¡£ + */ +Status Pop(SqStack* S, SElemType* e); + +#endif diff --git a/Dev-C++/ExerciseBook/07.24/TestData_DG.txt b/Dev-C++/ExerciseBook/07.24/TestData_DG.txt new file mode 100644 index 0000000..e330f24 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.24/TestData_DG.txt @@ -0,0 +1,6 @@ +ͼÀàÐÍ¡ú0£¨ÓÐÏòͼ£© +¶¥µãÊý¡ú10 +»¡Êý¡ú14 +»¡ÊÇ·ñ´øÓÐÆäËûÐÅÏ¢¡ú0 +¶¥µã¼¯¡ú¡¾A£¬B£¬C£¬D£¬E£¬F£¬G£¬H£¬I£¬J¡¿ +»¡µÄ¼¯ºÏ¡ú¡¾A£¬C¡¿¡¾C£¬D¡¿¡¾D£¬A¡¿¡¾A£¬B¡¿¡¾D£¬E¡¿¡¾E£¬F¡¿¡¾E£¬H¡¿¡¾F£¬D¡¿¡¾F£¬G¡¿¡¾G£¬H¡¿¡¾H£¬E¡¿¡¾B£¬J¡¿¡¾J£¬I¡¿¡¾I£¬B¡¿ \ No newline at end of file diff --git a/Dev-C++/ExerciseBook/07.25/07.25.cpp b/Dev-C++/ExerciseBook/07.25/07.25.cpp new file mode 100644 index 0000000..9fa230d --- /dev/null +++ b/Dev-C++/ExerciseBook/07.25/07.25.cpp @@ -0,0 +1,134 @@ +#include +#include "Graph.h" + +// ·ÃÎʱêÖ¾ +typedef enum { + UnVisited, // δ·ÃÎÊ + Visited, // ÒÑ·ÃÎÊ + InPath, // ÔÚ·¾¶ÉÏ +} FLAG; + +// ·ÃÎʱêÖ¾Êý×飬¼Ç¼·ÃÎʹýµÄ¶¥µã +static FLAG flags[MAX_VERTEX_NUM]; + + +/* + * ÕÒ³öÓÐÏòͼÖеĻØÂ· + */ +void Algo_7_25(Graph G); + +/* + * ´Óstart¶¥µã¿ªÊ¼²éÕÒ»ØÂ·¡£ + * + * pathÓÃÀ´´æ´¢Â·¹ýµÄ¶¥µã£¬path[0]´æ´¢pathÖеĶ¥µãÊýÁ¿¡£ + * + * Èç¹ûÕÒµ½»ØÂ·£¬·µ»Ø»ØÂ·Æðʼ¶¥µãµÄÐòºÅ£» + * Èç¹ûûÕÒµ½»ØÂ·£¬Ôò·µ»Ø-1¡£ + */ +int Circuit_7_25(Graph G, int start, int path[MAX_VERTEX_NUM + 1]); + + +int main(int argc, char* argv[]) { + Graph G; + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ´´½¨²¢Êä³öͼ...\n"); + { + char* path = "TestData_DG.txt"; + + CreateGraph(&G, path); + PrintGraph(G); + printf("\n"); + } + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ²éÕÒͼÖеĻØÂ·...\n"); + { + Algo_7_25(G); + printf("\n"); + } + + return 0; +} + + +/* + * ÕÒ³öÓÐÏòͼÖеĻØÂ· + */ +void Algo_7_25(Graph G) { + int i, w = -1; + int path[MAX_VERTEX_NUM + 1]; // 0ºÅµ¥ÔªÓÃÀ´¼Ç¼pathÖд洢µÄ¶¥µãÊýÁ¿ + + // °ÑËùÓж¥µã±ê¼ÇΪδ·ÃÎÊ + for(i = 0; i < G.vexnum; i++) { + flags[i] = UnVisited; + } + + path[0] = 0; + + for(i = 0; i < G.vexnum; i++) { + w = Circuit_7_25(G, i, path); + + if(w != -1) { + break; // Èç¹ûÕÒµ½ÁËÈÎÒâÒ»Ìõ»ØÂ·£¬Ìø³öÑ­»· + } + } + + if(w == -1) { + printf("¸ø¶¨µÄÓÐÏòͼÖв»´æÔÚ»ØÂ·£¡\n"); + return; + } + + printf("ÓÐÏòͼÖÐÕÒµ½µÄÊ×Ìõ»ØÂ·Îª£º"); + for(i = 1; path[i] != w; i++) { + // ѰÕÒ»ØÂ·Æðµã + } + // ÕÒµ½ÁË»ØÂ·Æðµã + if(path[i] == w) { + while(i <= path[0]) { + printf("%c -> ", G.vexs[path[i]]); + i++; + } + printf("%c\n", G.vexs[w]); + } +} + +/* + * ´Óstart¶¥µã¿ªÊ¼²éÕÒ»ØÂ·¡£ + * + * pathÓÃÀ´´æ´¢Â·¹ýµÄ¶¥µã£¬path[0]´æ´¢pathÖеĶ¥µãÊýÁ¿¡£ + * + * Èç¹ûÕÒµ½»ØÂ·£¬·µ»Ø»ØÂ·Æðʼ¶¥µãµÄÐòºÅ£» + * Èç¹ûûÕÒµ½»ØÂ·£¬Ôò·µ»Ø-1¡£ + */ +int Circuit_7_25(Graph G, int start, int path[MAX_VERTEX_NUM]) { + int i; + int v, w; + + path[0]++; + path[path[0]] = start; + flags[start] = InPath; // ±ê¼Ç¸Ã¶¥µãÒѽøÈë·¾¶ + + // ±éÀú¶¥µãstartµÄÁÚ½Óµã + for(i = G.fst[start]; i <= G.lst[start]; i++) { + v = G.s[i]; // »ñÈ¡ÁÚ½ÓµãÐòºÅ + + // Èç¹ûÓöµ½ÁËÒÑÔÚ·¾¶ÖеÄÁڽӵ㣬˵Ã÷³öÏÖÁË»ØÂ· + if(flags[v] == InPath) { + return v; + + // ºöÂÔÒÑ·ÃÎʵÄÁÚ½Óµã + } else if(flags[v] == Visited) { + continue; + } else { + w = Circuit_7_25(G, v, path); + if(w != -1) { + return w; + } + } + } + + // ´Ó·¾¶ÖÐÒÆ³ý¸Ã¶¥µã£¬²¢½«Æä״̬½µ¼¶Îª"ÒÑ·ÃÎÊ" + path[0]--; + flags[start] = Visited; + + return -1; +} diff --git a/Dev-C++/ExerciseBook/07.25/07.25.dev b/Dev-C++/ExerciseBook/07.25/07.25.dev new file mode 100644 index 0000000..21a0f3c --- /dev/null +++ b/Dev-C++/ExerciseBook/07.25/07.25.dev @@ -0,0 +1,91 @@ +[Project] +FileName=07.25.dev +Name=07.25 +Type=1 +Ver=2 +ObjFiles= +Includes= +Libs= +PrivateResource= +ResourceIncludes= +MakeIncludes= +Compiler= +CppCompiler= +Linker= +IsCpp=0 +Icon= +ExeOutput= +ObjectOutput= +LogOutput= +LogOutputEnabled=0 +OverrideOutput=0 +OverrideOutputName= +HostApplication= +UseCustomMakefile=0 +CustomMakefile= +CommandLine= +Folders= +IncludeVersionInfo=0 +SupportXPThemes=0 +CompilerSet=1 +CompilerSettings=0000000000000000001000000 +UnitCount=4 + +[VersionInfo] +Major=1 +Minor=0 +Release=0 +Build=0 +LanguageID=1033 +CharsetID=1252 +CompanyName= +FileVersion= +FileDescription=Developed using the Dev-C++ IDE +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion= +AutoIncBuildNr=0 +SyncProduct=1 + +[Unit1] +FileName=07.25.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit2] +FileName=Graph.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit3] +FileName=Graph.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit4] +FileName=TestData_DG.txt +Folder= +Compile=0 +Link=0 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + diff --git a/Dev-C++/ExerciseBook/07.25/07.25.png b/Dev-C++/ExerciseBook/07.25/07.25.png new file mode 100644 index 0000000000000000000000000000000000000000..d902081ad316df7ba5f6b9180d24562b0c8d4b2d GIT binary patch literal 8338 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 ARR910 literal 0 HcmV?d00001 diff --git a/Dev-C++/ExerciseBook/07.25/Graph.cpp b/Dev-C++/ExerciseBook/07.25/Graph.cpp new file mode 100644 index 0000000..5642088 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.25/Graph.cpp @@ -0,0 +1,164 @@ +/*================================= + * ÓÉÌâ7.25µÄÃèÊö´´½¨µÄÒ»ÖÖÓÐÏòͼ½á¹¹ + ==================================*/ + +#include "Graph.h" + +// ¼ÈëÊý¾ÝµÄÔ´Îļþ£»fpΪnullʱ£¬ËµÃ÷ÐèÒª´Ó¿ØÖÆÌ¨Â¼Èë +static FILE* fp = NULL; + + +/* + * ´´½¨ÓÐÏòͼ + * + * pathΪNULL»òΪ""ʱ£¬´Ó¿ØÖÆÌ¨¶ÁȡͼµÄ³õʼ»¯ÐÅÏ¢¡£ + * ·ñÔò£¬´ÓÔ¤ÉèµÄÎļþÖжÁȡͼµÄ³õʼ»¯ÐÅÏ¢¡£ + */ +Status CreateGraph(Graph* G, char* path) { + int readFromConsole; // ÊÇ·ñ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý + + // Èç¹ûûÓÐÎļþ·¾¶ÐÅÏ¢£¬Ôò´Ó¿ØÖÆÌ¨¶ÁÈ¡ÊäÈë + readFromConsole = path == NULL || strcmp(path, "") == 0; + + // ÐèÒª´ÓÎļþ¶ÁÈ¡ + if(!readFromConsole) { + // ´ò¿ªÎļþ£¬×¼±¸¶ÁÈ¡²âÊÔÊý¾Ý + fp = fopen(path, "r"); + if(fp == NULL) { + return ERROR; + } + } + + Create(G); + + if(fp != NULL) { + fclose(fp); + fp = NULL; + } + + return OK; +} + +/* + * ´´½¨ÓÐÏòͼµÄºËÐÄËã·¨ + */ +static void Create(Graph* G) { + int i, j, k; + VertexType v1, v2; + Boolean adjs[MAX_VERTEX_NUM][MAX_VERTEX_NUM] = {FALSE}; // ¼Ç¼ÁÚ½ÓµãÐÅÏ¢ + int cur; + + // ´Ó¿ØÖÆÌ¨¶ÁÈ¡ + if(fp == NULL) { + printf("ÇëÊäÈëÓÐÏòͼµÄ¶¥µãÊý£º"); + scanf("%d", &((*G).vexnum)); + printf("ÇëÊäÈëÓÐÏòͼµÄ»¡Êý£º"); + scanf("%d", &((*G).arcnum)); + + // ¼Èë¶¥µã¼¯ + printf("Çë¼Èë %d ¸ö¶¥µã£¬²»Í¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º", (*G).vexnum); + for(i = 0; i < (*G).vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(stdin); + scanf("%c", &((*G).vexs[i])); + } + + // ´ÓÎļþ¶ÁÈ¡ + } else { + ReadData(fp, "%d", &((*G).vexnum)); // ¼Èë¶¥µãÊý + ReadData(fp, "%d", &((*G).arcnum)); // ¼È뻡Êý + + // ¼Èë¶¥µã¼¯ + for(i = 0; i < (*G).vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(fp); + ReadData(fp, "%c", &((*G).vexs[i])); + } + } + + // ½öÔÚ¿ØÖÆÌ¨Â¼ÈëÐÅϢʱÊä³ö´ËÌáʾ + if(fp == NULL && (*G).arcnum != 0) { + printf("ÇëΪÓÐÏòͼÒÀ´Î¼Èë %d Ìõ»¡µÄÐÅÏ¢£¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º\n", (*G).arcnum); + } + + // ¼È뻡µÄÐÅÏ¢ + for(k = 0; k < (*G).arcnum; k++) { + if(fp == NULL) { + printf("µÚ %2d Ìõ»¡£º", k + 1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v2); + } else { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + skipBlank(fp); + ReadData(fp, "%c%c", &v1, &v2); + } + + i = LocateVex(*G, v1); // »ñÈ¡¶¥µãv1ÔÚ¶¥µã¼¯ÖеÄλÖà + j = LocateVex(*G, v2); // »ñÈ¡¶¥µãv2ÔÚ¶¥µã¼¯ÖеÄλÖà + + adjs[i][j] = TRUE; + } + + cur = 0; + + // ¼Ç¼ÁÚ½ÓµãÐÅÏ¢ + for(i = 0; i < G->vexnum; i++) { + G->fst[i] = -1; + G->lst[i] = -2; + + for(j = 0; j < G->vexnum; j++) { + if(adjs[i][j] == TRUE) { + if(G->fst[i] == -1) { + G->fst[i] = cur; + } + + G->s[cur++] = j; // ´æ´¢ºó¼Ì¶¥µãÐÅÏ¢ + } + } + + if(G->fst[i] != -1) { + G->lst[i] = cur - 1; + } + } +} + +/* + * ²éÕÒ + * + * ·µ»Ø¶¥µãuÔÚÓÐÏòͼÖеÄλÖà + */ +int LocateVex(Graph G, VertexType u) { + int i; + + for(i = 0; i < G.vexnum; i++) { + if(G.vexs[i] == u) { + return i; + } + } + + return -1; +} + +/* + * ´òÓ¡ÓÐÏòͼ½á¹¹ + */ +void PrintGraph(Graph G) { + int i, j; + + if(G.vexnum == 0) { + printf("¿Õͼ£¬ÎÞÐè´òÓ¡£¡\n"); + return; + } + + printf("µ±Ç°ÓÐÏòͼ°üº¬ %2d ¸ö¶¥µã£¬ %2d Ìõ»¡...\n", G.vexnum, G.arcnum); + + for(i = 0; i < G.vexnum; i++) { + printf("%c -> ", G.vexs[i]); + for(j = G.fst[i]; j <= G.lst[i]; j++) { + printf("%c ", G.vexs[G.s[j]]); + } + printf("\n"); + } +} diff --git a/Dev-C++/ExerciseBook/07.25/Graph.h b/Dev-C++/ExerciseBook/07.25/Graph.h new file mode 100644 index 0000000..b3224dc --- /dev/null +++ b/Dev-C++/ExerciseBook/07.25/Graph.h @@ -0,0 +1,53 @@ +/*================================= + * ÓÉÌâ7.25µÄÃèÊö´´½¨µÄÒ»ÖÖÓÐÏòͼ½á¹¹ + ==================================*/ + +#ifndef GRAPH_H +#define GRAPH_H + +#include +#include // Ìṩmemset¡¢strcmp Ô­ÐÍ +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// + +#define MAX_VERTEX_NUM 26 // ¶¥µã¸öÊý×î´óÖµ +#define MAX_ADJ_NUM 650 // ËùÓж¥µãµÄÁÚ½ÓµãÊýÁ¿ºÍ×î´óÖµ + +// ¶¥µãÀàÐÍ +typedef char VertexType; + +// ÓÐÏòͼÀàÐͶ¨Òå +typedef struct Graph { + VertexType vexs[MAX_VERTEX_NUM]; // ¶¥µãÏòÁ¿ + int s[MAX_ADJ_NUM]; // ¸÷¶¥µãµÄÁÚ½Óµã + int fst[MAX_VERTEX_NUM]; // fst[v] -> ¶¥µãvµÄÁÚ½ÓµãÔÚsÖÐµÄÆðʼϱê + int lst[MAX_VERTEX_NUM]; // lst[v] -> ¶¥µãvµÄÁÚ½ÓµãÔÚsÖеÄÖÕֹϱê + int vexnum, arcnum; // ÓÐÏòͼµÄ¶¥µãÊýºÍ»¡Êý +} Graph; + + +/* + * ´´½¨ÓÐÏòͼ + * + * pathΪNULL»òΪ""ʱ£¬´Ó¿ØÖÆÌ¨¶ÁȡͼµÄ³õʼ»¯ÐÅÏ¢¡£ + * ·ñÔò£¬´ÓÔ¤ÉèµÄÎļþÖжÁȡͼµÄ³õʼ»¯ÐÅÏ¢¡£ + */ +Status CreateGraph(Graph* G, char* path); + +/* + * ´´½¨ÓÐÏòͼµÄºËÐÄËã·¨ + */ +static void Create(Graph* G); + +/* + * ²éÕÒ + * + * ·µ»Ø¶¥µãuÔÚÓÐÏòͼÖеÄλÖà + */ +int LocateVex(Graph G, VertexType u); + +/* + * ´òÓ¡ÓÐÏòͼ½á¹¹ + */ +void PrintGraph(Graph G); + +#endif diff --git a/Dev-C++/ExerciseBook/07.25/TestData_DG.txt b/Dev-C++/ExerciseBook/07.25/TestData_DG.txt new file mode 100644 index 0000000..7941f40 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.25/TestData_DG.txt @@ -0,0 +1,4 @@ +¶¥µãÊý¡ú9 +»¡Êý¡ú11 +¶¥µã¼¯¡ú¡¾A£¬B£¬C£¬D£¬E£¬F£¬G£¬H£¬I¡¿ +»¡µÄ¼¯ºÏ¡ú¡¾A£¬B¡¿¡¾A£¬D¡¿¡¾B£¬C¡¿¡¾D£¬E¡¿¡¾E£¬F¡¿¡¾F£¬C¡¿¡¾F£¬G¡¿¡¾F£¬H¡¿¡¾H£¬I¡¿¡¾I£¬D¡¿¡¾E£¬B¡¿ \ No newline at end of file diff --git a/Dev-C++/ExerciseBook/07.26/07.26.cpp b/Dev-C++/ExerciseBook/07.26/07.26.cpp new file mode 100644 index 0000000..d833b2a --- /dev/null +++ b/Dev-C++/ExerciseBook/07.26/07.26.cpp @@ -0,0 +1,141 @@ +#include +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// +#include "ALGraph.h" //**¡ø07 ͼ**// +#include "TopologicalSorting.h" //**¡ø07 ͼ**// + +/* + * ¶ÔÎÞ»ØÂ·µÄÓÐÏòͼÖеĶ¥µãÊʵ±µØ±àºÅ£¬Ê¹ÆäÁÚ½Ó¾ØÕóΪÏÂÈý½ÇÐÎÇÒÖ÷¶Ô½ÇÏßΪȫÁã¡£ + * µ÷Õû³É¹¦ºó£¬Êä³öоɱàºÅ¶ÔÕÕ±í¡£ + * + * ×¢£º±¾ÖÊÉÏÇóÍØÆËÅÅÐòµÄÄæÐòÁÐ + */ +void Algo_7_26(ALGraph G); + +/* + * ÒÔͼÐλ¯ÐÎʽÊä³öµ÷Õû½áµã˳ÐòºóµÄͼ½á¹¹ + * + * ×¢£ºÔÚͼ/ÍøÖУ¬Ê¹ÓÃ"-"À´±íʾÁ½¶¥µã²»Ö±½ÓÁ¬Í¨ + */ +static void PrintGraph_7_26(ALGraph G, int topo[MAX_VERTEX_NUM]); + + +int main(int argc, char* argv[]) { + ALGraph G; + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ´´½¨²¢Êä³öͼ...\n"); + { + char* path[4]; + + path[0] = "TestData_DG.txt"; + path[1] = ""; + path[2] = ""; + path[3] = ""; + + CreateGraph(&G, path); + PrintGraph(G); + printf("\n"); + } + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ Êä³öÓÐÏòͼµÄ¶¥µã˳Ðò...\n"); + { + Algo_7_26(G); + printf("\n"); + } + + return 0; +} + + +/* + * ¶ÔÎÞ»ØÂ·µÄÓÐÏòͼÖеĶ¥µãÊʵ±µØ±àºÅ£¬Ê¹ÆäÁÚ½Ó¾ØÕóΪÏÂÈý½ÇÐÎÇÒÖ÷¶Ô½ÇÏßΪȫÁã¡£ + * µ÷Õû³É¹¦ºó£¬Êä³öоɱàºÅ¶ÔÕÕ±í¡£ + * + * ×¢£º±¾ÖÊÉÏÇóÍØÆËÅÅÐòµÄÄæÐòÁÐ + */ +void Algo_7_26(ALGraph G) { + int i; + int tmp; + int topo[MAX_VERTEX_NUM]; + + if(TopologicalSort(G, topo) == ERROR) { + printf("¸ø¶¨µÄÓÐÏòͼ´æÔÚ»ØÂ·£¬ÎÞ·¨»ñÈ¡ÆäÍØÆËÐòÁÐ...\n"); + return; + } + + printf("µ÷Õûǰ£º"); + for(i = 0; i < G.vexnum; i++) { + printf("%c ", G.vertices[i].data); + } + printf("\n"); + + // ¶ÔµÃµ½µÄÍØÆËÐòÁÐ×öÒ»¸ö¼òµ¥µÄÄæÖà + for(i = 0; i < G.vexnum / 2; i++) { + tmp = topo[i]; + topo[i] = topo[G.vexnum - i - 1]; + topo[G.vexnum - i - 1] = tmp; + } + + printf("µ÷Õûºó£º"); + for(i = 0; i < G.vexnum; i++) { + printf("%c ", G.vertices[topo[i]].data); + } + printf("\n\n"); + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ¸ù¾Ýµ÷ÕûºóµÄ¶¥µã´ÎÐò£¬´òÓ¡Æä´æ´¢½á¹¹(´Ë²½Öè¿ÉÑ¡)...\n"); + PrintGraph_7_26(G, topo); +} + +/* + * ÒÔͼÐλ¯ÐÎʽÊä³öµ÷Õû½áµã˳ÐòºóµÄͼ½á¹¹ + * + * ×¢£ºÔÚͼ/ÍøÖУ¬Ê¹ÓÃ"-"À´±íʾÁ½¶¥µã²»Ö±½ÓÁ¬Í¨ + */ +static void PrintGraph_7_26(ALGraph G, int topo[MAX_VERTEX_NUM]) { + int i, j; + int pos[MAX_VERTEX_NUM]; + int adjs[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; + ArcNode* p; + + // ¼Ç¼¸÷¶¥µãÔÚÍØÆËÐòÁÐÖеÄË÷Òý + for(i = 0; i < G.vexnum; i++) { + pos[topo[i]] = i; + } + + // ³õʼ»¯ + for(i = 0; i < G.vexnum; i++) { + for(j = 0; j < G.vexnum; j++) { + adjs[i][j] = 0; + } + } + + // ±éÀúÓÐÏòͼ¸÷»¡Ö®¼äµÄ¹ØÏµ + for(i = 0; i < G.vexnum; i++) { + p = G.vertices[i].firstarc; + + while(p != NULL) { + adjs[pos[i]][pos[p->adjvex]] = 1; + p = p->nextarc; + } + } + + + printf(" "); + for(i = 0; i < G.vexnum; i++) { + printf(" %c", G.vertices[topo[i]].data); + } + printf("\n"); + + for(i = 0; i < G.vexnum; i++) { + printf("%c ", G.vertices[topo[i]].data); + + for(j = 0; j < G.vexnum; j++) { + if(adjs[i][j] == 0) { + printf(" -"); + } else { + printf("%3d", adjs[i][j]); + } + } + + printf("\n"); + } +} diff --git a/Dev-C++/ExerciseBook/07.26/07.26.dev b/Dev-C++/ExerciseBook/07.26/07.26.dev new file mode 100644 index 0000000..8adc57c --- /dev/null +++ b/Dev-C++/ExerciseBook/07.26/07.26.dev @@ -0,0 +1,131 @@ +[Project] +FileName=07.26.dev +Name=07.26 +Type=1 +Ver=2 +ObjFiles= +Includes= +Libs= +PrivateResource= +ResourceIncludes= +MakeIncludes= +Compiler= +CppCompiler= +Linker= +IsCpp=0 +Icon= +ExeOutput= +ObjectOutput= +LogOutput= +LogOutputEnabled=0 +OverrideOutput=0 +OverrideOutputName= +HostApplication= +UseCustomMakefile=0 +CustomMakefile= +CommandLine= +Folders= +IncludeVersionInfo=0 +SupportXPThemes=0 +CompilerSet=1 +CompilerSettings=0000000000000000001000000 +UnitCount=8 + +[VersionInfo] +Major=1 +Minor=0 +Release=0 +Build=0 +LanguageID=1033 +CharsetID=1252 +CompanyName= +FileVersion= +FileDescription=Developed using the Dev-C++ IDE +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion= +AutoIncBuildNr=0 +SyncProduct=1 + +[Unit1] +FileName=07.26.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit2] +FileName=ALGraph.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit3] +FileName=ALGraph.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit4] +FileName=SqStack.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit5] +FileName=SqStack.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit6] +FileName=TestData_DG.txt +Folder= +Compile=0 +Link=0 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit7] +FileName=TopologicalSorting.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit8] +FileName=TopologicalSorting.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + diff --git a/Dev-C++/ExerciseBook/07.26/07.26.png b/Dev-C++/ExerciseBook/07.26/07.26.png new file mode 100644 index 0000000000000000000000000000000000000000..6bb19199dc12ec07185960e5914dd51744fe7485 GIT binary patch literal 16448 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 MqODx1Xchkd0f5#y;s5{u literal 0 HcmV?d00001 diff --git a/Dev-C++/ExerciseBook/07.26/ALGraph.cpp b/Dev-C++/ExerciseBook/07.26/ALGraph.cpp new file mode 100644 index 0000000..8318350 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.26/ALGraph.cpp @@ -0,0 +1,325 @@ +/*================== + * ͼµÄÁÚ½Ó±í´æ´¢±íʾ + ===================*/ + +#include "ALGraph.h" + +// ¼ÈëÊý¾ÝµÄÔ´Îļþ£»fpΪnullʱ£¬ËµÃ÷ÐèÒª´Ó¿ØÖÆÌ¨Â¼Èë +static FILE* fp = NULL; + +/* + * IncInfoָʾ¸Ãͼ/ÍøµÄ±ß/»¡ÉÏÊÇ·ñ´æÔÚ¸½¼ÓÐÅÏ¢¡£ + * Èç¹ûÆäÖµ²»Îª0£¬Ôò±íʾÎÞ¸½¼ÓÐÅÏ¢£¬·ñÔò£¬±íʾ´æÔÚ¸½¼ÓÐÅÏ¢¡£ + */ +Boolean IncInfo = FALSE; + +// ·ÃÎʱêÖ¾Êý×飬¼Ç¼·ÃÎʹýµÄ¶¥µã +static Boolean visited[MAX_VERTEX_NUM]; + +// º¯Êý±äÁ¿ +static Status (* VisitFunc)(VertexType e); + + +/* + * ´´½¨ + * + *¡¾±¸×¢¡¿ + * + * ½Ì²ÄÖÐĬÈÏ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý¡£ + * ÕâÀïΪÁË·½±ã²âÊÔ£¬±ÜÃâÿ´ÎÔËÐж¼ÊÖ¶¯ÊäÈëÊý¾Ý£¬ + * Òò¶øÔÊÐíÑ¡Ôñ´ÓÔ¤ÉèµÄÎļþpathÖжÁÈ¡²âÊÔÊý¾Ý¡£ + * + * Èç¹ûÐèÒª´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý£¬ÔòpathΪNULL£¬»òpath[kind]Ϊ""¡£ + * Èç¹ûÐèÒª´ÓÎļþÖжÁÈ¡Êý¾Ý£¬ÔòÐèÒªÔÚpathÖÐÌîдÎļþÃûÐÅÏ¢¡£ + */ +Status CreateGraph(ALGraph* G, char* path[]) { + int readFromConsole; // ÊÇ·ñ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý + int kind; + Status flag; + + // ¡ï¡ï¡ï´Ë´¦¹Ì¶¨ÎªÓÐÏòͼ + kind = 0; + + // Èç¹ûûÓÐÎļþ·¾¶ÐÅÏ¢£¬Ôò´Ó¿ØÖÆÌ¨¶ÁÈ¡ÊäÈë + readFromConsole = (path == NULL) || strcmp(path[kind], "") == 0; + + // ÐèÒª´ÓÎļþ¶ÁÈ¡ + if(readFromConsole) { + (*G).kind = GraphKind(kind); // ¼Ç¼ͼ/ÍøµÄÀàÐÍ + } else { + // ´ò¿ªÎļþ£¬×¼±¸¶ÁÈ¡²âÊÔÊý¾Ý + fp = fopen(path[kind], "r"); + if(fp == NULL) { + return ERROR; + } + + // ¼ÈëͼµÄÀàÐÍ + ReadData(fp, "%d", &((*G).kind)); + } + + // Ëæ»ú´´½¨ÓÐÏòͼ/Íø»òÎÞÏòͼ/ÍøµÄÒ»ÖÖ + switch((*G).kind) { + case DG: + flag = CreateDG(G); + break; + default: + flag = ERROR; + break; + } + + if(fp != NULL) { + fclose(fp); + fp = NULL; + } + + return flag; +} + +/* + * ¹¹ÔìÓÐÏòͼ + */ +static Status CreateDG(ALGraph* G) { + int i, k; + int vexnum, arcnum; + VertexType v1, v2; + InfoType* info = NULL; + + (*G).vexnum = (*G).arcnum = 0; + + if(fp == NULL) { + printf("ÇëÊäÈëÓÐÏòͼµÄ¶¥µãÊý£º"); + scanf("%d", &vexnum); + printf("ÇëÊäÈëÓÐÏòͼµÄ»¡Êý£º"); + scanf("%d", &arcnum); + printf("¸ÃÓÐÏòͼµÄ»¡ÉÏÊÇ·ñ°üº¬ÆäËû¸½¼ÓÐÅÏ¢(0-²»°üº¬©¦1-°üº¬)£º"); + scanf("%d", &IncInfo); + + // ¼Èë¶¥µã¼¯ + printf("Çë¼Èë %d ¸ö¶¥µã£¬²»Í¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º", vexnum); + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(stdin); + scanf("%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } else { + ReadData(fp, "%d", &vexnum); // ¼Èë¶¥µãÊý + ReadData(fp, "%d", &arcnum); // ¼È뻡Êý + ReadData(fp, "%d", &IncInfo); // Åжϻ¡ÉÏÊÇ·ñ°üº¬¸½¼ÓÐÅÏ¢ + + // ¼Èë¶¥µã¼¯ + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(fp); + ReadData(fp, "%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } + + // ½öÔÚ¿ØÖÆÌ¨Â¼ÈëÐÅϢʱÊä³ö´ËÌáʾ + if(fp == NULL && arcnum != 0) { + printf("ÇëΪÓÐÏòͼÒÀ´Î¼Èë %d Ìõ»¡µÄÐÅÏ¢£¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º\n", arcnum); + } + + // ¼È뻡µÄÐÅÏ¢ + for(k = 0; k < arcnum; k++) { + if(fp == NULL) { + printf("µÚ %2d Ìõ»¡£º", k + 1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v2); + } else { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + skipBlank(fp); + ReadData(fp, "%c%c", &v1, &v2); + } + + // Èç¹ûÐèҪ¼È뻡µÄÆäËû¸½¼ÓÐÅÏ¢ + if(IncInfo) { + // ×îºó¼È븽¼ÓÐÅÏ¢ + Input(*G, &info); + } + + // ²åÈ뻡 + InsertArc(G, v1, v2, info); + } + + // ´ÓÎļþÖжÁÈ¡Êý¾Ýʱ£¬×îºóÆäʵӦµ±ÅжÏÒ»ÏÂÊÇ·ñ¶Áµ½ÁË×ã¹»µÄÐÅÏ¢ + return OK; +} + +/* + * ¼Èë±ß/»¡µÄÏà¹Ø¸½¼ÓÐÅÏ¢ + */ +static void Input(ALGraph G, InfoType** info) { + int weight; + + // ÔÚ"Íø"µÄÇéÐÎÏÂÐèҪ¼ÈëȨֵÐÅÏ¢ + if(G.kind == DN || G.kind == UDN) { + *info = (InfoType*) malloc(sizeof(InfoType)); + + if(fp == NULL) { + scanf("%d", &weight); + } else { + ReadData(fp, "%d", &weight); + } + + (*info)->weight = weight; + } +} + +/* + * ²éÕÒ + * + * ·µ»Ø¶¥µãuÔÚͼ/ÍøÖеÄλÖà + */ +int LocateVex(ALGraph G, VertexType u) { + int i; + + for(i = 0; i < G.vexnum; i++) { + if(G.vertices[i].data == u) { + return i; + } + } + + return -1; +} + +/* + * ¹¹ÔìÒ»¸ö±ß/»¡½áµã(½öÏÞÄÚ²¿Ê¹ÓÃ) + */ +static ArcNode* newArcNodePtr(int adjvex, ArcNode* nextarc, InfoType* info) { + ArcNode* p = (ArcNode*) malloc(sizeof(ArcNode)); + if(!p) { + exit(OVERFLOW); + } + + p->adjvex = adjvex; + + p->nextarc = nextarc; + + p->info = info; + + return p; +} + +/* + * ²åÈë±ß/»¡ + * + * Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬Ôò²åÈëÒ»Ìõ»¡ÐèÒªÔö¼ÓÁ½¸ö¶¥µã¹ØÏµ£¬µ«»¡µÄÊýÁ¿Ö»ÔöÒ»¡£ + * ¶ÔÓÚͼ/ÍøÀ´Ëµ£¬¿ÉÒÔÔڿɱä²ÎÊýÖÐÁгö±ß/»¡µÄ¸½¼ÓÐÅÏ¢¡£ + * + * ×¢£º´Ë´¦½ÓÊյIJÎÊýÓëMGraphÓÐЩ²»Ò»Ñù£ºÍøµÄ¸½¼ÓÐÅÏ¢Öаüº¬Á˸÷Ìõ±ß/»¡µÄȨֵ¡£ + */ +Status InsertArc(ALGraph* G, VertexType v, VertexType w, ...) { + int tail, head, k, count; + ArcNode* r; + ArcNode* pre; + Boolean overlay = FALSE; // ÊÇ·ñΪ¸²¸ÇÌí¼Ó + InfoType* info = NULL; // ±ß/»¡µÄ¸½¼ÓÐÅÏ¢ + va_list ap; + + tail = LocateVex(*G, v); // »ñÈ¡¶¥µãvÔÚ¶¥µã¼¯ÖеÄλÖà + if(tail == -1) { + return ERROR; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + head = LocateVex(*G, w); // »ñÈ¡¶¥µãwÔÚ¶¥µã¼¯ÖеÄλÖà + if(head == -1) { + return ERROR; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + // ¾Ü¾ø»· + if(tail == head) { + return ERROR; + } + + // Èç¹û±ß/»¡ÉÏ´æÔÚ¸½¼ÓÐÅÏ¢ + if(IncInfo) { + va_start(ap, w); // ÔÚwºó²éѯÊ׸ö¿É±ä²ÎÊý + info = va_arg(ap, InfoType*); // »ñÈ¡¸½¼ÓÐÅÏ¢ + va_end(ap); + } + + /* ½ÓÏÂÀ´£¬ÐèÒª²éÕÒºÏÊʵIJåÈëλÖà */ + + for(count = 0; count < 2; count++) { + pre = NULL; + // Ö¸ÏòÒÔtailΪβµÄÊ×Ìõ±ß/»¡ + r = G->vertices[tail].firstarc; + while(r != NULL && r->adjvex < head) { + pre = r; + r = r->nextarc; + } + + // Óöµ½ÁËÏàͬλÖõĽáµã + if(r != NULL && r->adjvex == head) { + r->info = info; // ¸´Óøýáµã + overlay = TRUE; // ·¢ÉúÁ˸²¸Ç + } else { + if(pre == NULL) { + G->vertices[tail].firstarc = newArcNodePtr(head, r, info); + } else { + pre->nextarc = newArcNodePtr(head, r, info); + } + } + + // Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬ÐèÒª¿¼ÂǶԳÆÐÔ + if((G->kind == UDG || G->kind == UDN) && tail != head) { + // µßµ¹iºÍj + k = tail; + tail = head; + head = k; + } else { + break; // Èç¹ûÊÇÓÐÏòµÄ£¬¿ÉÒÔ½áÊøÁË + } + } + + // ÔڷǸ²¸ÇµÄÇéÐÎÏ£¬²Å¿¼ÂǸüбß/»¡µÄÊýÁ¿ + if(!overlay) { + (*G).arcnum++; // ²»ÂÛÓÐÏòÎÞÏò£¬±ß/»¡ÊýÖ»ÔöÒ» + } + + return OK; +} + +/* + * ÒÔͼÐλ¯ÐÎʽÊä³öµ±Ç°½á¹¹ + */ +void PrintGraph(ALGraph G) { + int i; + ArcNode* p; + + if(G.vexnum == 0) { + printf("¿Õͼ£¬ÎÞÐè´òÓ¡£¡\n"); + return; + } + + printf("µ±Ç°Í¼/Íø°üº¬ %2d ¸ö¶¥µã£¬ %2d Ìõ±ß/»¡...\n", G.vexnum, G.arcnum); + + for(i = 0; i < G.vexnum; i++) { + printf("%c ===> ", G.vertices[i].data); + + p = G.vertices[i].firstarc; + while(p != NULL) { + if(IncInfo == 0) { + printf("%c ", G.vertices[p->adjvex].data); + + // ¶ÔÓÚÍø£¬»á´ÓÆä¸½¼ÓÐÅÏ¢ÖлñÈ¡µ½È¨Öµ + } else { + printf("%c[%2d] ", G.vertices[p->adjvex].data, p->info->weight); + } + + p = p->nextarc; + + if(p != NULL) { + printf("- "); + } + } + + printf("\n"); + } +} diff --git a/Dev-C++/ExerciseBook/07.26/ALGraph.h b/Dev-C++/ExerciseBook/07.26/ALGraph.h new file mode 100644 index 0000000..e70b2c2 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.26/ALGraph.h @@ -0,0 +1,128 @@ +/*================== + * ͼµÄÁÚ½Ó±í´æ´¢±íʾ + ===================*/ + +#ifndef ALGRAPH_H +#define ALGRAPH_H + +#include +#include // Ìṩmemset¡¢strcmp Ô­ÐÍ +#include // Ìṩºêva_list¡¢va_start¡¢va_arg¡¢va_end +#include // Ìṩmalloc¡¢realloc¡¢free¡¢exitÔ­ÐÍ +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// + +/* + * ×¢£º + * + * ͨ³£À´½²£¬ÎÞȨͼ±»¼ò³ÆÎª¡¾Í¼¡¿£¬ÓÐȨͼ±»¼ò³ÆÎª¡¾Íø¡¿¡£ + * ÎÞÏòͼ/ÍøÖеĶ¥µã¹ØÏµ±»³ÆÎª¡¾±ß¡¿£¬ÓÐÏòͼ/ÍøÖеĶ¥µã¹ØÏµ±»³ÆÎª¡¾»¡¡¿£¬²¢Çø·Ö»¡Í·Ó뻡β¡£ + * ʵ¼Ê±íÊöÖУ¬Î´±Ø»áÑϸñ×ñÊØÒÔÉÏÃüÃû¡£ + * + * µ±Ç°½á¹¹Êʺϴ洢±ß/»¡±È½ÏÏ¡ÊèµÄͼ/Íø¡£ + * + * ¡ï ²åÈë±ß/»¡µÄÐÅϢʱ£¬ÕâÀïµÄʵÏÖÊǰ´"ÉýÐò"²åÈëµÄ£¬ÕâʹµÃ²åÈëµÄ»¡Êǰ´"ÉýÐò"ÅÅÁеġ£ + */ + + +/* ºê¶¨Òå */ +#define MAX_VERTEX_NUM 26 // ×î´ó¶¥µã¸öÊý + + +// ͼµÄÀàÐÍ +typedef enum { + DG, // 0-ÓÐÏòͼ + DN, // 1-ÓÐÏòÍø(´øÈ¨Öµ) + UDG, // 2-ÎÞÏòͼ + UDN // 3-ÎÞÏòÍø(´øÈ¨Öµ) +} GraphKind; + +// ¶¥µãÀàÐÍ +typedef char VertexType; + +// ±ß/»¡µÄÏà¹Ø¸½¼ÓÐÅÏ¢ +typedef struct { + /* + * ×¢£º + * ½Ì²ÄÖиø³öµÄ½á¹¹Ö»¿¼ÂÇÁËÎÞȨͼ£¬¶øÃ»¿¼ÂÇÓÐȨͼ(Íø)¡£ + * ÕâÀïΪÁ˰ѡ°Íø¡±µÄÇéÐÎÒ²¿¼ÂǽøÈ¥£¬ÌØÔÚ¸½¼ÓÐÅÏ¢ÖÐÔö¼ÓÁË"È¨ÖØ"ÊôÐÔ¡£ + */ + int weight; +} InfoType; + +/* ±ß/»¡½áµã */ +typedef struct ArcNode { + int adjvex; // ¸Ã»¡ËùÖ¸ÏòµÄ¶¥µãµÄλÖà + struct ArcNode* nextarc; // Ö¸ÏòÏÂÒ»Ìõ»¡µÄÖ¸Õë + InfoType* info; // »¡µÄ¸½¼ÓÐÅÏ¢£¬Í¨³£ºöÂÔ +} ArcNode; + +// ÿ¸öÁ´±íµÄÍ·½áµã +typedef struct VNode { + VertexType data; // ¶¥µãÐÅÏ¢ + ArcNode* firstarc; // Ö¸ÏòµÚÒ»ÌõÒÀ¸½¸Ã¶¥µãµÄ»¡µÄÖ¸Õë +} VNode; + +/* ͼµÄÁÚ½Ó±í´æ´¢±íʾÀàÐͶ¨Òå */ +typedef struct { + VNode vertices[MAX_VERTEX_NUM]; // ÁÚ½Ó±í + int vexnum, arcnum; // ͼ/ÍøµÄ¶¥µãÊýºÍ»¡Êý + GraphKind kind; // ͼµÄÀàÐͱêÖ¾ +} ALGraph; + + +// ±ß/»¡ÉÏÊÇ·ñ´æÔÚ¸½¼ÓÐÅÏ¢ +extern Boolean IncInfo; + + +/* + * ´´½¨ + * + *¡¾±¸×¢¡¿ + * + * ½Ì²ÄÖÐĬÈÏ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý¡£ + * ÕâÀïΪÁË·½±ã²âÊÔ£¬±ÜÃâÿ´ÎÔËÐж¼ÊÖ¶¯ÊäÈëÊý¾Ý£¬ + * Òò¶øÔÊÐíÑ¡Ôñ´ÓÔ¤ÉèµÄÎļþpathÖжÁÈ¡²âÊÔÊý¾Ý¡£ + * + * Èç¹ûÐèÒª´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý£¬ÔòpathΪNULL£¬»òpath[kind]Ϊ""¡£ + * Èç¹ûÐèÒª´ÓÎļþÖжÁÈ¡Êý¾Ý£¬ÔòÐèÒªÔÚpathÖÐÌîдÎļþÃûÐÅÏ¢¡£ + */ +Status CreateGraph(ALGraph* G, char* path[]); + +/* + * ¹¹ÔìÓÐÏòͼ + */ +static Status CreateDG(ALGraph* G); + +/* + * ¼Èë±ß/»¡µÄÏà¹Ø¸½¼ÓÐÅÏ¢ + */ +static void Input(ALGraph G, InfoType** info); + +/* + * ²éÕÒ + * + * ·µ»Ø¶¥µãuÔÚͼ/ÍøÖеÄλÖà + */ +int LocateVex(ALGraph G, VertexType u); + +/* + * ¹¹ÔìÒ»¸ö±ß/»¡½áµã(½öÏÞÄÚ²¿Ê¹ÓÃ) + */ +static ArcNode* newArcNodePtr(int adjvex, ArcNode* nextarc, InfoType* info); + +/* + * ²åÈë±ß/»¡ + * + * Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬Ôò²åÈëÒ»Ìõ»¡ÐèÒªÔö¼ÓÁ½¸ö¶¥µã¹ØÏµ£¬µ«»¡µÄÊýÁ¿Ö»ÔöÒ»¡£ + * ¶ÔÓÚͼ/ÍøÀ´Ëµ£¬¿ÉÒÔÔڿɱä²ÎÊýÖÐÁгö±ß/»¡µÄ¸½¼ÓÐÅÏ¢¡£ + * + * ×¢£º´Ë´¦½ÓÊյIJÎÊýÓëMGraphÓÐЩ²»Ò»Ñù£ºÍøµÄ¸½¼ÓÐÅÏ¢Öаüº¬Á˸÷Ìõ±ß/»¡µÄȨֵ¡£ + */ +Status InsertArc(ALGraph* G, VertexType v, VertexType w, ...); + +/* + * ÒÔͼÐλ¯ÐÎʽÊä³öµ±Ç°½á¹¹ + */ +void PrintGraph(ALGraph G); + +#endif diff --git a/Dev-C++/ExerciseBook/07.26/SqStack.cpp b/Dev-C++/ExerciseBook/07.26/SqStack.cpp new file mode 100644 index 0000000..f056778 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.26/SqStack.cpp @@ -0,0 +1,90 @@ +/*========================= + * Õ»µÄ˳Ðò´æ´¢½á¹¹£¨Ë³ÐòÕ»£© + ==========================*/ + +#include "SqStack.h" //**¡ø03 Õ»ºÍ¶ÓÁÐ**// + +/* + * ³õʼ»¯ + * + * ¹¹ÔìÒ»¸ö¿ÕÕ»¡£³õʼ»¯³É¹¦Ôò·µ»ØOK£¬·ñÔò·µ»ØERROR¡£ + */ +Status InitStack(SqStack* S) { + if(S == NULL) { + return ERROR; + } + + (*S).base = (SElemType*) malloc(STACK_INIT_SIZE * sizeof(SElemType)); + if((*S).base == NULL) { + exit(OVERFLOW); + } + + (*S).top = (*S).base; + (*S).stacksize = STACK_INIT_SIZE; + + return OK; +} + +/* + * ÅÐ¿Õ + * + * ÅжÏ˳ÐòÕ»ÖÐÊÇ·ñ°üº¬ÓÐЧÊý¾Ý¡£ + * + * ·µ»ØÖµ£º + * TRUE : ˳ÐòջΪ¿Õ + * FALSE: ˳ÐòÕ»²»Îª¿Õ + */ +Status StackEmpty(SqStack S) { + if(S.top == S.base) { + return TRUE; + } else { + return FALSE; + } +} + +/* + * ÈëÕ» + * + * ½«ÔªËØeѹÈëµ½Õ»¶¥¡£ + */ +Status Push(SqStack* S, SElemType e) { + if(S == NULL || (*S).base == NULL) { + return ERROR; + } + + // Õ»Âúʱ£¬×·¼Ó´æ´¢¿Õ¼ä + if((*S).top - (*S).base >= (*S).stacksize) { + (*S).base = (SElemType*) realloc((*S).base, ((*S).stacksize + STACKINCREMENT) * sizeof(SElemType)); + if((*S).base == NULL) { + exit(OVERFLOW); // ´æ´¢·ÖÅäʧ°Ü + } + + (*S).top = (*S).base + (*S).stacksize; + (*S).stacksize += STACKINCREMENT; + } + + // ½øÕ»Ïȸ³Öµ£¬Õ»¶¥Ö¸ÕëÔÙ×ÔÔö + *(S->top++) = e; + + return OK; +} + +/* + * ³öÕ» + * + * ½«Õ»¶¥ÔªËص¯³ö£¬²¢ÓÃe½ÓÊÕ¡£ + */ +Status Pop(SqStack* S, SElemType* e) { + if(S == NULL || (*S).base == NULL) { + return ERROR; + } + + if((*S).top == (*S).base) { + return ERROR; + } + + // ³öÕ»Õ»¶¥Ö¸ÕëÏȵݼõ£¬ÔÙ¸³Öµ + *e = *(--(*S).top); + + return OK; +} diff --git a/Dev-C++/ExerciseBook/07.26/SqStack.h b/Dev-C++/ExerciseBook/07.26/SqStack.h new file mode 100644 index 0000000..a8fe835 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.26/SqStack.h @@ -0,0 +1,59 @@ +/*========================= + * Õ»µÄ˳Ðò´æ´¢½á¹¹£¨Ë³ÐòÕ»£© + ==========================*/ + +#ifndef SQSTACK_H +#define SQSTACK_H + +#include +#include // Ìṩmalloc¡¢realloc¡¢free¡¢exitÔ­ÐÍ +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// + +/* ºê¶¨Òå */ +#define STACK_INIT_SIZE 100 // ˳ÐòÕ»´æ´¢¿Õ¼äµÄ³õʼ·ÖÅäÁ¿ +#define STACKINCREMENT 10 // ˳ÐòÕ»´æ´¢¿Õ¼äµÄ·ÖÅäÔöÁ¿ + +/* ˳ÐòÕ»ÔªËØÀàÐͶ¨Òå */ +typedef int SElemType; + +// ˳ÐòÕ»ÔªËØ½á¹¹ +typedef struct { + SElemType* base; // Õ»µ×Ö¸Õë + SElemType* top; // Õ»¶¥Ö¸Õë + int stacksize; // µ±Ç°ÒÑ·ÖÅäµÄ´æ´¢¿Õ¼ä£¬ÒÔÔªËØÎªµ¥Î» +} SqStack; + + +/* + * ³õʼ»¯ + * + * ¹¹ÔìÒ»¸ö¿ÕÕ»¡£³õʼ»¯³É¹¦Ôò·µ»ØOK£¬·ñÔò·µ»ØERROR¡£ + */ +Status InitStack(SqStack* S); + +/* + * ÅÐ¿Õ + * + * ÅжÏ˳ÐòÕ»ÖÐÊÇ·ñ°üº¬ÓÐЧÊý¾Ý¡£ + * + * ·µ»ØÖµ£º + * TRUE : ˳ÐòջΪ¿Õ + * FALSE: ˳ÐòÕ»²»Îª¿Õ + */ +Status StackEmpty(SqStack S); + +/* + * ÈëÕ» + * + * ½«ÔªËØeѹÈëµ½Õ»¶¥¡£ + */ +Status Push(SqStack* S, SElemType e); + +/* + * ³öÕ» + * + * ½«Õ»¶¥ÔªËص¯³ö£¬²¢ÓÃe½ÓÊÕ¡£ + */ +Status Pop(SqStack* S, SElemType* e); + +#endif diff --git a/Dev-C++/ExerciseBook/07.26/TestData_DG.txt b/Dev-C++/ExerciseBook/07.26/TestData_DG.txt new file mode 100644 index 0000000..a240ed8 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.26/TestData_DG.txt @@ -0,0 +1,6 @@ +ͼÀàÐÍ¡ú0£¨ÓÐÏòͼ£© +¶¥µãÊý¡ú12 +»¡Êý¡ú16 +»¡ÊÇ·ñ´øÓÐÆäËûÐÅÏ¢¡ú0 +¶¥µã¼¯¡ú¡¾A£¬B£¬C£¬D£¬E£¬F£¬G£¬H£¬I£¬J£¬K£¬L¡¿ +»¡µÄ¼¯ºÏ¡ú¡¾F£¬J¡¿¡¾F£¬B¡¿¡¾F£¬C¡¿¡¾F£¬A¡¿¡¾B£¬C¡¿¡¾J£¬I¡¿¡¾C£¬I¡¿¡¾C£¬H¡¿¡¾I£¬H¡¿¡¾C£¬G¡¿¡¾D£¬A¡¿¡¾D£¬L¡¿¡¾L£¬A¡¿¡¾D£¬K¡¿¡¾K£¬E¡¿¡¾E£¬G¡¿ \ No newline at end of file diff --git a/Dev-C++/ExerciseBook/07.26/TopologicalSorting.cpp b/Dev-C++/ExerciseBook/07.26/TopologicalSorting.cpp new file mode 100644 index 0000000..82001f5 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.26/TopologicalSorting.cpp @@ -0,0 +1,96 @@ +/*======================= + * AOV-Íø(ÓÐÏòͼ)µÄÍØÆËÅÅÐò + * + * °üº¬Ëã·¨: 7.12 + ========================*/ + +#include "TopologicalSorting.h" + +/* + * ¨€¨€¨€¨€¨€¨€¨€¨€ Ëã·¨7.12 ¨€¨€¨€¨€¨€¨€¨€¨€ + * + * Èç¹ûÓÐÏòͼGÎÞ»ØÂ·£¬ÔòÊä³öËüµÄÒ»¸öÍØÆËÐòÁв¢·µ»ØOK£»·ñÔò£¬·µ»ØFALSE¡£ + * ÍØÆËÐòÁÐͨ³£²»Î¨Ò»£¬µ«ÊDZØÐ뱣֤ijЩ¹Ø¼ü½ÚµãµÄÏȺó´ÎÐò¡£ + * + * ×¢£ºÓë½Ì²Ä²»Í¬Ö®´¦ÔÚÓÚ£¬´Ë´¦Ôö¼ÓÁËÒ»¸ötopoÊý×é×ö²ÎÊý¡£ + * ¡¡¡¡¶ÔÓÚÇó³öµÄÍØÆËÐòÁУ¬²»»áÖ±½ÓÊä³ö£¬¶øÊǻỺ´æµ½topoÖС£ + * ¡¡¡¡ÕâÑùµÄ×öµÄÄ¿µÄÊǺóÐøµÄϰÌâÖлáÓжദÓõ½¸ÃÍØÆËÐòÁС£ + */ +Status TopologicalSort(ALGraph G, int topo[MAX_VERTEX_NUM]) { + int i, k, count; + int indegree[MAX_VERTEX_NUM]; + SqStack S; + ArcNode* p; + + // ¶Ô¸÷¶¥µãÇóÈë¶È + FindInDegree(G, indegree); + + // ³õʼ»¯ÁãÈë¶È¶¥µãÕ» + InitStack(&S); + + // ½¨Á¢Èë¶ÈΪ0µÄ¶¥µãÕ» + for(i = 0; i < G.vexnum; i++) { + // ½«Èë¶ÈΪ0µÄ¶¥µãÌí¼Óµ½Õ»ÖÐ + if(indegree[i] == 0) { + Push(&S, i); + } + } + + // ¶ÔÍØÆËÐòÁÐÖеĶ¥µã¼ÆÊý + count = 0; + + // ±éÀú¶¥µãÕ» + while(!StackEmpty(S)) { + // »ñȡһ¸öÁãÈë¶È¶¥µã + Pop(&S, &i); + + // ½«¸÷¶¥µãµÄÐòºÅÔÝ´æÆðÀ´ + topo[count++] = i; + + // ±éÀúiºÅ¶¥µãµÄÁÚ½Óµã + for(p = G.vertices[i].firstarc; p != NULL; p = p->nextarc) { + // »ñÈ¡¶¥µãÐòºÅ + k = p->adjvex; + + /* + * ½«iºÅ¶¥µãÿ¸öÁÚ½ÓµãµÄÈë¶È¼õÒ»£¬ÕâÏ൱ÓÚÇжÎiºÅ¶¥µãµ½ÆäËüÁÚ½ÓµãµÄÁªÏµ¡£ + * Èç¹û³öÏÖÁËеÄÈë¶ÈΪ0µÄ¶¥µã£¬¼ÌÐø½«ÆäÈëÕ»¡£ + */ + if((--indegree[k]) == 0) { + Push(&S, k); + } + } + } + + // Èç¹ûÓöµ½ÁË»ØÂ·£¬Ôò·µ»ØERROR + if(count < G.vexnum) { + return ERROR; + } else { + return OK; + } +} + +/* + * ¼ÆËã¸÷¶¥µãµÄÈë¶È + */ +static void FindInDegree(ALGraph G, int indegree[MAX_VERTEX_NUM]) { + int i; + ArcNode* p; + + // ³õʼ»¯ËùÓж¥µãµÄÈë¶ÈΪ0 + for(i = 0; i < G.vexnum; i++) { + indegree[i] = 0; + } + + // ±éÀúËùÓж¥µã + for(i = 0; i < G.vexnum; i++) { + // Ö¸Ïò¸Ã¶¥µãµÄÊ׸öÁÚ½Óµã + p = G.vertices[i].firstarc; + + // ±éÀú¸Ã¶¥µãµÄËùÓÐÁڽӵ㣬ͳ¼Æ¸÷¶¥µãµÄÈë¶È + while(p != NULL) { + indegree[p->adjvex]++; + p = p->nextarc; + } + } +} diff --git a/Dev-C++/ExerciseBook/07.26/TopologicalSorting.h b/Dev-C++/ExerciseBook/07.26/TopologicalSorting.h new file mode 100644 index 0000000..3fae677 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.26/TopologicalSorting.h @@ -0,0 +1,28 @@ +/*======================= + * AOV-Íø(ÓÐÏòͼ)µÄÍØÆËÅÅÐò + * + * °üº¬Ëã·¨: 7.12 + ========================*/ + +#ifndef TOPOLOGICALSORTING_H +#define TOPOLOGICALSORTING_H + +#include +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// +#include "SqStack.h" //**¡ø03 Õ»ºÍ¶ÓÁÐ**// +#include "ALGraph.h" //**¡ø07 ͼ**// + +/* + * ¨€¨€¨€¨€¨€¨€¨€¨€ Ëã·¨7.12 ¨€¨€¨€¨€¨€¨€¨€¨€ + * + * Èç¹ûÓÐÏòͼGÎÞ»ØÂ·£¬ÔòÊä³öËüµÄÒ»¸öÍØÆËÐòÁв¢·µ»ØOK£»·ñÔò£¬·µ»ØFALSE¡£ + * ÍØÆËÐòÁÐͨ³£²»Î¨Ò»£¬µ«ÊDZØÐ뱣֤ijЩ¹Ø¼ü½ÚµãµÄÏȺó´ÎÐò¡£ + */ +Status TopologicalSort(ALGraph G, int topo[MAX_VERTEX_NUM]); + +/* + * ¼ÆËã¸÷¶¥µãµÄÈë¶È + */ +static void FindInDegree(ALGraph G, int indegree[MAX_VERTEX_NUM]); + +#endif diff --git a/Dev-C++/ExerciseBook/07.27/07.27.cpp b/Dev-C++/ExerciseBook/07.27/07.27.cpp new file mode 100644 index 0000000..91012db --- /dev/null +++ b/Dev-C++/ExerciseBook/07.27/07.27.cpp @@ -0,0 +1,133 @@ +#include +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// +#include "ALGraph.h" //**¡ø07 ͼ**// + +// ·ÃÎʱêÖ¾Êý×飬¼Ç¼·ÃÎʹýµÄ¶¥µã +static Boolean visited[MAX_VERTEX_NUM]; + + +/* + * Êä³öÂú×ãÌõ¼þµÄ¼òµ¥Â·¾¶ + */ +void Algo_7_27(ALGraph G, VertexType start, VertexType end, int k); + +/* + * ²éÕÒÂú×ãÌõ¼þµÄ¼òµ¥Â·¾¶¡£ + * + * pathÓÃÀ´´æ´¢Â·¹ýµÄ¶¥µã£¬path[0]´æ´¢pathÖеĶ¥µãÊýÁ¿¡£ + * + * Èç¹ûÕÒµ½¼òµ¥Â·¾¶£¬Ôò½«Æä´æ´¢µ½pathÖУ¬²¢·µ»ØOK£»·ñÔò£¬·µ»ØERROR¡£ + */ +Status SimplePath_7_27(ALGraph G, int start, int end, int k, int path[MAX_VERTEX_NUM]); + + +int main(int argc, char* argv[]) { + ALGraph G; + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ´´½¨²¢Êä³öͼ...\n"); + { + char* path[4]; + + path[0] = ""; + path[1] = ""; + path[2] = "TestData_UDG.txt"; + path[3] = ""; + + CreateGraph(&G, path); + PrintGraph(G); + printf("\n"); + } + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ²éÕÒ¼òµ¥Â·¾¶...\n"); + { + VertexType start = 'A'; + VertexType end = 'B'; + int k = 4; + + Algo_7_27(G, start, end, k); + printf("\n"); + } + + return 0; +} + + +/* + * Êä³öÂú×ãÌõ¼þµÄ¼òµ¥Â·¾¶ + */ +void Algo_7_27(ALGraph G, VertexType start, VertexType end, int k) { + int i, m, n; + int path[MAX_VERTEX_NUM + 1]; // 0ºÅµ¥ÔªÓÃÀ´¼Ç¼pathÖд洢µÄ¶¥µãÊýÁ¿ + Status s; + + m = LocateVex(G, start); + n = LocateVex(G, end); + + if(k <= 0 || m == -1 || n == -1 || m == n) { + printf("²ÎÊý´íÎó£¡\n"); + return; + } + + // °ÑËùÓж¥µã±ê¼ÇΪδ·ÃÎÊ + for(i = 0; i < G.vexnum; i++) { + visited[i] = FALSE; + } + + path[0] = 0; + + s = SimplePath_7_27(G, m, n, k, path); + + if(s == ERROR) { + printf("δÕÒµ½·ûºÏÌõ¼þµÄ¼òµ¥Â·¾¶£¡\n"); + return; + } + + printf("%c µ½ %c Ö®¼ä´æÔÚµÄÒ»Ìõ³¤¶ÈΪ %d µÄ¼òµ¥Â·¾¶Îª£º", start, end, k); + for(i = 1; i <= path[0]; i++) { + printf("%c ", GetVex(G, path[i])); + } + printf("\n"); +} + +/* + * ²éÕÒÂú×ãÌõ¼þµÄ¼òµ¥Â·¾¶¡£ + * + * pathÓÃÀ´´æ´¢Â·¹ýµÄ¶¥µã£¬path[0]´æ´¢pathÖеĶ¥µãÊýÁ¿¡£ + * + * Èç¹ûÕÒµ½¼òµ¥Â·¾¶£¬Ôò½«Æä´æ´¢µ½pathÖУ¬²¢·µ»ØOK£»·ñÔò£¬·µ»ØERROR¡£ + */ +Status SimplePath_7_27(ALGraph G, int start, int end, int k, int path[MAX_VERTEX_NUM]) { + int w; + + path[0]++; + path[path[0]] = start; + visited[start] = TRUE; // ±ê¼Ç¸Ã¶¥µãÒÑ·ÃÎÊ + + // Èç¹ûÓöµ½Öյ㣬ÔòÐèÒªÊÓÇéÐηµ»Ø + if(start == end) { + // ¶¥µãÊý = ·¾¶³¤¶È+1 + if(path[0] == k + 1) { + return OK; + } + } else { + // Éî¶ÈÓÅÏȱéÀú + for(w = FirstAdjVex(G, G.vertices[start].data); + w >= 0; + w = NextAdjVex(G, G.vertices[start].data, G.vertices[w].data)) { + // ºöÂÔÒÑ·ÃÎʹýµÄ¶¥µã + if(visited[w] == TRUE) { + continue; + } + + if(SimplePath_7_27(G, w, end, k, path) == OK) { + return OK; + } + } + } + + // ´Ó·¾¶ÖÐÒÆ³ý¸Ã¶¥µã£¬²¢½«Æä״̬½µ¼¶Îª"ÒÑ·ÃÎÊ" + path[0]--; + visited[start] = FALSE; // Çå³ý·ÃÎʱê¼Ç + + return ERROR; +} diff --git a/Dev-C++/ExerciseBook/07.27/07.27.dev b/Dev-C++/ExerciseBook/07.27/07.27.dev new file mode 100644 index 0000000..11031aa --- /dev/null +++ b/Dev-C++/ExerciseBook/07.27/07.27.dev @@ -0,0 +1,91 @@ +[Project] +FileName=07.27.dev +Name=07.27 +Type=1 +Ver=2 +ObjFiles= +Includes= +Libs= +PrivateResource= +ResourceIncludes= +MakeIncludes= +Compiler= +CppCompiler= +Linker= +IsCpp=0 +Icon= +ExeOutput= +ObjectOutput= +LogOutput= +LogOutputEnabled=0 +OverrideOutput=0 +OverrideOutputName= +HostApplication= +UseCustomMakefile=0 +CustomMakefile= +CommandLine= +Folders= +IncludeVersionInfo=0 +SupportXPThemes=0 +CompilerSet=1 +CompilerSettings=0000000000000000001000000 +UnitCount=4 + +[VersionInfo] +Major=1 +Minor=0 +Release=0 +Build=0 +LanguageID=1033 +CharsetID=1252 +CompanyName= +FileVersion= +FileDescription=Developed using the Dev-C++ IDE +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion= +AutoIncBuildNr=0 +SyncProduct=1 + +[Unit1] +FileName=07.27.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit2] +FileName=ALGraph.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit3] +FileName=ALGraph.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit4] +FileName=TestData_UDG.txt +Folder= +Compile=0 +Link=0 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + diff --git a/Dev-C++/ExerciseBook/07.27/07.27.png b/Dev-C++/ExerciseBook/07.27/07.27.png new file mode 100644 index 0000000000000000000000000000000000000000..a37e6ceb71414701b75b1862516f5f9183058992 GIT binary patch literal 8809 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 + InsertArc(G, v1, v2, info); + } + + // ´ÓÎļþÖжÁÈ¡Êý¾Ýʱ£¬×îºóÆäʵӦµ±ÅжÏÒ»ÏÂÊÇ·ñ¶Áµ½ÁË×ã¹»µÄÐÅÏ¢ + return OK; +} + +/* + * ¼Èë±ß/»¡µÄÏà¹Ø¸½¼ÓÐÅÏ¢ + */ +static void Input(ALGraph G, InfoType** info) { + int weight; + + // ÔÚ"Íø"µÄÇéÐÎÏÂÐèҪ¼ÈëȨֵÐÅÏ¢ + if(G.kind == DN || G.kind == UDN) { + *info = (InfoType*) malloc(sizeof(InfoType)); + + if(fp == NULL) { + scanf("%d", &weight); + } else { + ReadData(fp, "%d", &weight); + } + + (*info)->weight = weight; + } +} + +/* + * ²éÕÒ + * + * ·µ»Ø¶¥µãuÔÚͼ/ÍøÖеÄλÖà + */ +int LocateVex(ALGraph G, VertexType u) { + int i; + + for(i = 0; i < G.vexnum; i++) { + if(G.vertices[i].data == u) { + return i; + } + } + + return -1; +} + +/* + * ȡֵ + * + * ·µ»ØË÷Òýv´¦µÄ¶¥µãÖµ + */ +VertexType GetVex(ALGraph G, int v) { + if(v < 0 || v >= G.vexnum) { + return '\0'; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + return G.vertices[v].data; +} + +/* + * ¸³Öµ + * + * ½«¶¥µãv¸³ÖµÎªvalue + */ +Status PutVex(ALGraph* G, VertexType v, VertexType value) { + int k; + + // Ê×ÏÈÐèÒªÅжϸö¥µãÊÇ·ñ´æÔÚ + k = LocateVex((*G), v); + if(k == -1) { + return ERROR; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + // Ìæ»»Í·½áµã + (*G).vertices[k].data = value; + + /* Á´±íÖеÄÔªËØ´æ´¢µÄÊǶ¥µãµÄλÖã¬ËùÒÔÎÞÐè±éÀúÁ´±íÀ´Ì滻Ŀ±êÖµ */ + + return OK; +} + +/* + * Ê׸öÁÚ½Óµã + * + * ·µ»Ø¶¥µãvµÄÊ׸öÁÚ½Óµã + */ +int FirstAdjVex(ALGraph G, VertexType v) { + int k; + ArcNode* r; + + // Ê×ÏÈÐèÒªÅжϸö¥µãÊÇ·ñ´æÔÚ + k = LocateVex(G, v); + if(k == -1) { + return -1; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + r = G.vertices[k].firstarc; + if(r == NULL) { + return -1; + } else { + return r->adjvex; + } +} + +/* + * ÏÂÒ»¸öÁÚ½Óµã + * + * ·µ»Ø¶¥µãvµÄ(Ïà¶ÔÓÚwµÄ)ÏÂÒ»¸öÁÚ½Óµã + */ +int NextAdjVex(ALGraph G, VertexType v, VertexType w) { + int kv, kw; + ArcNode* r; + + // Ê×ÏÈÐèÒªÅжϸö¥µãÊÇ·ñ´æÔÚ + kv = LocateVex(G, v); + if(kv == -1) { + return -1; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + // Ê×ÏÈÐèÒªÅжϸö¥µãÊÇ·ñ´æÔÚ + kw = LocateVex(G, w); + if(kw == -1) { + return -1; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + r = G.vertices[kv].firstarc; + if(r == NULL) { + return -1; // Á´±íΪ¿Õ + } + + // ÔÚÁ´±íÖвéÕÒw + while(r != NULL && r->adjvex < kw) { + r = r->nextarc; + } + + // Èç¹ûûÕÒµ½w + if(r == NULL) { + return -1; + } + + // Èç¹ûÕÒµ½ÁËw£¬µ«ÊÇwºóÃæÃ»ÓбðµÄ¶¥µã£¬ÄÇôҲÎÞ·¨·µ»ØÁÚ½Óµã + if(r->adjvex == kw && r->nextarc != NULL) { + return r->nextarc->adjvex; + } + + return -1; +} + +/* + * ²åÈë¶¥µã + * + * ½«Ö¸¶¨µÄ¶¥µãv×·¼Óµ½¶¥µã¼¯ÖУ¬Î´½¨Á¢¸Ã¶¥µãÓëÆäËû¶¥µãµÄ¹ØÏµ + */ +Status InsertVex(ALGraph* G, VertexType v) { + int k; + + // ¶¥µãÊý¹ý¶à + if((*G).vexnum == MAX_VERTEX_NUM) { + return ERROR; + } + + // Ê×ÏÈÐèÒªÅжϸö¥µãÊÇ·ñ´æÔÚ + k = LocateVex(*G, v); + if(k >= 0) { + return ERROR; // Ö¸¶¨µÄ¶¥µã´æÔÚʱ£¬ÎÞÐèÖØ¸´Ìí¼Ó + } + + G->vertices[(*G).vexnum].data = v; + G->vertices[(*G).vexnum].firstarc = NULL; + + (*G).vexnum++; + + return OK; +} + +/* + * ɾ³ý¶¥µã + * + * ´Ó¶¥µã¼¯ÖÐɾ³ýÖ¸¶¨µÄ¶¥µãv£¬×¢ÒâÐèÒª¸üÐÂÏà¹ØµÄ¶¥µã¹ØÏµ + */ +Status DeleteVex(ALGraph* G, VertexType v) { + int k, i; + ArcNode* pre, * r; + + // Ê×ÏÈÐèÒªÅжϸö¥µãÊÇ·ñ´æÔÚ + k = LocateVex(*G, v); + if(k == -1) { + return ERROR; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + // ÕÒµ½ÒÔ½áµãv³ö·¢µÄÁ´±í£¬ÊͷŸÃÁ´±íÉÏËùÓнáµã + r = G->vertices[k].firstarc; + while(r != NULL) { + pre = r; + r = r->nextarc; + free(pre); + + (*G).arcnum--; + } + + G->vertices[k].firstarc = NULL; + + // ±éÀúÆäËüËùÓÐÁ´±í£¬É¾³ýÄÇЩָÏò¶¥µãvµÄ»¡£»¶øÇÒ£¬Ï±곬¹ýkµÄ¶¥µã£¬ÆäϱêÖµÐèÒªµÝ¼õ + for(i = 0; i < G->vexnum; i++) { + pre = NULL; + r = G->vertices[i].firstarc; + while(r != NULL && r->adjvex < k) { + pre = r; + r = r->nextarc; + } + + // Á´±íÉÏËùÓж¥µãµÄϱê¾ùСÓÚk + if(r == NULL) { + continue; + } + + if(r->adjvex == k) { + // ´Ó¿ªÍ·É¾µô½áµãv + if(pre == NULL) { + G->vertices[i].firstarc = r->nextarc; + + // ´ÓÖмäij¸öλÖÃɾµô½áµãv + } else { + pre->nextarc = r->nextarc; + } + + free(r); + + // Èç¹ûÕâÊÇÓÐÏòµÄͼ/Íø£¬ÒÀÈ»ÐèÒªµÝ¼õ±ß/»¡µÄÊýÁ¿ + if((*G).kind == DG || (*G).kind == DN) { + (*G).arcnum--; + } + } + + // ÔÙ´ÎÈ·¶¨rµÄλÖà + if(pre == NULL) { + r = G->vertices[i].firstarc; + } else { + r = pre->nextarc; + } + + // ϱ곬¹ýkµÄ¶¥µã£¬ÐèÒªµÝ¼õÆäϱê + while(r != NULL && r->adjvex > k) { + r->adjvex -= 1; + r = r->nextarc; + } + } + + // ¶¥µã¼¯Ç°ÒÆ + for(i = k + 1; i < (*G).vexnum; i++) { + G->vertices[i - 1] = G->vertices[i]; + } + + // ¶¥µãÊýµÝ¼õ + (*G).vexnum--; + + return OK; +} + +/* + * ¹¹ÔìÒ»¸ö±ß/»¡½áµã(½öÏÞÄÚ²¿Ê¹ÓÃ) + */ +static ArcNode* newArcNodePtr(int adjvex, ArcNode* nextarc, InfoType* info) { + ArcNode* p = (ArcNode*) malloc(sizeof(ArcNode)); + if(!p) { + exit(OVERFLOW); + } + + p->adjvex = adjvex; + + p->nextarc = nextarc; + + p->info = info; + + return p; +} + +/* + * ²åÈë±ß/»¡ + * + * Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬Ôò²åÈëÒ»Ìõ»¡ÐèÒªÔö¼ÓÁ½¸ö¶¥µã¹ØÏµ£¬µ«»¡µÄÊýÁ¿Ö»ÔöÒ»¡£ + * ¶ÔÓÚͼ/ÍøÀ´Ëµ£¬¿ÉÒÔÔڿɱä²ÎÊýÖÐÁгö±ß/»¡µÄ¸½¼ÓÐÅÏ¢¡£ + * + * ×¢£º´Ë´¦½ÓÊյIJÎÊýÓëMGraphÓÐЩ²»Ò»Ñù£ºÍøµÄ¸½¼ÓÐÅÏ¢Öаüº¬Á˸÷Ìõ±ß/»¡µÄȨֵ¡£ + */ +Status InsertArc(ALGraph* G, VertexType v, VertexType w, ...) { + int tail, head, k, count; + ArcNode* r; + ArcNode* pre; + Boolean overlay = FALSE; // ÊÇ·ñΪ¸²¸ÇÌí¼Ó + InfoType* info = NULL; // ±ß/»¡µÄ¸½¼ÓÐÅÏ¢ + va_list ap; + + tail = LocateVex(*G, v); // »ñÈ¡¶¥µãvÔÚ¶¥µã¼¯ÖеÄλÖà + if(tail == -1) { + return ERROR; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + head = LocateVex(*G, w); // »ñÈ¡¶¥µãwÔÚ¶¥µã¼¯ÖеÄλÖà + if(head == -1) { + return ERROR; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + // ¾Ü¾ø»· + if(tail == head) { + return ERROR; + } + + // Èç¹û±ß/»¡ÉÏ´æÔÚ¸½¼ÓÐÅÏ¢ + if(IncInfo) { + va_start(ap, w); // ÔÚwºó²éѯÊ׸ö¿É±ä²ÎÊý + info = va_arg(ap, InfoType*); // »ñÈ¡¸½¼ÓÐÅÏ¢ + va_end(ap); + } + + /* ½ÓÏÂÀ´£¬ÐèÒª²éÕÒºÏÊʵIJåÈëλÖà */ + + for(count = 0; count < 2; count++) { + pre = NULL; + // Ö¸ÏòÒÔtailΪβµÄÊ×Ìõ±ß/»¡ + r = G->vertices[tail].firstarc; + while(r != NULL && r->adjvex < head) { + pre = r; + r = r->nextarc; + } + + // Óöµ½ÁËÏàͬλÖõĽáµã + if(r != NULL && r->adjvex == head) { + r->info = info; // ¸´Óøýáµã + overlay = TRUE; // ·¢ÉúÁ˸²¸Ç + } else { + if(pre == NULL) { + G->vertices[tail].firstarc = newArcNodePtr(head, r, info); + } else { + pre->nextarc = newArcNodePtr(head, r, info); + } + } + + // Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬ÐèÒª¿¼ÂǶԳÆÐÔ + if((G->kind == UDG || G->kind == UDN) && tail != head) { + // µßµ¹iºÍj + k = tail; + tail = head; + head = k; + } else { + break; // Èç¹ûÊÇÓÐÏòµÄ£¬¿ÉÒÔ½áÊøÁË + } + } + + // ÔڷǸ²¸ÇµÄÇéÐÎÏ£¬²Å¿¼ÂǸüбß/»¡µÄÊýÁ¿ + if(!overlay) { + (*G).arcnum++; // ²»ÂÛÓÐÏòÎÞÏò£¬±ß/»¡ÊýÖ»ÔöÒ» + } + + return OK; +} + +/* + * ɾ³ý±ß/»¡ + */ +Status DeleteArc(ALGraph* G, VertexType v, VertexType w) { + int tail, head, k, count; + ArcNode* r; + ArcNode* pre; + + tail = LocateVex(*G, v); + if(tail == -1) { + return ERROR; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + head = LocateVex(*G, w); + if(head == -1) { + return ERROR; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + for(count = 0; count < 2; count++) { + pre = NULL; + // ÔÚµ±Ç°Á´±íÖÐÕÒµ½´ýɾ³ýµÄ±ß/»¡ + r = G->vertices[tail].firstarc; + while(r != NULL && r->adjvex < head) { + pre = r; + r = r->nextarc; + } + + // ÕÒµ½ÁË´ýɾ³ýµÄ±ß/»¡ + if(r != NULL && r->adjvex == head) { + if(pre == NULL) { + G->vertices[tail].firstarc = r->nextarc; + } else { + pre->nextarc = r->nextarc; + } + + free(r); + } else { + return ERROR; // ûÕÒµ½ + } + + // Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬ÐèÒª¿¼ÂǶԳÆÐÔ + if((G->kind == UDG || G->kind == UDN) && tail != head) { + // µßµ¹tailºÍhead + k = tail; + tail = head; + head = k; + } else { + break; // Èç¹ûÊÇÓÐÏòµÄ£¬¿ÉÒÔ½áÊøÁË + } + } + + (*G).arcnum--; // ²»ÂÛÓÐÏòÎÞÏò£¬±ß/»¡ÊýÖ»¼õÒ» + + return OK; +} + +/* + * ÒÔͼÐλ¯ÐÎʽÊä³öµ±Ç°½á¹¹ + */ +void PrintGraph(ALGraph G) { + int i; + ArcNode* p; + + if(G.vexnum == 0) { + printf("¿Õͼ£¬ÎÞÐè´òÓ¡£¡\n"); + return; + } + + printf("µ±Ç°Í¼/Íø°üº¬ %2d ¸ö¶¥µã£¬ %2d Ìõ±ß/»¡...\n", G.vexnum, G.arcnum); + + for(i = 0; i < G.vexnum; i++) { + printf("%c ===> ", G.vertices[i].data); + + p = G.vertices[i].firstarc; + while(p != NULL) { + if(IncInfo == 0) { + printf("%c ", G.vertices[p->adjvex].data); + + // ¶ÔÓÚÍø£¬»á´ÓÆä¸½¼ÓÐÅÏ¢ÖлñÈ¡µ½È¨Öµ + } else { + printf("%c[%2d] ", G.vertices[p->adjvex].data, p->info->weight); + } + + p = p->nextarc; + + if(p != NULL) { + printf("- "); + } + } + + printf("\n"); + } +} diff --git a/Dev-C++/ExerciseBook/07.27/ALGraph.h b/Dev-C++/ExerciseBook/07.27/ALGraph.h new file mode 100644 index 0000000..f3bbcad --- /dev/null +++ b/Dev-C++/ExerciseBook/07.27/ALGraph.h @@ -0,0 +1,175 @@ +/*================== + * ͼµÄÁÚ½Ó±í´æ´¢±íʾ + ===================*/ + +#ifndef ALGRAPH_H +#define ALGRAPH_H + +#include +#include // Ìṩmemset¡¢strcmp Ô­ÐÍ +#include // Ìṩºêva_list¡¢va_start¡¢va_arg¡¢va_end +#include // Ìṩmalloc¡¢realloc¡¢free¡¢exitÔ­ÐÍ +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// + +/* + * ×¢£º + * + * ͨ³£À´½²£¬ÎÞȨͼ±»¼ò³ÆÎª¡¾Í¼¡¿£¬ÓÐȨͼ±»¼ò³ÆÎª¡¾Íø¡¿¡£ + * ÎÞÏòͼ/ÍøÖеĶ¥µã¹ØÏµ±»³ÆÎª¡¾±ß¡¿£¬ÓÐÏòͼ/ÍøÖеĶ¥µã¹ØÏµ±»³ÆÎª¡¾»¡¡¿£¬²¢Çø·Ö»¡Í·Ó뻡β¡£ + * ʵ¼Ê±íÊöÖУ¬Î´±Ø»áÑϸñ×ñÊØÒÔÉÏÃüÃû¡£ + * + * µ±Ç°½á¹¹Êʺϴ洢±ß/»¡±È½ÏÏ¡ÊèµÄͼ/Íø¡£ + * + * ¡ï ²åÈë±ß/»¡µÄÐÅϢʱ£¬ÕâÀïµÄʵÏÖÊǰ´"ÉýÐò"²åÈëµÄ£¬ÕâʹµÃ²åÈëµÄ»¡Êǰ´"ÉýÐò"ÅÅÁеġ£ + */ + + +/* ºê¶¨Òå */ +#define MAX_VERTEX_NUM 26 // ×î´ó¶¥µã¸öÊý + + +// ͼµÄÀàÐÍ +typedef enum { + DG, // 0-ÓÐÏòͼ + DN, // 1-ÓÐÏòÍø(´øÈ¨Öµ) + UDG, // 2-ÎÞÏòͼ + UDN // 3-ÎÞÏòÍø(´øÈ¨Öµ) +} GraphKind; + +// ¶¥µãÀàÐÍ +typedef char VertexType; + +// ±ß/»¡µÄÏà¹Ø¸½¼ÓÐÅÏ¢ +typedef struct { + /* + * ×¢£º + * ½Ì²ÄÖиø³öµÄ½á¹¹Ö»¿¼ÂÇÁËÎÞȨͼ£¬¶øÃ»¿¼ÂÇÓÐȨͼ(Íø)¡£ + * ÕâÀïΪÁ˰ѡ°Íø¡±µÄÇéÐÎÒ²¿¼ÂǽøÈ¥£¬ÌØÔÚ¸½¼ÓÐÅÏ¢ÖÐÔö¼ÓÁË"È¨ÖØ"ÊôÐÔ¡£ + */ + int weight; +} InfoType; + +/* ±ß/»¡½áµã */ +typedef struct ArcNode { + int adjvex; // ¸Ã»¡ËùÖ¸ÏòµÄ¶¥µãµÄλÖà + struct ArcNode* nextarc; // Ö¸ÏòÏÂÒ»Ìõ»¡µÄÖ¸Õë + InfoType* info; // »¡µÄ¸½¼ÓÐÅÏ¢£¬Í¨³£ºöÂÔ +} ArcNode; + +// ÿ¸öÁ´±íµÄÍ·½áµã +typedef struct VNode { + VertexType data; // ¶¥µãÐÅÏ¢ + ArcNode* firstarc; // Ö¸ÏòµÚÒ»ÌõÒÀ¸½¸Ã¶¥µãµÄ»¡µÄÖ¸Õë +} VNode; + +/* ͼµÄÁÚ½Ó±í´æ´¢±íʾÀàÐͶ¨Òå */ +typedef struct { + VNode vertices[MAX_VERTEX_NUM]; // ÁÚ½Ó±í + int vexnum, arcnum; // ͼ/ÍøµÄ¶¥µãÊýºÍ»¡Êý + GraphKind kind; // ͼµÄÀàÐͱêÖ¾ +} ALGraph; + + +// ±ß/»¡ÉÏÊÇ·ñ´æÔÚ¸½¼ÓÐÅÏ¢ +extern Boolean IncInfo; + + +/* + * ´´½¨ + * + *¡¾±¸×¢¡¿ + * + * ½Ì²ÄÖÐĬÈÏ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý¡£ + * ÕâÀïΪÁË·½±ã²âÊÔ£¬±ÜÃâÿ´ÎÔËÐж¼ÊÖ¶¯ÊäÈëÊý¾Ý£¬ + * Òò¶øÔÊÐíÑ¡Ôñ´ÓÔ¤ÉèµÄÎļþpathÖжÁÈ¡²âÊÔÊý¾Ý¡£ + * + * Èç¹ûÐèÒª´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý£¬ÔòpathΪNULL£¬»òpath[kind]Ϊ""¡£ + * Èç¹ûÐèÒª´ÓÎļþÖжÁÈ¡Êý¾Ý£¬ÔòÐèÒªÔÚpathÖÐÌîдÎļþÃûÐÅÏ¢¡£ + */ +Status CreateGraph(ALGraph* G, char* path[]); + +/* + * ¹¹ÔìÎÞÏòͼ + */ +static Status CreateUDG(ALGraph* G); + +/* + * ¼Èë±ß/»¡µÄÏà¹Ø¸½¼ÓÐÅÏ¢ + */ +static void Input(ALGraph G, InfoType** info); + +/* + * ²éÕÒ + * + * ·µ»Ø¶¥µãuÔÚͼ/ÍøÖеÄλÖà + */ +int LocateVex(ALGraph G, VertexType u); + +/* + * ȡֵ + * + * ·µ»ØË÷Òýv´¦µÄ¶¥µãÖµ + */ +VertexType GetVex(ALGraph G, int v); + +/* + * ¸³Öµ + * + * ½«¶¥µãv¸³ÖµÎªvalue + */ +Status PutVex(ALGraph* G, VertexType v, VertexType value); + +/* + * Ê׸öÁÚ½Óµã + * + * ·µ»Ø¶¥µãvµÄÊ׸öÁÚ½Óµã + */ +int FirstAdjVex(ALGraph G, VertexType v); + +/* + * ÏÂÒ»¸öÁÚ½Óµã + * + * ·µ»Ø¶¥µãvµÄ(Ïà¶ÔÓÚwµÄ)ÏÂÒ»¸öÁÚ½Óµã + */ +int NextAdjVex(ALGraph G, VertexType v, VertexType w); + +/* + * ²åÈë¶¥µã + * + * ½«Ö¸¶¨µÄ¶¥µãv×·¼Óµ½¶¥µã¼¯ÖУ¬Î´½¨Á¢¸Ã¶¥µãÓëÆäËû¶¥µãµÄ¹ØÏµ + */ +Status InsertVex(ALGraph* G, VertexType v); + +/* + * ɾ³ý¶¥µã + * + * ´Ó¶¥µã¼¯ÖÐɾ³ýÖ¸¶¨µÄ¶¥µãv£¬×¢ÒâÐèÒª¸üÐÂÏà¹ØµÄ¶¥µã¹ØÏµ + */ +Status DeleteVex(ALGraph* G, VertexType v); + +/* + * ¹¹ÔìÒ»¸ö±ß/»¡½áµã(½öÏÞÄÚ²¿Ê¹ÓÃ) + */ +static ArcNode* newArcNodePtr(int adjvex, ArcNode* nextarc, InfoType* info); + +/* + * ²åÈë±ß/»¡ + * + * Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬Ôò²åÈëÒ»Ìõ»¡ÐèÒªÔö¼ÓÁ½¸ö¶¥µã¹ØÏµ£¬µ«»¡µÄÊýÁ¿Ö»ÔöÒ»¡£ + * ¶ÔÓÚͼ/ÍøÀ´Ëµ£¬¿ÉÒÔÔڿɱä²ÎÊýÖÐÁгö±ß/»¡µÄ¸½¼ÓÐÅÏ¢¡£ + * + * ×¢£º´Ë´¦½ÓÊյIJÎÊýÓëMGraphÓÐЩ²»Ò»Ñù£ºÍøµÄ¸½¼ÓÐÅÏ¢Öаüº¬Á˸÷Ìõ±ß/»¡µÄȨֵ¡£ + */ +Status InsertArc(ALGraph* G, VertexType v, VertexType w, ...); + +/* + * ɾ³ý±ß/»¡ + */ +Status DeleteArc(ALGraph* G, VertexType v, VertexType w); + +/* + * ÒÔͼÐλ¯ÐÎʽÊä³öµ±Ç°½á¹¹ + */ +void PrintGraph(ALGraph G); + +#endif diff --git a/Dev-C++/ExerciseBook/07.27/TestData_UDG.txt b/Dev-C++/ExerciseBook/07.27/TestData_UDG.txt new file mode 100644 index 0000000..589753c --- /dev/null +++ b/Dev-C++/ExerciseBook/07.27/TestData_UDG.txt @@ -0,0 +1,6 @@ +ͼÀàÐÍ¡ú2£¨ÎÞÏòͼ£© +¶¥µãÊý¡ú9 +±ßÊý¡ú13 +±ßÊÇ·ñ´øÓÐÆäËûÐÅÏ¢¡ú0 +¶¥µã¼¯¡ú¡¾A£¬B£¬C£¬D£¬E£¬F£¬G£¬H£¬I¡¿ +±ßµÄ¼¯ºÏ¡ú¡¾A£¬B¡¿¡¾B£¬E¡¿¡¾E£¬D¡¿¡¾D£¬F¡¿¡¾F£¬A¡¿¡¾B£¬D¡¿¡¾A£¬C¡¿¡¾C£¬E¡¿¡¾A£¬H¡¿¡¾H£¬G¡¿¡¾G£¬C¡¿¡¾C£¬I¡¿¡¾H£¬I¡¿ \ No newline at end of file diff --git a/Dev-C++/ExerciseBook/07.28/07.28.cpp b/Dev-C++/ExerciseBook/07.28/07.28.cpp new file mode 100644 index 0000000..d3df298 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.28/07.28.cpp @@ -0,0 +1,110 @@ +#include +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// +#include "MGraph.h" //**¡ø07 ͼ**// + +// ·ÃÎʱêÖ¾Êý×飬¼Ç¼·ÃÎʹýµÄ¶¥µã +static Boolean visited[MAX_VERTEX_NUM]; + + +/* + * Êä³öÂú×ãÌõ¼þµÄ¼òµ¥Â·¾¶ + */ +void Algo_7_28(MGraph G, VertexType start, VertexType end); + +/* + * ²éÕÒstartµ½endÖ®¼äµÄËùÓеļòµ¥Â·¾¶ + */ +void SimplePath_7_28(MGraph G, int start, int end, int path[MAX_VERTEX_NUM]); + + +int main(int argc, char* argv[]) { + MGraph G; + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ´´½¨²¢Êä³öͼ...\n"); + { + char* path[4]; + + path[0] = "TestData_DG.txt"; + path[1] = ""; + path[2] = ""; + path[3] = ""; + + CreateGraph(&G, path); + PrintGraph(G); + printf("\n"); + } + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ²éÕÒ¼òµ¥Â·¾¶...\n"); + { + VertexType start = 'u'; + VertexType end = 'v'; + + Algo_7_28(G, start, end); + printf("\n"); + } + + return 0; +} + + +/* + * Êä³östartµ½endÖ®¼äµÄËùÓеļòµ¥Â·¾¶ + */ +void Algo_7_28(MGraph G, VertexType start, VertexType end) { + int i, m, n; + int path[MAX_VERTEX_NUM + 1]; // 0ºÅµ¥ÔªÓÃÀ´¼Ç¼pathÖд洢µÄ¶¥µãÊýÁ¿ + + m = LocateVex(G, start); + n = LocateVex(G, end); + + if(m == -1 || n == -1 || m == n) { + printf("²ÎÊý´íÎó£¡\n"); + return; + } + + // °ÑËùÓж¥µã±ê¼ÇΪδ·ÃÎÊ + for(i = 0; i < G.vexnum; i++) { + visited[i] = FALSE; + } + + path[0] = 0; + + printf("²éÕÒ %c µ½ %c Ö®¼ä´æÔÚµÄËùÓмòµ¥Â·¾¶...\n", start, end); + SimplePath_7_28(G, m, n, path); +} + +/* + * ²éÕÒstartµ½endÖ®¼äµÄËùÓеļòµ¥Â·¾¶ + */ +void SimplePath_7_28(MGraph G, int start, int end, int path[MAX_VERTEX_NUM]) { + int i, w; + + path[0]++; + path[path[0]] = start; + visited[start] = TRUE; // ±ê¼Ç¸Ã¶¥µãÒÑ·ÃÎÊ + + // Èç¹ûÓöµ½Âú×ãÌâÒâµÄ·¾¶£¬ÔòÊä³öËü + if(start == end) { + // Êä³öÕÒµ½µÄ¼òµ¥Â·¾¶ + for(i = 1; i <= path[0]; i++) { + printf("%c ", GetVex(G, path[i])); + } + printf("\n"); + } else { + // Éî¶ÈÓÅÏȱéÀú + for(w = FirstAdjVex(G, G.vexs[start]); + w >= 0; + w = NextAdjVex(G, G.vexs[start], G.vexs[w])) { + // ºöÂÔÒÑ·ÃÎʹýµÄ¶¥µã + if(visited[w] == TRUE) { + continue; + } + + SimplePath_7_28(G, w, end, path); + } + } + + // ´Ó·¾¶ÖÐÒÆ³ý¸Ã¶¥µã£¬²¢½«Æä״̬½µ¼¶Îª"ÒÑ·ÃÎÊ" + path[0]--; + visited[start] = FALSE; // Çå³ý·ÃÎʱê¼Ç +} diff --git a/Dev-C++/ExerciseBook/07.28/07.28.dev b/Dev-C++/ExerciseBook/07.28/07.28.dev new file mode 100644 index 0000000..969b6ac --- /dev/null +++ b/Dev-C++/ExerciseBook/07.28/07.28.dev @@ -0,0 +1,91 @@ +[Project] +FileName=07.28.dev +Name=07.28 +Type=1 +Ver=2 +ObjFiles= +Includes= +Libs= +PrivateResource= +ResourceIncludes= +MakeIncludes= +Compiler= +CppCompiler= +Linker= +IsCpp=0 +Icon= +ExeOutput= +ObjectOutput= +LogOutput= +LogOutputEnabled=0 +OverrideOutput=0 +OverrideOutputName= +HostApplication= +UseCustomMakefile=0 +CustomMakefile= +CommandLine= +Folders= +IncludeVersionInfo=0 +SupportXPThemes=0 +CompilerSet=1 +CompilerSettings=0000000000000000001000000 +UnitCount=4 + +[VersionInfo] +Major=1 +Minor=0 +Release=0 +Build=0 +LanguageID=1033 +CharsetID=1252 +CompanyName= +FileVersion= +FileDescription=Developed using the Dev-C++ IDE +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion= +AutoIncBuildNr=0 +SyncProduct=1 + +[Unit1] +FileName=07.28.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit2] +FileName=MGraph.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit3] +FileName=MGraph.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit4] +FileName=TestData_DG.txt +Folder= +Compile=0 +Link=0 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + diff --git a/Dev-C++/ExerciseBook/07.28/07.28.png b/Dev-C++/ExerciseBook/07.28/07.28.png new file mode 100644 index 0000000000000000000000000000000000000000..d814ec27df79db865275062fa483cfa48ee7242e GIT binary patch literal 10441 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 G.vexnum) { + return '\0'; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + return G.vexs[v]; +} + +/* + * Ê׸öÁÚ½Óµã + * + * ·µ»Ø¶¥µãvµÄÊ׸öÁÚ½Óµã + */ +int FirstAdjVex(MGraph G, VertexType v) { + int kv, j; + VRType adj; + + kv = LocateVex(G, v); + if(kv == -1) { + return -1; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + // È·¶¨Ò»¸ö·ÇÁ¬Í¨±ê¼Ç + if(G.kind == DG || G.kind == UDG) { + adj = 0; // ͼ + } else if(G.kind == DN || G.kind == UDN) { + adj = INFINITE; // Íø + } else { + return -1; + } + + // ´ÓÍ·¿ªÊ¼²éÕÒ + for(j = 0; j < G.vexnum; j++) { + // ÕÒµ½ÓëvÖ±½ÓÁ¬½ÓµÄ¶¥µã + if(G.arcs[kv][j].adj != adj) { + return j; + } + } + + return -1; +} + +/* + * ÏÂÒ»¸öÁÚ½Óµã + * + * ·µ»Ø¶¥µãvµÄ(Ïà¶ÔÓÚwµÄ)ÏÂÒ»¸öÁÚ½Óµã + */ +int NextAdjVex(MGraph G, VertexType v, VertexType w) { + int kv, kw, j; + VRType adj; + + kv = LocateVex(G, v); + if(kv == -1) { + return -1; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + kw = LocateVex(G, w); + if(kw == -1) { + return -1; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + // È·¶¨Ò»¸ö·ÇÁ¬Í¨±ê¼Ç + if(G.kind == DG || G.kind == UDG) { + adj = 0; // ͼ + } else if(G.kind == DN || G.kind == UDN) { + adj = INFINITE; // Íø + } else { + return -1; + } + + // ´Ó¶¥µãwºó¿ªÊ¼²éÕÒ + for(j = kw + 1; j < G.vexnum; j++) { + // ÕÒµ½ÓëvÖ±½ÓÁ¬½ÓµÄ¶¥µã + if(G.arcs[kv][j].adj != adj) { + return j; + } + } + + return -1; +} + +/* + * ÒÔͼÐλ¯ÐÎʽÊä³öµ±Ç°½á¹¹ + * + * ×¢£ºÔÚÍøÖУ¬Ê¹ÓÃ"-"À´±íʾÁ½¶¥µã²»Ö±½ÓÁ¬Í¨ + */ +void PrintGraph(MGraph G) { + int i, j; + + if(G.vexnum == 0) { + printf("¿Õͼ£¬ÎÞÐè´òÓ¡£¡\n"); + return; + } + + printf("µ±Ç°Í¼/Íø°üº¬ %2d ¸ö¶¥µã£¬ %2d Ìõ±ß/»¡...\n", G.vexnum, G.arcnum); + + printf(" "); + for(i = 0; i < G.vexnum; i++) { + printf(" %c", G.vexs[i]); + } + printf("\n"); + + for(i = 0; i < G.vexnum; i++) { + printf("%c ", G.vexs[i]); + + for(j = 0; j < G.vexnum; j++) { + if(((G.kind == DG || G.kind == UDG) && G.arcs[i][j].adj == 0) || ((G.kind == DN || G.kind == UDN) && G.arcs[i][j].adj == INFINITE)) { + printf(" -"); + } else { + printf("%3d", G.arcs[i][j].adj); + } + } + + printf("\n"); + } +} diff --git a/Dev-C++/ExerciseBook/07.28/MGraph.h b/Dev-C++/ExerciseBook/07.28/MGraph.h new file mode 100644 index 0000000..143f540 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.28/MGraph.h @@ -0,0 +1,133 @@ +/*================================= + * ͼµÄÊý×é(ÁÚ½Ó¾ØÕó)´æ´¢±íʾ + * + * °üº¬Ëã·¨: 7.1¡¢7.2¡¢7.4¡¢7.5¡¢7.6 + ==================================*/ + +#ifndef MGRAPH_H +#define MGRAPH_H + +#include +#include // ÌṩºêINT_MAX +#include // Ìṩmemset¡¢strcmp Ô­ÐÍ +#include // Ìṩºêva_list¡¢va_start¡¢va_arg¡¢va_end +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// + +/* + * ×¢£º + * + * ͨ³£À´½²£¬ÎÞȨͼ±»¼ò³ÆÎª¡¾Í¼¡¿£¬ÓÐȨͼ±»¼ò³ÆÎª¡¾Íø¡¿¡£ + * ÎÞÏòͼ/ÍøÖеĶ¥µã¹ØÏµ±»³ÆÎª¡¾±ß¡¿£¬ÓÐÏòͼ/ÍøÖеĶ¥µã¹ØÏµ±»³ÆÎª¡¾»¡¡¿£¬²¢Çø·Ö»¡Í·Ó뻡β¡£ + * ʵ¼Ê±íÊöÖУ¬Î´±Ø»áÑϸñ×ñÊØÒÔÉÏÃüÃû¡£ + */ + +/* ºê¶¨Òå */ +#define INFINITE INT_MAX // ×î´óÖµ£¬ÓÃÀ´±íÊ¾ÍøÖеÄÁ½¸ö¶¥µã²»Ö±½ÓÁ¬½Ó +#define MAX_VERTEX_NUM 26 // ×î´ó¶¥µã¸öÊý + + +// ͼµÄÀàÐÍ +typedef enum { + DG, // 0-ÓÐÏòͼ + DN, // 1-ÓÐÏòÍø(´øÈ¨Öµ) + UDG, // 2-ÎÞÏòͼ + UDN // 3-ÎÞÏòÍø(´øÈ¨Öµ) +} GraphKind; + +// ¶¥µãÀàÐÍ +typedef char VertexType; + +/* + * ¶¥µã¹ØÏµÀàÐÍ + * + * ÔÚÎÞȨͼÖУ¬¸Ãֵͨ³£Îª0»ò1£¬±íʾÁ½¶¥µãÊÇ·ñÖ±½ÓÁ¬Í¨£» + * ÔÚÓÐȨͼÖУ¬¸Ãֵͨ³£ÎªÈ¨Öµ¡£ + */ +typedef int VRType; + +// ±ßµÄÏà¹Ø¸½¼ÓÐÅÏ¢ +typedef struct { + // Èç¹ûÓеϰ£¬ºóÐø»áÌí¼ÓÏàÓ¦µÄÊôÐÔ +} InfoType; + +// ±ßµÄÀàÐÍ£¬Ã¿Ìõ±ßÉÏ¿ÉÄÜÓи½¼ÓÐÅÏ¢info +typedef struct ArcCell { + VRType adj; // ¶¥µã¹ØÏµ£¬ÔÚÓÐȨͼ¸úÎÞȨͼÖеĺ¬Ò岻ͬ + InfoType* info; // ±ßµÄ¸½¼ÓÐÅÏ¢£¬Í¨³£ºöÂÔ +} ArcCell; + +/* ͼ/ÍøµÄÊý×é(ÁÚ½Ó¾ØÕó)´æ´¢±íʾÀàÐͶ¨Òå */ +typedef struct { + VertexType vexs[MAX_VERTEX_NUM]; // ¶¥µãÏòÁ¿ + ArcCell arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; // ÁÚ½Ó¾ØÕó + int vexnum, arcnum; // ͼ/ÍøµÄ¶¥µãÊýºÍ»¡Êý + GraphKind kind; // ͼµÄÀàÐͱêÖ¾ +} MGraph; + + +// ±ß/»¡ÉÏÊÇ·ñ´æÔÚ¸½¼ÓÐÅÏ¢ +extern Boolean IncInfo; + + +/* + * ¨€¨€¨€¨€¨€¨€¨€¨€ Ëã·¨7.1 ¨€¨€¨€¨€¨€¨€¨€¨€ + * + * ´´½¨ + * + *¡¾±¸×¢¡¿ + * + * ½Ì²ÄÖÐĬÈÏ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý¡£ + * ÕâÀïΪÁË·½±ã²âÊÔ£¬±ÜÃâÿ´ÎÔËÐж¼ÊÖ¶¯ÊäÈëÊý¾Ý£¬ + * Òò¶øÔÊÐíÑ¡Ôñ´ÓÔ¤ÉèµÄÎļþpathÖжÁÈ¡²âÊÔÊý¾Ý¡£ + * + * Èç¹ûÐèÒª´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý£¬ÔòpathΪNULL£¬»òpath[kind]Ϊ""¡£ + * Èç¹ûÐèÒª´ÓÎļþÖжÁÈ¡Êý¾Ý£¬ÔòÐèÒªÔÚpathÖÐÌîдÎļþÃûÐÅÏ¢¡£ + */ +Status CreateGraph(MGraph* G, char* path[]); + +/* + * ¹¹ÔìÎÞÏòͼ + */ +static Status CreateDG(MGraph* G); + +/* + * ¼Èë±ßµÄÏà¹Ø¸½¼ÓÐÅÏ¢ + */ +static void Input(MGraph G, InfoType** info); + +/* + * ²éÕÒ + * + * ·µ»Ø¶¥µãuÔÚͼ/ÍøÖеÄλÖà + */ +int LocateVex(MGraph G, VertexType u); + +/* + * ȡֵ + * + * ·µ»ØË÷Òýv´¦µÄ¶¥µãÖµ + */ +VertexType GetVex(MGraph G, int v); + +/* + * Ê׸öÁÚ½Óµã + * + * ·µ»Ø¶¥µãvµÄÊ׸öÁÚ½Óµã + */ +int FirstAdjVex(MGraph G, VertexType v); + +/* + * ÏÂÒ»¸öÁÚ½Óµã + * + * ·µ»Ø¶¥µãvµÄ(Ïà¶ÔÓÚwµÄ)ÏÂÒ»¸öÁÚ½Óµã + */ +int NextAdjVex(MGraph G, VertexType v, VertexType w); + +/* + * ÒÔͼÐλ¯ÐÎʽÊä³öµ±Ç°½á¹¹ + * + * ×¢£ºÔÚÍøÖУ¬Ê¹ÓÃ"-"À´±íʾÁ½¶¥µã²»Ö±½ÓÁ¬Í¨ + */ +void PrintGraph(MGraph G); + +#endif diff --git a/Dev-C++/ExerciseBook/07.28/TestData_DG.txt b/Dev-C++/ExerciseBook/07.28/TestData_DG.txt new file mode 100644 index 0000000..a19ece0 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.28/TestData_DG.txt @@ -0,0 +1,6 @@ +ͼÀàÐÍ¡ú0£¨ÓÐÏòͼ£© +¶¥µãÊý¡ú8 +»¡Êý¡ú11 +»¡ÊÇ·ñ´øÓÐÆäËûÐÅÏ¢¡ú0 +¶¥µã¼¯¡ú¡¾a£¬b£¬c£¬d£¬e£¬f£¬u£¬v¡¿ +»¡µÄ¼¯ºÏ¡ú¡¾u£¬c¡¿¡¾c£¬d¡¿¡¾d£¬e¡¿¡¾e£¬u¡¿¡¾d£¬v¡¿¡¾e£¬f¡¿¡¾f£¬v¡¿¡¾v£¬b¡¿¡¾b£¬f¡¿¡¾u£¬a¡¿¡¾a£¬b¡¿ \ No newline at end of file diff --git a/Dev-C++/ExerciseBook/07.29/07.29.cpp b/Dev-C++/ExerciseBook/07.29/07.29.cpp new file mode 100644 index 0000000..03bdcb4 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.29/07.29.cpp @@ -0,0 +1,110 @@ +#include +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// +#include "MGraph.h" //**¡ø07 ͼ**// + +// ·ÃÎʱêÖ¾Êý×飬¼Ç¼·ÃÎʹýµÄ¶¥µã +static Boolean visited[MAX_VERTEX_NUM]; + + +/* + * Êä³öÓÐÏòͼGÖ㤶ÈΪkµÄ¼òµ¥Â·¾¶ + */ +void Algo_7_29(MGraph G, int k); + +/* + * ²éÕÒÓÐÏòͼGÖ㤶ÈΪkµÄ¼òµ¥Â·¾¶ + */ +void SimplePath_7_29(MGraph G, int start, int k, int path[MAX_VERTEX_NUM]); + + +int main(int argc, char* argv[]) { + MGraph G; + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ´´½¨²¢Êä³öͼ...\n"); + { + char* path[4]; + + path[0] = "TestData_DG.txt"; + path[1] = ""; + path[2] = ""; + path[3] = ""; + + CreateGraph(&G, path); + PrintGraph(G); + printf("\n"); + } + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ²éÕÒ¶¨³¤µÄ¼òµ¥Â·¾¶...\n"); + { + int k = 4; + + Algo_7_29(G, k); + printf("\n"); + } + + return 0; +} + + +/* + * Êä³öÓÐÏòͼGÖ㤶ÈΪkµÄ¼òµ¥Â·¾¶ + */ +void Algo_7_29(MGraph G, int k) { + int i; + int path[MAX_VERTEX_NUM + 1]; // 0ºÅµ¥ÔªÓÃÀ´¼Ç¼pathÖд洢µÄ¶¥µãÊýÁ¿ + + if(k <= 0) { + printf("²ÎÊý´íÎó£¡\n"); + return; + } + + // °ÑËùÓж¥µã±ê¼ÇΪδ·ÃÎÊ + for(i = 0; i < G.vexnum; i++) { + visited[i] = FALSE; + } + + path[0] = 0; + + printf("²éÕÒËùÓ㤶ÈΪ %d µÄ¼òµ¥Â·¾¶...\n", k); + + for(i = 0; i < G.vexnum; i++) { + SimplePath_7_29(G, i, k, path); + } + +} + +/* + * ²éÕÒÓÐÏòͼGÖ㤶ÈΪkµÄ¼òµ¥Â·¾¶ + */ +void SimplePath_7_29(MGraph G, int start, int k, int path[MAX_VERTEX_NUM]) { + int i, w; + + path[0]++; + path[path[0]] = start; + visited[start] = TRUE; // ±ê¼Ç¸Ã¶¥µãÒÑ·ÃÎÊ + + // Èç¹ûÓöµ½³¤¶ÈΪkµÄ·¾¶(¶¥µãÊý = ·¾¶³¤¶È+1)£¬ÔòÊä³öËü + if(path[0] == k + 1) { + // Êä³öÕÒµ½µÄ¼òµ¥Â·¾¶ + for(i = 1; i <= path[0]; i++) { + printf("%c ", GetVex(G, path[i])); + } + printf("\n"); + } else { + // Éî¶ÈÓÅÏȱéÀú + for(w = FirstAdjVex(G, G.vexs[start]); + w >= 0; + w = NextAdjVex(G, G.vexs[start], G.vexs[w])) { + // ºöÂÔÒÑ·ÃÎʹýµÄ¶¥µã + if(visited[w] == TRUE) { + continue; + } + + SimplePath_7_29(G, w, k, path); + } + } + + // ´Ó·¾¶ÖÐÒÆ³ý¸Ã¶¥µã£¬²¢½«Æä״̬½µ¼¶Îª"ÒÑ·ÃÎÊ" + path[0]--; + visited[start] = FALSE; // Çå³ý·ÃÎʱê¼Ç +} diff --git a/Dev-C++/ExerciseBook/07.29/07.29.dev b/Dev-C++/ExerciseBook/07.29/07.29.dev new file mode 100644 index 0000000..26cd5e3 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.29/07.29.dev @@ -0,0 +1,91 @@ +[Project] +FileName=07.29.dev +Name=07.29 +Type=1 +Ver=2 +ObjFiles= +Includes= +Libs= +PrivateResource= +ResourceIncludes= +MakeIncludes= +Compiler= +CppCompiler= +Linker= +IsCpp=0 +Icon= +ExeOutput= +ObjectOutput= +LogOutput= +LogOutputEnabled=0 +OverrideOutput=0 +OverrideOutputName= +HostApplication= +UseCustomMakefile=0 +CustomMakefile= +CommandLine= +Folders= +IncludeVersionInfo=0 +SupportXPThemes=0 +CompilerSet=1 +CompilerSettings=0000000000000000001000000 +UnitCount=4 + +[VersionInfo] +Major=1 +Minor=0 +Release=0 +Build=0 +LanguageID=1033 +CharsetID=1252 +CompanyName= +FileVersion= +FileDescription=Developed using the Dev-C++ IDE +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion= +AutoIncBuildNr=0 +SyncProduct=1 + +[Unit1] +FileName=07.29.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit2] +FileName=MGraph.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit3] +FileName=MGraph.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit4] +FileName=TestData_DG.txt +Folder= +Compile=0 +Link=0 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + diff --git a/Dev-C++/ExerciseBook/07.29/07.29.png b/Dev-C++/ExerciseBook/07.29/07.29.png new file mode 100644 index 0000000000000000000000000000000000000000..d814ec27df79db865275062fa483cfa48ee7242e GIT binary patch literal 10441 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 G.vexnum) { + return '\0'; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + return G.vexs[v]; +} + +/* + * Ê׸öÁÚ½Óµã + * + * ·µ»Ø¶¥µãvµÄÊ׸öÁÚ½Óµã + */ +int FirstAdjVex(MGraph G, VertexType v) { + int kv, j; + VRType adj; + + kv = LocateVex(G, v); + if(kv == -1) { + return -1; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + // È·¶¨Ò»¸ö·ÇÁ¬Í¨±ê¼Ç + if(G.kind == DG || G.kind == UDG) { + adj = 0; // ͼ + } else if(G.kind == DN || G.kind == UDN) { + adj = INFINITE; // Íø + } else { + return -1; + } + + // ´ÓÍ·¿ªÊ¼²éÕÒ + for(j = 0; j < G.vexnum; j++) { + // ÕÒµ½ÓëvÖ±½ÓÁ¬½ÓµÄ¶¥µã + if(G.arcs[kv][j].adj != adj) { + return j; + } + } + + return -1; +} + +/* + * ÏÂÒ»¸öÁÚ½Óµã + * + * ·µ»Ø¶¥µãvµÄ(Ïà¶ÔÓÚwµÄ)ÏÂÒ»¸öÁÚ½Óµã + */ +int NextAdjVex(MGraph G, VertexType v, VertexType w) { + int kv, kw, j; + VRType adj; + + kv = LocateVex(G, v); + if(kv == -1) { + return -1; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + kw = LocateVex(G, w); + if(kw == -1) { + return -1; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + // È·¶¨Ò»¸ö·ÇÁ¬Í¨±ê¼Ç + if(G.kind == DG || G.kind == UDG) { + adj = 0; // ͼ + } else if(G.kind == DN || G.kind == UDN) { + adj = INFINITE; // Íø + } else { + return -1; + } + + // ´Ó¶¥µãwºó¿ªÊ¼²éÕÒ + for(j = kw + 1; j < G.vexnum; j++) { + // ÕÒµ½ÓëvÖ±½ÓÁ¬½ÓµÄ¶¥µã + if(G.arcs[kv][j].adj != adj) { + return j; + } + } + + return -1; +} + +/* + * ÒÔͼÐλ¯ÐÎʽÊä³öµ±Ç°½á¹¹ + * + * ×¢£ºÔÚÍøÖУ¬Ê¹ÓÃ"-"À´±íʾÁ½¶¥µã²»Ö±½ÓÁ¬Í¨ + */ +void PrintGraph(MGraph G) { + int i, j; + + if(G.vexnum == 0) { + printf("¿Õͼ£¬ÎÞÐè´òÓ¡£¡\n"); + return; + } + + printf("µ±Ç°Í¼/Íø°üº¬ %2d ¸ö¶¥µã£¬ %2d Ìõ±ß/»¡...\n", G.vexnum, G.arcnum); + + printf(" "); + for(i = 0; i < G.vexnum; i++) { + printf(" %c", G.vexs[i]); + } + printf("\n"); + + for(i = 0; i < G.vexnum; i++) { + printf("%c ", G.vexs[i]); + + for(j = 0; j < G.vexnum; j++) { + if(((G.kind == DG || G.kind == UDG) && G.arcs[i][j].adj == 0) || ((G.kind == DN || G.kind == UDN) && G.arcs[i][j].adj == INFINITE)) { + printf(" -"); + } else { + printf("%3d", G.arcs[i][j].adj); + } + } + + printf("\n"); + } +} diff --git a/Dev-C++/ExerciseBook/07.29/MGraph.h b/Dev-C++/ExerciseBook/07.29/MGraph.h new file mode 100644 index 0000000..143f540 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.29/MGraph.h @@ -0,0 +1,133 @@ +/*================================= + * ͼµÄÊý×é(ÁÚ½Ó¾ØÕó)´æ´¢±íʾ + * + * °üº¬Ëã·¨: 7.1¡¢7.2¡¢7.4¡¢7.5¡¢7.6 + ==================================*/ + +#ifndef MGRAPH_H +#define MGRAPH_H + +#include +#include // ÌṩºêINT_MAX +#include // Ìṩmemset¡¢strcmp Ô­ÐÍ +#include // Ìṩºêva_list¡¢va_start¡¢va_arg¡¢va_end +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// + +/* + * ×¢£º + * + * ͨ³£À´½²£¬ÎÞȨͼ±»¼ò³ÆÎª¡¾Í¼¡¿£¬ÓÐȨͼ±»¼ò³ÆÎª¡¾Íø¡¿¡£ + * ÎÞÏòͼ/ÍøÖеĶ¥µã¹ØÏµ±»³ÆÎª¡¾±ß¡¿£¬ÓÐÏòͼ/ÍøÖеĶ¥µã¹ØÏµ±»³ÆÎª¡¾»¡¡¿£¬²¢Çø·Ö»¡Í·Ó뻡β¡£ + * ʵ¼Ê±íÊöÖУ¬Î´±Ø»áÑϸñ×ñÊØÒÔÉÏÃüÃû¡£ + */ + +/* ºê¶¨Òå */ +#define INFINITE INT_MAX // ×î´óÖµ£¬ÓÃÀ´±íÊ¾ÍøÖеÄÁ½¸ö¶¥µã²»Ö±½ÓÁ¬½Ó +#define MAX_VERTEX_NUM 26 // ×î´ó¶¥µã¸öÊý + + +// ͼµÄÀàÐÍ +typedef enum { + DG, // 0-ÓÐÏòͼ + DN, // 1-ÓÐÏòÍø(´øÈ¨Öµ) + UDG, // 2-ÎÞÏòͼ + UDN // 3-ÎÞÏòÍø(´øÈ¨Öµ) +} GraphKind; + +// ¶¥µãÀàÐÍ +typedef char VertexType; + +/* + * ¶¥µã¹ØÏµÀàÐÍ + * + * ÔÚÎÞȨͼÖУ¬¸Ãֵͨ³£Îª0»ò1£¬±íʾÁ½¶¥µãÊÇ·ñÖ±½ÓÁ¬Í¨£» + * ÔÚÓÐȨͼÖУ¬¸Ãֵͨ³£ÎªÈ¨Öµ¡£ + */ +typedef int VRType; + +// ±ßµÄÏà¹Ø¸½¼ÓÐÅÏ¢ +typedef struct { + // Èç¹ûÓеϰ£¬ºóÐø»áÌí¼ÓÏàÓ¦µÄÊôÐÔ +} InfoType; + +// ±ßµÄÀàÐÍ£¬Ã¿Ìõ±ßÉÏ¿ÉÄÜÓи½¼ÓÐÅÏ¢info +typedef struct ArcCell { + VRType adj; // ¶¥µã¹ØÏµ£¬ÔÚÓÐȨͼ¸úÎÞȨͼÖеĺ¬Ò岻ͬ + InfoType* info; // ±ßµÄ¸½¼ÓÐÅÏ¢£¬Í¨³£ºöÂÔ +} ArcCell; + +/* ͼ/ÍøµÄÊý×é(ÁÚ½Ó¾ØÕó)´æ´¢±íʾÀàÐͶ¨Òå */ +typedef struct { + VertexType vexs[MAX_VERTEX_NUM]; // ¶¥µãÏòÁ¿ + ArcCell arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; // ÁÚ½Ó¾ØÕó + int vexnum, arcnum; // ͼ/ÍøµÄ¶¥µãÊýºÍ»¡Êý + GraphKind kind; // ͼµÄÀàÐͱêÖ¾ +} MGraph; + + +// ±ß/»¡ÉÏÊÇ·ñ´æÔÚ¸½¼ÓÐÅÏ¢ +extern Boolean IncInfo; + + +/* + * ¨€¨€¨€¨€¨€¨€¨€¨€ Ëã·¨7.1 ¨€¨€¨€¨€¨€¨€¨€¨€ + * + * ´´½¨ + * + *¡¾±¸×¢¡¿ + * + * ½Ì²ÄÖÐĬÈÏ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý¡£ + * ÕâÀïΪÁË·½±ã²âÊÔ£¬±ÜÃâÿ´ÎÔËÐж¼ÊÖ¶¯ÊäÈëÊý¾Ý£¬ + * Òò¶øÔÊÐíÑ¡Ôñ´ÓÔ¤ÉèµÄÎļþpathÖжÁÈ¡²âÊÔÊý¾Ý¡£ + * + * Èç¹ûÐèÒª´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý£¬ÔòpathΪNULL£¬»òpath[kind]Ϊ""¡£ + * Èç¹ûÐèÒª´ÓÎļþÖжÁÈ¡Êý¾Ý£¬ÔòÐèÒªÔÚpathÖÐÌîдÎļþÃûÐÅÏ¢¡£ + */ +Status CreateGraph(MGraph* G, char* path[]); + +/* + * ¹¹ÔìÎÞÏòͼ + */ +static Status CreateDG(MGraph* G); + +/* + * ¼Èë±ßµÄÏà¹Ø¸½¼ÓÐÅÏ¢ + */ +static void Input(MGraph G, InfoType** info); + +/* + * ²éÕÒ + * + * ·µ»Ø¶¥µãuÔÚͼ/ÍøÖеÄλÖà + */ +int LocateVex(MGraph G, VertexType u); + +/* + * ȡֵ + * + * ·µ»ØË÷Òýv´¦µÄ¶¥µãÖµ + */ +VertexType GetVex(MGraph G, int v); + +/* + * Ê׸öÁÚ½Óµã + * + * ·µ»Ø¶¥µãvµÄÊ׸öÁÚ½Óµã + */ +int FirstAdjVex(MGraph G, VertexType v); + +/* + * ÏÂÒ»¸öÁÚ½Óµã + * + * ·µ»Ø¶¥µãvµÄ(Ïà¶ÔÓÚwµÄ)ÏÂÒ»¸öÁÚ½Óµã + */ +int NextAdjVex(MGraph G, VertexType v, VertexType w); + +/* + * ÒÔͼÐλ¯ÐÎʽÊä³öµ±Ç°½á¹¹ + * + * ×¢£ºÔÚÍøÖУ¬Ê¹ÓÃ"-"À´±íʾÁ½¶¥µã²»Ö±½ÓÁ¬Í¨ + */ +void PrintGraph(MGraph G); + +#endif diff --git a/Dev-C++/ExerciseBook/07.29/TestData_DG.txt b/Dev-C++/ExerciseBook/07.29/TestData_DG.txt new file mode 100644 index 0000000..a19ece0 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.29/TestData_DG.txt @@ -0,0 +1,6 @@ +ͼÀàÐÍ¡ú0£¨ÓÐÏòͼ£© +¶¥µãÊý¡ú8 +»¡Êý¡ú11 +»¡ÊÇ·ñ´øÓÐÆäËûÐÅÏ¢¡ú0 +¶¥µã¼¯¡ú¡¾a£¬b£¬c£¬d£¬e£¬f£¬u£¬v¡¿ +»¡µÄ¼¯ºÏ¡ú¡¾u£¬c¡¿¡¾c£¬d¡¿¡¾d£¬e¡¿¡¾e£¬u¡¿¡¾d£¬v¡¿¡¾e£¬f¡¿¡¾f£¬v¡¿¡¾v£¬b¡¿¡¾b£¬f¡¿¡¾u£¬a¡¿¡¾a£¬b¡¿ \ No newline at end of file diff --git a/Dev-C++/ExerciseBook/07.30/07.30.cpp b/Dev-C++/ExerciseBook/07.30/07.30.cpp new file mode 100644 index 0000000..3deb3ff --- /dev/null +++ b/Dev-C++/ExerciseBook/07.30/07.30.cpp @@ -0,0 +1,99 @@ +#include +#include "Status.h" +#include "MGraph.h" + +// ·ÃÎʱêÖ¾Êý×飬¼Ç¼·ÃÎʹýµÄ¶¥µã +static Boolean visited[MAX_VERTEX_NUM]; + + +/* + * ÕÒ³öÓÐÏòͼÖÐËùÓлØÂ· + */ +void Algo_7_30(MGraph G); + +/* + * ´òÓ¡ÓÐÏòͼÖÐËùÓлØÂ· + */ +void Circuit_7_30(MGraph G, int start, int end, int path[MAX_VERTEX_NUM + 1]); + + +int main(int argc, char* argv[]) { + MGraph G; + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ´´½¨²¢Êä³öͼ...\n"); + { + char* path[4]; + + path[0] = "TestData_DG.txt"; + path[1] = ""; + path[2] = ""; + path[3] = ""; + + CreateGraph(&G, path); + PrintGraph(G); + printf("\n"); + } + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ²éÕÒͼÖеĻØÂ·...\n"); + { + Algo_7_30(G); + printf("\n"); + } + + return 0; +} + + +/* + * ÕÒ³öÓÐÏòͼÖÐËùÓлØÂ· + */ +void Algo_7_30(MGraph G) { + int i; + int path[MAX_VERTEX_NUM + 1]; // 0ºÅµ¥ÔªÓÃÀ´¼Ç¼pathÖд洢µÄ¶¥µãÊýÁ¿ + + // °ÑËùÓж¥µã±ê¼ÇΪδ·ÃÎÊ + for(i = 0; i < G.vexnum; i++) { + visited[i] = FALSE; + } + + path[0] = 0; + + for(i = 0; i < G.vexnum; i++) { + Circuit_7_30(G, i, i, path); + } +} + +/* + * ´òÓ¡ÓÐÏòͼÖÐËùÓлØÂ· + */ +void Circuit_7_30(MGraph G, int start, int end, int path[MAX_VERTEX_NUM]) { + int i, w; + + path[0]++; + path[path[0]] = start; + visited[start] = TRUE; // ±ê¼Ç¸Ã¶¥µãÒѽøÈë·¾¶ + + // ±éÀú¶¥µãstartµÄÁÚ½Óµã + for(w = FirstAdjVex(G, G.vexs[start]); w >= 0; w = NextAdjVex(G, G.vexs[start], G.vexs[w])) { + // Èç¹ûÓöµ½ÁËÒÑÔÚ·¾¶ÖеÄÁڽӵ㣬˵Ã÷³öÏÖÁË»ØÂ· + if(visited[w] == TRUE) { + if(w == end) { + // Êä³ö»ØÂ· + for(i = 1; i <= path[0]; i++) { + printf("%c -> ", GetVex(G, path[i])); + } + printf("%c\n", GetVex(G, w)); + } + + } else { + // ɸµôÖØ¸´Â·¾¶ + if(w > end) { + Circuit_7_30(G, w, end, path); + } + } + } + + // ´Ó·¾¶ÖÐÒÆ³ý¸Ã¶¥µã£¬²¢½«Æä״̬½µ¼¶Îª"ÒÑ·ÃÎÊ" + path[0]--; + visited[start] = FALSE; +} diff --git a/Dev-C++/ExerciseBook/07.30/07.30.dev b/Dev-C++/ExerciseBook/07.30/07.30.dev new file mode 100644 index 0000000..017e6da --- /dev/null +++ b/Dev-C++/ExerciseBook/07.30/07.30.dev @@ -0,0 +1,91 @@ +[Project] +FileName=07.30.dev +Name=07.30 +Type=1 +Ver=2 +ObjFiles= +Includes= +Libs= +PrivateResource= +ResourceIncludes= +MakeIncludes= +Compiler= +CppCompiler= +Linker= +IsCpp=0 +Icon= +ExeOutput= +ObjectOutput= +LogOutput= +LogOutputEnabled=0 +OverrideOutput=0 +OverrideOutputName= +HostApplication= +UseCustomMakefile=0 +CustomMakefile= +CommandLine= +Folders= +IncludeVersionInfo=0 +SupportXPThemes=0 +CompilerSet=1 +CompilerSettings=0000000000000000001000000 +UnitCount=4 + +[VersionInfo] +Major=1 +Minor=0 +Release=0 +Build=0 +LanguageID=1033 +CharsetID=1252 +CompanyName= +FileVersion= +FileDescription=Developed using the Dev-C++ IDE +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion= +AutoIncBuildNr=0 +SyncProduct=1 + +[Unit1] +FileName=07.30.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit2] +FileName=MGraph.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit3] +FileName=MGraph.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit4] +FileName=TestData_DG.txt +Folder= +Compile=0 +Link=0 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + diff --git a/Dev-C++/ExerciseBook/07.30/07.30.png b/Dev-C++/ExerciseBook/07.30/07.30.png new file mode 100644 index 0000000000000000000000000000000000000000..02410bc62be3037124e596cce3277db9eab58733 GIT binary patch literal 10195 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 literal 0 HcmV?d00001 diff --git a/Dev-C++/ExerciseBook/07.30/MGraph.cpp b/Dev-C++/ExerciseBook/07.30/MGraph.cpp new file mode 100644 index 0000000..44a9b17 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.30/MGraph.cpp @@ -0,0 +1,299 @@ +/*================================= + * ͼµÄÊý×é(ÁÚ½Ó¾ØÕó)´æ´¢±íʾ + * + * °üº¬Ëã·¨: 7.1¡¢7.2¡¢7.4¡¢7.5¡¢7.6 + ==================================*/ + +#include "MGraph.h" //**¡ø07 ͼ**// + +// ¼ÈëÊý¾ÝµÄÔ´Îļþ£»fpΪnullʱ£¬ËµÃ÷ÐèÒª´Ó¿ØÖÆÌ¨Â¼Èë +static FILE* fp = NULL; + +/* + * IncInfoָʾ¸Ãͼ/ÍøµÄ±ß/»¡ÉÏÊÇ·ñ´æÔÚ¸½¼ÓÐÅÏ¢¡£ + * Èç¹ûÆäÖµ²»Îª0£¬Ôò±íʾÎÞ¸½¼ÓÐÅÏ¢£¬·ñÔò£¬±íʾ´æÔÚ¸½¼ÓÐÅÏ¢¡£ + */ +Boolean IncInfo = FALSE; + + +/* + * ¨€¨€¨€¨€¨€¨€¨€¨€ Ëã·¨7.1 ¨€¨€¨€¨€¨€¨€¨€¨€ + * + * ´´½¨Í¼/±í + * + *¡¾±¸×¢¡¿ + * + * ½Ì²ÄÖÐĬÈÏ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý¡£ + * ÕâÀïΪÁË·½±ã²âÊÔ£¬±ÜÃâÿ´ÎÔËÐж¼ÊÖ¶¯ÊäÈëÊý¾Ý£¬ + * Òò¶øÔÊÐíÑ¡Ôñ´ÓÔ¤ÉèµÄÎļþpathÖжÁÈ¡²âÊÔÊý¾Ý¡£ + * + * Èç¹ûÐèÒª´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý£¬ÔòpathΪNULL£¬»òpath[kind]Ϊ""¡£ + * Èç¹ûÐèÒª´ÓÎļþÖжÁÈ¡Êý¾Ý£¬ÔòÐèÒªÔÚpathÖÐÌîдÎļþÃûÐÅÏ¢¡£ + */ +Status CreateGraph(MGraph* G, char* path[]) { + int readFromConsole; // ÊÇ·ñ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý + int kind; + Status flag; + + // ¡ï¡ï¡ï´Ë´¦¹Ì¶¨ÎªÓÐÏòͼ + kind = 0; + + // Èç¹ûûÓÐÎļþ·¾¶ÐÅÏ¢£¬Ôò´Ó¿ØÖÆÌ¨¶ÁÈ¡ÊäÈë + readFromConsole = (path == NULL) || strcmp(path[kind], "") == 0; + + // ÐèÒª´ÓÎļþ¶ÁÈ¡ + if(readFromConsole) { + (*G).kind = GraphKind(kind); // ¼Ç¼ͼ/ÍøµÄÀàÐÍ + } else { + // ´ò¿ªÎļþ£¬×¼±¸¶ÁÈ¡²âÊÔÊý¾Ý + fp = fopen(path[kind], "r"); + if(fp == NULL) { + return ERROR; + } + + // ¼ÈëͼµÄÀàÐÍ + ReadData(fp, "%d", &((*G).kind)); + } + + // Ëæ»ú´´½¨ÓÐÏòͼ/Íø»òÎÞÏòͼ/ÍøµÄÒ»ÖÖ + switch((*G).kind) { + case DG: + flag = CreateDG(G); + break; + default: + flag = ERROR; + break; + } + + if(fp != NULL) { + fclose(fp); + fp = NULL; + } + + return flag; +} + +/* + * ¹¹ÔìÓÐÏòͼ + */ +static Status CreateDG(MGraph* G) { + int i, j, k; + ArcCell arcs = {0, NULL}; // ÓÐÏòͼÿÌõ±ßµÄ³õʼֵ + VertexType v1, v2; + + if(fp == NULL) { + printf("ÇëÊäÈëÓÐÏòͼµÄ¶¥µãÊý£º"); + scanf("%d", &((*G).vexnum)); + printf("ÇëÊäÈëÓÐÏòͼµÄ»¡Êý£º"); + scanf("%d", &((*G).arcnum)); + printf("¸ÃÓÐÏòͼµÄ»¡ÉÏÊÇ·ñ°üº¬ÆäËû¸½¼ÓÐÅÏ¢(0-²»°üº¬©¦1-°üº¬)£º"); + scanf("%d", &IncInfo); + + // ¼Èë¶¥µã¼¯ + printf("Çë¼Èë %d ¸ö¶¥µã£¬²»Í¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º", (*G).vexnum); + for(i = 0; i < (*G).vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(stdin); + scanf("%c", &((*G).vexs[i])); + } + } else { + ReadData(fp, "%d", &((*G).vexnum)); // ¼Èë¶¥µãÊý + ReadData(fp, "%d", &((*G).arcnum)); // ¼È뻡Êý + ReadData(fp, "%d", &IncInfo); // Åжϻ¡ÉÏÊÇ·ñ°üº¬¸½¼ÓÐÅÏ¢ + + // ¼Èë¶¥µã¼¯ + for(i = 0; i < (*G).vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(fp); + ReadData(fp, "%c", &((*G).vexs[i])); + } + } + + // ³õʼ»¯ÓÐÏòͼµÄÁÚ½Ó¾ØÕó + for(i = 0; i < (*G).vexnum; i++) { + for(j = 0; j < (*G).vexnum; j++) { + (*G).arcs[i][j] = arcs; + } + } + + // ½öÔÚ¿ØÖÆÌ¨Â¼ÈëÐÅϢʱÊä³ö´ËÌáʾ + if(fp == NULL && (*G).arcnum != 0) { + printf("ÇëΪÓÐÏòͼÒÀ´Î¼Èë %d Ìõ»¡µÄÐÅÏ¢£¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º\n", (*G).arcnum); + } + + // ¼È뻡µÄÐÅÏ¢ + for(k = 0; k < (*G).arcnum; k++) { + if(fp == NULL) { + printf("µÚ %2d Ìõ»¡£º", k + 1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v2); + } else { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + skipBlank(fp); + ReadData(fp, "%c%c", &v1, &v2); + } + + i = LocateVex(*G, v1); // »ñÈ¡¶¥µãv1ÔÚ¶¥µã¼¯ÖеÄλÖà + j = LocateVex(*G, v2); // »ñÈ¡¶¥µãv2ÔÚ¶¥µã¼¯ÖеÄλÖà + + // ½«Ö¸¶¨µÄ¶¥µã¹ØÏµÉèÖÃΪ1£¬Ö¸Ê¾ÕâÁ½¸ö¶¥µãÊÇÖ±½ÓÁ¬½ÓµÄ(×¢£ºÕâÀïûÓÐÑé֤ϱêÊÇ·ñÔ½½ç) + (*G).arcs[i][j].adj = 1; + + // Èç¹ûÐèҪ¼È뻡µÄÆäËû¸½¼ÓÐÅÏ¢ + if(IncInfo) { + // ×îºó¼È븽¼ÓÐÅÏ¢ + Input(*G, &((*G).arcs[i][j].info)); + } + } + + // ´ÓÎļþÖжÁÈ¡Êý¾Ýʱ£¬×îºóÆäʵӦµ±ÅжÏÒ»ÏÂÊÇ·ñ¶Áµ½ÁË×ã¹»µÄÐÅÏ¢ + return OK; +} + +/* + * ¼Èë±ß/»¡µÄÏà¹Ø¸½¼ÓÐÅÏ¢ + */ +static void Input(MGraph G, InfoType** info) { + //¼Èë±ß/»¡µÄÐÅÏ¢£¬±¾²âÊÔÉæ¼°µ½µÄ±ß/»¡Ä¬ÈÏÎÞÆäËû¸½¼ÓÐÅÏ¢ +} + +/* + * ²éÕÒ + * + * ·µ»Ø¶¥µãuÔÚͼ/ÍøÖеÄλÖà + */ +int LocateVex(MGraph G, VertexType u) { + int i; + + for(i = 0; i < G.vexnum; i++) { + if(G.vexs[i] == u) { + return i; + } + } + + return -1; +} + +/* + * ȡֵ + * + * ·µ»ØË÷Òýv´¦µÄ¶¥µãÖµ + */ +VertexType GetVex(MGraph G, int v) { + if(v < 0 || v >= G.vexnum) { + return '\0'; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + return G.vexs[v]; +} + +/* + * Ê׸öÁÚ½Óµã + * + * ·µ»Ø¶¥µãvµÄÊ׸öÁÚ½Óµã + */ +int FirstAdjVex(MGraph G, VertexType v) { + int kv, j; + VRType adj; + + kv = LocateVex(G, v); + if(kv == -1) { + return -1; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + // È·¶¨Ò»¸ö·ÇÁ¬Í¨±ê¼Ç + if(G.kind == DG || G.kind == UDG) { + adj = 0; // ͼ + } else if(G.kind == DN || G.kind == UDN) { + adj = INFINITE; // Íø + } else { + return -1; + } + + // ´ÓÍ·¿ªÊ¼²éÕÒ + for(j = 0; j < G.vexnum; j++) { + // ÕÒµ½ÓëvÖ±½ÓÁ¬½ÓµÄ¶¥µã + if(G.arcs[kv][j].adj != adj) { + return j; + } + } + + return -1; +} + +/* + * ÏÂÒ»¸öÁÚ½Óµã + * + * ·µ»Ø¶¥µãvµÄ(Ïà¶ÔÓÚwµÄ)ÏÂÒ»¸öÁÚ½Óµã + */ +int NextAdjVex(MGraph G, VertexType v, VertexType w) { + int kv, kw, j; + VRType adj; + + kv = LocateVex(G, v); + if(kv == -1) { + return -1; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + kw = LocateVex(G, w); + if(kw == -1) { + return -1; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + // È·¶¨Ò»¸ö·ÇÁ¬Í¨±ê¼Ç + if(G.kind == DG || G.kind == UDG) { + adj = 0; // ͼ + } else if(G.kind == DN || G.kind == UDN) { + adj = INFINITE; // Íø + } else { + return -1; + } + + // ´Ó¶¥µãwºó¿ªÊ¼²éÕÒ + for(j = kw + 1; j < G.vexnum; j++) { + // ÕÒµ½ÓëvÖ±½ÓÁ¬½ÓµÄ¶¥µã + if(G.arcs[kv][j].adj != adj) { + return j; + } + } + + return -1; +} + +/* + * ÒÔͼÐλ¯ÐÎʽÊä³öµ±Ç°½á¹¹ + * + * ×¢£ºÔÚÍøÖУ¬Ê¹ÓÃ"-"À´±íʾÁ½¶¥µã²»Ö±½ÓÁ¬Í¨ + */ +void PrintGraph(MGraph G) { + int i, j; + + if(G.vexnum == 0) { + printf("¿Õͼ£¬ÎÞÐè´òÓ¡£¡\n"); + return; + } + + printf("µ±Ç°Í¼/Íø°üº¬ %2d ¸ö¶¥µã£¬ %2d Ìõ±ß/»¡...\n", G.vexnum, G.arcnum); + + printf(" "); + for(i = 0; i < G.vexnum; i++) { + printf(" %c", G.vexs[i]); + } + printf("\n"); + + for(i = 0; i < G.vexnum; i++) { + printf("%c ", G.vexs[i]); + + for(j = 0; j < G.vexnum; j++) { + if(((G.kind == DG || G.kind == UDG) && G.arcs[i][j].adj == 0) || ((G.kind == DN || G.kind == UDN) && G.arcs[i][j].adj == INFINITE)) { + printf(" -"); + } else { + printf("%3d", G.arcs[i][j].adj); + } + } + + printf("\n"); + } +} diff --git a/Dev-C++/ExerciseBook/07.30/MGraph.h b/Dev-C++/ExerciseBook/07.30/MGraph.h new file mode 100644 index 0000000..143f540 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.30/MGraph.h @@ -0,0 +1,133 @@ +/*================================= + * ͼµÄÊý×é(ÁÚ½Ó¾ØÕó)´æ´¢±íʾ + * + * °üº¬Ëã·¨: 7.1¡¢7.2¡¢7.4¡¢7.5¡¢7.6 + ==================================*/ + +#ifndef MGRAPH_H +#define MGRAPH_H + +#include +#include // ÌṩºêINT_MAX +#include // Ìṩmemset¡¢strcmp Ô­ÐÍ +#include // Ìṩºêva_list¡¢va_start¡¢va_arg¡¢va_end +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// + +/* + * ×¢£º + * + * ͨ³£À´½²£¬ÎÞȨͼ±»¼ò³ÆÎª¡¾Í¼¡¿£¬ÓÐȨͼ±»¼ò³ÆÎª¡¾Íø¡¿¡£ + * ÎÞÏòͼ/ÍøÖеĶ¥µã¹ØÏµ±»³ÆÎª¡¾±ß¡¿£¬ÓÐÏòͼ/ÍøÖеĶ¥µã¹ØÏµ±»³ÆÎª¡¾»¡¡¿£¬²¢Çø·Ö»¡Í·Ó뻡β¡£ + * ʵ¼Ê±íÊöÖУ¬Î´±Ø»áÑϸñ×ñÊØÒÔÉÏÃüÃû¡£ + */ + +/* ºê¶¨Òå */ +#define INFINITE INT_MAX // ×î´óÖµ£¬ÓÃÀ´±íÊ¾ÍøÖеÄÁ½¸ö¶¥µã²»Ö±½ÓÁ¬½Ó +#define MAX_VERTEX_NUM 26 // ×î´ó¶¥µã¸öÊý + + +// ͼµÄÀàÐÍ +typedef enum { + DG, // 0-ÓÐÏòͼ + DN, // 1-ÓÐÏòÍø(´øÈ¨Öµ) + UDG, // 2-ÎÞÏòͼ + UDN // 3-ÎÞÏòÍø(´øÈ¨Öµ) +} GraphKind; + +// ¶¥µãÀàÐÍ +typedef char VertexType; + +/* + * ¶¥µã¹ØÏµÀàÐÍ + * + * ÔÚÎÞȨͼÖУ¬¸Ãֵͨ³£Îª0»ò1£¬±íʾÁ½¶¥µãÊÇ·ñÖ±½ÓÁ¬Í¨£» + * ÔÚÓÐȨͼÖУ¬¸Ãֵͨ³£ÎªÈ¨Öµ¡£ + */ +typedef int VRType; + +// ±ßµÄÏà¹Ø¸½¼ÓÐÅÏ¢ +typedef struct { + // Èç¹ûÓеϰ£¬ºóÐø»áÌí¼ÓÏàÓ¦µÄÊôÐÔ +} InfoType; + +// ±ßµÄÀàÐÍ£¬Ã¿Ìõ±ßÉÏ¿ÉÄÜÓи½¼ÓÐÅÏ¢info +typedef struct ArcCell { + VRType adj; // ¶¥µã¹ØÏµ£¬ÔÚÓÐȨͼ¸úÎÞȨͼÖеĺ¬Ò岻ͬ + InfoType* info; // ±ßµÄ¸½¼ÓÐÅÏ¢£¬Í¨³£ºöÂÔ +} ArcCell; + +/* ͼ/ÍøµÄÊý×é(ÁÚ½Ó¾ØÕó)´æ´¢±íʾÀàÐͶ¨Òå */ +typedef struct { + VertexType vexs[MAX_VERTEX_NUM]; // ¶¥µãÏòÁ¿ + ArcCell arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; // ÁÚ½Ó¾ØÕó + int vexnum, arcnum; // ͼ/ÍøµÄ¶¥µãÊýºÍ»¡Êý + GraphKind kind; // ͼµÄÀàÐͱêÖ¾ +} MGraph; + + +// ±ß/»¡ÉÏÊÇ·ñ´æÔÚ¸½¼ÓÐÅÏ¢ +extern Boolean IncInfo; + + +/* + * ¨€¨€¨€¨€¨€¨€¨€¨€ Ëã·¨7.1 ¨€¨€¨€¨€¨€¨€¨€¨€ + * + * ´´½¨ + * + *¡¾±¸×¢¡¿ + * + * ½Ì²ÄÖÐĬÈÏ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý¡£ + * ÕâÀïΪÁË·½±ã²âÊÔ£¬±ÜÃâÿ´ÎÔËÐж¼ÊÖ¶¯ÊäÈëÊý¾Ý£¬ + * Òò¶øÔÊÐíÑ¡Ôñ´ÓÔ¤ÉèµÄÎļþpathÖжÁÈ¡²âÊÔÊý¾Ý¡£ + * + * Èç¹ûÐèÒª´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý£¬ÔòpathΪNULL£¬»òpath[kind]Ϊ""¡£ + * Èç¹ûÐèÒª´ÓÎļþÖжÁÈ¡Êý¾Ý£¬ÔòÐèÒªÔÚpathÖÐÌîдÎļþÃûÐÅÏ¢¡£ + */ +Status CreateGraph(MGraph* G, char* path[]); + +/* + * ¹¹ÔìÎÞÏòͼ + */ +static Status CreateDG(MGraph* G); + +/* + * ¼Èë±ßµÄÏà¹Ø¸½¼ÓÐÅÏ¢ + */ +static void Input(MGraph G, InfoType** info); + +/* + * ²éÕÒ + * + * ·µ»Ø¶¥µãuÔÚͼ/ÍøÖеÄλÖà + */ +int LocateVex(MGraph G, VertexType u); + +/* + * ȡֵ + * + * ·µ»ØË÷Òýv´¦µÄ¶¥µãÖµ + */ +VertexType GetVex(MGraph G, int v); + +/* + * Ê׸öÁÚ½Óµã + * + * ·µ»Ø¶¥µãvµÄÊ׸öÁÚ½Óµã + */ +int FirstAdjVex(MGraph G, VertexType v); + +/* + * ÏÂÒ»¸öÁÚ½Óµã + * + * ·µ»Ø¶¥µãvµÄ(Ïà¶ÔÓÚwµÄ)ÏÂÒ»¸öÁÚ½Óµã + */ +int NextAdjVex(MGraph G, VertexType v, VertexType w); + +/* + * ÒÔͼÐλ¯ÐÎʽÊä³öµ±Ç°½á¹¹ + * + * ×¢£ºÔÚÍøÖУ¬Ê¹ÓÃ"-"À´±íʾÁ½¶¥µã²»Ö±½ÓÁ¬Í¨ + */ +void PrintGraph(MGraph G); + +#endif diff --git a/Dev-C++/ExerciseBook/07.30/TestData_DG.txt b/Dev-C++/ExerciseBook/07.30/TestData_DG.txt new file mode 100644 index 0000000..1a2f808 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.30/TestData_DG.txt @@ -0,0 +1,6 @@ +ͼÀàÐÍ¡ú0£¨ÓÐÏòͼ£© +¶¥µãÊý¡ú12 +»¡Êý¡ú16 +»¡ÊÇ·ñ´øÓÐÆäËûÐÅÏ¢¡ú0 +¶¥µã¼¯¡ú¡¾A£¬B£¬C£¬D£¬E£¬F£¬G£¬H£¬I£¬J£¬K£¬L¡¿ +»¡µÄ¼¯ºÏ¡ú¡¾A£¬E¡¿¡¾B£¬E¡¿¡¾E£¬C¡¿¡¾C£¬F¡¿¡¾F£¬E¡¿¡¾D£¬E¡¿¡¾G£¬D¡¿¡¾E£¬H¡¿¡¾E£¬I¡¿¡¾I£¬H¡¿¡¾H£¬G¡¿¡¾J£¬G¡¿¡¾H£¬K¡¿¡¾L£¬I¡¿¡¾L£¬K¡¿¡¾K£¬J¡¿ \ No newline at end of file diff --git a/Dev-C++/ExerciseBook/07.31/07.31.cpp b/Dev-C++/ExerciseBook/07.31/07.31.cpp new file mode 100644 index 0000000..ea76379 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.31/07.31.cpp @@ -0,0 +1,47 @@ +#include +#include "OLGraph.h" +#include "StronglyConnectedComponents.h" + +/* + * ÇóÓÐÏòͼµÄÇ¿Á¬Í¨·ÖÁ¿ + */ +void Algo_7_31(OLGraph G); + + +int main(int argc, char* argv[]) { + OLGraph G; + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ´´½¨²¢´òÓ¡ÓÐÏòͼ... \n"); + { + char* path[4]; + + path[0] = "TestData_DG.txt"; + path[1] = ""; + path[2] = ""; + path[3] = ""; + + CreateGraph(&G, path); + PrintGraph(G); + printf("\n"); + } + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ÇóÓÐÏòͼµÄÇ¿Á¬Í¨·ÖÁ¿... \n"); + { + Algo_7_31(G); + printf("\n"); + } + + return 0; +} + + +/* + * ÇóÓÐÏòͼµÄÇ¿Á¬Í¨·ÖÁ¿ + */ +void Algo_7_31(OLGraph G) { + printf("TarjanËã·¨£º\n"); + Tarjan(G); + +// printf("KosarajuËã·¨£º\n"); +// Kosaraju(G); +} diff --git a/Dev-C++/ExerciseBook/07.31/07.31.dev b/Dev-C++/ExerciseBook/07.31/07.31.dev new file mode 100644 index 0000000..fcbecf8 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.31/07.31.dev @@ -0,0 +1,111 @@ +[Project] +FileName=07.31.dev +Name=07.31 +Type=1 +Ver=2 +ObjFiles= +Includes= +Libs= +PrivateResource= +ResourceIncludes= +MakeIncludes= +Compiler= +CppCompiler= +Linker= +IsCpp=0 +Icon= +ExeOutput= +ObjectOutput= +LogOutput= +LogOutputEnabled=0 +OverrideOutput=0 +OverrideOutputName= +HostApplication= +UseCustomMakefile=0 +CustomMakefile= +CommandLine= +Folders= +IncludeVersionInfo=0 +SupportXPThemes=0 +CompilerSet=1 +CompilerSettings=0000000000000000001000000 +UnitCount=6 + +[VersionInfo] +Major=1 +Minor=0 +Release=0 +Build=0 +LanguageID=1033 +CharsetID=1252 +CompanyName= +FileVersion= +FileDescription=Developed using the Dev-C++ IDE +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion= +AutoIncBuildNr=0 +SyncProduct=1 + +[Unit1] +FileName=07.31.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit2] +FileName=OLGraph.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit3] +FileName=OLGraph.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit4] +FileName=StronglyConnectedComponents.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit5] +FileName=StronglyConnectedComponents.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit6] +FileName=TestData_DG.txt +Folder= +Compile=0 +Link=0 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + diff --git a/Dev-C++/ExerciseBook/07.31/07.31.png b/Dev-C++/ExerciseBook/07.31/07.31.png new file mode 100644 index 0000000000000000000000000000000000000000..51f1816934785bad42bae40219de9d96274fca32 GIT binary patch literal 55908 zcmYg%1yGgU_ccg&*Chl&Bm{{|cS?7s0!m1ChqQ2MX{B308lDfG#678gM+Jx#<+cp1b#=em(g{CgTwB4{0HA-S7-(YH+v;3DW>6Ww0DPP zt#9eMgoPoN%8!c9pcuhm(WtsurcZN#C@1n&GjN-n=y&bM2*n8;x6i)|8m-Q;im6$o zho-H5%=VMn44(C3?~k02vF!i(rYJxWVe0gq*IIT{wW}_UN)wbIW=R)R z9lyW7uRtHKK(Bdb)v!X@)LK%yIH(tUg1MVH01RAP$oO_2V5 zK!+bOP?Rj)z4twDeYej{EnhB-=-(oiFEXZ^kA?<)wWkZdk4MyCN3+!y;SW6S@;7tv z<9Yo}x?^WPi})+42(P#K?Q)H+Wzdzkc|8|O1+E+|O{XWOE0j3zxbs-KG3v0j>bPUP zC!!onhPIJByykI)srZ47&1chGPqdakjk)iv--jdc30_`I$V!Z%l5O_$c8W8=f^c_b z3&t^y`C$H&Ja}ADhZ#)hbS6CwCTYdCmQ4iBu|x0Q%>^ZgJZ|t;4W^o8cSYJaXNq!b zIDbC1n`|TH#a5&Jn+vr@3^RB~orERftIROuJa)n#l`So-$sG+UpN}KTg+xNZw{j0k_B6GUq z3@J4sf0dP6U&hmQK6`w5qfCKzq{6LTH*WGX!T)!JhSc_$h^#w{ejVSNTh9`+2YWkF zE3hBOl%ATNmdIj;$X4~w49Hl2{AX<%JMAW`QPPux^WuVWO69#!)C$7Khh3k=>PI`u z0yC^Q{N0ELTTC>6(P{N>*qPtI73t%JGY*-Julnm+xN1@x%2n$(t)DluK~L=*lx&R^ z{(E`k{=SXH%KG|xZ?BB8vGFv`-QC?Kl(^yP#{C&rkBjOHrzKV>FA;)Sy3Z09tvSn{|w}N zW1~J5VS z{rk5XJ`Q7WJZ)(BU|;oz4o*z1P80&+_j#VTc!2uVZK;c^=6g(bB;1u5yWZFeWr zAqb zH!(hT=xn{5!sFdfmWm_{rte!*7Wq9l_mQ=h!|dg2Xjv_@%PRciq}0P0ND756OB+N&^t^u4BL!)tXwVjcX82TSwH|cv~R*&P8BH)p(vPr^DW}bJh9k;Z!IPyKEq!e=9 zOWw5&s)hr@NWKdD5fU1T7tm)~M*|7)5q@e^Qq1(;=*NX?*uN2f^uDhe`J7tP(hw0I z9`1Mi>b}ePVb{-4h8E$q+T*b}LQP`FcE}*MW^Qg5hj-1bFPv4|+F~sp?*#;&=JC)d zDZ4PP5(nCwWn=||0%%7?!PF+C2EC8Q*oM_eazbKb@vg8Q9YTy}=bA(GP}0)kA{7Ku zyvQxz_D);&@sj5v$H&J{62J>}OigKVq?}%P=j7xdARvfCLPJA0dUDquT^F|NqH>;E zv8U!<+GW=(-{T~|t0bQmPF~F5vUeP0%2sr?=yf6Foi_L9b`Q!6XFM&(SQVOdm~(yD zy-~qqGBSTE>*|seSi#i=<{J?{{na*iz-|7){lbt!*vQXGnE3qW7h}HyfAh14u?;hh zl6uMoLR&1Ju=&oRL|X&FP~c=g;kR|P)1D0C(q$8XX;Y#*W1k5lE_du3$Pz(jZuIR~ zI{zHKXfROv`ZIX_@0IBCs`sAeLewVm2M85572W|P8slq_AjUC2Ffab7FJCA-6-FAO zU8kUO_PJtAz@tiJeJI1orM8akEw$IV%RH*x%#VV0Cb%24FMrb(Fb+osqkicEo5Xhc zX*jv)tB}z{K(UcStWq1f|97GO=UhA{y+A zh#9$f`I$ozeKY)9)Tf#*#L=o>Q{5lk%NKEWqo&)wMFK^arD~t*Dq>6~>}bk}<5lKF zcZ8oua1vQ1;IKL1SEayFIwK}B2eAd2fN7cb6fFPLIP3RHD@h&TwhW`h3#nWh?Esd$ zjY|CnJof!{gBhKpJpCHmKL@)sZSej1x!8)0RLV-SX1Pft^x3YpGgGj*m@ty~oE&`> zKX66r4f+;f&M4SQjIQj+&?KuYu(N`kqwyBs4I%196Lr6Qc31c61V)TfJ!K!ihq9pF z`ru9Q7kaAiATu1P@Qb~0XYzyy^CgdIJPajK>%d=Z-3u1CzF-Q-Y((*~qag-dDBl zQx%G;CpC!Me8$3q7&SirYJe_0G!r^!ksv+hiXJRZZ7-&tHUBnaPw4n+nAc1PofUz^ zbOrhuIls7yJiT{?j{(LF0rBmNhLs1qgT8v&bWKBihO3LuoQtFJ-xgtv;IeP!M;!>H&1qER`1ak9H$EkNSLveBei`?%UB9b!aK7SlHHO1o21PP!XM}E zcZ!NOM$?0`YmQdJu`<0uH~|b%QBkfgE?C&u{dIdNNdXa~21b-63Eks8FyVj;ZtcK! z-4wQC^aN>g*qF>*RQ4dL4)stvRCtgcoEgUohbm#U8YE(zj39NO#Pr=5gWbdBy+GFEG+zD;s`H*ngT&7UN>vKcJ$ppcYW)wu5CyFjnQxr}k|6$?|@ z3#!NAkV2~AWR&deUfm-BSKI3Xw}EX|rQ0+$u?8DVhx)3x-{3shSLzWW)yp{8uq=z* zhWeFz{V9^L6s)Gtb@04?Y0l$`2^Jsnj49&@O)VaFXx^m;JlFO0bZc2r4|xior8meW zMef&}de1?4IYI9Sv+>>Inx`y<6Da_=E^Gm4krbToe1_>02tVBn(W>12h&##oXO)Oro}DsoK5 z`iW-_gPgJPQd^sUadBf~qdUzfj5dK2FBC6ZvrW^t|5=b}pvznP_E8HBsu>($#5oO3 z{Q0rc9RX`b8wY8ptQo?L{WZX>uc1KB>Whv-gptU7yNykD<6&)QJNv)8coNUpwtIkW2 zSk7cQl&_(L@s*p0C$N3s(O=Z3RcJdX1QydXc(3r$2xoY#=u+qotYy8MQCWe58xj*-VYy^>l6Jz#+0zlhirh) zs^C;aJoj4Q11cG1TXv>H@P+x%?8Rim4>#yo!k-k6XUc!J7@W-GjWq zLv={FPeN$;nRE?l*MX1Em)WJ-=4MJ%gYR}9ie=V4SubShrJI5Y@{V;;3t=<;rQ(U- z61wA9i9PPeE}L)WhUMjGD=08JI#UTH3g0Pi*oG6i{b+p=??4KmQ&%VD5R$%0^t4|a zA30UG$C$e;cb+Td!*=mvJA%MOsq~o6Yoo{Xv*cWBU<%u7UZ z3y)+SnBq|Jur{iI_eX%vPy);C9e8op*eqX0&wPc2G1f_7m89?KWVt?fC|%`zMS;m9 z^vufJb*_U4hv9)EFIERm16L1KDu{Isk6x<^tP7LrsqG&qkU{*^0gZt{ueK-#2%{oPxxHL6Rn_Uk5bl;^hHU zr+@EEt)nri8^(M?B7kTv35$_n-#Qg7ft0^fM?XB3S|z@G=tSV_4xQgod2#Q!N$U0~YJ(iLQfv<){{s6WrKsCNtJ$Y^&2 zE}ru08%t|JkDLH#Vzcr1sqETi#4EuIYdGu}vHbv5NOJ&b{K?{GvGm_l^6XDnGbMSt zK7|rJ-QBqKAlT-QTOQ}@w{_)Ii_;Hy>40r-3cpnI?Q>e5vJb2uI%({dXiIaaHrUQL zb@&eD{++3J?yETd9QK@<)!8?*=UoJ*3Pebh^#Tc&)j@zNwp*f!EyCtsApw zG^{;RW0&7>PW<2JR-9lG{d8r3b!S3<;7huEa_l=9x=mDHlBYWufTGgacE^q}NH1te z!PFkGg^Nd|W>)ewHf|IqzmwoxlwF^+58j5HojKCd(qKK- zji@McrfCWae@B`uhZ$hlbf5K%6c(mrQZ>5`Kgs-|ChiH7wnKSBqBlwuz>%BL1Z>TTqjV#*&nqR1@pcEHzQX<&^i&#rtO$7p0R?+r1L> z$JTE>&sSV+X@o<2InsvutLowZm@QWMM%Rvcj$T3`w~3Rvb-K zfuf7yi}s^(UjL23aKe4)Y+U&-#bHu^-bs+FhJvw~LNVQ(XzV&*%ksaczzsvDT)4zJ^XrBwkp*l42t>VMM+XzSWJegfP3;*b@A z;%X&*V<{2nHx$eh&Li4n@tGC<#$F(FW_0E5_ui5JnPQssjlLcwe?MbqJkMz?HIxM>dP z@Egt;k|x$|FtDV?D!xShHz|t$#l^VU-px<@g)h1@nz_gFCXFknKKE}7l zyiMBD85<;3z7Kqgeb#TXxin3$=QU#3J0xTP_LuHb4{H8u(e`P3rqntpq~7}mA1A`jSY;`%X(gcyIQxtCRAL z;*<<0M7s0#sG6rS3EHye$Sp*~p0O9_ zswN-MCj$Nv05F9a_G)nmn!}S>>vN^kkbIrFw}&=m$bnTHn&JjwOMdqq`|0$i(-jhy z39+lIE$#G)S311$eZ4`H2zjy2=q$U!x^gXF73kj;2i3RlgabWFoYclQO_cmjQV!cw1d@p=#6th;YN{+me=al#*F0Dhd9j0c&!eG*reh z+jy(un8VJ+U5iXYdKG?9ZY_N6#>vwK@0_8I zFnl4-QUGAj?U$MQpB!ZmUt$N=CN!lfu=XXOI$L8?EW3ZZaUt3YIXfUhqq zu1e%7DceY*Y}_HD31MSHo2iDf(i_R=sd2phH=Ydl&C%ysjMQgV-Ji&-hj~5XDaB6% z2XF7E^ivg#dIsfkIH!9up>axd8Nd9_t1|A!MVhT-_b#1j?|S?M@6uYY(*6Nb@dX8r z6a%@Ivc5muDZkv_ySZu8?~yXVa@S@6(LhS-&%fyy{jq(3{)SSU^Fs5Cso&Mk&Q4o< zy0;fqTlu+d0n)rJYM_4jDy_N;KG;pYf*y_hVUNPEj!c1kr^1bf12mbl^@<}I-SQaWfJRQNIa=KdcZ;XE!%_ zA;H}8@^U>%GzX+w`JcB^(0$b45z<= z_k$JdniT7eK3#!={ibDj>S_8^I77MEM0@(x?ax;Lyk5bB8ijCPwn3%0;IO#h>P)@{ zd|s^kQ<;g&%X-1@@n#%os)B&A%4XoDfIvR=tgX_D8^~p;T-F%htcK12GqxHFg)GYLb3>SOJBZ-ZZX!&l@SoH;tvxuT}IlmJtc zCW@`G0ifgEi4)8bZDy^tsOr!(;6YwkPYSqAd4CFV68XS)=jZ1j7=6NL<7fK=;0p;s z-QE4)JoPM%)xp&oPC!=u;^5~mE-n_dVE&XH34`?^h#QCxwSUmp*Dv-YI$pBcgwdJ{ ziA$2KI^lK!_Euk79vRpd`YL&rFTnsIGTqF(rT-YwXf&(JH%M| zK8C%w-0(C(;T>bEq}$Fv-p8ZSfuh57MJXfL9kKM;kUsELmaV5v$iW>+?R(!&YRd2U zt5qntjVL6R&HQ4)7|8uretshNpL?R-rXgsBle6)=VlpuhHzt2G_;M*jq5toQ(0PlG zTqzq_2vNS_hnf~5((r==Vq$f05GC*lRocB|0L7oLCf3#p3UzKTv$-9tNieqUow1Dq z(Z$8`=%~gdZ$m$hOiyb=8g?iEv=yj-N6i3UW&T7p2-+XWPo24Uc$j3OBdx3)eH$W{ zS&3}`?>{CZ_(bmIf=->JDaCiW^pIiv>gHw^Phzg*SRMa*qxE)ZXyq}%;CBb5TZ;|mXo2?%67L$62$_!YV5Gq`GONNnokLUL+C#*3%O&XIi zh#VIj+O*%BU|sb{O}22&~`5HvRE_ol9;fyHRCKO53=e=7e3boy? z!wv+Du+CB_yM0?lX56a3=9r1JwDixF?}8&JEzzxUDBS)Z{o6*(>hhkeK*E_*l9P|F zyieK)?Aw?upDT8n=h?tEDuj5=P9K+qW6qlKmI_hY1B2BZC{ zKYg|3a3EYLp#)0~G9K*i-e^DU7}wObRU?CuxJNrL)wZ@WTWnw~bZJ9B(GpSi!KtPz zxw+NFNZaqtQ~)ruY2YOeEiC?FIOXzNQevaKySuGTR6iuLc3LbK8b=&3hNO%;DWo!4 z0-Tjm?)di5km40gFVjp;^JT|YwifFXB3)gmPQRz3LBPSbVNB{QC84Ax?aN4PQVW0lSXUke`aX z{$Dd_ZK5CBQ;apnym97}L$o4*f74}j+JAf{py>nXz^9T6!<@^QSSSZ zd0LlnS=^((I44v&b&qLNgj5Tkns8UFnS3aIgxD+wvN?#LTtq*7y?(@MCCF#vs71DK zZ*L!8dGpKHF#BHs+QL9#;oj^peDmA|^29;&%aEDY1{qorB725Pr=vE$a1=NJS>(XF7ZYc%E{m$CPMvUaKM5nPd zME0|Yoaf{0o`i>MIb6zX1?xpG2C^ro7N@m>0yI)FLqWueBeN353zIVrv~7OdNxs|K zz8l)>Uy>KOb#Z{zUmJ{|p3Z$#y^$GtOFH5=>M$G$%ug~CoXwFHGlrba z-?3gkRy6N*=q326T9=l7|He`sHFnM9xkIkwswH2L0v>Xrg9Er7N@_FRuwRx;A4;rQ z9;hi=7}Xs)ue^mRw7A^NKevY--TZRW^^XGCvJi2a_GHQTqN1XQ^QHT=UvAPA`D#V9 zIo-c&hY!lpSc^Ol5;GSO6=mKFwoo5H>TrI&0nx=FS%wait3wSEuIuXRs=~-4G^Q3^ zv}28NE7_=;K!(vsT4KZK!INST7altdH|ay?h{1u2Zm2udbnHxvMG%a)7{_a%(3H;r zPpH<5ELUX5^ zC%jNMz|rZdECT914}A_hFk4jH%=4ggDn^x*Nm9el^OMjq++`Ncr@{k3A_QSVYXSSr zP!P}-3_|GmkL8%(fx7`m4&L4d#U`xHL8{NFt`vv<6n9GZ0% z&CUB48RHAFl;?|^R&2b?>d&d3Q?>Fu^_o;5L4MZz=ExBse7k?y7PR$pZ7@mhs-q_9%#%%*$L}!rRp6cO)uPK=klO_`;7G5^wH?#$&s1 z*}Qb~J8#`^h?2`3<5*@$iW8U^A)v3Xo3%@!R5QnSZh&<*2iq&2MNQyJW&eJ6s94%1 z--~Zn&XUm8q-p1a3l;?Pc_JEto$9G%e5&z6Uf**YUj!6rd?5U6p4nVtOlhW=R&xs{vn$4(-$CLB#hbaQb7#@`S){vT-e=hxjO8xAl2)};DrOePhDo#Gka{cDbiDfjPvLW7MC&V{Sdqmi316@fCp==ErseT7n2?Uxr|Jr>J;tdYVU2aBuyE z^yzog2P<{9&{sVcZVNBJd0XPi(OP~5HGEWq5wmh+Ek;0Nx;S7kMilU;6!ha^?1RRn)!%bk1$O z8YwWTOH1U@I;4|+7ENYaz1hp_An7b({Pcv@hfWQ`tWb9Wr!ObXMdII)m6dgWe{awG za_QMYd+*>=_09FSwnyj7e=S*Ou$fC=fC!t<#=(*$2Z1SEJ(wM$HR-*0Wv;1Ch$M~f z3W`q|C&qT4FszzmV`G8emQqb`Wg^7`GLH5e=u|2{4=eeK)cvSoCv{uQ+Z21E;^Nv0 z&M}ZBxV@U`2uWlb=lTX;L$(9Wl>x)Z&=Du8vn!rgc0kv97NiDJ164w^=_g-O8DjrD zsHk8^&HeRfEt_w+$9_0PKvx3)w5FT(uY#gtU(kR*!?OZJ;25wb+q(| z5SJxH+K=m|XC~Wzp1v^My$RA|_zrHy$OGCk{BOXjCOzI0&_Jb~;3 z35wY=y=W+XiURBNoK)k60LpV+(lmC1$}zo22q^F|$CG}cqc7F9Bs2st*d)>VeC5lQ zB3S9v|4O01zO>Of8fphT#)Ri3#!Y^Y6^4l2S&jth_jkBsp6iQG)Ge@L)>V za|;O>vV8hTV&wj|lJa)?;o4Y&hxG&NnZ*Y!NS8ews4&3kYZo1f_A-3;`eiObW6Fg} zcztsN>ixS|^v_BQiegiMp$&LZoSk$1WPq`OFJS72ro4Q9NFOiH@tg<21qYEedG>8t zfG(E;BLs#GelRhYgS{iFadNPViRhCUx!JBlv5MKa3-Os{^Qd0ZA6Rgtcz8A42O=Z% z8}?jZn+kY`tqxb0>yYXcj9Ugp`}p`2KHJdGr6kot+G-Dvzc~zx>Xw>4E7XVZVWM=u zrH zeYEjBa#P=+jwi?!$uE?@-gfw1;(SxAwfOBV?|&4 zbE7Mu6ydHPHV{ED0AxqOtX7G|V$DUx+IXbf8575V*BAF@#jW33-{<;d?vtJut|dhitV%ur{3RnhJXly!5K^V=F1k=gbEk47~*(I3ePex zD1NLSBZXpq3YX3?ak5kjt|qd5hpCd%HaTTbTcah+nLH+=z|PO_xqj)}DILa$CrSM0 zPzm`7iG~X|Y12#WtS{k`AAf73V&ew1J7uJ%{xl6x^WFbo{N<}K?N@w*O#sB3rxGDH zC_hkLf}|apausJNIfVv&MIg;A1Ws(VtSs3nkBb=M6c#?XxY-D>MGyYj-5p{v^5V>2 ztwlwWN`PwX`sm0W)cs=1@GUSiVfJGHH9IGj(PD5^u`IEiu zI=ts_sKeLmQe3rt`bp6AIdDS$*4zSYY@&wNWT;I5xoiXs z1PorBowb*bDFh$^HU*^H>V#5M@j1O_T7ZI4w2s0O(otBzMr8HO%o4~j21PF@oB&xatrepX=gC#Yc&5}8)3!}@+Z>|hKVZAcuy zb59vHuy{C8IUeg#&Xh9juzXa11O>$?AUxH$R^}OF8=XQY!wm%@fTPSz6cs#eg)ufj zl!02x8V&V}Z@Guzjl^=go~U^)QYIB1LO4L|8ih=RC3uHSDb*?58RY4)%tGx*OH1qb z*X~|1E8@w5wW1qU3L8aB_|BoyDe`Krr;ttb^iq0sFhIJ+o|6bRA=kRb#;^0D8$&3| zAjg%w3VCXjCk)Gt68Bw(v?U25h&j8TR3LqLnO{G$W)sKv_)q*4Q0VTtgQPw?hyZ2I|VbL^tpJkQ$X~1PnBUS|{iaD^3^!P(l9V zTXqT2gWsr(aw-nR(7e^n3pMv%12`*G^7zqjn=Rj_1Hvp(+!L8SEazv#8xJDMq z;Mru#GRgMA!9mbc*8%0e_J0DS$QXXGhn!>EP;r8tY|emz)hnCR{l#IbbD+hdTj`T} z8x{=ARuYqB{nnyq42`nQH8k=k)qe#TI+~hHs4GM2N)&kemAec2Yrg-9j?EJ1dm0a~ zz0J+yf+jwW&4km%_kp3~_@Ai(;;n#{Kcl5Z7^mC}C_gZ|#(H&V)5w=ZM$as@N0nfQ zt?FmN*FdZ^c$5pD(5+?N|K9e2-)lMgQYKrpRY-XDZk1m^4jP&}I9OI5x86kZBD<&`i=+wI@AMj??s z^03020w6ukE==Ix0|7apO)7);^K z#9hYEuQi(?eRK=`34L7$ySxTy!~8bDDe``#=-zwMieSX~os# zAUOo9mN65~`ad%pw3{PeJe*{D4C5R?&; zzY3FM4!`FhyE5;@vbM7WjJmrW`fDI*M`X2t4$`MZ7y$V!$6N8@OsFT;L>i#FKxr#y zA@1wYo27Y!FVVpW0TG`3lsw$LWxw!1aezKv)?=9_21kUUskARUaUQ7bmkAw1$;RO1 zateSpdf9E4YT#&4d!GOvO-)J&WM^mRhGZKs5u%^ub{%Alj*gyOQ32KH z3Fnw_<*YS0G;sX^^aQwz(?cg301h4=o_GJQ!xqvf)!&~(XAeIV`_u0M{U%%Cw{N#_ z4zl2M0oNkP2iFNZJv{~X*N1?kY9Q+(7SF;`4fGWDm-!0+Zmc2BYM07ZBkCnoQ*`{1 zu~JumxXHMU_j}g$JJYi@Fztzwl@(ln6uQ#DfaeB<53sz| zq5FGZif5Ufuc@h`C3q?8li`Yg8?cguFNkk2vvQF(2@3fTzsk?g*EnNhooC4+Z6dfu zKWWon|NCL(dvRZU;*9s+q{4emdI=dH2G{}p7bD%U*U*h6e9(BHsaZ~4h@WF8Hxa1; zKoE5(xG3U( zQfJP^ENGOTSOS?9t{kIMSid1fRCM&3dh61w76YeDYbQ~0P*BGeY$m573VgpH@Jv4R z@F=qIH-gRF*(G50hsb$eeeg}qw_$0$-M4!fy=Z;#iEa1KW>pjoI%NRY5}W_N|= zCC&qkA7g|kDE0>TTx{^0CPuo}ggUO2hBB^9Rzfxn$q6I2)CQ767Y|mr*gp*b@V2S? zCFDh4)|D7s54c;V3bseb^5>SIm#0hzu!Hxdi@kJ?s&`dWAm?XK zTuvuLF{n`x>Cx`-V-!W?Gsqwc9Rm%ZoHPK&rE94a#k1R9F;l zicl5EZ#jp^8zDuhHw`q7;>!&2&ZH`07H^9J32Mj_Dks{nqVGq;LFYhT!a@4UNP8WcT^QnTKc*oP;^mD65Wg#^-Mgi)wrOGsx2fc2}Tai%YeHCQzojYn&QPYbz^plMVhul)q~!P!}Zs-CRVb)>6%l-xwln+Cr@Gu@I?fTW=%Au)W zeps0cXoR7XD4f5Vs@l+a8LN}P$cMly3#{^_ttL!KUE+pwZJ@#6Ad~hQ7nN#pg6};# zYw$?dn5WmJ6Dr*kIYlSdZ3PBcS*OnHwe2-=?2A90R9j)xSk|_G)(^U^BKHWFBKf|1 zkbU-Ado!>?twl~jVeJ#WJu^d^t4hEqZh#joK}{s(u-9ug_5{2JNGkHY5*G(sPzjWW zG<*Tr(mTaXfJ~+@-Gpw0VUQ>D;qo-I&_x=6hJ~9<00ZFy$;xW zoX$GV{W3Yo98>igYnwTJNjbE9a_8>{{H{a}7n{?no#|UB5d*7$B*BVx(eZzpV>(JW zUlK{flQzvrl30{sgs;S`*fnKhDD_npU{ z0ob)RrV%c4e)g2;XFQf+dS`L+wc%kP2i6_>JpUG8Gmw?06eIYze%zTibm1xUFf&7B zPZ4xwbN}A^CyW~Ji$E#Mml>42QN=KHB&q5YQglJoJhwVQ%7ZeG9YDsG{>N`*ExE8E&_U6-nZBGFdrTd3gvuE61uk!tOY}W5GO}c_i3REKJ)`PP5>^MFi`v6F z)?J5vCxv&|vs~4027$$hag0-5frV>6QmRK^@((r;pIlZ?eU4dUs zf`r>jy))io$}A7QChfm$!WFJCeFuuCBMb z(}v5C^TV#%NoJ^K?k?{2^)&@6-?2MIYf+LOElrI5$@07^bu&1((LLgxq-lySa|Rg> z(^5OZPD2bn!Z8LjwNGz}o_PoLU*G+KY8y>&1|?C8cUQ*fU2ve{RE2{oOp}4RzryOe zDvJu9j7)>qAF}0nF=_yp(l=S~I8`8DFm6A{d<4Ba_4pb?L;E#my%b#QW~QbRJ8y{| zZZjVK4kW#@Vr?l)N$mblrM>=+524en@XJO(hrb^uKRQWxds-{0G6~uwWIN{<-@Y222UY+#RLm1+EG5Xm&HSO z81Coz@8A2PR{;#-kd1(8vE?w#@VMP<_>Nrq1nCzaW$+IE#5QxdzWVf-4uJNvKh`{t za&#)JvF1m8`?f&aUdzgeFcfbjDNJ(N^)(S$@rA zwMK&pxCqQ6A}d$JIuQU3XsQ6g4R7Yhn~2jW+daZ{<`M-dGxeQ~^#1^s)dkO*&^VLNT1-dcC6mQz=xs zelDajDR3}Pc47f7OOM<@l%|=)kZZ5n;X0GK__;FsCs5zW6 zUl7N{0`c_Hg}#BJL_QPB|Iwaz!P({`KR>B=mrk2=0+IHJ?@I!EGos^Oxk=&2n!g#V$6oEr8}vV4 zPh5hQNU0P&#kUM~CJ&78Mzm!v_ZlpSQ6O{DCqZ+ZEBtMBe+)dV@%30zOiibq`D=r0 zGBMb+?d;or%jMDbGr}j^M=tmLSaPOb{)3q(l{swIwzki_K^xRo`pKo(%6?a;4a2AW z?$=EWJ5!FhvD6$4<-}j4f!a#xG=Gz-lmjJdj);0sg%IgF=&8)ThLoqL=Q__fiI+_( zR<*&eg1>z{(x8aj^cOupJ6kDo)G3$9gx11?ypMx=l`~Dp*cd0&PD!yD`Y-zn;;pQ{ z6WVcmY@s56k6H2q)L*h3i?;R!LrJzL3(88)U-RNwb~BPkG^_c=Wx`0~IkonNsxMkt z;%$hFsDD=68Y<%=~ZZqt96Ed?3ou#%Ee%h6Aa zk)I|y9$06V2p)@bbNF0u&?M~+@JS0a<>(Izjab65&BLGp-($O{!wWT6iJ|37~ON&S0(UyN3`{a7imBI19DXCFE`{e z{Cg>eNRqZgk!XK`v>|R%v!IuB%04n)X=>Bc(`&~_E9U{C%TE-Vy3;CVK<%}4$363- z`=!0vvBdIq>-A*0?}5{Uwbjn^Cf0ieZS|rAl%ORR6^M-(@AL-eVBBXfygDie*$}PF z^DFP{>ki}Q>zxu6IeqegQlyKBnTmzb>jO*L{c^cr+(QAffB8z|8>6 z_xrP#B<}d2b<-`IC%@pAxWEVLc#wXcOoUeF!6;X;q=Mc6q^LD^VRhf{?!@&Mxy8SH zWgv=D0~6>ugR4GQ)BEO+ozz4h@_VoS{OPsy6_@4Qef28Z-e(6Er~SBm36Q#A22OA;5SdeFv3moy-@kITAc?fLPh zA;G(uzm~!7$IG6$$>mh)w4p>jH~HiYw5a(Y{(gkI0Q(oZi0v^JXt<&7TDIDf@Pgck z1VdceQ=EtlAZDkCeh8on71vfo)`5IjdvYB{QaT3cwA`$y#oiyo0b}mCe}cuQL9axX zYpS4I?&m3O<{HaKdhxCZ@vyFIjg^HoKg(06RTZ=pP*Q$I>6D$R-U7YZN=#>>`J+s@ zIE?+zjRx5pl>5zQek{_EG!*8bRy36#c1!3ae@9h2GS{`b zAMZg*IDIJci-u2Yv|%jFot;$UxNu9~qfW%BQGk2>~36%A;_6f3c z$m{6Yd9riZ`U(q5c?MNe74bkEy)ZMQGO4SWSUHm3Al0$8Rajhn(nf{*Iq?;_yq*Gs zv*JazNW{&HAHw^^l|T=^^zAK6ST!!ZvU0{`uKx5Q+4Q1}_Vm5M82{bV)w$s0*7xO4*2<1A^Wzomlo!rn6=a&Yv)NyMa3=hc1=c)x-FN! z*AC=Kze|hqb4QD1FdClgnw$RopOnPbkn;sBQBrT)+0)y*X;B41v-#SYwp6w*ic-#W z8VEG77uo4xZ1sc`k)~gx;=75RLpt;XPZV(gO;kE-6T34*oNA2$>d@bUl@C5FiuC8_ z8*v=oo&joxh~%u4xYy$J9NgmgLRNtU*}JhzhB`A}E`)_A2OEH0=R$G>yl=dP55buG zt@5 zGqY#U-q&8&TIcyWr!CuZU`{O;WWPAhov0vlhcR{UNRS_uAogZsjFa;cD=6OCM}LC9 zr65xDq3>uR5+>do>Ns{$L$A7yj*c`wMX+;B){gJbMI^r&FkA?DaK&|B<=t^DPO(L# zj8m9|X6&WtI_tcHW52y%{~yDDXyOJ4CQHun_eVurPYF2_*fmY8jS(w6sjZ2=JaVh_ z{@+CX$CZrU?l>&G=J|p9np%___1}({PpR4?0m)7lzA@1RA1drVb^`v~ty24>;Vmfk z*JVncNe~edjs`dp@+EZ5&faQpTf-p}zI{Y5j3E>lP12Pds~{dC9}SM|ACFs)->tq% zQK-I>E{z>kQc|LJC+EaduD=-5PVP!*gu36VIN!=_w43k?s= zwVpuA=eAcqzuC&UNPTte-W%&YP0b5=Ej9V0$U=Ng3I-aQv3pICyLYi+!v!{WW+Sbi#rx>1owGx79OPzy;88)0GDu`<0#3Ep!OB7 zuQYc&9SOT6E)S?JKD#G$JChZ)k#7GM9}p zgDJ1Pvw~zvgI)oSarVKndt=mi#>h$)AJ4$;6;|W)&9un}zx-}Rlt|f%>vU7zcP$O& zvioJZ*E=y0r#gfEvddnRf`Tfrx!}&*7QQ~cZY)XXnl!^P@z8gLl$~VgJIkR(UwLgM z%g@en&`>_30Isc>N>SoFYaJbO?|x`e!qS^b<~X|(Gn9M!M?4UOmT2>3QA%dO+lh7L zU_LLc-nY{x)%tsxVZ!p7BfpSpfjF2U1pPYUmn2jWD7Az`jlg2^{1t7wuU+?ZC!1=m zH`8L2N*>+Dei5`|`mR`*2lf81u!Q>>X6VXYtjNzIkey9Xbl$+vJmR|XOFC5jZW@sk^ z*DztFFd7e7DRhizi!Rip7Yp%_AoN`L_%Xh_gPD;7bXG*?doaEMbtT`Q-iXJ)6_NVp z;d})xiAoEJy){A2%{O$L&Aa~$?9+pRW5|x?5QB~b1vZAB+bJ)s8pQ3jxr1z>C_8+A z2V4^?D-ViuHlX?u5&CVGDC3Y-?{w*Vmg=-A3jVSBLBFpyY zb!AECF9t>gKe&;-t+O2|{)cRP=i0{8H@bnLup%6N(v+G_9DYDO=1r8q~80@`iK z$&tqAV1kG>0mMUf@le~ayN>kh-csn+#%zpzdfY)Tp^wOVFnr^fc4G9^3@QH)hVz5(0>8%u#076&Ev;?{z;g4O zuXsE=KM#%IunPtGrm`draWC35CYdcC#Tk)>;*o>n91Lt*!?cR0YOG`=mwFaq7D3he zswMHfA6KyHJ=0=`;>m@UP3chGc4*1apF!1oa;d{5fMMfntI{$qS?Edc{&(#}Te$q{r6)~yT#Lv0+Lvt8ZYiV6y}x)iY58`mgwS&}}IcEmu0 zGm<4UFn(jP43~2b2WgZ`Ssr;_m34^;jQK)cinmKMD9>Sh361*Tc5bQNly@PrRA*;rSuuz8 zWnxb7^VOSwB5^~|$0{tRp)e&-P-oa8C8VTyiHm1uW=Qz{gk1!$G3-;qF00^7cBE=_ zfbLjnU2m=4)!W+}y1XlPk5gq_6+!L*ZRL8a?<8(Si?Ll@M_1s|d8Ke-2E~eR4Sv;q zq2w2xo1|22fA)zv4g_?_T@dzMx)fHfu9Zh$lfffMA}@IT`nPYl&cD^WxpCg|x}>9M zj<d2O4pwG0t$nLWE-&IC`IbX2&su6j^*q&+(59}c8@6-Z*(%GmKj33S*@hD;M@fjrtEva|p z%`}l8J$+7;JXwABi;>Kha?7?|0vrklElBPN&_%ElzX;s%*_pY<^+H~ifBH>TRluj} zCwf-nK)WfHaPV*%u!maR<;)aYkr|OEP9K1LUowU#mR{89V~mLHU5D;@vND5b6%5!_ z@voNS+M_Tg27<4MuD?5l?ha~5*k;d3)~YC~WFi`I0rCano@2yQ9r!JL&zDdIyVuwb$mv8$u6H?CZt4C_`n)AINt|k z13$_7TA34tY%3KXG$Fgz+{At#KAQ=Lo_NcRb4NN>s29E`Fq_E5!Yu$#-jpbBquUA( zzE$a)RB3X1RL#9+On?~W8T+t_9aUG}b@`)gE;F$sMy=G4zyy^yQ=>?K=gjU) z&6&`7T*X{JG#h ze8~iRBftXbd-gyiOH)WvRr7*#cvoRmt{jIFi|a?CQs)lIv6+-j;fc0{7rS;CLjt-7 zFSV9GeM=ve6!hF(FEBANloZbSZAfRN+~R!fWQaEzgC`+}&}5=U)GMaEXBi8#Cylqb zoU;6t|M5$&`XC^9kp{5TnCaRGBlOS|8W2i=II)Rclq9+v^qpUcK83eez4MX4UU%mg za~1^`JLr3-cq{E3yjdPfsq-IIlAVN;{DFHEt%T4*ptmm5HbB!!PDy!{xIqTTemj@c zV<^4uvVf8Wk3N;$U?lZWew}345^Um3*K}46P7n4SLy59%R=ShO9CnXU3QMXLFn+rp?QhzuJpQ=3X)Wk;FXw?L zll|e>bUlRKfOVdIOwEQpb6h^_QP!r z?f@xj+MSmSCKC~O3~v3fn$kYAzU2H$;hjFQsGO1g{J$NULKm;-TgO>jyy6`F*||9h zm~|zc84)e+1m#U=F!*grE}c5~f34`9&qo>tIpmTurR0cg-M%rOz&rE&H=_N4@ay4z zaC%IRmcZad;r6v<33O+}|`b~`tQYeVMpH4*CW`bX9n z>caaKa9J8vPx0HaO$JzS1igsJo*+mRx9KHYU_$X3-B=*mXkIE~rEO_Q@Xw4vmJG;C z3X5REC)t9PG$zzT!h}xPYgw9A(lr3doG9sD^xn&adfQvR;roi0dXD|36BGTN0)0y% z`rz$Pclxlpi9TCVEUT;Z^IqmeB`kZ`c^sy&JEds`9g+~3qRmqZ^8+*OJK%tVOYAO| zC#~a`SEL<8$^jOkK`+=|z6QobM>8~C*~APH^KX3X{XmlmGOi7o{@$%=9Z$Wz{ByL*^l{xlltiwVfU5@D$(rl>Kb`(+v^_5=7^j|Ua!STTrj%+u% zrbW0Np~D^g8fCp32cDro)%fFlnYbmZSRcCPO@XDmgo)ly zpVGYz6pAz=xAso<%tkgA^5C@+^6S#qT$19az-m2D1Jwdtw;(Dd#O7xn?j?VeZp)!^XZ|J;F{9S$d_ z^cAh)ugOBF#DZ3Gz=wSxeAk{8|K^hmP%UTNlms`PA7BtxFTIC;`99H`#$j)E+Lq60 zQ=}C9zs+&%6q7so-UoJn4HM!~)wa$`nX=D?vg>O}=oj1u02W+5?_2v3;23b>nep?c z=fyHCL2QA{<<^VR0W$G1y`_D(en@ooW}-)Moa%~ECbF!}aZl(xorM}E>`(*c7^att z`|s}yJv@wAtC0^0Ram{-G{O2(y@D~ajYI4qCW)nw*dR3dX;*QhqoT5h($dl#f4OH4 zFeByEf`uNhhvCQFE3{^GWr{JVDHicUF9z3aoV_ToNw3A;hWqZy8SV$7}xjN zVIY;DPhwm6k9BiV;efhu`|r(zx@vCrj)fXQ(h{w@tvO10^vkf9Ejn$ELjJl`tX?m9 zC|7=wR4@ZW>VD4ceYw3$+@U`j4__)=dsUYqozTZCdwY-%DH1okp+i6~eY2H)*y@7K zog8;P;^|=-n;aHJmG-Z)wHf^zT16D5&(s}Q<%(`so`6-Gg6Vfi5*B~()|PMM1x*Wn z_Fd!+o1#y<3xuIA5?RRw;tv}XM+mOFr!Z8s0*rNTrp@>jy7Q!|m@H5oCOmj1P4r43 zNHXlbaiT-@g6(|F`zz8{?)Umuga0XX;KYM>vpMZm*#=nd^@{_qY>`JVMaq?nex->c z=)-?{%>j zyr8G{GpNjZx7*x%WA=`N%tf28#XlJ+78S1S@C(pB7%^Y1+f+!Yi}w2Ce|~!Fyc@g{ zGCjIHMO>)m)2-L%FxkG?@gzmXX)eOO)}^o8hE`FD#iP@%B=oAekB=Av)rU3atg$g$ z_0p81G>|)SyIN7 zgYqfJjwrRarFCWq&6tL#YAPHR*3)*3ZFs>g4mDV21z>N*QQW9WkX!xpaQkrzLmQb9 zdQ^UFDMV!5AEL_?d?ja#=6YF_ng&10oPdQN+W7}Qzj0Igt2>spkfPiLzsJNxMDjT! zq+B_6oIQx}cEDzvvicw%dRd#tuU*`9$9ko&P_Sj5Ug1TiEu3o8JAKTq{lviA6KDAR zW!GWA?;+l5rv!!J4kIX>UU1A2;bTMu1b@6T86q@bJ(-~Cs9fuCE}Zl&RTnxm8)`)x zA@?cd^W!b1N%7)`y&PncoyzakrjLEvpKK?@)DKgks-rt;RjWuY7&kPF_uxhAXd?)n ziRd;)F3diwz3Ix^4OT+~cdI(5v7|w3TpXMQ$q!0c9;Dlx#7dIVH-tb-5}c#;W!8Mv zi@TOro2`yCe8Jw_zEu-FT7!Nu`)9$24GYHWjhoN;L^->^f1mZz?c}WXa=29*E;LVX z7j)}W#AN$X;N#Drf5OeB17#;nCy?@OME@~=i^v|^Cg+TsKCo4FNW-GWrWWGWc4F$h zLM!0F-$mq*Jy0iuh`Eg0Tpz>x?&`b>uSjdkqubi7_Oq*h!prZzYrJ`**#IW;MF^Lv z>pJ<4+O=?Yb<-!Metd(`w2JeEhuHmEyw!h<_1-X)B*&nhg zXC0^V#p!#&L~`1=X^xm(=)J4*_L03YNJ_68TF*10Ow%uZ3dpJ}XD6vIbT`%EyAmhd z|KP|sNW5C;h^*6j?Qu#sn%u!6#eJd+n2-B{*~PCE9{i-gfIYJ%$wJPLl^wR-SW?o@ zUa&N?JU`xD>+Rk4Oaj4IU6!CQ4bKyXPdDDgNHOw(;7CiGdOJC;OB*PCH+-1v69BVk z+iE-xgQu-huDv@iYS>cZ6>OrkgLy&7I$~`9bbR3`dtkk>(*nk)9YsQ40a`f2ic*k3 zY*ZNYmR-Gt1|1(&pWT>ykuaN}ob$H37!0385kUpVYY0LMcxRl=#R*!zJL9EcvU~q}a=8-j79Yd)pAF zXc7Bu*bJ47UPT&O8*!jCc0gMp{uK>O3tXzJhNTU_{t(&e*YO$ zFsl$!ruVc;#N1XpHu|ZAgR{!R?;muW1gt&UX62sx-C%xH{4PoSQAevNnwa?J*wWr! z8MGiC#60ABe5mf@t?xH6XS`e7KTrGro{pxIWLME)gRQ*low5yBz8L8L=nh&<2#=51 z)(q6iBC^8DO>Y?AGBxaYACNn4cTbB4Zi3&DttXe^xt%XKA<7iQL2Ms8e!bJbn|P7* zBeg{7LD)@mdKN5XE}D;pPZ&bh4`iIx;yg!9F#B@VnVo_|#bm2hu9kMx+h_Wdw#^bJDix_9s9=TTi>H}=kdw+dYT!UQ|9>;=T9 zw&ARAe_8lr)|da z+%sq=g{R0O)ORoWfmpgo-h)cVS!44n(4#0WUY-53e)mrjupSe%46>V=nNsbUa0 z_ZL#EPRE;+LzY6!Cg!;R*9ZL57bRC(2-XJ$Z)PR9Hy zYH0m6Ug5u9pafP2zcf9`xLnRC@EL+afR(#1t|1r9`TU^?c1S{YLfN%!+uphqt&hGn z4d&fA`WCF#LOiHWwl%u97s9K4bZx&AArlh`OAVHui}Bxifern3K31!h-afmo_^Kwnf+qgtnkJ)0{lQO zo6AAM}E@Rc;S zt+Mx(@{NVz6O}is4UP}t21Ie_w^b8UsNgZJlVs!BIi|VqZ`hkqP}95{ZK@Kk6|TAe zjyWk-bXiUhJcHDFM1enmF$8nZSVwU+=iWzxEccXh%CD5Ba8^&Luv}oDaN9_iP7ks9 zVdIRs;_3q(EVm!fYCC18Tlb5@R4b~S5}R$cV$9v2Z!%(1k7DhkQgTP|%{;GZmeiA| z8!%)KGuhocgI8Y?%>?>`$8hU=4mn+Nkut z8x+1irz~`8Gx|wQ>&^`KX``0{eUQ`jKRMq9tuDX( z)9L#jm&~dzeE*>RD{Y^n*pu-m{drt=a$g0GD#ZxU7*=wxjIm1|q{E8zJ~1L*Y={e( zW>PH>8}K+u?GvvfNhkDPpt-+kQ-CSTmTr1*HY~tqHZ3lK3ksYAj-rV-qD{17Ph3ee zF@Ihp%P!=^Jb6@ZJ4|jxc_Cb=WSmeoIe0k8Y_?d)K^XzFKBkD1>AmCXi@I2ED)ir7 zT{{rdF&j|!P`QkGXoK{940OgTeLzG4oRnJ3V}SL7ijz`hT0AV` z&Ef>(0gD0vk7QMM#u{j<-<>Od6nX<6PgG-<%x9OC5|H1(_BVW(Hb96iiz>LhSkCbx?HJ1H9+|iu8Hv^*0 zh91u*JWw)m-zy7SBDNxHeeEN+bW^g(?>K&pMRu{1<)Mi_E;ki$LG-Z&q|ByCWP3=* zI1PVfg=Nze%dGivRR*7r+40y}36=QBF>g;JcjD%u;pQU;nu+>bLsZn*!FYtEjLfQX zm3T`^e$seMrUfy`&4;*;jk82VYbZJm|6tntV;?R$EL7mcm@~S%ftMjm@jJ*2;AbTn zB6y=>5`OY_k)A4uWc9(evIVb~H~+(r8YnYoASc9L=TE;Y)DWbEu8dM1PuuM??T3lb zUY}%29rVrQi6N04(7ug`x3}#Tqf`dl-F{i4u;F{PQ=>qN33`cs$1!XzMD=Va zY~F>1Yiq5wbtZ&J{E9?&=**nqkbqvVR=!O^6bdsXXlcXI{Qa70jCrKO4+E`?OW$aG z>ihY#QEAk(a9g(oXIG^1A5@SP1rn{SVDnxVcn~F$$cDKQMSG z;$U|JmR5Dpw>0F%&;`_4DcW2jk}-vn$SdWzCrmH}kr2BwqCRB)xsjuGhlQ8AX=g?}3Q9J=*4BJp zdFHqD8wto`t@%xL`{4cWZe<1{H4UIc;^!bQ&u-$mmag9KeTgZ^pgRBw7D$iXTt`y` z>0@!P*qL%>5HI)an^Z^Ja?zC0-wgCteurC)zEU0Y99&#nVA)XnYP{rFbWHdBuWF^B zz-+2@tnmqZfptXa9EVqK{BaMs{UI)4ad8o18gzAM(H9zD=H=Ql*a&D#PDAEM{a*q` zVz?whQG`_-Hd;vI&Vo{{E6P~tc9v;# z2TfYTXt*YLE}~*Ywy=0^P#(zoJ8%-AP=_M;9vUpX|Savm@SKA)CA0dhrd@WN&a~ulE;J>F~*-IsDa8<>kK#Q1? z+#4xsy9nN!Z1^%C%Ogo-B_is@*ng)SqVw%@JMwZ}*D_W^h~Hhdn8Bq8jv{_Ml*cuct;ZSzQ> z^efzs2Vq-2j;KA{W;5C5o{_9XRM7IQ$eO3&rzfP@#jy;lqpr)bBIwZOhgggo`>D^9Mr*Qby z4^Jq$*N1Y8Y_Er5cnKuJ5c*M2yfS4dEZpOySPzGMC$SK)U4!-tCYuv~pc4r@6+&!` z$s2MynimQWB<*wAn0GvUt$_U^l^r@O7pV9h)aM%$QuHy|1Fma+vUqO1ib^>c7n1uo z;81TaC7ah@2Skzu7fo<@JD^|+cVVaqsP|u~L|7NX6)8}QT`aOAFKjO4@%qcbyf$b# zTrS&!fs`qz{-Vj40Z|*>%Ry_VAZc1J+4&+r669L4G*>@EjA*_m8Ttw|fUuMx5|DDU z!YSfLCzRkZ{S8D4dWnw?WRX=u=O)1^M<=kr(hVR=xcZ8Kng-uh2mIUr|I7aWQ}X}G zRT8ER;MVz>nfI-SNiRkIrmCU-rmB(So1|v=J%Z;4JePFSJ6nBF-ffVeM6ndJ#GVU& z_e)GpjIW1r1FHererj+6&_7r{e(#T?9=1z@N(lb&gXqE2)5M?|Vz}DJv_wQipn|2< z1NZi1&x0H7@IN7>qcz@!sY4wd(K8jJw4gsZ3wWBbu-Ei}`RiKB*CK{mw~7#Mn%pa} z6^Dl}kiy6DGBiO=`{9w8PUs9iytlceh7ib8p-cbC*gfQ1P`hYhRL4#9eK&t8xEvi+ zqp&hCW9TOi+`3`)uu1f>{~(KAf}XN%&0y1iqAxoVb6}~-hM_=`0Bf6Yv2}c~tUjb< z{hw4dDyZ)K&QG_+BlTth1b)RTBt5F*A^LOB;akvQM%<{La`nq)9%uQN$z=qT8kh&o zQ3>IO- zma3Vi|0RN=+w>`S~t(vpAFV|~)UVR@xC7HgT8H6R7843w+tyRXGwwg>v( zO-Hh#z&iwTDBx}9{|#~DNF79D7w`<8l54J={3*(oX7) z6xw$xVQZ(`jOL{OU5AZev#!!REi7am`afINf9EO~MsOf(he$g?FXX?#x}EHcPQ`E~ z!{aKMo{18DZ_EULa4Q~6%Ekt3wWV*60XF(~W5N4OGGq6BfZL+yzZ|s~h&q#R$bIb1 zjrC)62r&dG7Zz>i4hi(7@_2S;2DazW)s)L|vL>+6p1ikPC-W~NEj=&q*4fvk(>=ta z>lXjS?ZAoD`}>_#{>oYQ&(6gt8qHg*uGmO7o&4V80OqHNm>3K@pfG&Z%lcM`o$~J` zrX)tY3#y$|uJXT@jO*j#Xc~K*iaFZ>{3}-m=M`fDIXU^LZB3FGliJ_cwC(Ql%Qgb3 z>~K=;axk340r_(O`t7A|NyE#P8_lpUD80BuG7CARpsJ-(;O2nuKwIhXh~r z7kIL=#25kn4-YpHyd8#rK8&M~f3AcAeg2JN>#P+LlC~em$JK7}Nc6Fdu>v=0j+`iTqv{(8ssv8&|MJxo zHQWa{DBSMf&-5+N!UAe(y$*z|{YHNl3Kj`iarqLZo1i~_Q%Gnv+m6gUPD6@55e^c# zGI(}D#l@gq7`ZZ<%9+CX+pqOxLSDKD4s51g84Z64LT0zNwu;$RI>2x)Syh%L+IX|8 zH>^vyN?M%hNRS8B^Pr=u(mgl{kRA9Y6iegi;Tnv`@>M0yKLGsF1rEi>OR7y<^p6WVuG|P=T|M> zwJ>%|3fRl~bS;tbT&aBV5@>*?BFZe+0@*EjF~wt+TyJH&P4;SEzheX}k6Azk+7;jK zg0Vj^>*O_?M)M8LVPS<{=i9C>U9IP1pR54OngiOr~U@SMPP;hZ}0sJ#F#Ft0RT-Qvit(Zb@XA|5xl|0#!#+I^7;C^ z?5*F)X9YDFvTZ)$-8p`(Jy}Bk5`RHf>2ls^Kjexb zAg%)4>PEDR2dXcGFRJFz_h?HddH8lViE6w7fg94-=x;<@P9kJ;^##cC0`VYWD_!`@Fw$}Ii;Ei`z>yyI*U<2R$)>bWQCUws^Xzj#ZU{T;{SqPT^#rgh;yP5Mz zZO)F$FqQTfiGS%**83N_;#JIiM=McRo4Kj;V({S9UI@7C#fgmusz4*j#pN#hCMyW+ zMo5f*jk9XxyhqCn2e~qnp+o$S`l)n~X z`P)yJ%h^9CgroUZ3SPad!}XBI8+)dZgyLs%cVJ3;cmHstIL<{8>X zKkNlos_F}$NH2L*t>vCZn&mR*#y6$r(UMH7AH2@D*SU8(%?I!^{AF6SAB1KZO%~l( z5Lh0$RM>RnIbH+?CK_KFxf8ICuL+oPP5m|sR4!CQ>1V^J!1&IS(Nh&s${^&48HM$Tu{)~39BW^czU zKOp=Iq8YDUVop_TU{gzXZV=~lRn1E%LqyKMpE@Ll>Q3m+DiZ)XeLgn~)1H40{L?^{ z5zCjX_^?nl)IPx5H6%yXuU5-b*_U_c;_UmgWU7qLm|E384GotIwSJrHL%Nj9zjUeV zj6NwDezW;Nl>6U&SpvhDfd7trOu|+31K5BqylH=2a~ILCnj@`6z(^3kmne^tRf%$R zxFJYq#(y!!ccXjZqK>jfQS`SH_iU6tf#QX1mV_~-foBAn#nmbJ&E(AX4C;zsh9>``2|;KW6AHm|$D;XK@|5yg zHHpU6ns}pNp?mBoHWS{%UwH?Qk85uv0{$%oXnVrnLh?l_95!_TU;^)dG8onCfP-PJ1`l5x}#zhA3`X#L)FVmO;igqqP&NU+lT(r+lK z+Iabn?PFZx9gRlBog9&muO@#!Oh(65?fi?Y+N1>J7LCr)Ht-SueYzXlQvt}&xHLb! zyv&HN0CVG7X-dWQ#c^X(I-XdCM`zu~OQTN;V*U$w4GPz{4MfsMJ%}-PWeg4dpzUPG zOCKIhG_1ic!sb*W`@+Ks%rP?a)iT#Myf`i5nMxZjkNgnUYkDNznFj=B8Ym&5kVMu# zLQ5E7<6V|Ez?iF+x_TAbxzqn5{Xhpc{Q4Z#dLU{U z;>1AGv-JDp(i9z!Lta(*{PEfFh!iFm9kfNfzCkXl%rY8|M-CZ*jKrTk44Y>ATDmBQ{il_3NaPPl z`ELW`%c|YgmGkwpfEY2rZ9&hC^fTG;GSW^e4)u_Y#8+FQG)HxEBEAbBikT;^VibB7 zhu7)G3{a*}byJvhM-mptPebw?YBVT3C80TAp-^wGi013`_6*EP3>;0_9dEJO@lweL z#BlM%j~PfzJe>wz5qLxU;JR~#FWRBn`L@Qls5WP!yzRTP#ai!G!rZEz-zoXG5#44_ zRvK(zWIk)n0*}b(ln2=%|7?JeLkadY17n`@A67G%xmD=U#ecz*NeT!;+$dw7p;%Zg z1nx|7h3MtoC;j#P!+`f-BF`YDonxa+Exf%~4Kks$zVGyd1((qS*!>`pMC8KKHzDg< zJ9XZYj~+F~$oC`&!Y4D-rdETAlpJg$kqN{>T+hSQkR}Q8DwFw8FZ&cyDssktI+axI zSGGfXW9GR}MQICrQLDjiQ7)+2zPOk%?Aw$F%Muc+Q(>>`J{chclj$a-z~BvjnRUEEZZR zZ~p~ovwy~Ly;jdUC~xS@m(h2}P$4zDtGJn%IJ-o}?B_$fYK}4q%C8#DMAPG3OE$$J z%|1SL0t^G`(|*3T51AUrdR5qu_Lg(-O@fl&J?nBSo+7eJ0`MLq5{ZDMx_?;ebmuZA zZqK=d3?acl)a2c1=Y^Rcx94K$#k3B5{RXCZ%ImkjtHsOEOS%TdB!~ zgwhd8^0(SWR>?^gu+#M*?y~C=!{~;jRdlU09WX+I$=oJ~9SMH=76(L-M%cFFwwuQ? z<@p68(VyMz1ULfjk^U9`>a>rtkCMRdN@uhN**MHGUs8U4Y?5J;%_@l+w1zSW%mATx zD@mdmx#N3DhGqVicInY-56snoV}S-^TyYsot03_@!G@qMfY>Kv95DYagQ`%Bhga$8 z%cqy8o(op7Lx%HZNjl&q>vLj1c@A8P!A?;paALWh;83X@iTr)ZC@YDe)ceg0Ci4&F z<@~_%J#|=xJN-n0%M| z_a>acc}rHs@m#Vb1w9EEm^vOXx?ZC<8~LULqo9tos~y3s>0ZI%!XU(T)m9r06WFbE zL%XByZjnKoRQGpOz!fW=uTZ#fdR!#qxvMBe__sWpxa-!`H3^T(Z&j|%mkvi>LC8^9 z1dtwdEt^L$W3or&KMV}0LY|&4qlNTmbQkqP5d`{zryL?x6Qc$?tk(1uPHgXszFJ*G zK$+)boYpoY{_iKd!I%L#)l39q40kijA;4(&__ZSGOB-=kS|Sy|z7_aw7tGPKPhqXF z?5?VR@5))w3Ve{J(E(36ii>7L8xIeoO)k??e4=&66`j0qk4ul2#wta-;K^M(pfC~j zuY#xlmtn?8kYcYHouwz=OhdH9+iNOCe+xDhaUHk!i6-=)dpx`)Uv|=Rk!nftoI=TW96@UAF&}1hcL)nfD5pzD_4tnfOrsw zauDe#{Y!%u##4FpdRjNAyOSB;K3iu3=uRlQ#I}fjezn7C)q2B;Bet`<@`GSiY}Vf$ z388dHWm0|4Xu~EN>F9sR@dr|#BU7GksetXVU*{5&^RvI(k}0f%Y~4mqs4{8IyAO|Q ztuS7xMvRuJJ8QEA+5Vq>RMww7@$nW<>%MPg57b@`R|GrFd^`qygl==2o|vo@Y@)C` zMINnc6h=93dpWCJ_K#7b0frw5I^y(|*P$S}1^}xO(Sbv;HBswe9N) z=*2ykZnNTLDA;s`ZJRcvT0v5^9ex>I7ro-@4ag#b9R&2sQWp^jru=N+n`6LFe175yUqk)FmZXK_ zP}k=*c}=N%I^9qc-n}{p@O{V0zBNc_%D#JwrA8!bq0z1Jskj|?6V8xg<=eNSU~k9| z6RG>Hoz0~yQi8D8Hc@R#P|mZQ3#w1>`L(F*D-+v1cr{H21{~{b*>DP21aIQlShrH} z_U(^Kr*13%GzFB(ID1Drq`XT`p~&1dJX{ui9xp zO;VG~d20n9KrWyB$o~tU+G5>E=DVTU1tWCy8aCuqkkn^#B@?RFdca^F3_=sLNJ zk}OmtnItqPOVALw7be|*)9Ds*ZHT(E(7)C`4_qqFRuDh9Q-K7J9CVE>=b`{gEP=;K=~438#Pjwe`#}X{>{OI$GOqEko&F)Oe}7~Y6>VeNw+8d>J|KLX$?1V;JncSm=qFX z@}H!<1t(+ScBzq3%Hp-u#^vBZ|x_FEuzKw_wBAc?4jc~J2K zo*y!~R&9R|5E_SHZ=I62?zZ{YG$W5zy<5-xd#lM;AHLW*bJ9bk|M!`vPy9SQzKi;; ziIPaBEWP^$4&E@T)^F*v;3eYNyQLWB_aBmC+iM2e0gyR5FzJeC#{q+LAD{XXB_!hG z?5yS_kF}S*`~t+~Wzz}MM-vkgh6mxf3F9cPB3*{k8Zgn<@G}yCy@N|1tm?~8>me5D zM(g>4;h%u~5fM<2Pm%C~O}D@Mo{$igHFbpdY^7#9%4!>5*em*l>~=1Q(=Gc)yXJ7^t~sXXuEnQ#mAZ?gw_ zzSF`<_M!QdP0_AwU-yI(KN!MnN$T-XX_3Ze$_fwQ8a5tm3ZMc-td6G_=y{k^2Ccsw zML~~lb$y{U#s`BX&@JT}hl>U@QRz7lC}xGYS3W)K>$$(`DMxyY`Eeg%719A8unAvVNsg#eF>-i&0;*;VAx zVmW_MuB>-D`llqPxb-RfHs##%Gu_oE%gszL#>1EkcT+*i5`8Rk7 z!u?+?arrFg`cnOAf&KwAKxrX&q*&i=D1|;t%992z$Edj!h*XgZ8{SGyN_vSK6#%EY zJ>Z310s?0vXU6_bb#-9ax1n^&zm3N&|36zkPuD{hCrey0@T%Q^(gB&?K}`JS8u}ab z*Zbn3y_RNB zx|l5{CG|q*MV~!7lWtECI>!5tIxegvNs834(M9HC%W&!H#^ZY0I&TY3)UbxmI#Mcg znM&fq&yKf?SZ{+X*AA)qe0g1Fa^RR$!bwUT-bMg}*u<gT5XcE{GwfboCr;8nOnb zFZo0+PEJ5=Nl7$7Pl~3i!MV%4{XXLt%L;sdYz;4xUo?C&Qz5=;9tLwTjH|!ulLFy= z!uJerL9J%M_BF3T)%H;;uK5T+zqiEd;pT7#XKges*Ro|XZs{tWO*!`+sXOE=DQdr| zqPET9P^i{WyN!pKB_m2FLuv%4EV-9bsLkxn&M&U&Tl$3#IAkNq-i~#=$LwatDQ%;n z`c`^S@#`7Mysh~Yt`isV?hwEb|4f+HDl&4wDdF;RKp>Ob{Ed&<%+|PXoXI;qdD*~uD%=~JvMUzicDP07f<>)_I7H`A>Ebxlt!nO5+BD~;zf*96f?m^Q>oZqMBw<=(C)eAD9?vaYUYeKdmpA%w<0 z#|Qh!X?v$ubsTR&BlmE}^ug2LZXi8%FR(^$S1xE&{OEj@KReR=SjVn4v7w=Xo&9Fr zGfG~Ea=0K%KO7>=X25C%*&E3rXIwu7Oy97Y^1g)(cOZ@Lc(bxCbAP4~$Br})zw`l; zUj_P!)3C8yI{(HwUi=$LP}S5$MM+e0`YT1XcTl>K!b)LFNhhc7m1!8@3geV;v5qev ztX7==tnmMqx-^l)w&H3~yvj79gDWyhHN8Iij&pcuh=~4qrnpQVlI$|zA<98h3wd)p zIqAaSLcx{IHV^!kwzjGK}3RP6M!04IFy?CjjBxF z)J>&D`DMbK_#X24Tk6YQP^UQJmj+)ckn$~aNI+uP$EfnFsi_6GZ$mH4xB40U)DB#y z5>gyJ3bo5j3UR&$=s3wQxWV*y2D#W=Q=nn;i9yGe?P@X({u_nGP0)h6K?-K+DIlGqQo@q%u$}=Ct z$4DOFrf&oHo?iiZ{3Tu{K5MHWXOM_3ZT+F@nkRCVzyRVG7P;Kfj^q-cM0|Du8Ui2!H#?#wWN4!%NOH+sa zyNJeM3EaHixetV#sTzu?c{OzG+rO;6^=cgUyaSzU1io7uSn6L0X(P#LUkjhb$!RWI z+I>G8{!%`=ZZZ41{Y&TX@$Ni{Z9ioo@gAH!hj_V*Itzs@W%%)ZgC-^R6kFkZ4$dE% zn4V32pN5UkZ~U%?(LT&ZkFD`5XDpwR8FnMX;VCE@~y${G~2ko;!UfTT})V%vzN zsPEnP%6CShO`M`J+eY%B&f?3!GHf~W2>oICL*C{07VJ}rZATdB1{MdjD9mUHZ6BYN z09v}F^=F9&Bktj9q=4U1iP`9a%F}V>HDdW?NTG^+%AtSog@U7b^1VD3f7pEo2OjDs z$KK-K!ssC>-0bX|Iy)IOrO8Y%C>sn^7J+0)@zQ|g9fu$!PT&XNBXNbqi|HX+4^S?@ zx?FzwgMxO6_hlChVUIU%7X`<*J7|#`>8FzAe=c)nw70L4POsP!7Fdc{9Gs*HM-5@YA8$6-QLm&W?jcYEf8xdr9yB)N8rU7; z(0+viCoAkZBqw}q-Akuyk-%=hd~FETpAZt5W|1k$aDjj(p-6%NORX1}f6gCkLD#Nh!qu7P7&HX=Z zon>5AYZvXMy9DV*1d&j>n+;L|(k)2W21F4FL6DLz=@z70x>E#cL68toM37LB=FWY5 z@BMVor}uZx%Z|0zdY)&_ImYmk5E{g&d2G&f?d6A6f1=BWhPJBrUHBaTokmVr;YpQxZuCCSwt2{z`N4AK} zjxA@+oBq2svcTl6-APp{8Zh7VX=V$45s~rWG-??JI#-8>_<-*`14c}&0ZYJ#~88Q5s{y5S9 zQu!V>G~E#$QO)1&2E;M9hVT>W>iuH`FIF?LS7^VJ>xjHlRg(K^BWVY70U5f{mt>{S zYX3q@j&oyb;Bj4-iuO6BePD6=*#NA$ilL7p#|dd}p#`2rEgcbAUj$Y`rrlNmkd-M( z!x#8F?j`Tld#L8zt_6ZXv}^sk2ZdN`W@Hu)*k zM42B*HYy+hq`_BO^#{J^KP~CLu`ZHRctZVcLhLR6&1Gwo1K;YQe*yPEuNLBX8{_vAFHj-vLS$PWS{)O}M zMyV(uU?35WPm-!>F_^9z(mgl>8@x%5+y@2*SYk8q=V;UDgRRC?iNYZ{{6Xu3rn|R@ z6ru95W;O*BlwUGp@z+28;48Y`aX&@*V9pF&U?^J-VGixD2B<#QGb)=5 zu6rQamPjqQ1567>QqUPM!<0(k&}13*KB}KeY4?f%wOiIv)mhf(#`qqWL8CBP`#|A0siO3U8(FReeI9F^o8Ez~jjz3lE|$S1RXyu# zhhRanLE13uAQa)?B7r7P@BJXs?$XXkFjhejCMdd&4j>)(y9$}V#Y5~n*J{2wO7vdc zBBoz?4Hq}GrQk76bXdCk1z=y}^9AE=we$|4`q8->xm+c8NiN8jsi~a*PVaz=5Dka^ zLF@Av=+%CvyCQ}&r2$3mXp6UM$K`3q-~HjG{z$D2+6Cf)LkzUF(DwFr*nrO7@AFvQ zY`~6oHF9}B)2U4^a-a5YLhIpYCrG}PVGXG+C78}Tdu|w<#|g9>UfSKOQHVZ%YpCPe zmAKJI+0k2Wi0{PI{W}s@P~)3#Wd-y_+nk_)L#b%M0UdcR8BDu-a`3Zo`-*nV@W(JE zh=XYv|1SF+vbLs{mY6^nX3~q#olQpY;)ATa*_ywLiwig-%l&YXqPwJmZDO$IQBz!> z`ozi)@g)#EP~0U(+2cVPc&#nE0v3(q|!E-bZO&BUel$+?S!U-9sNI#ne z_K)i!U{r4t*NiZ1FYL)0T6Oe3(Fw==yMZ#ASdrd}Sn2Fa zfdNA!;wf!C=-ZV+*Nsx1J>~K5$f3z^2J*6F^n_f~&A9LoQ^WJ-Ea8HNJ5b2Q_;qn0 z`s9g~6*_u&fY{o5Nu;P&t_)A~AJWNepCR>3N5aOsm zZ0K%0+|ReJIv9u(S!dgdoZe8!Z`1a8N*gJM79Xeia+X91BiN4L6^V1X?U0xHazsDq~#0P0-aWI0yxGj2L_2;~uYevwy6XbTH{pTmK6K z_&K9?WGNJKos=8Q;bZfXR#qugCqaPsT`9?e%1Sq1-vxo+th##JJ3CB_j4um@-bJI= zq-YkA@f`cwX+;*uS$g)#+w6Tuf`@{%4BQjmlcjLCK!IF8FYo(nP+C|~rI=`MUD2vKpPz@zZ?FJ2 z2Mb9S>nZMdg<`E^Dvz0zq^sBjl!MBky@VaDIIj0KP{CP2t(?ZFKtjxe6ediOt!To>*2WLL~uT1&HkuBCAQVx2Dkd@x&PB;v)H*_ z^_YE)N?&8F@omQ)L6vTJ0;U5iJ}>LB`h|moiY`m!r7@G`Tw0+RG!R%bxn5 z$=h|ikZY^g_BD`(paAZ)yF@vWxc6JXbgc8f3=O3t(cPmC?>%3i`YX6^I{|s6a8smS zVIhKU7EhR_s#?L-(B;3U1H+Fa4uzW*@?k?k%yL&l1QBFxs=tgqfqNiXlR(R~3jjs` zas34UfxVpG>2r!G;caBhA;f6_DvgRIPSo`D>YL`T z=DnaKhao?rAA&TF{tM`ccQ|~}6HtK$z2ylOb$c)@b;QjF||J~f#Nx{hi*s=x0mW@|I z%m?4v?$lA&io~i811PWj%PaozW&TIhYeI(WihNzU`EOu?0SrE28h%DTp}b$&T%bdzMlCfDa=NmuxN=UkO!2ez9v zM>pX8)I{kSX=nh8)!n(P3q2JYRqKK3mKIod*H!|f7qMM6{^NmB0-w*A+ z874=ZhtNg?dnNQ8VCo`xfW8GIACRWQCYzH8QU}+`RbCi+w~5eQJEm+J|5e`?@^+Iu z)Gh&Ai&m-+z|&mypk58Ve+FH%w9T9>)R9LU9hX(??-CDiOoCAeOcugd5TQo@LLoYM zVuJxXd%6ejQJn^DZV}A52#=d!oh@P`?k^qgvg1!ZHZ)8S;CY7%L2PGExL!b+h={3b zYQlRkDPi3lEq5Q(;;E+b9PFAfMJWZq0Hb#p6eb;)z9YO>N>LwPCCF^+ze`mG+mxPN zd5P9HYX~0&OjuVJl#4504F`w3C9~9TG@X{_Z|v;+UCSdHwB7wE_;fm@;Y?$?&Lq;%{is)uhjMhtp@VwL5(Vq1{7pzd!CnDt%(c)XT=*G%?-x}~ zW4gQCiQW#97oj#Mco026g_MZxgaer4uet?Ny)xTH&i8AC-KxibqcKIWo`4iDVkHyy z#q!KSvT%SdG7e$lI^Y(L_vM_(vRB-^q)c1KI7W8Ki-rh->|OQ->=(hU2Y>&rj%nd= zP%Ia9 zl%3u2fZ@yU5&^lgkckZ|(zzV$PgCeKX?d8&Ggp#EY;!|iii=(jzykku@@nk-1lG>> zHcN?lm~vW$dA4i8we@)Gd4m-iX5JK>UpTI@Ff?0?6n+W5248<3YF+h1D&M+VY!dzi zBc*;gECcdQi84<%z8|h;#21X?V5#>!a%KGETh`PMvnoGP5zv*eie1rG zq?GrFH9wSy_d&f&AkVl4^(GrsF4o{oWU!Gk9+Ei=z1&6dDavWr!$L`;79YJ4Z}yqI z{POj}eqW>%b7z?ES_cS0V4#}o3E2kbnJ_`4Y%!_rp#QEI98nZnHQz=Oi=vbz$(H6A zBF;9TFy)ZpF^O!d8~+lgPhYY*hIX^?n?BlCrKv|SvTScTzemXr}#&wL~}QYy3pZ;5_dbZJ`uKq69P5flsjdDL16CdMRl$$KsmYj4hxC zKwhAJ?wgq@f&-VmIczNU$+jOq|EC7rx~*750Zakj@|zL(6e}U$ct6mUe6iHJNrBIL zEfi8WhcUQCYU=B;+^=@z=Rgie9=l8hrsf0b>==Yw%3%UT5m47v&Eomxgf*E~EM|XF z(9<);@QC9u&_;23AF;#88sapkzIbi_ac2oV^|Z=2P>jWXyo-`fD5b{X8K5iEv8c7o zG$GWV7n4zGEm}WxqH=zrJkFbg7M2vn6*zgcy>zk7bXv`n&^z7kCk{emDF$_ zleC02I7Bwjcjz6;MDU0mca`*m1J^Hc{m&$RZ#LP?P~IKMN2y3M`>U;6Ix^Y$4bQ8d zP4PZ@x91x_^Ma{+TJIP%9=*MouDMg#V~gW=NC#iAnDYjd^j=Ry7+6^nj!LYCvRF?m zH*0wBAwT2>!O=bMg6o0pXnXyCqhqm=J`*P-1qg1VX;Xq5p8~R&u@Qf*7($z18DSB` zo5Pb!7j@U7%So}jM9g(BB-eEJ) z+=171g}s4(nk|I0p|bKGV`C^N3t&4P;UbECs(hEs-(E!s6WRsGls^bL0Su=^5#s6W ztWNm-l<9J{<0oU_)7cy!<41zR)-aOs+j+KBn)MXhe@)q6kvk=VmMHo#&KiB&+S5}2 zdge_Y5|Go94%<*_i2(8o1@WMmM~z8;>$14AvhrRmpzeSvmMd$$tfk zx6Thp#le7GoFcKuhv+qDYPh16m{8^0nx7^kLv$Q}>n%!M{wH7^<{G8sBw=C++<(DO zN-kSWp%f?>5u($VjXR`x9`si`X;p%9CI%a4nI3!6=1s@QoWl!u(i(|^$X_bRw}Tii z&StmqGFm|g(O6^}Jw1=Y$0aHZ-V+<6_AX0Rx0R-xnfgRjF1p@v9Ru;^%-|hUa%hY< z%hGgUtU8eX$O6K+uIdqL1_cPk&js&-BJPI;#>(w@Y2NG}34v1tZ3Y#2WueZ^)GCZl zK6GVOMp0^SuUI5Wuqo-_gh$!v4<`GTwD8BT$0uQ%?EAH4M+g`G@x;eG5 zx>8R2iP9sm1oanAs!jRH0+#)tvq6j^`&P78jD%k?4t`}*KGJM}>oHpLlYN)-xg?Sr zX}Y|$oDx5I&~ao3sG5oQde93C+9I(C0tg5-D((v1MLz|CN_U2qzVJK zz}VD<82v}Fzx@P#A|f=1mMOYnBPs9}*URcelE+JPbC5ejXY`$DZqNA?;f71lV(u~(s}zowaw5bGEL5)Nb+OtG8 zahHO-*188J)l#%esW-Ft-RzIOfS0!XJkn)AedW0do27^GPuG^`MUh2;%vZ5Y+w};f zd6nVw;3xE9*`#qY_6gOqr8UnNz~j6?(0zIn5Y-KzaAW(rqQ-KJUhF7(8rhcd2TMw z?g?Iqd{^fg5&5^yR66$9$PW*%C*;_MayIOtXWWy{9$?$#;TaTY7xbBrpWTD>Rchb$pB9(RbhjEIjR5?+LQftxi8T=j8!f2bWvruI zSrK!jkF}P2ONIV}k9VNCzFyCmW3IGT#tf&hIx~m0whD_o(_DLc?#&aM6QF>2aJ?xp z2oaEwmj2bOgWnhA>hNpW*z>5^?Cddwg_Q5q%dd}i-9U6HDBOG@n|y;8!~Qx>y*Qex z_5AbQ9O3E)$`>LLgAOdxc9vzf<6!gx15f3CWCenr>d-Hx;{;o9gxA_tm*DPTQNw$Ib=&iGKiXg z;>lr*jW@(LjoQyrnegF^D#!K`*>C&u(>B-ChM#6?6*dKk=+xl{(3S>w5wUq^_k-yj znNU)JI29Po9oyAEk7#j9;*)r})h)d+3Sl&{M(tY~G zG+Zmec=lc>R7+0&YPcdZa(qXos07vER3s0wSL&3QoV0_cmnahUc{r0>1=Kwbl!V|3 zSSX-sgOfb3KY)K5sQ~Rj$kcVW`x7V_>**ztl8+x6n+jCW%P9XS>iQV`1a5$%m9KkP zXJPwpVW_Ku7ICNK>XJ z@Pz}!7$h`7p*Yb4i{4@!XGoYz9+9oIYcX%XoUoVJ#nHZ3|Bj37HT``y*IqLWvILYs z>^%xl=SU+3XvGAm0bv3h$C5bt+{f$569O5+OV&D_#OKv|f26+{jx2=cEu%$v;_q_8 zDsC)^-avoE8Nn~W^lW-;qU(tN0@HC*kP0V;YK6Hb^;-~~iF;||@a|dfJ$2CV%;JhZ z;#6Z#D`sW64y+YoqX-{+`@x5^-w|G>78c4jJ{&$hW3TQ7vlZ7akG9kul683HYCW%8 zH5YtRG`UO(-h`s@m_ zWvJ9%xm6d=C}XWtC~;xvU{0Qcok~{cLceX@TvjxfMfVzg^e` z^~RDf_Zf7$Gs`$ucj@GK^|ID?0R&JiTT$pWS}O&#l#4VRHEY0 z`t|q7*A8^R%YzDvX7Bu+g_bV;zb;*#S~!Taj?Z46U!ENUzeFZre=S_{*>KlR4Yb{w zO5SX1^WrTTWHqldKVeC96F;1$_6!W*~-4 zs;}T3_IKT2{WTu7X^4&<^OJ9-&^6skqQnYt3r?$bqq>^_u#5iYqy8DjHDE*~w`U2{ z*E@))ClHon&?a-YjIP(B?fdFTg$h`r(JW$V4}O!}+TeTM7B)|i2*rakqaj*W`uy~G zf^1vP0}Z~y`A){l%bbHQed!L{$>v6I%+G-Qv8z1O{Z`p*%}E4~u|$SKky`%7tjG_G z9w&u6YBy5SW+NMI9!6pWtpzH{Qn_my{2h84gFN~cM}R5pLa^7QPi!q`w(~bzWU0e& z5^0>#n&hElTI8VVNu!^7OaIOzG6tR~z{?|pTb<6%7Ne{*j6+3mdk#tS?6BvbN_Vn9+AX~|*HTveU`{*q6|qH36OuaxKfUqo<1Q4w0l+u3Z9EBeQIx^2 zx^=yhzg#Adg-?Vz)8d-eS!bYct$uj|2@AwqB%!?W4C{eJz5l32)^vCOMJCWp5T{E} zcg82Y{fu4L`$pc_m9q+kxGnz^dn+vYhJ(ca9jvk6*idw+Yq80<;n93)-!&SkJ8+oC zDbQ>;%=0UI}A0L~tBNur4b&Y>BsD zj&@1BEFhbyS-kHy={^A@S-u;tPW%b$hn(*y!WZK2ioam{yIUK96qV%XXC+Z7wXYd+ z{q?Y#Qo5<~=_O}6WKsMOBF*CzrWNFi3R6utJvq?2aiF$}8esnx3gL{lmxaE2vF+Pw5RF-c14{BAQ_wX0>AtRccp6PwlX(}G^8azrzQ38j}-vL3|x!*>?2MF_VZY zGy0HdW2=XQ_$kMdQfZ71PT7AQ-!ygaI-rI1#m)Yl25cH%6u1FyP$5KkqhOlY6<1EF z6!_F(VPOHBTu#7F3!U(8_GT-hic($ur*W^li$cxO{w^BcwxeBTiilbmi8>^Apa2}z@MyVh~&bZL}e z<(J?Wb?Vu7u}r>-D6AHm)Rw#lA?dr+ zlCaD=QAdg>*0EIxM>9H4S$STp9sOY3+Di93BwJ)OfkN^rNod_oM{d>Au1YpzeIgY$ z$?LyAX2WNv{B$_o_Nr0L;n5V#H6^751+SAB6HHeN)iqY4CfT2nZ;Y8o3`Y7-Xx*te zG*x*dd43H(7o-#!$-eeOpP=BWgL6rxwqjc!ic`1h%bhXw@ZskIBNV4C>D?ywbWbY6 z2i5n4m<#yWlZ#n0Ee3SVoy)j-_Y*`cLH{vAk?9c#w+;ePJkw0Y#^`d;y|9k%aQ7Z& ztAa+}LAfdIup`SC84b}ganDeUC*wvF_75M&894-taTs$UT(?_aQ*w)rtx(fh*=o|# z)rH}rUJRSV=>L)Fc-bu~pLWSJ^ZW?EJs}NBr_j)oLNc-v_F;-gq9}Hst?O$iEic_E zQEBODd0vvw0JLyT%igsdGp?dd?Lw&Bp9vzm#oShI)I;*0mgOor>NlTH>C6xmFR65Y z_z>J<7X=LY&UFO2d}&IEURRE`(JCjq!$z366v+F>&SoK ztkhL2(KEASsF}U8Ohb4lLUE^8q#$OIqbW~##I?uCEmJ!(x!Oc zC6{{>qPcdB(wVZ4a>0e3bV$VbLJ*mrfKVRc-Q3>x8a%JcZ=|FJk z)H@WX=yW)Q`j-nEOY-n%CUZcEbGL%Q+USqeBJs~S{x+D=heLOVp|JX*(ObT79fyR6 zI%B#`NL8Reb{zF5a!%s6wM6P|TMVRRBcKGnL6U*S>tJaKl-T#yRt$Y!JX@d9y#L{# z@7FLTGILgIY{!-_8DDGXm$V(RF|>hmY>|t@vLlL8C!qU5n}^QDi2aue=@O*m>oD-( zc;uBBY#Aza@FeYg`}U?}^fMU_6%M&n@=#p_$PpN#2^P*RcdvP8@Y7hO{YT%l?4+Nr z8L!a$8Xdf8PwrjSm1E^ng;gH%wV{v&)150%Z{*;0U5Iyqkkp%LV28oJDeEa^OSn=A zt}V@&aFGpB2h7J$EJe$0*l44ONl1ny6S>(<0L``JxRCOvTyx`5-cd?nz z$Hp`v6&TSIa^buH59ZU&fq?dn6ZOwOo=$Ch;-A51WqL#>8*dm}HG zna*BhpEhNa6MThHRvjl%ArJtE8`hmsL-5MiZbl)cp(U-`MznI~qGhb|6Q)@#3VW~q z7hvmxz8N+AM zpyXZ(kWLvMA{ToBcxF^4jgf-d*K41aUMuD3f9C0BS>F4~vZ_tz*lRqpFkrD_=M^^m z^)9gF0`oo?HZJt%o9>$|rFo2Qr29(q9qh(}h)m4rSE7-GqSJ=OBt^~%{tg(#q2%8*dDLbV15Hk4OHXPSTdd0LLxS2X-UcQczIV2 zbLj_fH%88}daoS9{e|)5j+E5-h?_q--z@U853tmJAD=;!791G`S`>0yoYFjC;LnUS z6`A^a3B$0yZ)uT(Eng+COx*ftj#u*RIEoUT2fidF)s??S?I_dl^$a|pfnLttOK4Kb zbk{S`&^$1*ms(6gsGx5ev5?RTRupbrB?+B|6he$B6dg2wVFLDRUn9)Ob!KuWOloGN zv%xSItF`Hs1@xy|SHJEZ?e5-o!pzH_2ri5t{`pw7Tzc%(<1)SO%8nXaiGgknYiQE_ z$(Durc?DmZsKu--e0;TSkL z3R3NK=)L=$d$rl;WdQZ7O$ON(vK|hua8sRkG5KO#zU&dvu3MOnBKf;i{qu-aSsR}Q zYY~^8gM(xJoc`4o2qc;%1=yyp-NSNkE-e$ur<7$&DYygU}-~}Ab zri@ZW8^n+&eoMoTzrZM(T(D;saA^0Rz9ZnkAb?$l`Eb?G0kWVY23GfTj7SZ-Y-+ih z<*yh=Sf$&#x$yxO3fS;*%{R&#NlGS8T+E{6y{=Dp{tWrfb>v9)G#0RN0ptA4QDJ@| zOfjlG@+oQb;RBF%@p8=e`pa7YCU$6@!lJlE+GuH8@{;jC z0u2HGU7Qy?8MHZ&oE2NUfTn6X4kn* zhD}kxG_JJLel<7N!VpD!%nqxB3R{p;@T>h!Vdp4SHCaD02}gV}K}(+#Zh7&jSJMqm z36O~Fus!wa(8+7-fiPLrVltit<6h%Jjiq>X3~^jP=aYhJrWlocpu)-VW$G34m~PUB z&|~FL6nyh&f>3afW}sNn5U47@1FEC;0Bm7J=qafX^B zPMBpCsmc8yUa5H9txcSDZK^t{gV>!SlP#*nRAkiFlrO4$C(iZ!p(n))7}W=yx?OHV z`W2g{S2^NE$(>Z)#OHJbjMIQpr+2_?7-eVsmE7M@Ml}BZSHDO9fW=W)#CUP_QwOM4 zBm(O9(zF;PlB44h*wGDNtsIVyqHLrwip`A(?DNPjnJ``0pQ_4w&!( zq!+lN+)Mvs#Jvo4r;cXX#b9|{ApV#F5O}yW(4e(^=#TSN)xr6h`WU5M`P(5n4b@d; z2`8wBhl9EgE%$R?};@lIAMGj+_s%7Fb; z9KrC@c;ZCF^Q{rA0iFRHU@3Zi{&OY7)$bsJA_bfiK+*esJnDUOVxpMM@t(IZA$yy$ zohn!%H->HuSf$;`tK9{*D+U2l_jSeOBAt3e#)y-;?Z9G=1nyt=;o ze}yaJ5Jfz%f?tJgal*wznZ3=&!cs#}T|h{z;^0twTXHh@(O-Xqm70z&fr+$ota@S) z_0bq6Hafc~8ecaEz6S~O(fRj-UmXt?7HVSL$rHaS$=$mbbN1XjBsvMvi8WB(hc(eS z-VNZS@e0JNe=ct}hvZqfzL1dYrB=ja?udFwpq%6-o4*7l`L~@01mo$uL!iYbGPsJS*tzSTs`* z96NSj`U4+85?uuUZxn~FHMJU=JabzLsn6fZ`mOvu-Lt-XS2CEqTN1&c#%BNNb81%a z_{7Fp2qO$%=j&(jCm>!C?C!K7PTiz@2-Z&tLox|PhrAF87{{97^ft=OY}7fHd1QQL zBCN9-3Vbu6_yJ^vU~@NyU6z(36=Fpy( zFP-pcXLG#=4gpd8-J*FV=ARHbf0hP|=vkNrcMugo4Z;<>e?NU@XUCB+1nH@8Xj?ei zIUC)Pygd8ueMd+rgah;nh?h&?2V8p00SWo*HVwh$HZ#yaTAJXIz!!VS5CJ}6idRU( z>6@`(6oAhtmX04{56;@>&cdFNm>Co7fe(Rx0W12& z6aK-v!De`XZmC}R#o&)Zh_83tAm01t;m8PRX35l#+V}FN?%m7Ij0yR)Pa?m{;ZlMs8*EIQ9XrsgnnluxQ1|R%~T+k>oShFw=TrD8$u$V_Z%&@^LROnM&TPuLa z2p+(}yRn@*!tz61643Joy|*qU9D4rVaG1h`j6kIoIiXxn=?xeZ?Gb9v?y9UCg$c-B z38p1AXP~H-d?s?+m&l?&8)z}EG1-_1vj@~%nBI7#gV-!MirR#FPQz9=*2DPea7|@X zQE|5lsXUHrPfOpI)fSLtG5BA5G9paJz@Vq6$0&M5QbAFY69YV&S2@!eZ*XWQ?-KK8 z{C#65cqIuJ-_Y|XPHt81VOPQ*gx|@f+m5gNeDk4XMd6bJel<7rK`@trL+BiFs6|(X<36;X>BhrBR)%+ST%s^{VP* zT@+-!mJxWi8ONJh)<)7b1)i4~rOyhNLYcba8NNJ=`L*-+{CrgGZ-(@h2Mq7-u;x5$ zbQV5Knf{RXW<;-4@524!dZu}U@N;w+*)kY&Pzox>jhi?qKDUy-l{zRqKW~gDO&1ej z-I35~GO>|4-Lsy{;UcA$TNTJ`#qvsc-u7nc&nGwq-G}^PuhS0K)4zQ0rh523_LpLQ zT8wyMnp|T{UwcE7=Gyq9KSGD8L7ewLS172w4kA zqKlwiLY0aXod7D|{xlYa7{t!(AHi;7&PQ9y>b6IuzKJ`GD@qaR+cU%v4;LZ6Bx6;NiqA>gaa{rID@^fM&#Isc$BhogkT!SSb#i}|;kVIs8^ zp5LP>oA0n?6fnH_$eLQUu(XQj@Zr?=*5T05U5&{jg1k@6Yb^2j{#Hw|RRdNQzpY7K z1IJz#D0=iqwdOwV9XKiEU`{pl)js1}xw>V->dv(8?Uc=xcSokmq|+|0O!W2nZ3X_o z#O}|gfs1Nvv{)9eDxZ}i-NvJDGor-_UTs=e`DjvF{#^$KK{8iY@W+e$ZgQAyzuUZ* zCj9+eOh2Ui<$VQ=Ah`%y2}n*V7@jDevWwGUu3lE=SBNPji`bZh->yp!0`PuQDc;jg zv=C6>9Ip#oDiS@xReb4fO4W{qJJFW0gRDiJ^+4?b&qnX!ur}5c`unoU#{Bn;IV(O`cP<0O1tF#+hfJBbQ*L^(J`HPw(8$9 zRzn{#gi#i#iLwuj1bsYIr}eA$X_WLg`coeRGzo%`c2ZOM5EqK90v)xp;$Z$q=Zj7p z!pT3JJM;p8WB*&h=as3epHMAlMio9msN0{14LF+zmPq~j!yfJ#JhIbppPHwwx561@%b$ldwibCK_7NPGj|TL=QM?$Bs0wSrIHtJ z6G+cvI4I)6fcp2hHhUaXUE%a~KHN`nzfz5)B$>RKa9cYXKA&BztlwXBwwo#{p%n-p zU0`X4i8V5?P4fJ7+p_KI%hA{B#L*Sa559k7RDE{^P<#}7#!Gu#=w4fwtRlIFb4a-EAqG>64990qaR^(FsNG-7DXFP6{+7ye#Uz;M3JMBE z_}96_raZfc>gt{B`bs6-b}wf;&1k+9+tAwW?iz zff31VM`95X;9F8|lQ5-_Lm?ngvZb2eoHj&!0|z&_)O=l}sm?oC-eT*fA?NG6Z25Z3 zxdRhWUz-TGdVRk%*PITJZeRQb-^?rtAydJ~OF|@a7;9WkNxVdwky~ENQ9Z*ndC*<8{N`VZ5^#sng>b;zykm2abcn~mtQr~$Xh*Jezn)wc zXu6(-iGDo9ksU05c{2lHvN|!lmdo9hl#HmA{uwWL;&Xs}da@NxvD5SG7R65{zdz%E z=4@Febcwna`Mqc}{QJ5)=1dP3TdQgdjnq*ktw`bC-}7wk_Far;*sBjNZB}&WO-co` zq)cO7&}Pd`SiH$q_3XOrJnl&1m4rd654n_7L*aPY$7Yr&e+wzoEURi!adEgi-ghzx ziHYGUIX@at_braYTk)1kGffw`$SmpTd3ophD@GUHsMPP2je^F%v<|-ILwGP$+~vrU z?egQ27!Rx;l+SPa1QpgRT+0g+9rC{=Bh%?0T4I!~#~Wo&+X1x$e(%q&Cc_jUEvG?8 zo`$9gxf1loL0%#qDL|>bY4-NO+xYLDRl8#?`AMX1f{Nq3G{BKWiNetKHznR{nGV74Ah)RTr?52O>oJY|J1uDC^yI$aWF~OQxY~ZaF?0B1oA-j2SSjg`z6Oth%NwMw$SUo$ zHqJ*Sns>?Pnxd(ikE2=~zl_GHNjvs^DEr8j*x$9VOvNk3&);o9n*6+nx$QZtd6S1y zJEq8SSe@5teGOUE=x!F+5XbShnu#Tf%o8z!CdkIm)LD18oI{|Nn8>FS8TiN z^zN=Qf1C~$Z20+yO?-@6m7b1HVbA69;7q+`bDGhI^_gRBJex)~LUVs&91pDVtD3X! zKV3X5Z5#InHUE^UCiPMJ>W2#w9|=`W{3UBLDwTwg$C8s^*F3KG`dM3gYD=iF2 zQtYg)S6`4wH+rn&2l+FT%D&jOAjO_}d6iwe`I3j8+Lh4m8x9*qelzk99Cc-ip4y-yV7#FWi$rk$~5QtZH-qE=S?$pAeSJ?weHcq}++@cE#6}3Wq zpTFgQz5Ck44;!V-HM)?Zw^P>s)Fk)c>OS&gT+c*a9B#Xm7dTiP`r^myWGjtCy-#Nv zBGgp1wswf`x=u|958Dv)J3L6_)Q*QCr2U`h@DbNF7?pCSoMth-K$2NgMKgs|_Pk*s zWureW#E?~bx4CmFqnvMCZ@fORaWleqrZ_z1_>TJ5*Mh{|n=58=(}M?9;aywi2(E~U zvAJBur-pgk%g)myI?0q8+t(UXv=&q~w(`vE(K*#0gfDO2pao{bGoDui{&^@~V)QQd1~j2e9= zX<7?!<@DH!*q8DxNxO|QzLm*D*bT^oQhackOyx(|O)PIGcruMxx%(-cje1lK~7d+b_npzY2bEX2p1l!*!jJFC&+ zAYrS3Iq}$-*5&l%h(h?q$swc{ui24^0&ru?U! z^SzkWfQ#QUE3JE)xmp`CL{-@F41&0_9MMo(@+S1v7y(S_m7o8NslO5WlQia;t znxp)19+Kb(R({+Ns|-j#LgSOO;Ig`iWu*SnA}F}6LTgST!0-3<0&w*H`VfzK z>xUwL)1b_|nA!45f|EkFpDUj&>br=KDqeIk6R}^#loMoAWec(vJV}}hy({tBBKaL0 zwuByyj|Nc$&6)oEh~9{q_!4^WAUX%;?|-j8{sGTn;ePFznBzeE4R<1L`~zZUbeyHLz#huB|^T(IeeSL0Z-8 zxIwXjYHX}EwX1gJ*k2C3-j(E4OxX%F>lqyFIm`Zc)gCWTgoQbO7sI6a{cNSUuEchx z37Poz*q$?v8Mj;7%OTh_ME(;)M$+feWSu?v+)m;x30BxP)DX5mn{;o~z9*T(Ea~+8 zKDtN6Gp5BVM;iQMs<7IW7ij1q)aBg`!!nI$i9z>uOQ)f4fE43GX^FonOQAasJP!Eq z{r4FU#(y7EOU{h;{@cQ+ZgLjHyXvMM*=0XwWMk)&SgUEk@x^Dy$)&pbCpaCLFKV|> zbe-zc?4D>2tDG*eW-AkD=q(qvS$!d23~ORpzJV$}W*0mP}Q($NbnBX+l3l zF|{iE_jOg@s^zCv$eT>yMh+azXhjm zt7FwxapxJO=Qr|l72$W9o+=~@x~};B(AI!9WTpQlXU*7-kpp37N7&XN81#}i?Vm&;w}`q~eD&-MmLH7oc2 z{FuBab8fIAFHW;_pFyVgqi@dmk6lk$z%zKYV083)V;=f;mVehGdp%_?h%aoX9379{vS?ihY1JL_r~y%1#kBV9KBQK( z#|(6=;7AWa?9lauHwExOarSKqW=!||MvU3njHyjxIFzQkc{b5Y2$Nz?)K1vj(ndch zyLYhPI4*s|=l%mY*uR~+Dsx+o6mvz~%K@S^(+#DPND73~!^b*e8!fn!W~=E0QGZDt zHJZMV5X?d3B`}$ePhNuq7qQ!BbHd)a?oS(Oj)YOIcotKNZ+vFzuH-WTQk6~%Z$j&+ zIhz$@@z2^%U1~(G&4|!>lVQpoB{mCEM)oNW;mAMNf8h2w+vzjCL{-OgeYxu3VeJPU zJD2o?qfmju#c0dnjk>|)Qs?S4w^MUr+S6BmZFWu}>Z}<4n<8Ja8r$t^(lnyUy0Czh zPR&9_H;OELgSE!Y=2%A5_qkz8t08^l)+a8RuuPz3651oO{;9Xx@?sl#12<@cqfroj zGQs_W;dc$6^Po+lY(FzSa!k2DL<19s<@)*B8skXg76zYltOB#icEP=zNSb+W8}jhb zGZoaE?}#QNw0PZ0XD7X(33KnsZP!Abw;Ly|t6xgs8!6}i-hNyIiv;t+TCiY{@5P*| zI18q$1XS1Zh12(LS*56^LrB#M|28$3m!NjbfD|msxG7|XWCfGMnr~MtlcMbZXkKES zJ0EuBMn_LYql$Wj5Umxwx?Nv0sfw?>A4(I_|YO;5aIqWxo^qb>zbl zGnH#xzE8pqZ!g*TV*>a6`Zg>P^&H1qczvrrtb0`*I3Kx^RIhtHlS--4l5Q_gVq|C9 zIFb77i&~kS>XH!8gZPqs=!uuSwLhpJ0>W5Xr7^8#vrIy(fRYLzA;GwZaZxvn@A55o zP(&(S+(g~BDI3?LUKy7stMiV2_>e=oz$y8(ErCjKdF0pc?R^rpx1x#^d7{tBn8YyC zI6;SUaBO#MBN#U}9&w{PT}zSTt9_pD1ZSf}@J117;l9yPYxXChMb_hKq(}C( z^HSgo4tPL!H`82>99GV!KdE!VcWtG!iykP!#oK{+In+hWyL@_iaf#Nnu(#6Vy*_>g P{<*89saPRz8T5Yu3gj_8 literal 0 HcmV?d00001 diff --git a/Dev-C++/ExerciseBook/07.31/OLGraph.cpp b/Dev-C++/ExerciseBook/07.31/OLGraph.cpp new file mode 100644 index 0000000..79d3f4a --- /dev/null +++ b/Dev-C++/ExerciseBook/07.31/OLGraph.cpp @@ -0,0 +1,509 @@ +/*==================== + * ͼµÄÊ®×ÖÁ´±í´æ´¢±íʾ + * + * °üº¬Ëã·¨: 7.3 + ====================*/ + +#include "OLGraph.h" + +// ¼ÈëÊý¾ÝµÄÔ´Îļþ£»fpΪnullʱ£¬ËµÃ÷ÐèÒª´Ó¿ØÖÆÌ¨Â¼Èë +static FILE* fp = NULL; + +/* + * IncInfoָʾ¸ÃͼµÄ±ßÉÏÊÇ·ñ´æÔÚ¸½¼ÓÐÅÏ¢¡£ + * Èç¹ûÆäÖµ²»Îª0£¬Ôò±íʾÎÞ¸½¼ÓÐÅÏ¢£¬·ñÔò£¬±íʾ´æÔÚ¸½¼ÓÐÅÏ¢¡£ + */ +Boolean IncInfo = FALSE; + +// ·ÃÎʱêÖ¾Êý×飬¼Ç¼·ÃÎʹýµÄ¶¥µã +static Boolean visited[MAX_VERTEX_NUM]; + +// º¯Êý±äÁ¿ +static Status (* VisitFunc)(VertexType e); + + +/* + * ´´½¨ + * + *¡¾±¸×¢¡¿ + * + * ½Ì²ÄÖÐĬÈÏ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý¡£ + * ÕâÀïΪÁË·½±ã²âÊÔ£¬±ÜÃâÿ´ÎÔËÐж¼ÊÖ¶¯ÊäÈëÊý¾Ý£¬ + * Òò¶øÔÊÐíÑ¡Ôñ´ÓÔ¤ÉèµÄÎļþpathÖжÁÈ¡²âÊÔÊý¾Ý¡£ + * + * Èç¹ûÐèÒª´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý£¬ÔòpathΪNULL£¬»òpath[kind]Ϊ""¡£ + * Èç¹ûÐèÒª´ÓÎļþÖжÁÈ¡Êý¾Ý£¬ÔòÐèÒªÔÚpathÖÐÌîдÎļþÃûÐÅÏ¢¡£ + */ +Status CreateGraph(OLGraph* G, char* path[]) { + int readFromConsole; // ÊÇ·ñ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý + int kind; + Status flag; + + // ¡ï¡ï¡ï´Ë´¦¹Ì¶¨ÎªÓÐÏòͼ + kind = 0; + + // Èç¹ûûÓÐÎļþ·¾¶ÐÅÏ¢£¬Ôò´Ó¿ØÖÆÌ¨¶ÁÈ¡ÊäÈë + readFromConsole = (path == NULL) || strcmp(path[kind], "") == 0; + + // ÐèÒª´ÓÎļþ¶ÁÈ¡ + if(readFromConsole) { + (*G).kind = GraphKind(kind); // ¼Ç¼ͼ/ÍøµÄÀàÐÍ + } else { + // ´ò¿ªÎļþ£¬×¼±¸¶ÁÈ¡²âÊÔÊý¾Ý + fp = fopen(path[kind], "r"); + if(fp == NULL) { + return ERROR; + } + + // ¼ÈëͼµÄÀàÐÍ + ReadData(fp, "%d", &((*G).kind)); + } + + // Ëæ»ú´´½¨ÓÐÏòͼ/Íø»òÎÞÏòͼ/ÍøµÄÒ»ÖÖ + switch((*G).kind) { + case DG: + flag = CreateDG(G); + break; + default: + flag = ERROR; + break; + } + + if(fp != NULL) { + fclose(fp); + fp = NULL; + } + + return flag; +} + +/* + * ¨€¨€¨€¨€¨€¨€¨€¨€ Ëã·¨7.3 ¨€¨€¨€¨€¨€¨€¨€¨€ + * + * ¹¹ÔìÓÐÏòͼ + * + * ×¢£º + * ½Ì²ÄÖÐʹÓÃÁËÍ·²å·¨À´²åÈ뻡£¬ÕâÖÖ×ö·¨µÄΨһÓŵãÊDzåÈë·½±ã£¬ + * µ«ÊÇÔÚÉæ¼°µ½É¾³ý»ò²éÕÒʱ£¬Ð§Âʽϵͣ» + * ¶øÇÒ£¬"Í·²å·¨"ÒÀÀµÊäÈëµÄ˳Ðò£¬Èç¹ûÊäÈëµÄ±ß/»¡ÊÇÂÒÐòµÄ£¬ + * Ôò×îÖÕ¹¹Ôì³öµÄͼ/ÍøÖеıß/»¡Ò²ÊÇÎÞÐòµÄ¡£ + * + * ΪÁ˿˷þÒÔÉÏȱµã£¬ÕâÀï¸ÄÓÃ"ÉýÐò"²åÈë·¨£¬±£Ö¤²åÈëµÄ»¡ÊÇ"ÉýÐò"µÄ¡£ + * µ«Í¬Ê±£¬ÕâÑù×ö»áʹ"²åÈë"Ëã·¨±äµÃ½ÏΪ¸´ÔÓ¡£ + */ +static Status CreateDG(OLGraph* G) { + int i, k; + int vexnum, arcnum; + VertexType v1, v2; + InfoType* info = NULL; + + (*G).vexnum = (*G).arcnum = 0; + + if(fp == NULL) { + printf("ÇëÊäÈëÓÐÏòͼµÄ¶¥µãÊý£º"); + scanf("%d", &vexnum); + printf("ÇëÊäÈëÓÐÏòͼµÄ»¡Êý£º"); + scanf("%d", &arcnum); + printf("¸ÃÓÐÏòͼµÄ»¡ÉÏÊÇ·ñ°üº¬ÆäËû¸½¼ÓÐÅÏ¢(0-²»°üº¬©¦1-°üº¬)£º"); + scanf("%d", &IncInfo); + + // ¼Èë¶¥µã¼¯ + printf("Çë¼Èë %d ¸ö¶¥µã£¬²»Í¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º", vexnum); + for(i = 0; i < vexnum; i++) { + scanf("%c", &((*G).xlist[i].data)); + (*G).xlist[i].firstin = NULL; + (*G).xlist[i].firstout = NULL; + (*G).vexnum++; + } + } else { + ReadData(fp, "%d", &vexnum); // ¼Èë¶¥µãÊý + ReadData(fp, "%d", &arcnum); // ¼È뻡Êý + ReadData(fp, "%d", &IncInfo); // Åжϻ¡ÉÏÊÇ·ñ°üº¬¸½¼ÓÐÅÏ¢ + + // ¼Èë¶¥µã¼¯ + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(fp); + ReadData(fp, "%c", &((*G).xlist[i].data)); + (*G).xlist[i].firstin = NULL; + (*G).xlist[i].firstout = NULL; + (*G).vexnum++; + } + } + + // ½öÔÚ¿ØÖÆÌ¨Â¼ÈëÐÅϢʱÊä³ö´ËÌáʾ + if(fp == NULL && arcnum != 0) { + printf("ÇëΪÓÐÏòͼÒÀ´Î¼Èë %d Ìõ»¡µÄÐÅÏ¢£¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º\n", arcnum); + } + + // ¼È뻡µÄÐÅÏ¢ + for(k = 0; k < arcnum; k++) { + if(fp == NULL) { + printf("µÚ %2d Ìõ»¡£º", k + 1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v2); + } else { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + skipBlank(fp); + ReadData(fp, "%c%c", &v1, &v2); + } + + // Èç¹ûÐèҪ¼È뻡µÄÆäËû¸½¼ÓÐÅÏ¢ + if(IncInfo) { + // ×îºó¼È븽¼ÓÐÅÏ¢ + Input(*G, &info); + } + + // ²åÈ뻡 + InsertArc(G, v1, v2, info); + } + + // ´ÓÎļþÖжÁÈ¡Êý¾Ýʱ£¬×îºóÆäʵӦµ±ÅжÏÒ»ÏÂÊÇ·ñ¶Áµ½ÁË×ã¹»µÄÐÅÏ¢ + return OK; +} + +/* + * ¼È뻡µÄÏà¹Ø¸½¼ÓÐÅÏ¢ + */ +static void Input(OLGraph G, InfoType** info) { + int weight; + + // ÔÚ"Íø"µÄÇéÐÎÏÂÐèҪ¼ÈëȨֵÐÅÏ¢ + if(G.kind == DN || G.kind == UDN) { + *info = (InfoType*) malloc(sizeof(InfoType)); + + if(fp == NULL) { + scanf("%d", &weight); + } else { + ReadData(fp, "%d", &weight); + } + + (*info)->weight = weight; + } +} + +/* + * ²éÕÒ + * + * ·µ»Ø¶¥µãuÔÚͼ/ÍøÖеÄλÖà + */ +int LocateVex(OLGraph G, VertexType u) { + int i; + + for(i = 0; i < G.vexnum; i++) { + if(G.xlist[i].data == u) { + return i; + } + } + + return -1; +} + +/* + * ȡֵ + * + * ·µ»ØË÷Òýv´¦µÄ¶¥µãÖµ + */ +VertexType GetVex(OLGraph G, int v) { + if(v < 0 || v >= G.vexnum) { + return '\0'; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + return G.xlist[v].data; +} + +/* + * Ê׸öÁÚ½Óµã + * + * ·µ»Ø¶¥µãvµÄÊ׸öÁÚ½Óµã + */ +int FirstAdjVex(OLGraph G, VertexType v) { + int k; + ArcBox* r; + + // Ê×ÏÈÐèÒªÅжϸö¥µãÊÇ·ñ´æÔÚ + k = LocateVex(G, v); + if(k == -1) { + return -1; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + r = G.xlist[k].firstout; + if(r == NULL) { + return -1; + } else { + return r->headvex; + } +} + +/* + * ÏÂÒ»¸öÁÚ½Óµã + * + * ·µ»Ø¶¥µãvµÄ(Ïà¶ÔÓÚwµÄ)ÏÂÒ»¸öÁÚ½Óµã + */ +int NextAdjVex(OLGraph G, VertexType v, VertexType w) { + int kv, kw; + ArcBox* r; + + // Ê×ÏÈÐèÒªÅжϸö¥µãÊÇ·ñ´æÔÚ + kv = LocateVex(G, v); + if(kv == -1) { + return -1; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + // Ê×ÏÈÐèÒªÅжϸö¥µãÊÇ·ñ´æÔÚ + kw = LocateVex(G, w); + if(kw == -1) { + return -1; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + r = G.xlist[kv].firstout; + if(r == NULL) { + return -1; // Á´±íΪ¿Õ + } + + // ÔÚÁ´±íÖвéÕÒw + while(r != NULL && r->headvex < kw) { + r = r->tlink; + } + + // Èç¹ûûÕÒµ½w + if(r == NULL) { + return -1; + } + + // Èç¹ûÕÒµ½ÁËw£¬µ«ÊÇwºóÃæÃ»ÓбðµÄ¶¥µã£¬ÄÇôҲÎÞ·¨·µ»ØÁÚ½Óµã + if(r->headvex == kw && r->tlink != NULL) { + return r->tlink->headvex; + } + + return -1; +} + +/* + * ¹¹ÔìÒ»¸ö±ß/»¡½áµã(½öÏÞÄÚ²¿Ê¹ÓÃ) + */ +static ArcBox* newArcBoxPtr(int tailvex, int headvex, ArcBox* hlink, ArcBox* tlink, InfoType* info) { + ArcBox* p = (ArcBox*) malloc(sizeof(ArcBox)); + if(!p) { + exit(OVERFLOW); + } + + p->tailvex = tailvex; + p->headvex = headvex; + + p->hlink = hlink; + p->tlink = tlink; + + p->info = info; + + return p; +} + +/* + * ²åÈë±ß/»¡ + * + * Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬Ôò²åÈëÒ»Ìõ»¡ÐèÒªÔö¼ÓÁ½¸ö¶¥µã¹ØÏµ£¬µ«»¡µÄÊýÁ¿Ö»ÔöÒ»¡£ + * ¶ÔÓÚͼ/ÍøÀ´Ëµ£¬¿ÉÒÔÔڿɱä²ÎÊýÖÐÁгö±ß/»¡µÄ¸½¼ÓÐÅÏ¢¡£ + * + * ×¢£º´Ë´¦½ÓÊյIJÎÊýÓëMGraphÓÐЩ²»Ò»Ñù£ºÍøµÄ¸½¼ÓÐÅÏ¢Öаüº¬Á˸÷Ìõ±ß/»¡µÄȨֵ¡£ + */ +Status InsertArc(OLGraph* G, VertexType v, VertexType w, ...) { + int tail, head, k, count; + ArcBox* p; + ArcBox* pre; + ArcBox* r; + Boolean overlay = FALSE; // ÊÇ·ñΪ¸²¸ÇÌí¼Ó + InfoType* info = NULL; // ±ß/»¡µÄ¸½¼ÓÐÅÏ¢ + va_list ap; + + tail = LocateVex(*G, v); // »ñÈ¡¶¥µãvÔÚ¶¥µã¼¯ÖеÄλÖà + if(tail == -1) { + return ERROR; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + head = LocateVex(*G, w); // »ñÈ¡¶¥µãwÔÚ¶¥µã¼¯ÖеÄλÖà + if(head == -1) { + return ERROR; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + // ¾Ü¾ø»· + if(tail == head) { + return ERROR; + } + + // Èç¹û±ß/»¡ÉÏ´æÔÚ¸½¼ÓÐÅÏ¢ + if(IncInfo) { + va_start(ap, w); // ÔÚwºó²éѯÊ׸ö¿É±ä²ÎÊý + info = va_arg(ap, InfoType*); // »ñÈ¡¸½¼ÓÐÅÏ¢ + va_end(ap); + } + + /* ½ÓÏÂÀ´£¬ÐèÒª²éÕÒºÏÊʵIJåÈëλÖà */ + + for(count = 0; count < 2; count++) { + + // ÔÚºáÏòÁ´±íÉϲéÕÒºÏÊʵIJåÈëλÖà + pre = NULL; + // Ö¸ÏòÒÔtailΪβµÄÊ×Ìõ±ß/»¡ + r = G->xlist[tail].firstout; + while(r != NULL && r->headvex < head) { + pre = r; + r = r->tlink; + } + + // Óöµ½ÁËÏàͬλÖõĽáµã + if(r != NULL && r->headvex == head) { + r->info = info; // ¸´Óøýáµã + overlay = TRUE; // ·¢ÉúÁ˸²¸Ç + } else { + p = newArcBoxPtr(tail, head, NULL, r, info); + + if(pre == NULL) { + G->xlist[tail].firstout = p; + } else { + pre->tlink = p; + } + } + + // Èç¹ûûÓз¢Éú¸²¸Ç£¬ËµÃ÷²åÈëÁËнáµã£¬´ËʱÐèÒª¿¼ÂÇÆäÔÚ×ÝÏòÁ´±íÉϵÄλÖà + if(overlay == FALSE) { + // ÔÚ×ÝÏòÁ´±íÉϲéÕÒºÏÊʵIJåÈëλÖà + pre = NULL; + // Ö¸ÏòÒÔheadΪͷµÄÊ×Ìõ±ß/»¡ + r = G->xlist[head].firstin; + while(r != NULL && r->tailvex < tail) { + pre = r; + r = r->hlink; + } + + // Óöµ½ÁËÏàͬλÖõĽáµã + if(r != NULL && r->tailvex == tail) { + // ²»»áÖ´Ðе½ÕâÀÒòΪÈç¹û·¢ÉúÁ˸²¸Ç£¬Ç°Ãæ½ø²»À´ + } else { + /* ÖÁ´Ë£¬½áµãpÒѾ­´æÔÚÁË */ + + if(pre == NULL) { + p->hlink = G->xlist[head].firstin; + G->xlist[head].firstin = p; + } else { + p->hlink = pre->hlink; + pre->hlink = p; + } + } + } + + // Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬ÐèÒª¿¼ÂǶԳÆÐÔ + if((G->kind == UDG || G->kind == UDN) && tail != head) { + // µßµ¹iºÍj + k = tail; + tail = head; + head = k; + } else { + break; // Èç¹ûÊÇÓÐÏòµÄ£¬¿ÉÒÔ½áÊøÁË + } + } + + // ÔڷǸ²¸ÇµÄÇéÐÎÏ£¬²Å¿¼ÂǸüбß/»¡µÄÊýÁ¿ + if(!overlay) { + (*G).arcnum++; // ²»ÂÛÓÐÏòÎÞÏò£¬±ß/»¡ÊýÖ»ÔöÒ» + } + + return OK; +} + +/* + * Éî¶ÈÓÅÏȱéÀú(´Ë´¦½èÖúµÝ¹éʵÏÖ) + */ +void DFSTraverse(OLGraph G, Status(Visit)(VertexType)) { + int v; + + // ʹÓÃÈ«¾Ö±äÁ¿VisitFunc£¬Ê¹µÃDFS²»±ØÉèÖú¯ÊýÖ¸Õë²ÎÊý + VisitFunc = Visit; + + // ·ÃÎʱêÖ¾Êý×é³õʼ»¯ + for(v = 0; v < G.vexnum; v++) { + visited[v] = FALSE; + } + + // ´Ë´¦ÐèÒª±éÀúµÄÔ­ÒòÊDz¢²»Äܱ£Ö¤ËùÓж¥µã¶¼Á¬½ÓÔÚÁËÒ»Æð + for(v = 0; v < G.vexnum; v++) { + if(!visited[v]) { + DFS(G, v); // ¶ÔÉÐδ·ÃÎʵĶ¥µãµ÷ÓÃDFS + } + } +} + +/* + * Éî¶ÈÓÅÏȱéÀúºËÐĺ¯Êý + */ +static void DFS(OLGraph G, int v) { + int w; + + // ´ÓµÚv¸ö¶¥µã³ö·¢µÝ¹éµØÉî¶ÈÓÅÏȱéÀúͼG + visited[v] = TRUE; + + // ·ÃÎʵÚv¸ö¶¥µã + VisitFunc(G.xlist[v].data); + + for(w = FirstAdjVex(G, G.xlist[v].data); + w >= 0; + w = NextAdjVex(G, G.xlist[v].data, G.xlist[w].data)) { + if(!visited[w]) { + DFS(G, w); // ¶ÔÉÐδ·ÃÎʵĶ¥µãµ÷ÓÃDFS + } + } +} + +/* + * ÒÔͼÐλ¯ÐÎʽÊä³öµ±Ç°½á¹¹ + */ +void PrintGraph(OLGraph G) { + int i, head; + ArcBox* p; + + if(G.vexnum == 0) { + printf("¿Õͼ£¬ÎÞÐè´òÓ¡£¡\n"); + return; + } + + printf("µ±Ç°Í¼/Íø°üº¬ %2d ¸ö¶¥µã£¬ %2d Ìõ±ß/»¡...\n", G.vexnum, G.arcnum); + + for(i = 0; i < G.vexnum; i++) { + printf("%c ===> ", G.xlist[i].data); + + head = 0; + p = G.xlist[i].firstout; + + while(p != NULL) { + if(head < p->headvex) { + if(IncInfo == 0) { + printf(" "); + + // ¶ÔÓÚÍø£¬»á´ÓÆä¸½¼ÓÐÅÏ¢ÖлñÈ¡µ½È¨Öµ + } else { + printf(" "); + } + } else { + if(IncInfo == 0) { + printf("<%c, %c>", G.xlist[p->tailvex].data, G.xlist[p->headvex].data); + + // ¶ÔÓÚÍø£¬»á´ÓÆä¸½¼ÓÐÅÏ¢ÖлñÈ¡µ½È¨Öµ + } else { + printf("<%c, %c, %2d>", G.xlist[p->tailvex].data, G.xlist[p->headvex].data, p->info->weight); + } + + p = p->tlink; + } + + head++; + + if(p != NULL) { + printf(" "); + } + } + + printf("\n"); + } +} diff --git a/Dev-C++/ExerciseBook/07.31/OLGraph.h b/Dev-C++/ExerciseBook/07.31/OLGraph.h new file mode 100644 index 0000000..7008739 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.31/OLGraph.h @@ -0,0 +1,175 @@ +/*==================== + * ͼµÄÊ®×ÖÁ´±í´æ´¢±íʾ + * + * °üº¬Ëã·¨: 7.3 + ====================*/ + +#ifndef OLGRAPH_H +#define OLGRAPH_H + +#include +#include // Ìṩmemset¡¢strcmp Ô­ÐÍ +#include // Ìṩºêva_list¡¢va_start¡¢va_arg¡¢va_end +#include // Ìṩmalloc¡¢realloc¡¢free¡¢exitÔ­ÐÍ +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// + +/* + * ×¢£º + * + * ͨ³£À´½²£¬ÎÞȨͼ±»¼ò³ÆÎª¡¾Í¼¡¿£¬ÓÐȨͼ±»¼ò³ÆÎª¡¾Íø¡¿¡£ + * ÎÞÏòͼ/ÍøÖеĶ¥µã¹ØÏµ±»³ÆÎª¡¾±ß¡¿£¬ÓÐÏòͼ/ÍøÖеĶ¥µã¹ØÏµ±»³ÆÎª¡¾»¡¡¿£¬²¢Çø·Ö»¡Í·Ó뻡β¡£ + * ʵ¼Ê±íÊöÖУ¬Î´±Ø»áÑϸñ×ñÊØÒÔÉÏÃüÃû¡£ + * + * µ±Ç°½á¹¹Êʺϴ洢ÓÐÏòͼ¡£ + * + * ¡ï ²åÈë±ß/»¡µÄÐÅϢʱ£¬ÕâÀïµÄʵÏÖÊǰ´"ÉýÐò"²åÈëµÄ£¬ÕâʹµÃ²åÈëµÄ»¡Êǰ´"ÉýÐò"ÅÅÁеġ£ + */ + + +/* ºê¶¨Òå */ +#define MAX_VERTEX_NUM 26 // ×î´ó¶¥µã¸öÊý + + +// ͼµÄÀàÐÍ +typedef enum { + DG, // 0-ÓÐÏòͼ + DN, // 1-ÓÐÏòÍø(´øÈ¨Öµ) + UDG, // 2-ÎÞÏòͼ + UDN // 3-ÎÞÏòÍø(´øÈ¨Öµ) +} GraphKind; + +// ¶¥µãÀàÐÍ +typedef char VertexType; + +// ±ß/»¡µÄÏà¹Ø¸½¼ÓÐÅÏ¢ +typedef struct { + /* + * ×¢£º + * ½Ì²ÄÖиø³öµÄ½á¹¹Ö»¿¼ÂÇÁËÎÞȨͼ£¬¶øÃ»¿¼ÂÇÓÐȨͼ(Íø)¡£ + * ÕâÀïΪÁ˰ѡ°Íø¡±µÄÇéÐÎÒ²¿¼ÂǽøÈ¥£¬ÌØÔÚ¸½¼ÓÐÅÏ¢ÖÐÔö¼ÓÁË"È¨ÖØ"ÊôÐÔ¡£ + */ + int weight; +} InfoType; + +/* ±ß/»¡½áµã */ +typedef struct ArcBox { + int tailvex; // »¡Í·¶¥µãλÖà + int headvex; // »¡Î²¶¥µãλÖà + struct ArcBox* hlink; // Ö¸ÏòÏÂÒ»¸öÓµÓÐÏàͬ»¡Í·µÄ»¡ + struct ArcBox* tlink; // Ö¸ÏòÏÂÒ»¸öÓµÓÐÏàͬ»¡Î²µÄ»¡ + InfoType* info; // ¸Ã»¡µÄÏà¹Ø¸½¼ÓÐÅÏ¢ +} ArcBox; + +// ÿ¸öºáÏòÁ´±íµÄÍ·½áµã +typedef struct VexNode { + VertexType data; // ¶¥µã + ArcBox* firstin; // Ö¸Ïò¸Ã¶¥µãµÄµÚÒ»ÌõÈ뻡 + ArcBox* firstout; // Ö¸Ïò¸Ã¶¥µãµÄµÚÒ»Ìõ³ö»¡ +} VexNode; + +/* ͼµÄÊ®×ÖÁ´±í´æ´¢±íʾÀàÐͶ¨Òå */ +typedef struct { + VexNode xlist[MAX_VERTEX_NUM]; // ±íÍ·ÏòÁ¿ + int vexnum, arcnum; // ¶¥µãÊýºÍ»¡Êý + GraphKind kind; // ͼµÄÀàÐͱêÖ¾ +} OLGraph; + + +// ±ß/»¡ÉÏÊÇ·ñ´æÔÚ¸½¼ÓÐÅÏ¢ +extern Boolean IncInfo; + + +/* + * ´´½¨ + * + *¡¾±¸×¢¡¿ + * + * ½Ì²ÄÖÐĬÈÏ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý¡£ + * ÕâÀïΪÁË·½±ã²âÊÔ£¬±ÜÃâÿ´ÎÔËÐж¼ÊÖ¶¯ÊäÈëÊý¾Ý£¬ + * Òò¶øÔÊÐíÑ¡Ôñ´ÓÔ¤ÉèµÄÎļþpathÖжÁÈ¡²âÊÔÊý¾Ý¡£ + * + * Èç¹ûÐèÒª´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý£¬ÔòpathΪNULL£¬»òpath[kind]Ϊ""¡£ + * Èç¹ûÐèÒª´ÓÎļþÖжÁÈ¡Êý¾Ý£¬ÔòÐèÒªÔÚpathÖÐÌîдÎļþÃûÐÅÏ¢¡£ + */ +Status CreateGraph(OLGraph* G, char* path[]); + +/* + * ¨€¨€¨€¨€¨€¨€¨€¨€ Ëã·¨7.3 ¨€¨€¨€¨€¨€¨€¨€¨€ + * + * ¹¹ÔìÓÐÏòͼ + * + * ×¢£º + * ½Ì²ÄÖÐʹÓÃÁËÍ·²å·¨À´²åÈ뻡£¬ÕâÖÖ×ö·¨µÄΨһÓŵãÊDzåÈë·½±ã£¬ + * µ«ÊÇÔÚÉæ¼°µ½É¾³ý»ò²éÕÒʱ£¬Ð§Âʽϵͣ» + * ¶øÇÒ£¬"Í·²å·¨"ÒÀÀµÊäÈëµÄ˳Ðò£¬Èç¹ûÊäÈëµÄ±ß/»¡ÊÇÂÒÐòµÄ£¬ + * Ôò×îÖÕ¹¹Ôì³öµÄͼ/ÍøÖеıß/»¡Ò²ÊÇÎÞÐòµÄ¡£ + * + * ΪÁ˿˷þÒÔÉÏȱµã£¬ÕâÀï¸ÄÓÃ"ÉýÐò"²åÈë·¨£¬±£Ö¤²åÈëµÄ»¡ÊÇ"ÉýÐò"µÄ¡£ + * µ«Í¬Ê±£¬ÕâÑù×ö»áʹ"²åÈë"Ëã·¨±äµÃ½ÏΪ¸´ÔÓ¡£ + */ +static Status CreateDG(OLGraph* G); + +/* + * ¼È뻡µÄÏà¹Ø¸½¼ÓÐÅÏ¢ + */ +static void Input(OLGraph G, InfoType** info); + +/* + * ²éÕÒ + * + * ·µ»Ø¶¥µãuÔÚͼ/ÍøÖеÄλÖà + */ +int LocateVex(OLGraph G, VertexType u); + +/* + * ȡֵ + * + * ·µ»ØË÷Òýv´¦µÄ¶¥µãÖµ + */ +VertexType GetVex(OLGraph G, int v); + +/* + * Ê׸öÁÚ½Óµã + * + * ·µ»Ø¶¥µãvµÄÊ׸öÁÚ½Óµã + */ +int FirstAdjVex(OLGraph G, VertexType v); + +/* + * ÏÂÒ»¸öÁÚ½Óµã + * + * ·µ»Ø¶¥µãvµÄ(Ïà¶ÔÓÚwµÄ)ÏÂÒ»¸öÁÚ½Óµã + */ +int NextAdjVex(OLGraph G, VertexType v, VertexType w); + +/* + * ¹¹ÔìÒ»¸ö±ß/»¡½áµã(½öÏÞÄÚ²¿Ê¹ÓÃ) + */ +static ArcBox* newArcBoxPtr(int tailvex, int headvex, ArcBox* hlink, ArcBox* tlink, InfoType* info); + +/* + * ²åÈë±ß/»¡ + * + * Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬Ôò²åÈëÒ»Ìõ»¡ÐèÒªÔö¼ÓÁ½¸ö¶¥µã¹ØÏµ£¬µ«»¡µÄÊýÁ¿Ö»ÔöÒ»¡£ + * ¶ÔÓÚͼ/ÍøÀ´Ëµ£¬¿ÉÒÔÔڿɱä²ÎÊýÖÐÁгö±ß/»¡µÄ¸½¼ÓÐÅÏ¢¡£ + * + * ×¢£º´Ë´¦½ÓÊյIJÎÊýÓëMGraphÓÐЩ²»Ò»Ñù£ºÍøµÄ¸½¼ÓÐÅÏ¢Öаüº¬Á˸÷Ìõ±ß/»¡µÄȨֵ¡£ + */ +Status InsertArc(OLGraph* G, VertexType v, VertexType w, ...); + +/* + * Éî¶ÈÓÅÏȱéÀú(´Ë´¦½èÖúµÝ¹éʵÏÖ) + */ +void DFSTraverse(OLGraph G, Status(Visit)(VertexType)); + +/* + * Éî¶ÈÓÅÏȱéÀúºËÐĺ¯Êý + */ +static void DFS(OLGraph G, int v); + +/* + * ÒÔͼÐλ¯ÐÎʽÊä³öµ±Ç°½á¹¹ + */ +void PrintGraph(OLGraph G); + +#endif diff --git a/Dev-C++/ExerciseBook/07.31/StronglyConnectedComponents.cpp b/Dev-C++/ExerciseBook/07.31/StronglyConnectedComponents.cpp new file mode 100644 index 0000000..539f69d --- /dev/null +++ b/Dev-C++/ExerciseBook/07.31/StronglyConnectedComponents.cpp @@ -0,0 +1,262 @@ +/*================== + * ÓÐÏòͼµÄÇ¿Á¬Í¨·ÖÁ¿ + ===================*/ + +#include "StronglyConnectedComponents.h" + + +/* È«¾Ö±äÁ¿ */ +static int count; // ¶Ô·ÃÎʹýµÄ½áµã¼ÆÊý + +// KosarajuËã·¨ +static Boolean visited[MAX_VERTEX_NUM]; // ·ÃÎʱêÖ¾Êý×飬¼Ç¼·ÃÎʹýµÄ¶¥µã +static int finished[MAX_VERTEX_NUM]; // ´æ´¢Éî¶ÈÓÅÏȱéÀúÖзÃÎʵ½µÄÔªËØ + +// TarjanËã·¨ +static int dfs[MAX_VERTEX_NUM]; // Éî¶ÈÓÅÏȱéÀúʱÒÀ´Î·ÃÎʵ½µÄÔªËØ(µÄÐòºÅ) +static int low[MAX_VERTEX_NUM]; // low[v] ==> ÔªËØv¿ÉÒÔ»ØËݵ½µÄ×îÔç׿ÏÈ +static int stack[MAX_VERTEX_NUM]; // ´æ´¢±éÀú¹ý³ÌÖÐÓöµ½µÄ½áµã + + +/* + * (1) TarjanËã·¨ÇóȡǿÁ¬Í¨·ÖÁ¿ + * + * ºËÐÄ˼ÏëÊÇÉî¶ÈÓÅÏȱéÀú+»ØËÝ£¬Óë±¾ÕµÚ8½ÚÇó¹Ø½ÚµãµÄËã·¨ÓÐÀàËÆÖ®´¦ + */ +void Tarjan(OLGraph G) { + int i; + + count = -1; // ³õʼ»¯¼ÆÊý + + // ³õʼ»¯¶¥µãΪÉÐδ·ÃÎÊ + for(i = 0; i < G.vexnum; i++) { + dfs[i] = -1; + low[i] = -1; + } + + printf("´òÓ¡µ±Ç°ÓÐÏòͼÖеĸ÷×éÇ¿Á¬Í¨·ÖÁ¿£º\n"); + + for(i = 0; i < G.vexnum; i++) { + if(dfs[i] == -1) { + DFS_Tarjan(G, i); + } + } +} + +/* + * Éî¶ÈÓÅÏȱéÀú¶¥µãv¿É´ïµÄËùÓÐÔªËØ£¬²¢³¢ÊÔÕÒ³öÆäÖеÄÇ¿Á¬Í¨·ÖÁ¿ + */ +static void DFS_Tarjan(OLGraph G, int v) { + int min; + int w; + int i; + + ++count; + + // ¼Ç¼·ÃÎÊ´ÎÐò + dfs[v] = min = count; + + // ¼Ç¼Óöµ½µÄ½áµã + stack[count] = v; + + // Éî¶È±éÀúvÆðʼµÄͼ + for(w = FirstAdjVex(G, G.xlist[v].data); w >= 0; w = NextAdjVex(G, G.xlist[v].data, G.xlist[w].data)) { + // Èç¹ûw½áµãδ·ÃÎÊ + if(dfs[w] == -1) { + DFS_Tarjan(G, w); // ¶ÔÉÐδ·ÃÎʵĶ¥µãµ÷ÓÃDFS + + if(low[w] < min) { + min = low[w]; + } + + // Óöµ½ÒÑ·ÃÎʹýµÄ½áµã + } else { + // Èç¹ûwÒѱ»·ÃÎʹý£¬ÇÒwÊÇvÔÚÉú³ÉÊ÷ÉϵÄ׿ÏÈ + if(dfs[w] < min) { + min = dfs[w]; + } + } + } + + // Èç¹û"׿ÏÈ"½áµã»¹Ã»ÓÐÈ·¶¨»ØËÝ׿ÏÈ£¬ÔòÖ»¼Ç¼"׿ÏÈ"½áµãÉϵķÃÎÊ´ÎÐò + if(low[stack[min]]==-1) { + low[v] = min; + } else { + // »ñÈ¡"׿ÏÈ"½áµãÉϵĿɻØËÝ׿ÏÈ + low[v] = low[stack[min]]; + } + + // »ñÈ¡µ±Ç°ÒÑËÑË÷µ½µÄÇ¿Á¬Í¨×Ó¼¯ + if(low[v] == dfs[v]) { + for(i = count; i >= 0; i--) { + if(low[stack[i]] == dfs[v]) { + printf("%c ", GetVex(G, stack[i])); + count--; + } else { + break; + } + } + printf("\n"); + } +} + + +/* + * (2) KosarajuËã·¨ÇóȡǿÁ¬Í¨·ÖÁ¿£¬ÕâÊǽ̲ÄÖÐÌáµ½µÄËã·¨ + * + * ºËÐÄ˼ÏëÊÇ£º + * 1.´Óij¶¥µã³ö·¢£¬Éî¶È±éÀúÓÐÏòͼ£¬µÃµ½Ò»¸ö·ÃÎÊÐòÁУ» + * 2.ÄæÖÃÓÐÏòͼ£» + * 3.±éÀúÉÏÃæµÃ³öµÄ·ÃÎÊÐòÁУ¬¶ÔÆäÖеÄÿ¸ö¶¥µã½øÐÐÉî¶ÈÓÅÏȱéÀú¡£ + */ +void Kosaraju(OLGraph G) { + int i, v; + + count = 0; // ³õʼ»¯¼ÆÊý + + // 1.´Óij¶¥µã³ö·¢£¬Éî¶È±éÀúÓÐÏòͼ£¬µÃµ½Ò»¸ö·ÃÎÊÐòÁÐ + DFSTraverse(G, StoreElem); + + // 2.ÄæÖÃÓÐÏòͼ + InverseGraph(&G); + + // ·ÃÎʱêÖ¾Êý×é³õʼ»¯ + for(i = 0; i < G.vexnum; i++) { + visited[i] = FALSE; + } + + printf("´òÓ¡µ±Ç°ÓÐÏòͼÖеĸ÷×éÇ¿Á¬Í¨·ÖÁ¿£º\n"); + + // 3.±éÀúÉÏÃæµÃ³öµÄ·ÃÎÊÐòÁУ¬¶ÔÆäÖеÄÿ¸ö¶¥µã½øÐÐÉî¶ÈÓÅÏȱéÀú + for(i = 0; i < count; i++) { + v = LocateVex(G, finished[i]); + + if(visited[v] == TRUE) { + continue; + } + + DFS_Inverse(G, v); + printf("\n"); + } +} + +/* + * ÄæÖÃÓÐÏòͼ£¨Ê®×ÖÁ´±í´æ´¢½á¹¹£©£¬¼´½«ËùÓл¡µÄ·½ÏòÄæÖà + * + * ºËÐÄ˼ÏëÊÇ£º + * 1.´´½¨Ò»¸ö²»°üº¬Èκλ¡µÄ¿Õͼ£» + * 2.ÒÀ´Î±éÀúÿ¸ö¶¥µãµÄÿÌõÈ뻡£» + * 3.ÕªÏÂÓöµ½µÄÈ뻡£¬½«Æä²åÈëµ½¿ÕͼÖбä³É³ö»¡¡£ + */ +static void InverseGraph(OLGraph* G) { + OLGraph newG = *G; + int i; + ArcBox* r; + ArcBox* pre, * p; + int tmp; + + for(i = 0; i < newG.vexnum; i++) { + newG.xlist[i].firstin = NULL; + newG.xlist[i].firstout = NULL; + } + + for(i = 0; i < (*G).vexnum; i++) { + while((*G).xlist[i].firstin != NULL) { + // ÕªÏÂÓöµ½µÄÖ¸Ïò¶¥µãiµÄÈ뻡 + r = (*G).xlist[i].firstin; + (*G).xlist[i].firstin = r->hlink; + + // ÄæÖû¡µÄ·½Ïò + tmp = r->headvex; + r->headvex = r->tailvex; + r->tailvex = tmp; + + r->hlink = NULL; + r->tlink = NULL; + + // ²åÈëµ½ÐÂͼµÄ×ÝÏòÉÏ + pre = newG.xlist[r->headvex].firstin; + if(pre == NULL) { + newG.xlist[r->headvex].firstin = r; + } else { + if(r->tailvex < pre->tailvex) { + r->hlink = newG.xlist[r->headvex].firstin; + newG.xlist[r->headvex].firstin = r; + } else if(r->tailvex > pre->tailvex) { + p = pre->hlink; + + while(p != NULL && r->tailvex > p->tailvex) { + pre = p; + p = p->hlink; + } + + if(p == NULL || r->tailvex < p->tailvex) { + r->hlink = p; + pre->hlink = r; + } + } else { + // µÈÓÚʱ²»´¦Àí + } + } + + // ²åÈëµ½ÐÂͼµÄºáÏòÉÏ + pre = newG.xlist[r->tailvex].firstout; + if(pre == NULL) { + newG.xlist[r->tailvex].firstout = r; + } else { + if(r->headvex < pre->headvex) { + r->tlink = newG.xlist[r->tailvex].firstout; + newG.xlist[r->tailvex].firstout = r; + } else if(r->headvex > pre->headvex) { + p = pre->tlink; + + while(p != NULL && r->headvex > p->headvex) { + pre = p; + p = p->tlink; + } + + if(p == NULL || r->headvex < p->headvex) { + r->tlink = p; + pre->tlink = r; + } + } else { + // µÈÓÚʱ²»´¦Àí + } + } + } + } + + *G = newG; +} + +/* + * ´æ´¢Éî¶ÈÓÅÏȱéÀúÖзÃÎʵ½µÄÔªËØ + */ +static Status StoreElem(VertexType c) { + finished[count++] = c; + return OK; +} + +/* + * Éî¶È±éÀúÒѾ­ÄæÖúóµÄͼ + */ +static void DFS_Inverse(OLGraph G, int v) { + int w; + + // Èç¹ûÒÑ·ÃÎʹý£¬Ö±½Ó·µ»Ø + if(visited[v] == TRUE) { + return; + } + + // ´ÓµÚv¸ö¶¥µã³ö·¢µÝ¹éµØÉî¶ÈÓÅÏȱéÀúͼG + visited[v] = TRUE; + + // ´òÓ¡·ÃÎʵ½µÄ¶¥µã + printf("%c ", GetVex(G, v)); + + for(w = FirstAdjVex(G, G.xlist[v].data); + w >= 0; + w = NextAdjVex(G, G.xlist[v].data, G.xlist[w].data)) { + DFS_Inverse(G, w); // ¶ÔÉÐδ·ÃÎʵĶ¥µãµ÷ÓÃDFS + } +} diff --git a/Dev-C++/ExerciseBook/07.31/StronglyConnectedComponents.h b/Dev-C++/ExerciseBook/07.31/StronglyConnectedComponents.h new file mode 100644 index 0000000..1dec1aa --- /dev/null +++ b/Dev-C++/ExerciseBook/07.31/StronglyConnectedComponents.h @@ -0,0 +1,56 @@ +/*================== + * ÓÐÏòͼµÄÇ¿Á¬Í¨·ÖÁ¿ + ===================*/ + +#ifndef STRONGLYCONNECTEDCOMPONENTS_H +#define STRONGLYCONNECTEDCOMPONENTS_H + +#include +#include "OLGraph.h" //**¡ø07 ͼ**// + +/* + * (1) TarjanËã·¨ + * + * ÇóÈ¡ÓÐÏòͼµÄÇ¿Á¬Í¨·ÖÁ¿ + */ +void Tarjan(OLGraph G); + +/* + * Éî¶ÈÓÅÏȱéÀú¶¥µãv¿É´ïµÄËùÓÐÔªËØ£¬²¢³¢ÊÔÕÒ³öÆäÖеÄÇ¿Á¬Í¨·ÖÁ¿ + */ +static void DFS_Tarjan(OLGraph G, int v); + + +/* + * (2) KosarajuËã·¨ + * + * ÇóÈ¡ÓÐÏòͼµÄÇ¿Á¬Í¨·ÖÁ¿£¬ÕâÊǽ̲ÄÖÐÌáµ½µÄËã·¨ + * + * ºËÐÄ˼ÏëÊÇ£º + * 1.´Óij¶¥µã³ö·¢£¬Éî¶È±éÀúÓÐÏòͼ£¬µÃµ½Ò»¸ö·ÃÎÊÐòÁУ» + * 2.ÄæÖÃÓÐÏòͼ£» + * 3.±éÀúÉÏÃæµÃ³öµÄ·ÃÎÊÐòÁУ¬¶ÔÆäÖеÄÿ¸ö¶¥µã½øÐÐÉî¶ÈÓÅÏȱéÀú¡£ + */ +void Kosaraju(OLGraph G); + +/* + * ÄæÖÃÓÐÏòͼ£¨Ê®×ÖÁ´±í´æ´¢½á¹¹£©£¬¼´½«ËùÓл¡µÄ·½ÏòÄæÖà + * + * ºËÐÄ˼ÏëÊÇ£º + * 1.´´½¨Ò»¸ö²»°üº¬Èκλ¡µÄ¿Õͼ£» + * 2.ÒÀ´Î±éÀúÿ¸ö¶¥µãµÄÿÌõÈ뻡£» + * 3.ÕªÏÂÓöµ½µÄÈ뻡£¬½«Æä²åÈëµ½¿ÕͼÖбä³É³ö»¡¡£ + */ +static void InverseGraph(OLGraph *G); + +/* + * ´æ´¢Éî¶ÈÓÅÏȱéÀúÖзÃÎʵ½µÄÔªËØ + */ +static Status StoreElem(VertexType c); + +/* + * Éî¶È±éÀúÒѾ­ÄæÖúóµÄͼ£¬½öÏÞÄÚ²¿Ê¹Óà + */ +static void DFS_Inverse(OLGraph G, int v); + +#endif diff --git a/Dev-C++/ExerciseBook/07.31/TestData_DG.txt b/Dev-C++/ExerciseBook/07.31/TestData_DG.txt new file mode 100644 index 0000000..417c8b5 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.31/TestData_DG.txt @@ -0,0 +1,6 @@ +ͼÀàÐÍ¡ú0£¨ÓÐÏòͼ£© +¶¥µãÊý¡ú23 +»¡Êý¡ú32 +»¡ÊÇ·ñ´øÓÐÆäËûÐÅÏ¢¡ú0 +¶¥µã¼¯¡ú¡¾A£¬B£¬C£¬D£¬E£¬F£¬G£¬H£¬I£¬J£¬K£¬L£¬M£¬N£¬O£¬P£¬Q£¬R£¬S£¬T£¬U£¬V£¬W¡¿ +»¡µÄ¼¯ºÏ¡ú¡¾A£¬B¡¿¡¾B£¬D¡¿¡¾D£¬A¡¿¡¾B£¬C¡¿¡¾C£¬E¡¿¡¾E£¬F¡¿¡¾F£¬C¡¿¡¾C£¬G¡¿¡¾G£¬C¡¿¡¾E£¬U¡¿¡¾U£¬V¡¿¡¾V£¬W¡¿¡¾W£¬C¡¿¡¾V£¬E¡¿¡¾D£¬O¡¿¡¾D£¬I¡¿¡¾O£¬I¡¿¡¾I£¬J¡¿¡¾J£¬N¡¿¡¾N£¬O¡¿¡¾J£¬H¡¿¡¾N£¬R¡¿¡¾R£¬Q¡¿¡¾Q£¬R¡¿¡¾A£¬L¡¿¡¾L£¬M¡¿¡¾M£¬K¡¿¡¾K£¬L¡¿¡¾P£¬S¡¿¡¾S£¬P¡¿¡¾P£¬T¡¿¡¾T£¬S¡¿ \ No newline at end of file diff --git a/Dev-C++/ExerciseBook/07.32/07.32.cpp b/Dev-C++/ExerciseBook/07.32/07.32.cpp new file mode 100644 index 0000000..79f26d6 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.32/07.32.cpp @@ -0,0 +1,46 @@ +#include +#include "CSTree.h" +#include "ALGraph.h" +#include "MinimumSpanningTree.h" + +/* + * ÇóÎÞÏòÍøµÄ×îСÉú³ÉÉ­ÁÖ + */ +void Algo_7_32(ALGraph G); + + +int main(int argc, char* argv[]) { + ALGraph G; + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ´´½¨²¢´òÓ¡ÎÞÏòÍø... \n"); + { + char* path[4]; + + path[0] = ""; + path[1] = ""; + path[2] = ""; + path[3] = "TestData_UDN.txt"; + + CreateGraph(&G, path); + PrintGraph(G); + } + PressEnterToContinue(debug); + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ʹÓÃÆÕÀïÄ·Ëã·¨»ñÈ¡×îСÉú³ÉÉ­ÁÖ... \n"); + { + Algo_7_32(G); + } + PressEnterToContinue(debug); + +} + + +/* + * ÇóÎÞÏòÍøµÄ×îСÉú³ÉÉ­ÁÖ + */ +void Algo_7_32(ALGraph G) { + CSTree T = MinSpanTree_PRIM(G); + + // Êä³öÇóÈ¡µÄ×îСÉú³ÉÉ­ÁÖ£¬´Ë²½Öè¿ÉÑ¡ + PrintTree(T); +} diff --git a/Dev-C++/ExerciseBook/07.32/07.32.dev b/Dev-C++/ExerciseBook/07.32/07.32.dev new file mode 100644 index 0000000..aa1e57e --- /dev/null +++ b/Dev-C++/ExerciseBook/07.32/07.32.dev @@ -0,0 +1,151 @@ +[Project] +FileName=07.32.dev +Name=07.32 +Type=1 +Ver=2 +ObjFiles= +Includes= +Libs= +PrivateResource= +ResourceIncludes= +MakeIncludes= +Compiler= +CppCompiler= +Linker= +IsCpp=0 +Icon= +ExeOutput= +ObjectOutput= +LogOutput= +LogOutputEnabled=0 +OverrideOutput=0 +OverrideOutputName= +HostApplication= +UseCustomMakefile=0 +CustomMakefile= +CommandLine= +Folders= +IncludeVersionInfo=0 +SupportXPThemes=0 +CompilerSet=1 +CompilerSettings=0000000000000000001000000 +UnitCount=10 + +[VersionInfo] +Major=1 +Minor=0 +Release=0 +Build=0 +LanguageID=1033 +CharsetID=1252 +CompanyName= +FileVersion= +FileDescription=Developed using the Dev-C++ IDE +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion= +AutoIncBuildNr=0 +SyncProduct=1 + +[Unit1] +FileName=07.32.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit2] +FileName=ALGraph.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit3] +FileName=ALGraph.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit4] +FileName=CSTree.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit5] +FileName=CSTree.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit6] +FileName=MFSet.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit7] +FileName=MFSet.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit8] +FileName=MinimumSpanningTree.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit9] +FileName=MinimumSpanningTree.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit10] +FileName=TestData_UDN.txt +Folder= +Compile=0 +Link=0 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + diff --git a/Dev-C++/ExerciseBook/07.32/07.32.png b/Dev-C++/ExerciseBook/07.32/07.32.png new file mode 100644 index 0000000000000000000000000000000000000000..efa1f3f0fdd5da47688fe5366d058d26e043cc72 GIT binary patch literal 14783 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 literal 0 HcmV?d00001 diff --git a/Dev-C++/ExerciseBook/07.32/ALGraph.cpp b/Dev-C++/ExerciseBook/07.32/ALGraph.cpp new file mode 100644 index 0000000..365e9b2 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.32/ALGraph.cpp @@ -0,0 +1,326 @@ +/*================== + * ͼµÄÁÚ½Ó±í´æ´¢±íʾ + ===================*/ + +#include "ALGraph.h" + +// ¼ÈëÊý¾ÝµÄÔ´Îļþ£»fpΪnullʱ£¬ËµÃ÷ÐèÒª´Ó¿ØÖÆÌ¨Â¼Èë +static FILE* fp = NULL; + +/* + * IncInfoָʾ¸Ãͼ/ÍøµÄ±ß/»¡ÉÏÊÇ·ñ´æÔÚ¸½¼ÓÐÅÏ¢¡£ + * Èç¹ûÆäÖµ²»Îª0£¬Ôò±íʾÎÞ¸½¼ÓÐÅÏ¢£¬·ñÔò£¬±íʾ´æÔÚ¸½¼ÓÐÅÏ¢¡£ + */ +Boolean IncInfo = FALSE; + +// ·ÃÎʱêÖ¾Êý×飬¼Ç¼·ÃÎʹýµÄ¶¥µã +static Boolean visited[MAX_VERTEX_NUM]; + +// º¯Êý±äÁ¿ +static Status (* VisitFunc)(VertexType e); + + +/* + * ´´½¨ + * + *¡¾±¸×¢¡¿ + * + * ½Ì²ÄÖÐĬÈÏ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý¡£ + * ÕâÀïΪÁË·½±ã²âÊÔ£¬±ÜÃâÿ´ÎÔËÐж¼ÊÖ¶¯ÊäÈëÊý¾Ý£¬ + * Òò¶øÔÊÐíÑ¡Ôñ´ÓÔ¤ÉèµÄÎļþpathÖжÁÈ¡²âÊÔÊý¾Ý¡£ + * + * Èç¹ûÐèÒª´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý£¬ÔòpathΪNULL£¬»òpath[kind]Ϊ""¡£ + * Èç¹ûÐèÒª´ÓÎļþÖжÁÈ¡Êý¾Ý£¬ÔòÐèÒªÔÚpathÖÐÌîдÎļþÃûÐÅÏ¢¡£ + */ +Status CreateGraph(ALGraph* G, char* path[]) { + int readFromConsole; // ÊÇ·ñ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý + int kind; + Status flag; + + // ¡ï¡ï¡ï´Ë´¦¹Ì¶¨ÎªÎÞÏòͼ + kind = 3; + + // Èç¹ûûÓÐÎļþ·¾¶ÐÅÏ¢£¬Ôò´Ó¿ØÖÆÌ¨¶ÁÈ¡ÊäÈë + readFromConsole = (path == NULL) || strcmp(path[kind], "") == 0; + + // ÐèÒª´ÓÎļþ¶ÁÈ¡ + if(readFromConsole) { + (*G).kind = GraphKind(kind); // ¼Ç¼ͼ/ÍøµÄÀàÐÍ + } else { + // ´ò¿ªÎļþ£¬×¼±¸¶ÁÈ¡²âÊÔÊý¾Ý + fp = fopen(path[kind], "r"); + if(fp == NULL) { + return ERROR; + } + + // ¼ÈëͼµÄÀàÐÍ + ReadData(fp, "%d", &((*G).kind)); + } + + // Ëæ»ú´´½¨ÓÐÏòͼ/Íø»òÎÞÏòͼ/ÍøµÄÒ»ÖÖ + switch((*G).kind) { + case UDN: + flag = CreateUDN(G); + break; + default: + flag = ERROR; + break; + } + + if(fp != NULL) { + fclose(fp); + fp = NULL; + } + + return flag; +} + +/* + * ¹¹ÔìÎÞÏòÍø + */ +static Status CreateUDN(ALGraph* G) { + int i, k; + int vexnum, arcnum; + VertexType v1, v2; + InfoType* info = NULL; + + (*G).vexnum = (*G).arcnum = 0; + + if(fp == NULL) { + printf("ÇëÊäÈëÎÞÏòÍøµÄ¶¥µãÊý£º"); + scanf("%d", &vexnum); + printf("ÇëÊäÈëÎÞÏòÍøµÄ±ßÊý£º"); + scanf("%d", &arcnum); + printf("¸ÃÎÞÏòÍøµÄ±ßÉϱØÐë°üº¬ÆäËû¸½¼ÓÐÅÏ¢£¬ÒòΪ´Ë´¦µÄȨֵÐèÒª´æ´¢µ½¸½¼ÓÐÅÏ¢ÖÐ...\n"); + IncInfo = 1; + + // ¼Èë¶¥µã¼¯ + printf("Çë¼Èë %d ¸ö¶¥µã£¬²»Í¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º", vexnum); + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(stdin); + scanf("%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } else { + ReadData(fp, "%d", &vexnum); // ¼Èë¶¥µãÊý + ReadData(fp, "%d", &arcnum); // ¼Èë±ßÊý + ReadData(fp, "%d", &IncInfo);// ÅжϱßÉÏÊÇ·ñ°üº¬¸½¼ÓÐÅÏ¢ + IncInfo = 1; // Ç¿ÖÆ½«È¨ÖµÂ¼Èëµ½¸½¼ÓÐÅÏ¢ÖÐ + + // ¼Èë¶¥µã¼¯ + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(fp); + ReadData(fp, "%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } + + // ½öÔÚ¿ØÖÆÌ¨Â¼ÈëÐÅϢʱÊä³ö´ËÌáʾ + if(fp == NULL && arcnum != 0) { + printf("ÇëΪÎÞÏòÍøÒÀ´Î¼Èë %d Ìõ±ß(´øÈ¨Öµ)µÄÐÅÏ¢£¬¶¥µã¼°È¨ÖµÖ®¼äÓÿոñ¸ô¿ª£º\n", arcnum); + } + + // ¼Èë±ßµÄÐÅÏ¢ + for(k = 0; k < arcnum; k++) { + if(fp == NULL) { + printf("µÚ %2d Ìõ±ß¼°ÆäȨֵ£º", k + 1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v2); + } else { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + skipBlank(fp); + ReadData(fp, "%c%c", &v1, &v2); + } + + // Èç¹ûÐèҪ¼Èë±ßµÄÆäËû¸½¼ÓÐÅÏ¢ + if(IncInfo) { + // ×îºó¼È븽¼ÓÐÅÏ¢(´Ë´¦ÐèҪ¼ÈëÍøµÄȨֵ) + Input(*G, &info); + } + + // ²åÈë±ß + InsertArc(G, v1, v2, info); + } + + // ´ÓÎļþÖжÁÈ¡Êý¾Ýʱ£¬×îºóÆäʵӦµ±ÅжÏÒ»ÏÂÊÇ·ñ¶Áµ½ÁË×ã¹»µÄÐÅÏ¢ + return OK; +} + +/* + * ¼Èë±ß/»¡µÄÏà¹Ø¸½¼ÓÐÅÏ¢ + */ +static void Input(ALGraph G, InfoType** info) { + int weight; + + // ÔÚ"Íø"µÄÇéÐÎÏÂÐèҪ¼ÈëȨֵÐÅÏ¢ + if(G.kind == DN || G.kind == UDN) { + *info = (InfoType*) malloc(sizeof(InfoType)); + + if(fp == NULL) { + scanf("%d", &weight); + } else { + ReadData(fp, "%d", &weight); + } + + (*info)->weight = weight; + } +} + +/* + * ²éÕÒ + * + * ·µ»Ø¶¥µãuÔÚͼ/ÍøÖеÄλÖà + */ +int LocateVex(ALGraph G, VertexType u) { + int i; + + for(i = 0; i < G.vexnum; i++) { + if(G.vertices[i].data == u) { + return i; + } + } + + return -1; +} + +/* + * ¹¹ÔìÒ»¸ö±ß/»¡½áµã(½öÏÞÄÚ²¿Ê¹ÓÃ) + */ +static ArcNode* newArcNodePtr(int adjvex, ArcNode* nextarc, InfoType* info) { + ArcNode* p = (ArcNode*) malloc(sizeof(ArcNode)); + if(!p) { + exit(OVERFLOW); + } + + p->adjvex = adjvex; + + p->nextarc = nextarc; + + p->info = info; + + return p; +} + +/* + * ²åÈë±ß/»¡ + * + * Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬Ôò²åÈëÒ»Ìõ»¡ÐèÒªÔö¼ÓÁ½¸ö¶¥µã¹ØÏµ£¬µ«»¡µÄÊýÁ¿Ö»ÔöÒ»¡£ + * ¶ÔÓÚͼ/ÍøÀ´Ëµ£¬¿ÉÒÔÔڿɱä²ÎÊýÖÐÁгö±ß/»¡µÄ¸½¼ÓÐÅÏ¢¡£ + * + * ×¢£º´Ë´¦½ÓÊյIJÎÊýÓëMGraphÓÐЩ²»Ò»Ñù£ºÍøµÄ¸½¼ÓÐÅÏ¢Öаüº¬Á˸÷Ìõ±ß/»¡µÄȨֵ¡£ + */ +Status InsertArc(ALGraph* G, VertexType v, VertexType w, ...) { + int tail, head, k, count; + ArcNode* r; + ArcNode* pre; + Boolean overlay = FALSE; // ÊÇ·ñΪ¸²¸ÇÌí¼Ó + InfoType* info = NULL; // ±ß/»¡µÄ¸½¼ÓÐÅÏ¢ + va_list ap; + + tail = LocateVex(*G, v); // »ñÈ¡¶¥µãvÔÚ¶¥µã¼¯ÖеÄλÖà + if(tail == -1) { + return ERROR; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + head = LocateVex(*G, w); // »ñÈ¡¶¥µãwÔÚ¶¥µã¼¯ÖеÄλÖà + if(head == -1) { + return ERROR; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + // ¾Ü¾ø»· + if(tail == head) { + return ERROR; + } + + // Èç¹û±ß/»¡ÉÏ´æÔÚ¸½¼ÓÐÅÏ¢ + if(IncInfo) { + va_start(ap, w); // ÔÚwºó²éѯÊ׸ö¿É±ä²ÎÊý + info = va_arg(ap, InfoType*); // »ñÈ¡¸½¼ÓÐÅÏ¢ + va_end(ap); + } + + /* ½ÓÏÂÀ´£¬ÐèÒª²éÕÒºÏÊʵIJåÈëλÖà */ + + for(count = 0; count < 2; count++) { + pre = NULL; + // Ö¸ÏòÒÔtailΪβµÄÊ×Ìõ±ß/»¡ + r = G->vertices[tail].firstarc; + while(r != NULL && r->adjvex < head) { + pre = r; + r = r->nextarc; + } + + // Óöµ½ÁËÏàͬλÖõĽáµã + if(r != NULL && r->adjvex == head) { + r->info = info; // ¸´Óøýáµã + overlay = TRUE; // ·¢ÉúÁ˸²¸Ç + } else { + if(pre == NULL) { + G->vertices[tail].firstarc = newArcNodePtr(head, r, info); + } else { + pre->nextarc = newArcNodePtr(head, r, info); + } + } + + // Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬ÐèÒª¿¼ÂǶԳÆÐÔ + if((G->kind == UDG || G->kind == UDN) && tail != head) { + // µßµ¹iºÍj + k = tail; + tail = head; + head = k; + } else { + break; // Èç¹ûÊÇÓÐÏòµÄ£¬¿ÉÒÔ½áÊøÁË + } + } + + // ÔڷǸ²¸ÇµÄÇéÐÎÏ£¬²Å¿¼ÂǸüбß/»¡µÄÊýÁ¿ + if(!overlay) { + (*G).arcnum++; // ²»ÂÛÓÐÏòÎÞÏò£¬±ß/»¡ÊýÖ»ÔöÒ» + } + + return OK; +} + +/* + * ÒÔͼÐλ¯ÐÎʽÊä³öµ±Ç°½á¹¹ + */ +void PrintGraph(ALGraph G) { + int i; + ArcNode* p; + + if(G.vexnum == 0) { + printf("¿Õͼ£¬ÎÞÐè´òÓ¡£¡\n"); + return; + } + + printf("µ±Ç°Í¼/Íø°üº¬ %2d ¸ö¶¥µã£¬ %2d Ìõ±ß/»¡...\n", G.vexnum, G.arcnum); + + for(i = 0; i < G.vexnum; i++) { + printf("%c ===> ", G.vertices[i].data); + + p = G.vertices[i].firstarc; + while(p != NULL) { + if(IncInfo == 0) { + printf("%c ", G.vertices[p->adjvex].data); + + // ¶ÔÓÚÍø£¬»á´ÓÆä¸½¼ÓÐÅÏ¢ÖлñÈ¡µ½È¨Öµ + } else { + printf("%c[%2d] ", G.vertices[p->adjvex].data, p->info->weight); + } + + p = p->nextarc; + + if(p != NULL) { + printf("- "); + } + } + + printf("\n"); + } +} diff --git a/Dev-C++/ExerciseBook/07.32/ALGraph.h b/Dev-C++/ExerciseBook/07.32/ALGraph.h new file mode 100644 index 0000000..dfce53d --- /dev/null +++ b/Dev-C++/ExerciseBook/07.32/ALGraph.h @@ -0,0 +1,128 @@ +/*================== + * ͼµÄÁÚ½Ó±í´æ´¢±íʾ + ===================*/ + +#ifndef ALGRAPH_H +#define ALGRAPH_H + +#include +#include // Ìṩmemset¡¢strcmp Ô­ÐÍ +#include // Ìṩºêva_list¡¢va_start¡¢va_arg¡¢va_end +#include // Ìṩmalloc¡¢realloc¡¢free¡¢exitÔ­ÐÍ +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// + +/* + * ×¢£º + * + * ͨ³£À´½²£¬ÎÞȨͼ±»¼ò³ÆÎª¡¾Í¼¡¿£¬ÓÐȨͼ±»¼ò³ÆÎª¡¾Íø¡¿¡£ + * ÎÞÏòͼ/ÍøÖеĶ¥µã¹ØÏµ±»³ÆÎª¡¾±ß¡¿£¬ÓÐÏòͼ/ÍøÖеĶ¥µã¹ØÏµ±»³ÆÎª¡¾»¡¡¿£¬²¢Çø·Ö»¡Í·Ó뻡β¡£ + * ʵ¼Ê±íÊöÖУ¬Î´±Ø»áÑϸñ×ñÊØÒÔÉÏÃüÃû¡£ + * + * µ±Ç°½á¹¹Êʺϴ洢±ß/»¡±È½ÏÏ¡ÊèµÄͼ/Íø¡£ + * + * ¡ï ²åÈë±ß/»¡µÄÐÅϢʱ£¬ÕâÀïµÄʵÏÖÊǰ´"ÉýÐò"²åÈëµÄ£¬ÕâʹµÃ²åÈëµÄ»¡Êǰ´"ÉýÐò"ÅÅÁеġ£ + */ + + +/* ºê¶¨Òå */ +#define MAX_VERTEX_NUM 26 // ×î´ó¶¥µã¸öÊý + + +// ͼµÄÀàÐÍ +typedef enum { + DG, // 0-ÓÐÏòͼ + DN, // 1-ÓÐÏòÍø(´øÈ¨Öµ) + UDG, // 2-ÎÞÏòͼ + UDN // 3-ÎÞÏòÍø(´øÈ¨Öµ) +} GraphKind; + +// ¶¥µãÀàÐÍ +typedef char VertexType; + +// ±ß/»¡µÄÏà¹Ø¸½¼ÓÐÅÏ¢ +typedef struct { + /* + * ×¢£º + * ½Ì²ÄÖиø³öµÄ½á¹¹Ö»¿¼ÂÇÁËÎÞȨͼ£¬¶øÃ»¿¼ÂÇÓÐȨͼ(Íø)¡£ + * ÕâÀïΪÁ˰ѡ°Íø¡±µÄÇéÐÎÒ²¿¼ÂǽøÈ¥£¬ÌØÔÚ¸½¼ÓÐÅÏ¢ÖÐÔö¼ÓÁË"È¨ÖØ"ÊôÐÔ¡£ + */ + int weight; +} InfoType; + +/* ±ß/»¡½áµã */ +typedef struct ArcNode { + int adjvex; // ¸Ã»¡ËùÖ¸ÏòµÄ¶¥µãµÄλÖà + struct ArcNode* nextarc; // Ö¸ÏòÏÂÒ»Ìõ»¡µÄÖ¸Õë + InfoType* info; // »¡µÄ¸½¼ÓÐÅÏ¢£¬Í¨³£ºöÂÔ +} ArcNode; + +// ÿ¸öÁ´±íµÄÍ·½áµã +typedef struct VNode { + VertexType data; // ¶¥µãÐÅÏ¢ + ArcNode* firstarc; // Ö¸ÏòµÚÒ»ÌõÒÀ¸½¸Ã¶¥µãµÄ»¡µÄÖ¸Õë +} VNode; + +/* ͼµÄÁÚ½Ó±í´æ´¢±íʾÀàÐͶ¨Òå */ +typedef struct { + VNode vertices[MAX_VERTEX_NUM]; // ÁÚ½Ó±í + int vexnum, arcnum; // ͼ/ÍøµÄ¶¥µãÊýºÍ»¡Êý + GraphKind kind; // ͼµÄÀàÐͱêÖ¾ +} ALGraph; + + +// ±ß/»¡ÉÏÊÇ·ñ´æÔÚ¸½¼ÓÐÅÏ¢ +extern Boolean IncInfo; + + +/* + * ´´½¨ + * + *¡¾±¸×¢¡¿ + * + * ½Ì²ÄÖÐĬÈÏ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý¡£ + * ÕâÀïΪÁË·½±ã²âÊÔ£¬±ÜÃâÿ´ÎÔËÐж¼ÊÖ¶¯ÊäÈëÊý¾Ý£¬ + * Òò¶øÔÊÐíÑ¡Ôñ´ÓÔ¤ÉèµÄÎļþpathÖжÁÈ¡²âÊÔÊý¾Ý¡£ + * + * Èç¹ûÐèÒª´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý£¬ÔòpathΪNULL£¬»òpath[kind]Ϊ""¡£ + * Èç¹ûÐèÒª´ÓÎļþÖжÁÈ¡Êý¾Ý£¬ÔòÐèÒªÔÚpathÖÐÌîдÎļþÃûÐÅÏ¢¡£ + */ +Status CreateGraph(ALGraph* G, char* path[]); + +/* + * ¹¹ÔìÎÞÏòÍø + */ +static Status CreateUDN(ALGraph* G); + +/* + * ¼Èë±ß/»¡µÄÏà¹Ø¸½¼ÓÐÅÏ¢ + */ +static void Input(ALGraph G, InfoType** info); + +/* + * ²éÕÒ + * + * ·µ»Ø¶¥µãuÔÚͼ/ÍøÖеÄλÖà + */ +int LocateVex(ALGraph G, VertexType u); + +/* + * ¹¹ÔìÒ»¸ö±ß/»¡½áµã(½öÏÞÄÚ²¿Ê¹ÓÃ) + */ +static ArcNode* newArcNodePtr(int adjvex, ArcNode* nextarc, InfoType* info); + +/* + * ²åÈë±ß/»¡ + * + * Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬Ôò²åÈëÒ»Ìõ»¡ÐèÒªÔö¼ÓÁ½¸ö¶¥µã¹ØÏµ£¬µ«»¡µÄÊýÁ¿Ö»ÔöÒ»¡£ + * ¶ÔÓÚͼ/ÍøÀ´Ëµ£¬¿ÉÒÔÔڿɱä²ÎÊýÖÐÁгö±ß/»¡µÄ¸½¼ÓÐÅÏ¢¡£ + * + * ×¢£º´Ë´¦½ÓÊյIJÎÊýÓëMGraphÓÐЩ²»Ò»Ñù£ºÍøµÄ¸½¼ÓÐÅÏ¢Öаüº¬Á˸÷Ìõ±ß/»¡µÄȨֵ¡£ + */ +Status InsertArc(ALGraph* G, VertexType v, VertexType w, ...); + +/* + * ÒÔͼÐλ¯ÐÎʽÊä³öµ±Ç°½á¹¹ + */ +void PrintGraph(ALGraph G); + +#endif diff --git a/Dev-C++/ExerciseBook/07.32/CSTree.cpp b/Dev-C++/ExerciseBook/07.32/CSTree.cpp new file mode 100644 index 0000000..3a1f268 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.32/CSTree.cpp @@ -0,0 +1,76 @@ +/*=================================== + * Ê÷µÄ¶þ²æÁ´±í£¨º¢×Ó-Ðֵܣ©½á¹¹´æ´¢±íʾ + ====================================*/ + +#include "CSTree.h" + +int count = 0; + +/* + * ³õʼ»¯ + * + * ¹¹Ôì¿ÕÊ÷¡£ + */ +Status InitTree(CSTree* T) { + if(T == NULL) { + return ERROR; + } + + *T = NULL; + + return OK; +} + +/* + * ÅÐ¿Õ + * + * ÅжÏÊ÷ÊÇ·ñΪ¿ÕÊ÷¡£ + */ +Status TreeEmpty(CSTree T) { + return T == NULL ? TRUE : FALSE; +} + + +/*©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥ ͼÐλ¯Êä³ö ©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥*/ + +// ÒÔͼÐλ¯ÐÎʽÊä³öµ±Ç°½á¹¹ +void PrintTree(CSTree T) { + + // Óöµ½¿ÕÊ÷ÔòÎÞÐè¼ÌÐø¼ÆËã + if(TreeEmpty(T)) { + printf("\n"); + return; + } + + Print(T, 0); + + printf("\n"); +} + +// ͼÐλ¯Êä³öµ±Ç°½á¹¹ÄÚ²¿ÊµÏÖ +static void Print(CSTree T, int row) { + int k; + + if(T == NULL) { + return; + } + + if(row==0) { + printf("\nµÚ %d ¿ÃÊ÷...\n", ++count); + } + + // ·ÃÎʵ±Ç°½áµã + printf("%c ", T->data); + + Print(T->firstchild, row + 1); + + if(T->nextsibling != NULL) { + printf("\n"); + + for(k = 0; k < row; k++) { + printf(". "); + } + + Print(T->nextsibling, row); + } +} diff --git a/Dev-C++/ExerciseBook/07.32/CSTree.h b/Dev-C++/ExerciseBook/07.32/CSTree.h new file mode 100644 index 0000000..b864682 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.32/CSTree.h @@ -0,0 +1,54 @@ +/*=================================== + * Ê÷µÄ¶þ²æÁ´±í£¨º¢×Ó-Ðֵܣ©½á¹¹´æ´¢±íʾ + ====================================*/ + +#ifndef CSTREE_H +#define CSTREE_H + +#include +#include // Ìṩ malloc¡¢free Ô­ÐÍ +#include // Ìṩ memset¡¢strcmp Ô­ÐÍ +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// +#include "ALGraph.h" + +/* µ¥¸ö½áµã×î´óµÄº¢×ÓÊýÁ¿ */ +#define MAX_CHILD_COUNT 8 + +/* Ê÷µÄÔªËØÀàÐͶ¨Ò壬ÕâÀï¼ÙÉèÆäÔªËØÀàÐÍΪchar */ +typedef char TElemType; + +/* (º¢×Ó-ÐÖµÜ)Ê÷µÄ½áµã¶¨Òå */ +typedef struct CSNode { + TElemType data; + struct CSNode* firstchild; // Ö¸Ïò³¤×Ó + struct CSNode* nextsibling; // Ö¸ÏòÓÒÐÖµÜ +} CSNode; + +/* (º¢×Ó-ÐÖµÜ)Ê÷ÀàÐͶ¨Òå */ +typedef CSNode* CSTree; + + +/* + * ³õʼ»¯ + * + * ¹¹Ôì¿ÕÊ÷¡£ + */ +Status InitTree(CSTree* T); + +/* + * ÅÐ¿Õ + * + * ÅжÏÊ÷ÊÇ·ñΪ¿ÕÊ÷¡£ + */ +Status TreeEmpty(CSTree T); + + +/*©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥ ͼÐλ¯Êä³ö ©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥*/ + +// ÒÔͼÐλ¯ÐÎʽÊä³öµ±Ç°½á¹¹ +void PrintTree(CSTree T); + +// ͼÐλ¯Êä³öµ±Ç°½á¹¹ÄÚ²¿ÊµÏÖ +static void Print(CSTree T, int row); + +#endif diff --git a/Dev-C++/ExerciseBook/07.32/MFSet.cpp b/Dev-C++/ExerciseBook/07.32/MFSet.cpp new file mode 100644 index 0000000..8b9d29d --- /dev/null +++ b/Dev-C++/ExerciseBook/07.32/MFSet.cpp @@ -0,0 +1,93 @@ +/*===== + * ¼¯ºÏ + ======*/ + +#include "MFSet.h" + +/* + * ³õʼ»¯Ò»¸öÓɶà¸ö×Ó¼¯£¨Ã¿¸ö×Ó¼¯Ö»°üº¬µ¥¸ö³ÉÔ±£©¹¹³ÉµÄ¼¯ºÏS¡£ + * + * + *¡¾±¸×¢¡¿ + * + * ÕâÀï¶ÔµÚ6ÕµÄMFSet×öÁ˸͝£º + * 1.Ö±½ÓÔÚ²ÎÊýÖд«Èë×Ó¼¯ÊýÁ¿ + * 2.×Ó¼¯±àºÅ´Ó0¿ªÊ¼¼ÆÊý£¬Õâ»áÓ°Ïìµ½ºóÃæµÄº¯ÊýÖйØÓÚϱêµÄÅÐ¶Ï + */ +Status initial_mfset(MFSet* S, int n) { + int i; + + if(n <= 0) { + return ERROR; + } + + S->n = n; + S->r = 0; // µÚÒ»¸ö×Ó¼¯µÄλÖÃÔÚ0ºÅµ¥Ôª + + // ×Ó¼¯±àºÅ´Ó0¿ªÊ¼¼ÆÊý + for(i = 0; i < n; i++) { + S->nodes[i].parent = -1; + } + + return OK; +} + +/* + * ÇóÁ½¸ö»¥²»ÏཻµÄ×Ó¼¯SiºÍ×Ó¼¯SjµÄ²¢¼¯¡£ + */ +Status merge_mfset(MFSet* S, int i, int j) { + + // Ë÷ÒýÔ½½ç + if(i < 0 || i > S->n - 1 || j < 0 || j > S->n - 1) { + return ERROR; + } + + // ÏàͬµÄ×Ó¼¯ÎÞÐèºÏ²¢£¬Ö±½Ó·µ»Ø + if(i == j) { + return OK; + } + + S->nodes[i].parent = j; + + return OK; +} + +/* + * ÔÚ¼¯ºÏSÖвéÕÒÔªËØiµ±Ç°ËùÊôµÄ×Ó¼¯¡£ + */ +int find_mfset(MFSet S, int i) { + int j; + + // Ë÷ÒýÔ½½ç + if(i < 0 || i > S.n - 1) { + return -1; + } + + // ²éÕÒiËùÊôµÄ×Ó¼¯µÄ¸ù½áµã + for(j = i; S.nodes[j].parent >= 0; j = S.nodes[j].parent) { + // ´ÓÏÂÍùÉϲéÕÒ + } + + return j; +} + +/* + * ¸ù¾ÝµÈ¼Û¹ØÏµRÀ´ÕûÀí/½¨Á¢¼¯ºÏSÖеÄÔªËØ(×Ó¼¯)¡£ + */ +Status build_mfset(MFSet* S, Relation R) { + int k; + int i, j; + + for(k = 0; k < R.n; k++) { + // ÏÈ»ñÈ¡×Ó¼¯¸ù½áµã + i = find_mfset(*S, R.pairs[k].i); + j = find_mfset(*S, R.pairs[k].j); + + // ¶ÔÁ½¸ö»¥²»ÏཻµÄ×Ó¼¯½øÐй鲢 + if(!merge_mfset(S, i, j)) { + return ERROR; + } + } + + return OK; +} diff --git a/Dev-C++/ExerciseBook/07.32/MFSet.h b/Dev-C++/ExerciseBook/07.32/MFSet.h new file mode 100644 index 0000000..2a061a5 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.32/MFSet.h @@ -0,0 +1,92 @@ +/*===== + * ¼¯ºÏ + ======*/ + +#ifndef MFSET_H +#define MFSET_H + +#include +#include // Ìṩ malloc¡¢free Ô­ÐÍ +#include // Ìṩ memset¡¢strcmp Ô­ÐÍ +#include // +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// + +/* Ê÷µÄ×î´ó½áµãÊý£¬ÕâÀïָʾ×Ó¼¯×î´óÊýÁ¿ */ +#define MAX_TREE_SIZE 1024 + +/* ¶þÔª¹ØÏµ¶ÔÊýÁ¿ */ +#define MAX_PAIR_SIZE 100 + +/* + * (Ë«Ç×)Ê÷µÄ½áµã¶¨Òå + * + *¡¾×¢¡¿ + * 1.ÒÀÕս̲ĵÄͼʾ£¬Ë«Ç×Ê÷ÔÚ¼¯ºÏµÄÓ¦ÓÃÖУ¬ÆäÄ£ÐÍÒѱ»¼ò»¯£º¼´Ë«Ç×½áµã²»ÔÙ±£ÁôÊý¾ÝÓò¡£ + * 2.½áµãµÄË÷ÒýÓÃÀ´±íʾËüÊÇÄÄÒ»¸ö×Ó¼¯£¬Ëü»á×÷Ϊ¸ü´ó×Ó¼¯µÄÒ»¸öÔªËØ´æÔÚ¡£ + * 3.È·¶¨Ä³¸ö×Ó¼¯ÊôÓÚSÖÐÄĸö¸ü´óµÄ×Ó¼¯Ê±£¬ÐèÒªÏòÉÏ×·Ëݵ½¸ü´ó×Ó¼¯µÄ¸ù¡£ + * 4.ʵ¼ÊʹÓÃÖУ¬Ã¿¸ö×Ó¼¯»á°üº¬ºÜ¶àÊý¾ÝÔªËØ£¬´Ëʱ¿ÉÒÔ½«Ã¿¸öÊý¾ÝÔªËØÓëÆäËùÊôµÄ×Ó¼¯½¨Á¢¹ØÁª¹ØÏµ + * ¼´°Ñÿ¸öÊý¾ÝÔªËØÓ뼯ºÏSÖи÷½áµãµÄË÷Òý¹ØÁªÆðÀ´ + */ +typedef struct PTNode { + int parent; // Ë«Ç×λÖÃÓò£¬ÓÃÀ´Ö¸Ê¾¸Ã½áµãËùÊôµÄ×Ó¼¯ +} PTNode; + +/* + * (Ë«Ç×)Ê÷ÀàÐͶ¨Òå + * + *¡¾×¢¡¿ + * 1.Ê÷ÖнáµãÔÚnodesÖÐ"½ôÁÚ"´æ´¢£¬Ã»ÓпÕ϶ + * 2.µ±×Ó¼¯´æÔÚʱ£¬Ê÷¸ùrÉèÖÃΪ1£¬·ñÔò£¬Ê÷¸ùrÉèÖÃΪ0 + * 3.³ý¸ù½áµãÍ⣬ÆäËû½áµãÒÀ´Î°´²ãÐò˳ןù½áµãÍùÏÂÅÅÁÐ + * 5.ÕâÀï¼ÙÉènodes¿Õ¼äÊÇ×ã¹»´óµÄ£¬¿ÉÒÔÊÓÐèÇ󽫯ä¸ÄΪ¶¯Ì¬·ÖÅä´æ´¢ + */ +typedef struct { + PTNode nodes[MAX_TREE_SIZE]; // ´æ´¢Ê÷Öнáµã + int r; // Ê÷¸ùλÖÃ(Ë÷Òý)£¬ÕâÀïÓÃÀ´Ö¸Ê¾µÚÒ»¸ö×Ó¼¯µÄλÖà + int n; // Ê÷µÄ½áµãÊý£¬ÕâÀïÓÃÀ´Ö¸Ê¾ËùÓÐ +} PTree; + +/* ¼¯ºÏÀàÐͶ¨Òå */ +typedef PTree MFSet; + +/* µ¥¸ö¶þÔª¹ØÏµ¶Ô */ +typedef struct { + int i; + int j; +} Pair; + +/* ¼¯ºÏÄڵĵȼ۹ØÏµ */ +typedef struct { + Pair pairs[MAX_PAIR_SIZE]; // ×ã¹»´óµÄ¿Õ¼ä´æ´¢¶þÔª¹ØÏµ + int n; // ÒÑÖªµÄµÈ¼Û¹ØÏµÊýÁ¿ +} Relation; + + +/* + * ³õʼ»¯Ò»¸öÓɶà¸ö×Ó¼¯£¨Ã¿¸ö×Ó¼¯Ö»°üº¬µ¥¸ö³ÉÔ±£©¹¹³ÉµÄ¼¯ºÏS¡£ + * + * + *¡¾±¸×¢¡¿ + * + * ÕâÀï¶ÔµÚ6ÕµÄMFSet×öÁ˸͝£º + * 1.Ö±½ÓÔÚ²ÎÊýÖд«Èë×Ó¼¯ÊýÁ¿ + * 2.×Ó¼¯±àºÅ´Ó0¿ªÊ¼¼ÆÊý£¬Õâ»áÓ°Ïìµ½ºóÃæµÄº¯ÊýÖйØÓÚϱêµÄÅÐ¶Ï + */ +Status initial_mfset(MFSet* S, int n); + +/* + * ÇóÁ½¸ö»¥²»ÏཻµÄ×Ó¼¯SiºÍ×Ó¼¯SjµÄ²¢¼¯¡£ + */ +Status merge_mfset(MFSet* S, int i, int j); + +/* + * ÔÚ¼¯ºÏSÖвéÕÒÔªËØiµ±Ç°ËùÊôµÄ×Ó¼¯¡£ + */ +int find_mfset(MFSet S, int i); + +/* + * ¸ù¾ÝµÈ¼Û¹ØÏµRÀ´ÕûÀí/½¨Á¢¼¯ºÏSÖеÄÔªËØ(×Ó¼¯)¡£ + */ +Status build_mfset(MFSet* S, Relation R); + +#endif diff --git a/Dev-C++/ExerciseBook/07.32/MinimumSpanningTree.cpp b/Dev-C++/ExerciseBook/07.32/MinimumSpanningTree.cpp new file mode 100644 index 0000000..ff02e10 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.32/MinimumSpanningTree.cpp @@ -0,0 +1,118 @@ +/*=================== + * ÎÞÏòÍøµÄ×îСÉú³ÉÉ­ÁÖ + ===================*/ + +#include "MinimumSpanningTree.h" + +/* + * ÆÕÀïÄ·Ëã·¨ÖÐÓõ½µÄ¸¨ÖúÊý×飬 + * ÓÃÀ´¼Ç¼´Ó¶¥µã×Ó¼¯Uµ½¶¥µã×Ó¼¯V-UµÄ´ú¼Û×îСµÄ±ß + */ +static struct { + VertexType adjvex; // ¶¥µã×Ó¼¯UÖеĶ¥µã + int lowcost; // ¶¥µã×Ó¼¯V-Uµ½µ±Ç°¶¥µãadjvexµÄ±ßµÄȨֵ +} closedge[MAX_VERTEX_NUM]; // ¸¨ÖúÊý×é + + +/* + * ʹÓÃÆÕÀïÄ·Ëã·¨¹¹ÔìÎÞÏòÍøGµÄ×îСÉú³ÉÉ­ÁÖ + */ +CSTree MinSpanTree_PRIM(ALGraph G) { + int i, j, k; + ArcNode* p; + CSTree r; + CSTree T = NULL; + CSTree curRoot = NULL; // ×·×ÙÉ­ÁÖÖÐ×ÓÊ÷µÄ¸ù½áµã + CSTree parent[MAX_VERTEX_NUM] = {NULL}; // ×·×Ù¸÷¶¥µãÔÚÉ­ÁÖÖеÄλÖÃ(ÓÃÖ¸ÕëÖ¸Ïò¸Ã¶¥µã) + + // ¸¨ÖúÊý×é³õʼ»¯£º³õʼ»¯ËùÓÐȨֵΪ0 + for(j=0; jfirstchild = r->nextsibling = NULL; + + // ³öÏÖÁËеÄ×ÓÊ÷ + if(k==-1) { + printf("----------\n"); + + // È·¶¨É­ÁÖÖÐ×ÓÊ÷µÄ¸ù + for(k=0; kdata = G.vertices[k].data; + parent[k] = r; + + if(curRoot==NULL) { + T = curRoot = r; + } else { + // Á´½Óµ½É­ÁÖÖÐÏÂÒ»¿ÃÊ÷ + curRoot->nextsibling = r; + curRoot = r; + } + + break; + } + } + } else { + r->data = G.vertices[k].data; + + // »ñÈ¡¸¸½áµãÔÚͼÖеÄÐòºÅ + j = LocateVex(G, closedge[k].adjvex); + if(parent[j]->firstchild==NULL) { + parent[j]->firstchild = r; + } else { + // Ö±½Ó²ÉÓÃÍ·²å·¨¼´¿É + r->nextsibling = parent[j]->firstchild->nextsibling; + parent[j]->firstchild->nextsibling = r; + } + + parent[k] = r; + + // ´òÓ¡¶¥µãºÍ±ßµÄÐÅÏ¢ + printf("%c --%2d-- %c\n", closedge[k].adjvex, closedge[k].lowcost, G.vertices[k].data); + } + + // ½«¶¥µãk¼ÓÈëµ½¶¥µã×Ó¼¯U + closedge[k].lowcost = 0; + + // ж¥µã½øÈë¶¥µã×Ó¼¯Uºó£¬ÐèÒª¸üж¥µã×Ó¼¯UÓë¶¥µã×Ó¼¯V-UµÄ±ßµÄÐÅÏ¢ + for(p=G.vertices[k].firstarc; p!=NULL; p = p->nextarc) { + j = p->adjvex; + + if(p->info->weightinfo->weight; + } + } + } + + return T; +} + +/* + * ´Ó¶¥µã×Ó¼¯V-UÖÐÑ¡³öÏÂÒ»¸öºòÑ¡¶¥µãÒÔ±ãºóÐø¼ÓÈëµ½×îСÉú³ÉÊ÷ + * + * Ñ¡Ôñ¶¥µã×Ó¼¯Uµ½¶¥µã×Ó¼¯V-UµÄȨֵ×îСµÄ±ß£¬ + * ²¢·µ»Ø¸Ã±ßÔÚ¶¥µã×Ó¼¯V-UÖÐÄÇÍ·µÄ¶Ëµã£¬ + * ¸Ã¶ËµãºóÐø»á¼ÓÈëµ½¶¥µã×Ó¼¯UÖУ¬³ÉΪ×îСÉú³ÉÊ÷µÄнáµã¡£ + */ +static int minimum(ALGraph G) { + int i, k = -1; + int min = INT_MAX; + + // ´ÓȨֵ²»Îª0µÄ±ßÖÐÑ¡ÔñÓµÓÐ×îСȨֵµÄ±ß + for(i = 0; i < G.vexnum; i++) { + if(closedge[i].lowcost != 0 && closedge[i].lowcost < min) { + min = closedge[i].lowcost; + k = i; + } + } + + return k; +} diff --git a/Dev-C++/ExerciseBook/07.32/MinimumSpanningTree.h b/Dev-C++/ExerciseBook/07.32/MinimumSpanningTree.h new file mode 100644 index 0000000..8cf83b5 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.32/MinimumSpanningTree.h @@ -0,0 +1,30 @@ +/*=================== + * ÎÞÏòÍøµÄ×îСÉú³ÉÉ­ÁÖ + ===================*/ + +#ifndef MINIMUMSPANNINGTREE_H +#define MINIMUMSPANNINGTREE_H + +#include +#include /* ÌṩINT_MAXºê */ +#include "MFSet.h" //**¡ø06 Ê÷ºÍ¶þ²æÊ÷**// +#include "ALGraph.h" //**¡ø07 ͼ**// +#include "CSTree.h" //**¡ø06 Ê÷ºÍ¶þ²æÊ÷**// + +/* + * ʹÓÃÆÕÀïÄ·Ëã·¨¹¹ÔìÎÞÏòÍøGµÄ×îСÉú³ÉÉ­ÁÖ + */ +CSTree MinSpanTree_PRIM(ALGraph G); + +/* + * ´Ó¶¥µã×Ó¼¯V-UÖÐÑ¡³öÏÂÒ»¸öºòÑ¡¶¥µãÒÔ±ãºóÐø¼ÓÈëµ½×îСÉú³ÉÊ÷ + * + * Ñ¡Ôñ¶¥µã×Ó¼¯Uµ½¶¥µã×Ó¼¯V-UµÄȨֵ×îСµÄ±ß£¬ + * ²¢·µ»Ø¸Ã±ßÔÚ¶¥µã×Ó¼¯V-UÖÐÄÇÍ·µÄ¶Ëµã£¬ + * ¸Ã¶ËµãºóÐø»á¼ÓÈëµ½¶¥µã×Ó¼¯UÖУ¬³ÉΪ×îСÉú³ÉÊ÷µÄнáµã¡£ + * + * ×¢£ºÐβÎÓë½Ì²ÄÖиø³öµÄÄ£°åÓÐËù²»Í¬ + */ +static int minimum(ALGraph G); + +#endif diff --git a/Dev-C++/ExerciseBook/07.32/TestData_UDN.txt b/Dev-C++/ExerciseBook/07.32/TestData_UDN.txt new file mode 100644 index 0000000..27a36b9 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.32/TestData_UDN.txt @@ -0,0 +1,6 @@ +ͼÀàÐÍ¡ú3£¨ÎÞÏòÍø£© +¶¥µãÊý¡ú13 +±ßÊý¡ú13 +±ßÊÇ·ñ´øÓÐÆäËûÐÅÏ¢¡ú1 +¶¥µã¼¯¡ú¡¾A£¬B£¬C£¬D£¬E£¬F£¬G£¬H£¬I£¬J£¬K£¬M£¬N¡¿ +±ßµÄ¼¯ºÏ¡ú¡¾A£¬D£¬5¡¿¡¾A£¬B£¬1¡¿¡¾A£¬C£¬3¡¿¡¾A£¬N£¬7¡¿¡¾E£¬F£¬10¡¿¡¾G£¬I£¬1¡¿¡¾I£¬H£¬5¡¿¡¾G£¬J£¬2¡¿¡¾G£¬H£¬7¡¿¡¾D£¬K£¬4¡¿¡¾K£¬M£¬5¡¿¡¾K£¬N£¬2¡¿¡¾D£¬M£¬12¡¿ \ No newline at end of file diff --git a/Dev-C++/ExerciseBook/07.33/07.33.cpp b/Dev-C++/ExerciseBook/07.33/07.33.cpp new file mode 100644 index 0000000..062b5f1 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.33/07.33.cpp @@ -0,0 +1,38 @@ +#include +#include "CSTree.h" +#include "MinimumSpanningTree.h" +#include "Graph.h" + +/* + * ÇóÎÞÏòÍøµÄ×îСÉú³ÉÊ÷ + */ +void Algo_7_33(Graph G); + + +int main(int argc, char* argv[]) { + Graph G; + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ´´½¨²¢´òÓ¡ÎÞÏòÍø... \n"); + { + CreateGraph(&G, "TestData_UDN.txt"); + PrintGraph(G); + printf("\n"); + } + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ʹÓÿ˳˹¿¨¶ûËã·¨»ñÈ¡×îСÉú³ÉÊ÷... \n"); + { + Algo_7_33(G); + printf("\n"); + } +} + + +/* + * ÇóÎÞÏòÍøµÄ×îСÉú³ÉÊ÷ + */ +void Algo_7_33(Graph G) { + CSTree T = MinSpanTree_KRUSKAL(G); + + // Êä³öÇóÈ¡µÄ×îСÉú³ÉÊ÷£¬´Ë²½Öè¿ÉÑ¡ + PrintTree(T); +} diff --git a/Dev-C++/ExerciseBook/07.33/07.33.dev b/Dev-C++/ExerciseBook/07.33/07.33.dev new file mode 100644 index 0000000..18b2f32 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.33/07.33.dev @@ -0,0 +1,171 @@ +[Project] +FileName=07.33.dev +Name=07.33 +Type=1 +Ver=2 +ObjFiles= +Includes= +Libs= +PrivateResource= +ResourceIncludes= +MakeIncludes= +Compiler= +CppCompiler= +Linker= +IsCpp=0 +Icon= +ExeOutput= +ObjectOutput= +LogOutput= +LogOutputEnabled=0 +OverrideOutput=0 +OverrideOutputName= +HostApplication= +UseCustomMakefile=0 +CustomMakefile= +CommandLine= +Folders= +IncludeVersionInfo=0 +SupportXPThemes=0 +CompilerSet=1 +CompilerSettings=0000000000000000001000000 +UnitCount=12 + +[VersionInfo] +Major=1 +Minor=0 +Release=0 +Build=0 +LanguageID=1033 +CharsetID=1252 +CompanyName= +FileVersion= +FileDescription=Developed using the Dev-C++ IDE +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion= +AutoIncBuildNr=0 +SyncProduct=1 + +[Unit1] +FileName=07.33.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit2] +FileName=CSTree.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit3] +FileName=CSTree.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit4] +FileName=Graph.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit5] +FileName=Graph.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit6] +FileName=MFSet.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit7] +FileName=MFSet.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit8] +FileName=MinimumSpanningTree.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit9] +FileName=MinimumSpanningTree.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit10] +FileName=SqQueue.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit11] +FileName=SqQueue.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit12] +FileName=TestData_UDN.txt +Folder= +Compile=0 +Link=0 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + diff --git a/Dev-C++/ExerciseBook/07.33/07.33.png b/Dev-C++/ExerciseBook/07.33/07.33.png new file mode 100644 index 0000000000000000000000000000000000000000..3c3b99a87eb5c3309a9d02b2686718cb859c314d GIT binary patch literal 34695 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 F{vRPR)V%-z literal 0 HcmV?d00001 diff --git a/Dev-C++/ExerciseBook/07.33/CSTree.cpp b/Dev-C++/ExerciseBook/07.33/CSTree.cpp new file mode 100644 index 0000000..3a1f268 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.33/CSTree.cpp @@ -0,0 +1,76 @@ +/*=================================== + * Ê÷µÄ¶þ²æÁ´±í£¨º¢×Ó-Ðֵܣ©½á¹¹´æ´¢±íʾ + ====================================*/ + +#include "CSTree.h" + +int count = 0; + +/* + * ³õʼ»¯ + * + * ¹¹Ôì¿ÕÊ÷¡£ + */ +Status InitTree(CSTree* T) { + if(T == NULL) { + return ERROR; + } + + *T = NULL; + + return OK; +} + +/* + * ÅÐ¿Õ + * + * ÅжÏÊ÷ÊÇ·ñΪ¿ÕÊ÷¡£ + */ +Status TreeEmpty(CSTree T) { + return T == NULL ? TRUE : FALSE; +} + + +/*©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥ ͼÐλ¯Êä³ö ©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥*/ + +// ÒÔͼÐλ¯ÐÎʽÊä³öµ±Ç°½á¹¹ +void PrintTree(CSTree T) { + + // Óöµ½¿ÕÊ÷ÔòÎÞÐè¼ÌÐø¼ÆËã + if(TreeEmpty(T)) { + printf("\n"); + return; + } + + Print(T, 0); + + printf("\n"); +} + +// ͼÐλ¯Êä³öµ±Ç°½á¹¹ÄÚ²¿ÊµÏÖ +static void Print(CSTree T, int row) { + int k; + + if(T == NULL) { + return; + } + + if(row==0) { + printf("\nµÚ %d ¿ÃÊ÷...\n", ++count); + } + + // ·ÃÎʵ±Ç°½áµã + printf("%c ", T->data); + + Print(T->firstchild, row + 1); + + if(T->nextsibling != NULL) { + printf("\n"); + + for(k = 0; k < row; k++) { + printf(". "); + } + + Print(T->nextsibling, row); + } +} diff --git a/Dev-C++/ExerciseBook/07.33/CSTree.h b/Dev-C++/ExerciseBook/07.33/CSTree.h new file mode 100644 index 0000000..6f30d18 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.33/CSTree.h @@ -0,0 +1,53 @@ +/*=================================== + * Ê÷µÄ¶þ²æÁ´±í£¨º¢×Ó-Ðֵܣ©½á¹¹´æ´¢±íʾ + ====================================*/ + +#ifndef CSTREE_H +#define CSTREE_H + +#include +#include // Ìṩ malloc¡¢free Ô­ÐÍ +#include // Ìṩ memset¡¢strcmp Ô­ÐÍ +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// + +/* µ¥¸ö½áµã×î´óµÄº¢×ÓÊýÁ¿ */ +#define MAX_CHILD_COUNT 8 + +/* Ê÷µÄÔªËØÀàÐͶ¨Ò壬ÕâÀï¼ÙÉèÆäÔªËØÀàÐÍΪchar */ +typedef char TElemType; + +/* (º¢×Ó-ÐÖµÜ)Ê÷µÄ½áµã¶¨Òå */ +typedef struct CSNode { + TElemType data; + struct CSNode* firstchild; // Ö¸Ïò³¤×Ó + struct CSNode* nextsibling; // Ö¸ÏòÓÒÐÖµÜ +} CSNode; + +/* (º¢×Ó-ÐÖµÜ)Ê÷ÀàÐͶ¨Òå */ +typedef CSNode* CSTree; + + +/* + * ³õʼ»¯ + * + * ¹¹Ôì¿ÕÊ÷¡£ + */ +Status InitTree(CSTree* T); + +/* + * ÅÐ¿Õ + * + * ÅжÏÊ÷ÊÇ·ñΪ¿ÕÊ÷¡£ + */ +Status TreeEmpty(CSTree T); + + +/*©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥ ͼÐλ¯Êä³ö ©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥*/ + +// ÒÔͼÐλ¯ÐÎʽÊä³öµ±Ç°½á¹¹ +void PrintTree(CSTree T); + +// ͼÐλ¯Êä³öµ±Ç°½á¹¹ÄÚ²¿ÊµÏÖ +static void Print(CSTree T, int row); + +#endif diff --git a/Dev-C++/ExerciseBook/07.33/Graph.cpp b/Dev-C++/ExerciseBook/07.33/Graph.cpp new file mode 100644 index 0000000..131d209 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.33/Graph.cpp @@ -0,0 +1,244 @@ +/*================================= + * ÓÉÌâ7.33µÄÃèÊö´´½¨µÄÒ»ÖÖÎÞÏòÍø½á¹¹ + ==================================*/ + +#include "Graph.h" + +// ¼ÈëÊý¾ÝµÄÔ´Îļþ£»fpΪnullʱ£¬ËµÃ÷ÐèÒª´Ó¿ØÖÆÌ¨Â¼Èë +static FILE* fp = NULL; + + +/* + * ´´½¨ÎÞÏòÍø + * + * pathΪNULL»òΪ""ʱ£¬´Ó¿ØÖÆÌ¨¶ÁȡͼµÄ³õʼ»¯ÐÅÏ¢¡£ + * ·ñÔò£¬´ÓÔ¤ÉèµÄÎļþÖжÁȡͼµÄ³õʼ»¯ÐÅÏ¢¡£ + */ +Status CreateGraph(Graph* G, char* path) { + int readFromConsole; // ÊÇ·ñ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý + + // Èç¹ûûÓÐÎļþ·¾¶ÐÅÏ¢£¬Ôò´Ó¿ØÖÆÌ¨¶ÁÈ¡ÊäÈë + readFromConsole = path == NULL || strcmp(path, "") == 0; + + // ÐèÒª´ÓÎļþ¶ÁÈ¡ + if(!readFromConsole) { + // ´ò¿ªÎļþ£¬×¼±¸¶ÁÈ¡²âÊÔÊý¾Ý + fp = fopen(path, "r"); + if(fp == NULL) { + return ERROR; + } + } + + Create(G); + + if(fp != NULL) { + fclose(fp); + fp = NULL; + } + + return OK; +} + +/* + * ´´½¨ÎÞÏòÍøµÄºËÐÄËã·¨ + */ +static void Create(Graph* G) { + int u, v, k; + VertexType v1, v2; + int weight; + + // ´Ó¿ØÖÆÌ¨¶ÁÈ¡ + if(fp == NULL) { + printf("ÇëÊäÈëÎÞÏòÍøµÄ¶¥µãÊý£º"); + scanf("%d", &((*G).vexnum)); + printf("ÇëÊäÈëÎÞÏòÍøµÄ±ßÊý£º"); + scanf("%d", &((*G).arcnum)); + + // ¼Èë¶¥µã¼¯ + printf("Çë¼Èë %d ¸ö¶¥µã£¬²»Í¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º", (*G).vexnum); + for(k = 0; k < (*G).vexnum; k++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(stdin); + scanf("%c", &((*G).vexs[k])); + } + + // ´ÓÎļþ¶ÁÈ¡ + } else { + ReadData(fp, "%d", &((*G).vexnum)); // ¼Èë¶¥µãÊý + ReadData(fp, "%d", &((*G).arcnum)); // ¼Èë±ßÊý + + // ¼Èë¶¥µã¼¯ + for(k = 0; k < (*G).vexnum; k++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(fp); + ReadData(fp, "%c", &((*G).vexs[k])); + } + } + + // ½öÔÚ¿ØÖÆÌ¨Â¼ÈëÐÅϢʱÊä³ö´ËÌáʾ + if(fp == NULL && (*G).arcnum != 0) { + printf("ÇëΪÎÞÏòÍøÒÀ´Î¼Èë %d Ìõ±ßµÄÐÅÏ¢£¬¶¥µãÓëȨֵ֮¼äÓÿոñ¸ô¿ª£º\n", (*G).arcnum); + } + + // ¹¹Ôì±ß¼¯½á¹¹£¬0ºÅµ¥Ôª´æ´¢±ßµÄÊýÁ¿ + (*G).EdgeSet = (EdgeSetType*) malloc(((*G).arcnum + 1) * sizeof(EdgeSetType)); + if((*G).EdgeSet == NULL) { + exit(ERROR); + } + + // EdgeSetµÄ0ºÅµ¥Ôª´æ´¢ÁËÎÞÏòÍøÖбߵÄÊýÁ¿ + (*G).EdgeSet[0].weight = (*G).arcnum; + + // ¼Èë±ßµÄÐÅÏ¢ + for(k = 0; k < (*G).arcnum; k++) { + if(fp == NULL) { + printf("µÚ %2d Ìõ±ßÓëȨֵ£º", k + 1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v2); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%d", &weight); + } else { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + skipBlank(fp); + ReadData(fp, "%c%c%d", &v1, &v2, &weight); + } + + u = LocateVex(*G, v1); // »ñÈ¡¶¥µãv1ÔÚ¶¥µã¼¯ÖеÄλÖà + v = LocateVex(*G, v2); // »ñÈ¡¶¥µãv2ÔÚ¶¥µã¼¯ÖеÄλÖà + + (*G).EdgeSet[k + 1].u = u; + (*G).EdgeSet[k + 1].v = v; + (*G).EdgeSet[k + 1].weight = weight; + } +} + +/* + * ²éÕÒ + * + * ·µ»Ø¶¥µãuÔÚÎÞÏòÍøÖеÄλÖà + */ +int LocateVex(Graph G, VertexType u) { + int i; + + for(i = 0; i < G.vexnum; i++) { + if(G.vexs[i] == u) { + return i; + } + } + + return -1; +} + +/* + * ´Ó±ß¼¯EdgeSetÖлñÈ¡×îС±ßµÄ¶¥µãuºÍv£¬²¢·µ»ØTRUE¡£ + * Èô±ß¼¯Îª¿Õ£¬Ôò·µ»ØFASLE¡£ + */ +Boolean GetMinEdge(EdgeSetType* EdgeSet, int* u, int* v) { + int i, j, k; + int min = INT_MAX; // ¼Ç¼ȨֵµÄ×î´óÖµ + + // ±ß¼¯Îª¿Õ + if(EdgeSet[0].weight == 0) { + return FALSE; + } + + // ²éÕÒȨֵ×îСµÄ±ß + for(k = 1; k <= EdgeSet[0].weight; k++) { + if(EdgeSet[k].weight < min) { + min = EdgeSet[k].weight; + i = EdgeSet[k].u; + j = EdgeSet[k].v; + } + } + + // ¼Ç¼¶¥µãÐÅÏ¢ + *u = i; + *v = j; + + return TRUE; +} + +/* + * ´Ó±ß¼¯ÖÐɾ³ýÒÀ¸½ÓÚ¶¥µãuºÍvµÄ×îС±ß¡£ + * ɾ³ý³É¹¦·µ»ØTRUE£¬·ñÔò£¬·µ»ØFALSE¡£ + */ +Boolean DelMinEdge(EdgeSetType* EdgeSet, int u, int v) { + int k; + Boolean found = FALSE; // ÊÇ·ñÕÒµ½Á豧 + + // ±ß¼¯Îª¿Õ + if(EdgeSet[0].weight == 0) { + return FALSE; + } + + // ÏȲéÕÒ¸ÃÌõ±ßÔڱ߼¯ÖеÄλÖà + for(k = 1; k <= EdgeSet[0].weight; k++) { + if((EdgeSet[k].u == u && EdgeSet[k].v == v) || (EdgeSet[k].u == v && EdgeSet[k].v == u)) { + found = TRUE; + break; + } + } + + if(found == FALSE) { + return FALSE; + } + + // ÕâÀï²ÉÓõÄɾ³ý·½Ê½ÊÇÖ±½ÓÓÃ×îºóÒ»Ìõ±ßµÄÐÅÏ¢¸²¸Ç´ýɾ³ý±ßµÄÐÅÏ¢ + EdgeSet[k] = EdgeSet[EdgeSet[0].weight]; + EdgeSet[0].weight--; + + return TRUE; +} + +/* + * ´òÓ¡ÎÞÏòÍø½á¹¹ + */ +void PrintGraph(Graph G) { + int i, j, k, w; + int adjs[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; + + if(G.vexnum == 0) { + printf("¿Õͼ£¬ÎÞÐè´òÓ¡£¡\n"); + return; + } + + // ³õʼ»¯±ßµÄÐÅÏ¢ + for(i = 0; i < G.vexnum; i++) { + for(j = 0; j < G.vexnum; j++) { + adjs[i][j] = INFINITE; + } + } + + // ¹¹Ôì±ß¼¯¾ØÕó + for(k = 1; k <= G.EdgeSet[0].weight; k++) { + i = G.EdgeSet[k].u; + j = G.EdgeSet[k].v; + w = G.EdgeSet[k].weight; + + adjs[i][j] = adjs[j][i] = w; + } + + printf("µ±Ç°ÎÞÏòÍø°üº¬ %2d ¸ö¶¥µã£¬ %2d Ìõ±ß...\n", G.vexnum, G.arcnum); + + printf(" "); + for(i = 0; i < G.vexnum; i++) { + printf(" %c", G.vexs[i]); + } + printf("\n"); + + for(i = 0; i < G.vexnum; i++) { + printf("%c ", G.vexs[i]); + + for(j = 0; j < G.vexnum; j++) { + if(adjs[i][j] == INFINITE) { + printf(" -"); + } else { + printf("%3d", adjs[i][j]); + } + } + + printf("\n"); + } +} diff --git a/Dev-C++/ExerciseBook/07.33/Graph.h b/Dev-C++/ExerciseBook/07.33/Graph.h new file mode 100644 index 0000000..859b43c --- /dev/null +++ b/Dev-C++/ExerciseBook/07.33/Graph.h @@ -0,0 +1,71 @@ +/*================================= + * ÓÉÌâ7.33µÄÃèÊö´´½¨µÄÒ»ÖÖÎÞÏòÍø½á¹¹ + ==================================*/ + +#ifndef GRAPH_H +#define GRAPH_H + +#include +#include // ÌṩºêINT_MAX +#include // Ìṩ malloc¡¢free Ô­ÐÍ +#include // Ìṩ memset¡¢strcmp Ô­ÐÍ +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// + +#define INFINITE INT_MAX // ×î´óÖµ£¬ÓÃÀ´±íÊ¾ÍøÖеÄÁ½¸ö¶¥µã²»Ö±½ÓÁ¬½Ó +#define MAX_VERTEX_NUM 26 // ¶¥µã¸öÊý×î´óÖµ + +// ¶¥µãÀàÐÍ +typedef char VertexType; + +// ±ß¼¯ÀàÐÍ +typedef struct { + int u, v; // ¶¥µã + int weight; // Ȩֵ +} EdgeSetType; + +// ÓÐÏòͼÀàÐͶ¨Òå +typedef struct Graph { + VertexType vexs[MAX_VERTEX_NUM]; // ¶¥µãÏòÁ¿ + EdgeSetType* EdgeSet; // ±ß¼¯ + int vexnum, arcnum; // ÓÐÏòͼµÄ¶¥µãÊýºÍ»¡Êý +} Graph; + + +/* + * ´´½¨ÓÐÏòͼ + * + * pathΪNULL»òΪ""ʱ£¬´Ó¿ØÖÆÌ¨¶ÁȡͼµÄ³õʼ»¯ÐÅÏ¢¡£ + * ·ñÔò£¬´ÓÔ¤ÉèµÄÎļþÖжÁȡͼµÄ³õʼ»¯ÐÅÏ¢¡£ + */ +Status CreateGraph(Graph* G, char* path); + +/* + * ´´½¨ÓÐÏòͼµÄºËÐÄËã·¨ + */ +static void Create(Graph* G); + +/* + * ²éÕÒ + * + * ·µ»Ø¶¥µãuÔÚÓÐÏòͼÖеÄλÖà + */ +int LocateVex(Graph G, VertexType u); + +/* + * ´Ó±ß¼¯EdgeSetÖлñÈ¡×îС±ßµÄ¶¥µãuºÍv£¬²¢·µ»ØTRUE¡£ + * Èô±ß¼¯Îª¿Õ£¬Ôò·µ»ØFASLE¡£ + */ +Boolean GetMinEdge(EdgeSetType* EdgeSet, int* u, int* v); + +/* + * ´Ó±ß¼¯ÖÐɾ³ýÒÀ¸½ÓÚ¶¥µãuºÍvµÄ×îС±ß¡£ + * ɾ³ý³É¹¦·µ»ØTRUE£¬·ñÔò£¬·µ»ØFALSE¡£ + */ +Boolean DelMinEdge(EdgeSetType* EdgeSet, int u, int v); + +/* + * ´òÓ¡ÓÐÏòͼ½á¹¹ + */ +void PrintGraph(Graph G); + +#endif diff --git a/Dev-C++/ExerciseBook/07.33/MFSet.cpp b/Dev-C++/ExerciseBook/07.33/MFSet.cpp new file mode 100644 index 0000000..8b9d29d --- /dev/null +++ b/Dev-C++/ExerciseBook/07.33/MFSet.cpp @@ -0,0 +1,93 @@ +/*===== + * ¼¯ºÏ + ======*/ + +#include "MFSet.h" + +/* + * ³õʼ»¯Ò»¸öÓɶà¸ö×Ó¼¯£¨Ã¿¸ö×Ó¼¯Ö»°üº¬µ¥¸ö³ÉÔ±£©¹¹³ÉµÄ¼¯ºÏS¡£ + * + * + *¡¾±¸×¢¡¿ + * + * ÕâÀï¶ÔµÚ6ÕµÄMFSet×öÁ˸͝£º + * 1.Ö±½ÓÔÚ²ÎÊýÖд«Èë×Ó¼¯ÊýÁ¿ + * 2.×Ó¼¯±àºÅ´Ó0¿ªÊ¼¼ÆÊý£¬Õâ»áÓ°Ïìµ½ºóÃæµÄº¯ÊýÖйØÓÚϱêµÄÅÐ¶Ï + */ +Status initial_mfset(MFSet* S, int n) { + int i; + + if(n <= 0) { + return ERROR; + } + + S->n = n; + S->r = 0; // µÚÒ»¸ö×Ó¼¯µÄλÖÃÔÚ0ºÅµ¥Ôª + + // ×Ó¼¯±àºÅ´Ó0¿ªÊ¼¼ÆÊý + for(i = 0; i < n; i++) { + S->nodes[i].parent = -1; + } + + return OK; +} + +/* + * ÇóÁ½¸ö»¥²»ÏཻµÄ×Ó¼¯SiºÍ×Ó¼¯SjµÄ²¢¼¯¡£ + */ +Status merge_mfset(MFSet* S, int i, int j) { + + // Ë÷ÒýÔ½½ç + if(i < 0 || i > S->n - 1 || j < 0 || j > S->n - 1) { + return ERROR; + } + + // ÏàͬµÄ×Ó¼¯ÎÞÐèºÏ²¢£¬Ö±½Ó·µ»Ø + if(i == j) { + return OK; + } + + S->nodes[i].parent = j; + + return OK; +} + +/* + * ÔÚ¼¯ºÏSÖвéÕÒÔªËØiµ±Ç°ËùÊôµÄ×Ó¼¯¡£ + */ +int find_mfset(MFSet S, int i) { + int j; + + // Ë÷ÒýÔ½½ç + if(i < 0 || i > S.n - 1) { + return -1; + } + + // ²éÕÒiËùÊôµÄ×Ó¼¯µÄ¸ù½áµã + for(j = i; S.nodes[j].parent >= 0; j = S.nodes[j].parent) { + // ´ÓÏÂÍùÉϲéÕÒ + } + + return j; +} + +/* + * ¸ù¾ÝµÈ¼Û¹ØÏµRÀ´ÕûÀí/½¨Á¢¼¯ºÏSÖеÄÔªËØ(×Ó¼¯)¡£ + */ +Status build_mfset(MFSet* S, Relation R) { + int k; + int i, j; + + for(k = 0; k < R.n; k++) { + // ÏÈ»ñÈ¡×Ó¼¯¸ù½áµã + i = find_mfset(*S, R.pairs[k].i); + j = find_mfset(*S, R.pairs[k].j); + + // ¶ÔÁ½¸ö»¥²»ÏཻµÄ×Ó¼¯½øÐй鲢 + if(!merge_mfset(S, i, j)) { + return ERROR; + } + } + + return OK; +} diff --git a/Dev-C++/ExerciseBook/07.33/MFSet.h b/Dev-C++/ExerciseBook/07.33/MFSet.h new file mode 100644 index 0000000..2a061a5 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.33/MFSet.h @@ -0,0 +1,92 @@ +/*===== + * ¼¯ºÏ + ======*/ + +#ifndef MFSET_H +#define MFSET_H + +#include +#include // Ìṩ malloc¡¢free Ô­ÐÍ +#include // Ìṩ memset¡¢strcmp Ô­ÐÍ +#include // +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// + +/* Ê÷µÄ×î´ó½áµãÊý£¬ÕâÀïָʾ×Ó¼¯×î´óÊýÁ¿ */ +#define MAX_TREE_SIZE 1024 + +/* ¶þÔª¹ØÏµ¶ÔÊýÁ¿ */ +#define MAX_PAIR_SIZE 100 + +/* + * (Ë«Ç×)Ê÷µÄ½áµã¶¨Òå + * + *¡¾×¢¡¿ + * 1.ÒÀÕս̲ĵÄͼʾ£¬Ë«Ç×Ê÷ÔÚ¼¯ºÏµÄÓ¦ÓÃÖУ¬ÆäÄ£ÐÍÒѱ»¼ò»¯£º¼´Ë«Ç×½áµã²»ÔÙ±£ÁôÊý¾ÝÓò¡£ + * 2.½áµãµÄË÷ÒýÓÃÀ´±íʾËüÊÇÄÄÒ»¸ö×Ó¼¯£¬Ëü»á×÷Ϊ¸ü´ó×Ó¼¯µÄÒ»¸öÔªËØ´æÔÚ¡£ + * 3.È·¶¨Ä³¸ö×Ó¼¯ÊôÓÚSÖÐÄĸö¸ü´óµÄ×Ó¼¯Ê±£¬ÐèÒªÏòÉÏ×·Ëݵ½¸ü´ó×Ó¼¯µÄ¸ù¡£ + * 4.ʵ¼ÊʹÓÃÖУ¬Ã¿¸ö×Ó¼¯»á°üº¬ºÜ¶àÊý¾ÝÔªËØ£¬´Ëʱ¿ÉÒÔ½«Ã¿¸öÊý¾ÝÔªËØÓëÆäËùÊôµÄ×Ó¼¯½¨Á¢¹ØÁª¹ØÏµ + * ¼´°Ñÿ¸öÊý¾ÝÔªËØÓ뼯ºÏSÖи÷½áµãµÄË÷Òý¹ØÁªÆðÀ´ + */ +typedef struct PTNode { + int parent; // Ë«Ç×λÖÃÓò£¬ÓÃÀ´Ö¸Ê¾¸Ã½áµãËùÊôµÄ×Ó¼¯ +} PTNode; + +/* + * (Ë«Ç×)Ê÷ÀàÐͶ¨Òå + * + *¡¾×¢¡¿ + * 1.Ê÷ÖнáµãÔÚnodesÖÐ"½ôÁÚ"´æ´¢£¬Ã»ÓпÕ϶ + * 2.µ±×Ó¼¯´æÔÚʱ£¬Ê÷¸ùrÉèÖÃΪ1£¬·ñÔò£¬Ê÷¸ùrÉèÖÃΪ0 + * 3.³ý¸ù½áµãÍ⣬ÆäËû½áµãÒÀ´Î°´²ãÐò˳ןù½áµãÍùÏÂÅÅÁÐ + * 5.ÕâÀï¼ÙÉènodes¿Õ¼äÊÇ×ã¹»´óµÄ£¬¿ÉÒÔÊÓÐèÇ󽫯ä¸ÄΪ¶¯Ì¬·ÖÅä´æ´¢ + */ +typedef struct { + PTNode nodes[MAX_TREE_SIZE]; // ´æ´¢Ê÷Öнáµã + int r; // Ê÷¸ùλÖÃ(Ë÷Òý)£¬ÕâÀïÓÃÀ´Ö¸Ê¾µÚÒ»¸ö×Ó¼¯µÄλÖà + int n; // Ê÷µÄ½áµãÊý£¬ÕâÀïÓÃÀ´Ö¸Ê¾ËùÓÐ +} PTree; + +/* ¼¯ºÏÀàÐͶ¨Òå */ +typedef PTree MFSet; + +/* µ¥¸ö¶þÔª¹ØÏµ¶Ô */ +typedef struct { + int i; + int j; +} Pair; + +/* ¼¯ºÏÄڵĵȼ۹ØÏµ */ +typedef struct { + Pair pairs[MAX_PAIR_SIZE]; // ×ã¹»´óµÄ¿Õ¼ä´æ´¢¶þÔª¹ØÏµ + int n; // ÒÑÖªµÄµÈ¼Û¹ØÏµÊýÁ¿ +} Relation; + + +/* + * ³õʼ»¯Ò»¸öÓɶà¸ö×Ó¼¯£¨Ã¿¸ö×Ó¼¯Ö»°üº¬µ¥¸ö³ÉÔ±£©¹¹³ÉµÄ¼¯ºÏS¡£ + * + * + *¡¾±¸×¢¡¿ + * + * ÕâÀï¶ÔµÚ6ÕµÄMFSet×öÁ˸͝£º + * 1.Ö±½ÓÔÚ²ÎÊýÖд«Èë×Ó¼¯ÊýÁ¿ + * 2.×Ó¼¯±àºÅ´Ó0¿ªÊ¼¼ÆÊý£¬Õâ»áÓ°Ïìµ½ºóÃæµÄº¯ÊýÖйØÓÚϱêµÄÅÐ¶Ï + */ +Status initial_mfset(MFSet* S, int n); + +/* + * ÇóÁ½¸ö»¥²»ÏཻµÄ×Ó¼¯SiºÍ×Ó¼¯SjµÄ²¢¼¯¡£ + */ +Status merge_mfset(MFSet* S, int i, int j); + +/* + * ÔÚ¼¯ºÏSÖвéÕÒÔªËØiµ±Ç°ËùÊôµÄ×Ó¼¯¡£ + */ +int find_mfset(MFSet S, int i); + +/* + * ¸ù¾ÝµÈ¼Û¹ØÏµRÀ´ÕûÀí/½¨Á¢¼¯ºÏSÖеÄÔªËØ(×Ó¼¯)¡£ + */ +Status build_mfset(MFSet* S, Relation R); + +#endif diff --git a/Dev-C++/ExerciseBook/07.33/MinimumSpanningTree.cpp b/Dev-C++/ExerciseBook/07.33/MinimumSpanningTree.cpp new file mode 100644 index 0000000..6bdae68 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.33/MinimumSpanningTree.cpp @@ -0,0 +1,142 @@ +/*================== + * ÎÞÏòÍøµÄ×îСÉú³ÉÊ÷ + * + * °üº¬Ëã·¨: 7.9 + ==================*/ + +#include "MinimumSpanningTree.h" + +/* + * ʹÓÿ˳˹¿¨¶ûËã·¨ÇóÈ¡×îСÉú³ÉÊ÷ + */ +CSTree MinSpanTree_KRUSKAL(Graph G) { + int k; + int v1, v2; + int s1, s2; + + CSTree T = NULL; + CSTree parent[MAX_VERTEX_NUM] = {NULL}; // ×·×Ù¸÷¶¥µãÔÚÊ÷ÖеÄλÖÃ(ÓÃÖ¸ÕëÖ¸Ïò¸Ã¶¥µã) + SqQueue queue; + int root; + + // ¼Ç¼ÒѾ­¼ÓÈëµ½×îСÉú³ÉÊ÷µÄ¶¥µã¼¯£¬ÕâÀïʹÓü¯ºÏµÄÄ¿µÄÊÇ¿ìËÙÅжϺòÑ¡¶¥µãÊÇ·ñ»áÔì³É»·Â· + MFSet S; + Relation relation; + + // ´æ´¢ÓÐÏòÍø±ß¼¯µÄÒ»¸ö¸±±¾ + EdgeSetType* EdgeSet; + + // ´æ´¢×îСÉú³ÉÊ÷Öаüº¬µÄ±ß¼¯ + EdgeSetType* tree; + EdgeSetType edge; + + // ¸´ÖÆÓÐÏòÍøµÄ±ß¼¯ + EdgeSet = (EdgeSetType*) malloc((G.EdgeSet[0].weight * sizeof(EdgeSetType))); + for(k = 0; k <= G.EdgeSet[0].weight; k++) { + EdgeSet[k] = G.EdgeSet[k]; // ½á¹¹Ìå¿ÉÒÔÖ±½Ó¸´ÖÆ + } + + // ×îСÉú³ÉÊ÷Öаüº¬µÄ±ßµÄÊýÁ¿Îª¶¥µãÊý-1£¬µ«ÕâÀï¶à·ÖÅäÁËÒ»¸öµ¥Ôª£¬ÒòΪ0ºÅµ¥ÔªÒª´æ´¢±ßµÄÊýÁ¿ + tree = (EdgeSetType*) malloc(G.vexnum * sizeof(EdgeSetType)); + tree[0].weight = 0; + + // ³õʼ»¯¶¥µã¼¯ºÏ + initial_mfset(&S, G.vexnum); + + // ´Ó±ß¼¯ÖÐÒÀ´ÎÑ¡ÔñȨֵ×îС£¬ÇÒ²»¹¹³É»·Â·µÄ±ß¼ÓÈëµ½×îСÉú³ÉÊ÷ + for(k = 0; k < G.arcnum; k++) { + // Ñ¡³öÒ»ÌõȨֵ×îСµÄ±ß + GetMinEdge(EdgeSet, &v1, &v2); + // Ñ¡ÍêÖ®ºó¾Í¿ÉÒԴӱ߼¯µÄ¸±±¾ÖÐɾµôÕâÌõ±ßÁË£¬ÒòΪºóÐø²»ÔÙÐèÒªËü + DelMinEdge(EdgeSet, v1, v2); + + s1 = find_mfset(S, v1); + s2 = find_mfset(S, v2); + + // Èç¹ûÕâÁ½¸ö¶ËµãλÓÚͬһ¸ö¼¯ºÏ£¬ÔòÌø¹ý¸ÃÌõ±ß + if(s1 == s2) { + continue; + } + + // ¹¹Ôì¶þÔª¹ØÏµ + relation.n = 1; + relation.pairs[0].i = v1; + relation.pairs[0].j = v2; + + build_mfset(&S, relation); + + // ´òÓ¡¶¥µãºÍ±ßµÄÐÅÏ¢ + printf("%c %c\n", G.vexs[v1], G.vexs[v2]); + + // ´´½¨Ê÷½áµãv1 + if(parent[v1] == NULL) { + parent[v1] = (CSTree) malloc(sizeof(CSNode)); + parent[v1]->data = G.vexs[v1]; + parent[v1]->firstchild = parent[v1]->nextsibling = NULL; + } + + // ´´½¨Ê÷½áµãv2 + if(parent[v2] == NULL) { + parent[v2] = (CSTree) malloc(sizeof(CSNode)); + parent[v2]->data = G.vexs[v2]; + parent[v2]->firstchild = parent[v2]->nextsibling = NULL; + } + + // Ïò¼¯ºÏÖд洢¹¹³É×îСÉú³ÉÊ÷µÄ±ß + tree[0].weight++; + tree[tree[0].weight].u = v1; + tree[tree[0].weight].v = v2; + } + + + /* ½ÓÏÂÀ´Ê¹ÓÃÒÑÖªµÄ±ßÀ´¹¹ÔìÊ÷µÄº¢×Ó-ÐÖµÜÁ´±í´æ´¢½á¹¹ */ + + if(tree[0].weight<=0) { + return NULL; + } + + InitQueue(&queue); + + // È·¶¨Õû¿ÃÊ÷µÄ¸ù½áµã + T = parent[tree[1].u]; + + // ×·×Ùÿ¿Ã×ÓÊ÷µÄ¸ù½áµã + root = tree[1].u; + + while(tree[0].weight > 0) { + // ²éÕÒ°üº¬¶ËµãrootµÄ±ß + for(k = 1; k <= tree[0].weight; k++) { + if(tree[k].u == root || tree[k].v == root) { + break; + } + } + + // ÕÒµ½ÁËÕâÑùµÄ±ß + if(k <= tree[0].weight) { + edge = tree[k]; + + // ÒÆ³ýÕâÌõ±ß£¬´Ë´¦Ö»ÊÇÓÃ×îºóÒ»Ìõ±ßµÄÐÅÏ¢¼òµ¥µØ¸²¸ÇÕâÌõ±ßµÄÐÅÏ¢ + tree[k] = tree[tree[0].weight]; + tree[0].weight--; + + if(edge.u == root) { + // °Ñ½áµãvÌí¼ÓΪ½áµãuµÄÒ»¸öº¢×Ó½áµã£¬ÕâÀï¼òµ¥µØÊ¹ÓÃÍ·²å·¨ + parent[edge.v]->nextsibling = parent[edge.u]->firstchild; + parent[edge.u]->firstchild = parent[edge.v]; + + EnQueue(&queue, edge.v); + } else { + // °Ñ½áµãuÌí¼ÓΪ½áµãvµÄÒ»¸öº¢×Ó½áµã£¬ÕâÀï¼òµ¥µØÊ¹ÓÃÍ·²å·¨ + parent[edge.u]->nextsibling = parent[edge.v]->firstchild; + parent[edge.v]->firstchild = parent[edge.u]; + + EnQueue(&queue, edge.u); + } + } else { + // »ñȡеÄ×ÓÊ÷µÄroot + DeQueue(&queue, &root); + } + } + + return T; +} diff --git a/Dev-C++/ExerciseBook/07.33/MinimumSpanningTree.h b/Dev-C++/ExerciseBook/07.33/MinimumSpanningTree.h new file mode 100644 index 0000000..09cb58c --- /dev/null +++ b/Dev-C++/ExerciseBook/07.33/MinimumSpanningTree.h @@ -0,0 +1,22 @@ +/*================== + * ÎÞÏòÍøµÄ×îСÉú³ÉÊ÷ + * + * °üº¬Ëã·¨: 7.9 + ==================*/ + +#ifndef MINIMUMSPANNINGTREE_H +#define MINIMUMSPANNINGTREE_H + +#include +#include // ÌṩINT_MAXºê +#include "SqQueue.h" //**¡ø03 Õ»ºÍ¶ÓÁÐ**// +#include "MFSet.h" //**¡ø06 Ê÷ºÍ¶þ²æÊ÷**// +#include "CSTree.h" //**¡ø06 Ê÷ºÍ¶þ²æÊ÷**// +#include "Graph.h" + +/* + * ʹÓÿ˳˹¿¨¶ûËã·¨ÇóÈ¡×îСÉú³ÉÊ÷ + */ +CSTree MinSpanTree_KRUSKAL(Graph G); + +#endif diff --git a/Dev-C++/ExerciseBook/07.33/SqQueue.cpp b/Dev-C++/ExerciseBook/07.33/SqQueue.cpp new file mode 100644 index 0000000..1d385f5 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.33/SqQueue.cpp @@ -0,0 +1,147 @@ +/*============================= + * ¶ÓÁеÄ˳Ðò´æ´¢½á¹¹£¨Ë³Ðò¶ÓÁУ© + ==============================*/ + +#include "SqQueue.h" //**¡ø03 Õ»ºÍ¶ÓÁÐ**// + +/* + * ³õʼ»¯ + * + * ¹¹ÔìÒ»¸ö¿ÕµÄ˳Ðò¶ÓÁС£ + * ³õʼ»¯³É¹¦Ôò·µ»ØOK£¬·ñÔò·µ»ØERROR¡£ + * + *¡¾×¢¡¿ + * ÕâÀïµÄ¶ÓÁÐÊÇÑ­»·¶ÓÁÐ + */ +Status InitQueue(SqQueue* Q) { + if(Q == NULL) { + return ERROR; + } + + (*Q).base = (QElemType*) malloc(MAXQSIZE * sizeof(QElemType)); + if(!(*Q).base) { + exit(OVERFLOW); + } + + (*Q).front = (*Q).rear = 0; + + return OK; +} + +/* + * ÅÐ¿Õ + * + * ÅжÏÑ­»·Ë³Ðò¶ÓÁÐÖÐÊÇ·ñ°üº¬ÓÐЧÊý¾Ý¡£ + * + * ·µ»ØÖµ£º + * TRUE : Ñ­»·Ë³Ðò¶ÓÁÐΪ¿Õ + * FALSE: Ñ­»·Ë³Ðò¶ÓÁв»Îª¿Õ + */ +Status QueueEmpty(SqQueue Q) { + // ¶ÓÁпյıêÖ¾ + if(Q.front == Q.rear) { + return TRUE; + } else { + return FALSE; + } +} + +/* + * ¼ÆÊý + * + * ·µ»ØÑ­»·Ë³Ðò¶ÓÁаüº¬µÄÓÐÐ§ÔªËØµÄÊýÁ¿¡£ + */ +int QueueLength(SqQueue Q) { + if(Q.base == NULL) { + return 0; + } + + // ¶ÓÁг¤¶È + return (Q.rear - Q.front + MAXQSIZE) % MAXQSIZE; +} + +/* + * ȡֵ + * + * »ñÈ¡¶ÓÍ·ÔªËØ£¬½«Æä´æ´¢µ½eÖС£ + * Èç¹û¿ÉÒÔÕÒµ½£¬·µ»ØOK£¬·ñÔò£¬·µ»ØERROR¡£ + */ +Status GetHead(SqQueue Q, QElemType* e) { + // ¶ÓÁпյıêÖ¾ + if(Q.base == NULL || Q.front == Q.rear) { + return ERROR; + } + + *e = Q.base[Q.front]; + + return OK; +} + +/* + * Èë¶Ó + * + * ½«ÔªËØeÌí¼Óµ½¶ÓÁÐβ²¿¡£ + */ +Status EnQueue(SqQueue* Q, QElemType e) { + if(Q == NULL || (*Q).base == NULL) { + return ERROR; + } + + // ¶ÓÁÐÂúµÄ±êÖ¾£¨»áÀË·ÑÒ»¸ö¿Õ¼äÀ´Çø·Ö¶ÓÁпպͶÓÁÐÂú£© + if(((*Q).rear + 1) % MAXQSIZE == (*Q).front) { + return ERROR; + } + + // Èë¶Ó + (*Q).base[(*Q).rear] = e; + + // βָÕëǰ½ø + (*Q).rear = ((*Q).rear + 1) % MAXQSIZE; + + return OK; +} + +/* + * ³ö¶Ó + * + * ÒÆ³ý¶ÓÁÐÍ·²¿µÄÔªËØ£¬½«Æä´æ´¢µ½eÖС£ + */ +Status DeQueue(SqQueue* Q, QElemType* e) { + if(Q == NULL || (*Q).base == NULL) { + return ERROR; + } + + // ¶ÓÁпյıêÖ¾ + if((*Q).front == (*Q).rear) { + return ERROR; + } + + // ³ö¶Ó + *e = (*Q).base[(*Q).front]; + + // Í·Ö¸Õëǰ½ø + (*Q).front = ((*Q).front + 1) % MAXQSIZE; + + return OK; +} + +/* + * ±éÀú + * + * ÓÃvisitº¯Êý·ÃÎʶÓÁÐQ + */ +Status QueueTraverse(SqQueue Q, void(Visit)(QElemType)) { + int i; + + if(Q.base == NULL) { + return ERROR; + } + + for(i = Q.front; i != Q.rear; i = (i + 1) % MAXQSIZE) { + Visit(Q.base[i]); + } + + printf("\n"); + + return OK; +} diff --git a/Dev-C++/ExerciseBook/07.33/SqQueue.h b/Dev-C++/ExerciseBook/07.33/SqQueue.h new file mode 100644 index 0000000..f739aee --- /dev/null +++ b/Dev-C++/ExerciseBook/07.33/SqQueue.h @@ -0,0 +1,84 @@ +/*============================= + * ¶ÓÁеÄ˳Ðò´æ´¢½á¹¹£¨Ë³Ðò¶ÓÁУ© + ==============================*/ + +#ifndef SQQUEUE_H +#define SQQUEUE_H + +#include +#include // Ìṩmalloc¡¢realloc¡¢free¡¢exitÔ­ÐÍ +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// + +/* ºê¶¨Òå */ +#define MAXQSIZE 1000 //×î´ó¶ÓÁг¤¶È + +/* Ñ­»·¶ÓÁÐÔªËØÀàÐͶ¨Òå */ +typedef int QElemType; + +// Ñ­»·¶ÓÁеÄ˳Ðò´æ´¢½á¹¹ +typedef struct { + QElemType* base; // ¶¯Ì¬·ÖÅä´æ´¢¿Õ¼ä + int front; // Í·Ö¸Õ룬Èô¶ÓÁв»¿Õ£¬Ö¸Ïò¶ÓÍ·ÔªËØ + int rear; // βָÕ룬Èô¶ÓÁв»¿Õ£¬Ö¸Ïò¶ÓÁÐÎ²ÔªËØµÄÏÂÒ»¸öλÖà +} SqQueue; + + +/* + * ³õʼ»¯ + * + * ¹¹ÔìÒ»¸ö¿ÕµÄ˳Ðò¶ÓÁС£ + * ³õʼ»¯³É¹¦Ôò·µ»ØOK£¬·ñÔò·µ»ØERROR¡£ + * + *¡¾×¢¡¿ + * ÕâÀïµÄ¶ÓÁÐÊÇÑ­»·¶ÓÁÐ + */ +Status InitQueue(SqQueue* Q); + +/* + * ÅÐ¿Õ + * + * ÅжÏÑ­»·Ë³Ðò¶ÓÁÐÖÐÊÇ·ñ°üº¬ÓÐЧÊý¾Ý¡£ + * + * ·µ»ØÖµ£º + * TRUE : Ñ­»·Ë³Ðò¶ÓÁÐΪ¿Õ + * FALSE: Ñ­»·Ë³Ðò¶ÓÁв»Îª¿Õ + */ +Status QueueEmpty(SqQueue Q); + +/* + * ¼ÆÊý + * + * ·µ»ØÑ­»·Ë³Ðò¶ÓÁаüº¬µÄÓÐÐ§ÔªËØµÄÊýÁ¿¡£ + */ +int QueueLength(SqQueue Q); + +/* + * ȡֵ + * + * »ñÈ¡¶ÓÍ·ÔªËØ£¬½«Æä´æ´¢µ½eÖС£ + * Èç¹û¿ÉÒÔÕÒµ½£¬·µ»ØOK£¬·ñÔò£¬·µ»ØERROR¡£ + */ +Status GetHead(SqQueue Q, QElemType* e); + +/* + * Èë¶Ó + * + * ½«ÔªËØeÌí¼Óµ½¶ÓÁÐβ²¿¡£ + */ +Status EnQueue(SqQueue* Q, QElemType e); + +/* + * ³ö¶Ó + * + * ÒÆ³ý¶ÓÁÐÍ·²¿µÄÔªËØ£¬½«Æä´æ´¢µ½eÖС£ + */ +Status DeQueue(SqQueue* Q, QElemType* e); + +/* + * ±éÀú + * + * ÓÃvisitº¯Êý·ÃÎʶÓÁÐQ + */ +Status QueueTraverse(SqQueue Q, void(Visit)(QElemType)); + +#endif diff --git a/Dev-C++/ExerciseBook/07.33/TestData_UDN.txt b/Dev-C++/ExerciseBook/07.33/TestData_UDN.txt new file mode 100644 index 0000000..2f18fe7 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.33/TestData_UDN.txt @@ -0,0 +1,4 @@ +¶¥µãÊý¡ú6 +±ßÊý¡ú10 +¶¥µã¼¯¡ú¡¾A£¬B£¬C£¬D£¬E£¬F¡¿ +±ßµÄ¼¯ºÏ¡ú¡¾A£¬B£¬6¡¿¡¾A£¬C£¬1¡¿¡¾A£¬D£¬5¡¿¡¾B£¬C£¬5¡¿¡¾B£¬E£¬3¡¿¡¾C£¬D£¬5¡¿¡¾C£¬E£¬6¡¿¡¾C£¬F£¬4¡¿¡¾D£¬F£¬2¡¿¡¾E£¬F£¬6¡¿ \ No newline at end of file diff --git a/Dev-C++/ExerciseBook/07.34/07.34.cpp b/Dev-C++/ExerciseBook/07.34/07.34.cpp new file mode 100644 index 0000000..3047d0f --- /dev/null +++ b/Dev-C++/ExerciseBook/07.34/07.34.cpp @@ -0,0 +1,131 @@ +#include +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// +#include "ALGraph.h" //**¡ø07 ͼ**// +#include "TopologicalSorting.h" //**¡ø07 ͼ**// + +/* + * ¶ÔÓÐÏòÎÞ»·Í¼ÖеĶ¥µãÊʵ±µØ±àºÅ£¬Ê¹ÆäËùÓл¡vi->vjÂú×ãivjÂú×ãiadjvex]] = 1; + p = p->nextarc; + } + } + + + printf(" "); + for(i = 0; i < G.vexnum; i++) { + printf(" %c", G.vertices[topo[i]].data); + } + printf("\n"); + + for(i = 0; i < G.vexnum; i++) { + printf("%c ", G.vertices[topo[i]].data); + + for(j = 0; j < G.vexnum; j++) { + if(adjs[i][j] == 0) { + printf(" -"); + } else { + printf("%3d", adjs[i][j]); + } + } + + printf("\n"); + } +} diff --git a/Dev-C++/ExerciseBook/07.34/07.34.dev b/Dev-C++/ExerciseBook/07.34/07.34.dev new file mode 100644 index 0000000..8517f51 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.34/07.34.dev @@ -0,0 +1,131 @@ +[Project] +FileName=07.34.dev +Name=07.34 +Type=1 +Ver=2 +ObjFiles= +Includes= +Libs= +PrivateResource= +ResourceIncludes= +MakeIncludes= +Compiler= +CppCompiler= +Linker= +IsCpp=0 +Icon= +ExeOutput= +ObjectOutput= +LogOutput= +LogOutputEnabled=0 +OverrideOutput=0 +OverrideOutputName= +HostApplication= +UseCustomMakefile=0 +CustomMakefile= +CommandLine= +Folders= +IncludeVersionInfo=0 +SupportXPThemes=0 +CompilerSet=1 +CompilerSettings=0000000000000000001000000 +UnitCount=8 + +[VersionInfo] +Major=1 +Minor=0 +Release=0 +Build=0 +LanguageID=1033 +CharsetID=1252 +CompanyName= +FileVersion= +FileDescription=Developed using the Dev-C++ IDE +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion= +AutoIncBuildNr=0 +SyncProduct=1 + +[Unit1] +FileName=07.34.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit2] +FileName=ALGraph.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit3] +FileName=ALGraph.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit4] +FileName=SqStack.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit5] +FileName=SqStack.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit6] +FileName=TestData_DG.txt +Folder= +Compile=0 +Link=0 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit7] +FileName=TopologicalSorting.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit8] +FileName=TopologicalSorting.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + diff --git a/Dev-C++/ExerciseBook/07.34/07.34.png b/Dev-C++/ExerciseBook/07.34/07.34.png new file mode 100644 index 0000000000000000000000000000000000000000..6bb19199dc12ec07185960e5914dd51744fe7485 GIT binary patch literal 16448 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 MqODx1Xchkd0f5#y;s5{u literal 0 HcmV?d00001 diff --git a/Dev-C++/ExerciseBook/07.34/ALGraph.cpp b/Dev-C++/ExerciseBook/07.34/ALGraph.cpp new file mode 100644 index 0000000..8318350 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.34/ALGraph.cpp @@ -0,0 +1,325 @@ +/*================== + * ͼµÄÁÚ½Ó±í´æ´¢±íʾ + ===================*/ + +#include "ALGraph.h" + +// ¼ÈëÊý¾ÝµÄÔ´Îļþ£»fpΪnullʱ£¬ËµÃ÷ÐèÒª´Ó¿ØÖÆÌ¨Â¼Èë +static FILE* fp = NULL; + +/* + * IncInfoָʾ¸Ãͼ/ÍøµÄ±ß/»¡ÉÏÊÇ·ñ´æÔÚ¸½¼ÓÐÅÏ¢¡£ + * Èç¹ûÆäÖµ²»Îª0£¬Ôò±íʾÎÞ¸½¼ÓÐÅÏ¢£¬·ñÔò£¬±íʾ´æÔÚ¸½¼ÓÐÅÏ¢¡£ + */ +Boolean IncInfo = FALSE; + +// ·ÃÎʱêÖ¾Êý×飬¼Ç¼·ÃÎʹýµÄ¶¥µã +static Boolean visited[MAX_VERTEX_NUM]; + +// º¯Êý±äÁ¿ +static Status (* VisitFunc)(VertexType e); + + +/* + * ´´½¨ + * + *¡¾±¸×¢¡¿ + * + * ½Ì²ÄÖÐĬÈÏ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý¡£ + * ÕâÀïΪÁË·½±ã²âÊÔ£¬±ÜÃâÿ´ÎÔËÐж¼ÊÖ¶¯ÊäÈëÊý¾Ý£¬ + * Òò¶øÔÊÐíÑ¡Ôñ´ÓÔ¤ÉèµÄÎļþpathÖжÁÈ¡²âÊÔÊý¾Ý¡£ + * + * Èç¹ûÐèÒª´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý£¬ÔòpathΪNULL£¬»òpath[kind]Ϊ""¡£ + * Èç¹ûÐèÒª´ÓÎļþÖжÁÈ¡Êý¾Ý£¬ÔòÐèÒªÔÚpathÖÐÌîдÎļþÃûÐÅÏ¢¡£ + */ +Status CreateGraph(ALGraph* G, char* path[]) { + int readFromConsole; // ÊÇ·ñ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý + int kind; + Status flag; + + // ¡ï¡ï¡ï´Ë´¦¹Ì¶¨ÎªÓÐÏòͼ + kind = 0; + + // Èç¹ûûÓÐÎļþ·¾¶ÐÅÏ¢£¬Ôò´Ó¿ØÖÆÌ¨¶ÁÈ¡ÊäÈë + readFromConsole = (path == NULL) || strcmp(path[kind], "") == 0; + + // ÐèÒª´ÓÎļþ¶ÁÈ¡ + if(readFromConsole) { + (*G).kind = GraphKind(kind); // ¼Ç¼ͼ/ÍøµÄÀàÐÍ + } else { + // ´ò¿ªÎļþ£¬×¼±¸¶ÁÈ¡²âÊÔÊý¾Ý + fp = fopen(path[kind], "r"); + if(fp == NULL) { + return ERROR; + } + + // ¼ÈëͼµÄÀàÐÍ + ReadData(fp, "%d", &((*G).kind)); + } + + // Ëæ»ú´´½¨ÓÐÏòͼ/Íø»òÎÞÏòͼ/ÍøµÄÒ»ÖÖ + switch((*G).kind) { + case DG: + flag = CreateDG(G); + break; + default: + flag = ERROR; + break; + } + + if(fp != NULL) { + fclose(fp); + fp = NULL; + } + + return flag; +} + +/* + * ¹¹ÔìÓÐÏòͼ + */ +static Status CreateDG(ALGraph* G) { + int i, k; + int vexnum, arcnum; + VertexType v1, v2; + InfoType* info = NULL; + + (*G).vexnum = (*G).arcnum = 0; + + if(fp == NULL) { + printf("ÇëÊäÈëÓÐÏòͼµÄ¶¥µãÊý£º"); + scanf("%d", &vexnum); + printf("ÇëÊäÈëÓÐÏòͼµÄ»¡Êý£º"); + scanf("%d", &arcnum); + printf("¸ÃÓÐÏòͼµÄ»¡ÉÏÊÇ·ñ°üº¬ÆäËû¸½¼ÓÐÅÏ¢(0-²»°üº¬©¦1-°üº¬)£º"); + scanf("%d", &IncInfo); + + // ¼Èë¶¥µã¼¯ + printf("Çë¼Èë %d ¸ö¶¥µã£¬²»Í¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º", vexnum); + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(stdin); + scanf("%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } else { + ReadData(fp, "%d", &vexnum); // ¼Èë¶¥µãÊý + ReadData(fp, "%d", &arcnum); // ¼È뻡Êý + ReadData(fp, "%d", &IncInfo); // Åжϻ¡ÉÏÊÇ·ñ°üº¬¸½¼ÓÐÅÏ¢ + + // ¼Èë¶¥µã¼¯ + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(fp); + ReadData(fp, "%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } + + // ½öÔÚ¿ØÖÆÌ¨Â¼ÈëÐÅϢʱÊä³ö´ËÌáʾ + if(fp == NULL && arcnum != 0) { + printf("ÇëΪÓÐÏòͼÒÀ´Î¼Èë %d Ìõ»¡µÄÐÅÏ¢£¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º\n", arcnum); + } + + // ¼È뻡µÄÐÅÏ¢ + for(k = 0; k < arcnum; k++) { + if(fp == NULL) { + printf("µÚ %2d Ìõ»¡£º", k + 1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v2); + } else { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + skipBlank(fp); + ReadData(fp, "%c%c", &v1, &v2); + } + + // Èç¹ûÐèҪ¼È뻡µÄÆäËû¸½¼ÓÐÅÏ¢ + if(IncInfo) { + // ×îºó¼È븽¼ÓÐÅÏ¢ + Input(*G, &info); + } + + // ²åÈ뻡 + InsertArc(G, v1, v2, info); + } + + // ´ÓÎļþÖжÁÈ¡Êý¾Ýʱ£¬×îºóÆäʵӦµ±ÅжÏÒ»ÏÂÊÇ·ñ¶Áµ½ÁË×ã¹»µÄÐÅÏ¢ + return OK; +} + +/* + * ¼Èë±ß/»¡µÄÏà¹Ø¸½¼ÓÐÅÏ¢ + */ +static void Input(ALGraph G, InfoType** info) { + int weight; + + // ÔÚ"Íø"µÄÇéÐÎÏÂÐèҪ¼ÈëȨֵÐÅÏ¢ + if(G.kind == DN || G.kind == UDN) { + *info = (InfoType*) malloc(sizeof(InfoType)); + + if(fp == NULL) { + scanf("%d", &weight); + } else { + ReadData(fp, "%d", &weight); + } + + (*info)->weight = weight; + } +} + +/* + * ²éÕÒ + * + * ·µ»Ø¶¥µãuÔÚͼ/ÍøÖеÄλÖà + */ +int LocateVex(ALGraph G, VertexType u) { + int i; + + for(i = 0; i < G.vexnum; i++) { + if(G.vertices[i].data == u) { + return i; + } + } + + return -1; +} + +/* + * ¹¹ÔìÒ»¸ö±ß/»¡½áµã(½öÏÞÄÚ²¿Ê¹ÓÃ) + */ +static ArcNode* newArcNodePtr(int adjvex, ArcNode* nextarc, InfoType* info) { + ArcNode* p = (ArcNode*) malloc(sizeof(ArcNode)); + if(!p) { + exit(OVERFLOW); + } + + p->adjvex = adjvex; + + p->nextarc = nextarc; + + p->info = info; + + return p; +} + +/* + * ²åÈë±ß/»¡ + * + * Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬Ôò²åÈëÒ»Ìõ»¡ÐèÒªÔö¼ÓÁ½¸ö¶¥µã¹ØÏµ£¬µ«»¡µÄÊýÁ¿Ö»ÔöÒ»¡£ + * ¶ÔÓÚͼ/ÍøÀ´Ëµ£¬¿ÉÒÔÔڿɱä²ÎÊýÖÐÁгö±ß/»¡µÄ¸½¼ÓÐÅÏ¢¡£ + * + * ×¢£º´Ë´¦½ÓÊյIJÎÊýÓëMGraphÓÐЩ²»Ò»Ñù£ºÍøµÄ¸½¼ÓÐÅÏ¢Öаüº¬Á˸÷Ìõ±ß/»¡µÄȨֵ¡£ + */ +Status InsertArc(ALGraph* G, VertexType v, VertexType w, ...) { + int tail, head, k, count; + ArcNode* r; + ArcNode* pre; + Boolean overlay = FALSE; // ÊÇ·ñΪ¸²¸ÇÌí¼Ó + InfoType* info = NULL; // ±ß/»¡µÄ¸½¼ÓÐÅÏ¢ + va_list ap; + + tail = LocateVex(*G, v); // »ñÈ¡¶¥µãvÔÚ¶¥µã¼¯ÖеÄλÖà + if(tail == -1) { + return ERROR; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + head = LocateVex(*G, w); // »ñÈ¡¶¥µãwÔÚ¶¥µã¼¯ÖеÄλÖà + if(head == -1) { + return ERROR; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + // ¾Ü¾ø»· + if(tail == head) { + return ERROR; + } + + // Èç¹û±ß/»¡ÉÏ´æÔÚ¸½¼ÓÐÅÏ¢ + if(IncInfo) { + va_start(ap, w); // ÔÚwºó²éѯÊ׸ö¿É±ä²ÎÊý + info = va_arg(ap, InfoType*); // »ñÈ¡¸½¼ÓÐÅÏ¢ + va_end(ap); + } + + /* ½ÓÏÂÀ´£¬ÐèÒª²éÕÒºÏÊʵIJåÈëλÖà */ + + for(count = 0; count < 2; count++) { + pre = NULL; + // Ö¸ÏòÒÔtailΪβµÄÊ×Ìõ±ß/»¡ + r = G->vertices[tail].firstarc; + while(r != NULL && r->adjvex < head) { + pre = r; + r = r->nextarc; + } + + // Óöµ½ÁËÏàͬλÖõĽáµã + if(r != NULL && r->adjvex == head) { + r->info = info; // ¸´Óøýáµã + overlay = TRUE; // ·¢ÉúÁ˸²¸Ç + } else { + if(pre == NULL) { + G->vertices[tail].firstarc = newArcNodePtr(head, r, info); + } else { + pre->nextarc = newArcNodePtr(head, r, info); + } + } + + // Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬ÐèÒª¿¼ÂǶԳÆÐÔ + if((G->kind == UDG || G->kind == UDN) && tail != head) { + // µßµ¹iºÍj + k = tail; + tail = head; + head = k; + } else { + break; // Èç¹ûÊÇÓÐÏòµÄ£¬¿ÉÒÔ½áÊøÁË + } + } + + // ÔڷǸ²¸ÇµÄÇéÐÎÏ£¬²Å¿¼ÂǸüбß/»¡µÄÊýÁ¿ + if(!overlay) { + (*G).arcnum++; // ²»ÂÛÓÐÏòÎÞÏò£¬±ß/»¡ÊýÖ»ÔöÒ» + } + + return OK; +} + +/* + * ÒÔͼÐλ¯ÐÎʽÊä³öµ±Ç°½á¹¹ + */ +void PrintGraph(ALGraph G) { + int i; + ArcNode* p; + + if(G.vexnum == 0) { + printf("¿Õͼ£¬ÎÞÐè´òÓ¡£¡\n"); + return; + } + + printf("µ±Ç°Í¼/Íø°üº¬ %2d ¸ö¶¥µã£¬ %2d Ìõ±ß/»¡...\n", G.vexnum, G.arcnum); + + for(i = 0; i < G.vexnum; i++) { + printf("%c ===> ", G.vertices[i].data); + + p = G.vertices[i].firstarc; + while(p != NULL) { + if(IncInfo == 0) { + printf("%c ", G.vertices[p->adjvex].data); + + // ¶ÔÓÚÍø£¬»á´ÓÆä¸½¼ÓÐÅÏ¢ÖлñÈ¡µ½È¨Öµ + } else { + printf("%c[%2d] ", G.vertices[p->adjvex].data, p->info->weight); + } + + p = p->nextarc; + + if(p != NULL) { + printf("- "); + } + } + + printf("\n"); + } +} diff --git a/Dev-C++/ExerciseBook/07.34/ALGraph.h b/Dev-C++/ExerciseBook/07.34/ALGraph.h new file mode 100644 index 0000000..e70b2c2 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.34/ALGraph.h @@ -0,0 +1,128 @@ +/*================== + * ͼµÄÁÚ½Ó±í´æ´¢±íʾ + ===================*/ + +#ifndef ALGRAPH_H +#define ALGRAPH_H + +#include +#include // Ìṩmemset¡¢strcmp Ô­ÐÍ +#include // Ìṩºêva_list¡¢va_start¡¢va_arg¡¢va_end +#include // Ìṩmalloc¡¢realloc¡¢free¡¢exitÔ­ÐÍ +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// + +/* + * ×¢£º + * + * ͨ³£À´½²£¬ÎÞȨͼ±»¼ò³ÆÎª¡¾Í¼¡¿£¬ÓÐȨͼ±»¼ò³ÆÎª¡¾Íø¡¿¡£ + * ÎÞÏòͼ/ÍøÖеĶ¥µã¹ØÏµ±»³ÆÎª¡¾±ß¡¿£¬ÓÐÏòͼ/ÍøÖеĶ¥µã¹ØÏµ±»³ÆÎª¡¾»¡¡¿£¬²¢Çø·Ö»¡Í·Ó뻡β¡£ + * ʵ¼Ê±íÊöÖУ¬Î´±Ø»áÑϸñ×ñÊØÒÔÉÏÃüÃû¡£ + * + * µ±Ç°½á¹¹Êʺϴ洢±ß/»¡±È½ÏÏ¡ÊèµÄͼ/Íø¡£ + * + * ¡ï ²åÈë±ß/»¡µÄÐÅϢʱ£¬ÕâÀïµÄʵÏÖÊǰ´"ÉýÐò"²åÈëµÄ£¬ÕâʹµÃ²åÈëµÄ»¡Êǰ´"ÉýÐò"ÅÅÁеġ£ + */ + + +/* ºê¶¨Òå */ +#define MAX_VERTEX_NUM 26 // ×î´ó¶¥µã¸öÊý + + +// ͼµÄÀàÐÍ +typedef enum { + DG, // 0-ÓÐÏòͼ + DN, // 1-ÓÐÏòÍø(´øÈ¨Öµ) + UDG, // 2-ÎÞÏòͼ + UDN // 3-ÎÞÏòÍø(´øÈ¨Öµ) +} GraphKind; + +// ¶¥µãÀàÐÍ +typedef char VertexType; + +// ±ß/»¡µÄÏà¹Ø¸½¼ÓÐÅÏ¢ +typedef struct { + /* + * ×¢£º + * ½Ì²ÄÖиø³öµÄ½á¹¹Ö»¿¼ÂÇÁËÎÞȨͼ£¬¶øÃ»¿¼ÂÇÓÐȨͼ(Íø)¡£ + * ÕâÀïΪÁ˰ѡ°Íø¡±µÄÇéÐÎÒ²¿¼ÂǽøÈ¥£¬ÌØÔÚ¸½¼ÓÐÅÏ¢ÖÐÔö¼ÓÁË"È¨ÖØ"ÊôÐÔ¡£ + */ + int weight; +} InfoType; + +/* ±ß/»¡½áµã */ +typedef struct ArcNode { + int adjvex; // ¸Ã»¡ËùÖ¸ÏòµÄ¶¥µãµÄλÖà + struct ArcNode* nextarc; // Ö¸ÏòÏÂÒ»Ìõ»¡µÄÖ¸Õë + InfoType* info; // »¡µÄ¸½¼ÓÐÅÏ¢£¬Í¨³£ºöÂÔ +} ArcNode; + +// ÿ¸öÁ´±íµÄÍ·½áµã +typedef struct VNode { + VertexType data; // ¶¥µãÐÅÏ¢ + ArcNode* firstarc; // Ö¸ÏòµÚÒ»ÌõÒÀ¸½¸Ã¶¥µãµÄ»¡µÄÖ¸Õë +} VNode; + +/* ͼµÄÁÚ½Ó±í´æ´¢±íʾÀàÐͶ¨Òå */ +typedef struct { + VNode vertices[MAX_VERTEX_NUM]; // ÁÚ½Ó±í + int vexnum, arcnum; // ͼ/ÍøµÄ¶¥µãÊýºÍ»¡Êý + GraphKind kind; // ͼµÄÀàÐͱêÖ¾ +} ALGraph; + + +// ±ß/»¡ÉÏÊÇ·ñ´æÔÚ¸½¼ÓÐÅÏ¢ +extern Boolean IncInfo; + + +/* + * ´´½¨ + * + *¡¾±¸×¢¡¿ + * + * ½Ì²ÄÖÐĬÈÏ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý¡£ + * ÕâÀïΪÁË·½±ã²âÊÔ£¬±ÜÃâÿ´ÎÔËÐж¼ÊÖ¶¯ÊäÈëÊý¾Ý£¬ + * Òò¶øÔÊÐíÑ¡Ôñ´ÓÔ¤ÉèµÄÎļþpathÖжÁÈ¡²âÊÔÊý¾Ý¡£ + * + * Èç¹ûÐèÒª´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý£¬ÔòpathΪNULL£¬»òpath[kind]Ϊ""¡£ + * Èç¹ûÐèÒª´ÓÎļþÖжÁÈ¡Êý¾Ý£¬ÔòÐèÒªÔÚpathÖÐÌîдÎļþÃûÐÅÏ¢¡£ + */ +Status CreateGraph(ALGraph* G, char* path[]); + +/* + * ¹¹ÔìÓÐÏòͼ + */ +static Status CreateDG(ALGraph* G); + +/* + * ¼Èë±ß/»¡µÄÏà¹Ø¸½¼ÓÐÅÏ¢ + */ +static void Input(ALGraph G, InfoType** info); + +/* + * ²éÕÒ + * + * ·µ»Ø¶¥µãuÔÚͼ/ÍøÖеÄλÖà + */ +int LocateVex(ALGraph G, VertexType u); + +/* + * ¹¹ÔìÒ»¸ö±ß/»¡½áµã(½öÏÞÄÚ²¿Ê¹ÓÃ) + */ +static ArcNode* newArcNodePtr(int adjvex, ArcNode* nextarc, InfoType* info); + +/* + * ²åÈë±ß/»¡ + * + * Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬Ôò²åÈëÒ»Ìõ»¡ÐèÒªÔö¼ÓÁ½¸ö¶¥µã¹ØÏµ£¬µ«»¡µÄÊýÁ¿Ö»ÔöÒ»¡£ + * ¶ÔÓÚͼ/ÍøÀ´Ëµ£¬¿ÉÒÔÔڿɱä²ÎÊýÖÐÁгö±ß/»¡µÄ¸½¼ÓÐÅÏ¢¡£ + * + * ×¢£º´Ë´¦½ÓÊյIJÎÊýÓëMGraphÓÐЩ²»Ò»Ñù£ºÍøµÄ¸½¼ÓÐÅÏ¢Öаüº¬Á˸÷Ìõ±ß/»¡µÄȨֵ¡£ + */ +Status InsertArc(ALGraph* G, VertexType v, VertexType w, ...); + +/* + * ÒÔͼÐλ¯ÐÎʽÊä³öµ±Ç°½á¹¹ + */ +void PrintGraph(ALGraph G); + +#endif diff --git a/Dev-C++/ExerciseBook/07.34/SqStack.cpp b/Dev-C++/ExerciseBook/07.34/SqStack.cpp new file mode 100644 index 0000000..f056778 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.34/SqStack.cpp @@ -0,0 +1,90 @@ +/*========================= + * Õ»µÄ˳Ðò´æ´¢½á¹¹£¨Ë³ÐòÕ»£© + ==========================*/ + +#include "SqStack.h" //**¡ø03 Õ»ºÍ¶ÓÁÐ**// + +/* + * ³õʼ»¯ + * + * ¹¹ÔìÒ»¸ö¿ÕÕ»¡£³õʼ»¯³É¹¦Ôò·µ»ØOK£¬·ñÔò·µ»ØERROR¡£ + */ +Status InitStack(SqStack* S) { + if(S == NULL) { + return ERROR; + } + + (*S).base = (SElemType*) malloc(STACK_INIT_SIZE * sizeof(SElemType)); + if((*S).base == NULL) { + exit(OVERFLOW); + } + + (*S).top = (*S).base; + (*S).stacksize = STACK_INIT_SIZE; + + return OK; +} + +/* + * ÅÐ¿Õ + * + * ÅжÏ˳ÐòÕ»ÖÐÊÇ·ñ°üº¬ÓÐЧÊý¾Ý¡£ + * + * ·µ»ØÖµ£º + * TRUE : ˳ÐòջΪ¿Õ + * FALSE: ˳ÐòÕ»²»Îª¿Õ + */ +Status StackEmpty(SqStack S) { + if(S.top == S.base) { + return TRUE; + } else { + return FALSE; + } +} + +/* + * ÈëÕ» + * + * ½«ÔªËØeѹÈëµ½Õ»¶¥¡£ + */ +Status Push(SqStack* S, SElemType e) { + if(S == NULL || (*S).base == NULL) { + return ERROR; + } + + // Õ»Âúʱ£¬×·¼Ó´æ´¢¿Õ¼ä + if((*S).top - (*S).base >= (*S).stacksize) { + (*S).base = (SElemType*) realloc((*S).base, ((*S).stacksize + STACKINCREMENT) * sizeof(SElemType)); + if((*S).base == NULL) { + exit(OVERFLOW); // ´æ´¢·ÖÅäʧ°Ü + } + + (*S).top = (*S).base + (*S).stacksize; + (*S).stacksize += STACKINCREMENT; + } + + // ½øÕ»Ïȸ³Öµ£¬Õ»¶¥Ö¸ÕëÔÙ×ÔÔö + *(S->top++) = e; + + return OK; +} + +/* + * ³öÕ» + * + * ½«Õ»¶¥ÔªËص¯³ö£¬²¢ÓÃe½ÓÊÕ¡£ + */ +Status Pop(SqStack* S, SElemType* e) { + if(S == NULL || (*S).base == NULL) { + return ERROR; + } + + if((*S).top == (*S).base) { + return ERROR; + } + + // ³öÕ»Õ»¶¥Ö¸ÕëÏȵݼõ£¬ÔÙ¸³Öµ + *e = *(--(*S).top); + + return OK; +} diff --git a/Dev-C++/ExerciseBook/07.34/SqStack.h b/Dev-C++/ExerciseBook/07.34/SqStack.h new file mode 100644 index 0000000..a8fe835 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.34/SqStack.h @@ -0,0 +1,59 @@ +/*========================= + * Õ»µÄ˳Ðò´æ´¢½á¹¹£¨Ë³ÐòÕ»£© + ==========================*/ + +#ifndef SQSTACK_H +#define SQSTACK_H + +#include +#include // Ìṩmalloc¡¢realloc¡¢free¡¢exitÔ­ÐÍ +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// + +/* ºê¶¨Òå */ +#define STACK_INIT_SIZE 100 // ˳ÐòÕ»´æ´¢¿Õ¼äµÄ³õʼ·ÖÅäÁ¿ +#define STACKINCREMENT 10 // ˳ÐòÕ»´æ´¢¿Õ¼äµÄ·ÖÅäÔöÁ¿ + +/* ˳ÐòÕ»ÔªËØÀàÐͶ¨Òå */ +typedef int SElemType; + +// ˳ÐòÕ»ÔªËØ½á¹¹ +typedef struct { + SElemType* base; // Õ»µ×Ö¸Õë + SElemType* top; // Õ»¶¥Ö¸Õë + int stacksize; // µ±Ç°ÒÑ·ÖÅäµÄ´æ´¢¿Õ¼ä£¬ÒÔÔªËØÎªµ¥Î» +} SqStack; + + +/* + * ³õʼ»¯ + * + * ¹¹ÔìÒ»¸ö¿ÕÕ»¡£³õʼ»¯³É¹¦Ôò·µ»ØOK£¬·ñÔò·µ»ØERROR¡£ + */ +Status InitStack(SqStack* S); + +/* + * ÅÐ¿Õ + * + * ÅжÏ˳ÐòÕ»ÖÐÊÇ·ñ°üº¬ÓÐЧÊý¾Ý¡£ + * + * ·µ»ØÖµ£º + * TRUE : ˳ÐòջΪ¿Õ + * FALSE: ˳ÐòÕ»²»Îª¿Õ + */ +Status StackEmpty(SqStack S); + +/* + * ÈëÕ» + * + * ½«ÔªËØeѹÈëµ½Õ»¶¥¡£ + */ +Status Push(SqStack* S, SElemType e); + +/* + * ³öÕ» + * + * ½«Õ»¶¥ÔªËص¯³ö£¬²¢ÓÃe½ÓÊÕ¡£ + */ +Status Pop(SqStack* S, SElemType* e); + +#endif diff --git a/Dev-C++/ExerciseBook/07.34/TestData_DG.txt b/Dev-C++/ExerciseBook/07.34/TestData_DG.txt new file mode 100644 index 0000000..a240ed8 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.34/TestData_DG.txt @@ -0,0 +1,6 @@ +ͼÀàÐÍ¡ú0£¨ÓÐÏòͼ£© +¶¥µãÊý¡ú12 +»¡Êý¡ú16 +»¡ÊÇ·ñ´øÓÐÆäËûÐÅÏ¢¡ú0 +¶¥µã¼¯¡ú¡¾A£¬B£¬C£¬D£¬E£¬F£¬G£¬H£¬I£¬J£¬K£¬L¡¿ +»¡µÄ¼¯ºÏ¡ú¡¾F£¬J¡¿¡¾F£¬B¡¿¡¾F£¬C¡¿¡¾F£¬A¡¿¡¾B£¬C¡¿¡¾J£¬I¡¿¡¾C£¬I¡¿¡¾C£¬H¡¿¡¾I£¬H¡¿¡¾C£¬G¡¿¡¾D£¬A¡¿¡¾D£¬L¡¿¡¾L£¬A¡¿¡¾D£¬K¡¿¡¾K£¬E¡¿¡¾E£¬G¡¿ \ No newline at end of file diff --git a/Dev-C++/ExerciseBook/07.34/TopologicalSorting.cpp b/Dev-C++/ExerciseBook/07.34/TopologicalSorting.cpp new file mode 100644 index 0000000..82001f5 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.34/TopologicalSorting.cpp @@ -0,0 +1,96 @@ +/*======================= + * AOV-Íø(ÓÐÏòͼ)µÄÍØÆËÅÅÐò + * + * °üº¬Ëã·¨: 7.12 + ========================*/ + +#include "TopologicalSorting.h" + +/* + * ¨€¨€¨€¨€¨€¨€¨€¨€ Ëã·¨7.12 ¨€¨€¨€¨€¨€¨€¨€¨€ + * + * Èç¹ûÓÐÏòͼGÎÞ»ØÂ·£¬ÔòÊä³öËüµÄÒ»¸öÍØÆËÐòÁв¢·µ»ØOK£»·ñÔò£¬·µ»ØFALSE¡£ + * ÍØÆËÐòÁÐͨ³£²»Î¨Ò»£¬µ«ÊDZØÐ뱣֤ijЩ¹Ø¼ü½ÚµãµÄÏȺó´ÎÐò¡£ + * + * ×¢£ºÓë½Ì²Ä²»Í¬Ö®´¦ÔÚÓÚ£¬´Ë´¦Ôö¼ÓÁËÒ»¸ötopoÊý×é×ö²ÎÊý¡£ + * ¡¡¡¡¶ÔÓÚÇó³öµÄÍØÆËÐòÁУ¬²»»áÖ±½ÓÊä³ö£¬¶øÊǻỺ´æµ½topoÖС£ + * ¡¡¡¡ÕâÑùµÄ×öµÄÄ¿µÄÊǺóÐøµÄϰÌâÖлáÓжദÓõ½¸ÃÍØÆËÐòÁС£ + */ +Status TopologicalSort(ALGraph G, int topo[MAX_VERTEX_NUM]) { + int i, k, count; + int indegree[MAX_VERTEX_NUM]; + SqStack S; + ArcNode* p; + + // ¶Ô¸÷¶¥µãÇóÈë¶È + FindInDegree(G, indegree); + + // ³õʼ»¯ÁãÈë¶È¶¥µãÕ» + InitStack(&S); + + // ½¨Á¢Èë¶ÈΪ0µÄ¶¥µãÕ» + for(i = 0; i < G.vexnum; i++) { + // ½«Èë¶ÈΪ0µÄ¶¥µãÌí¼Óµ½Õ»ÖÐ + if(indegree[i] == 0) { + Push(&S, i); + } + } + + // ¶ÔÍØÆËÐòÁÐÖеĶ¥µã¼ÆÊý + count = 0; + + // ±éÀú¶¥µãÕ» + while(!StackEmpty(S)) { + // »ñȡһ¸öÁãÈë¶È¶¥µã + Pop(&S, &i); + + // ½«¸÷¶¥µãµÄÐòºÅÔÝ´æÆðÀ´ + topo[count++] = i; + + // ±éÀúiºÅ¶¥µãµÄÁÚ½Óµã + for(p = G.vertices[i].firstarc; p != NULL; p = p->nextarc) { + // »ñÈ¡¶¥µãÐòºÅ + k = p->adjvex; + + /* + * ½«iºÅ¶¥µãÿ¸öÁÚ½ÓµãµÄÈë¶È¼õÒ»£¬ÕâÏ൱ÓÚÇжÎiºÅ¶¥µãµ½ÆäËüÁÚ½ÓµãµÄÁªÏµ¡£ + * Èç¹û³öÏÖÁËеÄÈë¶ÈΪ0µÄ¶¥µã£¬¼ÌÐø½«ÆäÈëÕ»¡£ + */ + if((--indegree[k]) == 0) { + Push(&S, k); + } + } + } + + // Èç¹ûÓöµ½ÁË»ØÂ·£¬Ôò·µ»ØERROR + if(count < G.vexnum) { + return ERROR; + } else { + return OK; + } +} + +/* + * ¼ÆËã¸÷¶¥µãµÄÈë¶È + */ +static void FindInDegree(ALGraph G, int indegree[MAX_VERTEX_NUM]) { + int i; + ArcNode* p; + + // ³õʼ»¯ËùÓж¥µãµÄÈë¶ÈΪ0 + for(i = 0; i < G.vexnum; i++) { + indegree[i] = 0; + } + + // ±éÀúËùÓж¥µã + for(i = 0; i < G.vexnum; i++) { + // Ö¸Ïò¸Ã¶¥µãµÄÊ׸öÁÚ½Óµã + p = G.vertices[i].firstarc; + + // ±éÀú¸Ã¶¥µãµÄËùÓÐÁڽӵ㣬ͳ¼Æ¸÷¶¥µãµÄÈë¶È + while(p != NULL) { + indegree[p->adjvex]++; + p = p->nextarc; + } + } +} diff --git a/Dev-C++/ExerciseBook/07.34/TopologicalSorting.h b/Dev-C++/ExerciseBook/07.34/TopologicalSorting.h new file mode 100644 index 0000000..3fae677 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.34/TopologicalSorting.h @@ -0,0 +1,28 @@ +/*======================= + * AOV-Íø(ÓÐÏòͼ)µÄÍØÆËÅÅÐò + * + * °üº¬Ëã·¨: 7.12 + ========================*/ + +#ifndef TOPOLOGICALSORTING_H +#define TOPOLOGICALSORTING_H + +#include +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// +#include "SqStack.h" //**¡ø03 Õ»ºÍ¶ÓÁÐ**// +#include "ALGraph.h" //**¡ø07 ͼ**// + +/* + * ¨€¨€¨€¨€¨€¨€¨€¨€ Ëã·¨7.12 ¨€¨€¨€¨€¨€¨€¨€¨€ + * + * Èç¹ûÓÐÏòͼGÎÞ»ØÂ·£¬ÔòÊä³öËüµÄÒ»¸öÍØÆËÐòÁв¢·µ»ØOK£»·ñÔò£¬·µ»ØFALSE¡£ + * ÍØÆËÐòÁÐͨ³£²»Î¨Ò»£¬µ«ÊDZØÐ뱣֤ijЩ¹Ø¼ü½ÚµãµÄÏȺó´ÎÐò¡£ + */ +Status TopologicalSort(ALGraph G, int topo[MAX_VERTEX_NUM]); + +/* + * ¼ÆËã¸÷¶¥µãµÄÈë¶È + */ +static void FindInDegree(ALGraph G, int indegree[MAX_VERTEX_NUM]); + +#endif diff --git a/Dev-C++/ExerciseBook/07.35/07.35.cpp b/Dev-C++/ExerciseBook/07.35/07.35.cpp new file mode 100644 index 0000000..3358ebe --- /dev/null +++ b/Dev-C++/ExerciseBook/07.35/07.35.cpp @@ -0,0 +1,94 @@ +#include +#include "ALGraph.h" //**¡ø07 ͼ**// + +/* + * ·µ»ØÓÐÏòÎÞ»·Í¼µÄ¸ùÔÚ¶¥µãÏòÁ¿ÖеÄÐòºÅ£¬Èç¹û²»´æÔÚ£¬·µ»Ø-1¡£ + * + * ×¢£ºÈç¹û¸ù½áµã´æÔÚ£¬ÔòÒâζןøù½áµãµÄÈë¶ÈÒ»¶¨Îª0¡£ + * ¡¡¡¡ÒòΪÈç¹û¸ùµÄÈë¶È²»Îª0£¬ÄÇô±Ø¶¨»áÐγɻ·¡£ + * ¡¡¡¡Òò´Ë£¬±¾Ìâ±¾ÖÊÉϾÍÊÇѰÕÒÓÐÏòÎÞ»·Í¼ÖÐÈë¶ÈΪ0µÄÄǸö¶¥µã¡£ + */ +int Algo_7_35(ALGraph G); + + +int main(int argc, char* argv[]) { + ALGraph G; + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ´´½¨²¢Êä³öͼ...\n"); + { + char* path[4]; + + path[0] = "TestData_DG.txt"; + path[1] = ""; + path[2] = ""; + path[3] = ""; + + CreateGraph(&G, path); + PrintGraph(G); + printf("\n"); + } + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ²éÕÒÓÐÏòÎÞ»·Í¼µÄ¸ù...\n"); + { + int r = Algo_7_35(G); + + if(r == -1) { + printf("¸ø¶¨µÄÓÐÏòͼÎÞ»·Í¼²»´æÔÚ¸ù\n"); + } else { + printf("¸ÃÓÐÏòÎÞ»·Í¼µÄ¸ùΪ£º%c\n", G.vertices[r].data); + } + + printf("\n"); + } + + return 0; +} + + +/* + * ·µ»ØÓÐÏòÎÞ»·Í¼µÄ¸ùÔÚ¶¥µãÏòÁ¿ÖеÄÐòºÅ£¬Èç¹û²»´æÔÚ£¬·µ»Ø-1 + * + * ×¢£ºÈç¹û¸ù½áµã´æÔÚ£¬ÔòÒâζןøù½áµãµÄÈë¶ÈÒ»¶¨Îª0¡£ + * ¡¡¡¡ÒòΪÈç¹û¸ùµÄÈë¶È²»Îª0£¬ÄÇô±Ø¶¨»áÐγɻ·¡£ + * ¡¡¡¡Òò´Ë£¬±¾Ìâ±¾ÖÊÉϾÍÊÇѰÕÒÓÐÏòÎÞ»·Í¼ÖÐÈë¶ÈΪ0µÄÄǸö¶¥µã¡£ + */ +int Algo_7_35(ALGraph G) { + int i, count, root; + int indegree[MAX_VERTEX_NUM]; + ArcNode* p; + + // ³õʼ»¯ËùÓж¥µãµÄÈë¶ÈΪ0 + for(i = 0; i < G.vexnum; i++) { + indegree[i] = 0; + } + + // ±éÀúËùÓж¥µã + for(i = 0; i < G.vexnum; i++) { + // Ö¸Ïò¸Ã¶¥µãµÄÊ׸öÁÚ½Óµã + p = G.vertices[i].firstarc; + + // ±éÀú¸Ã¶¥µãµÄËùÓÐÁڽӵ㣬ͳ¼Æ¸÷¶¥µãµÄÈë¶È + while(p != NULL) { + indegree[p->adjvex]++; + p = p->nextarc; + } + } + + // ͳ¼ÆÈë¶ÈΪ0µÄ¶¥µãÊýÁ¿ + count = 0; + root = -1; + + for(i = 0; i < G.vexnum; i++) { + if(indegree[i] == 0) { + count++; + root = i; + } + } + + // ×î¶àÖ»ÓÐÒ»¸ö¸ù + if(count==1) { + return root; + } else { + return -1; + } +} diff --git a/Dev-C++/ExerciseBook/07.35/07.35.dev b/Dev-C++/ExerciseBook/07.35/07.35.dev new file mode 100644 index 0000000..81c2aa4 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.35/07.35.dev @@ -0,0 +1,91 @@ +[Project] +FileName=07.35.dev +Name=07.35 +Type=1 +Ver=2 +ObjFiles= +Includes= +Libs= +PrivateResource= +ResourceIncludes= +MakeIncludes= +Compiler= +CppCompiler= +Linker= +IsCpp=0 +Icon= +ExeOutput= +ObjectOutput= +LogOutput= +LogOutputEnabled=0 +OverrideOutput=0 +OverrideOutputName= +HostApplication= +UseCustomMakefile=0 +CustomMakefile= +CommandLine= +Folders= +IncludeVersionInfo=0 +SupportXPThemes=0 +CompilerSet=1 +CompilerSettings=0000000000000000001000000 +UnitCount=4 + +[VersionInfo] +Major=1 +Minor=0 +Release=0 +Build=0 +LanguageID=1033 +CharsetID=1252 +CompanyName= +FileVersion= +FileDescription=Developed using the Dev-C++ IDE +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion= +AutoIncBuildNr=0 +SyncProduct=1 + +[Unit1] +FileName=07.35.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit2] +FileName=ALGraph.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit3] +FileName=ALGraph.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit4] +FileName=TestData_DG.txt +Folder= +Compile=0 +Link=0 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + diff --git a/Dev-C++/ExerciseBook/07.35/07.35.png b/Dev-C++/ExerciseBook/07.35/07.35.png new file mode 100644 index 0000000000000000000000000000000000000000..48cbc3678a34120a9a0f38eb9ee95a63122673c9 GIT binary patch literal 17387 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 D5Pw{E literal 0 HcmV?d00001 diff --git a/Dev-C++/ExerciseBook/07.35/ALGraph.cpp b/Dev-C++/ExerciseBook/07.35/ALGraph.cpp new file mode 100644 index 0000000..8318350 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.35/ALGraph.cpp @@ -0,0 +1,325 @@ +/*================== + * ͼµÄÁÚ½Ó±í´æ´¢±íʾ + ===================*/ + +#include "ALGraph.h" + +// ¼ÈëÊý¾ÝµÄÔ´Îļþ£»fpΪnullʱ£¬ËµÃ÷ÐèÒª´Ó¿ØÖÆÌ¨Â¼Èë +static FILE* fp = NULL; + +/* + * IncInfoָʾ¸Ãͼ/ÍøµÄ±ß/»¡ÉÏÊÇ·ñ´æÔÚ¸½¼ÓÐÅÏ¢¡£ + * Èç¹ûÆäÖµ²»Îª0£¬Ôò±íʾÎÞ¸½¼ÓÐÅÏ¢£¬·ñÔò£¬±íʾ´æÔÚ¸½¼ÓÐÅÏ¢¡£ + */ +Boolean IncInfo = FALSE; + +// ·ÃÎʱêÖ¾Êý×飬¼Ç¼·ÃÎʹýµÄ¶¥µã +static Boolean visited[MAX_VERTEX_NUM]; + +// º¯Êý±äÁ¿ +static Status (* VisitFunc)(VertexType e); + + +/* + * ´´½¨ + * + *¡¾±¸×¢¡¿ + * + * ½Ì²ÄÖÐĬÈÏ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý¡£ + * ÕâÀïΪÁË·½±ã²âÊÔ£¬±ÜÃâÿ´ÎÔËÐж¼ÊÖ¶¯ÊäÈëÊý¾Ý£¬ + * Òò¶øÔÊÐíÑ¡Ôñ´ÓÔ¤ÉèµÄÎļþpathÖжÁÈ¡²âÊÔÊý¾Ý¡£ + * + * Èç¹ûÐèÒª´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý£¬ÔòpathΪNULL£¬»òpath[kind]Ϊ""¡£ + * Èç¹ûÐèÒª´ÓÎļþÖжÁÈ¡Êý¾Ý£¬ÔòÐèÒªÔÚpathÖÐÌîдÎļþÃûÐÅÏ¢¡£ + */ +Status CreateGraph(ALGraph* G, char* path[]) { + int readFromConsole; // ÊÇ·ñ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý + int kind; + Status flag; + + // ¡ï¡ï¡ï´Ë´¦¹Ì¶¨ÎªÓÐÏòͼ + kind = 0; + + // Èç¹ûûÓÐÎļþ·¾¶ÐÅÏ¢£¬Ôò´Ó¿ØÖÆÌ¨¶ÁÈ¡ÊäÈë + readFromConsole = (path == NULL) || strcmp(path[kind], "") == 0; + + // ÐèÒª´ÓÎļþ¶ÁÈ¡ + if(readFromConsole) { + (*G).kind = GraphKind(kind); // ¼Ç¼ͼ/ÍøµÄÀàÐÍ + } else { + // ´ò¿ªÎļþ£¬×¼±¸¶ÁÈ¡²âÊÔÊý¾Ý + fp = fopen(path[kind], "r"); + if(fp == NULL) { + return ERROR; + } + + // ¼ÈëͼµÄÀàÐÍ + ReadData(fp, "%d", &((*G).kind)); + } + + // Ëæ»ú´´½¨ÓÐÏòͼ/Íø»òÎÞÏòͼ/ÍøµÄÒ»ÖÖ + switch((*G).kind) { + case DG: + flag = CreateDG(G); + break; + default: + flag = ERROR; + break; + } + + if(fp != NULL) { + fclose(fp); + fp = NULL; + } + + return flag; +} + +/* + * ¹¹ÔìÓÐÏòͼ + */ +static Status CreateDG(ALGraph* G) { + int i, k; + int vexnum, arcnum; + VertexType v1, v2; + InfoType* info = NULL; + + (*G).vexnum = (*G).arcnum = 0; + + if(fp == NULL) { + printf("ÇëÊäÈëÓÐÏòͼµÄ¶¥µãÊý£º"); + scanf("%d", &vexnum); + printf("ÇëÊäÈëÓÐÏòͼµÄ»¡Êý£º"); + scanf("%d", &arcnum); + printf("¸ÃÓÐÏòͼµÄ»¡ÉÏÊÇ·ñ°üº¬ÆäËû¸½¼ÓÐÅÏ¢(0-²»°üº¬©¦1-°üº¬)£º"); + scanf("%d", &IncInfo); + + // ¼Èë¶¥µã¼¯ + printf("Çë¼Èë %d ¸ö¶¥µã£¬²»Í¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º", vexnum); + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(stdin); + scanf("%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } else { + ReadData(fp, "%d", &vexnum); // ¼Èë¶¥µãÊý + ReadData(fp, "%d", &arcnum); // ¼È뻡Êý + ReadData(fp, "%d", &IncInfo); // Åжϻ¡ÉÏÊÇ·ñ°üº¬¸½¼ÓÐÅÏ¢ + + // ¼Èë¶¥µã¼¯ + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(fp); + ReadData(fp, "%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } + + // ½öÔÚ¿ØÖÆÌ¨Â¼ÈëÐÅϢʱÊä³ö´ËÌáʾ + if(fp == NULL && arcnum != 0) { + printf("ÇëΪÓÐÏòͼÒÀ´Î¼Èë %d Ìõ»¡µÄÐÅÏ¢£¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º\n", arcnum); + } + + // ¼È뻡µÄÐÅÏ¢ + for(k = 0; k < arcnum; k++) { + if(fp == NULL) { + printf("µÚ %2d Ìõ»¡£º", k + 1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v2); + } else { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + skipBlank(fp); + ReadData(fp, "%c%c", &v1, &v2); + } + + // Èç¹ûÐèҪ¼È뻡µÄÆäËû¸½¼ÓÐÅÏ¢ + if(IncInfo) { + // ×îºó¼È븽¼ÓÐÅÏ¢ + Input(*G, &info); + } + + // ²åÈ뻡 + InsertArc(G, v1, v2, info); + } + + // ´ÓÎļþÖжÁÈ¡Êý¾Ýʱ£¬×îºóÆäʵӦµ±ÅжÏÒ»ÏÂÊÇ·ñ¶Áµ½ÁË×ã¹»µÄÐÅÏ¢ + return OK; +} + +/* + * ¼Èë±ß/»¡µÄÏà¹Ø¸½¼ÓÐÅÏ¢ + */ +static void Input(ALGraph G, InfoType** info) { + int weight; + + // ÔÚ"Íø"µÄÇéÐÎÏÂÐèҪ¼ÈëȨֵÐÅÏ¢ + if(G.kind == DN || G.kind == UDN) { + *info = (InfoType*) malloc(sizeof(InfoType)); + + if(fp == NULL) { + scanf("%d", &weight); + } else { + ReadData(fp, "%d", &weight); + } + + (*info)->weight = weight; + } +} + +/* + * ²éÕÒ + * + * ·µ»Ø¶¥µãuÔÚͼ/ÍøÖеÄλÖà + */ +int LocateVex(ALGraph G, VertexType u) { + int i; + + for(i = 0; i < G.vexnum; i++) { + if(G.vertices[i].data == u) { + return i; + } + } + + return -1; +} + +/* + * ¹¹ÔìÒ»¸ö±ß/»¡½áµã(½öÏÞÄÚ²¿Ê¹ÓÃ) + */ +static ArcNode* newArcNodePtr(int adjvex, ArcNode* nextarc, InfoType* info) { + ArcNode* p = (ArcNode*) malloc(sizeof(ArcNode)); + if(!p) { + exit(OVERFLOW); + } + + p->adjvex = adjvex; + + p->nextarc = nextarc; + + p->info = info; + + return p; +} + +/* + * ²åÈë±ß/»¡ + * + * Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬Ôò²åÈëÒ»Ìõ»¡ÐèÒªÔö¼ÓÁ½¸ö¶¥µã¹ØÏµ£¬µ«»¡µÄÊýÁ¿Ö»ÔöÒ»¡£ + * ¶ÔÓÚͼ/ÍøÀ´Ëµ£¬¿ÉÒÔÔڿɱä²ÎÊýÖÐÁгö±ß/»¡µÄ¸½¼ÓÐÅÏ¢¡£ + * + * ×¢£º´Ë´¦½ÓÊյIJÎÊýÓëMGraphÓÐЩ²»Ò»Ñù£ºÍøµÄ¸½¼ÓÐÅÏ¢Öаüº¬Á˸÷Ìõ±ß/»¡µÄȨֵ¡£ + */ +Status InsertArc(ALGraph* G, VertexType v, VertexType w, ...) { + int tail, head, k, count; + ArcNode* r; + ArcNode* pre; + Boolean overlay = FALSE; // ÊÇ·ñΪ¸²¸ÇÌí¼Ó + InfoType* info = NULL; // ±ß/»¡µÄ¸½¼ÓÐÅÏ¢ + va_list ap; + + tail = LocateVex(*G, v); // »ñÈ¡¶¥µãvÔÚ¶¥µã¼¯ÖеÄλÖà + if(tail == -1) { + return ERROR; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + head = LocateVex(*G, w); // »ñÈ¡¶¥µãwÔÚ¶¥µã¼¯ÖеÄλÖà + if(head == -1) { + return ERROR; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + // ¾Ü¾ø»· + if(tail == head) { + return ERROR; + } + + // Èç¹û±ß/»¡ÉÏ´æÔÚ¸½¼ÓÐÅÏ¢ + if(IncInfo) { + va_start(ap, w); // ÔÚwºó²éѯÊ׸ö¿É±ä²ÎÊý + info = va_arg(ap, InfoType*); // »ñÈ¡¸½¼ÓÐÅÏ¢ + va_end(ap); + } + + /* ½ÓÏÂÀ´£¬ÐèÒª²éÕÒºÏÊʵIJåÈëλÖà */ + + for(count = 0; count < 2; count++) { + pre = NULL; + // Ö¸ÏòÒÔtailΪβµÄÊ×Ìõ±ß/»¡ + r = G->vertices[tail].firstarc; + while(r != NULL && r->adjvex < head) { + pre = r; + r = r->nextarc; + } + + // Óöµ½ÁËÏàͬλÖõĽáµã + if(r != NULL && r->adjvex == head) { + r->info = info; // ¸´Óøýáµã + overlay = TRUE; // ·¢ÉúÁ˸²¸Ç + } else { + if(pre == NULL) { + G->vertices[tail].firstarc = newArcNodePtr(head, r, info); + } else { + pre->nextarc = newArcNodePtr(head, r, info); + } + } + + // Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬ÐèÒª¿¼ÂǶԳÆÐÔ + if((G->kind == UDG || G->kind == UDN) && tail != head) { + // µßµ¹iºÍj + k = tail; + tail = head; + head = k; + } else { + break; // Èç¹ûÊÇÓÐÏòµÄ£¬¿ÉÒÔ½áÊøÁË + } + } + + // ÔڷǸ²¸ÇµÄÇéÐÎÏ£¬²Å¿¼ÂǸüбß/»¡µÄÊýÁ¿ + if(!overlay) { + (*G).arcnum++; // ²»ÂÛÓÐÏòÎÞÏò£¬±ß/»¡ÊýÖ»ÔöÒ» + } + + return OK; +} + +/* + * ÒÔͼÐλ¯ÐÎʽÊä³öµ±Ç°½á¹¹ + */ +void PrintGraph(ALGraph G) { + int i; + ArcNode* p; + + if(G.vexnum == 0) { + printf("¿Õͼ£¬ÎÞÐè´òÓ¡£¡\n"); + return; + } + + printf("µ±Ç°Í¼/Íø°üº¬ %2d ¸ö¶¥µã£¬ %2d Ìõ±ß/»¡...\n", G.vexnum, G.arcnum); + + for(i = 0; i < G.vexnum; i++) { + printf("%c ===> ", G.vertices[i].data); + + p = G.vertices[i].firstarc; + while(p != NULL) { + if(IncInfo == 0) { + printf("%c ", G.vertices[p->adjvex].data); + + // ¶ÔÓÚÍø£¬»á´ÓÆä¸½¼ÓÐÅÏ¢ÖлñÈ¡µ½È¨Öµ + } else { + printf("%c[%2d] ", G.vertices[p->adjvex].data, p->info->weight); + } + + p = p->nextarc; + + if(p != NULL) { + printf("- "); + } + } + + printf("\n"); + } +} diff --git a/Dev-C++/ExerciseBook/07.35/ALGraph.h b/Dev-C++/ExerciseBook/07.35/ALGraph.h new file mode 100644 index 0000000..e70b2c2 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.35/ALGraph.h @@ -0,0 +1,128 @@ +/*================== + * ͼµÄÁÚ½Ó±í´æ´¢±íʾ + ===================*/ + +#ifndef ALGRAPH_H +#define ALGRAPH_H + +#include +#include // Ìṩmemset¡¢strcmp Ô­ÐÍ +#include // Ìṩºêva_list¡¢va_start¡¢va_arg¡¢va_end +#include // Ìṩmalloc¡¢realloc¡¢free¡¢exitÔ­ÐÍ +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// + +/* + * ×¢£º + * + * ͨ³£À´½²£¬ÎÞȨͼ±»¼ò³ÆÎª¡¾Í¼¡¿£¬ÓÐȨͼ±»¼ò³ÆÎª¡¾Íø¡¿¡£ + * ÎÞÏòͼ/ÍøÖеĶ¥µã¹ØÏµ±»³ÆÎª¡¾±ß¡¿£¬ÓÐÏòͼ/ÍøÖеĶ¥µã¹ØÏµ±»³ÆÎª¡¾»¡¡¿£¬²¢Çø·Ö»¡Í·Ó뻡β¡£ + * ʵ¼Ê±íÊöÖУ¬Î´±Ø»áÑϸñ×ñÊØÒÔÉÏÃüÃû¡£ + * + * µ±Ç°½á¹¹Êʺϴ洢±ß/»¡±È½ÏÏ¡ÊèµÄͼ/Íø¡£ + * + * ¡ï ²åÈë±ß/»¡µÄÐÅϢʱ£¬ÕâÀïµÄʵÏÖÊǰ´"ÉýÐò"²åÈëµÄ£¬ÕâʹµÃ²åÈëµÄ»¡Êǰ´"ÉýÐò"ÅÅÁеġ£ + */ + + +/* ºê¶¨Òå */ +#define MAX_VERTEX_NUM 26 // ×î´ó¶¥µã¸öÊý + + +// ͼµÄÀàÐÍ +typedef enum { + DG, // 0-ÓÐÏòͼ + DN, // 1-ÓÐÏòÍø(´øÈ¨Öµ) + UDG, // 2-ÎÞÏòͼ + UDN // 3-ÎÞÏòÍø(´øÈ¨Öµ) +} GraphKind; + +// ¶¥µãÀàÐÍ +typedef char VertexType; + +// ±ß/»¡µÄÏà¹Ø¸½¼ÓÐÅÏ¢ +typedef struct { + /* + * ×¢£º + * ½Ì²ÄÖиø³öµÄ½á¹¹Ö»¿¼ÂÇÁËÎÞȨͼ£¬¶øÃ»¿¼ÂÇÓÐȨͼ(Íø)¡£ + * ÕâÀïΪÁ˰ѡ°Íø¡±µÄÇéÐÎÒ²¿¼ÂǽøÈ¥£¬ÌØÔÚ¸½¼ÓÐÅÏ¢ÖÐÔö¼ÓÁË"È¨ÖØ"ÊôÐÔ¡£ + */ + int weight; +} InfoType; + +/* ±ß/»¡½áµã */ +typedef struct ArcNode { + int adjvex; // ¸Ã»¡ËùÖ¸ÏòµÄ¶¥µãµÄλÖà + struct ArcNode* nextarc; // Ö¸ÏòÏÂÒ»Ìõ»¡µÄÖ¸Õë + InfoType* info; // »¡µÄ¸½¼ÓÐÅÏ¢£¬Í¨³£ºöÂÔ +} ArcNode; + +// ÿ¸öÁ´±íµÄÍ·½áµã +typedef struct VNode { + VertexType data; // ¶¥µãÐÅÏ¢ + ArcNode* firstarc; // Ö¸ÏòµÚÒ»ÌõÒÀ¸½¸Ã¶¥µãµÄ»¡µÄÖ¸Õë +} VNode; + +/* ͼµÄÁÚ½Ó±í´æ´¢±íʾÀàÐͶ¨Òå */ +typedef struct { + VNode vertices[MAX_VERTEX_NUM]; // ÁÚ½Ó±í + int vexnum, arcnum; // ͼ/ÍøµÄ¶¥µãÊýºÍ»¡Êý + GraphKind kind; // ͼµÄÀàÐͱêÖ¾ +} ALGraph; + + +// ±ß/»¡ÉÏÊÇ·ñ´æÔÚ¸½¼ÓÐÅÏ¢ +extern Boolean IncInfo; + + +/* + * ´´½¨ + * + *¡¾±¸×¢¡¿ + * + * ½Ì²ÄÖÐĬÈÏ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý¡£ + * ÕâÀïΪÁË·½±ã²âÊÔ£¬±ÜÃâÿ´ÎÔËÐж¼ÊÖ¶¯ÊäÈëÊý¾Ý£¬ + * Òò¶øÔÊÐíÑ¡Ôñ´ÓÔ¤ÉèµÄÎļþpathÖжÁÈ¡²âÊÔÊý¾Ý¡£ + * + * Èç¹ûÐèÒª´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý£¬ÔòpathΪNULL£¬»òpath[kind]Ϊ""¡£ + * Èç¹ûÐèÒª´ÓÎļþÖжÁÈ¡Êý¾Ý£¬ÔòÐèÒªÔÚpathÖÐÌîдÎļþÃûÐÅÏ¢¡£ + */ +Status CreateGraph(ALGraph* G, char* path[]); + +/* + * ¹¹ÔìÓÐÏòͼ + */ +static Status CreateDG(ALGraph* G); + +/* + * ¼Èë±ß/»¡µÄÏà¹Ø¸½¼ÓÐÅÏ¢ + */ +static void Input(ALGraph G, InfoType** info); + +/* + * ²éÕÒ + * + * ·µ»Ø¶¥µãuÔÚͼ/ÍøÖеÄλÖà + */ +int LocateVex(ALGraph G, VertexType u); + +/* + * ¹¹ÔìÒ»¸ö±ß/»¡½áµã(½öÏÞÄÚ²¿Ê¹ÓÃ) + */ +static ArcNode* newArcNodePtr(int adjvex, ArcNode* nextarc, InfoType* info); + +/* + * ²åÈë±ß/»¡ + * + * Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬Ôò²åÈëÒ»Ìõ»¡ÐèÒªÔö¼ÓÁ½¸ö¶¥µã¹ØÏµ£¬µ«»¡µÄÊýÁ¿Ö»ÔöÒ»¡£ + * ¶ÔÓÚͼ/ÍøÀ´Ëµ£¬¿ÉÒÔÔڿɱä²ÎÊýÖÐÁгö±ß/»¡µÄ¸½¼ÓÐÅÏ¢¡£ + * + * ×¢£º´Ë´¦½ÓÊյIJÎÊýÓëMGraphÓÐЩ²»Ò»Ñù£ºÍøµÄ¸½¼ÓÐÅÏ¢Öаüº¬Á˸÷Ìõ±ß/»¡µÄȨֵ¡£ + */ +Status InsertArc(ALGraph* G, VertexType v, VertexType w, ...); + +/* + * ÒÔͼÐλ¯ÐÎʽÊä³öµ±Ç°½á¹¹ + */ +void PrintGraph(ALGraph G); + +#endif diff --git a/Dev-C++/ExerciseBook/07.35/TestData_DG.txt b/Dev-C++/ExerciseBook/07.35/TestData_DG.txt new file mode 100644 index 0000000..777c5ed --- /dev/null +++ b/Dev-C++/ExerciseBook/07.35/TestData_DG.txt @@ -0,0 +1,6 @@ +ͼÀàÐÍ¡ú0£¨ÓÐÏòͼ£© +¶¥µãÊý¡ú12 +»¡Êý¡ú17 +»¡ÊÇ·ñ´øÓÐÆäËûÐÅÏ¢¡ú0 +¶¥µã¼¯¡ú¡¾A£¬B£¬C£¬D£¬E£¬F£¬G£¬H£¬I£¬J£¬K£¬L¡¿ +»¡µÄ¼¯ºÏ¡ú¡¾F£¬J¡¿¡¾F£¬B¡¿¡¾F£¬C¡¿¡¾F£¬A¡¿¡¾B£¬C¡¿¡¾J£¬I¡¿¡¾C£¬I¡¿¡¾C£¬H¡¿¡¾I£¬H¡¿¡¾C£¬G¡¿¡¾D£¬A¡¿¡¾D£¬L¡¿¡¾L£¬A¡¿¡¾D£¬K¡¿¡¾K£¬E¡¿¡¾E£¬G¡¿¡¾F£¬D¡¿ \ No newline at end of file diff --git a/Dev-C++/ExerciseBook/07.36-07.37/07.36-07.37.cpp b/Dev-C++/ExerciseBook/07.36-07.37/07.36-07.37.cpp new file mode 100644 index 0000000..842d566 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.36-07.37/07.36-07.37.cpp @@ -0,0 +1,167 @@ +#include +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// +#include "ALGraph.h" //**¡ø07 ͼ**// +#include "TopologicalSorting.h" //**¡ø07 ͼ**// + +/* + * ÇóÓÐÏòÎÞ»·Í¼¸÷¶¥µãµÄ×·¾¶¡£ + * + * ¿ÉÒÔ½èÖúÆäÍØÆËÐòÁУ¬´ÓºóÏòǰ±éÀú¸÷¶¥µãÀ´¼ÆËã×·¾¶£¬ + * Ô­ÀíÊǶÔÓÚÈÎÒ»¶¥µã³ö·¢µÄ×·¾¶p1£¬ÆäÁÚ½ÓµãµÄ×·¾¶p2Ò²±Ø¶¨ÔÚ×·¾¶p1ÉÏ£¬ + * ¼´£ºÄ³¶¥µãµÄ×·¾¶ = max{ÁÚ½ÓµãµÄ×·¾¶} + * + * ÕâÀïûÓн«MPLÓòÖ±½ÓдÔÚALGraph½á¹¹ÖУ¬¶øÊǽ«Æäµ¥¶À×÷Ϊһ¸öÊý×éÈ¡ÉùÃ÷£¬ÔÚºËÐÄËã·¨ÉÏûÓÐÈκÎÇø±ð¡£ + */ +void Algo_7_36(ALGraph G, int MPL[MAX_VERTEX_NUM][MAX_VERTEX_NUM + 1]); + +/* + * ´òÓ¡¸÷¶¥µãµÄ×·¾¶ + */ +static void PrintPath_7_36(ALGraph G, int MPL[MAX_VERTEX_NUM][MAX_VERTEX_NUM + 1]); + +/* + * ÇóÈ¡ÓÐÏòÎÞ»·Í¼µÄ×·¾¶ + */ +void Algo_7_37(ALGraph G, int mpl[MAX_VERTEX_NUM + 1]); + + +int main(int argc, char* argv[]) { + ALGraph G; + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ´´½¨²¢Êä³öͼ...\n"); + { + char* path[4]; + + path[0] = "TestData_DG.txt"; + path[1] = ""; + path[2] = ""; + path[3] = ""; + + CreateGraph(&G, path); + PrintGraph(G); + printf("\n"); + } + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ Ìâ7.36£ºÇóÈ¡ÓÐÏòÎÞ»·Í¼¸÷¶¥µãµÄ×·¾¶...\n"); + { + int MPL[MAX_VERTEX_NUM][MAX_VERTEX_NUM + 1]; + + Algo_7_36(G, MPL); + PrintPath_7_36(G, MPL); + printf("\n"); + } + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ Ìâ7.37£ºÇóÈ¡ÓÐÏòÎÞ»·Í¼ÖеÄ×·¾¶...\n"); + { + int mpl[MAX_VERTEX_NUM + 1]; + int i; + + Algo_7_37(G, mpl); + for(i = 1; i <= mpl[0] + 1; i++) { + printf("%c ", G.vertices[mpl[i]].data); + } + printf("\n"); + } + + return 0; +} + + +/* + * ÇóÓÐÏòÎÞ»·Í¼¸÷¶¥µãµÄ×·¾¶¡£ + * + * ¿ÉÒÔ½èÖúÆäÍØÆËÐòÁУ¬´ÓºóÏòǰ±éÀú¸÷¶¥µãÀ´¼ÆËã×·¾¶£¬ + * Ô­ÀíÊǶÔÓÚÈÎÒ»¶¥µã³ö·¢µÄ×·¾¶p1£¬ÆäÁÚ½ÓµãµÄ×·¾¶p2Ò²±Ø¶¨ÔÚ×·¾¶p1ÉÏ£¬ + * ¼´£ºÄ³¶¥µãµÄ×·¾¶³¤¶È = max{ÁÚ½ÓµãµÄ×·¾¶³¤¶È} + 1 + * + * ÕâÀïûÓн«MPLÓòÖ±½ÓдÔÚALGraph½á¹¹ÖУ¬¶øÊǽ«Æäµ¥¶À×÷Ϊһ¸öÊý×éÈ¡ÉùÃ÷£¬ÔÚºËÐÄËã·¨ÉÏûÓÐÈκÎÇø±ð¡£ + */ +void Algo_7_36(ALGraph G, int MPL[MAX_VERTEX_NUM][MAX_VERTEX_NUM + 1]) { + int i, j, v, w; + int max, k; + int topo[MAX_VERTEX_NUM]; + ArcNode* p; + + if(TopologicalSort(G, topo) == ERROR) { + printf("¸ø¶¨µÄÓÐÏòͼ´æÔÚ»ØÂ·£¬ÎÞ·¨»ñÈ¡ÆäÍØÆËÐòÁÐ...\n"); + return; + } + + // ÄæÐò±éÀúÍØÆËÐòÁÐ + for(i = G.vexnum - 1; i >= 0; i--) { + v = topo[i]; + + MPL[v][0] = 0; // 0ºÅµ¥Ôª´æ´¢Â·¾¶³¤¶È + MPL[v][1] = v; // 1ºÅµ¥Ôª´æ´¢Â·¾¶µÄÆðʼ¶¥µãÐòºÅ + + p = G.vertices[v].firstarc; + + // ¶ÔÓÚûÓÐÁÚ½ÓµãµÄ¶¥µã£¬Æä×·¾¶³¤¶ÈΪ0£¬ÎÞÐèÔÙÑо¿ÏÂÈ¥ + if(p == NULL) { + continue; + } + + max = -1; // ÁÚ½ÓµãÖÐ×î´ó·¾¶³¤¶È + k = -1; // ¼Ç¼ӵÓÐ×î´ó·¾¶³¤¶ÈµÄÁÚ½ÓµãµÄÐòºÅ + + // ±éÀúÁÚ½Óµã + while(p != NULL) { + w = p->adjvex; // ÁÚ½ÓµãÐòºÅ + + // Èç¹ûÓжàÌõÏàͬ³¤¶ÈµÄ·¾¶£¬ÔòֻȡÊ×ÏÈ·¢ÏÖµÄÒ»Ìõ + if(MPL[w][0] > max) { + max = MPL[w][0]; + k = w; + } + + p = p->nextarc; + } + + // ¶¥µã×·¾¶³¤¶È = max{ÁÚ½ÓµãµÄ×·¾¶³¤¶È} + 1 + MPL[v][0] = max + 1; + + // ½«ÁÚ½Óµã³ö·¢µÄ×·¾¶¸´ÖƵ½µ±Ç°¶¥µãµÄ×·¾¶ÉÏ + for(j = 1; j <= max + 1; j++) { + MPL[v][j + 1] = MPL[k][j]; + } + } +} + +/* + * ´òÓ¡¸÷¶¥µãµÄ×·¾¶ + */ +static void PrintPath_7_36(ALGraph G, int MPL[MAX_VERTEX_NUM][MAX_VERTEX_NUM + 1]) { + int i, j; + + for(i = 0; i < G.vexnum; i++) { + printf("´Ó¶¥µã %c ³ö·¢µÄ×·¾¶Îª£º", G.vertices[i].data); + for(j = 1; j <= MPL[i][0] + 1; j++) { + printf("%c ", G.vertices[MPL[i][j]].data); + } + printf("\n"); + } +} + +/* + * ÇóÈ¡ÓÐÏòÎÞ»·Í¼µÄ×·¾¶ + */ +void Algo_7_37(ALGraph G, int mpl[MAX_VERTEX_NUM + 1]) { + int MPL[MAX_VERTEX_NUM][MAX_VERTEX_NUM + 1]; + int i, max, k; + + // ÇóÈ¡ËùÓж¥µãµÄ×·¾¶ + Algo_7_36(G, MPL); + + max = -1; + + for(i = 0; i < G.vexnum; i++) { + if(MPL[i][0] > max) { + max = MPL[i][0]; + k = i; + } + } + + for(i = 0; i <= MPL[k][0] + 1; i++) { + mpl[i] = MPL[k][i]; + } +} diff --git a/Dev-C++/ExerciseBook/07.36-07.37/07.36-07.37.dev b/Dev-C++/ExerciseBook/07.36-07.37/07.36-07.37.dev new file mode 100644 index 0000000..29de9ec --- /dev/null +++ b/Dev-C++/ExerciseBook/07.36-07.37/07.36-07.37.dev @@ -0,0 +1,131 @@ +[Project] +FileName=07.36-07.37.dev +Name=07.36-07.37 +Type=1 +Ver=2 +ObjFiles= +Includes= +Libs= +PrivateResource= +ResourceIncludes= +MakeIncludes= +Compiler= +CppCompiler= +Linker= +IsCpp=0 +Icon= +ExeOutput= +ObjectOutput= +LogOutput= +LogOutputEnabled=0 +OverrideOutput=0 +OverrideOutputName= +HostApplication= +UseCustomMakefile=0 +CustomMakefile= +CommandLine= +Folders= +IncludeVersionInfo=0 +SupportXPThemes=0 +CompilerSet=1 +CompilerSettings=0000000000000000001000000 +UnitCount=8 + +[VersionInfo] +Major=1 +Minor=0 +Release=0 +Build=0 +LanguageID=1033 +CharsetID=1252 +CompanyName= +FileVersion= +FileDescription=Developed using the Dev-C++ IDE +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion= +AutoIncBuildNr=0 +SyncProduct=1 + +[Unit1] +FileName=07.36-07.37.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit2] +FileName=ALGraph.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit3] +FileName=ALGraph.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit4] +FileName=SqStack.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit5] +FileName=SqStack.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit6] +FileName=TestData_DG.txt +Folder= +Compile=0 +Link=0 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit7] +FileName=TopologicalSorting.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit8] +FileName=TopologicalSorting.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + diff --git a/Dev-C++/ExerciseBook/07.36-07.37/07.36-07.37.png b/Dev-C++/ExerciseBook/07.36-07.37/07.36-07.37.png new file mode 100644 index 0000000000000000000000000000000000000000..6bb19199dc12ec07185960e5914dd51744fe7485 GIT binary patch literal 16448 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 MqODx1Xchkd0f5#y;s5{u literal 0 HcmV?d00001 diff --git a/Dev-C++/ExerciseBook/07.36-07.37/ALGraph.cpp b/Dev-C++/ExerciseBook/07.36-07.37/ALGraph.cpp new file mode 100644 index 0000000..8318350 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.36-07.37/ALGraph.cpp @@ -0,0 +1,325 @@ +/*================== + * ͼµÄÁÚ½Ó±í´æ´¢±íʾ + ===================*/ + +#include "ALGraph.h" + +// ¼ÈëÊý¾ÝµÄÔ´Îļþ£»fpΪnullʱ£¬ËµÃ÷ÐèÒª´Ó¿ØÖÆÌ¨Â¼Èë +static FILE* fp = NULL; + +/* + * IncInfoָʾ¸Ãͼ/ÍøµÄ±ß/»¡ÉÏÊÇ·ñ´æÔÚ¸½¼ÓÐÅÏ¢¡£ + * Èç¹ûÆäÖµ²»Îª0£¬Ôò±íʾÎÞ¸½¼ÓÐÅÏ¢£¬·ñÔò£¬±íʾ´æÔÚ¸½¼ÓÐÅÏ¢¡£ + */ +Boolean IncInfo = FALSE; + +// ·ÃÎʱêÖ¾Êý×飬¼Ç¼·ÃÎʹýµÄ¶¥µã +static Boolean visited[MAX_VERTEX_NUM]; + +// º¯Êý±äÁ¿ +static Status (* VisitFunc)(VertexType e); + + +/* + * ´´½¨ + * + *¡¾±¸×¢¡¿ + * + * ½Ì²ÄÖÐĬÈÏ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý¡£ + * ÕâÀïΪÁË·½±ã²âÊÔ£¬±ÜÃâÿ´ÎÔËÐж¼ÊÖ¶¯ÊäÈëÊý¾Ý£¬ + * Òò¶øÔÊÐíÑ¡Ôñ´ÓÔ¤ÉèµÄÎļþpathÖжÁÈ¡²âÊÔÊý¾Ý¡£ + * + * Èç¹ûÐèÒª´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý£¬ÔòpathΪNULL£¬»òpath[kind]Ϊ""¡£ + * Èç¹ûÐèÒª´ÓÎļþÖжÁÈ¡Êý¾Ý£¬ÔòÐèÒªÔÚpathÖÐÌîдÎļþÃûÐÅÏ¢¡£ + */ +Status CreateGraph(ALGraph* G, char* path[]) { + int readFromConsole; // ÊÇ·ñ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý + int kind; + Status flag; + + // ¡ï¡ï¡ï´Ë´¦¹Ì¶¨ÎªÓÐÏòͼ + kind = 0; + + // Èç¹ûûÓÐÎļþ·¾¶ÐÅÏ¢£¬Ôò´Ó¿ØÖÆÌ¨¶ÁÈ¡ÊäÈë + readFromConsole = (path == NULL) || strcmp(path[kind], "") == 0; + + // ÐèÒª´ÓÎļþ¶ÁÈ¡ + if(readFromConsole) { + (*G).kind = GraphKind(kind); // ¼Ç¼ͼ/ÍøµÄÀàÐÍ + } else { + // ´ò¿ªÎļþ£¬×¼±¸¶ÁÈ¡²âÊÔÊý¾Ý + fp = fopen(path[kind], "r"); + if(fp == NULL) { + return ERROR; + } + + // ¼ÈëͼµÄÀàÐÍ + ReadData(fp, "%d", &((*G).kind)); + } + + // Ëæ»ú´´½¨ÓÐÏòͼ/Íø»òÎÞÏòͼ/ÍøµÄÒ»ÖÖ + switch((*G).kind) { + case DG: + flag = CreateDG(G); + break; + default: + flag = ERROR; + break; + } + + if(fp != NULL) { + fclose(fp); + fp = NULL; + } + + return flag; +} + +/* + * ¹¹ÔìÓÐÏòͼ + */ +static Status CreateDG(ALGraph* G) { + int i, k; + int vexnum, arcnum; + VertexType v1, v2; + InfoType* info = NULL; + + (*G).vexnum = (*G).arcnum = 0; + + if(fp == NULL) { + printf("ÇëÊäÈëÓÐÏòͼµÄ¶¥µãÊý£º"); + scanf("%d", &vexnum); + printf("ÇëÊäÈëÓÐÏòͼµÄ»¡Êý£º"); + scanf("%d", &arcnum); + printf("¸ÃÓÐÏòͼµÄ»¡ÉÏÊÇ·ñ°üº¬ÆäËû¸½¼ÓÐÅÏ¢(0-²»°üº¬©¦1-°üº¬)£º"); + scanf("%d", &IncInfo); + + // ¼Èë¶¥µã¼¯ + printf("Çë¼Èë %d ¸ö¶¥µã£¬²»Í¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º", vexnum); + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(stdin); + scanf("%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } else { + ReadData(fp, "%d", &vexnum); // ¼Èë¶¥µãÊý + ReadData(fp, "%d", &arcnum); // ¼È뻡Êý + ReadData(fp, "%d", &IncInfo); // Åжϻ¡ÉÏÊÇ·ñ°üº¬¸½¼ÓÐÅÏ¢ + + // ¼Èë¶¥µã¼¯ + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(fp); + ReadData(fp, "%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } + + // ½öÔÚ¿ØÖÆÌ¨Â¼ÈëÐÅϢʱÊä³ö´ËÌáʾ + if(fp == NULL && arcnum != 0) { + printf("ÇëΪÓÐÏòͼÒÀ´Î¼Èë %d Ìõ»¡µÄÐÅÏ¢£¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º\n", arcnum); + } + + // ¼È뻡µÄÐÅÏ¢ + for(k = 0; k < arcnum; k++) { + if(fp == NULL) { + printf("µÚ %2d Ìõ»¡£º", k + 1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v2); + } else { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + skipBlank(fp); + ReadData(fp, "%c%c", &v1, &v2); + } + + // Èç¹ûÐèҪ¼È뻡µÄÆäËû¸½¼ÓÐÅÏ¢ + if(IncInfo) { + // ×îºó¼È븽¼ÓÐÅÏ¢ + Input(*G, &info); + } + + // ²åÈ뻡 + InsertArc(G, v1, v2, info); + } + + // ´ÓÎļþÖжÁÈ¡Êý¾Ýʱ£¬×îºóÆäʵӦµ±ÅжÏÒ»ÏÂÊÇ·ñ¶Áµ½ÁË×ã¹»µÄÐÅÏ¢ + return OK; +} + +/* + * ¼Èë±ß/»¡µÄÏà¹Ø¸½¼ÓÐÅÏ¢ + */ +static void Input(ALGraph G, InfoType** info) { + int weight; + + // ÔÚ"Íø"µÄÇéÐÎÏÂÐèҪ¼ÈëȨֵÐÅÏ¢ + if(G.kind == DN || G.kind == UDN) { + *info = (InfoType*) malloc(sizeof(InfoType)); + + if(fp == NULL) { + scanf("%d", &weight); + } else { + ReadData(fp, "%d", &weight); + } + + (*info)->weight = weight; + } +} + +/* + * ²éÕÒ + * + * ·µ»Ø¶¥µãuÔÚͼ/ÍøÖеÄλÖà + */ +int LocateVex(ALGraph G, VertexType u) { + int i; + + for(i = 0; i < G.vexnum; i++) { + if(G.vertices[i].data == u) { + return i; + } + } + + return -1; +} + +/* + * ¹¹ÔìÒ»¸ö±ß/»¡½áµã(½öÏÞÄÚ²¿Ê¹ÓÃ) + */ +static ArcNode* newArcNodePtr(int adjvex, ArcNode* nextarc, InfoType* info) { + ArcNode* p = (ArcNode*) malloc(sizeof(ArcNode)); + if(!p) { + exit(OVERFLOW); + } + + p->adjvex = adjvex; + + p->nextarc = nextarc; + + p->info = info; + + return p; +} + +/* + * ²åÈë±ß/»¡ + * + * Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬Ôò²åÈëÒ»Ìõ»¡ÐèÒªÔö¼ÓÁ½¸ö¶¥µã¹ØÏµ£¬µ«»¡µÄÊýÁ¿Ö»ÔöÒ»¡£ + * ¶ÔÓÚͼ/ÍøÀ´Ëµ£¬¿ÉÒÔÔڿɱä²ÎÊýÖÐÁгö±ß/»¡µÄ¸½¼ÓÐÅÏ¢¡£ + * + * ×¢£º´Ë´¦½ÓÊյIJÎÊýÓëMGraphÓÐЩ²»Ò»Ñù£ºÍøµÄ¸½¼ÓÐÅÏ¢Öаüº¬Á˸÷Ìõ±ß/»¡µÄȨֵ¡£ + */ +Status InsertArc(ALGraph* G, VertexType v, VertexType w, ...) { + int tail, head, k, count; + ArcNode* r; + ArcNode* pre; + Boolean overlay = FALSE; // ÊÇ·ñΪ¸²¸ÇÌí¼Ó + InfoType* info = NULL; // ±ß/»¡µÄ¸½¼ÓÐÅÏ¢ + va_list ap; + + tail = LocateVex(*G, v); // »ñÈ¡¶¥µãvÔÚ¶¥µã¼¯ÖеÄλÖà + if(tail == -1) { + return ERROR; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + head = LocateVex(*G, w); // »ñÈ¡¶¥µãwÔÚ¶¥µã¼¯ÖеÄλÖà + if(head == -1) { + return ERROR; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + // ¾Ü¾ø»· + if(tail == head) { + return ERROR; + } + + // Èç¹û±ß/»¡ÉÏ´æÔÚ¸½¼ÓÐÅÏ¢ + if(IncInfo) { + va_start(ap, w); // ÔÚwºó²éѯÊ׸ö¿É±ä²ÎÊý + info = va_arg(ap, InfoType*); // »ñÈ¡¸½¼ÓÐÅÏ¢ + va_end(ap); + } + + /* ½ÓÏÂÀ´£¬ÐèÒª²éÕÒºÏÊʵIJåÈëλÖà */ + + for(count = 0; count < 2; count++) { + pre = NULL; + // Ö¸ÏòÒÔtailΪβµÄÊ×Ìõ±ß/»¡ + r = G->vertices[tail].firstarc; + while(r != NULL && r->adjvex < head) { + pre = r; + r = r->nextarc; + } + + // Óöµ½ÁËÏàͬλÖõĽáµã + if(r != NULL && r->adjvex == head) { + r->info = info; // ¸´Óøýáµã + overlay = TRUE; // ·¢ÉúÁ˸²¸Ç + } else { + if(pre == NULL) { + G->vertices[tail].firstarc = newArcNodePtr(head, r, info); + } else { + pre->nextarc = newArcNodePtr(head, r, info); + } + } + + // Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬ÐèÒª¿¼ÂǶԳÆÐÔ + if((G->kind == UDG || G->kind == UDN) && tail != head) { + // µßµ¹iºÍj + k = tail; + tail = head; + head = k; + } else { + break; // Èç¹ûÊÇÓÐÏòµÄ£¬¿ÉÒÔ½áÊøÁË + } + } + + // ÔڷǸ²¸ÇµÄÇéÐÎÏ£¬²Å¿¼ÂǸüбß/»¡µÄÊýÁ¿ + if(!overlay) { + (*G).arcnum++; // ²»ÂÛÓÐÏòÎÞÏò£¬±ß/»¡ÊýÖ»ÔöÒ» + } + + return OK; +} + +/* + * ÒÔͼÐλ¯ÐÎʽÊä³öµ±Ç°½á¹¹ + */ +void PrintGraph(ALGraph G) { + int i; + ArcNode* p; + + if(G.vexnum == 0) { + printf("¿Õͼ£¬ÎÞÐè´òÓ¡£¡\n"); + return; + } + + printf("µ±Ç°Í¼/Íø°üº¬ %2d ¸ö¶¥µã£¬ %2d Ìõ±ß/»¡...\n", G.vexnum, G.arcnum); + + for(i = 0; i < G.vexnum; i++) { + printf("%c ===> ", G.vertices[i].data); + + p = G.vertices[i].firstarc; + while(p != NULL) { + if(IncInfo == 0) { + printf("%c ", G.vertices[p->adjvex].data); + + // ¶ÔÓÚÍø£¬»á´ÓÆä¸½¼ÓÐÅÏ¢ÖлñÈ¡µ½È¨Öµ + } else { + printf("%c[%2d] ", G.vertices[p->adjvex].data, p->info->weight); + } + + p = p->nextarc; + + if(p != NULL) { + printf("- "); + } + } + + printf("\n"); + } +} diff --git a/Dev-C++/ExerciseBook/07.36-07.37/ALGraph.h b/Dev-C++/ExerciseBook/07.36-07.37/ALGraph.h new file mode 100644 index 0000000..e70b2c2 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.36-07.37/ALGraph.h @@ -0,0 +1,128 @@ +/*================== + * ͼµÄÁÚ½Ó±í´æ´¢±íʾ + ===================*/ + +#ifndef ALGRAPH_H +#define ALGRAPH_H + +#include +#include // Ìṩmemset¡¢strcmp Ô­ÐÍ +#include // Ìṩºêva_list¡¢va_start¡¢va_arg¡¢va_end +#include // Ìṩmalloc¡¢realloc¡¢free¡¢exitÔ­ÐÍ +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// + +/* + * ×¢£º + * + * ͨ³£À´½²£¬ÎÞȨͼ±»¼ò³ÆÎª¡¾Í¼¡¿£¬ÓÐȨͼ±»¼ò³ÆÎª¡¾Íø¡¿¡£ + * ÎÞÏòͼ/ÍøÖеĶ¥µã¹ØÏµ±»³ÆÎª¡¾±ß¡¿£¬ÓÐÏòͼ/ÍøÖеĶ¥µã¹ØÏµ±»³ÆÎª¡¾»¡¡¿£¬²¢Çø·Ö»¡Í·Ó뻡β¡£ + * ʵ¼Ê±íÊöÖУ¬Î´±Ø»áÑϸñ×ñÊØÒÔÉÏÃüÃû¡£ + * + * µ±Ç°½á¹¹Êʺϴ洢±ß/»¡±È½ÏÏ¡ÊèµÄͼ/Íø¡£ + * + * ¡ï ²åÈë±ß/»¡µÄÐÅϢʱ£¬ÕâÀïµÄʵÏÖÊǰ´"ÉýÐò"²åÈëµÄ£¬ÕâʹµÃ²åÈëµÄ»¡Êǰ´"ÉýÐò"ÅÅÁеġ£ + */ + + +/* ºê¶¨Òå */ +#define MAX_VERTEX_NUM 26 // ×î´ó¶¥µã¸öÊý + + +// ͼµÄÀàÐÍ +typedef enum { + DG, // 0-ÓÐÏòͼ + DN, // 1-ÓÐÏòÍø(´øÈ¨Öµ) + UDG, // 2-ÎÞÏòͼ + UDN // 3-ÎÞÏòÍø(´øÈ¨Öµ) +} GraphKind; + +// ¶¥µãÀàÐÍ +typedef char VertexType; + +// ±ß/»¡µÄÏà¹Ø¸½¼ÓÐÅÏ¢ +typedef struct { + /* + * ×¢£º + * ½Ì²ÄÖиø³öµÄ½á¹¹Ö»¿¼ÂÇÁËÎÞȨͼ£¬¶øÃ»¿¼ÂÇÓÐȨͼ(Íø)¡£ + * ÕâÀïΪÁ˰ѡ°Íø¡±µÄÇéÐÎÒ²¿¼ÂǽøÈ¥£¬ÌØÔÚ¸½¼ÓÐÅÏ¢ÖÐÔö¼ÓÁË"È¨ÖØ"ÊôÐÔ¡£ + */ + int weight; +} InfoType; + +/* ±ß/»¡½áµã */ +typedef struct ArcNode { + int adjvex; // ¸Ã»¡ËùÖ¸ÏòµÄ¶¥µãµÄλÖà + struct ArcNode* nextarc; // Ö¸ÏòÏÂÒ»Ìõ»¡µÄÖ¸Õë + InfoType* info; // »¡µÄ¸½¼ÓÐÅÏ¢£¬Í¨³£ºöÂÔ +} ArcNode; + +// ÿ¸öÁ´±íµÄÍ·½áµã +typedef struct VNode { + VertexType data; // ¶¥µãÐÅÏ¢ + ArcNode* firstarc; // Ö¸ÏòµÚÒ»ÌõÒÀ¸½¸Ã¶¥µãµÄ»¡µÄÖ¸Õë +} VNode; + +/* ͼµÄÁÚ½Ó±í´æ´¢±íʾÀàÐͶ¨Òå */ +typedef struct { + VNode vertices[MAX_VERTEX_NUM]; // ÁÚ½Ó±í + int vexnum, arcnum; // ͼ/ÍøµÄ¶¥µãÊýºÍ»¡Êý + GraphKind kind; // ͼµÄÀàÐͱêÖ¾ +} ALGraph; + + +// ±ß/»¡ÉÏÊÇ·ñ´æÔÚ¸½¼ÓÐÅÏ¢ +extern Boolean IncInfo; + + +/* + * ´´½¨ + * + *¡¾±¸×¢¡¿ + * + * ½Ì²ÄÖÐĬÈÏ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý¡£ + * ÕâÀïΪÁË·½±ã²âÊÔ£¬±ÜÃâÿ´ÎÔËÐж¼ÊÖ¶¯ÊäÈëÊý¾Ý£¬ + * Òò¶øÔÊÐíÑ¡Ôñ´ÓÔ¤ÉèµÄÎļþpathÖжÁÈ¡²âÊÔÊý¾Ý¡£ + * + * Èç¹ûÐèÒª´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý£¬ÔòpathΪNULL£¬»òpath[kind]Ϊ""¡£ + * Èç¹ûÐèÒª´ÓÎļþÖжÁÈ¡Êý¾Ý£¬ÔòÐèÒªÔÚpathÖÐÌîдÎļþÃûÐÅÏ¢¡£ + */ +Status CreateGraph(ALGraph* G, char* path[]); + +/* + * ¹¹ÔìÓÐÏòͼ + */ +static Status CreateDG(ALGraph* G); + +/* + * ¼Èë±ß/»¡µÄÏà¹Ø¸½¼ÓÐÅÏ¢ + */ +static void Input(ALGraph G, InfoType** info); + +/* + * ²éÕÒ + * + * ·µ»Ø¶¥µãuÔÚͼ/ÍøÖеÄλÖà + */ +int LocateVex(ALGraph G, VertexType u); + +/* + * ¹¹ÔìÒ»¸ö±ß/»¡½áµã(½öÏÞÄÚ²¿Ê¹ÓÃ) + */ +static ArcNode* newArcNodePtr(int adjvex, ArcNode* nextarc, InfoType* info); + +/* + * ²åÈë±ß/»¡ + * + * Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬Ôò²åÈëÒ»Ìõ»¡ÐèÒªÔö¼ÓÁ½¸ö¶¥µã¹ØÏµ£¬µ«»¡µÄÊýÁ¿Ö»ÔöÒ»¡£ + * ¶ÔÓÚͼ/ÍøÀ´Ëµ£¬¿ÉÒÔÔڿɱä²ÎÊýÖÐÁгö±ß/»¡µÄ¸½¼ÓÐÅÏ¢¡£ + * + * ×¢£º´Ë´¦½ÓÊյIJÎÊýÓëMGraphÓÐЩ²»Ò»Ñù£ºÍøµÄ¸½¼ÓÐÅÏ¢Öаüº¬Á˸÷Ìõ±ß/»¡µÄȨֵ¡£ + */ +Status InsertArc(ALGraph* G, VertexType v, VertexType w, ...); + +/* + * ÒÔͼÐλ¯ÐÎʽÊä³öµ±Ç°½á¹¹ + */ +void PrintGraph(ALGraph G); + +#endif diff --git a/Dev-C++/ExerciseBook/07.36-07.37/SqStack.cpp b/Dev-C++/ExerciseBook/07.36-07.37/SqStack.cpp new file mode 100644 index 0000000..f056778 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.36-07.37/SqStack.cpp @@ -0,0 +1,90 @@ +/*========================= + * Õ»µÄ˳Ðò´æ´¢½á¹¹£¨Ë³ÐòÕ»£© + ==========================*/ + +#include "SqStack.h" //**¡ø03 Õ»ºÍ¶ÓÁÐ**// + +/* + * ³õʼ»¯ + * + * ¹¹ÔìÒ»¸ö¿ÕÕ»¡£³õʼ»¯³É¹¦Ôò·µ»ØOK£¬·ñÔò·µ»ØERROR¡£ + */ +Status InitStack(SqStack* S) { + if(S == NULL) { + return ERROR; + } + + (*S).base = (SElemType*) malloc(STACK_INIT_SIZE * sizeof(SElemType)); + if((*S).base == NULL) { + exit(OVERFLOW); + } + + (*S).top = (*S).base; + (*S).stacksize = STACK_INIT_SIZE; + + return OK; +} + +/* + * ÅÐ¿Õ + * + * ÅжÏ˳ÐòÕ»ÖÐÊÇ·ñ°üº¬ÓÐЧÊý¾Ý¡£ + * + * ·µ»ØÖµ£º + * TRUE : ˳ÐòջΪ¿Õ + * FALSE: ˳ÐòÕ»²»Îª¿Õ + */ +Status StackEmpty(SqStack S) { + if(S.top == S.base) { + return TRUE; + } else { + return FALSE; + } +} + +/* + * ÈëÕ» + * + * ½«ÔªËØeѹÈëµ½Õ»¶¥¡£ + */ +Status Push(SqStack* S, SElemType e) { + if(S == NULL || (*S).base == NULL) { + return ERROR; + } + + // Õ»Âúʱ£¬×·¼Ó´æ´¢¿Õ¼ä + if((*S).top - (*S).base >= (*S).stacksize) { + (*S).base = (SElemType*) realloc((*S).base, ((*S).stacksize + STACKINCREMENT) * sizeof(SElemType)); + if((*S).base == NULL) { + exit(OVERFLOW); // ´æ´¢·ÖÅäʧ°Ü + } + + (*S).top = (*S).base + (*S).stacksize; + (*S).stacksize += STACKINCREMENT; + } + + // ½øÕ»Ïȸ³Öµ£¬Õ»¶¥Ö¸ÕëÔÙ×ÔÔö + *(S->top++) = e; + + return OK; +} + +/* + * ³öÕ» + * + * ½«Õ»¶¥ÔªËص¯³ö£¬²¢ÓÃe½ÓÊÕ¡£ + */ +Status Pop(SqStack* S, SElemType* e) { + if(S == NULL || (*S).base == NULL) { + return ERROR; + } + + if((*S).top == (*S).base) { + return ERROR; + } + + // ³öÕ»Õ»¶¥Ö¸ÕëÏȵݼõ£¬ÔÙ¸³Öµ + *e = *(--(*S).top); + + return OK; +} diff --git a/Dev-C++/ExerciseBook/07.36-07.37/SqStack.h b/Dev-C++/ExerciseBook/07.36-07.37/SqStack.h new file mode 100644 index 0000000..a8fe835 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.36-07.37/SqStack.h @@ -0,0 +1,59 @@ +/*========================= + * Õ»µÄ˳Ðò´æ´¢½á¹¹£¨Ë³ÐòÕ»£© + ==========================*/ + +#ifndef SQSTACK_H +#define SQSTACK_H + +#include +#include // Ìṩmalloc¡¢realloc¡¢free¡¢exitÔ­ÐÍ +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// + +/* ºê¶¨Òå */ +#define STACK_INIT_SIZE 100 // ˳ÐòÕ»´æ´¢¿Õ¼äµÄ³õʼ·ÖÅäÁ¿ +#define STACKINCREMENT 10 // ˳ÐòÕ»´æ´¢¿Õ¼äµÄ·ÖÅäÔöÁ¿ + +/* ˳ÐòÕ»ÔªËØÀàÐͶ¨Òå */ +typedef int SElemType; + +// ˳ÐòÕ»ÔªËØ½á¹¹ +typedef struct { + SElemType* base; // Õ»µ×Ö¸Õë + SElemType* top; // Õ»¶¥Ö¸Õë + int stacksize; // µ±Ç°ÒÑ·ÖÅäµÄ´æ´¢¿Õ¼ä£¬ÒÔÔªËØÎªµ¥Î» +} SqStack; + + +/* + * ³õʼ»¯ + * + * ¹¹ÔìÒ»¸ö¿ÕÕ»¡£³õʼ»¯³É¹¦Ôò·µ»ØOK£¬·ñÔò·µ»ØERROR¡£ + */ +Status InitStack(SqStack* S); + +/* + * ÅÐ¿Õ + * + * ÅжÏ˳ÐòÕ»ÖÐÊÇ·ñ°üº¬ÓÐЧÊý¾Ý¡£ + * + * ·µ»ØÖµ£º + * TRUE : ˳ÐòջΪ¿Õ + * FALSE: ˳ÐòÕ»²»Îª¿Õ + */ +Status StackEmpty(SqStack S); + +/* + * ÈëÕ» + * + * ½«ÔªËØeѹÈëµ½Õ»¶¥¡£ + */ +Status Push(SqStack* S, SElemType e); + +/* + * ³öÕ» + * + * ½«Õ»¶¥ÔªËص¯³ö£¬²¢ÓÃe½ÓÊÕ¡£ + */ +Status Pop(SqStack* S, SElemType* e); + +#endif diff --git a/Dev-C++/ExerciseBook/07.36-07.37/TestData_DG.txt b/Dev-C++/ExerciseBook/07.36-07.37/TestData_DG.txt new file mode 100644 index 0000000..a240ed8 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.36-07.37/TestData_DG.txt @@ -0,0 +1,6 @@ +ͼÀàÐÍ¡ú0£¨ÓÐÏòͼ£© +¶¥µãÊý¡ú12 +»¡Êý¡ú16 +»¡ÊÇ·ñ´øÓÐÆäËûÐÅÏ¢¡ú0 +¶¥µã¼¯¡ú¡¾A£¬B£¬C£¬D£¬E£¬F£¬G£¬H£¬I£¬J£¬K£¬L¡¿ +»¡µÄ¼¯ºÏ¡ú¡¾F£¬J¡¿¡¾F£¬B¡¿¡¾F£¬C¡¿¡¾F£¬A¡¿¡¾B£¬C¡¿¡¾J£¬I¡¿¡¾C£¬I¡¿¡¾C£¬H¡¿¡¾I£¬H¡¿¡¾C£¬G¡¿¡¾D£¬A¡¿¡¾D£¬L¡¿¡¾L£¬A¡¿¡¾D£¬K¡¿¡¾K£¬E¡¿¡¾E£¬G¡¿ \ No newline at end of file diff --git a/Dev-C++/ExerciseBook/07.36-07.37/TopologicalSorting.cpp b/Dev-C++/ExerciseBook/07.36-07.37/TopologicalSorting.cpp new file mode 100644 index 0000000..82001f5 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.36-07.37/TopologicalSorting.cpp @@ -0,0 +1,96 @@ +/*======================= + * AOV-Íø(ÓÐÏòͼ)µÄÍØÆËÅÅÐò + * + * °üº¬Ëã·¨: 7.12 + ========================*/ + +#include "TopologicalSorting.h" + +/* + * ¨€¨€¨€¨€¨€¨€¨€¨€ Ëã·¨7.12 ¨€¨€¨€¨€¨€¨€¨€¨€ + * + * Èç¹ûÓÐÏòͼGÎÞ»ØÂ·£¬ÔòÊä³öËüµÄÒ»¸öÍØÆËÐòÁв¢·µ»ØOK£»·ñÔò£¬·µ»ØFALSE¡£ + * ÍØÆËÐòÁÐͨ³£²»Î¨Ò»£¬µ«ÊDZØÐ뱣֤ijЩ¹Ø¼ü½ÚµãµÄÏȺó´ÎÐò¡£ + * + * ×¢£ºÓë½Ì²Ä²»Í¬Ö®´¦ÔÚÓÚ£¬´Ë´¦Ôö¼ÓÁËÒ»¸ötopoÊý×é×ö²ÎÊý¡£ + * ¡¡¡¡¶ÔÓÚÇó³öµÄÍØÆËÐòÁУ¬²»»áÖ±½ÓÊä³ö£¬¶øÊǻỺ´æµ½topoÖС£ + * ¡¡¡¡ÕâÑùµÄ×öµÄÄ¿µÄÊǺóÐøµÄϰÌâÖлáÓжദÓõ½¸ÃÍØÆËÐòÁС£ + */ +Status TopologicalSort(ALGraph G, int topo[MAX_VERTEX_NUM]) { + int i, k, count; + int indegree[MAX_VERTEX_NUM]; + SqStack S; + ArcNode* p; + + // ¶Ô¸÷¶¥µãÇóÈë¶È + FindInDegree(G, indegree); + + // ³õʼ»¯ÁãÈë¶È¶¥µãÕ» + InitStack(&S); + + // ½¨Á¢Èë¶ÈΪ0µÄ¶¥µãÕ» + for(i = 0; i < G.vexnum; i++) { + // ½«Èë¶ÈΪ0µÄ¶¥µãÌí¼Óµ½Õ»ÖÐ + if(indegree[i] == 0) { + Push(&S, i); + } + } + + // ¶ÔÍØÆËÐòÁÐÖеĶ¥µã¼ÆÊý + count = 0; + + // ±éÀú¶¥µãÕ» + while(!StackEmpty(S)) { + // »ñȡһ¸öÁãÈë¶È¶¥µã + Pop(&S, &i); + + // ½«¸÷¶¥µãµÄÐòºÅÔÝ´æÆðÀ´ + topo[count++] = i; + + // ±éÀúiºÅ¶¥µãµÄÁÚ½Óµã + for(p = G.vertices[i].firstarc; p != NULL; p = p->nextarc) { + // »ñÈ¡¶¥µãÐòºÅ + k = p->adjvex; + + /* + * ½«iºÅ¶¥µãÿ¸öÁÚ½ÓµãµÄÈë¶È¼õÒ»£¬ÕâÏ൱ÓÚÇжÎiºÅ¶¥µãµ½ÆäËüÁÚ½ÓµãµÄÁªÏµ¡£ + * Èç¹û³öÏÖÁËеÄÈë¶ÈΪ0µÄ¶¥µã£¬¼ÌÐø½«ÆäÈëÕ»¡£ + */ + if((--indegree[k]) == 0) { + Push(&S, k); + } + } + } + + // Èç¹ûÓöµ½ÁË»ØÂ·£¬Ôò·µ»ØERROR + if(count < G.vexnum) { + return ERROR; + } else { + return OK; + } +} + +/* + * ¼ÆËã¸÷¶¥µãµÄÈë¶È + */ +static void FindInDegree(ALGraph G, int indegree[MAX_VERTEX_NUM]) { + int i; + ArcNode* p; + + // ³õʼ»¯ËùÓж¥µãµÄÈë¶ÈΪ0 + for(i = 0; i < G.vexnum; i++) { + indegree[i] = 0; + } + + // ±éÀúËùÓж¥µã + for(i = 0; i < G.vexnum; i++) { + // Ö¸Ïò¸Ã¶¥µãµÄÊ׸öÁÚ½Óµã + p = G.vertices[i].firstarc; + + // ±éÀú¸Ã¶¥µãµÄËùÓÐÁڽӵ㣬ͳ¼Æ¸÷¶¥µãµÄÈë¶È + while(p != NULL) { + indegree[p->adjvex]++; + p = p->nextarc; + } + } +} diff --git a/Dev-C++/ExerciseBook/07.36-07.37/TopologicalSorting.h b/Dev-C++/ExerciseBook/07.36-07.37/TopologicalSorting.h new file mode 100644 index 0000000..3fae677 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.36-07.37/TopologicalSorting.h @@ -0,0 +1,28 @@ +/*======================= + * AOV-Íø(ÓÐÏòͼ)µÄÍØÆËÅÅÐò + * + * °üº¬Ëã·¨: 7.12 + ========================*/ + +#ifndef TOPOLOGICALSORTING_H +#define TOPOLOGICALSORTING_H + +#include +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// +#include "SqStack.h" //**¡ø03 Õ»ºÍ¶ÓÁÐ**// +#include "ALGraph.h" //**¡ø07 ͼ**// + +/* + * ¨€¨€¨€¨€¨€¨€¨€¨€ Ëã·¨7.12 ¨€¨€¨€¨€¨€¨€¨€¨€ + * + * Èç¹ûÓÐÏòͼGÎÞ»ØÂ·£¬ÔòÊä³öËüµÄÒ»¸öÍØÆËÐòÁв¢·µ»ØOK£»·ñÔò£¬·µ»ØFALSE¡£ + * ÍØÆËÐòÁÐͨ³£²»Î¨Ò»£¬µ«ÊDZØÐ뱣֤ijЩ¹Ø¼ü½ÚµãµÄÏȺó´ÎÐò¡£ + */ +Status TopologicalSort(ALGraph G, int topo[MAX_VERTEX_NUM]); + +/* + * ¼ÆËã¸÷¶¥µãµÄÈë¶È + */ +static void FindInDegree(ALGraph G, int indegree[MAX_VERTEX_NUM]); + +#endif diff --git a/Dev-C++/ExerciseBook/07.38/07.38.cpp b/Dev-C++/ExerciseBook/07.38/07.38.cpp new file mode 100644 index 0000000..3f82ce7 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.38/07.38.cpp @@ -0,0 +1,110 @@ +#include +#include "SqList.h" +#include "ALGraph.h" + +/* + * »ñÈ¡´æ´¢ÔÚÓÐÏòÎÞ»·Í¼Öеıí´ïʽµÄÄæ²¨À¼Ê½ + * + * ×¢£º±í´ïʽ½á¹¹²Î¿¼½Ì²Ä²åͼ7.23 + */ +void Algo_7_38(ALGraph G); + +/* + * ´Ó¶¥µãv³ö·¢»ñÈ¡ÓÐÏòͼÖд洢µÄ±í´ïʽµÄÄæ²¨À¼Ê½¡£ + * ÇóÈ¡µÄÄæ²¨À¼Ê½»á´æ´¢ÔÚRPNÖС£ + */ +static void AntiPolandFormula_7_38(ALGraph G, int v, SqList* RPN); + + +int main(int argc, char* argv[]) { + ALGraph G; + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ´´½¨²¢´òÓ¡ÓÐÏòÍø... \n"); + { + char* path[4]; + + path[0] = "TestData_DG.txt"; + path[1] = ""; + path[2] = ""; + path[3] = ""; + + CreateGraph(&G, path); + PrintGraph(G); + printf("\n"); + } + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ÇóÈ¡ÓÐÏòÍøÖд洢µÄ±í´ïʽµÄÄæ²¨À¼Ê½... \n"); + { + Algo_7_38(G); + printf("\n"); + } + + return 0; +} + + +/* + * »ñÈ¡´æ´¢ÔÚÓÐÏòÎÞ»·Í¼Öеıí´ïʽµÄÄæ²¨À¼Ê½ + * + * ×¢£º±í´ïʽ½á¹¹²Î¿¼½Ì²Ä²åͼ7.23 + */ +void Algo_7_38(ALGraph G) { + int i, root; + int indegree[MAX_VERTEX_NUM]; // ËùÓж¥µãµÄÈë¶ÈÐÅÏ¢ + ArcNode* p; + SqList RPN; // ´æ´¢Ä沨À¼±í´ïʽ + ElemType e; + + // ³õʼ»¯ËùÓж¥µãµÄÈë¶ÈΪ0 + for(i = 0; i < G.vexnum; i++) { + indegree[i] = 0; + } + + // ±éÀúËùÓж¥µã + for(i = 0; i < G.vexnum; i++) { + // Ö¸Ïò¸Ã¶¥µãµÄÊ׸öÁÚ½Óµã + p = G.vertices[i].firstarc; + + // ±éÀú¸Ã¶¥µãµÄËùÓÐÁڽӵ㣬ͳ¼Æ¸÷¶¥µãµÄÈë¶È + while(p != NULL) { + indegree[p->adjvex]++; + p = p->nextarc; + } + } + + // ²éÕÒµ½¸ù½áµã + for(i = 0; i < G.vexnum; i++) { + if(indegree[i] == 0) { + root = i; + break; + } + } + + // ³õʼ»¯³¤¶ÈΪ0µÄÏßÐÔ±í + InitList(&RPN); + + // ´ÓÓÐÏòÎÞ»·Í¼µÄ¸ù½áµã³ö·¢£¬Í¨¹ýβµÝ¹é»ñÈ¡µ½ÆäÖд洢µÄ±í´ïʽµÄÄæ²¨À¼Ê½ + AntiPolandFormula_7_38(G, root, &RPN); + + for(i = 1; i <= ListLength(RPN); i++) { + GetElem(RPN, i, &e); + printf("%c", ops[e]); + } + printf("\n"); +} + +/* + * ´Ó¶¥µãv³ö·¢»ñÈ¡ÓÐÏòͼÖд洢µÄ±í´ïʽµÄÄæ²¨À¼Ê½¡£ + * ÇóÈ¡µÄÄæ²¨À¼Ê½»á´æ´¢ÔÚRPNÖС£ + */ +void AntiPolandFormula_7_38(ALGraph G, int v, SqList* RPN) { + ArcNode* r; + + // ÏȱéÀúÁÚ½Óµã + for(r = G.vertices[v].firstarc; r != NULL; r = r->nextarc) { + AntiPolandFormula_7_38(G, r->adjvex, RPN); + } + + // µ±Ã»ÓÐÁÚ½Óµã¿É±éÀúʱ£¬´æ´¢¸Ã¶¥µã + ListInsert(RPN, ListLength(*RPN) + 1, v); +} diff --git a/Dev-C++/ExerciseBook/07.38/07.38.dev b/Dev-C++/ExerciseBook/07.38/07.38.dev new file mode 100644 index 0000000..57573fe --- /dev/null +++ b/Dev-C++/ExerciseBook/07.38/07.38.dev @@ -0,0 +1,111 @@ +[Project] +FileName=07.38.dev +Name=07.38 +Type=1 +Ver=2 +ObjFiles= +Includes= +Libs= +PrivateResource= +ResourceIncludes= +MakeIncludes= +Compiler= +CppCompiler= +Linker= +IsCpp=0 +Icon= +ExeOutput= +ObjectOutput= +LogOutput= +LogOutputEnabled=0 +OverrideOutput=0 +OverrideOutputName= +HostApplication= +UseCustomMakefile=0 +CustomMakefile= +CommandLine= +Folders= +IncludeVersionInfo=0 +SupportXPThemes=0 +CompilerSet=1 +CompilerSettings=0000000000000000001000000 +UnitCount=6 + +[VersionInfo] +Major=1 +Minor=0 +Release=0 +Build=0 +LanguageID=1033 +CharsetID=1252 +CompanyName= +FileVersion= +FileDescription=Developed using the Dev-C++ IDE +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion= +AutoIncBuildNr=0 +SyncProduct=1 + +[Unit1] +FileName=07.38.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit2] +FileName=ALGraph.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit3] +FileName=ALGraph.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit4] +FileName=SqList.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit5] +FileName=SqList.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit6] +FileName=TestData_DG.txt +Folder= +Compile=0 +Link=0 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + diff --git a/Dev-C++/ExerciseBook/07.38/07.38.png b/Dev-C++/ExerciseBook/07.38/07.38.png new file mode 100644 index 0000000000000000000000000000000000000000..2b6df8a6e7f428f737000ebe395c8c43ff948fab GIT binary patch literal 27793 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 b*`=vzuIda`2N!sa*fsSBI?5G_R-yj|<&7Ks literal 0 HcmV?d00001 diff --git a/Dev-C++/ExerciseBook/07.38/ALGraph.cpp b/Dev-C++/ExerciseBook/07.38/ALGraph.cpp new file mode 100644 index 0000000..263a869 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.38/ALGraph.cpp @@ -0,0 +1,344 @@ +/*================== + * ͼµÄÁÚ½Ó±í´æ´¢±íʾ + ===================*/ + +#include "ALGraph.h" + +// ¼ÈëÊý¾ÝµÄÔ´Îļþ£»fpΪnullʱ£¬ËµÃ÷ÐèÒª´Ó¿ØÖÆÌ¨Â¼Èë +static FILE* fp = NULL; + +/* + * IncInfoָʾ¸Ãͼ/ÍøµÄ±ß/»¡ÉÏÊÇ·ñ´æÔÚ¸½¼ÓÐÅÏ¢¡£ + * Èç¹ûÆäÖµ²»Îª0£¬Ôò±íʾÎÞ¸½¼ÓÐÅÏ¢£¬·ñÔò£¬±íʾ´æÔÚ¸½¼ÓÐÅÏ¢¡£ + */ +Boolean IncInfo = FALSE; + +// ·ÃÎʱêÖ¾Êý×飬¼Ç¼·ÃÎʹýµÄ¶¥µã +static Boolean visited[MAX_VERTEX_NUM]; + +// º¯Êý±äÁ¿ +static Status (* VisitFunc)(VertexType e); + +// Óë¶¥µãÒ»Ò»¶ÔÓ¦µÄ²Ù×÷ÊýÓë²Ù×÷·û +char ops[MAX_VERTEX_NUM]; + + +/* + * ´´½¨ + * + *¡¾±¸×¢¡¿ + * + * ½Ì²ÄÖÐĬÈÏ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý¡£ + * ÕâÀïΪÁË·½±ã²âÊÔ£¬±ÜÃâÿ´ÎÔËÐж¼ÊÖ¶¯ÊäÈëÊý¾Ý£¬ + * Òò¶øÔÊÐíÑ¡Ôñ´ÓÔ¤ÉèµÄÎļþpathÖжÁÈ¡²âÊÔÊý¾Ý¡£ + * + * Èç¹ûÐèÒª´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý£¬ÔòpathΪNULL£¬»òpath[kind]Ϊ""¡£ + * Èç¹ûÐèÒª´ÓÎļþÖжÁÈ¡Êý¾Ý£¬ÔòÐèÒªÔÚpathÖÐÌîдÎļþÃûÐÅÏ¢¡£ + */ +Status CreateGraph(ALGraph* G, char* path[]) { + int readFromConsole; // ÊÇ·ñ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý + int kind; + Status flag; + + // ¡ï¡ï¡ï´Ë´¦¹Ì¶¨ÎªÓÐÏòͼ + kind = 0; + + // Èç¹ûûÓÐÎļþ·¾¶ÐÅÏ¢£¬Ôò´Ó¿ØÖÆÌ¨¶ÁÈ¡ÊäÈë + readFromConsole = (path == NULL) || strcmp(path[kind], "") == 0; + + // ÐèÒª´ÓÎļþ¶ÁÈ¡ + if(readFromConsole) { + (*G).kind = GraphKind(kind); // ¼Ç¼ͼ/ÍøµÄÀàÐÍ + } else { + // ´ò¿ªÎļþ£¬×¼±¸¶ÁÈ¡²âÊÔÊý¾Ý + fp = fopen(path[kind], "r"); + if(fp == NULL) { + return ERROR; + } + + // ¼ÈëͼµÄÀàÐÍ + ReadData(fp, "%d", &((*G).kind)); + } + + // Ëæ»ú´´½¨ÓÐÏòͼ/Íø»òÎÞÏòͼ/ÍøµÄÒ»ÖÖ + switch((*G).kind) { + case DG: + flag = CreateDG(G); + break; + default: + flag = ERROR; + break; + } + + if(fp != NULL) { + fclose(fp); + fp = NULL; + } + + return flag; +} + +/* + * ¹¹ÔìÓÐÏòͼ + */ +static Status CreateDG(ALGraph* G) { + int i, k; + int vexnum, arcnum; + VertexType v1, v2; + InfoType* info = NULL; + + (*G).vexnum = (*G).arcnum = 0; + + if(fp == NULL) { + printf("ÇëÊäÈëÓÐÏòͼµÄ¶¥µãÊý£º"); + scanf("%d", &vexnum); + printf("ÇëÊäÈëÓÐÏòͼµÄ»¡Êý£º"); + scanf("%d", &arcnum); + printf("¸ÃÓÐÏòͼµÄ»¡ÉÏÊÇ·ñ°üº¬ÆäËû¸½¼ÓÐÅÏ¢(0-²»°üº¬©¦1-°üº¬)£º"); + scanf("%d", &IncInfo); + + // ¼Èë¶¥µã¼¯ + printf("Çë¼Èë %d ¸ö¶¥µã£¬²»Í¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º", vexnum); + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(stdin); + scanf("%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } else { + ReadData(fp, "%d", &vexnum); // ¼Èë¶¥µãÊý + ReadData(fp, "%d", &arcnum); // ¼È뻡Êý + ReadData(fp, "%d", &IncInfo); // Åжϻ¡ÉÏÊÇ·ñ°üº¬¸½¼ÓÐÅÏ¢ + + // ¼Èë¶¥µã¼¯ + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(fp); + ReadData(fp, "%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } + + // ½öÔÚ¿ØÖÆÌ¨Â¼ÈëÐÅϢʱÊä³ö´ËÌáʾ + if(fp == NULL && arcnum != 0) { + printf("ÇëΪÓÐÏòͼÒÀ´Î¼Èë %d Ìõ»¡µÄÐÅÏ¢£¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º\n", arcnum); + } + + // ¼È뻡µÄÐÅÏ¢ + for(k = 0; k < arcnum; k++) { + if(fp == NULL) { + printf("µÚ %2d Ìõ»¡£º", k + 1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v2); + } else { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + skipBlank(fp); + ReadData(fp, "%c%c", &v1, &v2); + } + + // Èç¹ûÐèҪ¼È뻡µÄÆäËû¸½¼ÓÐÅÏ¢ + if(IncInfo) { + // ×îºó¼È븽¼ÓÐÅÏ¢ + Input(*G, &info); + } + + // ²åÈ뻡 + InsertArc(G, v1, v2, info); + } + + // ¼ÈëÓë¶¥µã¶ÔÓ¦µÄ²Ù×÷ÊýÓë²Ù×÷·û + if(fp == NULL) { + printf("Çë¼Èë %d ¸öÓë¶¥µãÒ»Ò»¶ÔÓ¦µÄ²Ù×÷Êý/²Ù×÷·û£¬²»Í¬²Ù×÷Êý/²Ù×÷·ûÖ®¼äÓÿոñ¸ô¿ª£º", vexnum); + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(stdin); + scanf("%c", &(ops[i])); + } + } else { + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(fp); + ReadData(fp, "%c", &(ops[i])); + } + } + + // ´ÓÎļþÖжÁÈ¡Êý¾Ýʱ£¬×îºóÆäʵӦµ±ÅжÏÒ»ÏÂÊÇ·ñ¶Áµ½ÁË×ã¹»µÄÐÅÏ¢ + return OK; +} + +/* + * ¼Èë±ß/»¡µÄÏà¹Ø¸½¼ÓÐÅÏ¢ + */ +static void Input(ALGraph G, InfoType** info) { + int weight; + + // ÔÚ"Íø"µÄÇéÐÎÏÂÐèҪ¼ÈëȨֵÐÅÏ¢ + if(G.kind == DN || G.kind == UDN) { + *info = (InfoType*) malloc(sizeof(InfoType)); + + if(fp == NULL) { + scanf("%d", &weight); + } else { + ReadData(fp, "%d", &weight); + } + + (*info)->weight = weight; + } +} + +/* + * ²éÕÒ + * + * ·µ»Ø¶¥µãuÔÚͼ/ÍøÖеÄλÖà + */ +int LocateVex(ALGraph G, VertexType u) { + int i; + + for(i = 0; i < G.vexnum; i++) { + if(G.vertices[i].data == u) { + return i; + } + } + + return -1; +} + +/* + * ¹¹ÔìÒ»¸ö±ß/»¡½áµã(½öÏÞÄÚ²¿Ê¹ÓÃ) + */ +static ArcNode* newArcNodePtr(int adjvex, ArcNode* nextarc, InfoType* info) { + ArcNode* p = (ArcNode*) malloc(sizeof(ArcNode)); + if(!p) { + exit(OVERFLOW); + } + + p->adjvex = adjvex; + + p->nextarc = nextarc; + + p->info = info; + + return p; +} + +/* + * ²åÈë±ß/»¡ + * + * Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬Ôò²åÈëÒ»Ìõ»¡ÐèÒªÔö¼ÓÁ½¸ö¶¥µã¹ØÏµ£¬µ«»¡µÄÊýÁ¿Ö»ÔöÒ»¡£ + * ¶ÔÓÚͼ/ÍøÀ´Ëµ£¬¿ÉÒÔÔڿɱä²ÎÊýÖÐÁгö±ß/»¡µÄ¸½¼ÓÐÅÏ¢¡£ + * + * ×¢£º´Ë´¦½ÓÊյIJÎÊýÓëMGraphÓÐЩ²»Ò»Ñù£ºÍøµÄ¸½¼ÓÐÅÏ¢Öаüº¬Á˸÷Ìõ±ß/»¡µÄȨֵ¡£ + */ +Status InsertArc(ALGraph* G, VertexType v, VertexType w, ...) { + int tail, head, k, count; + ArcNode* r; + ArcNode* pre; + Boolean overlay = FALSE; // ÊÇ·ñΪ¸²¸ÇÌí¼Ó + InfoType* info = NULL; // ±ß/»¡µÄ¸½¼ÓÐÅÏ¢ + va_list ap; + + tail = LocateVex(*G, v); // »ñÈ¡¶¥µãvÔÚ¶¥µã¼¯ÖеÄλÖà + if(tail == -1) { + return ERROR; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + head = LocateVex(*G, w); // »ñÈ¡¶¥µãwÔÚ¶¥µã¼¯ÖеÄλÖà + if(head == -1) { + return ERROR; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + // ¾Ü¾ø»· + if(tail == head) { + return ERROR; + } + + // Èç¹û±ß/»¡ÉÏ´æÔÚ¸½¼ÓÐÅÏ¢ + if(IncInfo) { + va_start(ap, w); // ÔÚwºó²éѯÊ׸ö¿É±ä²ÎÊý + info = va_arg(ap, InfoType*); // »ñÈ¡¸½¼ÓÐÅÏ¢ + va_end(ap); + } + + /* ½ÓÏÂÀ´£¬ÐèÒª²éÕÒºÏÊʵIJåÈëλÖà */ + + for(count = 0; count < 2; count++) { + pre = NULL; + // Ö¸ÏòÒÔtailΪβµÄÊ×Ìõ±ß/»¡ + r = G->vertices[tail].firstarc; + while(r != NULL && r->adjvex < head) { + pre = r; + r = r->nextarc; + } + + // Óöµ½ÁËÏàͬλÖõĽáµã + if(r != NULL && r->adjvex == head) { + r->info = info; // ¸´Óøýáµã + overlay = TRUE; // ·¢ÉúÁ˸²¸Ç + } else { + if(pre == NULL) { + G->vertices[tail].firstarc = newArcNodePtr(head, r, info); + } else { + pre->nextarc = newArcNodePtr(head, r, info); + } + } + + // Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬ÐèÒª¿¼ÂǶԳÆÐÔ + if((G->kind == UDG || G->kind == UDN) && tail != head) { + // µßµ¹iºÍj + k = tail; + tail = head; + head = k; + } else { + break; // Èç¹ûÊÇÓÐÏòµÄ£¬¿ÉÒÔ½áÊøÁË + } + } + + // ÔڷǸ²¸ÇµÄÇéÐÎÏ£¬²Å¿¼ÂǸüбß/»¡µÄÊýÁ¿ + if(!overlay) { + (*G).arcnum++; // ²»ÂÛÓÐÏòÎÞÏò£¬±ß/»¡ÊýÖ»ÔöÒ» + } + + return OK; +} + +/* + * ÒÔͼÐλ¯ÐÎʽÊä³öµ±Ç°½á¹¹ + */ +void PrintGraph(ALGraph G) { + int i; + ArcNode* p; + + if(G.vexnum == 0) { + printf("¿Õͼ£¬ÎÞÐè´òÓ¡£¡\n"); + return; + } + + printf("µ±Ç°Í¼/Íø°üº¬ %2d ¸ö¶¥µã£¬ %2d Ìõ±ß/»¡...\n", G.vexnum, G.arcnum); + + for(i = 0; i < G.vexnum; i++) { + printf("%c ===> ", G.vertices[i].data); + + p = G.vertices[i].firstarc; + while(p != NULL) { + if(IncInfo == 0) { + printf("%c ", G.vertices[p->adjvex].data); + + // ¶ÔÓÚÍø£¬»á´ÓÆä¸½¼ÓÐÅÏ¢ÖлñÈ¡µ½È¨Öµ + } else { + printf("%c[%2d] ", G.vertices[p->adjvex].data, p->info->weight); + } + + p = p->nextarc; + + if(p != NULL) { + printf("- "); + } + } + + printf("\n"); + } +} diff --git a/Dev-C++/ExerciseBook/07.38/ALGraph.h b/Dev-C++/ExerciseBook/07.38/ALGraph.h new file mode 100644 index 0000000..2656c16 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.38/ALGraph.h @@ -0,0 +1,131 @@ +/*================== + * ͼµÄÁÚ½Ó±í´æ´¢±íʾ + ===================*/ + +#ifndef ALGRAPH_H +#define ALGRAPH_H + +#include +#include // Ìṩmemset¡¢strcmp Ô­ÐÍ +#include // Ìṩºêva_list¡¢va_start¡¢va_arg¡¢va_end +#include // Ìṩmalloc¡¢realloc¡¢free¡¢exitÔ­ÐÍ +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// + +/* + * ×¢£º + * + * ͨ³£À´½²£¬ÎÞȨͼ±»¼ò³ÆÎª¡¾Í¼¡¿£¬ÓÐȨͼ±»¼ò³ÆÎª¡¾Íø¡¿¡£ + * ÎÞÏòͼ/ÍøÖеĶ¥µã¹ØÏµ±»³ÆÎª¡¾±ß¡¿£¬ÓÐÏòͼ/ÍøÖеĶ¥µã¹ØÏµ±»³ÆÎª¡¾»¡¡¿£¬²¢Çø·Ö»¡Í·Ó뻡β¡£ + * ʵ¼Ê±íÊöÖУ¬Î´±Ø»áÑϸñ×ñÊØÒÔÉÏÃüÃû¡£ + * + * µ±Ç°½á¹¹Êʺϴ洢±ß/»¡±È½ÏÏ¡ÊèµÄͼ/Íø¡£ + * + * ¡ï ²åÈë±ß/»¡µÄÐÅϢʱ£¬ÕâÀïµÄʵÏÖÊǰ´"ÉýÐò"²åÈëµÄ£¬ÕâʹµÃ²åÈëµÄ»¡Êǰ´"ÉýÐò"ÅÅÁеġ£ + */ + + +/* ºê¶¨Òå */ +#define MAX_VERTEX_NUM 26 // ×î´ó¶¥µã¸öÊý + + +// ͼµÄÀàÐÍ +typedef enum { + DG, // 0-ÓÐÏòͼ + DN, // 1-ÓÐÏòÍø(´øÈ¨Öµ) + UDG, // 2-ÎÞÏòͼ + UDN // 3-ÎÞÏòÍø(´øÈ¨Öµ) +} GraphKind; + +// ¶¥µãÀàÐÍ +typedef char VertexType; + +// ±ß/»¡µÄÏà¹Ø¸½¼ÓÐÅÏ¢ +typedef struct { + /* + * ×¢£º + * ½Ì²ÄÖиø³öµÄ½á¹¹Ö»¿¼ÂÇÁËÎÞȨͼ£¬¶øÃ»¿¼ÂÇÓÐȨͼ(Íø)¡£ + * ÕâÀïΪÁ˰ѡ°Íø¡±µÄÇéÐÎÒ²¿¼ÂǽøÈ¥£¬ÌØÔÚ¸½¼ÓÐÅÏ¢ÖÐÔö¼ÓÁË"È¨ÖØ"ÊôÐÔ¡£ + */ + int weight; +} InfoType; + +/* ±ß/»¡½áµã */ +typedef struct ArcNode { + int adjvex; // ¸Ã»¡ËùÖ¸ÏòµÄ¶¥µãµÄλÖà + struct ArcNode* nextarc; // Ö¸ÏòÏÂÒ»Ìõ»¡µÄÖ¸Õë + InfoType* info; // »¡µÄ¸½¼ÓÐÅÏ¢£¬Í¨³£ºöÂÔ +} ArcNode; + +// ÿ¸öÁ´±íµÄÍ·½áµã +typedef struct VNode { + VertexType data; // ¶¥µãÐÅÏ¢ + ArcNode* firstarc; // Ö¸ÏòµÚÒ»ÌõÒÀ¸½¸Ã¶¥µãµÄ»¡µÄÖ¸Õë +} VNode; + +/* ͼµÄÁÚ½Ó±í´æ´¢±íʾÀàÐͶ¨Òå */ +typedef struct { + VNode vertices[MAX_VERTEX_NUM]; // ÁÚ½Ó±í + int vexnum, arcnum; // ͼ/ÍøµÄ¶¥µãÊýºÍ»¡Êý + GraphKind kind; // ͼµÄÀàÐͱêÖ¾ +} ALGraph; + + +// ±ß/»¡ÉÏÊÇ·ñ´æÔÚ¸½¼ÓÐÅÏ¢ +extern Boolean IncInfo; + +// Óë¶¥µãÒ»Ò»¶ÔÓ¦µÄ²Ù×÷ÊýÓë²Ù×÷·û +extern char ops[MAX_VERTEX_NUM]; + + +/* + * ´´½¨ + * + *¡¾±¸×¢¡¿ + * + * ½Ì²ÄÖÐĬÈÏ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý¡£ + * ÕâÀïΪÁË·½±ã²âÊÔ£¬±ÜÃâÿ´ÎÔËÐж¼ÊÖ¶¯ÊäÈëÊý¾Ý£¬ + * Òò¶øÔÊÐíÑ¡Ôñ´ÓÔ¤ÉèµÄÎļþpathÖжÁÈ¡²âÊÔÊý¾Ý¡£ + * + * Èç¹ûÐèÒª´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý£¬ÔòpathΪNULL£¬»òpath[kind]Ϊ""¡£ + * Èç¹ûÐèÒª´ÓÎļþÖжÁÈ¡Êý¾Ý£¬ÔòÐèÒªÔÚpathÖÐÌîдÎļþÃûÐÅÏ¢¡£ + */ +Status CreateGraph(ALGraph* G, char* path[]); + +/* + * ¹¹ÔìÓÐÏòͼ + */ +static Status CreateDG(ALGraph* G); + +/* + * ¼Èë±ß/»¡µÄÏà¹Ø¸½¼ÓÐÅÏ¢ + */ +static void Input(ALGraph G, InfoType** info); + +/* + * ²éÕÒ + * + * ·µ»Ø¶¥µãuÔÚͼ/ÍøÖеÄλÖà + */ +int LocateVex(ALGraph G, VertexType u); + +/* + * ¹¹ÔìÒ»¸ö±ß/»¡½áµã(½öÏÞÄÚ²¿Ê¹ÓÃ) + */ +static ArcNode* newArcNodePtr(int adjvex, ArcNode* nextarc, InfoType* info); + +/* + * ²åÈë±ß/»¡ + * + * Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬Ôò²åÈëÒ»Ìõ»¡ÐèÒªÔö¼ÓÁ½¸ö¶¥µã¹ØÏµ£¬µ«»¡µÄÊýÁ¿Ö»ÔöÒ»¡£ + * ¶ÔÓÚͼ/ÍøÀ´Ëµ£¬¿ÉÒÔÔڿɱä²ÎÊýÖÐÁгö±ß/»¡µÄ¸½¼ÓÐÅÏ¢¡£ + * + * ×¢£º´Ë´¦½ÓÊյIJÎÊýÓëMGraphÓÐЩ²»Ò»Ñù£ºÍøµÄ¸½¼ÓÐÅÏ¢Öаüº¬Á˸÷Ìõ±ß/»¡µÄȨֵ¡£ + */ +Status InsertArc(ALGraph* G, VertexType v, VertexType w, ...); + +/* + * ÒÔͼÐλ¯ÐÎʽÊä³öµ±Ç°½á¹¹ + */ +void PrintGraph(ALGraph G); + +#endif diff --git a/Dev-C++/ExerciseBook/07.38/SqList.cpp b/Dev-C++/ExerciseBook/07.38/SqList.cpp new file mode 100644 index 0000000..623d818 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.38/SqList.cpp @@ -0,0 +1,114 @@ +/*============================= + * ÏßÐÔ±íµÄ˳Ðò´æ´¢½á¹¹£¨Ë³Ðò±í£© + * + * °üº¬Ëã·¨: 2.3¡¢2.4¡¢2.5¡¢2.6 + =============================*/ + +#include "SqList.h" + +/* + * ¨€¨€¨€¨€¨€¨€¨€¨€ Ëã·¨2.3 ¨€¨€¨€¨€¨€¨€¨€¨€ + * + * ³õʼ»¯ + * + * ³õʼ»¯³É¹¦Ôò·µ»ØOK£¬·ñÔò·µ»ØERROR¡£ + */ +Status InitList(SqList* L) { + // ·ÖÅäÖ¸¶¨ÈÝÁ¿µÄÄڴ棬Èç¹û·ÖÅäʧ°Ü£¬Ôò·µ»ØNULL + (*L).elem = (ElemType*) malloc(LIST_INIT_SIZE * sizeof(ElemType)); + if((*L).elem == NULL) { + // ´æ´¢ÄÚ´æÊ§°Ü + exit(OVERFLOW); + } + + (*L).length = 0; // ³õʼ»¯Ë³Ðò±í³¤¶ÈΪ0 + (*L).listsize = LIST_INIT_SIZE; // ˳Ðò±í³õʼÄÚ´æ·ÖÅäÁ¿ + + return OK; // ³õʼ»¯³É¹¦ +} + +/* + * ¼ÆÊý + * + * ·µ»ØË³Ðò±í°üº¬µÄÓÐÐ§ÔªËØµÄÊýÁ¿¡£ + */ +int ListLength(SqList L) { + return L.length; +} + +/* + * ȡֵ + * + * »ñȡ˳Ðò±íÖеÚi¸öÔªËØ£¬½«Æä´æ´¢µ½eÖС£ + * Èç¹û¿ÉÒÔÕÒµ½£¬·µ»ØOK£¬·ñÔò£¬·µ»ØERROR¡£ + * + *¡¾±¸×¢¡¿ + * ½Ì²ÄÖÐiµÄº¬ÒåÊÇÔªËØÎ»Ö㬴Ó1¿ªÊ¼¼ÆÊý£¬µ«Õâ²»·ûºÏ±àÂëµÄͨÓÃÔ¼¶¨¡£ + * ͨ³££¬iµÄº¬ÒåÓ¦¸ÃÖ¸Ë÷Òý£¬¼´´Ó0¿ªÊ¼¼ÆÊý¡£ + */ +Status GetElem(SqList L, int i, ElemType* e) { + // ÒòΪiµÄº¬ÒåÊÇλÖã¬ËùÒÔÆäºÏ·¨·¶Î§ÊÇ£º[1, length] + if(i < 1 || i > L.length) { + return ERROR; //iÖµ²»ºÏ·¨ + } + + *e = L.elem[i - 1]; + + return OK; +} + +/* + * ¨€¨€¨€¨€¨€¨€¨€¨€ Ëã·¨2.4 ¨€¨€¨€¨€¨€¨€¨€¨€ + * + * ²åÈë + * + * Ïò˳Ðò±íµÚi¸öλÖÃÉϲåÈëe£¬²åÈë³É¹¦Ôò·µ»ØOK£¬·ñÔò·µ»ØERROR¡£ + * + *¡¾±¸×¢¡¿ + * ½Ì²ÄÖÐiµÄº¬ÒåÊÇÔªËØÎ»Ö㬴Ó1¿ªÊ¼¼ÆÊý + */ +Status ListInsert(SqList* L, int i, ElemType e) { + ElemType* newbase; + ElemType* p, * q; + + // È·±£Ë³Ðò±í½á¹¹´æÔÚ + if(L == NULL || (*L).elem == NULL) { + return ERROR; + } + + // iÖµÔ½½ç + if(i < 1 || i > (*L).length + 1) { + return ERROR; + } + + // Èô´æ´¢¿Õ¼äÒÑÂú£¬ÔòÔö¼Óпռä + if((*L).length >= (*L).listsize) { + // »ùÓÚÏÖÓпռäÀ©ÈÝ + newbase = (ElemType*) realloc((*L).elem, ((*L).listsize + LISTINCREMENT) * sizeof(ElemType)); + if(newbase == NULL) { + // ´æ´¢ÄÚ´æÊ§°Ü + exit(OVERFLOW); + } + + // лùÖ· + (*L).elem = newbase; + // ´æµÄ´æ´¢¿Õ¼ä + (*L).listsize += LISTINCREMENT; + } + + // qΪ²åÈëλÖà + q = &(*L).elem[i - 1]; + + // 1.ÓÒÒÆÔªËØ£¬ÌÚ³öλÖà + for(p = &(*L).elem[(*L).length - 1]; p >= q; --p) { + *(p + 1) = *p; + } + + // 2.²åÈëe + *q = e; + + // 3.±í³¤Ôö1 + (*L).length++; + + return OK; +} diff --git a/Dev-C++/ExerciseBook/07.38/SqList.h b/Dev-C++/ExerciseBook/07.38/SqList.h new file mode 100644 index 0000000..08db2a8 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.38/SqList.h @@ -0,0 +1,73 @@ +/*============================= + * ÏßÐÔ±íµÄ˳Ðò´æ´¢½á¹¹£¨Ë³Ðò±í£© + * + * °üº¬Ëã·¨: 2.3¡¢2.4¡¢2.5¡¢2.6 + =============================*/ + +#ifndef SQLIST_H +#define SQLIST_H + +#include +#include // Ìṩmalloc¡¢realloc¡¢free¡¢exitÔ­ÐÍ +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// + +/* ºê¶¨Òå */ +#define LIST_INIT_SIZE 100 // ˳Ðò±í´æ´¢¿Õ¼äµÄ³õʼ·ÖÅäÁ¿ +#define LISTINCREMENT 10 // ˳Ðò±í´æ´¢¿Õ¼äµÄ·ÖÅäÔöÁ¿ + +/* ˳Ðò±íÔªËØÀàÐͶ¨Òå */ +typedef int ElemType; + +/* + * ˳Ðò±í½á¹¹ + * + * ×¢£ºelemÔÚʹÓÃǰÐèÒªÏÈΪÆä·ÖÅäÄڴ棬ÇÒÔªËØ´Óelem[0]´¦¿ªÊ¼´æ´¢ + */ +typedef struct { + ElemType* elem; // ˳Ðò±í´æ´¢¿Õ¼äµÄ»ùÖ·£¨Ö¸Ïò˳Ðò±íËùÕ¼ÄÚ´æµÄÆðʼλÖã© + int length; // µ±Ç°Ë³Ðò±í³¤¶È£¨°üº¬¶àÉÙÔªËØ£© + int listsize; // µ±Ç°·ÖÅäµÄ´æ´¢ÈÝÁ¿£¨¿ÉÒÔ´æ´¢¶àÉÙÔªËØ£© +} SqList; + + +/* + * ¨€¨€¨€¨€¨€¨€¨€¨€ Ëã·¨2.3 ¨€¨€¨€¨€¨€¨€¨€¨€ + * + * ³õʼ»¯ + * + * ³õʼ»¯³É¹¦Ôò·µ»ØOK£¬·ñÔò·µ»ØERROR¡£ + */ +Status InitList(SqList* L); + +/* + * ¼ÆÊý + * + * ·µ»ØË³Ðò±í°üº¬µÄÓÐÐ§ÔªËØµÄÊýÁ¿¡£ + */ +int ListLength(SqList L); + +/* + * ȡֵ + * + * »ñȡ˳Ðò±íÖеÚi¸öÔªËØ£¬½«Æä´æ´¢µ½eÖС£ + * Èç¹û¿ÉÒÔÕÒµ½£¬·µ»ØOK£¬·ñÔò£¬·µ»ØERROR¡£ + * + *¡¾±¸×¢¡¿ + * ½Ì²ÄÖÐiµÄº¬ÒåÊÇÔªËØÎ»Ö㬴Ó1¿ªÊ¼¼ÆÊý£¬µ«Õâ²»·ûºÏ±àÂëµÄͨÓÃÔ¼¶¨¡£ + * ͨ³££¬iµÄº¬ÒåÓ¦¸ÃÖ¸Ë÷Òý£¬¼´´Ó0¿ªÊ¼¼ÆÊý¡£ + */ +Status GetElem(SqList L, int i, ElemType* e); + +/* + * ¨€¨€¨€¨€¨€¨€¨€¨€ Ëã·¨2.4 ¨€¨€¨€¨€¨€¨€¨€¨€ + * + * ²åÈë + * + * Ïò˳Ðò±íµÚi¸öλÖÃÉϲåÈëe£¬²åÈë³É¹¦Ôò·µ»ØOK£¬·ñÔò·µ»ØERROR¡£ + * + *¡¾±¸×¢¡¿ + * ½Ì²ÄÖÐiµÄº¬ÒåÊÇÔªËØÎ»Ö㬴Ó1¿ªÊ¼¼ÆÊý + */ +Status ListInsert(SqList* L, int i, ElemType e); + +#endif diff --git a/Dev-C++/ExerciseBook/07.38/TestData_DG.txt b/Dev-C++/ExerciseBook/07.38/TestData_DG.txt new file mode 100644 index 0000000..ee36cd9 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.38/TestData_DG.txt @@ -0,0 +1,8 @@ +ͼÀàÐÍ¡ú0£¨ÓÐÏòͼ£© +¶¥µãÊý¡ú12 +»¡Êý¡ú14 +»¡ÊÇ·ñ´øÓÐÆäËûÐÅÏ¢¡ú0 +¶¥µã¼¯¡ú¡¾A£¬B£¬C£¬D£¬E£¬F£¬G£¬H£¬I£¬J£¬K£¬L¡¿ +»¡µÄ¼¯ºÏ¡ú¡¾A£¬B¡¿¡¾A£¬D¡¿¡¾B£¬C¡¿¡¾B£¬D¡¿¡¾C£¬E¡¿¡¾C£¬F¡¿¡¾F£¬G¡¿¡¾D£¬G¡¿¡¾D£¬H¡¿¡¾E£¬I¡¿¡¾E£¬J¡¿¡¾F£¬J¡¿¡¾G£¬K¡¿¡¾G£¬L¡¿ + +Óë¶¥µã¶ÔÓ¦µÄ²Ù×÷ÊýÓë²Ù×÷·û¡ú¡¾*£¬+£¬*£¬*£¬+£¬*£¬+£¬e£¬a£¬b£¬c£¬d¡¿ \ No newline at end of file diff --git a/Dev-C++/ExerciseBook/07.39/07.39.cpp b/Dev-C++/ExerciseBook/07.39/07.39.cpp new file mode 100644 index 0000000..44c80db --- /dev/null +++ b/Dev-C++/ExerciseBook/07.39/07.39.cpp @@ -0,0 +1,80 @@ +#include +#include "SqList.h" +#include "BiTree.h" + +/* + * »ñÈ¡´æ´¢ÔÚ¶þ²æÊ÷Öеıí´ïʽµÄÄæ²¨À¼Ê½ + * + * ×¢£º±í´ïʽ½á¹¹²Î¿¼½Ì²Ä²åͼ7.22 + */ +void Algo_7_39(BiTree T); + +/* + * ´Ó¶þ²æÊ÷µÄ¸ù½áµã³ö·¢»ñÈ¡Ê÷Öд洢µÄ±í´ïʽµÄÄæ²¨À¼Ê½¡£ + * ÇóÈ¡µÄÄæ²¨À¼Ê½»á´æ´¢ÔÚRPNÖС£ + * + * ×¢£ºÊ¹ÓÃÁ˺óÐø±éÀú + */ +static void AntiPolandFormula_7_39(BiTree T, SqList* RPN); + + +int main(int argc, char* argv[]) { + BiTree T; + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ´´½¨²¢´òÓ¡¶þ²æÊ÷... \n"); + { + InitBiTree(&T); + CreateBiTree(&T, "TestData_Pre.txt"); + PrintTree(T); + printf("\n"); + } + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ÇóÈ¡¶þ²æÊ÷Öд洢µÄ±í´ïʽµÄÄæ²¨À¼Ê½... \n"); + { + Algo_7_39(T); + printf("\n"); + } + + return 0; +} + + +/* + * »ñÈ¡´æ´¢ÔÚ¶þ²æÊ÷Öеıí´ïʽµÄÄæ²¨À¼Ê½ + * + * ×¢£º±í´ïʽ½á¹¹²Î¿¼½Ì²Ä²åͼ7.23 + */ +void Algo_7_39(BiTree T) { + int i; + SqList RPN; // ´æ´¢Ä沨À¼±í´ïʽ + ElemType e; + + // ³õʼ»¯³¤¶ÈΪ0µÄÏßÐÔ±í + InitList(&RPN); + + // ´ÓÓÐÏòÎÞ»·Í¼µÄ¸ù½áµã³ö·¢£¬Í¨¹ýβµÝ¹é»ñÈ¡µ½ÆäÖд洢µÄ±í´ïʽµÄÄæ²¨À¼Ê½ + AntiPolandFormula_7_39(T, &RPN); + + for(i = 1; i <= ListLength(RPN); i++) { + GetElem(RPN, i, &e); + printf("%c", e); + } + printf("\n"); +} + +/* + * ´Ó¶þ²æÊ÷µÄ¸ù½áµã³ö·¢»ñÈ¡Ê÷Öд洢µÄ±í´ïʽµÄÄæ²¨À¼Ê½¡£ + * ÇóÈ¡µÄÄæ²¨À¼Ê½»á´æ´¢ÔÚRPNÖС£ + * + * ×¢£ºÊ¹ÓÃÁ˺óÐø±éÀú + */ +void AntiPolandFormula_7_39(BiTree T, SqList* RPN) { + if(T == NULL) { + return; + } + + AntiPolandFormula_7_39(T->lchild, RPN); + AntiPolandFormula_7_39(T->rchild, RPN); + // µ±Ã»Óк¢×Ó½áµã¿É±éÀúʱ£¬´æ´¢µ±Ç°½áµã + ListInsert(RPN, ListLength(*RPN) + 1, T->data); +} diff --git a/Dev-C++/ExerciseBook/07.39/07.39.dev b/Dev-C++/ExerciseBook/07.39/07.39.dev new file mode 100644 index 0000000..764aaa4 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.39/07.39.dev @@ -0,0 +1,131 @@ +[Project] +FileName=07.39.dev +Name=07.39 +Type=1 +Ver=2 +ObjFiles= +Includes= +Libs= +PrivateResource= +ResourceIncludes= +MakeIncludes= +Compiler= +CppCompiler= +Linker= +IsCpp=0 +Icon= +ExeOutput= +ObjectOutput= +LogOutput= +LogOutputEnabled=0 +OverrideOutput=0 +OverrideOutputName= +HostApplication= +UseCustomMakefile=0 +CustomMakefile= +CommandLine= +Folders= +IncludeVersionInfo=0 +SupportXPThemes=0 +CompilerSet=1 +CompilerSettings=0000000000000000001000000 +UnitCount=8 + +[VersionInfo] +Major=1 +Minor=0 +Release=0 +Build=0 +LanguageID=1033 +CharsetID=1252 +CompanyName= +FileVersion= +FileDescription=Developed using the Dev-C++ IDE +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion= +AutoIncBuildNr=0 +SyncProduct=1 + +[Unit1] +FileName=07.39.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit2] +FileName=BiTree.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit3] +FileName=BiTree.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit4] +FileName=LinkQueue.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit5] +FileName=LinkQueue.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit6] +FileName=SqList.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit7] +FileName=SqList.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit8] +FileName=TestData_Pre.txt +Folder= +Compile=0 +Link=0 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + diff --git a/Dev-C++/ExerciseBook/07.39/07.39.png b/Dev-C++/ExerciseBook/07.39/07.39.png new file mode 100644 index 0000000000000000000000000000000000000000..382fc999e12140b954c07f046d694aa27e551ce1 GIT binary patch literal 23608 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 zlchild); // Çó×ó×ÓÊ÷Éî¶È + RD = BiTreeDepth(T->rchild); // ÇóÓÒ×ÓÊ÷Éî¶È + + return (LD >= RD ? LD : RD) + 1; + } +} + + +/*©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥ ½öÏÞÄÚ²¿Ê¹Óõĺ¯Êý ©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥*/ + +// ´´½¨¶þ²æÊ÷µÄÄÚ²¿º¯Êý +static void CreateTree(BiTree* T, FILE* fp) { + char ch; + + // ¶ÁÈ¡µ±Ç°½áµãµÄÖµ + if(fp == NULL) { + scanf("%c", &ch); + } else { + ReadData(fp, "%c", &ch); + } + + if(ch == '^') { + *T = NULL; + } else { + // Éú³É¸ù½áµã + *T = (BiTree) malloc(sizeof(BiTNode)); + if(!(*T)) { + exit(OVERFLOW); + } + (*T)->data = ch; + CreateTree(&((*T)->lchild), fp); // ´´½¨×ó×ÓÊ÷ + CreateTree(&((*T)->rchild), fp); // ´´½¨ÓÒ×ÓÊ÷ + } +} + + +/*©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥ ͼÐλ¯Êä³ö ©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥*/ + +// ÒÔͼÐλ¯ÐÎʽÊä³öµ±Ç°½á¹¹£¬½öÏÞÄÚ²¿²âÊÔʹÓà +void PrintTree(BiTree T) { + int level, width; + int i, j, k, w; + int begin; + int distance; + TElemType** tmp; + LinkQueue Q; + BiTree e; + + // Óöµ½¿ÕÊ÷ÔòÎÞÐè¼ÌÐø¼ÆËã + if(BiTreeEmpty(T)) { + printf("\n"); + return; + } + + level = BiTreeDepth(T); // £¨ÍêÈ«£©¶þ²æÊ÷½á¹¹¸ß¶È + width = (int)pow(2, level)-1; // £¨ÍêÈ«£©¶þ²æÊ÷½á¹¹¿í¶È + + // ¶¯Ì¬´´½¨ÐÐ + tmp = (TElemType**)malloc(level* sizeof(TElemType*)); + + // ¶¯Ì¬´´½¨ÁÐ + for(i = 0; i < level; i++) { + tmp[i] = (TElemType*)malloc(width* sizeof(TElemType)); + + // ³õʼ»¯ÄÚ´æÖµÎª¿Õ×Ö·û + memset(tmp[i], '\0', width); + } + + // ½èÖú¶ÓÁÐʵÏÖ²ãÐò±éÀú + InitQueue(&Q); + EnQueue(&Q, T); + + // ±éÀúÊ÷ÖÐËùÓÐÔªËØ£¬½«Æä°²Åŵ½¶þάÊý×étmpÖкÏÊʵÄλÖà + for(i = 0; i < level; i++) { + w = (int) pow(2, i); // ¶þ²æÊ÷µ±Ç°²ãµÄ¿í¶È + distance = width / w; // ¶þ²æÊ÷µ±Ç°²ãµÄÔªËØ¼ä¸ô + begin = width / (int) pow(2, i + 1); // ¶þ²æÊ÷µ±Ç°²ãÊ׸öÔªËØÖ®Ç°µÄ¿Õ¸ñÊý + + for(k = 0; k < w; k++) { + DeQueue(&Q, &e); + + if(e == NULL) { + EnQueue(&Q, NULL); + EnQueue(&Q, NULL); + } else { + j = begin + k * (1 + distance); + tmp[i][j] = e->data; + + // ×óº¢×ÓÈë¶Ó + EnQueue(&Q, e->lchild); + + // ÓÒº¢×ÓÈë¶Ó + EnQueue(&Q, e->rchild); + } + } + } + + for(i = 0; i < level; i++) { + for(j = 0; j < width; j++) { + if(tmp[i][j] != '\0') { + printf("%c", tmp[i][j]); + } else { + printf(" "); + } + } + printf("\n"); + } +} diff --git a/Dev-C++/ExerciseBook/07.39/BiTree.h b/Dev-C++/ExerciseBook/07.39/BiTree.h new file mode 100644 index 0000000..00f93ed --- /dev/null +++ b/Dev-C++/ExerciseBook/07.39/BiTree.h @@ -0,0 +1,83 @@ +/*============================= + * ¶þ²æÊ÷µÄ¶þ²æÁ´±í´æ´¢½á¹¹ + * + * °üº¬Ëã·¨: 6.1¡¢6.2¡¢6.3¡¢6.4 + =============================*/ + +#ifndef BITREE_H +#define BITREE_H + +#include +#include // Ìṩ malloc¡¢free Ô­ÐÍ +#include // Ìṩ memset¡¢strcmp Ô­ÐÍ +#include // Ìṩ pow Ô­ÐÍ +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// + +/* ¶þ²æÊ÷ÔªËØÀàÐͶ¨Ò壬ÕâÀï¼ÙÉèÆäÔªËØÀàÐÍΪchar */ +typedef char TElemType; + +/* ¶þ²æÊ÷½áµã¶¨Òå */ +typedef struct BiTNode { + TElemType data; // ½áµãÔªËØ + struct BiTNode* lchild; // ×óº¢×ÓÖ¸Õë + struct BiTNode* rchild; // ÓÒº¢×ÓÖ¸Õë +} BiTNode; + +/* Ö¸Ïò¶þ²æÊ÷½áµãµÄÖ¸Õë */ +typedef BiTNode* BiTree; + + +/* + * ³õʼ»¯ + * + * ¹¹Ôì¿Õ¶þ²æÊ÷¡£ + */ +Status InitBiTree(BiTree* T); + +/* + * ¨€¨€¨€¨€¨€¨€¨€¨€ Ëã·¨6.4 ¨€¨€¨€¨€¨€¨€¨€¨€ + * + * ´´½¨ + * + * °´ÕÕÔ¤ÉèµÄ¶¨ÒåÀ´´´½¨¶þ²æÊ÷¡£ + * ÕâÀïÔ¼¶¨Ê¹Óá¾ÏÈÐòÐòÁС¿À´´´½¨¶þ²æÊ÷¡£ + * + * + *¡¾±¸×¢¡¿ + * + * ½Ì²ÄÖÐĬÈÏ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý¡£ + * ÕâÀïΪÁË·½±ã²âÊÔ£¬±ÜÃâÿ´ÎÔËÐж¼ÊÖ¶¯ÊäÈëÊý¾Ý£¬ + * Òò¶øÔÊÐíÑ¡Ôñ´ÓÔ¤ÉèµÄÎļþpathÖжÁÈ¡²âÊÔÊý¾Ý¡£ + * + * Èç¹ûÐèÒª´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý£¬ÔòpathΪNULL»òÕßΪ¿Õ´®£¬ + * Èç¹ûÐèÒª´ÓÎļþÖжÁÈ¡Êý¾Ý£¬ÔòÐèÒªÔÚpathÖÐÌîдÎļþÃûÐÅÏ¢¡£ + */ +Status CreateBiTree(BiTree* T, char* path); + +/* + * ÅÐ¿Õ + * + * Åж϶þ²æÊ÷ÊÇ·ñΪ¿ÕÊ÷¡£ + */ +Status BiTreeEmpty(BiTree T); + +/* + * Ê÷Éî + * + * ·µ»Ø¶þ²æÊ÷µÄÉî¶È£¨²ãÊý£©¡£ + */ +int BiTreeDepth(BiTree T); + + +/*©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥ ½öÏÞÄÚ²¿Ê¹Óõĺ¯Êý ©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥*/ + +// ´´½¨¶þ²æÊ÷µÄÄÚ²¿º¯Êý +static void CreateTree(BiTree* T, FILE* fp); + + +/*©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥ ͼÐλ¯Êä³ö ©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥*/ + +// ÒÔͼÐλ¯ÐÎʽÊä³öµ±Ç°½á¹¹£¬½öÏÞÄÚ²¿²âÊÔʹÓà +void PrintTree(BiTree T); + +#endif diff --git a/Dev-C++/ExerciseBook/07.39/LinkQueue.cpp b/Dev-C++/ExerciseBook/07.39/LinkQueue.cpp new file mode 100644 index 0000000..111c53e --- /dev/null +++ b/Dev-C++/ExerciseBook/07.39/LinkQueue.cpp @@ -0,0 +1,102 @@ +/*========================= + * ¶ÓÁеÄÁ´Ê½´æ´¢½á¹¹£¨Á´¶Ó£© + ==========================*/ + +#ifndef LINKQUEUE_C +#define LINKQUEUE_C + +#include "LinkQueue.h" //**¡ø03 Õ»ºÍ¶ÓÁÐ**// + +/* + * ³õʼ»¯ + * + * ¹¹ÔìÒ»¸ö¿ÕµÄÁ´¶Ó¡£ + * ³õʼ»¯³É¹¦Ôò·µ»ØOK£¬·ñÔò·µ»ØERROR¡£ + * + *¡¾×¢¡¿ + * ÕâÀïµÄ¶ÓÁдøÓÐÍ·½áµã + */ +Status InitQueue(LinkQueue* Q) { + if(Q == NULL) { + return ERROR; + } + + (*Q).front = (*Q).rear = (QueuePtr) malloc(sizeof(QNode)); + if(!(*Q).front) { + exit(OVERFLOW); + } + + (*Q).front->next = NULL; + + return OK; +} + +/* + * ÅÐ¿Õ + * + * ÅжÏÁ´¶ÓÖÐÊÇ·ñ°üº¬ÓÐЧÊý¾Ý¡£ + * + * ·µ»ØÖµ£º + * TRUE : Á´¶ÓΪ¿Õ + * FALSE: Á´¶Ó²»Îª¿Õ + */ +Status QueueEmpty(LinkQueue Q) { + if(Q.front == Q.rear) { + return TRUE; + } else { + return FALSE; + } +} + +/* + * Èë¶Ó + * + * ½«ÔªËØeÌí¼Óµ½¶ÓÁÐβ²¿¡£ + */ +Status EnQueue(LinkQueue* Q, QElemType e) { + QueuePtr p; + + if(Q == NULL || (*Q).front == NULL) { + return ERROR; + } + + p = (QueuePtr) malloc(sizeof(QNode)); + if(!p) { + exit(OVERFLOW); + } + + p->data = e; + p->next = NULL; + + (*Q).rear->next = p; + (*Q).rear = p; + + return OK; +} + +/* + * ³ö¶Ó + * + * ÒÆ³ý¶ÓÁÐÍ·²¿µÄÔªËØ£¬½«Æä´æ´¢µ½eÖС£ + */ +Status DeQueue(LinkQueue* Q, QElemType* e) { + QueuePtr p; + + if(Q == NULL || (*Q).front == NULL || (*Q).front == (*Q).rear) { + return ERROR; + } + + p = (*Q).front->next; + *e = p->data; + + (*Q).front->next = p->next; + if((*Q).rear == p) { + (*Q).rear = (*Q).front; + } + + free(p); + + return OK; +} + +#endif diff --git a/Dev-C++/ExerciseBook/07.39/LinkQueue.h b/Dev-C++/ExerciseBook/07.39/LinkQueue.h new file mode 100644 index 0000000..cc52316 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.39/LinkQueue.h @@ -0,0 +1,65 @@ +/*========================= + * ¶ÓÁеÄÁ´Ê½´æ´¢½á¹¹£¨Á´¶Ó£© + ==========================*/ + +#ifndef LINKQUEUE_H +#define LINKQUEUE_H + +#include +#include // Ìṩmalloc¡¢realloc¡¢free¡¢exitÔ­ÐÍ +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// +#include "BiTree.h" //**¡ø06 Ê÷ºÍ¶þ²æÊ÷**// + +/* Á´¶ÓÔªËØÀàÐͶ¨Òå */ +typedef BiTree QElemType; + +// ¶ÓÁÐÔªËØ½á¹¹ +typedef struct QNode { + QElemType data; + struct QNode* next; +} QNode, * QueuePtr; + +// ¶ÓÁнṹ +typedef struct { + QueuePtr front; // ¶ÓÍ·Ö¸Õë + QueuePtr rear; // ¶ÓβָÕë +} LinkQueue; // ¶ÓÁеÄÁ´Ê½´æ´¢±íʾ + + +/* + * ³õʼ»¯ + * + * ¹¹ÔìÒ»¸ö¿ÕµÄÁ´¶Ó¡£ + * ³õʼ»¯³É¹¦Ôò·µ»ØOK£¬·ñÔò·µ»ØERROR¡£ + * + *¡¾×¢¡¿ + * ÕâÀïµÄ¶ÓÁдøÓÐÍ·½áµã + */ +Status InitQueue(LinkQueue* Q); + +/* + * ÅÐ¿Õ + * + * ÅжÏÁ´¶ÓÖÐÊÇ·ñ°üº¬ÓÐЧÊý¾Ý¡£ + * + * ·µ»ØÖµ£º + * TRUE : Á´¶ÓΪ¿Õ + * FALSE: Á´¶Ó²»Îª¿Õ + */ +Status QueueEmpty(LinkQueue Q); + +/* + * Èë¶Ó + * + * ½«ÔªËØeÌí¼Óµ½¶ÓÁÐβ²¿¡£ + */ +Status EnQueue(LinkQueue* Q, QElemType e); + +/* + * ³ö¶Ó + * + * ÒÆ³ý¶ÓÁÐÍ·²¿µÄÔªËØ£¬½«Æä´æ´¢µ½eÖС£ + */ +Status DeQueue(LinkQueue* Q, QElemType* e); + +#endif diff --git a/Dev-C++/ExerciseBook/07.39/SqList.cpp b/Dev-C++/ExerciseBook/07.39/SqList.cpp new file mode 100644 index 0000000..623d818 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.39/SqList.cpp @@ -0,0 +1,114 @@ +/*============================= + * ÏßÐÔ±íµÄ˳Ðò´æ´¢½á¹¹£¨Ë³Ðò±í£© + * + * °üº¬Ëã·¨: 2.3¡¢2.4¡¢2.5¡¢2.6 + =============================*/ + +#include "SqList.h" + +/* + * ¨€¨€¨€¨€¨€¨€¨€¨€ Ëã·¨2.3 ¨€¨€¨€¨€¨€¨€¨€¨€ + * + * ³õʼ»¯ + * + * ³õʼ»¯³É¹¦Ôò·µ»ØOK£¬·ñÔò·µ»ØERROR¡£ + */ +Status InitList(SqList* L) { + // ·ÖÅäÖ¸¶¨ÈÝÁ¿µÄÄڴ棬Èç¹û·ÖÅäʧ°Ü£¬Ôò·µ»ØNULL + (*L).elem = (ElemType*) malloc(LIST_INIT_SIZE * sizeof(ElemType)); + if((*L).elem == NULL) { + // ´æ´¢ÄÚ´æÊ§°Ü + exit(OVERFLOW); + } + + (*L).length = 0; // ³õʼ»¯Ë³Ðò±í³¤¶ÈΪ0 + (*L).listsize = LIST_INIT_SIZE; // ˳Ðò±í³õʼÄÚ´æ·ÖÅäÁ¿ + + return OK; // ³õʼ»¯³É¹¦ +} + +/* + * ¼ÆÊý + * + * ·µ»ØË³Ðò±í°üº¬µÄÓÐÐ§ÔªËØµÄÊýÁ¿¡£ + */ +int ListLength(SqList L) { + return L.length; +} + +/* + * ȡֵ + * + * »ñȡ˳Ðò±íÖеÚi¸öÔªËØ£¬½«Æä´æ´¢µ½eÖС£ + * Èç¹û¿ÉÒÔÕÒµ½£¬·µ»ØOK£¬·ñÔò£¬·µ»ØERROR¡£ + * + *¡¾±¸×¢¡¿ + * ½Ì²ÄÖÐiµÄº¬ÒåÊÇÔªËØÎ»Ö㬴Ó1¿ªÊ¼¼ÆÊý£¬µ«Õâ²»·ûºÏ±àÂëµÄͨÓÃÔ¼¶¨¡£ + * ͨ³££¬iµÄº¬ÒåÓ¦¸ÃÖ¸Ë÷Òý£¬¼´´Ó0¿ªÊ¼¼ÆÊý¡£ + */ +Status GetElem(SqList L, int i, ElemType* e) { + // ÒòΪiµÄº¬ÒåÊÇλÖã¬ËùÒÔÆäºÏ·¨·¶Î§ÊÇ£º[1, length] + if(i < 1 || i > L.length) { + return ERROR; //iÖµ²»ºÏ·¨ + } + + *e = L.elem[i - 1]; + + return OK; +} + +/* + * ¨€¨€¨€¨€¨€¨€¨€¨€ Ëã·¨2.4 ¨€¨€¨€¨€¨€¨€¨€¨€ + * + * ²åÈë + * + * Ïò˳Ðò±íµÚi¸öλÖÃÉϲåÈëe£¬²åÈë³É¹¦Ôò·µ»ØOK£¬·ñÔò·µ»ØERROR¡£ + * + *¡¾±¸×¢¡¿ + * ½Ì²ÄÖÐiµÄº¬ÒåÊÇÔªËØÎ»Ö㬴Ó1¿ªÊ¼¼ÆÊý + */ +Status ListInsert(SqList* L, int i, ElemType e) { + ElemType* newbase; + ElemType* p, * q; + + // È·±£Ë³Ðò±í½á¹¹´æÔÚ + if(L == NULL || (*L).elem == NULL) { + return ERROR; + } + + // iÖµÔ½½ç + if(i < 1 || i > (*L).length + 1) { + return ERROR; + } + + // Èô´æ´¢¿Õ¼äÒÑÂú£¬ÔòÔö¼Óпռä + if((*L).length >= (*L).listsize) { + // »ùÓÚÏÖÓпռäÀ©ÈÝ + newbase = (ElemType*) realloc((*L).elem, ((*L).listsize + LISTINCREMENT) * sizeof(ElemType)); + if(newbase == NULL) { + // ´æ´¢ÄÚ´æÊ§°Ü + exit(OVERFLOW); + } + + // лùÖ· + (*L).elem = newbase; + // ´æµÄ´æ´¢¿Õ¼ä + (*L).listsize += LISTINCREMENT; + } + + // qΪ²åÈëλÖà + q = &(*L).elem[i - 1]; + + // 1.ÓÒÒÆÔªËØ£¬ÌÚ³öλÖà + for(p = &(*L).elem[(*L).length - 1]; p >= q; --p) { + *(p + 1) = *p; + } + + // 2.²åÈëe + *q = e; + + // 3.±í³¤Ôö1 + (*L).length++; + + return OK; +} diff --git a/Dev-C++/ExerciseBook/07.39/SqList.h b/Dev-C++/ExerciseBook/07.39/SqList.h new file mode 100644 index 0000000..08db2a8 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.39/SqList.h @@ -0,0 +1,73 @@ +/*============================= + * ÏßÐÔ±íµÄ˳Ðò´æ´¢½á¹¹£¨Ë³Ðò±í£© + * + * °üº¬Ëã·¨: 2.3¡¢2.4¡¢2.5¡¢2.6 + =============================*/ + +#ifndef SQLIST_H +#define SQLIST_H + +#include +#include // Ìṩmalloc¡¢realloc¡¢free¡¢exitÔ­ÐÍ +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// + +/* ºê¶¨Òå */ +#define LIST_INIT_SIZE 100 // ˳Ðò±í´æ´¢¿Õ¼äµÄ³õʼ·ÖÅäÁ¿ +#define LISTINCREMENT 10 // ˳Ðò±í´æ´¢¿Õ¼äµÄ·ÖÅäÔöÁ¿ + +/* ˳Ðò±íÔªËØÀàÐͶ¨Òå */ +typedef int ElemType; + +/* + * ˳Ðò±í½á¹¹ + * + * ×¢£ºelemÔÚʹÓÃǰÐèÒªÏÈΪÆä·ÖÅäÄڴ棬ÇÒÔªËØ´Óelem[0]´¦¿ªÊ¼´æ´¢ + */ +typedef struct { + ElemType* elem; // ˳Ðò±í´æ´¢¿Õ¼äµÄ»ùÖ·£¨Ö¸Ïò˳Ðò±íËùÕ¼ÄÚ´æµÄÆðʼλÖã© + int length; // µ±Ç°Ë³Ðò±í³¤¶È£¨°üº¬¶àÉÙÔªËØ£© + int listsize; // µ±Ç°·ÖÅäµÄ´æ´¢ÈÝÁ¿£¨¿ÉÒÔ´æ´¢¶àÉÙÔªËØ£© +} SqList; + + +/* + * ¨€¨€¨€¨€¨€¨€¨€¨€ Ëã·¨2.3 ¨€¨€¨€¨€¨€¨€¨€¨€ + * + * ³õʼ»¯ + * + * ³õʼ»¯³É¹¦Ôò·µ»ØOK£¬·ñÔò·µ»ØERROR¡£ + */ +Status InitList(SqList* L); + +/* + * ¼ÆÊý + * + * ·µ»ØË³Ðò±í°üº¬µÄÓÐÐ§ÔªËØµÄÊýÁ¿¡£ + */ +int ListLength(SqList L); + +/* + * ȡֵ + * + * »ñȡ˳Ðò±íÖеÚi¸öÔªËØ£¬½«Æä´æ´¢µ½eÖС£ + * Èç¹û¿ÉÒÔÕÒµ½£¬·µ»ØOK£¬·ñÔò£¬·µ»ØERROR¡£ + * + *¡¾±¸×¢¡¿ + * ½Ì²ÄÖÐiµÄº¬ÒåÊÇÔªËØÎ»Ö㬴Ó1¿ªÊ¼¼ÆÊý£¬µ«Õâ²»·ûºÏ±àÂëµÄͨÓÃÔ¼¶¨¡£ + * ͨ³££¬iµÄº¬ÒåÓ¦¸ÃÖ¸Ë÷Òý£¬¼´´Ó0¿ªÊ¼¼ÆÊý¡£ + */ +Status GetElem(SqList L, int i, ElemType* e); + +/* + * ¨€¨€¨€¨€¨€¨€¨€¨€ Ëã·¨2.4 ¨€¨€¨€¨€¨€¨€¨€¨€ + * + * ²åÈë + * + * Ïò˳Ðò±íµÚi¸öλÖÃÉϲåÈëe£¬²åÈë³É¹¦Ôò·µ»ØOK£¬·ñÔò·µ»ØERROR¡£ + * + *¡¾±¸×¢¡¿ + * ½Ì²ÄÖÐiµÄº¬ÒåÊÇÔªËØÎ»Ö㬴Ó1¿ªÊ¼¼ÆÊý + */ +Status ListInsert(SqList* L, int i, ElemType e); + +#endif diff --git a/Dev-C++/ExerciseBook/07.39/TestData_Pre.txt b/Dev-C++/ExerciseBook/07.39/TestData_Pre.txt new file mode 100644 index 0000000..e988f9b --- /dev/null +++ b/Dev-C++/ExerciseBook/07.39/TestData_Pre.txt @@ -0,0 +1 @@ +ÏÈÐòÐòÁУ¨³¯ÉϵÄÈý½Ç´ú±í¿Õ½áµã£©£º*+*+a^^b^^*b^^+c^^d^^*+c^^d^^e^^*+c^^d^^e^^ \ No newline at end of file diff --git a/Dev-C++/ExerciseBook/07.40/07.40.cpp b/Dev-C++/ExerciseBook/07.40/07.40.cpp new file mode 100644 index 0000000..cd16ce8 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.40/07.40.cpp @@ -0,0 +1,193 @@ +#include +#include +#include "SqList.h" +#include "ALGraph.h" + +/* + * »ñÈ¡´æ´¢ÔÚÓÐÏòÎÞ»·Í¼Öеıí´ïʽµÄÄæ²¨À¼Ê½ + * + * ×¢£º±í´ïʽ½á¹¹²Î¿¼½Ì²Ä²åͼ7.23 + */ +void Algo_7_40(ALGraph G, SqList* RPN); + +/* + * ´Ó¶¥µãv³ö·¢»ñÈ¡ÓÐÏòͼÖд洢µÄ±í´ïʽµÄÄæ²¨À¼Ê½¡£ + * ÇóÈ¡µÄÄæ²¨À¼Ê½»á´æ´¢ÔÚRPNÖС£ + */ +static void AntiPolandFormula_7_40(ALGraph G, int v, SqList* RPN); + +/* + * ¼ÆËãÄæ²¨À¼Ê½µÄÖµ + */ +int Evaluation_7_40(SqList RPN); + + +int main(int argc, char* argv[]) { + ALGraph G; + SqList RPN; // ´æ´¢Ä沨À¼±í´ïʽ + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ´´½¨²¢´òÓ¡ÓÐÏòÍø... \n"); + { + char* path[4]; + + path[0] = "TestData_DG.txt"; + path[1] = ""; + path[2] = ""; + path[3] = ""; + + CreateGraph(&G, path); + PrintGraph(G); + printf("\n"); + } + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ÇóÈ¡ÓÐÏòÍøÖд洢µÄ±í´ïʽµÄÄæ²¨À¼Ê½... \n"); + { + Algo_7_40(G, &RPN); + printf("\n"); + } + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ¼ÆËãÄæ²¨À¼Ê½µÄÖµ... \n"); + { + printf("¼ÆËãÉÏÊöÄæ²¨À¼Ê½µÄֵΪ£º%d\n", Evaluation_7_40(RPN)); + printf("\n"); + } + + return 0; +} + + +/* + * »ñÈ¡´æ´¢ÔÚÓÐÏòÎÞ»·Í¼Öеıí´ïʽµÄÄæ²¨À¼Ê½ + * + * ×¢£º±í´ïʽ½á¹¹²Î¿¼½Ì²Ä²åͼ7.23 + */ +void Algo_7_40(ALGraph G, SqList* RPN) { + int i, root; + int indegree[MAX_VERTEX_NUM]; // ËùÓж¥µãµÄÈë¶ÈÐÅÏ¢ + ArcNode* p; + ElemType e; + + // ³õʼ»¯ËùÓж¥µãµÄÈë¶ÈΪ0 + for(i = 0; i < G.vexnum; i++) { + indegree[i] = 0; + } + + // ±éÀúËùÓж¥µã + for(i = 0; i < G.vexnum; i++) { + // Ö¸Ïò¸Ã¶¥µãµÄÊ׸öÁÚ½Óµã + p = G.vertices[i].firstarc; + + // ±éÀú¸Ã¶¥µãµÄËùÓÐÁڽӵ㣬ͳ¼Æ¸÷¶¥µãµÄÈë¶È + while(p != NULL) { + indegree[p->adjvex]++; + p = p->nextarc; + } + } + + // ²éÕÒµ½¸ù½áµã + for(i = 0; i < G.vexnum; i++) { + if(indegree[i] == 0) { + root = i; + break; + } + } + + // ³õʼ»¯³¤¶ÈΪ0µÄÏßÐÔ±í + InitList(RPN); + + // ´ÓÓÐÏòÎÞ»·Í¼µÄ¸ù½áµã³ö·¢£¬Í¨¹ýβµÝ¹é»ñÈ¡µ½ÆäÖд洢µÄ±í´ïʽµÄÄæ²¨À¼Ê½ + AntiPolandFormula_7_40(G, root, RPN); + + // Êä³öÄæ²¨À¼Ê½ + for(i = 1; i <= ListLength(*RPN); i++) { + GetElem(*RPN, i, &e); + + if(e.type == Operand) { + printf("%d ", e.op); // ²Ù×÷Êý + } else { + printf("%c ", e.op); // ²Ù×÷·û + } + } + printf("\n"); +} + +/* + * ´Ó¶¥µãv³ö·¢»ñÈ¡ÓÐÏòͼÖд洢µÄ±í´ïʽµÄÄæ²¨À¼Ê½¡£ + * ÇóÈ¡µÄÄæ²¨À¼Ê½»á´æ´¢ÔÚRPNÖС£ + */ +void AntiPolandFormula_7_40(ALGraph G, int v, SqList* RPN) { + ArcNode* r; + Vertex vex; + + // ÏȱéÀúÁÚ½Óµã + for(r = G.vertices[v].firstarc; r != NULL; r = r->nextarc) { + AntiPolandFormula_7_40(G, r->adjvex, RPN); + } + + // »ñÈ¡²Ù×÷·û/²Ù×÷Êý + vex = G.vertices[v].context; + + // µ±Ã»ÓÐÁÚ½Óµã¿É±éÀúʱ£¬´æ´¢¸Ã¶¥µã + ListInsert(RPN, ListLength(*RPN) + 1, vex); +} + +/* + * ¼ÆËãÄæ²¨À¼Ê½µÄÖµ£¬Èç¹û·¢Éú´íÎ󣬷µ»ØINT_MIN¡£ + */ +int Evaluation_7_40(SqList RPN) { + int stack[MAX_VERTEX_NUM]; // Ä£ÄâÒ»¸öÕ»£¬ÓÃÀ´´æ´¢±í´ïʽµÄ¼ÆËã½á¹û + int top = 0; // Õ»¶¥Óαê + int a, b; + ElemType e; + int i; + Boolean hasError = FALSE; // ¼ÆËã¹ý³ÌÖгöÏÖÁË´íÎó + + for(i = 1; i <= ListLength(RPN) && !hasError; i++) { + GetElem(RPN, i, &e); + + // ²Ù×÷Êý + if(e.type == Operand) { + stack[top++] = e.op; + + // ²Ù×÷·û + } else { + if(top > 0) { + b = stack[--top]; + } else { + return INT_MIN; + } + + if(top > 0) { + a = stack[--top]; + } else { + return INT_MIN; + } + + switch(e.op) { + case '+': + stack[top++] = a + b; + break; + case '-': + stack[top++] = a - b; + break; + case '*': + stack[top++] = a * b; + break; + case '/': + stack[top++] = a / b; + break; + default: + printf("ÎÞ·¨Ê¶±ðµÄ²Ù×÷·û£º%c\n", e.op); + hasError = TRUE; + break; + } + } + } + + // Õ»ÖÐ×îºóÖ»Ó¦¸ÃÊ£Ò»¸öÖµ + if(hasError || top != 1) { + return INT_MIN; + } + + return stack[0]; +} diff --git a/Dev-C++/ExerciseBook/07.40/07.40.dev b/Dev-C++/ExerciseBook/07.40/07.40.dev new file mode 100644 index 0000000..d5b1ee3 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.40/07.40.dev @@ -0,0 +1,111 @@ +[Project] +FileName=07.40.dev +Name=07.40 +Type=1 +Ver=2 +ObjFiles= +Includes= +Libs= +PrivateResource= +ResourceIncludes= +MakeIncludes= +Compiler= +CppCompiler= +Linker= +IsCpp=0 +Icon= +ExeOutput= +ObjectOutput= +LogOutput= +LogOutputEnabled=0 +OverrideOutput=0 +OverrideOutputName= +HostApplication= +UseCustomMakefile=0 +CustomMakefile= +CommandLine= +Folders= +IncludeVersionInfo=0 +SupportXPThemes=0 +CompilerSet=1 +CompilerSettings=0000000000000000001000000 +UnitCount=6 + +[VersionInfo] +Major=1 +Minor=0 +Release=0 +Build=0 +LanguageID=1033 +CharsetID=1252 +CompanyName= +FileVersion= +FileDescription=Developed using the Dev-C++ IDE +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion= +AutoIncBuildNr=0 +SyncProduct=1 + +[Unit1] +FileName=07.40.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit2] +FileName=ALGraph.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit3] +FileName=ALGraph.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit4] +FileName=SqList.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit5] +FileName=SqList.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit6] +FileName=TestData_DG.txt +Folder= +Compile=0 +Link=0 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + diff --git a/Dev-C++/ExerciseBook/07.40/07.40.png b/Dev-C++/ExerciseBook/07.40/07.40.png new file mode 100644 index 0000000000000000000000000000000000000000..635f7db6052dc2e508bf9a201c23fb136629d8fe GIT binary patch literal 28101 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 + InsertArc(G, v1, v2, info); + } + + + + /* Ìí¼ÓÏÂÃæ´úÂ룬ÒÔÓ¦¶ÔÐ޸ĺóµÄ½á¹¹ */ + + // ¼Èë¶¥µã¶ÔÓ¦µÄ²Ù×÷·û/²Ù×÷Êý + if(fp == NULL) { + printf("ÇëΪ¸÷¶¥µã¼Èë²Ù×÷·û/²Ù×÷ÊýÐÅÏ¢£º\n"); + printf(" Èç¹û¶¥µãÊDzÙ×÷·û£¬Ê¾·¶ÊäÈëΪ£º0 +\n"); + printf(" Èç¹û¶¥µãÊDzÙ×÷Êý£¬Ê¾·¶ÊäÈëΪ£º1 12\n"); + for(i = 0; i < vexnum; i++) { + printf("ÇëÊäÈë¶¥µã %c ¶ÔÓ¦µÄÊý¾ÝÐÅÏ¢£º", G->vertices[i].data); + + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(stdin); + scanf("%d", &type); + + // ²Ù×÷·û + if(type == 0) { + (*G).vertices[i].context.type = Operator; + scanf("%c", &o); + (*G).vertices[i].context.op = o; + } else if(type == 1) { + (*G).vertices[i].context.type = Operand; + scanf("%d", &((*G).vertices[i].context.op)); + } else { + printf("ÎÞ·¨Ê¶±ðµÄ¶¥µãÊý¾Ý...\n"); + return ERROR; + } + } + } else { + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(fp); + ReadData(fp, "%d", &type); + + // ²Ù×÷·û + if(type == 0) { + (*G).vertices[i].context.type = Operator; + ReadData(fp, "%c", &o); + (*G).vertices[i].context.op = o; + } else if(type == 1) { + (*G).vertices[i].context.type = Operand; + ReadData(fp, "%d", &((*G).vertices[i].context.op)); + } else { + printf("ÎÞ·¨Ê¶±ðµÄ¶¥µãÊý¾Ý...\n"); + return ERROR; + } + } + } + + // ´ÓÎļþÖжÁÈ¡Êý¾Ýʱ£¬×îºóÆäʵӦµ±ÅжÏÒ»ÏÂÊÇ·ñ¶Áµ½ÁË×ã¹»µÄÐÅÏ¢ + return OK; +} + +/* + * ¼Èë±ß/»¡µÄÏà¹Ø¸½¼ÓÐÅÏ¢ + */ +static void Input(ALGraph G, InfoType** info) { + int weight; + + // ÔÚ"Íø"µÄÇéÐÎÏÂÐèҪ¼ÈëȨֵÐÅÏ¢ + if(G.kind == DN || G.kind == UDN) { + *info = (InfoType*) malloc(sizeof(InfoType)); + + if(fp == NULL) { + scanf("%d", &weight); + } else { + ReadData(fp, "%d", &weight); + } + + (*info)->weight = weight; + } +} + +/* + * ²éÕÒ + * + * ·µ»Ø¶¥µãuÔÚͼ/ÍøÖеÄλÖà + */ +int LocateVex(ALGraph G, VertexType u) { + int i; + + for(i = 0; i < G.vexnum; i++) { + if(G.vertices[i].data == u) { + return i; + } + } + + return -1; +} + +/* + * ¹¹ÔìÒ»¸ö±ß/»¡½áµã(½öÏÞÄÚ²¿Ê¹ÓÃ) + */ +static ArcNode* newArcNodePtr(int adjvex, ArcNode* nextarc, InfoType* info) { + ArcNode* p = (ArcNode*) malloc(sizeof(ArcNode)); + if(!p) { + exit(OVERFLOW); + } + + p->adjvex = adjvex; + + p->nextarc = nextarc; + + p->info = info; + + return p; +} + +/* + * ²åÈë±ß/»¡ + * + * Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬Ôò²åÈëÒ»Ìõ»¡ÐèÒªÔö¼ÓÁ½¸ö¶¥µã¹ØÏµ£¬µ«»¡µÄÊýÁ¿Ö»ÔöÒ»¡£ + * ¶ÔÓÚͼ/ÍøÀ´Ëµ£¬¿ÉÒÔÔڿɱä²ÎÊýÖÐÁгö±ß/»¡µÄ¸½¼ÓÐÅÏ¢¡£ + * + * ×¢£º´Ë´¦½ÓÊյIJÎÊýÓëMGraphÓÐЩ²»Ò»Ñù£ºÍøµÄ¸½¼ÓÐÅÏ¢Öаüº¬Á˸÷Ìõ±ß/»¡µÄȨֵ¡£ + */ +Status InsertArc(ALGraph* G, VertexType v, VertexType w, ...) { + int tail, head, k, count; + ArcNode* r; + ArcNode* pre; + Boolean overlay = FALSE; // ÊÇ·ñΪ¸²¸ÇÌí¼Ó + InfoType* info = NULL; // ±ß/»¡µÄ¸½¼ÓÐÅÏ¢ + va_list ap; + + tail = LocateVex(*G, v); // »ñÈ¡¶¥µãvÔÚ¶¥µã¼¯ÖеÄλÖà + if(tail == -1) { + return ERROR; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + head = LocateVex(*G, w); // »ñÈ¡¶¥µãwÔÚ¶¥µã¼¯ÖеÄλÖà + if(head == -1) { + return ERROR; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + // ¾Ü¾ø»· + if(tail == head) { + return ERROR; + } + + // Èç¹û±ß/»¡ÉÏ´æÔÚ¸½¼ÓÐÅÏ¢ + if(IncInfo) { + va_start(ap, w); // ÔÚwºó²éѯÊ׸ö¿É±ä²ÎÊý + info = va_arg(ap, InfoType*); // »ñÈ¡¸½¼ÓÐÅÏ¢ + va_end(ap); + } + + /* ½ÓÏÂÀ´£¬ÐèÒª²éÕÒºÏÊʵIJåÈëλÖà */ + + for(count = 0; count < 2; count++) { + pre = NULL; + // Ö¸ÏòÒÔtailΪβµÄÊ×Ìõ±ß/»¡ + r = G->vertices[tail].firstarc; + while(r != NULL && r->adjvex < head) { + pre = r; + r = r->nextarc; + } + + // Óöµ½ÁËÏàͬλÖõĽáµã + if(r != NULL && r->adjvex == head) { + r->info = info; // ¸´Óøýáµã + overlay = TRUE; // ·¢ÉúÁ˸²¸Ç + } else { + if(pre == NULL) { + G->vertices[tail].firstarc = newArcNodePtr(head, r, info); + } else { + pre->nextarc = newArcNodePtr(head, r, info); + } + } + + // Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬ÐèÒª¿¼ÂǶԳÆÐÔ + if((G->kind == UDG || G->kind == UDN) && tail != head) { + // µßµ¹iºÍj + k = tail; + tail = head; + head = k; + } else { + break; // Èç¹ûÊÇÓÐÏòµÄ£¬¿ÉÒÔ½áÊøÁË + } + } + + // ÔڷǸ²¸ÇµÄÇéÐÎÏ£¬²Å¿¼ÂǸüбß/»¡µÄÊýÁ¿ + if(!overlay) { + (*G).arcnum++; // ²»ÂÛÓÐÏòÎÞÏò£¬±ß/»¡ÊýÖ»ÔöÒ» + } + + return OK; +} + +/* + * ÒÔͼÐλ¯ÐÎʽÊä³öµ±Ç°½á¹¹ + */ +void PrintGraph(ALGraph G) { + int i; + ArcNode* p; + + if(G.vexnum == 0) { + printf("¿Õͼ£¬ÎÞÐè´òÓ¡£¡\n"); + return; + } + + printf("µ±Ç°Í¼/Íø°üº¬ %2d ¸ö¶¥µã£¬ %2d Ìõ±ß/»¡...\n", G.vexnum, G.arcnum); + + for(i = 0; i < G.vexnum; i++) { + printf("%c ===> ", G.vertices[i].data); + + p = G.vertices[i].firstarc; + while(p != NULL) { + if(IncInfo == 0) { + printf("%c ", G.vertices[p->adjvex].data); + + // ¶ÔÓÚÍø£¬»á´ÓÆä¸½¼ÓÐÅÏ¢ÖлñÈ¡µ½È¨Öµ + } else { + printf("%c[%2d] ", G.vertices[p->adjvex].data, p->info->weight); + } + + p = p->nextarc; + + if(p != NULL) { + printf("- "); + } + } + + printf("\n"); + } +} diff --git a/Dev-C++/ExerciseBook/07.40/ALGraph.h b/Dev-C++/ExerciseBook/07.40/ALGraph.h new file mode 100644 index 0000000..f53e2d0 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.40/ALGraph.h @@ -0,0 +1,141 @@ +/*================== + * ͼµÄÁÚ½Ó±í´æ´¢±íʾ + ===================*/ + +#ifndef ALGRAPH_H +#define ALGRAPH_H + +#include +#include // Ìṩmemset¡¢strcmp Ô­ÐÍ +#include // Ìṩºêva_list¡¢va_start¡¢va_arg¡¢va_end +#include // Ìṩmalloc¡¢realloc¡¢free¡¢exitÔ­ÐÍ +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// + +/* + * ×¢£º + * + * ͨ³£À´½²£¬ÎÞȨͼ±»¼ò³ÆÎª¡¾Í¼¡¿£¬ÓÐȨͼ±»¼ò³ÆÎª¡¾Íø¡¿¡£ + * ÎÞÏòͼ/ÍøÖеĶ¥µã¹ØÏµ±»³ÆÎª¡¾±ß¡¿£¬ÓÐÏòͼ/ÍøÖеĶ¥µã¹ØÏµ±»³ÆÎª¡¾»¡¡¿£¬²¢Çø·Ö»¡Í·Ó뻡β¡£ + * ʵ¼Ê±íÊöÖУ¬Î´±Ø»áÑϸñ×ñÊØÒÔÉÏÃüÃû¡£ + * + * µ±Ç°½á¹¹Êʺϴ洢±ß/»¡±È½ÏÏ¡ÊèµÄͼ/Íø¡£ + * + * ¡ï ²åÈë±ß/»¡µÄÐÅϢʱ£¬ÕâÀïµÄʵÏÖÊǰ´"ÉýÐò"²åÈëµÄ£¬ÕâʹµÃ²åÈëµÄ»¡Êǰ´"ÉýÐò"ÅÅÁеġ£ + */ + + +/* ºê¶¨Òå */ +#define MAX_VERTEX_NUM 26 // ×î´ó¶¥µã¸öÊý + + +// ͼµÄÀàÐÍ +typedef enum { + DG, // 0-ÓÐÏòͼ + DN, // 1-ÓÐÏòÍø(´øÈ¨Öµ) + UDG, // 2-ÎÞÏòͼ + UDN // 3-ÎÞÏòÍø(´øÈ¨Öµ) +} GraphKind; + +// ¶¥µãµÄÊý¾ÝÀàÐÍ +typedef enum { + Operator, // ²Ù×÷·û£¬ÓÃ×Ö·û±íʾ£¬µ«¿ÉÒÔ´æ´¢µ½ÕûÐÍÖÐ + Operand // ²Ù×÷Êý£¬ÓÃÕûÊý±íʾ£¬Èç¹û½«À´À©³äµ½¸¡µãÊý£¬¿ÉÒÔͳһʹÓø¡µãÐÍ´æ´¢ +} Type; + +// ¶¥µã±àºÅÀàÐÍ +typedef char VertexType; + +// ¶¥µã´æ´¢µÄÊý¾Ý +typedef struct Vertex { + Type type; // ָʾµ±Ç°¶¥µãÊDzÙ×÷·û»¹ÊDzÙ×÷Êý + int op; // ´æ´¢µ±Ç°¶¥µã¶ÔÓ¦µÄ²Ù×÷·û/²Ù×÷Êý +} Vertex; + +// ±ß/»¡µÄÏà¹Ø¸½¼ÓÐÅÏ¢ +typedef struct { + /* + * ×¢£º + * ½Ì²ÄÖиø³öµÄ½á¹¹Ö»¿¼ÂÇÁËÎÞȨͼ£¬¶øÃ»¿¼ÂÇÓÐȨͼ(Íø)¡£ + * ÕâÀïΪÁ˰ѡ°Íø¡±µÄÇéÐÎÒ²¿¼ÂǽøÈ¥£¬ÌØÔÚ¸½¼ÓÐÅÏ¢ÖÐÔö¼ÓÁË"È¨ÖØ"ÊôÐÔ¡£ + */ + int weight; +} InfoType; + +/* ±ß/»¡½áµã */ +typedef struct ArcNode { + int adjvex; // ¸Ã»¡ËùÖ¸ÏòµÄ¶¥µãµÄλÖà + struct ArcNode* nextarc; // Ö¸ÏòÏÂÒ»Ìõ»¡µÄÖ¸Õë + InfoType* info; // »¡µÄ¸½¼ÓÐÅÏ¢£¬Í¨³£ºöÂÔ +} ArcNode; + +// ÿ¸öÁ´±íµÄÍ·½áµã +typedef struct VNode { + VertexType data; // ¶¥µãÐÅÏ¢ + Vertex context; // Óë¸Ã¶¥µã¶ÔÓ¦µÄ²Ù×÷·û/²Ù×÷Êý + ArcNode* firstarc; // Ö¸ÏòµÚÒ»ÌõÒÀ¸½¸Ã¶¥µãµÄ»¡µÄÖ¸Õë +} VNode; + +/* ͼµÄÁÚ½Ó±í´æ´¢±íʾÀàÐͶ¨Òå */ +typedef struct { + VNode vertices[MAX_VERTEX_NUM]; // ÁÚ½Ó±í + int vexnum, arcnum; // ͼ/ÍøµÄ¶¥µãÊýºÍ»¡Êý + GraphKind kind; // ͼµÄÀàÐͱêÖ¾ +} ALGraph; + + +// ±ß/»¡ÉÏÊÇ·ñ´æÔÚ¸½¼ÓÐÅÏ¢ +extern Boolean IncInfo; + + +/* + * ´´½¨ + * + *¡¾±¸×¢¡¿ + * + * ½Ì²ÄÖÐĬÈÏ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý¡£ + * ÕâÀïΪÁË·½±ã²âÊÔ£¬±ÜÃâÿ´ÎÔËÐж¼ÊÖ¶¯ÊäÈëÊý¾Ý£¬ + * Òò¶øÔÊÐíÑ¡Ôñ´ÓÔ¤ÉèµÄÎļþpathÖжÁÈ¡²âÊÔÊý¾Ý¡£ + * + * Èç¹ûÐèÒª´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý£¬ÔòpathΪNULL£¬»òpath[kind]Ϊ""¡£ + * Èç¹ûÐèÒª´ÓÎļþÖжÁÈ¡Êý¾Ý£¬ÔòÐèÒªÔÚpathÖÐÌîдÎļþÃûÐÅÏ¢¡£ + */ +Status CreateGraph(ALGraph* G, char* path[]); + +/* + * ¹¹ÔìÓÐÏòͼ + */ +static Status CreateDG(ALGraph* G); + +/* + * ¼Èë±ß/»¡µÄÏà¹Ø¸½¼ÓÐÅÏ¢ + */ +static void Input(ALGraph G, InfoType** info); + +/* + * ²éÕÒ + * + * ·µ»Ø¶¥µãuÔÚͼ/ÍøÖеÄλÖà + */ +int LocateVex(ALGraph G, VertexType u); + +/* + * ¹¹ÔìÒ»¸ö±ß/»¡½áµã(½öÏÞÄÚ²¿Ê¹ÓÃ) + */ +static ArcNode* newArcNodePtr(int adjvex, ArcNode* nextarc, InfoType* info); + +/* + * ²åÈë±ß/»¡ + * + * Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬Ôò²åÈëÒ»Ìõ»¡ÐèÒªÔö¼ÓÁ½¸ö¶¥µã¹ØÏµ£¬µ«»¡µÄÊýÁ¿Ö»ÔöÒ»¡£ + * ¶ÔÓÚͼ/ÍøÀ´Ëµ£¬¿ÉÒÔÔڿɱä²ÎÊýÖÐÁгö±ß/»¡µÄ¸½¼ÓÐÅÏ¢¡£ + * + * ×¢£º´Ë´¦½ÓÊյIJÎÊýÓëMGraphÓÐЩ²»Ò»Ñù£ºÍøµÄ¸½¼ÓÐÅÏ¢Öаüº¬Á˸÷Ìõ±ß/»¡µÄȨֵ¡£ + */ +Status InsertArc(ALGraph* G, VertexType v, VertexType w, ...); + +/* + * ÒÔͼÐλ¯ÐÎʽÊä³öµ±Ç°½á¹¹ + */ +void PrintGraph(ALGraph G); + +#endif diff --git a/Dev-C++/ExerciseBook/07.40/SqList.cpp b/Dev-C++/ExerciseBook/07.40/SqList.cpp new file mode 100644 index 0000000..623d818 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.40/SqList.cpp @@ -0,0 +1,114 @@ +/*============================= + * ÏßÐÔ±íµÄ˳Ðò´æ´¢½á¹¹£¨Ë³Ðò±í£© + * + * °üº¬Ëã·¨: 2.3¡¢2.4¡¢2.5¡¢2.6 + =============================*/ + +#include "SqList.h" + +/* + * ¨€¨€¨€¨€¨€¨€¨€¨€ Ëã·¨2.3 ¨€¨€¨€¨€¨€¨€¨€¨€ + * + * ³õʼ»¯ + * + * ³õʼ»¯³É¹¦Ôò·µ»ØOK£¬·ñÔò·µ»ØERROR¡£ + */ +Status InitList(SqList* L) { + // ·ÖÅäÖ¸¶¨ÈÝÁ¿µÄÄڴ棬Èç¹û·ÖÅäʧ°Ü£¬Ôò·µ»ØNULL + (*L).elem = (ElemType*) malloc(LIST_INIT_SIZE * sizeof(ElemType)); + if((*L).elem == NULL) { + // ´æ´¢ÄÚ´æÊ§°Ü + exit(OVERFLOW); + } + + (*L).length = 0; // ³õʼ»¯Ë³Ðò±í³¤¶ÈΪ0 + (*L).listsize = LIST_INIT_SIZE; // ˳Ðò±í³õʼÄÚ´æ·ÖÅäÁ¿ + + return OK; // ³õʼ»¯³É¹¦ +} + +/* + * ¼ÆÊý + * + * ·µ»ØË³Ðò±í°üº¬µÄÓÐÐ§ÔªËØµÄÊýÁ¿¡£ + */ +int ListLength(SqList L) { + return L.length; +} + +/* + * ȡֵ + * + * »ñȡ˳Ðò±íÖеÚi¸öÔªËØ£¬½«Æä´æ´¢µ½eÖС£ + * Èç¹û¿ÉÒÔÕÒµ½£¬·µ»ØOK£¬·ñÔò£¬·µ»ØERROR¡£ + * + *¡¾±¸×¢¡¿ + * ½Ì²ÄÖÐiµÄº¬ÒåÊÇÔªËØÎ»Ö㬴Ó1¿ªÊ¼¼ÆÊý£¬µ«Õâ²»·ûºÏ±àÂëµÄͨÓÃÔ¼¶¨¡£ + * ͨ³££¬iµÄº¬ÒåÓ¦¸ÃÖ¸Ë÷Òý£¬¼´´Ó0¿ªÊ¼¼ÆÊý¡£ + */ +Status GetElem(SqList L, int i, ElemType* e) { + // ÒòΪiµÄº¬ÒåÊÇλÖã¬ËùÒÔÆäºÏ·¨·¶Î§ÊÇ£º[1, length] + if(i < 1 || i > L.length) { + return ERROR; //iÖµ²»ºÏ·¨ + } + + *e = L.elem[i - 1]; + + return OK; +} + +/* + * ¨€¨€¨€¨€¨€¨€¨€¨€ Ëã·¨2.4 ¨€¨€¨€¨€¨€¨€¨€¨€ + * + * ²åÈë + * + * Ïò˳Ðò±íµÚi¸öλÖÃÉϲåÈëe£¬²åÈë³É¹¦Ôò·µ»ØOK£¬·ñÔò·µ»ØERROR¡£ + * + *¡¾±¸×¢¡¿ + * ½Ì²ÄÖÐiµÄº¬ÒåÊÇÔªËØÎ»Ö㬴Ó1¿ªÊ¼¼ÆÊý + */ +Status ListInsert(SqList* L, int i, ElemType e) { + ElemType* newbase; + ElemType* p, * q; + + // È·±£Ë³Ðò±í½á¹¹´æÔÚ + if(L == NULL || (*L).elem == NULL) { + return ERROR; + } + + // iÖµÔ½½ç + if(i < 1 || i > (*L).length + 1) { + return ERROR; + } + + // Èô´æ´¢¿Õ¼äÒÑÂú£¬ÔòÔö¼Óпռä + if((*L).length >= (*L).listsize) { + // »ùÓÚÏÖÓпռäÀ©ÈÝ + newbase = (ElemType*) realloc((*L).elem, ((*L).listsize + LISTINCREMENT) * sizeof(ElemType)); + if(newbase == NULL) { + // ´æ´¢ÄÚ´æÊ§°Ü + exit(OVERFLOW); + } + + // лùÖ· + (*L).elem = newbase; + // ´æµÄ´æ´¢¿Õ¼ä + (*L).listsize += LISTINCREMENT; + } + + // qΪ²åÈëλÖà + q = &(*L).elem[i - 1]; + + // 1.ÓÒÒÆÔªËØ£¬ÌÚ³öλÖà + for(p = &(*L).elem[(*L).length - 1]; p >= q; --p) { + *(p + 1) = *p; + } + + // 2.²åÈëe + *q = e; + + // 3.±í³¤Ôö1 + (*L).length++; + + return OK; +} diff --git a/Dev-C++/ExerciseBook/07.40/SqList.h b/Dev-C++/ExerciseBook/07.40/SqList.h new file mode 100644 index 0000000..8788fdb --- /dev/null +++ b/Dev-C++/ExerciseBook/07.40/SqList.h @@ -0,0 +1,74 @@ +/*============================= + * ÏßÐÔ±íµÄ˳Ðò´æ´¢½á¹¹£¨Ë³Ðò±í£© + * + * °üº¬Ëã·¨: 2.3¡¢2.4¡¢2.5¡¢2.6 + =============================*/ + +#ifndef SQLIST_H +#define SQLIST_H + +#include +#include // Ìṩmalloc¡¢realloc¡¢free¡¢exitÔ­ÐÍ +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// +#include "ALGraph.h" //**¡ø07 ͼ**// + +/* ºê¶¨Òå */ +#define LIST_INIT_SIZE 100 // ˳Ðò±í´æ´¢¿Õ¼äµÄ³õʼ·ÖÅäÁ¿ +#define LISTINCREMENT 10 // ˳Ðò±í´æ´¢¿Õ¼äµÄ·ÖÅäÔöÁ¿ + +/* ˳Ðò±íÔªËØÀàÐͶ¨Òå */ +typedef Vertex ElemType; + +/* + * ˳Ðò±í½á¹¹ + * + * ×¢£ºelemÔÚʹÓÃǰÐèÒªÏÈΪÆä·ÖÅäÄڴ棬ÇÒÔªËØ´Óelem[0]´¦¿ªÊ¼´æ´¢ + */ +typedef struct { + ElemType* elem; // ˳Ðò±í´æ´¢¿Õ¼äµÄ»ùÖ·£¨Ö¸Ïò˳Ðò±íËùÕ¼ÄÚ´æµÄÆðʼλÖã© + int length; // µ±Ç°Ë³Ðò±í³¤¶È£¨°üº¬¶àÉÙÔªËØ£© + int listsize; // µ±Ç°·ÖÅäµÄ´æ´¢ÈÝÁ¿£¨¿ÉÒÔ´æ´¢¶àÉÙÔªËØ£© +} SqList; + + +/* + * ¨€¨€¨€¨€¨€¨€¨€¨€ Ëã·¨2.3 ¨€¨€¨€¨€¨€¨€¨€¨€ + * + * ³õʼ»¯ + * + * ³õʼ»¯³É¹¦Ôò·µ»ØOK£¬·ñÔò·µ»ØERROR¡£ + */ +Status InitList(SqList* L); + +/* + * ¼ÆÊý + * + * ·µ»ØË³Ðò±í°üº¬µÄÓÐÐ§ÔªËØµÄÊýÁ¿¡£ + */ +int ListLength(SqList L); + +/* + * ȡֵ + * + * »ñȡ˳Ðò±íÖеÚi¸öÔªËØ£¬½«Æä´æ´¢µ½eÖС£ + * Èç¹û¿ÉÒÔÕÒµ½£¬·µ»ØOK£¬·ñÔò£¬·µ»ØERROR¡£ + * + *¡¾±¸×¢¡¿ + * ½Ì²ÄÖÐiµÄº¬ÒåÊÇÔªËØÎ»Ö㬴Ó1¿ªÊ¼¼ÆÊý£¬µ«Õâ²»·ûºÏ±àÂëµÄͨÓÃÔ¼¶¨¡£ + * ͨ³££¬iµÄº¬ÒåÓ¦¸ÃÖ¸Ë÷Òý£¬¼´´Ó0¿ªÊ¼¼ÆÊý¡£ + */ +Status GetElem(SqList L, int i, ElemType* e); + +/* + * ¨€¨€¨€¨€¨€¨€¨€¨€ Ëã·¨2.4 ¨€¨€¨€¨€¨€¨€¨€¨€ + * + * ²åÈë + * + * Ïò˳Ðò±íµÚi¸öλÖÃÉϲåÈëe£¬²åÈë³É¹¦Ôò·µ»ØOK£¬·ñÔò·µ»ØERROR¡£ + * + *¡¾±¸×¢¡¿ + * ½Ì²ÄÖÐiµÄº¬ÒåÊÇÔªËØÎ»Ö㬴Ó1¿ªÊ¼¼ÆÊý + */ +Status ListInsert(SqList* L, int i, ElemType e); + +#endif diff --git a/Dev-C++/ExerciseBook/07.40/TestData_DG.txt b/Dev-C++/ExerciseBook/07.40/TestData_DG.txt new file mode 100644 index 0000000..87b0ea5 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.40/TestData_DG.txt @@ -0,0 +1,8 @@ +ͼÀàÐÍ¡ú0£¨ÓÐÏòͼ£© +¶¥µãÊý¡ú12 +»¡Êý¡ú14 +»¡ÊÇ·ñ´øÓÐÆäËûÐÅÏ¢¡ú0 +¶¥µã¼¯¡ú¡¾A£¬B£¬C£¬D£¬E£¬F£¬G£¬H£¬I£¬J£¬K£¬L¡¿ +»¡µÄ¼¯ºÏ¡ú¡¾A£¬B¡¿¡¾A£¬D¡¿¡¾B£¬C¡¿¡¾B£¬D¡¿¡¾C£¬E¡¿¡¾C£¬F¡¿¡¾F£¬G¡¿¡¾D£¬G¡¿¡¾D£¬H¡¿¡¾E£¬I¡¿¡¾E£¬J¡¿¡¾F£¬J¡¿¡¾G£¬K¡¿¡¾G£¬L¡¿ + +Óë¶¥µã¶ÔÓ¦µÄ²Ù×÷ÊýÓë²Ù×÷·û¡ú¡¾0£¬*¡¿¡¾0£¬+¡¿¡¾0£¬*¡¿¡¾0£¬*¡¿¡¾0£¬+¡¿¡¾0£¬*¡¿¡¾0£¬+¡¿¡¾1£¬12¡¿¡¾1£¬3¡¿¡¾1£¬4¡¿¡¾1£¬5¡¿¡¾1£¬6¡¿ \ No newline at end of file diff --git a/Dev-C++/ExerciseBook/07.41/07.41.cpp b/Dev-C++/ExerciseBook/07.41/07.41.cpp new file mode 100644 index 0000000..8a776be --- /dev/null +++ b/Dev-C++/ExerciseBook/07.41/07.41.cpp @@ -0,0 +1,160 @@ +#include +#include "SqStack.h" +#include "ALGraph.h" + +// »º´æÒÑÕÒµ½µÄȨֵºÍ×î´óµÄ·¾¶µÄȨֵºÍ +static int MAX = -1; + + +/* + * ÇóÈ¡ÓÐÏòÍøÖеĹؼü·¾¶(CPM) + * + * ´Ë´¦ÀûÓÃÉî¶ÈÓÅÏȱéÀúµÄ˼ÏëÀ´ÇóÈ¡¹Ø¼ü·¾¶£¬Æä»ù±¾Ô­ÀíÊÇ£º¹Ø¼ü·¾¶ = ȨֵºÍ×î´óµÄ·¾¶ + * + * ×¢£º½Ì²ÄÖÐÓ¦¸ÃÊDZÊÎ󣬲»ÊÇÇóÓÐÏòͼµÄ¹Ø¼ü·¾¶£¬¶øÊÇÇóÓÐÏòÍøµÄ×·¾¶ + */ +void Algo_7_41(ALGraph G); + +/* + * ²éÕҹؼü·¾¶ÉϵÄÔ´µã + * + * ´Ë´¦Ê¹ÓÃÁíÍâÒ»ÖÖ·½Ê½ÇóÔ´µã£¬¶ø²»ÊÇÏñ֮ǰһÑùͨ¹ýÈë¶ÈÐÅÏ¢ÇóÔ´µã£¬ + * ²»¹ýÕâÁ½ÖÖ·½·¨ÊÇÊâ;ͬ¹éµÄ¡£ + */ +static int FindBegin_7_41(ALGraph G); + +/* + * ͨ¹ýÉî¶ÈÓÅÏȱéÀú²éÕÒͼÖдӶ¥µãv³ö·¢µÄȨֵ×µÄ·¾¶(¹Ø¼ü·¾¶)¡£ + * + * sumºÍSÓÃÀ´»º´æÂ·¾¶È¨ÖµºÍÓëÒѾ­ÕÒµ½µÄ·¾¶£¬ + * pathÓÃÀ´¼Ç¼µ±Ç°ÕÒµ½µÄȨֵºÍ×î´óµÄ·¾¶£¬path[0]ÉÏ´æ´¢¶¥µãÊýÁ¿¡£ + */ +static void FindPath_7_41(ALGraph G, int v, int sum, SqStack* S, int path[MAX_VERTEX_NUM + 1]); + + +int main(int argc, char* argv[]) { + ALGraph G; + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ´´½¨²¢´òÓ¡ÓÐÏòÍø... \n"); + { + char* path[4]; + + path[0] = ""; + path[1] = "TestData_DN.txt"; + path[2] = ""; + path[3] = ""; + + CreateGraph(&G, path); + PrintGraph(G); + } + PressEnterToContinue(debug); + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ÇóÈ¡ÓÐÏòÍøµÄ¹Ø¼ü·¾¶... \n"); + { + Algo_7_41(G); + } + PressEnterToContinue(debug); + + return 0; +} + + +/* + * ÇóÈ¡ÓÐÏòÍøÖеĹؼü·¾¶(CPM) + * + * ´Ë´¦ÀûÓÃÉî¶ÈÓÅÏȱéÀúµÄ˼ÏëÀ´ÇóÈ¡¹Ø¼ü·¾¶£¬Æä»ù±¾Ô­ÀíÊÇ£º¹Ø¼ü·¾¶ = ȨֵºÍ×î´óµÄ·¾¶ + * + * ×¢£º½Ì²ÄÖÐÓ¦¸ÃÊDZÊÎ󣬲»ÊÇÇóÓÐÏòͼµÄ¹Ø¼ü·¾¶£¬¶øÊÇÇóÓÐÏòÍøµÄ×·¾¶ + */ +void Algo_7_41(ALGraph G) { + int i; + int begin; // ¹Ø¼ü·¾¶ÉϵÄÔ´µã + int path[MAX_VERTEX_NUM + 1] = {-1}; // ´æ´¢È¨ÖµºÍ×î´óµÄ·¾¶£¬0ºÃµ¥Ôª´æ´¢È¨ÖµºÍ + SqStack S; + + // ²éÕҹؼü·¾¶ÉϵÄÔ´µã + begin = FindBegin_7_41(G); + + InitStack(&S); + + FindPath_7_41(G, begin, 0, &S, path); + + printf("ÒÑÕÒµ½µÄȨֵºÍ×î´óµÄ·¾¶(¹Ø¼ü·¾¶)Ϊ£º"); + for(i = 1; i <= path[0]; i++) { + printf("%c ", G.vertices[path[i]].data); + } + printf("\n"); +} + +/* + * ²éÕҹؼü·¾¶ÉϵÄÔ´µã + * + * ´Ë´¦Ê¹ÓÃÁíÍâÒ»ÖÖ·½Ê½ÇóÔ´µã£¬¶ø²»ÊÇÏñ֮ǰһÑùͨ¹ýÈë¶ÈÐÅÏ¢ÇóÔ´µã£¬ + * ²»¹ýÕâÁ½ÖÖ·½·¨ÊÇÊâ;ͬ¹éµÄ¡£ + */ +static int FindBegin_7_41(ALGraph G) { + int k; + ArcNode* p; + Boolean isAdj[MAX_VERTEX_NUM] = {FALSE}; // ¼Ç¼ÄÄЩ¶¥µã×öÁËÁÚ½Óµã + + // ÕÒµ½ËùÓÐÁÚ½Óµã + for(k = 0; k < G.vexnum; k++) { + for(p = G.vertices[k].firstarc; p != NULL; p = p->nextarc) { + isAdj[p->adjvex] = TRUE; + } + } + + // ¹Ø¼ü·¾¶ÉϵÄÔ´µãûÓÐÈ뻡£¬ËùÒÔÒ²²»»á³ÉΪ±ðµÄ¶¥µãµÄÁÚ½Óµã + for(k = 0; k < G.vexnum; k++) { + if(isAdj[k] == FALSE) { + return k; + } + } + + return -1; +} + +/* + * ͨ¹ýÉî¶ÈÓÅÏȱéÀú²éÕÒͼÖдӶ¥µãv³ö·¢µÄȨֵ×µÄ·¾¶(¹Ø¼ü·¾¶)¡£ + * + * sumºÍSÓÃÀ´»º´æÂ·¾¶È¨ÖµºÍÓëÒѾ­ÕÒµ½µÄ·¾¶£¬ + * pathÓÃÀ´¼Ç¼µ±Ç°ÕÒµ½µÄȨֵºÍ×î´óµÄ·¾¶£¬path[0]ÉÏ´æ´¢¶¥µãÊýÁ¿¡£ + */ +static void FindPath_7_41(ALGraph G, int v, int sum, SqStack* S, int path[MAX_VERTEX_NUM + 1]) { + int i; + ArcNode* p; + SElemType e; + + // ½«Óöµ½µÄ¶¥µãÔݴ浽·¾¶Õ» + Push(S, v); + + // Éî¶ÈÓÅÏȱéÀú + for(p = G.vertices[v].firstarc; p != NULL; p = p->nextarc) { + sum += p->info->weight; + FindPath_7_41(G, p->adjvex, sum, S, path); + sum -= p->info->weight; + } + + /* + * ÖÁ´Ë£¬´Ë·¾¶ÒѱéÀúµ½Á˾¡Í·£¬ + * Èç¹û¸Ã·¾¶µÄȨֵºÍ±È֮ǰÕÒµ½µÄ·¾¶È¨ÖµºÍ¸ü´ó£¬ÔòÐèÒª°Ñ¸Ã·¾¶ÍêÕûµØ±£´æµ½pathÖУ¬ + * ±£´æÍê³Éºó£¬½«µ±Ç°¶¥µãvÍËÕ» + */ + + // Èç¹û¸Ã¶¥µãÊÇÖÕµã(±íÏÖΪûÓÐÁÚ½Óµã) + if(G.vertices[v].firstarc == NULL) { + // ·¢ÏÖÁËȨֵºÍ¸ü´óµÄ·¾¶ + if(sum > MAX) { + MAX = sum; + + path[0] = StackLength(*S); + + // ½«Õ»Öб£´æµÄ·¾¶¸´ÖƵ½pathÖÐ + for(i = 0; i < StackLength(*S); i++) { + path[i + 1] = S->base[i]; + } + } + } + + Pop(S, &e); +} diff --git a/Dev-C++/ExerciseBook/07.41/07.41.dev b/Dev-C++/ExerciseBook/07.41/07.41.dev new file mode 100644 index 0000000..cf4b1ec --- /dev/null +++ b/Dev-C++/ExerciseBook/07.41/07.41.dev @@ -0,0 +1,111 @@ +[Project] +FileName=07.41.dev +Name=07.41 +Type=1 +Ver=2 +ObjFiles= +Includes= +Libs= +PrivateResource= +ResourceIncludes= +MakeIncludes= +Compiler= +CppCompiler= +Linker= +IsCpp=0 +Icon= +ExeOutput= +ObjectOutput= +LogOutput= +LogOutputEnabled=0 +OverrideOutput=0 +OverrideOutputName= +HostApplication= +UseCustomMakefile=0 +CustomMakefile= +CommandLine= +Folders= +IncludeVersionInfo=0 +SupportXPThemes=0 +CompilerSet=1 +CompilerSettings=0000000000000000001000000 +UnitCount=6 + +[VersionInfo] +Major=1 +Minor=0 +Release=0 +Build=0 +LanguageID=1033 +CharsetID=1252 +CompanyName= +FileVersion= +FileDescription=Developed using the Dev-C++ IDE +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion= +AutoIncBuildNr=0 +SyncProduct=1 + +[Unit1] +FileName=07.41.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit2] +FileName=ALGraph.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit3] +FileName=ALGraph.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit4] +FileName=SqStack.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit5] +FileName=SqStack.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit6] +FileName=TestData_DN.txt +Folder= +Compile=0 +Link=0 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + diff --git a/Dev-C++/ExerciseBook/07.41/07.41.png b/Dev-C++/ExerciseBook/07.41/07.41.png new file mode 100644 index 0000000000000000000000000000000000000000..3ed9f7963757766a92efdbd61a2ad0480732600d GIT binary patch literal 36952 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 + InsertArc(G, v1, v2, info); + } + + // ´ÓÎļþÖжÁÈ¡Êý¾Ýʱ£¬×îºóÆäʵӦµ±ÅжÏÒ»ÏÂÊÇ·ñ¶Áµ½ÁË×ã¹»µÄÐÅÏ¢ + return OK; +} + +/* + * ¼Èë±ß/»¡µÄÏà¹Ø¸½¼ÓÐÅÏ¢ + */ +static void Input(ALGraph G, InfoType** info) { + int weight; + + // ÔÚ"Íø"µÄÇéÐÎÏÂÐèҪ¼ÈëȨֵÐÅÏ¢ + if(G.kind == DN || G.kind == UDN) { + *info = (InfoType*) malloc(sizeof(InfoType)); + + if(fp == NULL) { + scanf("%d", &weight); + } else { + ReadData(fp, "%d", &weight); + } + + (*info)->weight = weight; + } +} + +/* + * ²éÕÒ + * + * ·µ»Ø¶¥µãuÔÚͼ/ÍøÖеÄλÖà + */ +int LocateVex(ALGraph G, VertexType u) { + int i; + + for(i = 0; i < G.vexnum; i++) { + if(G.vertices[i].data == u) { + return i; + } + } + + return -1; +} + +/* + * ¹¹ÔìÒ»¸ö±ß/»¡½áµã(½öÏÞÄÚ²¿Ê¹ÓÃ) + */ +static ArcNode* newArcNodePtr(int adjvex, ArcNode* nextarc, InfoType* info) { + ArcNode* p = (ArcNode*) malloc(sizeof(ArcNode)); + if(!p) { + exit(OVERFLOW); + } + + p->adjvex = adjvex; + + p->nextarc = nextarc; + + p->info = info; + + return p; +} + +/* + * ²åÈë±ß/»¡ + * + * Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬Ôò²åÈëÒ»Ìõ»¡ÐèÒªÔö¼ÓÁ½¸ö¶¥µã¹ØÏµ£¬µ«»¡µÄÊýÁ¿Ö»ÔöÒ»¡£ + * ¶ÔÓÚͼ/ÍøÀ´Ëµ£¬¿ÉÒÔÔڿɱä²ÎÊýÖÐÁгö±ß/»¡µÄ¸½¼ÓÐÅÏ¢¡£ + * + * ×¢£º´Ë´¦½ÓÊյIJÎÊýÓëMGraphÓÐЩ²»Ò»Ñù£ºÍøµÄ¸½¼ÓÐÅÏ¢Öаüº¬Á˸÷Ìõ±ß/»¡µÄȨֵ¡£ + */ +Status InsertArc(ALGraph* G, VertexType v, VertexType w, ...) { + int tail, head, k, count; + ArcNode* r; + ArcNode* pre; + Boolean overlay = FALSE; // ÊÇ·ñΪ¸²¸ÇÌí¼Ó + InfoType* info = NULL; // ±ß/»¡µÄ¸½¼ÓÐÅÏ¢ + va_list ap; + + tail = LocateVex(*G, v); // »ñÈ¡¶¥µãvÔÚ¶¥µã¼¯ÖеÄλÖà + if(tail == -1) { + return ERROR; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + head = LocateVex(*G, w); // »ñÈ¡¶¥µãwÔÚ¶¥µã¼¯ÖеÄλÖà + if(head == -1) { + return ERROR; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + // ¾Ü¾ø»· + if(tail == head) { + return ERROR; + } + + // Èç¹û±ß/»¡ÉÏ´æÔÚ¸½¼ÓÐÅÏ¢ + if(IncInfo) { + va_start(ap, w); // ÔÚwºó²éѯÊ׸ö¿É±ä²ÎÊý + info = va_arg(ap, InfoType*); // »ñÈ¡¸½¼ÓÐÅÏ¢ + va_end(ap); + } + + /* ½ÓÏÂÀ´£¬ÐèÒª²éÕÒºÏÊʵIJåÈëλÖà */ + + for(count = 0; count < 2; count++) { + pre = NULL; + // Ö¸ÏòÒÔtailΪβµÄÊ×Ìõ±ß/»¡ + r = G->vertices[tail].firstarc; + while(r != NULL && r->adjvex < head) { + pre = r; + r = r->nextarc; + } + + // Óöµ½ÁËÏàͬλÖõĽáµã + if(r != NULL && r->adjvex == head) { + r->info = info; // ¸´Óøýáµã + overlay = TRUE; // ·¢ÉúÁ˸²¸Ç + } else { + if(pre == NULL) { + G->vertices[tail].firstarc = newArcNodePtr(head, r, info); + } else { + pre->nextarc = newArcNodePtr(head, r, info); + } + } + + // Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬ÐèÒª¿¼ÂǶԳÆÐÔ + if((G->kind == UDG || G->kind == UDN) && tail != head) { + // µßµ¹iºÍj + k = tail; + tail = head; + head = k; + } else { + break; // Èç¹ûÊÇÓÐÏòµÄ£¬¿ÉÒÔ½áÊøÁË + } + } + + // ÔڷǸ²¸ÇµÄÇéÐÎÏ£¬²Å¿¼ÂǸüбß/»¡µÄÊýÁ¿ + if(!overlay) { + (*G).arcnum++; // ²»ÂÛÓÐÏòÎÞÏò£¬±ß/»¡ÊýÖ»ÔöÒ» + } + + return OK; +} + +/* + * ÒÔͼÐλ¯ÐÎʽÊä³öµ±Ç°½á¹¹ + */ +void PrintGraph(ALGraph G) { + int i; + ArcNode* p; + + if(G.vexnum == 0) { + printf("¿Õͼ£¬ÎÞÐè´òÓ¡£¡\n"); + return; + } + + printf("µ±Ç°Í¼/Íø°üº¬ %2d ¸ö¶¥µã£¬ %2d Ìõ±ß/»¡...\n", G.vexnum, G.arcnum); + + for(i = 0; i < G.vexnum; i++) { + printf("%c ===> ", G.vertices[i].data); + + p = G.vertices[i].firstarc; + while(p != NULL) { + if(IncInfo == 0) { + printf("%c ", G.vertices[p->adjvex].data); + + // ¶ÔÓÚÍø£¬»á´ÓÆä¸½¼ÓÐÅÏ¢ÖлñÈ¡µ½È¨Öµ + } else { + printf("%c[%2d] ", G.vertices[p->adjvex].data, p->info->weight); + } + + p = p->nextarc; + + if(p != NULL) { + printf("- "); + } + } + + printf("\n"); + } +} diff --git a/Dev-C++/ExerciseBook/07.41/ALGraph.h b/Dev-C++/ExerciseBook/07.41/ALGraph.h new file mode 100644 index 0000000..db081e5 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.41/ALGraph.h @@ -0,0 +1,128 @@ +/*================== + * ͼµÄÁÚ½Ó±í´æ´¢±íʾ + ===================*/ + +#ifndef ALGRAPH_H +#define ALGRAPH_H + +#include +#include // Ìṩmemset¡¢strcmp Ô­ÐÍ +#include // Ìṩºêva_list¡¢va_start¡¢va_arg¡¢va_end +#include // Ìṩmalloc¡¢realloc¡¢free¡¢exitÔ­ÐÍ +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// + +/* + * ×¢£º + * + * ͨ³£À´½²£¬ÎÞȨͼ±»¼ò³ÆÎª¡¾Í¼¡¿£¬ÓÐȨͼ±»¼ò³ÆÎª¡¾Íø¡¿¡£ + * ÎÞÏòͼ/ÍøÖеĶ¥µã¹ØÏµ±»³ÆÎª¡¾±ß¡¿£¬ÓÐÏòͼ/ÍøÖеĶ¥µã¹ØÏµ±»³ÆÎª¡¾»¡¡¿£¬²¢Çø·Ö»¡Í·Ó뻡β¡£ + * ʵ¼Ê±íÊöÖУ¬Î´±Ø»áÑϸñ×ñÊØÒÔÉÏÃüÃû¡£ + * + * µ±Ç°½á¹¹Êʺϴ洢±ß/»¡±È½ÏÏ¡ÊèµÄͼ/Íø¡£ + * + * ¡ï ²åÈë±ß/»¡µÄÐÅϢʱ£¬ÕâÀïµÄʵÏÖÊǰ´"ÉýÐò"²åÈëµÄ£¬ÕâʹµÃ²åÈëµÄ»¡Êǰ´"ÉýÐò"ÅÅÁеġ£ + */ + + +/* ºê¶¨Òå */ +#define MAX_VERTEX_NUM 26 // ×î´ó¶¥µã¸öÊý + + +// ͼµÄÀàÐÍ +typedef enum { + DG, // 0-ÓÐÏòͼ + DN, // 1-ÓÐÏòÍø(´øÈ¨Öµ) + UDG, // 2-ÎÞÏòͼ + UDN // 3-ÎÞÏòÍø(´øÈ¨Öµ) +} GraphKind; + +// ¶¥µãÀàÐÍ +typedef char VertexType; + +// ±ß/»¡µÄÏà¹Ø¸½¼ÓÐÅÏ¢ +typedef struct { + /* + * ×¢£º + * ½Ì²ÄÖиø³öµÄ½á¹¹Ö»¿¼ÂÇÁËÎÞȨͼ£¬¶øÃ»¿¼ÂÇÓÐȨͼ(Íø)¡£ + * ÕâÀïΪÁ˰ѡ°Íø¡±µÄÇéÐÎÒ²¿¼ÂǽøÈ¥£¬ÌØÔÚ¸½¼ÓÐÅÏ¢ÖÐÔö¼ÓÁË"È¨ÖØ"ÊôÐÔ¡£ + */ + int weight; +} InfoType; + +/* ±ß/»¡½áµã */ +typedef struct ArcNode { + int adjvex; // ¸Ã»¡ËùÖ¸ÏòµÄ¶¥µãµÄλÖà + struct ArcNode* nextarc; // Ö¸ÏòÏÂÒ»Ìõ»¡µÄÖ¸Õë + InfoType* info; // »¡µÄ¸½¼ÓÐÅÏ¢£¬Í¨³£ºöÂÔ +} ArcNode; + +// ÿ¸öÁ´±íµÄÍ·½áµã +typedef struct VNode { + VertexType data; // ¶¥µãÐÅÏ¢ + ArcNode* firstarc; // Ö¸ÏòµÚÒ»ÌõÒÀ¸½¸Ã¶¥µãµÄ»¡µÄÖ¸Õë +} VNode; + +/* ͼµÄÁÚ½Ó±í´æ´¢±íʾÀàÐͶ¨Òå */ +typedef struct { + VNode vertices[MAX_VERTEX_NUM]; // ÁÚ½Ó±í + int vexnum, arcnum; // ͼ/ÍøµÄ¶¥µãÊýºÍ»¡Êý + GraphKind kind; // ͼµÄÀàÐͱêÖ¾ +} ALGraph; + + +// ±ß/»¡ÉÏÊÇ·ñ´æÔÚ¸½¼ÓÐÅÏ¢ +extern Boolean IncInfo; + + +/* + * ´´½¨ + * + *¡¾±¸×¢¡¿ + * + * ½Ì²ÄÖÐĬÈÏ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý¡£ + * ÕâÀïΪÁË·½±ã²âÊÔ£¬±ÜÃâÿ´ÎÔËÐж¼ÊÖ¶¯ÊäÈëÊý¾Ý£¬ + * Òò¶øÔÊÐíÑ¡Ôñ´ÓÔ¤ÉèµÄÎļþpathÖжÁÈ¡²âÊÔÊý¾Ý¡£ + * + * Èç¹ûÐèÒª´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý£¬ÔòpathΪNULL£¬»òpath[kind]Ϊ""¡£ + * Èç¹ûÐèÒª´ÓÎļþÖжÁÈ¡Êý¾Ý£¬ÔòÐèÒªÔÚpathÖÐÌîдÎļþÃûÐÅÏ¢¡£ + */ +Status CreateGraph(ALGraph* G, char* path[]); + +/* + * ¹¹ÔìÓÐÏòÍø + */ +static Status CreateDN(ALGraph* G); + +/* + * ¼Èë±ß/»¡µÄÏà¹Ø¸½¼ÓÐÅÏ¢ + */ +static void Input(ALGraph G, InfoType** info); + +/* + * ²éÕÒ + * + * ·µ»Ø¶¥µãuÔÚͼ/ÍøÖеÄλÖà + */ +int LocateVex(ALGraph G, VertexType u); + +/* + * ¹¹ÔìÒ»¸ö±ß/»¡½áµã(½öÏÞÄÚ²¿Ê¹ÓÃ) + */ +static ArcNode* newArcNodePtr(int adjvex, ArcNode* nextarc, InfoType* info); + +/* + * ²åÈë±ß/»¡ + * + * Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬Ôò²åÈëÒ»Ìõ»¡ÐèÒªÔö¼ÓÁ½¸ö¶¥µã¹ØÏµ£¬µ«»¡µÄÊýÁ¿Ö»ÔöÒ»¡£ + * ¶ÔÓÚͼ/ÍøÀ´Ëµ£¬¿ÉÒÔÔڿɱä²ÎÊýÖÐÁгö±ß/»¡µÄ¸½¼ÓÐÅÏ¢¡£ + * + * ×¢£º´Ë´¦½ÓÊյIJÎÊýÓëMGraphÓÐЩ²»Ò»Ñù£ºÍøµÄ¸½¼ÓÐÅÏ¢Öаüº¬Á˸÷Ìõ±ß/»¡µÄȨֵ¡£ + */ +Status InsertArc(ALGraph* G, VertexType v, VertexType w, ...); + +/* + * ÒÔͼÐλ¯ÐÎʽÊä³öµ±Ç°½á¹¹ + */ +void PrintGraph(ALGraph G); + +#endif diff --git a/Dev-C++/ExerciseBook/07.41/SqStack.cpp b/Dev-C++/ExerciseBook/07.41/SqStack.cpp new file mode 100644 index 0000000..db1b22c --- /dev/null +++ b/Dev-C++/ExerciseBook/07.41/SqStack.cpp @@ -0,0 +1,103 @@ +/*========================= + * Õ»µÄ˳Ðò´æ´¢½á¹¹£¨Ë³ÐòÕ»£© + ==========================*/ + +#include "SqStack.h" //**¡ø03 Õ»ºÍ¶ÓÁÐ**// + +/* + * ³õʼ»¯ + * + * ¹¹ÔìÒ»¸ö¿ÕÕ»¡£³õʼ»¯³É¹¦Ôò·µ»ØOK£¬·ñÔò·µ»ØERROR¡£ + */ +Status InitStack(SqStack* S) { + if(S == NULL) { + return ERROR; + } + + (*S).base = (SElemType*) malloc(STACK_INIT_SIZE * sizeof(SElemType)); + if((*S).base == NULL) { + exit(OVERFLOW); + } + + (*S).top = (*S).base; + (*S).stacksize = STACK_INIT_SIZE; + + return OK; +} + +/* + * ÅÐ¿Õ + * + * ÅжÏ˳ÐòÕ»ÖÐÊÇ·ñ°üº¬ÓÐЧÊý¾Ý¡£ + * + * ·µ»ØÖµ£º + * TRUE : ˳ÐòջΪ¿Õ + * FALSE: ˳ÐòÕ»²»Îª¿Õ + */ +Status StackEmpty(SqStack S) { + if(S.top == S.base) { + return TRUE; + } else { + return FALSE; + } +} + +/* + * ¼ÆÊý + * + * ·µ»ØË³ÐòÕ»°üº¬µÄÓÐÐ§ÔªËØµÄÊýÁ¿¡£ + */ +int StackLength(SqStack S) { + if(S.base == NULL) { + return 0; + } + + return (int) (S.top - S.base); +} + +/* + * ÈëÕ» + * + * ½«ÔªËØeѹÈëµ½Õ»¶¥¡£ + */ +Status Push(SqStack* S, SElemType e) { + if(S == NULL || (*S).base == NULL) { + return ERROR; + } + + // Õ»Âúʱ£¬×·¼Ó´æ´¢¿Õ¼ä + if((*S).top - (*S).base >= (*S).stacksize) { + (*S).base = (SElemType*) realloc((*S).base, ((*S).stacksize + STACKINCREMENT) * sizeof(SElemType)); + if((*S).base == NULL) { + exit(OVERFLOW); // ´æ´¢·ÖÅäʧ°Ü + } + + (*S).top = (*S).base + (*S).stacksize; + (*S).stacksize += STACKINCREMENT; + } + + // ½øÕ»Ïȸ³Öµ£¬Õ»¶¥Ö¸ÕëÔÙ×ÔÔö + *(S->top++) = e; + + return OK; +} + +/* + * ³öÕ» + * + * ½«Õ»¶¥ÔªËص¯³ö£¬²¢ÓÃe½ÓÊÕ¡£ + */ +Status Pop(SqStack* S, SElemType* e) { + if(S == NULL || (*S).base == NULL) { + return ERROR; + } + + if((*S).top == (*S).base) { + return ERROR; + } + + // ³öÕ»Õ»¶¥Ö¸ÕëÏȵݼõ£¬ÔÙ¸³Öµ + *e = *(--(*S).top); + + return OK; +} diff --git a/Dev-C++/ExerciseBook/07.41/SqStack.h b/Dev-C++/ExerciseBook/07.41/SqStack.h new file mode 100644 index 0000000..0c87d76 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.41/SqStack.h @@ -0,0 +1,66 @@ +/*========================= + * Õ»µÄ˳Ðò´æ´¢½á¹¹£¨Ë³ÐòÕ»£© + ==========================*/ + +#ifndef SQSTACK_H +#define SQSTACK_H + +#include +#include // Ìṩmalloc¡¢realloc¡¢free¡¢exitÔ­ÐÍ +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// + +/* ºê¶¨Òå */ +#define STACK_INIT_SIZE 100 // ˳ÐòÕ»´æ´¢¿Õ¼äµÄ³õʼ·ÖÅäÁ¿ +#define STACKINCREMENT 10 // ˳ÐòÕ»´æ´¢¿Õ¼äµÄ·ÖÅäÔöÁ¿ + +/* ˳ÐòÕ»ÔªËØÀàÐͶ¨Òå */ +typedef int SElemType; + +// ˳ÐòÕ»ÔªËØ½á¹¹ +typedef struct { + SElemType* base; // Õ»µ×Ö¸Õë + SElemType* top; // Õ»¶¥Ö¸Õë + int stacksize; // µ±Ç°ÒÑ·ÖÅäµÄ´æ´¢¿Õ¼ä£¬ÒÔÔªËØÎªµ¥Î» +} SqStack; + + +/* + * ³õʼ»¯ + * + * ¹¹ÔìÒ»¸ö¿ÕÕ»¡£³õʼ»¯³É¹¦Ôò·µ»ØOK£¬·ñÔò·µ»ØERROR¡£ + */ +Status InitStack(SqStack* S); + +/* + * ÅÐ¿Õ + * + * ÅжÏ˳ÐòÕ»ÖÐÊÇ·ñ°üº¬ÓÐЧÊý¾Ý¡£ + * + * ·µ»ØÖµ£º + * TRUE : ˳ÐòջΪ¿Õ + * FALSE: ˳ÐòÕ»²»Îª¿Õ + */ +Status StackEmpty(SqStack S); + +/* + * ¼ÆÊý + * + * ·µ»ØË³ÐòÕ»°üº¬µÄÓÐÐ§ÔªËØµÄÊýÁ¿¡£ + */ +int StackLength(SqStack S); + +/* + * ÈëÕ» + * + * ½«ÔªËØeѹÈëµ½Õ»¶¥¡£ + */ +Status Push(SqStack* S, SElemType e); + +/* + * ³öÕ» + * + * ½«Õ»¶¥ÔªËص¯³ö£¬²¢ÓÃe½ÓÊÕ¡£ + */ +Status Pop(SqStack* S, SElemType* e); + +#endif diff --git a/Dev-C++/ExerciseBook/07.41/TestData_DN.txt b/Dev-C++/ExerciseBook/07.41/TestData_DN.txt new file mode 100644 index 0000000..189ba76 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.41/TestData_DN.txt @@ -0,0 +1,6 @@ +ͼÀàÐÍ¡ú1£¨ÓÐÏòÍø£© +¶¥µãÊý¡ú13 +»¡Êý¡ú24 +»¡ÊÇ·ñ´øÓÐÆäËûÐÅÏ¢¡ú1 +¶¥µã¼¯¡ú¡¾M£¬A£¬B£¬C£¬D£¬E£¬F£¬G£¬H£¬I£¬J£¬K£¬N¡¿ +»¡µÄ¼¯ºÏ¡ú¡¾M£¬A£¬1¡¿¡¾M£¬B£¬6¡¿¡¾M£¬D£¬3¡¿¡¾M£¬F£¬4¡¿¡¾M£¬G£¬3¡¿¡¾M£¬I£¬1¡¿¡¾A£¬C£¬6¡¿¡¾B£¬C£¬2¡¿¡¾D£¬C£¬7¡¿¡¾D£¬E£¬8¡¿¡¾D£¬J£¬6¡¿¡¾F£¬E£¬11¡¿¡¾F£¬H£¬5¡¿¡¾G£¬N£¬21¡¿¡¾G£¬H£¬10¡¿¡¾I£¬H£¬6¡¿¡¾H£¬J£¬4¡¿¡¾H£¬K£¬9¡¿¡¾K£¬J£¬9¡¿¡¾J£¬N£¬12¡¿¡¾J£¬E£¬3¡¿¡¾E£¬N£¬10¡¿¡¾H£¬C£¬4¡¿¡¾C£¬E£¬8¡¿ \ No newline at end of file diff --git a/Dev-C++/ExerciseBook/07.42/07.42.cpp b/Dev-C++/ExerciseBook/07.42/07.42.cpp new file mode 100644 index 0000000..bfbc6c4 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.42/07.42.cpp @@ -0,0 +1,54 @@ +#include +#include "ALGraph.h" +#include "ShortestPaths.h" + +/* + * ʹÓÃDijkstraËã·¨¼ÆËã´Óµ¥Ô´¶¥µã³ö·¢µÄ×î¶Ì·¾¶ + */ +void Algo_7_42(ALGraph G, int v0, PathMatrix_DIJ P, ShortPathTable_DIJ D); + + +int main(int argc, char* argv[]) { + ALGraph G; + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ´´½¨²¢´òÓ¡ÎÞÏòͼ/Íø... \n"); + { + char* path[4]; + + path[0] = "TestData_DG.txt"; + path[1] = "TestData_DN.txt"; + path[2] = "TestData_UDG.txt"; + path[3] = "TestData_UDN.txt"; + + CreateGraph(&G, path); + PrintGraph(G); + printf("\n"); + } + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ µÏ½ÜË¹ÌØÀ­Ëã·¨Çóµ¥Ô´×î¶Ì·¾¶... \n"); + { + VertexType v0 = 'A'; + PathMatrix_DIJ P; + ShortPathTable_DIJ D; + + printf("Êä³ö´Ó¶¥µã %c µ½ÆäÓà¶¥µãµÄ×î¶Ì·¾¶£º\n", v0); + Algo_7_42(G, LocateVex(G, v0), P, D); + printf("\n"); + } +} + + +/* + * ʹÓÃDijkstraËã·¨¼ÆËã´Óµ¥Ô´¶¥µã³ö·¢µÄ×î¶Ì·¾¶ + */ +void Algo_7_42(ALGraph G, int v0, PathMatrix_DIJ P, ShortPathTable_DIJ D) { + + // ¡ï¡ï±ØÐëÊ×Ïȵ÷Óô˺¯Êý¼ÆËã¸÷¶¥µãÖ®¼äµÄ¹ØÏµ + GetAdjs(G); + + // ×î¶Ì·¾¶Ëã·¨ + ShortestPath_DIJ(G, v0, P, D); + + // ´òÓ¡¼ÆËã³öµÄ½á¹û£¨´Ë²½Öè¿ÉÑ¡£© + PrintPath_DIJ(G, v0, P, D); +} diff --git a/Dev-C++/ExerciseBook/07.42/07.42.dev b/Dev-C++/ExerciseBook/07.42/07.42.dev new file mode 100644 index 0000000..be70655 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.42/07.42.dev @@ -0,0 +1,138 @@ +[Project] +FileName=07.42.dev +Name=07.42 +Type=1 +Ver=2 +ObjFiles= +Includes= +Libs= +PrivateResource= +ResourceIncludes= +MakeIncludes= +Compiler= +CppCompiler= +Linker= +IsCpp=0 +Icon= +ExeOutput= +ObjectOutput= +LogOutput= +LogOutputEnabled=0 +OverrideOutput=0 +OverrideOutputName= +HostApplication= +UseCustomMakefile=0 +CustomMakefile= +CommandLine= +Folders= +IncludeVersionInfo=0 +SupportXPThemes=0 +CompilerSet=1 +CompilerSettings=0000000000000000001000000 +UnitCount=9 + +[VersionInfo] +Major=1 +Minor=0 +Release=0 +Build=0 +LanguageID=1033 +CharsetID=1252 +CompanyName= +FileVersion= +FileDescription=Developed using the Dev-C++ IDE +InternalName= +LegalCopyright= +LegalTrademarks= +OriginalFilename= +ProductName= +ProductVersion= +AutoIncBuildNr=0 +SyncProduct=1 + +[Unit1] +FileName=07.42.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit2] +FileName=ALGraph.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit3] +FileName=ALGraph.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit4] +FileName=ShortestPaths.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit5] +FileName=ShortestPaths.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit6] +FileName=TestData_DG.txt +Folder= +Compile=0 +Link=0 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit7] +FileName=TestData_DN.txt +Folder= +Compile=0 +Link=0 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit8] +FileName=TestData_UDG.txt +Folder= +Compile=0 +Link=0 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit9] +FileName=TestData_UDN.txt +Folder= +Compile=0 +Link=0 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + diff --git a/Dev-C++/ExerciseBook/07.42/07.42.png b/Dev-C++/ExerciseBook/07.42/07.42.png new file mode 100644 index 0000000000000000000000000000000000000000..537bcefcbb165e4fd77199b0c048b35d0f38e339 GIT binary patch literal 55687 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 literal 0 HcmV?d00001 diff --git a/Dev-C++/ExerciseBook/07.42/ALGraph.cpp b/Dev-C++/ExerciseBook/07.42/ALGraph.cpp new file mode 100644 index 0000000..e396f08 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.42/ALGraph.cpp @@ -0,0 +1,583 @@ +/*================== + * ͼµÄÁÚ½Ó±í´æ´¢±íʾ + ===================*/ + +#include "ALGraph.h" + +// ¼ÈëÊý¾ÝµÄÔ´Îļþ£»fpΪnullʱ£¬ËµÃ÷ÐèÒª´Ó¿ØÖÆÌ¨Â¼Èë +static FILE* fp = NULL; + +/* + * IncInfoָʾ¸Ãͼ/ÍøµÄ±ß/»¡ÉÏÊÇ·ñ´æÔÚ¸½¼ÓÐÅÏ¢¡£ + * Èç¹ûÆäÖµ²»Îª0£¬Ôò±íʾÎÞ¸½¼ÓÐÅÏ¢£¬·ñÔò£¬±íʾ´æÔÚ¸½¼ÓÐÅÏ¢¡£ + */ +Boolean IncInfo = FALSE; + +// ·ÃÎʱêÖ¾Êý×飬¼Ç¼·ÃÎʹýµÄ¶¥µã +static Boolean visited[MAX_VERTEX_NUM]; + +// º¯Êý±äÁ¿ +static Status (* VisitFunc)(VertexType e); + + +/* + * ´´½¨ + * + *¡¾±¸×¢¡¿ + * + * ½Ì²ÄÖÐĬÈÏ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý¡£ + * ÕâÀïΪÁË·½±ã²âÊÔ£¬±ÜÃâÿ´ÎÔËÐж¼ÊÖ¶¯ÊäÈëÊý¾Ý£¬ + * Òò¶øÔÊÐíÑ¡Ôñ´ÓÔ¤ÉèµÄÎļþpathÖжÁÈ¡²âÊÔÊý¾Ý¡£ + * + * Èç¹ûÐèÒª´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý£¬ÔòpathΪNULL£¬»òpath[kind]Ϊ""¡£ + * Èç¹ûÐèÒª´ÓÎļþÖжÁÈ¡Êý¾Ý£¬ÔòÐèÒªÔÚpathÖÐÌîдÎļþÃûÐÅÏ¢¡£ + */ +Status CreateGraph(ALGraph* G, char* path[]) { + int readFromConsole; // ÊÇ·ñ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý + int kind; + Status flag; + + printf("ÇëÊäÈëͼµÄÀàÐÍ(0-ÓÐÏòͼ ©¦ 1-ÓÐÏòÍø ©¦ 2-ÎÞÏòͼ ©¦ 3-ÎÞÏòÍø)£º"); + scanf("%d", &kind); + + // ÀàÐͲ»ºÏ¹æ + if(kind < 0 || kind > 3) { + return ERROR; + } + + // Èç¹ûûÓÐÎļþ·¾¶ÐÅÏ¢£¬Ôò´Ó¿ØÖÆÌ¨¶ÁÈ¡ÊäÈë + readFromConsole = (path == NULL) || strcmp(path[kind], "") == 0; + + // ÐèÒª´ÓÎļþ¶ÁÈ¡ + if(readFromConsole) { + (*G).kind = GraphKind(kind); // ¼Ç¼ͼ/ÍøµÄÀàÐÍ + } else { + // ´ò¿ªÎļþ£¬×¼±¸¶ÁÈ¡²âÊÔÊý¾Ý + fp = fopen(path[kind], "r"); + if(fp == NULL) { + return ERROR; + } + + // ¼ÈëͼµÄÀàÐÍ + ReadData(fp, "%d", &((*G).kind)); + } + + // Ëæ»ú´´½¨ÓÐÏòͼ/Íø»òÎÞÏòͼ/ÍøµÄÒ»ÖÖ + switch((*G).kind) { + case DG: + flag = CreateDG(G); + break; + case DN: + flag = CreateDN(G); + break; + case UDG: + flag = CreateUDG(G); + break; + case UDN: + flag = CreateUDN(G); + break; + default: + flag = ERROR; + break; + } + + if(fp != NULL) { + fclose(fp); + fp = NULL; + } + + return flag; +} + +/* + * ¹¹ÔìÓÐÏòͼ + */ +static Status CreateDG(ALGraph* G) { + int i, k; + int vexnum, arcnum; + VertexType v1, v2; + InfoType* info = NULL; + + (*G).vexnum = (*G).arcnum = 0; + + if(fp == NULL) { + printf("ÇëÊäÈëÓÐÏòͼµÄ¶¥µãÊý£º"); + scanf("%d", &vexnum); + printf("ÇëÊäÈëÓÐÏòͼµÄ»¡Êý£º"); + scanf("%d", &arcnum); + printf("¸ÃÓÐÏòͼµÄ»¡ÉÏÊÇ·ñ°üº¬ÆäËû¸½¼ÓÐÅÏ¢(0-²»°üº¬©¦1-°üº¬)£º"); + scanf("%d", &IncInfo); + + // ¼Èë¶¥µã¼¯ + printf("Çë¼Èë %d ¸ö¶¥µã£¬²»Í¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º", vexnum); + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(stdin); + scanf("%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } else { + ReadData(fp, "%d", &vexnum); // ¼Èë¶¥µãÊý + ReadData(fp, "%d", &arcnum); // ¼È뻡Êý + ReadData(fp, "%d", &IncInfo); // Åжϻ¡ÉÏÊÇ·ñ°üº¬¸½¼ÓÐÅÏ¢ + + // ¼Èë¶¥µã¼¯ + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(fp); + ReadData(fp, "%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } + + // ½öÔÚ¿ØÖÆÌ¨Â¼ÈëÐÅϢʱÊä³ö´ËÌáʾ + if(fp == NULL && arcnum != 0) { + printf("ÇëΪÓÐÏòͼÒÀ´Î¼Èë %d Ìõ»¡µÄÐÅÏ¢£¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º\n", arcnum); + } + + // ¼È뻡µÄÐÅÏ¢ + for(k = 0; k < arcnum; k++) { + if(fp == NULL) { + printf("µÚ %2d Ìõ»¡£º", k + 1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v2); + } else { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + skipBlank(fp); + ReadData(fp, "%c%c", &v1, &v2); + } + + // Èç¹ûÐèҪ¼È뻡µÄÆäËû¸½¼ÓÐÅÏ¢ + if(IncInfo) { + // ×îºó¼È븽¼ÓÐÅÏ¢ + Input(*G, &info); + } + + // ²åÈ뻡 + InsertArc(G, v1, v2, info); + } + + // ´ÓÎļþÖжÁÈ¡Êý¾Ýʱ£¬×îºóÆäʵӦµ±ÅжÏÒ»ÏÂÊÇ·ñ¶Áµ½ÁË×ã¹»µÄÐÅÏ¢ + return OK; +} + +/* + * ¹¹ÔìÓÐÏòÍø + */ +static Status CreateDN(ALGraph* G) { + int i, k; + int vexnum, arcnum; + VertexType v1, v2; + InfoType* info = NULL; + + (*G).vexnum = (*G).arcnum = 0; + + if(fp == NULL) { + printf("ÇëÊäÈëÓÐÏòÍøµÄ¶¥µãÊý£º"); + scanf("%d", &vexnum); + printf("ÇëÊäÈëÓÐÏòÍøµÄ»¡Êý£º"); + scanf("%d", &arcnum); + printf("¸ÃÓÐÏòÍøµÄ»¡ÉϱØÐë°üº¬ÆäËû¸½¼ÓÐÅÏ¢£¬ÒòΪ´Ë´¦µÄȨֵÐèÒª´æ´¢µ½¸½¼ÓÐÅÏ¢ÖÐ...\n"); + IncInfo = 1; + + // ¼Èë¶¥µã¼¯ + printf("Çë¼Èë %d ¸ö¶¥µã£¬²»Í¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º", vexnum); + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(stdin); + scanf("%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } else { + ReadData(fp, "%d", &vexnum); // ¼Èë¶¥µãÊý + ReadData(fp, "%d", &arcnum); // ¼È뻡Êý + ReadData(fp, "%d", &IncInfo);// Åжϻ¡ÉÏÊÇ·ñ°üº¬¸½¼ÓÐÅÏ¢(´Ë´¦Ó¦µ±°üº¬) + IncInfo = 1; // Ç¿ÖÆ½«È¨ÖµÂ¼Èëµ½¸½¼ÓÐÅÏ¢ÖÐ + + // ¼Èë¶¥µã¼¯ + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(fp); + ReadData(fp, "%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } + + // ½öÔÚ¿ØÖÆÌ¨Â¼ÈëÐÅϢʱÊä³ö´ËÌáʾ + if(fp == NULL && arcnum != 0) { + printf("ÇëΪÓÐÏòÍøÒÀ´Î¼Èë %d Ìõ»¡(´øÈ¨Öµ)µÄÐÅÏ¢£¬¶¥µã¼°È¨ÖµÖ®¼äÓÿոñ¸ô¿ª£º\n", arcnum); + } + + // ¼È뻡µÄÐÅÏ¢ + for(k = 0; k < arcnum; k++) { + if(fp == NULL) { + printf("µÚ %2d Ìõ»¡¼°ÆäȨֵ£º", k + 1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v2); + } else { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + skipBlank(fp); + ReadData(fp, "%c%c", &v1, &v2); + } + + // Èç¹ûÐèҪ¼È뻡µÄÆäËû¸½¼ÓÐÅÏ¢ + if(IncInfo) { + // ×îºó¼È븽¼ÓÐÅÏ¢(´Ë´¦ÐèҪ¼ÈëÍøµÄȨֵ) + Input(*G, &info); + } + + // ²åÈ뻡 + InsertArc(G, v1, v2, info); + } + + // ´ÓÎļþÖжÁÈ¡Êý¾Ýʱ£¬×îºóÆäʵӦµ±ÅжÏÒ»ÏÂÊÇ·ñ¶Áµ½ÁË×ã¹»µÄÐÅÏ¢ + return OK; +} + +/* + * ¹¹ÔìÎÞÏòͼ + */ +static Status CreateUDG(ALGraph* G) { + int i, k; + int vexnum, arcnum; + VertexType v1, v2; + InfoType* info = NULL; + + (*G).vexnum = (*G).arcnum = 0; + + if(fp == NULL) { + printf("ÇëÊäÈëÎÞÏòͼµÄ¶¥µãÊý£º"); + scanf("%d", &vexnum); + printf("ÇëÊäÈëÎÞÏòͼµÄ±ßÊý£º"); + scanf("%d", &arcnum); + printf("¸ÃÎÞÏòͼµÄ±ßÉÏÊÇ·ñ°üº¬ÆäËû¸½¼ÓÐÅÏ¢(0-²»°üº¬©¦1-°üº¬)£º"); + scanf("%d", &IncInfo); + + // ¼Èë¶¥µã¼¯ + printf("Çë¼Èë %d ¸ö¶¥µã£¬²»Í¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º", vexnum); + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(stdin); + scanf("%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } else { + ReadData(fp, "%d", &vexnum); // ¼Èë¶¥µãÊý + ReadData(fp, "%d", &arcnum); // ¼Èë±ßÊý + ReadData(fp, "%d", &IncInfo);// ÅжϱßÉÏÊÇ·ñ°üº¬¸½¼ÓÐÅÏ¢ + + // ¼Èë¶¥µã¼¯ + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(fp); + ReadData(fp, "%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } + + // ½öÔÚ¿ØÖÆÌ¨Â¼ÈëÐÅϢʱÊä³ö´ËÌáʾ + if(fp == NULL && arcnum != 0) { + printf("ÇëΪÎÞÏòͼÒÀ´Î¼Èë %d Ìõ±ßµÄÐÅÏ¢£¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º\n", arcnum); + } + + // ¼Èë±ßµÄÐÅÏ¢ + for(k = 0; k < arcnum; k++) { + if(fp == NULL) { + printf("µÚ %2d Ìõ±ß£º", k + 1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v2); + } else { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + skipBlank(fp); + ReadData(fp, "%c%c", &v1, &v2); + } + + // Èç¹ûÐèҪ¼Èë±ßµÄÆäËû¸½¼ÓÐÅÏ¢ + if(IncInfo) { + // ×îºó¼È븽¼ÓÐÅÏ¢ + Input(*G, &info); + + } + + // ²åÈë±ß + InsertArc(G, v1, v2, info); + } + + // ´ÓÎļþÖжÁÈ¡Êý¾Ýʱ£¬×îºóÆäʵӦµ±ÅжÏÒ»ÏÂÊÇ·ñ¶Áµ½ÁË×ã¹»µÄÐÅÏ¢ + return OK; +} + +/* + * ¹¹ÔìÎÞÏòÍø + */ +static Status CreateUDN(ALGraph* G) { + int i, k; + int vexnum, arcnum; + VertexType v1, v2; + InfoType* info = NULL; + + (*G).vexnum = (*G).arcnum = 0; + + if(fp == NULL) { + printf("ÇëÊäÈëÎÞÏòÍøµÄ¶¥µãÊý£º"); + scanf("%d", &vexnum); + printf("ÇëÊäÈëÎÞÏòÍøµÄ±ßÊý£º"); + scanf("%d", &arcnum); + printf("¸ÃÎÞÏòÍøµÄ±ßÉϱØÐë°üº¬ÆäËû¸½¼ÓÐÅÏ¢£¬ÒòΪ´Ë´¦µÄȨֵÐèÒª´æ´¢µ½¸½¼ÓÐÅÏ¢ÖÐ...\n"); + IncInfo = 1; + + // ¼Èë¶¥µã¼¯ + printf("Çë¼Èë %d ¸ö¶¥µã£¬²»Í¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º", vexnum); + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(stdin); + scanf("%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } else { + ReadData(fp, "%d", &vexnum); // ¼Èë¶¥µãÊý + ReadData(fp, "%d", &arcnum); // ¼Èë±ßÊý + ReadData(fp, "%d", &IncInfo);// ÅжϱßÉÏÊÇ·ñ°üº¬¸½¼ÓÐÅÏ¢ + IncInfo = 1; // Ç¿ÖÆ½«È¨ÖµÂ¼Èëµ½¸½¼ÓÐÅÏ¢ÖÐ + + // ¼Èë¶¥µã¼¯ + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(fp); + ReadData(fp, "%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } + + // ½öÔÚ¿ØÖÆÌ¨Â¼ÈëÐÅϢʱÊä³ö´ËÌáʾ + if(fp == NULL && arcnum != 0) { + printf("ÇëΪÎÞÏòÍøÒÀ´Î¼Èë %d Ìõ±ß(´øÈ¨Öµ)µÄÐÅÏ¢£¬¶¥µã¼°È¨ÖµÖ®¼äÓÿոñ¸ô¿ª£º\n", arcnum); + } + + // ¼Èë±ßµÄÐÅÏ¢ + for(k = 0; k < arcnum; k++) { + if(fp == NULL) { + printf("µÚ %2d Ìõ±ß¼°ÆäȨֵ£º", k + 1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v2); + } else { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + skipBlank(fp); + ReadData(fp, "%c%c", &v1, &v2); + } + + // Èç¹ûÐèҪ¼Èë±ßµÄÆäËû¸½¼ÓÐÅÏ¢ + if(IncInfo) { + // ×îºó¼È븽¼ÓÐÅÏ¢(´Ë´¦ÐèҪ¼ÈëÍøµÄȨֵ) + Input(*G, &info); + } + + // ²åÈë±ß + InsertArc(G, v1, v2, info); + } + + // ´ÓÎļþÖжÁÈ¡Êý¾Ýʱ£¬×îºóÆäʵӦµ±ÅжÏÒ»ÏÂÊÇ·ñ¶Áµ½ÁË×ã¹»µÄÐÅÏ¢ + return OK; +} + +/* + * ¼Èë±ß/»¡µÄÏà¹Ø¸½¼ÓÐÅÏ¢ + */ +static void Input(ALGraph G, InfoType** info) { + int weight; + + // ÔÚ"Íø"µÄÇéÐÎÏÂÐèҪ¼ÈëȨֵÐÅÏ¢ + if(G.kind == DN || G.kind == UDN) { + *info = (InfoType*) malloc(sizeof(InfoType)); + + if(fp == NULL) { + scanf("%d", &weight); + } else { + ReadData(fp, "%d", &weight); + } + + (*info)->weight = weight; + } +} + +/* + * ²éÕÒ + * + * ·µ»Ø¶¥µãuÔÚͼ/ÍøÖеÄλÖà + */ +int LocateVex(ALGraph G, VertexType u) { + int i; + + for(i = 0; i < G.vexnum; i++) { + if(G.vertices[i].data == u) { + return i; + } + } + + return -1; +} + +/* + * ȡֵ + * + * ·µ»ØË÷Òýv´¦µÄ¶¥µãÖµ + */ +VertexType GetVex(ALGraph G, int v) { + if(v < 0 || v >= G.vexnum) { + return '\0'; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + return G.vertices[v].data; +} + +/* + * ¹¹ÔìÒ»¸ö±ß/»¡½áµã(½öÏÞÄÚ²¿Ê¹ÓÃ) + */ +static ArcNode* newArcNodePtr(int adjvex, ArcNode* nextarc, InfoType* info) { + ArcNode* p = (ArcNode*) malloc(sizeof(ArcNode)); + if(!p) { + exit(OVERFLOW); + } + + p->adjvex = adjvex; + + p->nextarc = nextarc; + + p->info = info; + + return p; +} + +/* + * ²åÈë±ß/»¡ + * + * Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬Ôò²åÈëÒ»Ìõ»¡ÐèÒªÔö¼ÓÁ½¸ö¶¥µã¹ØÏµ£¬µ«»¡µÄÊýÁ¿Ö»ÔöÒ»¡£ + * ¶ÔÓÚͼ/ÍøÀ´Ëµ£¬¿ÉÒÔÔڿɱä²ÎÊýÖÐÁгö±ß/»¡µÄ¸½¼ÓÐÅÏ¢¡£ + * + * ×¢£º´Ë´¦½ÓÊյIJÎÊýÓëMGraphÓÐЩ²»Ò»Ñù£ºÍøµÄ¸½¼ÓÐÅÏ¢Öаüº¬Á˸÷Ìõ±ß/»¡µÄȨֵ¡£ + */ +Status InsertArc(ALGraph* G, VertexType v, VertexType w, ...) { + int tail, head, k, count; + ArcNode* r; + ArcNode* pre; + Boolean overlay = FALSE; // ÊÇ·ñΪ¸²¸ÇÌí¼Ó + InfoType* info = NULL; // ±ß/»¡µÄ¸½¼ÓÐÅÏ¢ + va_list ap; + + tail = LocateVex(*G, v); // »ñÈ¡¶¥µãvÔÚ¶¥µã¼¯ÖеÄλÖà + if(tail == -1) { + return ERROR; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + head = LocateVex(*G, w); // »ñÈ¡¶¥µãwÔÚ¶¥µã¼¯ÖеÄλÖà + if(head == -1) { + return ERROR; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + // ¾Ü¾ø»· + if(tail == head) { + return ERROR; + } + + // Èç¹û±ß/»¡ÉÏ´æÔÚ¸½¼ÓÐÅÏ¢ + if(IncInfo) { + va_start(ap, w); // ÔÚwºó²éѯÊ׸ö¿É±ä²ÎÊý + info = va_arg(ap, InfoType*); // »ñÈ¡¸½¼ÓÐÅÏ¢ + va_end(ap); + } + + /* ½ÓÏÂÀ´£¬ÐèÒª²éÕÒºÏÊʵIJåÈëλÖà */ + + for(count = 0; count < 2; count++) { + pre = NULL; + // Ö¸ÏòÒÔtailΪβµÄÊ×Ìõ±ß/»¡ + r = G->vertices[tail].firstarc; + while(r != NULL && r->adjvex < head) { + pre = r; + r = r->nextarc; + } + + // Óöµ½ÁËÏàͬλÖõĽáµã + if(r != NULL && r->adjvex == head) { + r->info = info; // ¸´Óøýáµã + overlay = TRUE; // ·¢ÉúÁ˸²¸Ç + } else { + if(pre == NULL) { + G->vertices[tail].firstarc = newArcNodePtr(head, r, info); + } else { + pre->nextarc = newArcNodePtr(head, r, info); + } + } + + // Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬ÐèÒª¿¼ÂǶԳÆÐÔ + if((G->kind == UDG || G->kind == UDN) && tail != head) { + // µßµ¹iºÍj + k = tail; + tail = head; + head = k; + } else { + break; // Èç¹ûÊÇÓÐÏòµÄ£¬¿ÉÒÔ½áÊøÁË + } + } + + // ÔڷǸ²¸ÇµÄÇéÐÎÏ£¬²Å¿¼ÂǸüбß/»¡µÄÊýÁ¿ + if(!overlay) { + (*G).arcnum++; // ²»ÂÛÓÐÏòÎÞÏò£¬±ß/»¡ÊýÖ»ÔöÒ» + } + + return OK; +} + +/* + * ÒÔͼÐλ¯ÐÎʽÊä³öµ±Ç°½á¹¹ + */ +void PrintGraph(ALGraph G) { + int i; + ArcNode* p; + + if(G.vexnum == 0) { + printf("¿Õͼ£¬ÎÞÐè´òÓ¡£¡\n"); + return; + } + + printf("µ±Ç°Í¼/Íø°üº¬ %2d ¸ö¶¥µã£¬ %2d Ìõ±ß/»¡...\n", G.vexnum, G.arcnum); + + for(i = 0; i < G.vexnum; i++) { + printf("%c ===> ", G.vertices[i].data); + + p = G.vertices[i].firstarc; + while(p != NULL) { + if(IncInfo == 0) { + printf("%c ", G.vertices[p->adjvex].data); + + // ¶ÔÓÚÍø£¬»á´ÓÆä¸½¼ÓÐÅÏ¢ÖлñÈ¡µ½È¨Öµ + } else { + printf("%c[%2d] ", G.vertices[p->adjvex].data, p->info->weight); + } + + p = p->nextarc; + + if(p != NULL) { + printf("- "); + } + } + + printf("\n"); + } +} diff --git a/Dev-C++/ExerciseBook/07.42/ALGraph.h b/Dev-C++/ExerciseBook/07.42/ALGraph.h new file mode 100644 index 0000000..385d058 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.42/ALGraph.h @@ -0,0 +1,150 @@ +/*================== + * ͼµÄÁÚ½Ó±í´æ´¢±íʾ + ===================*/ + +#ifndef ALGRAPH_H +#define ALGRAPH_H + +#include +#include // Ìṩmemset¡¢strcmp Ô­ÐÍ +#include // Ìṩºêva_list¡¢va_start¡¢va_arg¡¢va_end +#include // Ìṩmalloc¡¢realloc¡¢free¡¢exitÔ­ÐÍ +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// + +/* + * ×¢£º + * + * ͨ³£À´½²£¬ÎÞȨͼ±»¼ò³ÆÎª¡¾Í¼¡¿£¬ÓÐȨͼ±»¼ò³ÆÎª¡¾Íø¡¿¡£ + * ÎÞÏòͼ/ÍøÖеĶ¥µã¹ØÏµ±»³ÆÎª¡¾±ß¡¿£¬ÓÐÏòͼ/ÍøÖеĶ¥µã¹ØÏµ±»³ÆÎª¡¾»¡¡¿£¬²¢Çø·Ö»¡Í·Ó뻡β¡£ + * ʵ¼Ê±íÊöÖУ¬Î´±Ø»áÑϸñ×ñÊØÒÔÉÏÃüÃû¡£ + * + * µ±Ç°½á¹¹Êʺϴ洢±ß/»¡±È½ÏÏ¡ÊèµÄͼ/Íø¡£ + * + * ¡ï ²åÈë±ß/»¡µÄÐÅϢʱ£¬ÕâÀïµÄʵÏÖÊǰ´"ÉýÐò"²åÈëµÄ£¬ÕâʹµÃ²åÈëµÄ»¡Êǰ´"ÉýÐò"ÅÅÁеġ£ + */ + + +/* ºê¶¨Òå */ +#define MAX_VERTEX_NUM 26 // ×î´ó¶¥µã¸öÊý + + +// ͼµÄÀàÐÍ +typedef enum { + DG, // 0-ÓÐÏòͼ + DN, // 1-ÓÐÏòÍø(´øÈ¨Öµ) + UDG, // 2-ÎÞÏòͼ + UDN // 3-ÎÞÏòÍø(´øÈ¨Öµ) +} GraphKind; + +// ¶¥µãÀàÐÍ +typedef char VertexType; + +// ±ß/»¡µÄÏà¹Ø¸½¼ÓÐÅÏ¢ +typedef struct { + /* + * ×¢£º + * ½Ì²ÄÖиø³öµÄ½á¹¹Ö»¿¼ÂÇÁËÎÞȨͼ£¬¶øÃ»¿¼ÂÇÓÐȨͼ(Íø)¡£ + * ÕâÀïΪÁ˰ѡ°Íø¡±µÄÇéÐÎÒ²¿¼ÂǽøÈ¥£¬ÌØÔÚ¸½¼ÓÐÅÏ¢ÖÐÔö¼ÓÁË"È¨ÖØ"ÊôÐÔ¡£ + */ + int weight; +} InfoType; + +/* ±ß/»¡½áµã */ +typedef struct ArcNode { + int adjvex; // ¸Ã»¡ËùÖ¸ÏòµÄ¶¥µãµÄλÖà + struct ArcNode* nextarc; // Ö¸ÏòÏÂÒ»Ìõ»¡µÄÖ¸Õë + InfoType* info; // »¡µÄ¸½¼ÓÐÅÏ¢£¬Í¨³£ºöÂÔ +} ArcNode; + +// ÿ¸öÁ´±íµÄÍ·½áµã +typedef struct VNode { + VertexType data; // ¶¥µãÐÅÏ¢ + ArcNode* firstarc; // Ö¸ÏòµÚÒ»ÌõÒÀ¸½¸Ã¶¥µãµÄ»¡µÄÖ¸Õë +} VNode; + +/* ͼµÄÁÚ½Ó±í´æ´¢±íʾÀàÐͶ¨Òå */ +typedef struct { + VNode vertices[MAX_VERTEX_NUM]; // ÁÚ½Ó±í + int vexnum, arcnum; // ͼ/ÍøµÄ¶¥µãÊýºÍ»¡Êý + GraphKind kind; // ͼµÄÀàÐͱêÖ¾ +} ALGraph; + + +// ±ß/»¡ÉÏÊÇ·ñ´æÔÚ¸½¼ÓÐÅÏ¢ +extern Boolean IncInfo; + + +/* + * ´´½¨ + * + *¡¾±¸×¢¡¿ + * + * ½Ì²ÄÖÐĬÈÏ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý¡£ + * ÕâÀïΪÁË·½±ã²âÊÔ£¬±ÜÃâÿ´ÎÔËÐж¼ÊÖ¶¯ÊäÈëÊý¾Ý£¬ + * Òò¶øÔÊÐíÑ¡Ôñ´ÓÔ¤ÉèµÄÎļþpathÖжÁÈ¡²âÊÔÊý¾Ý¡£ + * + * Èç¹ûÐèÒª´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý£¬ÔòpathΪNULL£¬»òpath[kind]Ϊ""¡£ + * Èç¹ûÐèÒª´ÓÎļþÖжÁÈ¡Êý¾Ý£¬ÔòÐèÒªÔÚpathÖÐÌîдÎļþÃûÐÅÏ¢¡£ + */ +Status CreateGraph(ALGraph* G, char* path[]); + +/* + * ¹¹ÔìÓÐÏòͼ + */ +static Status CreateDG(ALGraph* G); + +/* + * ¹¹ÔìÓÐÏòÍø + */ +static Status CreateDN(ALGraph* G); + +/* + * ¹¹ÔìÎÞÏòͼ + */ +static Status CreateUDG(ALGraph* G); + +/* + * ¹¹ÔìÎÞÏòÍø + */ +static Status CreateUDN(ALGraph* G); + +/* + * ¼Èë±ß/»¡µÄÏà¹Ø¸½¼ÓÐÅÏ¢ + */ +static void Input(ALGraph G, InfoType** info); + +/* + * ²éÕÒ + * + * ·µ»Ø¶¥µãuÔÚͼ/ÍøÖеÄλÖà + */ +int LocateVex(ALGraph G, VertexType u); + +/* + * ȡֵ + * + * ·µ»ØË÷Òýv´¦µÄ¶¥µãÖµ + */ +VertexType GetVex(ALGraph G, int v); + +/* + * ¹¹ÔìÒ»¸ö±ß/»¡½áµã(½öÏÞÄÚ²¿Ê¹ÓÃ) + */ +static ArcNode* newArcNodePtr(int adjvex, ArcNode* nextarc, InfoType* info); + +/* + * ²åÈë±ß/»¡ + * + * Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬Ôò²åÈëÒ»Ìõ»¡ÐèÒªÔö¼ÓÁ½¸ö¶¥µã¹ØÏµ£¬µ«»¡µÄÊýÁ¿Ö»ÔöÒ»¡£ + * ¶ÔÓÚͼ/ÍøÀ´Ëµ£¬¿ÉÒÔÔڿɱä²ÎÊýÖÐÁгö±ß/»¡µÄ¸½¼ÓÐÅÏ¢¡£ + * + * ×¢£º´Ë´¦½ÓÊյIJÎÊýÓëMGraphÓÐЩ²»Ò»Ñù£ºÍøµÄ¸½¼ÓÐÅÏ¢Öаüº¬Á˸÷Ìõ±ß/»¡µÄȨֵ¡£ + */ +Status InsertArc(ALGraph* G, VertexType v, VertexType w, ...); + +/* + * ÒÔͼÐλ¯ÐÎʽÊä³öµ±Ç°½á¹¹ + */ +void PrintGraph(ALGraph G); + +#endif diff --git a/Dev-C++/ExerciseBook/07.42/ShortestPaths.cpp b/Dev-C++/ExerciseBook/07.42/ShortestPaths.cpp new file mode 100644 index 0000000..cfc6dc4 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.42/ShortestPaths.cpp @@ -0,0 +1,334 @@ +/*==================== + * ×î¶Ì·¾¶Ëã·¨ + * + * °üº¬Ëã·¨: 7.15¡¢7.16 + =====================*/ + +#include "ShortestPaths.h" + +/* + * ´æ´¢¸÷¶Ô¶¥µãÖ®¼äµÄ¹ØÏµ¡£ + * + * ¶ÔÓÚͼÀ´Ëµ£¬´æ´¢0±íʾÁ½¶¥µã²»Ö±½ÓÁ¬Í¨£¬´æ´¢1±íʾÁ½¶¥µãÖ±½ÓÁ¬Í¨£» + * ¶ÔÓÚÍøÀ´Ëµ£¬´æ´¢µÄÊǶ¥µãÖ®¼äµÄȨֵ£¬È¨ÖµÎªINFINITE±íʾÁ½¶¥µã²»Ö±½ÓÁ¬Í¨¡£ + */ +static int adjs[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; + + +/* + * Ó¦µ±ÔÚÖ´ÐеϽÜË¹ÌØÀ­Ë㷨֮ǰ±»µ÷Óã¬ÓÃÀ´¼ÆËã¸÷¶¥µãÖ®¼äµÄ¹ØÏµ¡£ + */ +void GetAdjs(ALGraph G) { + int i, j; + ArcNode* p; + + for(i = 0; i < G.vexnum; i++) { + // ³õʼ»¯¶¥µã¹ØÏµ + for(j = 0; j < G.vexnum; j++) { + // Èç¹ûÊÇÍø£¬Ö»×ß´Ë·ÖÖ§ + if(G.kind == DN || G.kind == UDN) { + adjs[i][j] = INFINITE; + } + + // Èç¹ûÊÇͼ£¬Ö»×ß´Ë·ÖÖ§ + if(G.kind == DG || G.kind == UDG) { + adjs[i][j] = 0; + } + } + + // ´¦ÀíÖ±½ÓÁ¬½ÓµÄ¶¥µã + for(p = G.vertices[i].firstarc; p != NULL; p = p->nextarc) { + // Èç¹ûÊÇÍø£¬Ö»×ß´Ë·ÖÖ§ + if(G.kind == DN || G.kind == UDN) { + adjs[i][p->adjvex] = p->info->weight; + } + + // Èç¹ûÊÇͼ£¬Ö»×ß´Ë·ÖÖ§ + if(G.kind == DG || G.kind == UDG) { + adjs[i][p->adjvex] = 1; + } + } + } +} + +/* + * ¨€¨€¨€¨€¨€¨€¨€¨€ Ëã·¨7.15 ¨€¨€¨€¨€¨€¨€¨€¨€ + * + * µÏ½ÜË¹ÌØÀ­(Dijkstra)Ëã·¨Çóµ¥Ô´×î¶Ì·¾¶ + * + * @param G ´ý±éÀúµÄͼ¡£ + * @param v0 µ¥Ô´×î¶Ì·¾¶µÄÆðµã¡£ + * @param P ´æ´¢´Óv0µ½ÆäÓà¸÷¶¥µãµÄ×î¶Ì·¾¶ÐÅÏ¢¡£ + * P[j][k]==TRUE´ú±í´Óv0->jµÄ×î¶Ì·¾¶»á¾­¹ý¶¥µãk£»·ñÔò£¬´ú±í²»¾­¹ý¡£ + * ×¢£º + * 1.¸ÃÊý×éÖ»·´Ó³Á˶¥µãµÄ´æÔÚÐÔ£¬¶øÎ´·´Ó³¶¥µãÔÚ·¾¶ÉϵĴÎÐò¡£ + * 2.Èç¹ûÁ½¶¥µãÖ®¼äÓжàÌõ×î¶Ì·¾¶£¬Ö»»áѡȡһÌõ + * @param D ´æ´¢´Óv0µ½ÆäÓà¸÷¶¥µãµÄ×î¶Ì·¾¶´ú¼Û£¬ÔÚͼÖУ¬¸Ã´ú¼ÛÊDz½³¤ºÍ£¬ÔÚÍøÖУ¬¸Ã´ú¼ÛÊÇȨֵºÍ¡£ + */ +void ShortestPath_DIJ(ALGraph G, int v0, PathMatrix_DIJ P, ShortPathTable_DIJ D) { + int v, w, i, j, min; + Status final[MAX_VERTEX_NUM]; // ÓÃÀ´±ê¼Çµ±Ç°½áµãÊÇ·ñÒѾ­·ÃÎʹý£¬¼´ÊÇ·ñÒѼÓÈë×î¶Ì·¾¶ + + /* + * Ô¤ÉèÒÑ·ÃÎʹýµÄ¶¥µã¼¯ÎªS£¬Î´·ÃÎʹýµÄ¶¥µã¼¯ÎªV-S + * ³õʼʱ£¬¶¥µã¼¯SΪ¿Õ£¬¶ø¶¥µã¼¯V-SΪËùÓж¥µãµÄ¼¯ºÏV + */ + for(v = 0; v < G.vexnum; v++) { + // ³õʼʱ£¬ËùÓж¥µã¾ùδ·ÃÎʹý + final[v] = FALSE; + + // ³õʼ»¯v0->vµÄ·¾¶´ú¼Û + D[v] = adjs[v0][v]; + + // Ô¤Éè´Óv0->v²»ÐèÒª¾­¹ý¶¥µãw£¬¼´Éè¿Õ·¾¶ + for(w = 0; w < G.vexnum; w++) { + P[v][w] = FALSE; + } + + // Èç¹ûÊÇÍø£¬Ö»×ß´Ë·ÖÖ§(½Ì²ÄÖ»´¦ÀíÁË´ËÖÖÇéÐÎ) + if(G.kind == DN || G.kind == UDN) { + // Èç¹ûv0->vÖ±½ÓÁ¬Í¨ + if(D[v] < INFINITE) { + P[v][v0] = TRUE; // ָʾv0->v±Ø½«¾­¹ý¶¥µãv0(¶ËµãÒ») + P[v][v] = TRUE; // ָʾv0->v±Ø½«¾­¹ý¶¥µãv(¶Ëµã¶þ) + } + } + + // Èç¹ûÊÇͼ£¬Ö»×ß´Ë·ÖÖ§ + if(G.kind == DG || G.kind == UDG) { + // Èç¹ûv0µ½vÖ±½ÓÁ¬Í¨ + if(D[v] != 0) { + P[v][v0] = TRUE; // ָʾv0->v±Ø½«¾­¹ý¶¥µãv0(¶ËµãÒ») + P[v][v] = TRUE; // ָʾv0->v±Ø½«¾­¹ý¶¥µãv(¶Ëµã¶þ) + } + } + } + + // ³õʼ»¯£¬v0½øÈë¶¥µã¼¯S + D[v0] = 0; + final[v0] = TRUE; + + /* + * ¿ªÊ¼Ö÷Ñ­»·£¬±éÀúÆäÓàG1.vexnum-1¸ö¶¥µã¡£ + * ÿ´ÎÇóµÃv0µ½Ä³¸ö¶¥µãµÄ×î¶Ì·¾¶£¬Ôò½«¸Ã¶¥µã´Ó¶¥µã¼¯V-SÖÐŲµ½¶¥µã¼¯SÖÐ + */ + for(i = 1; i < G.vexnum; i++) { + /* + * ÿ´Î½øÈëѡȡ×î½ü¶¥µã֮ǰ£¬¶¼Ó¦µ±½«vÖØÖÃΪһ¸öÕý³£¶¥µãÐòºÅÖ®ÍâµÄÖµ + * (½Ì²ÄÖÐÎ޴˲½Ö裬ÐèÒª²¹ÉÏ£¬·ñÔò»á½øÐкܶà´ÎÎÞЧµÄÑ­»·) + */ + v = -1; + + // ¼Ç¼¸÷¶¥µãÓë¶¥µãv0µÄ×î¶Ì¾àÀë + min = INFINITE; + + // ±éÀú¶¥µã¼¯V-S(ËùÓÐδ¼ÓÈë·¾¶µÄ¶¥µã)£¬´ÓÖÐÑ¡³ö¾àÀëv0¸ü½üµÄ¶¥µã + for(w = 0; w < G.vexnum; w++) { + // Èç¹ûw¶¥µãÔÚV-SÖÐ(δ¼ÓÈë×î¶Ì·¾¶) + if(!final[w]) { + // ¶ÔÓÚͼÀ´Ëµ£¬¾àÀëΪ0Òâζ×ÅÁ½¶¥µã²»Á¬Í¨ + if((G.kind == DG || G.kind == UDG) && D[w] == 0) { + continue; + } + + // Èç¹ûv0µ½wµÄ¾àÀëD[w]СÓÚµ±Ç°Ô¤ÉèµÄ×îС¾àÀ룬ÔòÐèÒª¸üж¥µãºÍ¾àÀëÐÅÏ¢ + if(D[w] < min) { + v = w; // ¼ÇÏÂδ·ÃÎʵĶ¥µãÖоàÀëv0¸ü½üµÄ¶¥µã£¬»òÕß¿ÉÒÔÀí½âΪ¼Ç϶¥µã¼¯V-SÖоàÀë¶¥µã¼¯S¸ü½üµÄ¶¥µã + min = D[w]; // ¼Çϸü½üµÄ¾àÀë + } + } + } + + // ÕÒµ½Á˸ü½üµÄ¶¥µã + if(v != -1) { + // ½«¶¥µã¼¯V-SÖе±Ç°¾àÀëv0¶¥µã×î½üµÄv¼ÓÈëS¼¯ + final[v] = TRUE; + } else { + // Èç¹ûûÕÒµ½¸ü½üµÄ¶¥µã£¬ËµÃ÷¶¥µãv0ÓëV-SÖеÄÊ£Óà¶¥µãûÓÐÁ¬½Ó£¬´Ëʱ¿ÉÒÔÖ±½Ó½áÊø³ÌÐòÁË + return; + } + + // ÒÔÉÏÊöµÄ¶¥µãv×öÌø°å£¬¸üж¥µãv0µ½V-S¼¯ÖÐÆäÓàµã¶¥µãµÄ×î¶Ì·¾¶ + for(w = 0; w < G.vexnum; w++) { + // Èç¹ûÊÇÍø£¬Ö»×ß´Ë·ÖÖ§(½Ì²ÄÖ»´¦ÀíÁË´ËÖÖÇéÐÎ) + if(G.kind == DN || G.kind == UDN) { + /* + * ΪÁ˱ÜÃâÒç³ö£¬ÐèҪȷ±£adjs[v][w]²»ÎªINFINITE¡£ + * ´Ë´¦Æäʵû±ØÒªÅжÏmin!=INFINITE£¬ÒòΪÈç¹ûûÕÒµ½¸ü½üµÄ¶¥µãʱ£¬ÉÏÃæ¾ÍÌáǰ·µ»ØÁË¡£ + * (½Ì²ÄµÄαÂëÖÐδ´¦ÀíÒç³ö£¬¹ÊÐèÒª×ÔÐÐÌí¼Ó) + */ + if(min != INFINITE && adjs[v][w] != INFINITE) { + // ¸üж¥µã¼¯Sµ½¶¥µã¼¯V-SµÄ×î½ü¾àÀë + if(!final[w] && (min + adjs[v][w] < D[w])) { + // ¸üоàÀ룺ÓÉÓÚ¶¥µãv0->w¾­ÓÉvºó»á»ñµÃ¸ü¶ÌµÄ¾àÀ룬¹Ê´Ë´¦ÐèÒª¼ÇϸþàÀë + D[w] = min + adjs[v][w]; + + /* ¸üз¾¶£ºP[w] = P[v] + [w] */ + + // ÏȽ«v0->wµÄ·¾¶¸üÐÂΪv0->jµÄ·¾¶ + for(j = 0; j < G.vexnum; j++) { + P[w][j] = P[v][j]; + } + + // ÔÙ½«wÌí¼Óµ½v0->wµÄ·¾¶ÖÐ + P[w][w] = TRUE; + } + } + } + + // Èç¹ûÊÇͼ£¬Ö»×ß´Ë·ÖÖ§ + if(G.kind == DG || G.kind == UDG) { + // ¸üж¥µã¼¯Sµ½¶¥µã¼¯V-SµÄ×î½ü¾àÀë + if(!final[w] && adjs[v][w] != 0 && D[w] == 0) { + // ¸üоàÀ룺ÓÉÓÚ¶¥µãv0->w¾­ÓÉvºó»á»ñµÃ¸ü¶ÌµÄ¾àÀ룬¹Ê´Ë´¦ÐèÒª¼ÇϸþàÀë + D[w] = D[v] + 1; // ͼÖÐÏàÁÚ¶¥µã²½³¤Îª1 + + /* ¸üз¾¶£ºP[w] = P[v] + [w] */ + + // ÏȽ«v0->wµÄ·¾¶¸üÐÂΪv0->jµÄ·¾¶ + for(j = 0; j < G.vexnum; j++) { + P[w][j] = P[v][j]; + } + + // ÔÙ½«wÌí¼Óµ½v0->wµÄ·¾¶ÖÐ + P[w][w] = TRUE; + } + } + } + } +} + +/* + * ´òӡʹÓõϽÜË¹ÌØÀ­(Dijkstra)Ëã·¨ÇóÈ¡µÄµ¥Ô´×î¶Ì·¾¶ + */ +void PrintPath_DIJ(ALGraph G, int v0, PathMatrix_DIJ P, ShortPathTable_DIJ D) { + int j; + + // ±éÀúËùÓз¾¶ + for(j = 0; j < G.vexnum; j++) { + if(P[j][v0] == FALSE) { + printf("%c µ½ %c Ö®¼äûÓÐͨ·\n", GetVex(G, v0), GetVex(G, j)); + continue; + } + + printf("%c µ½ %c Ö®¼äµÄ×î¶Ì¾àÀëΪ%2d£¬Æä×î¶Ì·¾¶Îª£º", GetVex(G, v0), GetVex(G, j), D[j]); + + /* + * ½«v0->jÖ®¼äµÄÎÞÐò¶¥µãÅÅÁгÉÒ»ÌõÓÐÐò·¾¶ºó´òÓ¡ + * P[i]ָʾv0->jÕâÌõ·¾¶ÉϾ­¹ýµÄ¶¥µã + */ + PrintPath(G, v0, j, P[j]); + } +} + +/* + * ´òÓ¡´Óaµ½bµÄ·¾¶£¬¸Ã·¾¶µÄ¶¥µãÐÅϢλÓÚPÖÐ + */ +static void PrintPath(ALGraph G, int a, int b, Boolean P[MAX_VERTEX_NUM]) { + int i; + int vexs[MAX_VERTEX_NUM + 1]; + int path[MAX_VERTEX_NUM + 1]; + + vexs[0] = 0; + + // »ñÈ¡v0->iÕâÌõ;¾¶ÉϵÄËùÓж¥µã£¬¿ÉÄÜÊÇÎÞÐòµÄ + for(i = 0; i < G.vexnum; i++) { + if(P[i] == TRUE) { + vexs[0]++; + vexs[vexs[0]] = i; + } + } + + // Ö»ÓÐÁ½¸ö¶¥µãµÄÇéÐÎÏ¿ìËÙ´¦Àí + if(vexs[0] == 2) { + path[0] = 2; + path[1] = a; + path[2] = b; + goto print; + } + + // Ö»ÓÐÈý¸ö¶¥µãµÄÇéÐÎÏ¿ìËÙ´¦Àí + if(vexs[0] == 3) { + path[0] = 3; + path[1] = a; + for(i = 1; i <= vexs[0]; i++) { + if(vexs[i] != a && vexs[i] != b) { + path[2] = vexs[i]; + break; + } + } + path[3] = b; + goto print; + } + + path[0] = 1; + path[1] = a; + + for(i = 1; i <= vexs[0]; i++) { + if(vexs[i] == a) { + vexs[i] = -1; + break; + } + } + + Find(G, a, b, vexs, path); + +print: + // ´òÓ¡ÅÅÁкõÄ·¾¶ + for(i = 1; i <= path[0]; i++) { + printf("%c ", GetVex(G, path[i])); + } + + printf("\n"); +} + +/* + * ÀûÓùã¶ÈÔ¤ÏÈËÑË÷ÕÒµ½Ò»Ìõ´Ópreµ½bµÄ·¾¶£¬¸Ã·¾¶ÉÏ·¹ýµÄËùÓж¥µãλÓÚvexsÖУ¬ÕÒ³öµÄ·¾¶´æ´¢µ½pathÖÐ + */ +static Status Find(ALGraph G, int pre, int b, int vexs[MAX_VERTEX_NUM + 1], int path[MAX_VERTEX_NUM + 1]) { + int i; + int tmp; + Status s; + + for(i = 1; i <= vexs[0]; i++) { + // ÒѼÓÈ뵽·¾¶ + if(vexs[i] == -1) { + continue; + } + + // ²»Á¬Í¨ + if(((G.kind == DN || G.kind == UDN) && adjs[pre][vexs[i]] == INFINITE) + || ((G.kind == DG || G.kind == UDG) && adjs[pre][vexs[i]] == 0)) { + continue; + } + + path[0]++; + path[path[0]] = vexs[i]; + + // Óöµ½ÖÕµã + if(vexs[i] == b) { + // ÕÒµ½ÁË×î¶Ì·¾¶ + if(path[0] == vexs[0]) { + return OK; + } else { + path[0]--; + continue; + } + } + + tmp = vexs[i]; + vexs[i] = -1; + + s = Find(G, tmp, b, vexs, path); + + if(s == OK) { + return OK; + } else { + // »Ö¸´¸Ã¶¥µã£¬ÒÔ±ãºóÐøÖØÐÂËÑË÷ + vexs[i] = tmp; + path[0]--; + } + } + + return ERROR; +} diff --git a/Dev-C++/ExerciseBook/07.42/ShortestPaths.h b/Dev-C++/ExerciseBook/07.42/ShortestPaths.h new file mode 100644 index 0000000..d28d204 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.42/ShortestPaths.h @@ -0,0 +1,59 @@ +/*==================== + * ×î¶Ì·¾¶Ëã·¨ + * + * °üº¬Ëã·¨: 7.15¡¢7.16 + =====================*/ + +#ifndef SHORTESTPATHS_H +#define SHORTESTPATHS_H + +#include +#include +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// +#include "ALGraph.h" //**¡ø07 ͼ**// + +// ȨֵµÄ×î´óÖµ£¬ÓÃÔÚÍøÖУ¬±íʾÁ½¶¥µã²»Ö±½ÓÁ¬Í¨ +#define INFINITE INT_MAX + + +// DijkstraËã·¨ÖеÄ×î¶Ì·¾¶¾ØÕó£¬ÊÇÒ»¸ö¶þάÊý×é +typedef Boolean PathMatrix_DIJ[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; +// DijkstraËã·¨ÖеÄ×î¶Ì·¾¶´ú¼Û£¬¸Ã´ú¼Û¿ÉÄÜÊDz½³¤ºÍ£¬Ò²¿ÉÄÜÊÇȨֵºÍ +typedef int ShortPathTable_DIJ[MAX_VERTEX_NUM]; + + +/* + * Ó¦µ±ÔÚÖ´ÐеϽÜË¹ÌØÀ­Ë㷨֮ǰ±»µ÷Óã¬ÓÃÀ´¼ÆËã¸÷¶¥µãÖ®¼äµÄ¹ØÏµ¡£ + */ +void GetAdjs(ALGraph G); + +/* + * ¨€¨€¨€¨€¨€¨€¨€¨€ Ëã·¨7.15 ¨€¨€¨€¨€¨€¨€¨€¨€ + * + * µÏ½ÜË¹ÌØÀ­(Dijkstra)Ëã·¨Çóµ¥Ô´×î¶Ì·¾¶ + * + * @param G ´ý±éÀúµÄͼ¡£ + * @param v0 µ¥Ô´×î¶Ì·¾¶µÄÆðµã¡£ + * @param P ´æ´¢´Óv0µ½ÆäÓà¸÷¶¥µãµÄ×î¶Ì·¾¶ÐÅÏ¢¡£ + * P[j][k]==TRUE´ú±í´Óv0->jµÄ×î¶Ì·¾¶»á¾­¹ý¶¥µãk£»·ñÔò£¬´ú±í²»¾­¹ý¡£ + * ×¢£º¸ÃÊý×éÖ»·´Ó³Á˶¥µãµÄ´æÔÚÐÔ£¬¶øÎ´·´Ó³¶¥µãÔÚ·¾¶ÉϵĴÎÐò¡£ + * @param D ´æ´¢´Óv0µ½ÆäÓà¸÷¶¥µãµÄ×î¶Ì·¾¶´ú¼Û£¬ÔÚͼÖУ¬¸Ã´ú¼ÛÊDz½³¤ºÍ£¬ÔÚÍøÖУ¬¸Ã´ú¼ÛÊÇȨֵºÍ¡£ + */ +void ShortestPath_DIJ(ALGraph G, int v0, PathMatrix_DIJ P, ShortPathTable_DIJ D); + +/* + * ´òӡʹÓõϽÜË¹ÌØÀ­(Dijkstra)Ëã·¨ÇóÈ¡µÄµ¥Ô´×î¶Ì·¾¶ + */ +void PrintPath_DIJ(ALGraph G, int v0, PathMatrix_DIJ P, ShortPathTable_DIJ D); + +/* + * ´òÓ¡´Óaµ½bµÄ·¾¶£¬¸Ã·¾¶µÄ¶¥µãÐÅϢλÓÚPÖÐ + */ +static void PrintPath(ALGraph G, int a, int b, Boolean P[MAX_VERTEX_NUM]) ; + +/* + * ÀûÓùã¶ÈÔ¤ÏÈËÑË÷ÕÒµ½Ò»Ìõ´Ópreµ½bµÄ·¾¶£¬¸Ã·¾¶ÉÏ·¹ýµÄËùÓж¥µãλÓÚvexsÖУ¬ÕÒ³öµÄ·¾¶´æ´¢µ½pathÖÐ + */ +static Status Find(ALGraph G, int pre, int b, int vexs[MAX_VERTEX_NUM], int path[MAX_VERTEX_NUM]); + +#endif diff --git a/Dev-C++/ExerciseBook/07.42/TestData_DG.txt b/Dev-C++/ExerciseBook/07.42/TestData_DG.txt new file mode 100644 index 0000000..8bd9909 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.42/TestData_DG.txt @@ -0,0 +1,6 @@ +ͼÀàÐÍ¡ú0£¨ÓÐÏòͼ£© +¶¥µãÊý¡ú14 +»¡Êý¡ú20 +»¡ÊÇ·ñ´øÓÐÆäËûÐÅÏ¢¡ú0 +¶¥µã¼¯¡ú¡¾A£¬B£¬C£¬D£¬E£¬F£¬G£¬H£¬I£¬J£¬K£¬L£¬M£¬N¡¿ +»¡µÄ¼¯ºÏ¡ú¡¾A£¬C¡¿¡¾A£¬F¡¿¡¾B£¬A¡¿¡¾B£¬H¡¿¡¾C£¬B¡¿¡¾D£¬G¡¿¡¾E£¬H¡¿¡¾E£¬C¡¿¡¾F£¬I¡¿¡¾F£¬G¡¿¡¾H£¬E¡¿¡¾H£¬J¡¿¡¾I£¬E¡¿¡¾I£¬D¡¿¡¾I£¬G¡¿¡¾J£¬D¡¿¡¾L£¬N¡¿¡¾N£¬M¡¿¡¾M£¬L¡¿¡¾M£¬K¡¿ \ No newline at end of file diff --git a/Dev-C++/ExerciseBook/07.42/TestData_DN.txt b/Dev-C++/ExerciseBook/07.42/TestData_DN.txt new file mode 100644 index 0000000..20d59bd --- /dev/null +++ b/Dev-C++/ExerciseBook/07.42/TestData_DN.txt @@ -0,0 +1,6 @@ +ͼÀàÐÍ¡ú1£¨ÓÐÏòÍø£© +¶¥µãÊý¡ú14 +»¡Êý¡ú20 +»¡ÊÇ·ñ´øÓÐÆäËûÐÅÏ¢¡ú1 +¶¥µã¼¯¡ú¡¾A£¬B£¬C£¬D£¬E£¬F£¬G£¬H£¬I£¬J£¬K£¬L£¬M£¬N¡¿ +»¡µÄ¼¯ºÏ¡ú¡¾A£¬C£¬15¡¿¡¾A£¬F£¬1¡¿¡¾B£¬A£¬5¡¿¡¾B£¬H£¬4¡¿¡¾C£¬B£¬5¡¿¡¾D£¬G£¬2¡¿¡¾E£¬H£¬20¡¿¡¾E£¬C£¬4¡¿¡¾F£¬I£¬5¡¿¡¾F£¬G£¬15¡¿¡¾H£¬E£¬2¡¿¡¾H£¬J£¬1¡¿¡¾I£¬E£¬3¡¿¡¾I£¬D£¬3¡¿¡¾I£¬G£¬8¡¿¡¾J£¬D£¬2¡¿¡¾L£¬N£¬2¡¿¡¾N£¬M£¬3¡¿¡¾M£¬L£¬1¡¿¡¾M£¬K£¬4¡¿ \ No newline at end of file diff --git a/Dev-C++/ExerciseBook/07.42/TestData_UDG.txt b/Dev-C++/ExerciseBook/07.42/TestData_UDG.txt new file mode 100644 index 0000000..ecdc733 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.42/TestData_UDG.txt @@ -0,0 +1,6 @@ +ͼÀàÐÍ¡ú2£¨ÎÞÏòͼ£© +¶¥µãÊý¡ú14 +±ßÊý¡ú18 +±ßÊÇ·ñ´øÓÐÆäËûÐÅÏ¢¡ú0 +¶¥µã¼¯¡ú¡¾A£¬B£¬C£¬D£¬E£¬F£¬G£¬H£¬I£¬J£¬K£¬L£¬M£¬N¡¿ +±ßµÄ¼¯ºÏ¡ú¡¾A£¬C¡¿¡¾C£¬E¡¿¡¾E£¬I¡¿¡¾I£¬G¡¿¡¾G£¬D¡¿¡¾A£¬B¡¿¡¾C£¬B¡¿¡¾E£¬B¡¿¡¾E£¬H¡¿¡¾H£¬J¡¿¡¾J£¬D¡¿¡¾A£¬F¡¿¡¾F£¬I¡¿¡¾F£¬G¡¿¡¾L£¬M¡¿¡¾L£¬N¡¿¡¾M£¬N¡¿¡¾M£¬K¡¿ \ No newline at end of file diff --git a/Dev-C++/ExerciseBook/07.42/TestData_UDN.txt b/Dev-C++/ExerciseBook/07.42/TestData_UDN.txt new file mode 100644 index 0000000..9cce592 --- /dev/null +++ b/Dev-C++/ExerciseBook/07.42/TestData_UDN.txt @@ -0,0 +1,6 @@ +ͼÀàÐÍ¡ú3£¨ÎÞÏòÍø£© +¶¥µãÊý¡ú14 +±ßÊý¡ú18 +±ßÊÇ·ñ´øÓÐÆäËûÐÅÏ¢¡ú1 +¶¥µã¼¯¡ú¡¾A£¬B£¬C£¬D£¬E£¬F£¬G£¬H£¬I£¬J£¬K£¬L£¬M£¬N¡¿ +±ßµÄ¼¯ºÏ¡ú¡¾A£¬C£¬2¡¿¡¾C£¬E£¬8¡¿¡¾E£¬I£¬4¡¿¡¾I£¬G£¬5¡¿¡¾G£¬D£¬2¡¿¡¾A£¬B£¬10¡¿¡¾C£¬B£¬5¡¿¡¾E£¬B£¬3¡¿¡¾E£¬H£¬3¡¿¡¾H£¬J£¬1¡¿¡¾J£¬D£¬2¡¿¡¾A£¬F£¬15¡¿¡¾F£¬I£¬3¡¿¡¾F£¬G£¬4¡¿¡¾L£¬M£¬10¡¿¡¾L£¬N£¬3¡¿¡¾M£¬N£¬2¡¿¡¾M£¬K£¬1¡¿ \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.14+07.16/07.14+07.16.c b/VisualC++/ExerciseBook/07.14+07.16/07.14+07.16.c new file mode 100644 index 0000000..9255fac --- /dev/null +++ b/VisualC++/ExerciseBook/07.14+07.16/07.14+07.16.c @@ -0,0 +1,181 @@ +#include +#include // Ìṩºêva_list¡¢va_start¡¢va_arg¡¢va_end +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// +#include "ALGraph.h" //**¡ø07 ͼ**// + +/* + * ´´½¨Í¼/±í + */ +Status CreateGraph_7_14(ALGraph* G, char* path[]); + +/* + * ²åÈë¶¥µã + * + * ½«Ö¸¶¨µÄ¶¥µãv×·¼Óµ½¶¥µã¼¯ÖУ¬Î´½¨Á¢¸Ã¶¥µãÓëÆäËû¶¥µãµÄ¹ØÏµ + */ +Status InsertVex_7_16(ALGraph* G, VertexType v); + +/* + * ɾ³ý¶¥µã + * + * ´Ó¶¥µã¼¯ÖÐɾ³ýÖ¸¶¨µÄ¶¥µãv£¬×¢ÒâÐèÒª¸üÐÂÏà¹ØµÄ¶¥µã¹ØÏµ + */ +Status DeleteVex_7_16(ALGraph* G, VertexType v); + +/* + * ²åÈë±ß/»¡ + * + * Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬Ôò²åÈëÒ»Ìõ»¡ÐèÒªÔö¼ÓÁ½¸ö¶¥µã¹ØÏµ£¬µ«»¡µÄÊýÁ¿Ö»ÔöÒ»¡£ + * + * ¶ÔÓÚͼÀ´Ëµ£¬¿ÉÒÔÔڿɱä²ÎÊýÖÐÁгö±ß/»¡µÄ¸½¼ÓÐÅÏ¢£» + * ¶ÔÓÚÍøÀ´Ëµ£¬¿ÉÒÔÔڿɱä²ÎÊýÖÐÒÀ´ÎÁгö±ß/»¡µÄȨֵÒÔ¼°¸½¼ÓÐÅÏ¢¡£ + */ +Status InsertArc_7_16(ALGraph* G, VertexType v, VertexType w, ...); + +/* + * ɾ³ý±ß/»¡ + * + * ´Ëɾ³ýÖ»ÊǸüбß/»¡µÄÁ¬Í¨¹ØÏµ + */ +Status DeleteArc_7_16(ALGraph* G, VertexType v, VertexType w); + + +int main(int argc, char* argv[]) { + ALGraph G; + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ´´½¨²¢Êä³öͼ/Íø...\n"); + { + char* path[4]; + + path[0] = "TestData_DG.txt"; + path[1] = "TestData_DN.txt"; + path[2] = "TestData_UDG.txt"; + path[3] = "TestData_UDN.txt"; + + CreateGraph_7_14(&G, path); + PrintGraph(G); + printf("\n"); + } + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ɾ³ý¶¥µã...\n"); + { + VertexType v = 'X'; + + printf("ɾ³ý¶¥µã '%c' ºóµÄͼΪ£º\n", v); + DeleteVex_7_16(&G, v); + PrintGraph(G); + printf("\n"); + } + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ²åÈë¶¥µã...\n"); + { + VertexType v = 'Y'; + + printf("²åÈë¶¥µã '%c' ºóµÄͼΪ£º\n", v); + InsertVex_7_16(&G, v); + PrintGraph(G); + printf("\n"); + } + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ²åÈë±ß/»¡...\n"); + { + // ×¢£ºÊÇÖØ¸´µÄ±ß + VertexType v[10] = {'B', 'C', 'E', 'Y', 'Y', 'Y', 'D', 'D', 'E', 'E'}; + VertexType w[10] = {'Y', 'Y', 'Y', 'A', 'B', 'D', 'C', 'A', 'B', 'D'}; + InfoType info[10] = {{8}, {5}, {1}, {11}, {2}, {6}, {3}, {7}, {2}, {9}}; + int k; + + // ͼ + if(G.kind == DG || G.kind == UDG) { + for(k = 0; k < 10; k++) { + printf("²åÈëÎÞȨֵµÄ±ß£º<%c, %c>...\n", v[k], w[k]); + InsertArc_7_16(&G, v[k], w[k]); + } + + // Íø + } else if(G.kind == DN || G.kind == UDN) { + for(k = 0; k < 10; k++) { + printf("²åÈë´øÈ¨ÖµµÄ±ß£º<%c, %c, %d>...\n", v[k], w[k], info[k].weight); + InsertArc_7_16(&G, v[k], w[k], &info[k]); + } + } else { + return ERROR; + } + + PrintGraph(G); + printf("\n"); + } + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ɾ³ý±ß/»¡...\n"); + { + VertexType v[3] = {'D', 'E', 'F'}; + VertexType w[3] = {'A', 'B', 'B'}; + int k; + + for(k = 0; k < 3; k++) { + printf("ɾ³ý±ß£º<%c, %c>...\n", v[k], w[k]); + DeleteArc_7_16(&G, v[k], w[k]); + } + PrintGraph(G); + printf("\n"); + } + + return 0; +} + + +/* + * ´´½¨Í¼/±í + */ +Status CreateGraph_7_14(ALGraph* G, char* path[]) { + return CreateGraph(G, path); +} + +/* + * ²åÈë¶¥µã + * + * ½«Ö¸¶¨µÄ¶¥µãv×·¼Óµ½¶¥µã¼¯ÖУ¬Î´½¨Á¢¸Ã¶¥µãÓëÆäËû¶¥µãµÄ¹ØÏµ + */ +Status InsertVex_7_16(ALGraph* G, VertexType v) { + return InsertVex(G, v); +} + +/* + * ɾ³ý¶¥µã + * + * ´Ó¶¥µã¼¯ÖÐɾ³ýÖ¸¶¨µÄ¶¥µãv£¬×¢ÒâÐèÒª¸üÐÂÏà¹ØµÄ¶¥µã¹ØÏµ + */ +Status DeleteVex_7_16(ALGraph* G, VertexType v) { + return DeleteVex(G, v); +} + +/* + * ²åÈë±ß/»¡ + * + * Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬Ôò²åÈëÒ»Ìõ»¡ÐèÒªÔö¼ÓÁ½¸ö¶¥µã¹ØÏµ£¬µ«»¡µÄÊýÁ¿Ö»ÔöÒ»¡£ + * + * ¶ÔÓÚͼÀ´Ëµ£¬¿ÉÒÔÔڿɱä²ÎÊýÖÐÁгö±ß/»¡µÄ¸½¼ÓÐÅÏ¢£» + * ¶ÔÓÚÍøÀ´Ëµ£¬¿ÉÒÔÔڿɱä²ÎÊýÖÐÒÀ´ÎÁгö±ß/»¡µÄȨֵÒÔ¼°¸½¼ÓÐÅÏ¢¡£ + */ +Status InsertArc_7_16(ALGraph* G, VertexType v, VertexType w, ...) { + va_list ap; + InfoType* info = NULL; // ±ß/»¡µÄ¸½¼ÓÐÅÏ¢ + + // Èç¹û±ß/»¡ÉÏ´æÔÚ¸½¼ÓÐÅÏ¢ + if(IncInfo) { + va_start(ap, w); // ÔÚwºó²éѯÊ׸ö¿É±ä²ÎÊý + info = va_arg(ap, InfoType*); // »ñÈ¡¸½¼ÓÐÅÏ¢ + va_end(ap); + } + + return InsertArc(G, v, w, info); +} + +/* + * ɾ³ý±ß/»¡ + * + * ´Ëɾ³ýÖ»ÊǸüбß/»¡µÄÁ¬Í¨¹ØÏµ + */ +Status DeleteArc_7_16(ALGraph* G, VertexType v, VertexType w) { + return DeleteArc(G, v, w); +} diff --git a/VisualC++/ExerciseBook/07.14+07.16/07.14+07.16.vcxproj b/VisualC++/ExerciseBook/07.14+07.16/07.14+07.16.vcxproj new file mode 100644 index 0000000..ec8e399 --- /dev/null +++ b/VisualC++/ExerciseBook/07.14+07.16/07.14+07.16.vcxproj @@ -0,0 +1,82 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {B272A428-EFD7-4970-BBE1-A5F31E0C8911} + My07140716 + + + + Application + true + MultiByte + + + Application + false + true + MultiByte + + + + + + + + + + + + + $(SolutionDir)\..\Status;$(IncludePath) + + + + Level3 + Disabled + + + true + $(SolutionDir)\..\Status\Status.lib;%(AdditionalDependencies) + Console + + + + + Level3 + MaxSpeed + true + true + + + true + true + true + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.14+07.16/07.14+07.16.vcxproj.filters b/VisualC++/ExerciseBook/07.14+07.16/07.14+07.16.vcxproj.filters new file mode 100644 index 0000000..493746d --- /dev/null +++ b/VisualC++/ExerciseBook/07.14+07.16/07.14+07.16.vcxproj.filters @@ -0,0 +1,44 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + æºæ–‡ä»¶ + + + æºæ–‡ä»¶ + + + + + 头文件 + + + + + èµ„æºæ–‡ä»¶ + + + èµ„æºæ–‡ä»¶ + + + èµ„æºæ–‡ä»¶ + + + èµ„æºæ–‡ä»¶ + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.14+07.16/07.14+07.16.vcxproj.user b/VisualC++/ExerciseBook/07.14+07.16/07.14+07.16.vcxproj.user new file mode 100644 index 0000000..ace9a86 --- /dev/null +++ b/VisualC++/ExerciseBook/07.14+07.16/07.14+07.16.vcxproj.user @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.14+07.16/ALGraph.c b/VisualC++/ExerciseBook/07.14+07.16/ALGraph.c new file mode 100644 index 0000000..1008648 --- /dev/null +++ b/VisualC++/ExerciseBook/07.14+07.16/ALGraph.c @@ -0,0 +1,737 @@ +/*================== + * ͼµÄÁÚ½Ó±í´æ´¢±íʾ + ===================*/ + +#include "ALGraph.h" + +// ¼ÈëÊý¾ÝµÄÔ´Îļþ£»fpΪnullʱ£¬ËµÃ÷ÐèÒª´Ó¿ØÖÆÌ¨Â¼Èë +static FILE* fp = NULL; + +/* + * IncInfoָʾ¸Ãͼ/ÍøµÄ±ß/»¡ÉÏÊÇ·ñ´æÔÚ¸½¼ÓÐÅÏ¢¡£ + * Èç¹ûÆäÖµ²»Îª0£¬Ôò±íʾÎÞ¸½¼ÓÐÅÏ¢£¬·ñÔò£¬±íʾ´æÔÚ¸½¼ÓÐÅÏ¢¡£ + */ +Boolean IncInfo = FALSE; + +// ·ÃÎʱêÖ¾Êý×飬¼Ç¼·ÃÎʹýµÄ¶¥µã +static Boolean visited[MAX_VERTEX_NUM]; + +// º¯Êý±äÁ¿ +static Status (* VisitFunc)(VertexType e); + + +/* + * ´´½¨ + * + *¡¾±¸×¢¡¿ + * + * ½Ì²ÄÖÐĬÈÏ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý¡£ + * ÕâÀïΪÁË·½±ã²âÊÔ£¬±ÜÃâÿ´ÎÔËÐж¼ÊÖ¶¯ÊäÈëÊý¾Ý£¬ + * Òò¶øÔÊÐíÑ¡Ôñ´ÓÔ¤ÉèµÄÎļþpathÖжÁÈ¡²âÊÔÊý¾Ý¡£ + * + * Èç¹ûÐèÒª´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý£¬ÔòpathΪNULL£¬»òpath[kind]Ϊ""¡£ + * Èç¹ûÐèÒª´ÓÎļþÖжÁÈ¡Êý¾Ý£¬ÔòÐèÒªÔÚpathÖÐÌîдÎļþÃûÐÅÏ¢¡£ + */ +Status CreateGraph(ALGraph* G, char* path[]) { + int readFromConsole; // ÊÇ·ñ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý + int kind; + Status flag; + + printf("ÇëÊäÈëͼµÄÀàÐÍ(0-ÓÐÏòͼ ©¦ 1-ÓÐÏòÍø ©¦ 2-ÎÞÏòͼ ©¦ 3-ÎÞÏòÍø)£º"); + scanf("%d", &kind); + + // ÀàÐͲ»ºÏ¹æ + if(kind < 0 || kind > 3) { + return ERROR; + } + + // Èç¹ûûÓÐÎļþ·¾¶ÐÅÏ¢£¬Ôò´Ó¿ØÖÆÌ¨¶ÁÈ¡ÊäÈë + readFromConsole = (path == NULL) || strcmp(path[kind], "") == 0; + + // ÐèÒª´ÓÎļþ¶ÁÈ¡ + if(readFromConsole) { + (*G).kind = kind; // ¼Ç¼ͼ/ÍøµÄÀàÐÍ + } else { + // ´ò¿ªÎļþ£¬×¼±¸¶ÁÈ¡²âÊÔÊý¾Ý + fp = fopen(path[kind], "r"); + if(fp == NULL) { + return ERROR; + } + + // ¼ÈëͼµÄÀàÐÍ + ReadData(fp, "%d", &((*G).kind)); + } + + // Ëæ»ú´´½¨ÓÐÏòͼ/Íø»òÎÞÏòͼ/ÍøµÄÒ»ÖÖ + switch((*G).kind) { + case DG: + flag = CreateDG(G); + break; + case DN: + flag = CreateDN(G); + break; + case UDG: + flag = CreateUDG(G); + break; + case UDN: + flag = CreateUDN(G); + break; + default: + flag = ERROR; + break; + } + + if(fp != NULL) { + fclose(fp); + fp = NULL; + } + + return flag; +} + +/* + * ¹¹ÔìÓÐÏòͼ + */ +static Status CreateDG(ALGraph* G) { + int i, k; + int vexnum, arcnum; + VertexType v1, v2; + InfoType* info = NULL; + + (*G).vexnum = (*G).arcnum = 0; + + if(fp == NULL) { + printf("ÇëÊäÈëÓÐÏòͼµÄ¶¥µãÊý£º"); + scanf("%d", &vexnum); + printf("ÇëÊäÈëÓÐÏòͼµÄ»¡Êý£º"); + scanf("%d", &arcnum); + printf("¸ÃÓÐÏòͼµÄ»¡ÉÏÊÇ·ñ°üº¬ÆäËû¸½¼ÓÐÅÏ¢(0-²»°üº¬©¦1-°üº¬)£º"); + scanf("%d", &IncInfo); + + // ¼Èë¶¥µã¼¯ + printf("Çë¼Èë %d ¸ö¶¥µã£¬²»Í¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º", vexnum); + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(stdin); + scanf("%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } else { + ReadData(fp, "%d", &vexnum); // ¼Èë¶¥µãÊý + ReadData(fp, "%d", &arcnum); // ¼È뻡Êý + ReadData(fp, "%d", &IncInfo); // Åжϻ¡ÉÏÊÇ·ñ°üº¬¸½¼ÓÐÅÏ¢ + + // ¼Èë¶¥µã¼¯ + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(fp); + ReadData(fp, "%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } + + // ½öÔÚ¿ØÖÆÌ¨Â¼ÈëÐÅϢʱÊä³ö´ËÌáʾ + if(fp == NULL && arcnum != 0) { + printf("ÇëΪÓÐÏòͼÒÀ´Î¼Èë %d Ìõ»¡µÄÐÅÏ¢£¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º\n", arcnum); + } + + // ¼È뻡µÄÐÅÏ¢ + for(k = 0; k < arcnum; k++) { + if(fp == NULL) { + printf("µÚ %2d Ìõ»¡£º", k + 1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v2); + } else { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + skipBlank(fp); + ReadData(fp, "%c%c", &v1, &v2); + } + + // Èç¹ûÐèҪ¼È뻡µÄÆäËû¸½¼ÓÐÅÏ¢ + if(IncInfo) { + // ×îºó¼È븽¼ÓÐÅÏ¢ + Input(*G, &info); + } + + // ²åÈ뻡 + InsertArc(G, v1, v2, info); + } + + // ´ÓÎļþÖжÁÈ¡Êý¾Ýʱ£¬×îºóÆäʵӦµ±ÅжÏÒ»ÏÂÊÇ·ñ¶Áµ½ÁË×ã¹»µÄÐÅÏ¢ + return OK; +} + +/* + * ¹¹ÔìÓÐÏòÍø + */ +static Status CreateDN(ALGraph* G) { + int i, k; + int vexnum, arcnum; + VertexType v1, v2; + InfoType* info = NULL; + + (*G).vexnum = (*G).arcnum = 0; + + if(fp == NULL) { + printf("ÇëÊäÈëÓÐÏòÍøµÄ¶¥µãÊý£º"); + scanf("%d", &vexnum); + printf("ÇëÊäÈëÓÐÏòÍøµÄ»¡Êý£º"); + scanf("%d", &arcnum); + printf("¸ÃÓÐÏòÍøµÄ»¡ÉϱØÐë°üº¬ÆäËû¸½¼ÓÐÅÏ¢£¬ÒòΪ´Ë´¦µÄȨֵÐèÒª´æ´¢µ½¸½¼ÓÐÅÏ¢ÖÐ...\n"); + IncInfo = 1; + + // ¼Èë¶¥µã¼¯ + printf("Çë¼Èë %d ¸ö¶¥µã£¬²»Í¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º", vexnum); + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(stdin); + scanf("%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } else { + ReadData(fp, "%d", &vexnum); // ¼Èë¶¥µãÊý + ReadData(fp, "%d", &arcnum); // ¼È뻡Êý + ReadData(fp, "%d", &IncInfo);// Åжϻ¡ÉÏÊÇ·ñ°üº¬¸½¼ÓÐÅÏ¢(´Ë´¦Ó¦µ±°üº¬) + IncInfo = 1; // Ç¿ÖÆ½«È¨ÖµÂ¼Èëµ½¸½¼ÓÐÅÏ¢ÖÐ + + // ¼Èë¶¥µã¼¯ + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(fp); + ReadData(fp, "%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } + + // ½öÔÚ¿ØÖÆÌ¨Â¼ÈëÐÅϢʱÊä³ö´ËÌáʾ + if(fp == NULL && arcnum != 0) { + printf("ÇëΪÓÐÏòÍøÒÀ´Î¼Èë %d Ìõ»¡(´øÈ¨Öµ)µÄÐÅÏ¢£¬¶¥µã¼°È¨ÖµÖ®¼äÓÿոñ¸ô¿ª£º\n", arcnum); + } + + // ¼È뻡µÄÐÅÏ¢ + for(k = 0; k < arcnum; k++) { + if(fp == NULL) { + printf("µÚ %2d Ìõ»¡¼°ÆäȨֵ£º", k + 1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v2); + } else { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + skipBlank(fp); + ReadData(fp, "%c%c", &v1, &v2); + } + + // Èç¹ûÐèҪ¼È뻡µÄÆäËû¸½¼ÓÐÅÏ¢ + if(IncInfo) { + // ×îºó¼È븽¼ÓÐÅÏ¢(´Ë´¦ÐèҪ¼ÈëÍøµÄȨֵ) + Input(*G, &info); + } + + // ²åÈ뻡 + InsertArc(G, v1, v2, info); + } + + // ´ÓÎļþÖжÁÈ¡Êý¾Ýʱ£¬×îºóÆäʵӦµ±ÅжÏÒ»ÏÂÊÇ·ñ¶Áµ½ÁË×ã¹»µÄÐÅÏ¢ + return OK; +} + +/* + * ¹¹ÔìÎÞÏòͼ + */ +static Status CreateUDG(ALGraph* G) { + int i, k; + int vexnum, arcnum; + VertexType v1, v2; + InfoType* info = NULL; + + (*G).vexnum = (*G).arcnum = 0; + + if(fp == NULL) { + printf("ÇëÊäÈëÎÞÏòͼµÄ¶¥µãÊý£º"); + scanf("%d", &vexnum); + printf("ÇëÊäÈëÎÞÏòͼµÄ±ßÊý£º"); + scanf("%d", &arcnum); + printf("¸ÃÎÞÏòͼµÄ±ßÉÏÊÇ·ñ°üº¬ÆäËû¸½¼ÓÐÅÏ¢(0-²»°üº¬©¦1-°üº¬)£º"); + scanf("%d", &IncInfo); + + // ¼Èë¶¥µã¼¯ + printf("Çë¼Èë %d ¸ö¶¥µã£¬²»Í¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º", vexnum); + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(stdin); + scanf("%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } else { + ReadData(fp, "%d", &vexnum); // ¼Èë¶¥µãÊý + ReadData(fp, "%d", &arcnum); // ¼Èë±ßÊý + ReadData(fp, "%d", &IncInfo);// ÅжϱßÉÏÊÇ·ñ°üº¬¸½¼ÓÐÅÏ¢ + + // ¼Èë¶¥µã¼¯ + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(fp); + ReadData(fp, "%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } + + // ½öÔÚ¿ØÖÆÌ¨Â¼ÈëÐÅϢʱÊä³ö´ËÌáʾ + if(fp == NULL && arcnum != 0) { + printf("ÇëΪÎÞÏòͼÒÀ´Î¼Èë %d Ìõ±ßµÄÐÅÏ¢£¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º\n", arcnum); + } + + // ¼Èë±ßµÄÐÅÏ¢ + for(k = 0; k < arcnum; k++) { + if(fp == NULL) { + printf("µÚ %2d Ìõ±ß£º", k + 1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v2); + } else { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + skipBlank(fp); + ReadData(fp, "%c%c", &v1, &v2); + } + + // Èç¹ûÐèҪ¼Èë±ßµÄÆäËû¸½¼ÓÐÅÏ¢ + if(IncInfo) { + // ×îºó¼È븽¼ÓÐÅÏ¢ + Input(*G, &info); + + } + + // ²åÈë±ß + InsertArc(G, v1, v2, info); + } + + // ´ÓÎļþÖжÁÈ¡Êý¾Ýʱ£¬×îºóÆäʵӦµ±ÅжÏÒ»ÏÂÊÇ·ñ¶Áµ½ÁË×ã¹»µÄÐÅÏ¢ + return OK; +} + +/* + * ¹¹ÔìÎÞÏòÍø + */ +static Status CreateUDN(ALGraph* G) { + int i, k; + int vexnum, arcnum; + VertexType v1, v2; + InfoType* info = NULL; + + (*G).vexnum = (*G).arcnum = 0; + + if(fp == NULL) { + printf("ÇëÊäÈëÎÞÏòÍøµÄ¶¥µãÊý£º"); + scanf("%d", &vexnum); + printf("ÇëÊäÈëÎÞÏòÍøµÄ±ßÊý£º"); + scanf("%d", &arcnum); + printf("¸ÃÎÞÏòÍøµÄ±ßÉϱØÐë°üº¬ÆäËû¸½¼ÓÐÅÏ¢£¬ÒòΪ´Ë´¦µÄȨֵÐèÒª´æ´¢µ½¸½¼ÓÐÅÏ¢ÖÐ...\n"); + IncInfo = 1; + + // ¼Èë¶¥µã¼¯ + printf("Çë¼Èë %d ¸ö¶¥µã£¬²»Í¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º", vexnum); + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(stdin); + scanf("%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } else { + ReadData(fp, "%d", &vexnum); // ¼Èë¶¥µãÊý + ReadData(fp, "%d", &arcnum); // ¼Èë±ßÊý + ReadData(fp, "%d", &IncInfo);// ÅжϱßÉÏÊÇ·ñ°üº¬¸½¼ÓÐÅÏ¢ + IncInfo = 1; // Ç¿ÖÆ½«È¨ÖµÂ¼Èëµ½¸½¼ÓÐÅÏ¢ÖÐ + + // ¼Èë¶¥µã¼¯ + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(fp); + ReadData(fp, "%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } + + // ½öÔÚ¿ØÖÆÌ¨Â¼ÈëÐÅϢʱÊä³ö´ËÌáʾ + if(fp == NULL && arcnum != 0) { + printf("ÇëΪÎÞÏòÍøÒÀ´Î¼Èë %d Ìõ±ß(´øÈ¨Öµ)µÄÐÅÏ¢£¬¶¥µã¼°È¨ÖµÖ®¼äÓÿոñ¸ô¿ª£º\n", arcnum); + } + + // ¼Èë±ßµÄÐÅÏ¢ + for(k = 0; k < arcnum; k++) { + if(fp == NULL) { + printf("µÚ %2d Ìõ±ß¼°ÆäȨֵ£º", k + 1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v2); + } else { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + skipBlank(fp); + ReadData(fp, "%c%c", &v1, &v2); + } + + // Èç¹ûÐèҪ¼Èë±ßµÄÆäËû¸½¼ÓÐÅÏ¢ + if(IncInfo) { + // ×îºó¼È븽¼ÓÐÅÏ¢(´Ë´¦ÐèҪ¼ÈëÍøµÄȨֵ) + Input(*G, &info); + } + + // ²åÈë±ß + InsertArc(G, v1, v2, info); + } + + // ´ÓÎļþÖжÁÈ¡Êý¾Ýʱ£¬×îºóÆäʵӦµ±ÅжÏÒ»ÏÂÊÇ·ñ¶Áµ½ÁË×ã¹»µÄÐÅÏ¢ + return OK; +} + +/* + * ¼Èë±ß/»¡µÄÏà¹Ø¸½¼ÓÐÅÏ¢ + */ +static void Input(ALGraph G, InfoType** info) { + int weight; + + // ÔÚ"Íø"µÄÇéÐÎÏÂÐèҪ¼ÈëȨֵÐÅÏ¢ + if(G.kind == DN || G.kind == UDN) { + *info = (InfoType*) malloc(sizeof(InfoType)); + + if(fp == NULL) { + scanf("%d", &weight); + } else { + ReadData(fp, "%d", &weight); + } + + (*info)->weight = weight; + } +} + +/* + * ²éÕÒ + * + * ·µ»Ø¶¥µãuÔÚͼ/ÍøÖеÄλÖà + */ +int LocateVex(ALGraph G, VertexType u) { + int i; + + for(i = 0; i < G.vexnum; i++) { + if(G.vertices[i].data == u) { + return i; + } + } + + return -1; +} + +/* + * ²åÈë¶¥µã + * + * ½«Ö¸¶¨µÄ¶¥µãv×·¼Óµ½¶¥µã¼¯ÖУ¬Î´½¨Á¢¸Ã¶¥µãÓëÆäËû¶¥µãµÄ¹ØÏµ + */ +Status InsertVex(ALGraph* G, VertexType v) { + int k; + + // ¶¥µãÊý¹ý¶à + if((*G).vexnum == MAX_VERTEX_NUM) { + return ERROR; + } + + // Ê×ÏÈÐèÒªÅжϸö¥µãÊÇ·ñ´æÔÚ + k = LocateVex(*G, v); + if(k >= 0) { + return ERROR; // Ö¸¶¨µÄ¶¥µã´æÔÚʱ£¬ÎÞÐèÖØ¸´Ìí¼Ó + } + + G->vertices[(*G).vexnum].data = v; + G->vertices[(*G).vexnum].firstarc = NULL; + + (*G).vexnum++; + + return OK; +} + +/* + * ɾ³ý¶¥µã + * + * ´Ó¶¥µã¼¯ÖÐɾ³ýÖ¸¶¨µÄ¶¥µãv£¬×¢ÒâÐèÒª¸üÐÂÏà¹ØµÄ¶¥µã¹ØÏµ + */ +Status DeleteVex(ALGraph* G, VertexType v) { + int k, i; + ArcNode* pre, * r; + + // Ê×ÏÈÐèÒªÅжϸö¥µãÊÇ·ñ´æÔÚ + k = LocateVex(*G, v); + if(k == -1) { + return ERROR; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + // ÕÒµ½ÒÔ½áµãv³ö·¢µÄÁ´±í£¬ÊͷŸÃÁ´±íÉÏËùÓнáµã + r = G->vertices[k].firstarc; + while(r != NULL) { + pre = r; + r = r->nextarc; + free(pre); + + (*G).arcnum--; + } + + G->vertices[k].firstarc = NULL; + + // ±éÀúÆäËüËùÓÐÁ´±í£¬É¾³ýÄÇЩָÏò¶¥µãvµÄ»¡£»¶øÇÒ£¬Ï±곬¹ýkµÄ¶¥µã£¬ÆäϱêÖµÐèÒªµÝ¼õ + for(i = 0; i < G->vexnum; i++) { + pre = NULL; + r = G->vertices[i].firstarc; + while(r != NULL && r->adjvex < k) { + pre = r; + r = r->nextarc; + } + + // Á´±íÉÏËùÓж¥µãµÄϱê¾ùСÓÚk + if(r == NULL) { + continue; + } + + if(r->adjvex == k) { + // ´Ó¿ªÍ·É¾µô½áµãv + if(pre == NULL) { + G->vertices[i].firstarc = r->nextarc; + + // ´ÓÖмäij¸öλÖÃɾµô½áµãv + } else { + pre->nextarc = r->nextarc; + } + + free(r); + + // Èç¹ûÕâÊÇÓÐÏòµÄͼ/Íø£¬ÒÀÈ»ÐèÒªµÝ¼õ±ß/»¡µÄÊýÁ¿ + if((*G).kind == DG || (*G).kind == DN) { + (*G).arcnum--; + } + } + + // ÔÙ´ÎÈ·¶¨rµÄλÖà + if(pre == NULL) { + r = G->vertices[i].firstarc; + } else { + r = pre->nextarc; + } + + // ϱ곬¹ýkµÄ¶¥µã£¬ÐèÒªµÝ¼õÆäϱê + while(r != NULL && r->adjvex > k) { + r->adjvex -= 1; + r = r->nextarc; + } + } + + // ¶¥µã¼¯Ç°ÒÆ + for(i = k + 1; i < (*G).vexnum; i++) { + G->vertices[i - 1] = G->vertices[i]; + } + + // ¶¥µãÊýµÝ¼õ + (*G).vexnum--; + + return OK; +} + +/* + * ¹¹ÔìÒ»¸ö±ß/»¡½áµã(½öÏÞÄÚ²¿Ê¹ÓÃ) + */ +static ArcNode* newArcNodePtr(int adjvex, ArcNode* nextarc, InfoType* info) { + ArcNode* p = (ArcNode*) malloc(sizeof(ArcNode)); + if(!p) { + exit(OVERFLOW); + } + + p->adjvex = adjvex; + + p->nextarc = nextarc; + + p->info = info; + + return p; +} + +/* + * ²åÈë±ß/»¡ + * + * Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬Ôò²åÈëÒ»Ìõ»¡ÐèÒªÔö¼ÓÁ½¸ö¶¥µã¹ØÏµ£¬µ«»¡µÄÊýÁ¿Ö»ÔöÒ»¡£ + * ¶ÔÓÚͼ/ÍøÀ´Ëµ£¬¿ÉÒÔÔڿɱä²ÎÊýÖÐÁгö±ß/»¡µÄ¸½¼ÓÐÅÏ¢¡£ + * + * ×¢£º´Ë´¦½ÓÊյIJÎÊýÓëMGraphÓÐЩ²»Ò»Ñù£ºÍøµÄ¸½¼ÓÐÅÏ¢Öаüº¬Á˸÷Ìõ±ß/»¡µÄȨֵ¡£ + */ +Status InsertArc(ALGraph* G, VertexType v, VertexType w, ...) { + int tail, head, k, count; + ArcNode* r; + ArcNode* pre; + Boolean overlay = FALSE; // ÊÇ·ñΪ¸²¸ÇÌí¼Ó + InfoType* info = NULL; // ±ß/»¡µÄ¸½¼ÓÐÅÏ¢ + va_list ap; + + tail = LocateVex(*G, v); // »ñÈ¡¶¥µãvÔÚ¶¥µã¼¯ÖеÄλÖà + if(tail == -1) { + return ERROR; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + head = LocateVex(*G, w); // »ñÈ¡¶¥µãwÔÚ¶¥µã¼¯ÖеÄλÖà + if(head == -1) { + return ERROR; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + // ¾Ü¾ø»· + if(tail == head) { + return ERROR; + } + + // Èç¹û±ß/»¡ÉÏ´æÔÚ¸½¼ÓÐÅÏ¢ + if(IncInfo) { + va_start(ap, w); // ÔÚwºó²éѯÊ׸ö¿É±ä²ÎÊý + info = va_arg(ap, InfoType*); // »ñÈ¡¸½¼ÓÐÅÏ¢ + va_end(ap); + } + + /* ½ÓÏÂÀ´£¬ÐèÒª²éÕÒºÏÊʵIJåÈëλÖà */ + + for(count = 0; count < 2; count++) { + pre = NULL; + // Ö¸ÏòÒÔtailΪβµÄÊ×Ìõ±ß/»¡ + r = G->vertices[tail].firstarc; + while(r != NULL && r->adjvex < head) { + pre = r; + r = r->nextarc; + } + + // Óöµ½ÁËÏàͬλÖõĽáµã + if(r != NULL && r->adjvex == head) { + r->info = info; // ¸´Óøýáµã + overlay = TRUE; // ·¢ÉúÁ˸²¸Ç + } else { + if(pre == NULL) { + G->vertices[tail].firstarc = newArcNodePtr(head, r, info); + } else { + pre->nextarc = newArcNodePtr(head, r, info); + } + } + + // Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬ÐèÒª¿¼ÂǶԳÆÐÔ + if((G->kind == UDG || G->kind == UDN) && tail != head) { + // µßµ¹iºÍj + k = tail; + tail = head; + head = k; + } else { + break; // Èç¹ûÊÇÓÐÏòµÄ£¬¿ÉÒÔ½áÊøÁË + } + } + + // ÔڷǸ²¸ÇµÄÇéÐÎÏ£¬²Å¿¼ÂǸüбß/»¡µÄÊýÁ¿ + if(!overlay) { + (*G).arcnum++; // ²»ÂÛÓÐÏòÎÞÏò£¬±ß/»¡ÊýÖ»ÔöÒ» + } + + return OK; +} + +/* + * ɾ³ý±ß/»¡ + */ +Status DeleteArc(ALGraph* G, VertexType v, VertexType w) { + int tail, head, k, count; + ArcNode* r; + ArcNode* pre; + + tail = LocateVex(*G, v); + if(tail == -1) { + return ERROR; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + head = LocateVex(*G, w); + if(head == -1) { + return ERROR; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + for(count = 0; count < 2; count++) { + pre = NULL; + // ÔÚµ±Ç°Á´±íÖÐÕÒµ½´ýɾ³ýµÄ±ß/»¡ + r = G->vertices[tail].firstarc; + while(r != NULL && r->adjvex < head) { + pre = r; + r = r->nextarc; + } + + // ÕÒµ½ÁË´ýɾ³ýµÄ±ß/»¡ + if(r != NULL && r->adjvex == head) { + if(pre == NULL) { + G->vertices[tail].firstarc = r->nextarc; + } else { + pre->nextarc = r->nextarc; + } + + free(r); + } else { + return ERROR; // ûÕÒµ½ + } + + // Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬ÐèÒª¿¼ÂǶԳÆÐÔ + if((G->kind == UDG || G->kind == UDN) && tail != head) { + // µßµ¹tailºÍhead + k = tail; + tail = head; + head = k; + } else { + break; // Èç¹ûÊÇÓÐÏòµÄ£¬¿ÉÒÔ½áÊøÁË + } + } + + (*G).arcnum--; // ²»ÂÛÓÐÏòÎÞÏò£¬±ß/»¡ÊýÖ»¼õÒ» + + return OK; +} + +/* + * ÒÔͼÐλ¯ÐÎʽÊä³öµ±Ç°½á¹¹ + */ +void PrintGraph(ALGraph G) { + int i; + ArcNode* p; + + if(G.vexnum == 0) { + printf("¿Õͼ£¬ÎÞÐè´òÓ¡£¡\n"); + return; + } + + printf("µ±Ç°Í¼/Íø°üº¬ %2d ¸ö¶¥µã£¬ %2d Ìõ±ß/»¡...\n", G.vexnum, G.arcnum); + + for(i = 0; i < G.vexnum; i++) { + printf("%c ===> ", G.vertices[i].data); + + p = G.vertices[i].firstarc; + while(p != NULL) { + if(IncInfo == 0) { + printf("%c ", G.vertices[p->adjvex].data); + + // ¶ÔÓÚÍø£¬»á´ÓÆä¸½¼ÓÐÅÏ¢ÖлñÈ¡µ½È¨Öµ + } else { + printf("%c[%2d] ", G.vertices[p->adjvex].data, p->info->weight); + } + + p = p->nextarc; + + if(p != NULL) { + printf("- "); + } + } + + printf("\n"); + } +} diff --git a/VisualC++/ExerciseBook/07.14+07.16/ALGraph.h b/VisualC++/ExerciseBook/07.14+07.16/ALGraph.h new file mode 100644 index 0000000..954d08c --- /dev/null +++ b/VisualC++/ExerciseBook/07.14+07.16/ALGraph.h @@ -0,0 +1,162 @@ +/*================== + * ͼµÄÁÚ½Ó±í´æ´¢±íʾ + ===================*/ + +#ifndef ALGRAPH_H +#define ALGRAPH_H + +#include +#include // Ìṩmemset¡¢strcmp Ô­ÐÍ +#include // Ìṩºêva_list¡¢va_start¡¢va_arg¡¢va_end +#include // Ìṩmalloc¡¢realloc¡¢free¡¢exitÔ­ÐÍ +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// + +/* + * ×¢£º + * + * ͨ³£À´½²£¬ÎÞȨͼ±»¼ò³ÆÎª¡¾Í¼¡¿£¬ÓÐȨͼ±»¼ò³ÆÎª¡¾Íø¡¿¡£ + * ÎÞÏòͼ/ÍøÖеĶ¥µã¹ØÏµ±»³ÆÎª¡¾±ß¡¿£¬ÓÐÏòͼ/ÍøÖеĶ¥µã¹ØÏµ±»³ÆÎª¡¾»¡¡¿£¬²¢Çø·Ö»¡Í·Ó뻡β¡£ + * ʵ¼Ê±íÊöÖУ¬Î´±Ø»áÑϸñ×ñÊØÒÔÉÏÃüÃû¡£ + * + * µ±Ç°½á¹¹Êʺϴ洢±ß/»¡±È½ÏÏ¡ÊèµÄͼ/Íø¡£ + * + * ¡ï ²åÈë±ß/»¡µÄÐÅϢʱ£¬ÕâÀïµÄʵÏÖÊǰ´"ÉýÐò"²åÈëµÄ£¬ÕâʹµÃ²åÈëµÄ»¡Êǰ´"ÉýÐò"ÅÅÁеġ£ + */ + + +/* ºê¶¨Òå */ +#define MAX_VERTEX_NUM 26 // ×î´ó¶¥µã¸öÊý + + +// ͼµÄÀàÐÍ +typedef enum { + DG, // 0-ÓÐÏòͼ + DN, // 1-ÓÐÏòÍø(´øÈ¨Öµ) + UDG, // 2-ÎÞÏòͼ + UDN // 3-ÎÞÏòÍø(´øÈ¨Öµ) +} GraphKind; + +// ¶¥µãÀàÐÍ +typedef char VertexType; + +// ±ß/»¡µÄÏà¹Ø¸½¼ÓÐÅÏ¢ +typedef struct { + /* + * ×¢£º + * ½Ì²ÄÖиø³öµÄ½á¹¹Ö»¿¼ÂÇÁËÎÞȨͼ£¬¶øÃ»¿¼ÂÇÓÐȨͼ(Íø)¡£ + * ÕâÀïΪÁ˰ѡ°Íø¡±µÄÇéÐÎÒ²¿¼ÂǽøÈ¥£¬ÌØÔÚ¸½¼ÓÐÅÏ¢ÖÐÔö¼ÓÁË"È¨ÖØ"ÊôÐÔ¡£ + */ + int weight; +} InfoType; + +/* ±ß/»¡½áµã */ +typedef struct ArcNode { + int adjvex; // ¸Ã»¡ËùÖ¸ÏòµÄ¶¥µãµÄλÖà + struct ArcNode* nextarc; // Ö¸ÏòÏÂÒ»Ìõ»¡µÄÖ¸Õë + InfoType* info; // »¡µÄ¸½¼ÓÐÅÏ¢£¬Í¨³£ºöÂÔ +} ArcNode; + +// ÿ¸öÁ´±íµÄÍ·½áµã +typedef struct VNode { + VertexType data; // ¶¥µãÐÅÏ¢ + ArcNode* firstarc; // Ö¸ÏòµÚÒ»ÌõÒÀ¸½¸Ã¶¥µãµÄ»¡µÄÖ¸Õë +} VNode; + +/* ͼµÄÁÚ½Ó±í´æ´¢±íʾÀàÐͶ¨Òå */ +typedef struct { + VNode vertices[MAX_VERTEX_NUM]; // ÁÚ½Ó±í + int vexnum, arcnum; // ͼ/ÍøµÄ¶¥µãÊýºÍ»¡Êý + GraphKind kind; // ͼµÄÀàÐͱêÖ¾ +} ALGraph; + + +// ±ß/»¡ÉÏÊÇ·ñ´æÔÚ¸½¼ÓÐÅÏ¢ +extern Boolean IncInfo; + + +/* + * ´´½¨ + * + *¡¾±¸×¢¡¿ + * + * ½Ì²ÄÖÐĬÈÏ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý¡£ + * ÕâÀïΪÁË·½±ã²âÊÔ£¬±ÜÃâÿ´ÎÔËÐж¼ÊÖ¶¯ÊäÈëÊý¾Ý£¬ + * Òò¶øÔÊÐíÑ¡Ôñ´ÓÔ¤ÉèµÄÎļþpathÖжÁÈ¡²âÊÔÊý¾Ý¡£ + * + * Èç¹ûÐèÒª´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý£¬ÔòpathΪNULL£¬»òpath[kind]Ϊ""¡£ + * Èç¹ûÐèÒª´ÓÎļþÖжÁÈ¡Êý¾Ý£¬ÔòÐèÒªÔÚpathÖÐÌîдÎļþÃûÐÅÏ¢¡£ + */ +Status CreateGraph(ALGraph* G, char* path[]); + +/* + * ¹¹ÔìÓÐÏòͼ + */ +static Status CreateDG(ALGraph* G); + +/* + * ¹¹ÔìÓÐÏòÍø + */ +static Status CreateDN(ALGraph* G); + +/* + * ¹¹ÔìÎÞÏòͼ + */ +static Status CreateUDG(ALGraph* G); + +/* + * ¹¹ÔìÎÞÏòÍø + */ +static Status CreateUDN(ALGraph* G); + +/* + * ¼Èë±ß/»¡µÄÏà¹Ø¸½¼ÓÐÅÏ¢ + */ +static void Input(ALGraph G, InfoType** info); + +/* + * ²éÕÒ + * + * ·µ»Ø¶¥µãuÔÚͼ/ÍøÖеÄλÖà + */ +int LocateVex(ALGraph G, VertexType u); + +/* + * ²åÈë¶¥µã + * + * ½«Ö¸¶¨µÄ¶¥µãv×·¼Óµ½¶¥µã¼¯ÖУ¬Î´½¨Á¢¸Ã¶¥µãÓëÆäËû¶¥µãµÄ¹ØÏµ + */ +Status InsertVex(ALGraph* G, VertexType v); + +/* + * ɾ³ý¶¥µã + * + * ´Ó¶¥µã¼¯ÖÐɾ³ýÖ¸¶¨µÄ¶¥µãv£¬×¢ÒâÐèÒª¸üÐÂÏà¹ØµÄ¶¥µã¹ØÏµ + */ +Status DeleteVex(ALGraph* G, VertexType v); + +/* + * ¹¹ÔìÒ»¸ö±ß/»¡½áµã(½öÏÞÄÚ²¿Ê¹ÓÃ) + */ +static ArcNode* newArcNodePtr(int adjvex, ArcNode* nextarc, InfoType* info); + +/* + * ²åÈë±ß/»¡ + * + * Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬Ôò²åÈëÒ»Ìõ»¡ÐèÒªÔö¼ÓÁ½¸ö¶¥µã¹ØÏµ£¬µ«»¡µÄÊýÁ¿Ö»ÔöÒ»¡£ + * ¶ÔÓÚͼ/ÍøÀ´Ëµ£¬¿ÉÒÔÔڿɱä²ÎÊýÖÐÁгö±ß/»¡µÄ¸½¼ÓÐÅÏ¢¡£ + * + * ×¢£º´Ë´¦½ÓÊյIJÎÊýÓëMGraphÓÐЩ²»Ò»Ñù£ºÍøµÄ¸½¼ÓÐÅÏ¢Öаüº¬Á˸÷Ìõ±ß/»¡µÄȨֵ¡£ + */ +Status InsertArc(ALGraph* G, VertexType v, VertexType w, ...); + +/* + * ɾ³ý±ß/»¡ + */ +Status DeleteArc(ALGraph* G, VertexType v, VertexType w); + +/* + * ÒÔͼÐλ¯ÐÎʽÊä³öµ±Ç°½á¹¹ + */ +void PrintGraph(ALGraph G); + +#endif diff --git a/VisualC++/ExerciseBook/07.14+07.16/TestData_DG.txt b/VisualC++/ExerciseBook/07.14+07.16/TestData_DG.txt new file mode 100644 index 0000000..ae011ea --- /dev/null +++ b/VisualC++/ExerciseBook/07.14+07.16/TestData_DG.txt @@ -0,0 +1,6 @@ +ͼÀàÐÍ¡ú0£¨ÓÐÏòͼ£© +¶¥µãÊý¡ú6 +»¡Êý¡ú14 +»¡ÊÇ·ñ´øÓÐÆäËûÐÅÏ¢¡ú0 +¶¥µã¼¯¡ú¡¾A£¬X£¬B£¬C£¬D£¬E¡¿ +»¡µÄ¼¯ºÏ¡ú¡¾A£¬B¡¿¡¾A£¬C¡¿¡¾A£¬D¡¿¡¾B£¬C¡¿¡¾B£¬D¡¿¡¾B£¬E¡¿¡¾C£¬B¡¿¡¾C£¬E¡¿¡¾C£¬X¡¿¡¾E£¬A¡¿¡¾E£¬D¡¿¡¾E£¬X¡¿¡¾X£¬A¡¿¡¾X£¬D¡¿ \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.14+07.16/TestData_DN.txt b/VisualC++/ExerciseBook/07.14+07.16/TestData_DN.txt new file mode 100644 index 0000000..c41b879 --- /dev/null +++ b/VisualC++/ExerciseBook/07.14+07.16/TestData_DN.txt @@ -0,0 +1,6 @@ +ͼÀàÐÍ¡ú1£¨ÓÐÏòÍø£© +¶¥µãÊý¡ú6 +»¡Êý¡ú14 +»¡ÊÇ·ñ´øÓÐÆäËûÐÅÏ¢¡ú1 +¶¥µã¼¯¡ú¡¾A£¬X£¬B£¬C£¬D£¬E¡¿ +»¡µÄ¼¯ºÏ¡ú¡¾A£¬B£¬3¡¿¡¾A£¬C£¬8¡¿¡¾A£¬D£¬11¡¿¡¾B£¬C£¬7¡¿¡¾B£¬D£¬4¡¿¡¾B£¬E£¬1¡¿¡¾C£¬B£¬5¡¿¡¾C£¬E£¬17¡¿¡¾C£¬X£¬3¡¿¡¾E£¬A£¬6¡¿¡¾E£¬D£¬4¡¿¡¾E£¬X£¬2¡¿¡¾X£¬A£¬8¡¿¡¾X£¬D£¬10¡¿ \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.14+07.16/TestData_UDG.txt b/VisualC++/ExerciseBook/07.14+07.16/TestData_UDG.txt new file mode 100644 index 0000000..6c08d74 --- /dev/null +++ b/VisualC++/ExerciseBook/07.14+07.16/TestData_UDG.txt @@ -0,0 +1,6 @@ +ͼÀàÐÍ¡ú2£¨ÎÞÏòͼ£© +¶¥µãÊý¡ú6 +±ßÊý¡ú13 +±ßÊÇ·ñ´øÓÐÆäËûÐÅÏ¢¡ú0 +¶¥µã¼¯¡ú¡¾A£¬X£¬B£¬C£¬D£¬E¡¿ +±ßµÄ¼¯ºÏ¡ú¡¾A£¬B¡¿¡¾A£¬C¡¿¡¾A£¬D¡¿¡¾B£¬C¡¿¡¾B£¬D¡¿¡¾B£¬E¡¿¡¾C£¬E¡¿¡¾C£¬X¡¿¡¾E£¬A¡¿¡¾E£¬D¡¿¡¾E£¬X¡¿¡¾X£¬A¡¿¡¾X£¬D¡¿ \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.14+07.16/TestData_UDN.txt b/VisualC++/ExerciseBook/07.14+07.16/TestData_UDN.txt new file mode 100644 index 0000000..2117df2 --- /dev/null +++ b/VisualC++/ExerciseBook/07.14+07.16/TestData_UDN.txt @@ -0,0 +1,6 @@ +ͼÀàÐÍ¡ú3£¨ÎÞÏòÍø£© +¶¥µãÊý¡ú6 +±ßÊý¡ú13 +±ßÊÇ·ñ´øÓÐÆäËûÐÅÏ¢¡ú1 +¶¥µã¼¯¡ú¡¾A£¬X£¬B£¬C£¬D£¬E¡¿ +±ßµÄ¼¯ºÏ¡ú¡¾A£¬B£¬3¡¿¡¾A£¬C£¬8¡¿¡¾A£¬D£¬11¡¿¡¾B£¬C£¬7¡¿¡¾B£¬D£¬4¡¿¡¾B£¬E£¬1¡¿¡¾C£¬E£¬17¡¿¡¾C£¬X£¬3¡¿¡¾E£¬A£¬6¡¿¡¾E£¬D£¬4¡¿¡¾E£¬X£¬2¡¿¡¾X£¬A£¬8¡¿¡¾X£¬D£¬10¡¿ \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.15/07.15.c b/VisualC++/ExerciseBook/07.15/07.15.c new file mode 100644 index 0000000..b59fb02 --- /dev/null +++ b/VisualC++/ExerciseBook/07.15/07.15.c @@ -0,0 +1,191 @@ +#include +#include // Ìṩºêva_list¡¢va_start¡¢va_arg¡¢va_end +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// +#include "MGraph.h" //**¡ø07 ͼ**// + +/* + * ²åÈë¶¥µã + * + * ½«Ö¸¶¨µÄ¶¥µãv×·¼Óµ½¶¥µã¼¯ÖУ¬Î´½¨Á¢¸Ã¶¥µãÓëÆäËû¶¥µãµÄ¹ØÏµ + */ +Status InsertVex_7_15(MGraph* G, VertexType v); + +/* + * ɾ³ý¶¥µã + * + * ´Ó¶¥µã¼¯ÖÐɾ³ýÖ¸¶¨µÄ¶¥µãv£¬×¢ÒâÐèÒª¸üÐÂÏà¹ØµÄ¶¥µã¹ØÏµ + */ +Status DeleteVex_7_15(MGraph* G, VertexType v); + +/* + * ²åÈë±ß/»¡ + * + * Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬Ôò²åÈëÒ»Ìõ»¡ÐèÒªÔö¼ÓÁ½¸ö¶¥µã¹ØÏµ£¬µ«»¡µÄÊýÁ¿Ö»ÔöÒ»¡£ + * + * ¶ÔÓÚͼÀ´Ëµ£¬¿ÉÒÔÔڿɱä²ÎÊýÖÐÁгö±ß/»¡µÄ¸½¼ÓÐÅÏ¢£» + * ¶ÔÓÚÍøÀ´Ëµ£¬¿ÉÒÔÔڿɱä²ÎÊýÖÐÒÀ´ÎÁгö±ß/»¡µÄȨֵÒÔ¼°¸½¼ÓÐÅÏ¢¡£ + */ +Status InsertArc_7_15(MGraph* G, VertexType v, VertexType w, ...); + +/* + * ɾ³ý±ß/»¡ + * + * ´Ëɾ³ýÖ»ÊǸüбß/»¡µÄÁ¬Í¨¹ØÏµ + */ +Status DeleteArc_7_15(MGraph* G, VertexType v, VertexType w); + + +int main(int argc, char* argv[]) { + MGraph G; + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ´´½¨²¢Êä³öͼ/Íø...\n"); + { + char* path[4]; + + path[0] = "TestData_DG.txt"; + path[1] = "TestData_DN.txt"; + path[2] = "TestData_UDG.txt"; + path[3] = "TestData_UDN.txt"; + + CreateGraph(&G, path); + PrintGraph(G); + printf("\n"); + } + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ɾ³ý¶¥µã...\n"); + { + VertexType v = 'X'; + + printf("ɾ³ý¶¥µã '%c' ºóµÄͼΪ£º\n", v); + DeleteVex_7_15(&G, v); + PrintGraph(G); + printf("\n"); + } + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ²åÈë¶¥µã...\n"); + { + VertexType v = 'Y'; + + printf("²åÈë¶¥µã '%c' ºóµÄͼΪ£º\n", v); + InsertVex_7_15(&G, v); + PrintGraph(G); + printf("\n"); + } + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ²åÈë±ß/»¡...\n"); + { + // ×¢£ºÊÇÖØ¸´µÄ±ß + VertexType v[10] = {'B', 'C', 'E', 'Y', 'Y', 'Y', 'D', 'D', 'E', 'E'}; + VertexType w[10] = {'Y', 'Y', 'Y', 'A', 'B', 'D', 'C', 'A', 'B', 'D'}; + VRType adj[10] = {8, 5, 1, 11, 2, 6, 3, 7, 2, 9}; + int k; + + // ͼ + if(G.kind == DG || G.kind == UDG) { + for(k = 0; k < 10; k++) { + printf("²åÈëÎÞȨֵµÄ±ß£º<%c, %c>...\n", v[k], w[k]); + InsertArc_7_15(&G, v[k], w[k]); + } + + // Íø + } else if(G.kind == DN || G.kind == UDN) { + for(k = 0; k < 10; k++) { + printf("²åÈë´øÈ¨ÖµµÄ±ß£º<%c, %c, %d>...\n", v[k], w[k], adj[k]); + InsertArc_7_15(&G, v[k], w[k], adj[k]); + } + } else { + return ERROR; + } + + PrintGraph(G); + printf("\n"); + } + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ɾ³ý±ß/»¡...\n"); + { + VertexType v[3] = {'D', 'E', 'F'}; + VertexType w[3] = {'A', 'B', 'B'}; + int k; + + for(k = 0; k < 3; k++) { + printf("ɾ³ý±ß£º<%c, %c>...\n", v[k], w[k]); + DeleteArc_7_15(&G, v[k], w[k]); + } + PrintGraph(G); + printf("\n"); + } + + return 0; +} + + +/* + * ²åÈë¶¥µã + * + * ½«Ö¸¶¨µÄ¶¥µãv×·¼Óµ½¶¥µã¼¯ÖУ¬Î´½¨Á¢¸Ã¶¥µãÓëÆäËû¶¥µãµÄ¹ØÏµ + */ +Status InsertVex_7_15(MGraph* G, VertexType v) { + return InsertVex(G, v); +} + +/* + * ɾ³ý¶¥µã + * + * ´Ó¶¥µã¼¯ÖÐɾ³ýÖ¸¶¨µÄ¶¥µãv£¬×¢ÒâÐèÒª¸üÐÂÏà¹ØµÄ¶¥µã¹ØÏµ + */ +Status DeleteVex_7_15(MGraph* G, VertexType v) { + return DeleteVex(G, v); +} + +/* + * ²åÈë±ß/»¡ + * + * Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬Ôò²åÈëÒ»Ìõ»¡ÐèÒªÔö¼ÓÁ½¸ö¶¥µã¹ØÏµ£¬µ«»¡µÄÊýÁ¿Ö»ÔöÒ»¡£ + * + * ¶ÔÓÚͼÀ´Ëµ£¬¿ÉÒÔÔڿɱä²ÎÊýÖÐÁгö±ß/»¡µÄ¸½¼ÓÐÅÏ¢£» + * ¶ÔÓÚÍøÀ´Ëµ£¬¿ÉÒÔÔڿɱä²ÎÊýÖÐÒÀ´ÎÁгö±ß/»¡µÄȨֵÒÔ¼°¸½¼ÓÐÅÏ¢¡£ + */ +Status InsertArc_7_15(MGraph* G, VertexType v, VertexType w, ...) { + va_list ap; + VRType adj; + InfoType* info = NULL; // ±ß/»¡µÄ¸½¼ÓÐÅÏ¢ + + // ͼ + if((*G).kind == DG || (*G).kind == UDG) { + + // Èç¹û±ß/»¡ÉÏ´æÔÚ¸½¼ÓÐÅÏ¢ + if(IncInfo) { + va_start(ap, w); // ÔÚwºó²éѯÊ׸ö¿É±ä²ÎÊý + info = va_arg(ap, InfoType*); // »ñÈ¡¸½¼ÓÐÅÏ¢ + va_end(ap); + } + + return InsertArc(G, v, w, info); + + // Íø + } else if((*G).kind == DN || (*G).kind == UDN) { + va_start(ap, w); // ÔÚwºó²éѯÊ׸ö¿É±ä²ÎÊý + + adj = va_arg(ap, VRType); // »ñȡȨֵÐÅÏ¢ + + // Èç¹û±ß/»¡ÉÏ´æÔÚ¸½¼ÓÐÅÏ¢ + if(IncInfo) { + info = va_arg(ap, InfoType*); // »ñÈ¡¸½¼ÓÐÅÏ¢ + } + + va_end(ap); + + return InsertArc(G, v, w, adj, info); + } else { + return ERROR; + } +} + +/* + * ɾ³ý±ß/»¡ + * + * ´Ëɾ³ýÖ»ÊǸüбß/»¡µÄÁ¬Í¨¹ØÏµ + */ +Status DeleteArc_7_15(MGraph* G, VertexType v, VertexType w) { + return DeleteArc(G, v, w); +} diff --git a/VisualC++/ExerciseBook/07.15/07.15.vcxproj b/VisualC++/ExerciseBook/07.15/07.15.vcxproj new file mode 100644 index 0000000..6f83d19 --- /dev/null +++ b/VisualC++/ExerciseBook/07.15/07.15.vcxproj @@ -0,0 +1,82 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {F2C7C449-A4B9-46D2-ACB6-D5A1C52F7814} + My0715 + + + + Application + true + MultiByte + + + Application + false + true + MultiByte + + + + + + + + + + + + + $(SolutionDir)\..\Status;$(IncludePath) + + + + Level3 + Disabled + + + true + $(SolutionDir)\..\Status\Status.lib;%(AdditionalDependencies) + Console + + + + + Level3 + MaxSpeed + true + true + + + true + true + true + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.15/07.15.vcxproj.filters b/VisualC++/ExerciseBook/07.15/07.15.vcxproj.filters new file mode 100644 index 0000000..74dc74a --- /dev/null +++ b/VisualC++/ExerciseBook/07.15/07.15.vcxproj.filters @@ -0,0 +1,44 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + æºæ–‡ä»¶ + + + æºæ–‡ä»¶ + + + + + 头文件 + + + + + èµ„æºæ–‡ä»¶ + + + èµ„æºæ–‡ä»¶ + + + èµ„æºæ–‡ä»¶ + + + èµ„æºæ–‡ä»¶ + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.15/07.15.vcxproj.user b/VisualC++/ExerciseBook/07.15/07.15.vcxproj.user new file mode 100644 index 0000000..ace9a86 --- /dev/null +++ b/VisualC++/ExerciseBook/07.15/07.15.vcxproj.user @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.15/MGraph.c b/VisualC++/ExerciseBook/07.15/MGraph.c new file mode 100644 index 0000000..24c4dfb --- /dev/null +++ b/VisualC++/ExerciseBook/07.15/MGraph.c @@ -0,0 +1,719 @@ +/*================================= + * ͼµÄÊý×é(ÁÚ½Ó¾ØÕó)´æ´¢±íʾ + * + * °üº¬Ëã·¨: 7.1¡¢7.2¡¢7.4¡¢7.5¡¢7.6 + ==================================*/ + +#include "MGraph.h" //**¡ø07 ͼ**// + +// ¼ÈëÊý¾ÝµÄÔ´Îļþ£»fpΪnullʱ£¬ËµÃ÷ÐèÒª´Ó¿ØÖÆÌ¨Â¼Èë +static FILE* fp = NULL; + +/* + * IncInfoָʾ¸Ãͼ/ÍøµÄ±ß/»¡ÉÏÊÇ·ñ´æÔÚ¸½¼ÓÐÅÏ¢¡£ + * Èç¹ûÆäÖµ²»Îª0£¬Ôò±íʾÎÞ¸½¼ÓÐÅÏ¢£¬·ñÔò£¬±íʾ´æÔÚ¸½¼ÓÐÅÏ¢¡£ + */ +Boolean IncInfo = FALSE; + +// ·ÃÎʱêÖ¾Êý×飬¼Ç¼·ÃÎʹýµÄ¶¥µã +static Boolean visited[MAX_VERTEX_NUM]; + +// º¯Êý±äÁ¿ +static Status (* VisitFunc)(VertexType e); + + +/* + * ¨€¨€¨€¨€¨€¨€¨€¨€ Ëã·¨7.1 ¨€¨€¨€¨€¨€¨€¨€¨€ + * + * ´´½¨Í¼/±í + * + *¡¾±¸×¢¡¿ + * + * ½Ì²ÄÖÐĬÈÏ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý¡£ + * ÕâÀïΪÁË·½±ã²âÊÔ£¬±ÜÃâÿ´ÎÔËÐж¼ÊÖ¶¯ÊäÈëÊý¾Ý£¬ + * Òò¶øÔÊÐíÑ¡Ôñ´ÓÔ¤ÉèµÄÎļþpathÖжÁÈ¡²âÊÔÊý¾Ý¡£ + * + * Èç¹ûÐèÒª´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý£¬ÔòpathΪNULL£¬»òpath[kind]Ϊ""¡£ + * Èç¹ûÐèÒª´ÓÎļþÖжÁÈ¡Êý¾Ý£¬ÔòÐèÒªÔÚpathÖÐÌîдÎļþÃûÐÅÏ¢¡£ + */ +Status CreateGraph(MGraph* G, char* path[]) { + int readFromConsole; // ÊÇ·ñ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý + int kind; + Status flag; + + printf("ÇëÊäÈëͼµÄÀàÐÍ(0-ÓÐÏòͼ ©¦ 1-ÓÐÏòÍø ©¦ 2-ÎÞÏòͼ ©¦ 3-ÎÞÏòÍø)£º"); + scanf("%d", &kind); + + // ÀàÐͲ»ºÏ¹æ + if(kind < 0 || kind > 3) { + return ERROR; + } + + // Èç¹ûûÓÐÎļþ·¾¶ÐÅÏ¢£¬Ôò´Ó¿ØÖÆÌ¨¶ÁÈ¡ÊäÈë + readFromConsole = (path == NULL) || strcmp(path[kind], "") == 0; + + // ÐèÒª´ÓÎļþ¶ÁÈ¡ + if(readFromConsole) { + (*G).kind = kind; // ¼Ç¼ͼ/ÍøµÄÀàÐÍ + } else { + // ´ò¿ªÎļþ£¬×¼±¸¶ÁÈ¡²âÊÔÊý¾Ý + fp = fopen(path[kind], "r"); + if(fp == NULL) { + return ERROR; + } + + // ¼ÈëͼµÄÀàÐÍ + ReadData(fp, "%d", &((*G).kind)); + } + + // Ëæ»ú´´½¨ÓÐÏòͼ/Íø»òÎÞÏòͼ/ÍøµÄÒ»ÖÖ + switch((*G).kind) { + case DG: + flag = CreateDG(G); + break; + case DN: + flag = CreateDN(G); + break; + case UDG: + flag = CreateUDG(G); + break; + case UDN: + flag = CreateUDN(G); + break; + default: + flag = ERROR; + break; + } + + if(fp != NULL) { + fclose(fp); + fp = NULL; + } + + return flag; +} + +/* + * ¹¹ÔìÓÐÏòͼ + */ +static Status CreateDG(MGraph* G) { + int i, j, k; + ArcCell arcs = {0, NULL}; // ÓÐÏòͼÿÌõ±ßµÄ³õʼֵ + VertexType v1, v2; + + if(fp == NULL) { + printf("ÇëÊäÈëÓÐÏòͼµÄ¶¥µãÊý£º"); + scanf("%d", &((*G).vexnum)); + printf("ÇëÊäÈëÓÐÏòͼµÄ»¡Êý£º"); + scanf("%d", &((*G).arcnum)); + printf("¸ÃÓÐÏòͼµÄ»¡ÉÏÊÇ·ñ°üº¬ÆäËû¸½¼ÓÐÅÏ¢(0-²»°üº¬©¦1-°üº¬)£º"); + scanf("%d", &IncInfo); + + // ¼Èë¶¥µã¼¯ + printf("Çë¼Èë %d ¸ö¶¥µã£¬²»Í¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º", (*G).vexnum); + for(i = 0; i < (*G).vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(stdin); + scanf("%c", &((*G).vexs[i])); + } + } else { + ReadData(fp, "%d", &((*G).vexnum)); // ¼Èë¶¥µãÊý + ReadData(fp, "%d", &((*G).arcnum)); // ¼È뻡Êý + ReadData(fp, "%d", &IncInfo); // Åжϻ¡ÉÏÊÇ·ñ°üº¬¸½¼ÓÐÅÏ¢ + + // ¼Èë¶¥µã¼¯ + for(i = 0; i < (*G).vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(fp); + ReadData(fp, "%c", &((*G).vexs[i])); + } + } + + // ³õʼ»¯ÓÐÏòͼµÄÁÚ½Ó¾ØÕó + for(i = 0; i < (*G).vexnum; i++) { + for(j = 0; j < (*G).vexnum; j++) { + (*G).arcs[i][j] = arcs; + } + } + + // ½öÔÚ¿ØÖÆÌ¨Â¼ÈëÐÅϢʱÊä³ö´ËÌáʾ + if(fp == NULL && (*G).arcnum != 0) { + printf("ÇëΪÓÐÏòͼÒÀ´Î¼Èë %d Ìõ»¡µÄÐÅÏ¢£¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º\n", (*G).arcnum); + } + + // ¼È뻡µÄÐÅÏ¢ + for(k = 0; k < (*G).arcnum; k++) { + if(fp == NULL) { + printf("µÚ %2d Ìõ»¡£º", k + 1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v2); + } else { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + skipBlank(fp); + ReadData(fp, "%c%c", &v1, &v2); + } + + i = LocateVex(*G, v1); // »ñÈ¡¶¥µãv1ÔÚ¶¥µã¼¯ÖеÄλÖà + j = LocateVex(*G, v2); // »ñÈ¡¶¥µãv2ÔÚ¶¥µã¼¯ÖеÄλÖà + + // ½«Ö¸¶¨µÄ¶¥µã¹ØÏµÉèÖÃΪ1£¬Ö¸Ê¾ÕâÁ½¸ö¶¥µãÊÇÖ±½ÓÁ¬½ÓµÄ(×¢£ºÕâÀïûÓÐÑé֤ϱêÊÇ·ñÔ½½ç) + (*G).arcs[i][j].adj = 1; + + // Èç¹ûÐèҪ¼È뻡µÄÆäËû¸½¼ÓÐÅÏ¢ + if(IncInfo) { + // ×îºó¼È븽¼ÓÐÅÏ¢ + Input(*G, &((*G).arcs[i][j].info)); + } + } + + // ´ÓÎļþÖжÁÈ¡Êý¾Ýʱ£¬×îºóÆäʵӦµ±ÅжÏÒ»ÏÂÊÇ·ñ¶Áµ½ÁË×ã¹»µÄÐÅÏ¢ + return OK; +} + +/* + * ¹¹ÔìÓÐÏòÍø + */ +static Status CreateDN(MGraph* G) { + int i, j, k; + ArcCell arcs = {INFINITE, NULL}; // ÓÐÏòÍøÃ¿Ìõ»¡µÄ³õʼֵ + VertexType v1, v2; + VRType w; + + if(fp == NULL) { + printf("ÇëÊäÈëÓÐÏòÍøµÄ¶¥µãÊý£º"); + scanf("%d", &((*G).vexnum)); + printf("ÇëÊäÈëÓÐÏòÍøµÄ»¡Êý£º"); + scanf("%d", &((*G).arcnum)); + printf("¸ÃÓÐÏòÍøµÄ»¡ÉÏÊÇ·ñ°üº¬ÆäËû¸½¼ÓÐÅÏ¢(0-²»°üº¬©¦1-°üº¬)£º"); + scanf("%d", &IncInfo); + + // ¼Èë¶¥µã¼¯ + printf("Çë¼Èë %d ¸ö¶¥µã£¬²»Í¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º", (*G).vexnum); + for(i = 0; i < (*G).vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(stdin); + scanf("%c", &((*G).vexs[i])); + } + } else { + ReadData(fp, "%d", &((*G).vexnum)); // ¼Èë¶¥µãÊý + ReadData(fp, "%d", &((*G).arcnum)); // ¼È뻡Êý + ReadData(fp, "%d", &IncInfo); // Åжϻ¡ÉÏÊÇ·ñ°üº¬¸½¼ÓÐÅÏ¢ + + // ¼Èë¶¥µã¼¯ + for(i = 0; i < (*G).vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(fp); + ReadData(fp, "%c", &((*G).vexs[i])); + } + } + + // ³õʼ»¯ÓÐÏòÍøµÄÁÚ½Ó¾ØÕó + for(i = 0; i < (*G).vexnum; i++) { + for(j = 0; j < (*G).vexnum; j++) { + (*G).arcs[i][j] = arcs; + } + } + + // ½öÔÚ¿ØÖÆÌ¨Â¼ÈëÐÅϢʱÊä³ö´ËÌáʾ + if(fp == NULL && (*G).arcnum != 0) { + printf("ÇëΪÓÐÏòÍøÒÀ´Î¼Èë %d Ìõ»¡(´øÈ¨Öµ)µÄÐÅÏ¢£¬¶¥µã¼°È¨ÖµÖ®¼äÓÿոñ¸ô¿ª£º\n", (*G).arcnum); + } + + // ¼È뻡µÄÐÅÏ¢ + for(k = 0; k < (*G).arcnum; k++) { + if(fp == NULL) { + printf("µÚ %2d Ìõ»¡¼°ÆäȨֵ£º", k + 1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v2); + scanf("%d", &w); + } else { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + skipBlank(fp); + ReadData(fp, "%c%c%d", &v1, &v2, &w); + } + + i = LocateVex(*G, v1); // »ñÈ¡¶¥µãv1ÔÚ¶¥µã¼¯ÖеÄλÖà + j = LocateVex(*G, v2); // »ñÈ¡¶¥µãv2ÔÚ¶¥µã¼¯ÖеÄλÖà + + // ÔÚÖ¸¶¨µÄ¶¥µã¹ØÏµÉϼǼȨֵ(×¢£ºÕâÀïûÓÐÑé֤ϱêÊÇ·ñÔ½½ç) + (*G).arcs[i][j].adj = w; + + // Èç¹ûÐèҪ¼È뻡µÄÆäËû¸½¼ÓÐÅÏ¢ + if(IncInfo) { + // ×îºó¼È븽¼ÓÐÅÏ¢ + Input(*G, &((*G).arcs[i][j].info)); + } + } + + // ´ÓÎļþÖжÁÈ¡Êý¾Ýʱ£¬×îºóÆäʵӦµ±ÅжÏÒ»ÏÂÊÇ·ñ¶Áµ½ÁË×ã¹»µÄÐÅÏ¢ + return OK; +} + +/* + * ¹¹ÔìÎÞÏòͼ + */ +static Status CreateUDG(MGraph* G) { + int i, j, k; + ArcCell arcs = {0, NULL}; // ÎÞÏòͼÿÌõ±ßµÄ³õʼֵ + VertexType v1, v2; + + if(fp == NULL) { + printf("ÇëÊäÈëÎÞÏòͼµÄ¶¥µãÊý£º"); + scanf("%d", &((*G).vexnum)); + printf("ÇëÊäÈëÎÞÏòͼµÄ±ßÊý£º"); + scanf("%d", &((*G).arcnum)); + printf("¸ÃÎÞÏòͼµÄ±ßÉÏÊÇ·ñ°üº¬ÆäËû¸½¼ÓÐÅÏ¢(0-²»°üº¬©¦1-°üº¬)£º"); + scanf("%d", &IncInfo); + + // ¼Èë¶¥µã¼¯ + printf("Çë¼Èë %d ¸ö¶¥µã£¬²»Í¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º", (*G).vexnum); + for(i = 0; i < (*G).vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(stdin); + scanf("%c", &((*G).vexs[i])); + } + } else { + ReadData(fp, "%d", &((*G).vexnum)); // ¼Èë¶¥µãÊý + ReadData(fp, "%d", &((*G).arcnum)); // ¼Èë±ßÊý + ReadData(fp, "%d", &IncInfo); // ÅжϱßÉÏÊÇ·ñ°üº¬¸½¼ÓÐÅÏ¢ + + // ¼Èë¶¥µã¼¯ + for(i = 0; i < (*G).vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(fp); + ReadData(fp, "%c", &((*G).vexs[i])); + } + } + + // ³õʼ»¯ÎÞÏòͼµÄÁÚ½Ó¾ØÕó + for(i = 0; i < (*G).vexnum; i++) { + for(j = 0; j < (*G).vexnum; j++) { + (*G).arcs[i][j] = arcs; + } + } + + // ½öÔÚ¿ØÖÆÌ¨Â¼ÈëÐÅϢʱÊä³ö´ËÌáʾ + if(fp == NULL && (*G).arcnum != 0) { + printf("ÇëΪÎÞÏòͼÒÀ´Î¼Èë %d Ìõ±ßµÄÐÅÏ¢£¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º\n", (*G).arcnum); + } + + // ¼Èë±ßµÄÐÅÏ¢ + for(k = 0; k < (*G).arcnum; k++) { + if(fp == NULL) { + printf("µÚ %2d Ìõ±ß£º", k + 1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v2); + } else { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + skipBlank(fp); + ReadData(fp, "%c%c", &v1, &v2); + } + + i = LocateVex(*G, v1); // »ñÈ¡¶¥µãv1ÔÚ¶¥µã¼¯ÖеÄλÖà + j = LocateVex(*G, v2); // »ñÈ¡¶¥µãv2ÔÚ¶¥µã¼¯ÖеÄλÖà + + // ½«Ö¸¶¨µÄ¶¥µã¹ØÏµÉèÖÃΪ1£¬Ö¸Ê¾ÕâÁ½¸ö¶¥µãÊÇÖ±½ÓÁ¬½ÓµÄ(×¢£ºÕâÀïûÓÐÑé֤ϱêÊÇ·ñÔ½½ç) + (*G).arcs[i][j].adj = 1; + + // Èç¹ûÐèҪ¼Èë±ßµÄÆäËû¸½¼ÓÐÅÏ¢ + if(IncInfo) { + // ×îºó¼È븽¼ÓÐÅÏ¢ + Input(*G, &((*G).arcs[i][j].info)); + } + + // Ìî³ä¶Ô³Æµã + (*G).arcs[j][i] = (*G).arcs[i][j]; + } + + // ´ÓÎļþÖжÁÈ¡Êý¾Ýʱ£¬×îºóÆäʵӦµ±ÅжÏÒ»ÏÂÊÇ·ñ¶Áµ½ÁË×ã¹»µÄÐÅÏ¢ + return OK; +} + +/* + * ¨€¨€¨€¨€¨€¨€¨€¨€ Ëã·¨7.2 ¨€¨€¨€¨€¨€¨€¨€¨€ + * + * ¹¹ÔìÎÞÏòÍø + */ +static Status CreateUDN(MGraph* G) { + int i, j, k; + ArcCell arcs = {INFINITE, NULL}; // ÎÞÏòÍøÃ¿Ìõ±ßµÄ³õʼֵ + VertexType v1, v2; + VRType w; + + if(fp == NULL) { + printf("ÇëÊäÈëÎÞÏòÍøµÄ¶¥µãÊý£º"); + scanf("%d", &((*G).vexnum)); + printf("ÇëÊäÈëÎÞÏòÍøµÄ±ßÊý£º"); + scanf("%d", &((*G).arcnum)); + printf("¸ÃÎÞÏòÍøµÄ±ßÉÏÊÇ·ñ°üº¬ÆäËû¸½¼ÓÐÅÏ¢(0-²»°üº¬©¦1-°üº¬)£º"); + scanf("%d", &IncInfo); + + // ¼Èë¶¥µã¼¯ + printf("Çë¼Èë %d ¸ö¶¥µã£¬²»Í¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º", (*G).vexnum); + for(i = 0; i < (*G).vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(stdin); + scanf("%c", &((*G).vexs[i])); + } + } else { + ReadData(fp, "%d", &((*G).vexnum)); // ¼Èë¶¥µãÊý + ReadData(fp, "%d", &((*G).arcnum)); // ¼Èë±ßÊý + ReadData(fp, "%d", &IncInfo); // ÅжϱßÉÏÊÇ·ñ°üº¬¸½¼ÓÐÅÏ¢ + + // ¼Èë¶¥µã¼¯ + for(i = 0; i < (*G).vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(fp); + ReadData(fp, "%c", &((*G).vexs[i])); + } + } + + // ³õʼ»¯ÎÞÏòÍøµÄÁÚ½Ó¾ØÕó + for(i = 0; i < (*G).vexnum; i++) { + for(j = 0; j < (*G).vexnum; j++) { + (*G).arcs[i][j] = arcs; + } + } + + // ½öÔÚ¿ØÖÆÌ¨Â¼ÈëÐÅϢʱÊä³ö´ËÌáʾ + if(fp == NULL && (*G).arcnum != 0) { + printf("ÇëΪÎÞÏòÍøÒÀ´Î¼Èë %d Ìõ±ß(´øÈ¨Öµ)µÄÐÅÏ¢£¬¶¥µã¼°È¨ÖµÖ®¼äÓÿոñ¸ô¿ª£º\n", (*G).arcnum); + } + + // ¼Èë±ßµÄÐÅÏ¢ + for(k = 0; k < (*G).arcnum; k++) { + if(fp == NULL) { + printf("µÚ %2d Ìõ±ß¼°ÆäȨֵ£º", k + 1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v2); + scanf("%d", &w); + } else { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + skipBlank(fp); + ReadData(fp, "%c%c%d", &v1, &v2, &w); + } + + i = LocateVex(*G, v1); // »ñÈ¡¶¥µãv1ÔÚ¶¥µã¼¯ÖеÄλÖà + j = LocateVex(*G, v2); // »ñÈ¡¶¥µãv2ÔÚ¶¥µã¼¯ÖеÄλÖà + + // ÔÚÖ¸¶¨µÄ¶¥µã¹ØÏµÉϼǼȨֵ(×¢£ºÕâÀïûÓÐÑé֤ϱêÊÇ·ñÔ½½ç) + (*G).arcs[i][j].adj = w; + + // Èç¹ûÐèҪ¼Èë±ßµÄÆäËû¸½¼ÓÐÅÏ¢ + if(IncInfo) { + // ×îºó¼È븽¼ÓÐÅÏ¢ + Input(*G, &((*G).arcs[i][j].info)); + } + + // Ìî³ä¶Ô³Æµã + (*G).arcs[j][i] = (*G).arcs[i][j]; + } + + // ´ÓÎļþÖжÁÈ¡Êý¾Ýʱ£¬×îºóÆäʵӦµ±ÅжÏÒ»ÏÂÊÇ·ñ¶Áµ½ÁË×ã¹»µÄÐÅÏ¢ + return OK; +} + +/* + * ¼Èë±ß/»¡µÄÏà¹Ø¸½¼ÓÐÅÏ¢ + */ +static void Input(MGraph G, InfoType** info) { + //¼Èë±ß/»¡µÄÐÅÏ¢£¬±¾²âÊÔÉæ¼°µ½µÄ±ß/»¡Ä¬ÈÏÎÞÆäËû¸½¼ÓÐÅÏ¢ +} + +/* + * ²éÕÒ + * + * ·µ»Ø¶¥µãuÔÚͼ/ÍøÖеÄλÖà + */ +int LocateVex(MGraph G, VertexType u) { + int i; + + for(i = 0; i < G.vexnum; i++) { + if(G.vexs[i] == u) { + return i; + } + } + + return -1; +} + +/* + * ²åÈë¶¥µã + * + * ½«Ö¸¶¨µÄ¶¥µãv×·¼Óµ½¶¥µã¼¯ÖУ¬Î´½¨Á¢¸Ã¶¥µãÓëÆäËû¶¥µãµÄ¹ØÏµ + */ +Status InsertVex(MGraph* G, VertexType v) { + int i, k; + VRType adj; + + // ¶¥µãÊý¹ý¶à + if((*G).vexnum == MAX_VERTEX_NUM) { + return ERROR; + } + + // Ê×ÏÈÐèÒªÅжϸö¥µãÊÇ·ñ´æÔÚ + k = LocateVex(*G, v); + if(k >= 0) { + return ERROR; // Ö¸¶¨µÄ¶¥µã´æÔÚʱ£¬ÎÞÐèÖØ¸´Ìí¼Ó + } + + // È·¶¨Ò»¸ö·ÇÁ¬Í¨±ê¼Ç + if((*G).kind == DG || (*G).kind == UDG) { + adj = 0; // ͼ + } else if((*G).kind == DN || (*G).kind == UDN) { + adj = INFINITE; // Íø + } else { + return ERROR; + } + + (*G).vexs[(*G).vexnum] = v; + (*G).vexnum++; + + for(i = 0; i < (*G).vexnum; i++) { + (*G).arcs[i][(*G).vexnum - 1].adj = adj; + (*G).arcs[(*G).vexnum - 1][i].adj = adj; + } + + return OK; +} + +/* + * ɾ³ý¶¥µã + * + * ´Ó¶¥µã¼¯ÖÐɾ³ýÖ¸¶¨µÄ¶¥µãv£¬×¢ÒâÐèÒª¸üÐÂÏà¹ØµÄ¶¥µã¹ØÏµ + */ +Status DeleteVex(MGraph* G, VertexType v) { + int i, j, k; + VRType adj; + + k = LocateVex(*G, v); + if(k == -1) { + return ERROR; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + // È·¶¨Ò»¸ö·ÇÁ¬Í¨±ê¼Ç + if((*G).kind == DG || (*G).kind == UDG) { + adj = 0; // ͼ + } else if((*G).kind == DN || (*G).kind == UDN) { + adj = INFINITE; // Íø + } else { + return ERROR; + } + + // ¸üбß/»¡µÄÊýÁ¿ + for(i = 0; i < (*G).vexnum; i++) { + // Èç¹û´æÔÚ´Ó¶¥µãv³ö·¢µÄ±ß£¬Ôò±ßµÄÊýÁ¿¼õÒ» + if((*G).arcs[k][i].adj != adj) { + (*G).arcnum--; + } + + // Èç¹ûÕâÊÇÓÐÏòµÄͼ/Íø£¬ÒÀÈ»ÐèÒª¸üбß/»¡µÄÊýÁ¿ + if((*G).kind == DG || (*G).kind == DN) { + // Èç¹û´æÔÚµ½´ï¶¥µãvµÄ±ß£¬Ôò±ßµÄÊýÁ¿¼õÒ» + if((*G).arcs[i][k].adj != adj) { + (*G).arcnum--; + } + } + } + + // ½«ÁÚ½Ó¾ØÕóÖеĶ¥µã¹ØÏµ×óÒÆ + for(j = k + 1; j < (*G).vexnum; j++) { + for(i = 0; i < (*G).vexnum; i++) { + (*G).arcs[i][j - 1] = (*G).arcs[i][j]; // ÓұߵÄÁÐŲµ½×ó±ßµÄÁÐ + } + } + + // ½«ÁÚ½Ó¾ØÕóÖеĶ¥µã¹ØÏµÉÏÒÆ + for(i = k + 1; i < (*G).vexnum; i++) { + // ×¢£¬ÓÉÓÚÉÏÃæ½øÐÐ×óÒÆµÄ¹ØÏµ£¬ËùÒÔÕâÀïµÄjÊÇСÓÚ(*G).vexnum - 1 + for(j = 0; j < (*G).vexnum - 1; j++) { + (*G).arcs[i - 1][j] = (*G).arcs[i][j]; // ÏÂÒ»ÐÐŲµ½ÉÏÒ»ÐÐ + } + } + + // ½«¸Ã¶¥µã´Ó¶¥µã¼¯ÖÐÒÆ³ý + for(i = k + 1; i < (*G).vexnum; i++) { + (*G).vexs[i - 1] = (*G).vexs[i]; + } + + // ¶¥µãÊý¼õÒ» + (*G).vexnum--; + + return OK; +} + +/* + * ²åÈë±ß/»¡ + * + * Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬Ôò²åÈëÒ»Ìõ»¡ÐèÒªÔö¼ÓÁ½¸ö¶¥µã¹ØÏµ£¬µ«»¡µÄÊýÁ¿Ö»ÔöÒ»¡£ + * + * ¶ÔÓÚͼÀ´Ëµ£¬¿ÉÒÔÔڿɱä²ÎÊýÖÐÁгö±ß/»¡µÄ¸½¼ÓÐÅÏ¢£» + * ¶ÔÓÚÍøÀ´Ëµ£¬¿ÉÒÔÔڿɱä²ÎÊýÖÐÒÀ´ÎÁгö±ß/»¡µÄȨֵÒÔ¼°¸½¼ÓÐÅÏ¢¡£ + */ +Status InsertArc(MGraph* G, VertexType v, VertexType w, ...) { + int kv, kw; + VRType adj; // ¶¥µã¹ØÏµ + Boolean overlay = FALSE; // ÊÇ·ñΪ¸²¸ÇÌí¼Ó + InfoType* info = NULL; // ±ß/»¡µÄ¸½¼ÓÐÅÏ¢ + va_list ap; + + kv = LocateVex(*G, v); + if(kv == -1) { + return ERROR; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + kw = LocateVex(*G, w); + if(kw == -1) { + return ERROR; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + // ¾Ü¾ø»· + if(kv == kw) { + return ERROR; + } + + /* È·¶¨Ò»¸ö¶¥µã¹ØÏµ */ + + // ¶ÔÓÚͼÀ´Ëµ£¬Á¬Í¨¹ØÏµÓÃ1±íʾ + if((*G).kind == DG || (*G).kind == UDG) { + adj = 1; + + // Èç¹û±ß/»¡ÉÏ´æÔÚ¸½¼ÓÐÅÏ¢ + if(IncInfo) { + va_start(ap, w); // ÔÚwºó²éѯÊ׸ö¿É±ä²ÎÊý + info = va_arg(ap, InfoType*); // »ñÈ¡¸½¼ÓÐÅÏ¢ + va_end(ap); + } + + overlay = (*G).arcs[kv][kw].adj != 0; + + // ¶ÔÓÚÍøÀ´Ëµ£¬´Ë´¦ÐèÒª´Ó¿É±ä²ÎÊýÖлñȡȨֵÐÅÏ¢ + } else if((*G).kind == DN || (*G).kind == UDN) { + va_start(ap, w); // ÔÚwºó²éѯÊ׸ö¿É±ä²ÎÊý + + adj = va_arg(ap, VRType); // »ñȡȨֵÐÅÏ¢ + + // Èç¹û±ß/»¡ÉÏ´æÔÚ¸½¼ÓÐÅÏ¢ + if(IncInfo) { + info = va_arg(ap, InfoType*); // »ñÈ¡¸½¼ÓÐÅÏ¢ + } + + va_end(ap); + + overlay = (*G).arcs[kv][kw].adj != INFINITE; + } else { + return ERROR; + } + + (*G).arcs[kv][kw].adj = adj; // ¼Ç¼¶¥µã¹ØÏµ + + // Èç¹û±ß/»¡ÉÏ´æÔÚ¸½¼ÓÐÅÏ¢£¬Ôò¼Ç¼¸½¼Ó¹ØÏµ + if(IncInfo) { + (*G).arcs[kv][kw].info = info; + } + + // Èç¹ûÊÇÎÞÏòͼ/Íø£¬ÐèÒª¿¼ÂǶԳÆÐÔ + if((*G).kind == UDG || (*G).kind == UDN) { + (*G).arcs[kw][kv] = (*G).arcs[kv][kw]; + } + + // ÔڷǸ²¸ÇµÄÇéÐÎÏ£¬²Å¿¼ÂǸüбß/»¡µÄÊýÁ¿ + if(!overlay) { + (*G).arcnum++; // ²»ÂÛÓÐÏòÎÞÏò£¬±ß/»¡ÊýÖ»ÔöÒ» + } + + return OK; +} + +/* + * ɾ³ý±ß/»¡ + * + * ´Ëɾ³ýÖ»ÊǸüбß/»¡µÄÁ¬Í¨¹ØÏµ + */ +Status DeleteArc(MGraph* G, VertexType v, VertexType w) { + int kv, kw; + VRType adj; + Boolean found = FALSE; // ÊÇ·ñ´æÔÚ´ýɾ³ýµÄ±ß/»¡ + + kv = LocateVex(*G, v); + if(kv == -1) { + return ERROR; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + kw = LocateVex(*G, w); + if(kw == -1) { + return ERROR; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + // È·¶¨Ò»¸ö·ÇÁ¬Í¨±ê¼Ç + if((*G).kind == DG || (*G).kind == UDG) { + adj = 0; // ͼ + + found = (*G).arcs[kv][kw].adj != 0; + } else if((*G).kind == DN || (*G).kind == UDN) { + adj = INFINITE; // Íø + + found = (*G).arcs[kv][kw].adj != INFINITE; + } else { + return ERROR; + } + + // ±ê¼ÇÕâÁ½¸ö¶¥µãÒѶϿªÁ¬½Ó + (*G).arcs[kv][kw].adj = adj; + + // Èç¹ûÊÇÎÞÏòͼ/Íø£¬ÐèÒª¿¼ÂǶԳÆÐÔ + if((*G).kind == UDG || (*G).kind == UDN) { + (*G).arcs[kw][kv] = (*G).arcs[kv][kw]; + } + + // ÔÚÕÒµ½ÁËÖ¸¶¨µÄ»¡Ê±£¬²Å¿¼ÂǸüбß/»¡µÄÊýÁ¿ + if(found) { + (*G).arcnum--; // ²»ÂÛÓÐÏòÎÞÏò£¬±ß/»¡ÊýÖ»¼õÒ» + } + + return OK; +} + +/* + * ÒÔͼÐλ¯ÐÎʽÊä³öµ±Ç°½á¹¹ + * + * ×¢£ºÔÚͼ/ÍøÖУ¬Ê¹ÓÃ"-"À´±íʾÁ½¶¥µã²»Ö±½ÓÁ¬Í¨ + */ +void PrintGraph(MGraph G) { + int i, j; + + if(G.vexnum == 0) { + printf("¿Õͼ£¬ÎÞÐè´òÓ¡£¡\n"); + return; + } + + printf("µ±Ç°Í¼/Íø°üº¬ %2d ¸ö¶¥µã£¬ %2d Ìõ±ß/»¡...\n", G.vexnum, G.arcnum); + + printf(" "); + for(i = 0; i < G.vexnum; i++) { + printf(" %c", G.vexs[i]); + } + printf("\n"); + + for(i = 0; i < G.vexnum; i++) { + printf("%c ", G.vexs[i]); + + for(j = 0; j < G.vexnum; j++) { + if(((G.kind == DG || G.kind == UDG) && G.arcs[i][j].adj == 0) || ((G.kind == DN || G.kind == UDN) && G.arcs[i][j].adj == INFINITE)) { + printf(" -"); + } else { + printf("%3d", G.arcs[i][j].adj); + } + } + + printf("\n"); + } +} diff --git a/VisualC++/ExerciseBook/07.15/MGraph.h b/VisualC++/ExerciseBook/07.15/MGraph.h new file mode 100644 index 0000000..01a3543 --- /dev/null +++ b/VisualC++/ExerciseBook/07.15/MGraph.h @@ -0,0 +1,161 @@ +/*================================= + * ͼµÄÊý×é(ÁÚ½Ó¾ØÕó)´æ´¢±íʾ + * + * °üº¬Ëã·¨: 7.1¡¢7.2¡¢7.4¡¢7.5¡¢7.6 + ==================================*/ + +#ifndef MGRAPH_H +#define MGRAPH_H + +#include +#include // ÌṩºêINT_MAX +#include // Ìṩmemset¡¢strcmp Ô­ÐÍ +#include // Ìṩºêva_list¡¢va_start¡¢va_arg¡¢va_end +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// + +/* + * ×¢£º + * + * ͨ³£À´½²£¬ÎÞȨͼ±»¼ò³ÆÎª¡¾Í¼¡¿£¬ÓÐȨͼ±»¼ò³ÆÎª¡¾Íø¡¿¡£ + * ÎÞÏòͼ/ÍøÖеĶ¥µã¹ØÏµ±»³ÆÎª¡¾±ß¡¿£¬ÓÐÏòͼ/ÍøÖеĶ¥µã¹ØÏµ±»³ÆÎª¡¾»¡¡¿£¬²¢Çø·Ö»¡Í·Ó뻡β¡£ + * ʵ¼Ê±íÊöÖУ¬Î´±Ø»áÑϸñ×ñÊØÒÔÉÏÃüÃû¡£ + */ + +/* ºê¶¨Òå */ +#define INFINITE INT_MAX // ×î´óÖµ£¬ÓÃÀ´±íÊ¾ÍøÖеÄÁ½¸ö¶¥µã²»Ö±½ÓÁ¬½Ó +#define MAX_VERTEX_NUM 26 // ×î´ó¶¥µã¸öÊý + + +// ͼµÄÀàÐÍ +typedef enum { + DG, // 0-ÓÐÏòͼ + DN, // 1-ÓÐÏòÍø(´øÈ¨Öµ) + UDG, // 2-ÎÞÏòͼ + UDN // 3-ÎÞÏòÍø(´øÈ¨Öµ) +} GraphKind; + +// ¶¥µãÀàÐÍ +typedef char VertexType; + +/* + * ¶¥µã¹ØÏµÀàÐÍ + * + * ÔÚÎÞȨͼÖУ¬¸Ãֵͨ³£Îª0»ò1£¬±íʾÁ½¶¥µãÊÇ·ñÖ±½ÓÁ¬Í¨£» + * ÔÚÓÐȨͼÖУ¬¸Ãֵͨ³£ÎªÈ¨Öµ¡£ + */ +typedef int VRType; + +// ±ßµÄÏà¹Ø¸½¼ÓÐÅÏ¢ +typedef struct { + // Èç¹ûÓеϰ£¬ºóÐø»áÌí¼ÓÏàÓ¦µÄÊôÐÔ + void* v; // Ìí¼ÓÒ»¸öÎÞÒâÒåµÄ±äÁ¿À´Õ¼Î»£¬Èç¹û½á¹¹ÌåΪ¿ÕµÄ»°£¬ÔÚVC++Öлᱨ´í +} InfoType; + +// ±ßµÄÀàÐÍ£¬Ã¿Ìõ±ßÉÏ¿ÉÄÜÓи½¼ÓÐÅÏ¢info +typedef struct ArcCell { + VRType adj; // ¶¥µã¹ØÏµ£¬ÔÚÓÐȨͼ¸úÎÞȨͼÖеĺ¬Ò岻ͬ + InfoType* info; // ±ßµÄ¸½¼ÓÐÅÏ¢£¬Í¨³£ºöÂÔ +} ArcCell; + +/* ͼ/ÍøµÄÊý×é(ÁÚ½Ó¾ØÕó)´æ´¢±íʾÀàÐͶ¨Òå */ +typedef struct { + VertexType vexs[MAX_VERTEX_NUM]; // ¶¥µãÏòÁ¿ + ArcCell arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; // ÁÚ½Ó¾ØÕó + int vexnum, arcnum; // ͼ/ÍøµÄ¶¥µãÊýºÍ»¡Êý + GraphKind kind; // ͼµÄÀàÐͱêÖ¾ +} MGraph; + + +// ±ß/»¡ÉÏÊÇ·ñ´æÔÚ¸½¼ÓÐÅÏ¢ +extern Boolean IncInfo; + + +/* + * ¨€¨€¨€¨€¨€¨€¨€¨€ Ëã·¨7.1 ¨€¨€¨€¨€¨€¨€¨€¨€ + * + * ´´½¨ + * + *¡¾±¸×¢¡¿ + * + * ½Ì²ÄÖÐĬÈÏ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý¡£ + * ÕâÀïΪÁË·½±ã²âÊÔ£¬±ÜÃâÿ´ÎÔËÐж¼ÊÖ¶¯ÊäÈëÊý¾Ý£¬ + * Òò¶øÔÊÐíÑ¡Ôñ´ÓÔ¤ÉèµÄÎļþpathÖжÁÈ¡²âÊÔÊý¾Ý¡£ + * + * Èç¹ûÐèÒª´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý£¬ÔòpathΪNULL£¬»òpath[kind]Ϊ""¡£ + * Èç¹ûÐèÒª´ÓÎļþÖжÁÈ¡Êý¾Ý£¬ÔòÐèÒªÔÚpathÖÐÌîдÎļþÃûÐÅÏ¢¡£ + */ +Status CreateGraph(MGraph* G, char* path[]); + +/* + * ¹¹ÔìÓÐÏòͼ + */ +static Status CreateDG(MGraph* G); + +/* + * ¹¹ÔìÓÐÏòÍø + */ +static Status CreateDN(MGraph* G); + +/* + * ¹¹ÔìÎÞÏòͼ + */ +static Status CreateUDG(MGraph* G); + +/* + * ¨€¨€¨€¨€¨€¨€¨€¨€ Ëã·¨7.2 ¨€¨€¨€¨€¨€¨€¨€¨€ + * + * ¹¹ÔìÎÞÏòÍø + */ +static Status CreateUDN(MGraph* G); + +/* + * ¼Èë±ßµÄÏà¹Ø¸½¼ÓÐÅÏ¢ + */ +static void Input(MGraph G, InfoType** info); + +/* + * ²éÕÒ + * + * ·µ»Ø¶¥µãuÔÚͼ/ÍøÖеÄλÖà + */ +int LocateVex(MGraph G, VertexType u); + +/* + * ²åÈë¶¥µã + * + * ½«Ö¸¶¨µÄ¶¥µãv×·¼Óµ½¶¥µã¼¯ÖУ¬Î´½¨Á¢¸Ã¶¥µãÓëÆäËû¶¥µãµÄ¹ØÏµ + */ +Status InsertVex(MGraph* G, VertexType v); + +/* + * ɾ³ý¶¥µã + * + * ´Ó¶¥µã¼¯ÖÐɾ³ýÖ¸¶¨µÄ¶¥µãv£¬×¢ÒâÐèÒª¸üÐÂÏà¹ØµÄ¶¥µã¹ØÏµ + */ +Status DeleteVex(MGraph* G, VertexType v); + +/* + * ²åÈë±ß/»¡ + * + * Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬Ôò²åÈëÒ»Ìõ»¡ÐèÒªÔö¼ÓÁ½¸ö¶¥µã¹ØÏµ£¬µ«»¡µÄÊýÁ¿Ö»ÔöÒ»¡£ + * + * ¶ÔÓÚͼÀ´Ëµ£¬¿ÉÒÔÔڿɱä²ÎÊýÖÐÁгö±ß/»¡µÄ¸½¼ÓÐÅÏ¢£» + * ¶ÔÓÚÍøÀ´Ëµ£¬¿ÉÒÔÔڿɱä²ÎÊýÖÐÒÀ´ÎÁгö±ß/»¡µÄȨֵÒÔ¼°¸½¼ÓÐÅÏ¢¡£ + */ +Status InsertArc(MGraph* G, VertexType v, VertexType w, ...); + +/* + * ɾ³ý±ß/»¡ + * + * ´Ëɾ³ýÖ»ÊǸüбß/»¡µÄÁ¬Í¨¹ØÏµ + */ +Status DeleteArc(MGraph* G, VertexType v, VertexType w); + +/* + * ÒÔͼÐλ¯ÐÎʽÊä³öµ±Ç°½á¹¹ + * + * ×¢£ºÔÚͼ/ÍøÖУ¬Ê¹ÓÃ"-"À´±íʾÁ½¶¥µã²»Ö±½ÓÁ¬Í¨ + */ +void PrintGraph(MGraph G); + +#endif diff --git a/VisualC++/ExerciseBook/07.15/TestData_DG.txt b/VisualC++/ExerciseBook/07.15/TestData_DG.txt new file mode 100644 index 0000000..ae011ea --- /dev/null +++ b/VisualC++/ExerciseBook/07.15/TestData_DG.txt @@ -0,0 +1,6 @@ +ͼÀàÐÍ¡ú0£¨ÓÐÏòͼ£© +¶¥µãÊý¡ú6 +»¡Êý¡ú14 +»¡ÊÇ·ñ´øÓÐÆäËûÐÅÏ¢¡ú0 +¶¥µã¼¯¡ú¡¾A£¬X£¬B£¬C£¬D£¬E¡¿ +»¡µÄ¼¯ºÏ¡ú¡¾A£¬B¡¿¡¾A£¬C¡¿¡¾A£¬D¡¿¡¾B£¬C¡¿¡¾B£¬D¡¿¡¾B£¬E¡¿¡¾C£¬B¡¿¡¾C£¬E¡¿¡¾C£¬X¡¿¡¾E£¬A¡¿¡¾E£¬D¡¿¡¾E£¬X¡¿¡¾X£¬A¡¿¡¾X£¬D¡¿ \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.15/TestData_DN.txt b/VisualC++/ExerciseBook/07.15/TestData_DN.txt new file mode 100644 index 0000000..4baec42 --- /dev/null +++ b/VisualC++/ExerciseBook/07.15/TestData_DN.txt @@ -0,0 +1,6 @@ +ͼÀàÐÍ¡ú1£¨ÓÐÏòÍø£© +¶¥µãÊý¡ú6 +»¡Êý¡ú14 +»¡ÊÇ·ñ´øÓÐÆäËûÐÅÏ¢¡ú0 +¶¥µã¼¯¡ú¡¾A£¬X£¬B£¬C£¬D£¬E¡¿ +»¡µÄ¼¯ºÏ¡ú¡¾A£¬B£¬3¡¿¡¾A£¬C£¬8¡¿¡¾A£¬D£¬11¡¿¡¾B£¬C£¬7¡¿¡¾B£¬D£¬4¡¿¡¾B£¬E£¬1¡¿¡¾C£¬B£¬5¡¿¡¾C£¬E£¬17¡¿¡¾C£¬X£¬3¡¿¡¾E£¬A£¬6¡¿¡¾E£¬D£¬4¡¿¡¾E£¬X£¬2¡¿¡¾X£¬A£¬8¡¿¡¾X£¬D£¬10¡¿ \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.15/TestData_UDG.txt b/VisualC++/ExerciseBook/07.15/TestData_UDG.txt new file mode 100644 index 0000000..6c08d74 --- /dev/null +++ b/VisualC++/ExerciseBook/07.15/TestData_UDG.txt @@ -0,0 +1,6 @@ +ͼÀàÐÍ¡ú2£¨ÎÞÏòͼ£© +¶¥µãÊý¡ú6 +±ßÊý¡ú13 +±ßÊÇ·ñ´øÓÐÆäËûÐÅÏ¢¡ú0 +¶¥µã¼¯¡ú¡¾A£¬X£¬B£¬C£¬D£¬E¡¿ +±ßµÄ¼¯ºÏ¡ú¡¾A£¬B¡¿¡¾A£¬C¡¿¡¾A£¬D¡¿¡¾B£¬C¡¿¡¾B£¬D¡¿¡¾B£¬E¡¿¡¾C£¬E¡¿¡¾C£¬X¡¿¡¾E£¬A¡¿¡¾E£¬D¡¿¡¾E£¬X¡¿¡¾X£¬A¡¿¡¾X£¬D¡¿ \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.15/TestData_UDN.txt b/VisualC++/ExerciseBook/07.15/TestData_UDN.txt new file mode 100644 index 0000000..ed04fb4 --- /dev/null +++ b/VisualC++/ExerciseBook/07.15/TestData_UDN.txt @@ -0,0 +1,6 @@ +ͼÀàÐÍ¡ú3£¨ÎÞÏòÍø£© +¶¥µãÊý¡ú6 +±ßÊý¡ú13 +±ßÊÇ·ñ´øÓÐÆäËûÐÅÏ¢¡ú0 +¶¥µã¼¯¡ú¡¾A£¬X£¬B£¬C£¬D£¬E¡¿ +±ßµÄ¼¯ºÏ¡ú¡¾A£¬B£¬3¡¿¡¾A£¬C£¬8¡¿¡¾A£¬D£¬11¡¿¡¾B£¬C£¬7¡¿¡¾B£¬D£¬4¡¿¡¾B£¬E£¬1¡¿¡¾C£¬E£¬17¡¿¡¾C£¬X£¬3¡¿¡¾E£¬A£¬6¡¿¡¾E£¬D£¬4¡¿¡¾E£¬X£¬2¡¿¡¾X£¬A£¬8¡¿¡¾X£¬D£¬10¡¿ \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.17/07.17.c b/VisualC++/ExerciseBook/07.17/07.17.c new file mode 100644 index 0000000..384edfe --- /dev/null +++ b/VisualC++/ExerciseBook/07.17/07.17.c @@ -0,0 +1,169 @@ +#include +#include // Ìṩºêva_list¡¢va_start¡¢va_arg¡¢va_end +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// +#include "OLGraph.h" //**¡ø07 ͼ**// + +/* + * ²åÈë¶¥µã + * + * ½«Ö¸¶¨µÄ¶¥µãv×·¼Óµ½¶¥µã¼¯ÖУ¬Î´½¨Á¢¸Ã¶¥µãÓëÆäËû¶¥µãµÄ¹ØÏµ + */ +Status InsertVex_7_17(OLGraph* G, VertexType v); + +/* + * ɾ³ý¶¥µã + * + * ´Ó¶¥µã¼¯ÖÐɾ³ýÖ¸¶¨µÄ¶¥µãv£¬×¢ÒâÐèÒª¸üÐÂÏà¹ØµÄ¶¥µã¹ØÏµ + */ +Status DeleteVex_7_17(OLGraph* G, VertexType v); + +/* + * ²åÈë±ß/»¡ + * + * Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬Ôò²åÈëÒ»Ìõ»¡ÐèÒªÔö¼ÓÁ½¸ö¶¥µã¹ØÏµ£¬µ«»¡µÄÊýÁ¿Ö»ÔöÒ»¡£ + * + * ¶ÔÓÚͼÀ´Ëµ£¬¿ÉÒÔÔڿɱä²ÎÊýÖÐÁгö±ß/»¡µÄ¸½¼ÓÐÅÏ¢£» + * ¶ÔÓÚÍøÀ´Ëµ£¬¿ÉÒÔÔڿɱä²ÎÊýÖÐÒÀ´ÎÁгö±ß/»¡µÄȨֵÒÔ¼°¸½¼ÓÐÅÏ¢¡£ + */ +Status InsertArc_7_17(OLGraph* G, VertexType v, VertexType w, ...); + +/* + * ɾ³ý±ß/»¡ + * + * ´Ëɾ³ýÖ»ÊǸüбß/»¡µÄÁ¬Í¨¹ØÏµ + */ +Status DeleteArc_7_17(OLGraph* G, VertexType v, VertexType w); + + +int main(int argc, char* argv[]) { + OLGraph G; + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ´´½¨²¢Êä³öͼ/Íø...\n"); + { + char* path[4]; + + path[0] = "TestData_DG.txt"; + path[1] = "TestData_DN.txt"; + path[2] = "TestData_UDG.txt"; + path[3] = "TestData_UDN.txt"; + + CreateGraph(&G, path); + PrintGraph(G); + printf("\n"); + } + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ɾ³ý¶¥µã...\n"); + { + VertexType v = 'X'; + + printf("ɾ³ý¶¥µã '%c' ºóµÄͼΪ£º\n", v); + DeleteVex_7_17(&G, v); + PrintGraph(G); + printf("\n"); + } + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ²åÈë¶¥µã...\n"); + { + VertexType v = 'Y'; + + printf("²åÈë¶¥µã '%c' ºóµÄͼΪ£º\n", v); + InsertVex_7_17(&G, v); + PrintGraph(G); + printf("\n"); + } + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ²åÈë±ß/»¡...\n"); + { + // ×¢£ºÊÇÖØ¸´µÄ±ß + VertexType v[10] = {'B', 'C', 'E', 'Y', 'Y', 'Y', 'D', 'D', 'E', 'E'}; + VertexType w[10] = {'Y', 'Y', 'Y', 'A', 'B', 'D', 'C', 'A', 'B', 'D'}; + InfoType info[10] = {{8}, {5}, {1}, {11}, {2}, {6}, {3}, {7}, {2}, {9}}; + int k; + + // ͼ + if(G.kind == DG || G.kind == UDG) { + for(k = 0; k < 10; k++) { + printf("²åÈëÎÞȨֵµÄ±ß£º<%c, %c>...\n", v[k], w[k]); + InsertArc_7_17(&G, v[k], w[k]); + } + + // Íø + } else if(G.kind == DN || G.kind == UDN) { + for(k = 0; k < 10; k++) { + printf("²åÈë´øÈ¨ÖµµÄ±ß£º<%c, %c, %d>...\n", v[k], w[k], info[k].weight); + InsertArc_7_17(&G, v[k], w[k], &info[k]); + } + } else { + return ERROR; + } + + PrintGraph(G); + printf("\n"); + } + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ɾ³ý±ß/»¡...\n"); + { + VertexType v[3] = {'D', 'E', 'F'}; + VertexType w[3] = {'A', 'B', 'B'}; + int k; + + for(k = 0; k < 3; k++) { + printf("ɾ³ý±ß£º<%c, %c>...\n", v[k], w[k]); + DeleteArc_7_17(&G, v[k], w[k]); + } + PrintGraph(G); + printf("\n"); + } + + return 0; +} + + +/* + * ²åÈë¶¥µã + * + * ½«Ö¸¶¨µÄ¶¥µãv×·¼Óµ½¶¥µã¼¯ÖУ¬Î´½¨Á¢¸Ã¶¥µãÓëÆäËû¶¥µãµÄ¹ØÏµ + */ +Status InsertVex_7_17(OLGraph* G, VertexType v) { + return InsertVex(G, v); +} + +/* + * ɾ³ý¶¥µã + * + * ´Ó¶¥µã¼¯ÖÐɾ³ýÖ¸¶¨µÄ¶¥µãv£¬×¢ÒâÐèÒª¸üÐÂÏà¹ØµÄ¶¥µã¹ØÏµ + */ +Status DeleteVex_7_17(OLGraph* G, VertexType v) { + return DeleteVex(G, v); +} + +/* + * ²åÈë±ß/»¡ + * + * Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬Ôò²åÈëÒ»Ìõ»¡ÐèÒªÔö¼ÓÁ½¸ö¶¥µã¹ØÏµ£¬µ«»¡µÄÊýÁ¿Ö»ÔöÒ»¡£ + * + * ¶ÔÓÚͼÀ´Ëµ£¬¿ÉÒÔÔڿɱä²ÎÊýÖÐÁгö±ß/»¡µÄ¸½¼ÓÐÅÏ¢£» + * ¶ÔÓÚÍøÀ´Ëµ£¬¿ÉÒÔÔڿɱä²ÎÊýÖÐÒÀ´ÎÁгö±ß/»¡µÄȨֵÒÔ¼°¸½¼ÓÐÅÏ¢¡£ + */ +Status InsertArc_7_17(OLGraph* G, VertexType v, VertexType w, ...) { + va_list ap; + InfoType* info = NULL; // ±ß/»¡µÄ¸½¼ÓÐÅÏ¢ + + // Èç¹û±ß/»¡ÉÏ´æÔÚ¸½¼ÓÐÅÏ¢ + if(IncInfo) { + va_start(ap, w); // ÔÚwºó²éѯÊ׸ö¿É±ä²ÎÊý + info = va_arg(ap, InfoType*); // »ñÈ¡¸½¼ÓÐÅÏ¢ + va_end(ap); + } + + return InsertArc(G, v, w, info); +} + +/* + * ɾ³ý±ß/»¡ + * + * ´Ëɾ³ýÖ»ÊǸüбß/»¡µÄÁ¬Í¨¹ØÏµ + */ +Status DeleteArc_7_17(OLGraph* G, VertexType v, VertexType w) { + return DeleteArc(G, v, w); +} diff --git a/VisualC++/ExerciseBook/07.17/07.17.vcxproj b/VisualC++/ExerciseBook/07.17/07.17.vcxproj new file mode 100644 index 0000000..19c5be5 --- /dev/null +++ b/VisualC++/ExerciseBook/07.17/07.17.vcxproj @@ -0,0 +1,82 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {D1637FE7-8B48-4B0B-81A2-66984FE46CA4} + My0717 + + + + Application + true + MultiByte + + + Application + false + true + MultiByte + + + + + + + + + + + + + $(SolutionDir)\..\Status;$(IncludePath) + + + + Level3 + Disabled + + + true + $(SolutionDir)\..\Status\Status.lib;%(AdditionalDependencies) + Console + + + + + Level3 + MaxSpeed + true + true + + + true + true + true + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.17/07.17.vcxproj.filters b/VisualC++/ExerciseBook/07.17/07.17.vcxproj.filters new file mode 100644 index 0000000..eecace0 --- /dev/null +++ b/VisualC++/ExerciseBook/07.17/07.17.vcxproj.filters @@ -0,0 +1,44 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + æºæ–‡ä»¶ + + + æºæ–‡ä»¶ + + + + + 头文件 + + + + + èµ„æºæ–‡ä»¶ + + + èµ„æºæ–‡ä»¶ + + + èµ„æºæ–‡ä»¶ + + + èµ„æºæ–‡ä»¶ + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.17/07.17.vcxproj.user b/VisualC++/ExerciseBook/07.17/07.17.vcxproj.user new file mode 100644 index 0000000..ace9a86 --- /dev/null +++ b/VisualC++/ExerciseBook/07.17/07.17.vcxproj.user @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.17/OLGraph.c b/VisualC++/ExerciseBook/07.17/OLGraph.c new file mode 100644 index 0000000..28d0b69 --- /dev/null +++ b/VisualC++/ExerciseBook/07.17/OLGraph.c @@ -0,0 +1,861 @@ +/*==================== + * ͼµÄÊ®×ÖÁ´±í´æ´¢±íʾ + * + * °üº¬Ëã·¨: 7.3 + ====================*/ + +#include "OLGraph.h" + +// ¼ÈëÊý¾ÝµÄÔ´Îļþ£»fpΪnullʱ£¬ËµÃ÷ÐèÒª´Ó¿ØÖÆÌ¨Â¼Èë +static FILE* fp = NULL; + +/* + * IncInfoָʾ¸ÃͼµÄ±ßÉÏÊÇ·ñ´æÔÚ¸½¼ÓÐÅÏ¢¡£ + * Èç¹ûÆäÖµ²»Îª0£¬Ôò±íʾÎÞ¸½¼ÓÐÅÏ¢£¬·ñÔò£¬±íʾ´æÔÚ¸½¼ÓÐÅÏ¢¡£ + */ +Boolean IncInfo = FALSE; + +// ·ÃÎʱêÖ¾Êý×飬¼Ç¼·ÃÎʹýµÄ¶¥µã +static Boolean visited[MAX_VERTEX_NUM]; + +// º¯Êý±äÁ¿ +static Status (* VisitFunc)(VertexType e); + + +/* + * ´´½¨ + * + *¡¾±¸×¢¡¿ + * + * ½Ì²ÄÖÐĬÈÏ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý¡£ + * ÕâÀïΪÁË·½±ã²âÊÔ£¬±ÜÃâÿ´ÎÔËÐж¼ÊÖ¶¯ÊäÈëÊý¾Ý£¬ + * Òò¶øÔÊÐíÑ¡Ôñ´ÓÔ¤ÉèµÄÎļþpathÖжÁÈ¡²âÊÔÊý¾Ý¡£ + * + * Èç¹ûÐèÒª´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý£¬ÔòpathΪNULL£¬»òpath[kind]Ϊ""¡£ + * Èç¹ûÐèÒª´ÓÎļþÖжÁÈ¡Êý¾Ý£¬ÔòÐèÒªÔÚpathÖÐÌîдÎļþÃûÐÅÏ¢¡£ + */ +Status CreateGraph(OLGraph* G, char* path[]) { + int readFromConsole; // ÊÇ·ñ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý + int kind; + Status flag; + + printf("ÇëÊäÈëͼµÄÀàÐÍ(0-ÓÐÏòͼ ©¦ 1-ÓÐÏòÍø ©¦ 2-ÎÞÏòͼ ©¦ 3-ÎÞÏòÍø)£º"); + scanf("%d", &kind); + + // ÀàÐͲ»ºÏ¹æ + if(kind < 0 || kind > 3) { + return ERROR; + } + + // Èç¹ûûÓÐÎļþ·¾¶ÐÅÏ¢£¬Ôò´Ó¿ØÖÆÌ¨¶ÁÈ¡ÊäÈë + readFromConsole = (path == NULL) || strcmp(path[kind], "") == 0; + + // ÐèÒª´ÓÎļþ¶ÁÈ¡ + if(readFromConsole) { + (*G).kind = kind; // ¼Ç¼ͼ/ÍøµÄÀàÐÍ + } else { + // ´ò¿ªÎļþ£¬×¼±¸¶ÁÈ¡²âÊÔÊý¾Ý + fp = fopen(path[kind], "r"); + if(fp == NULL) { + return ERROR; + } + + // ¼ÈëͼµÄÀàÐÍ + ReadData(fp, "%d", &((*G).kind)); + } + + // Ëæ»ú´´½¨ÓÐÏòͼ/Íø»òÎÞÏòͼ/ÍøµÄÒ»ÖÖ + switch((*G).kind) { + case DG: + flag = CreateDG(G); + break; + case DN: + flag = CreateDN(G); + break; + case UDG: + flag = CreateUDG(G); + break; + case UDN: + flag = CreateUDN(G); + break; + default: + flag = ERROR; + break; + } + + if(fp != NULL) { + fclose(fp); + fp = NULL; + } + + return flag; +} + +/* + * ¨€¨€¨€¨€¨€¨€¨€¨€ Ëã·¨7.3 ¨€¨€¨€¨€¨€¨€¨€¨€ + * + * ¹¹ÔìÓÐÏòͼ + * + * ×¢£º + * ½Ì²ÄÖÐʹÓÃÁËÍ·²å·¨À´²åÈ뻡£¬ÕâÖÖ×ö·¨µÄΨһÓŵãÊDzåÈë·½±ã£¬ + * µ«ÊÇÔÚÉæ¼°µ½É¾³ý»ò²éÕÒʱ£¬Ð§Âʽϵͣ» + * ¶øÇÒ£¬"Í·²å·¨"ÒÀÀµÊäÈëµÄ˳Ðò£¬Èç¹ûÊäÈëµÄ±ß/»¡ÊÇÂÒÐòµÄ£¬ + * Ôò×îÖÕ¹¹Ôì³öµÄͼ/ÍøÖеıß/»¡Ò²ÊÇÎÞÐòµÄ¡£ + * + * ΪÁ˿˷þÒÔÉÏȱµã£¬ÕâÀï¸ÄÓÃ"ÉýÐò"²åÈë·¨£¬±£Ö¤²åÈëµÄ»¡ÊÇ"ÉýÐò"µÄ¡£ + * µ«Í¬Ê±£¬ÕâÑù×ö»áʹ"²åÈë"Ëã·¨±äµÃ½ÏΪ¸´ÔÓ¡£ + */ +static Status CreateDG(OLGraph* G) { + int i, k; + int vexnum, arcnum; + VertexType v1, v2; + InfoType* info = NULL; + + (*G).vexnum = (*G).arcnum = 0; + + if(fp == NULL) { + printf("ÇëÊäÈëÓÐÏòͼµÄ¶¥µãÊý£º"); + scanf("%d", &vexnum); + printf("ÇëÊäÈëÓÐÏòͼµÄ»¡Êý£º"); + scanf("%d", &arcnum); + printf("¸ÃÓÐÏòͼµÄ»¡ÉÏÊÇ·ñ°üº¬ÆäËû¸½¼ÓÐÅÏ¢(0-²»°üº¬©¦1-°üº¬)£º"); + scanf("%d", &IncInfo); + + // ¼Èë¶¥µã¼¯ + printf("Çë¼Èë %d ¸ö¶¥µã£¬²»Í¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º", vexnum); + for(i = 0; i < vexnum; i++) { + scanf("%c", &((*G).xlist[i].data)); + (*G).xlist[i].firstin = NULL; + (*G).xlist[i].firstout = NULL; + (*G).vexnum++; + } + } else { + ReadData(fp, "%d", &vexnum); // ¼Èë¶¥µãÊý + ReadData(fp, "%d", &arcnum); // ¼È뻡Êý + ReadData(fp, "%d", &IncInfo); // Åжϻ¡ÉÏÊÇ·ñ°üº¬¸½¼ÓÐÅÏ¢ + + // ¼Èë¶¥µã¼¯ + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(fp); + ReadData(fp, "%c", &((*G).xlist[i].data)); + (*G).xlist[i].firstin = NULL; + (*G).xlist[i].firstout = NULL; + (*G).vexnum++; + } + } + + // ½öÔÚ¿ØÖÆÌ¨Â¼ÈëÐÅϢʱÊä³ö´ËÌáʾ + if(fp == NULL && arcnum != 0) { + printf("ÇëΪÓÐÏòͼÒÀ´Î¼Èë %d Ìõ»¡µÄÐÅÏ¢£¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º\n", arcnum); + } + + // ¼È뻡µÄÐÅÏ¢ + for(k = 0; k < arcnum; k++) { + if(fp == NULL) { + printf("µÚ %2d Ìõ»¡£º", k + 1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v2); + } else { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + skipBlank(fp); + ReadData(fp, "%c%c", &v1, &v2); + } + + // Èç¹ûÐèҪ¼È뻡µÄÆäËû¸½¼ÓÐÅÏ¢ + if(IncInfo) { + // ×îºó¼È븽¼ÓÐÅÏ¢ + Input(*G, &info); + } + + // ²åÈ뻡 + InsertArc(G, v1, v2, info); + } + + // ´ÓÎļþÖжÁÈ¡Êý¾Ýʱ£¬×îºóÆäʵӦµ±ÅжÏÒ»ÏÂÊÇ·ñ¶Áµ½ÁË×ã¹»µÄÐÅÏ¢ + return OK; +} + +/* + * ¹¹ÔìÓÐÏòÍø + */ +static Status CreateDN(OLGraph* G) { + int i, k; + int vexnum, arcnum; + VertexType v1, v2; + InfoType* info = NULL; + + (*G).vexnum = (*G).arcnum = 0; + + if(fp == NULL) { + printf("ÇëÊäÈëÓÐÏòͼµÄ¶¥µãÊý£º"); + scanf("%d", &vexnum); + printf("ÇëÊäÈëÓÐÏòÍøµÄ»¡Êý£º"); + scanf("%d", &arcnum); + printf("¸ÃÓÐÏòÍøµÄ»¡ÉϱØÐë°üº¬ÆäËû¸½¼ÓÐÅÏ¢£¬ÒòΪ´Ë´¦µÄȨֵÐèÒª´æ´¢µ½¸½¼ÓÐÅÏ¢ÖÐ...\n"); + IncInfo = 1; + + // ¼Èë¶¥µã¼¯ + printf("Çë¼Èë %d ¸ö¶¥µã£¬²»Í¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º", vexnum); + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(stdin); + scanf("%c", &((*G).xlist[i].data)); + (*G).xlist[i].firstin = NULL; + (*G).xlist[i].firstout = NULL; + (*G).vexnum++; + } + } else { + ReadData(fp, "%d", &vexnum); // ¼Èë¶¥µãÊý + ReadData(fp, "%d", &arcnum); // ¼È뻡Êý + ReadData(fp, "%d", &IncInfo);// Åжϻ¡ÉÏÊÇ·ñ°üº¬¸½¼ÓÐÅÏ¢(´Ë´¦Ó¦µ±°üº¬) + IncInfo = 1; // Ç¿ÖÆ½«È¨ÖµÂ¼Èëµ½¸½¼ÓÐÅÏ¢ÖÐ + + // ¼Èë¶¥µã¼¯ + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(fp); + ReadData(fp, "%c", &((*G).xlist[i].data)); + (*G).xlist[i].firstin = NULL; + (*G).xlist[i].firstout = NULL; + (*G).vexnum++; + } + } + + // ½öÔÚ¿ØÖÆÌ¨Â¼ÈëÐÅϢʱÊä³ö´ËÌáʾ + if(fp == NULL && arcnum != 0) { + printf("ÇëΪÓÐÏòÍøÒÀ´Î¼Èë %d Ìõ»¡(´øÈ¨Öµ)µÄÐÅÏ¢£¬¶¥µã¼°È¨ÖµÖ®¼äÓÿոñ¸ô¿ª£º\n", arcnum); + } + + // ¼È뻡µÄÐÅÏ¢ + for(k = 0; k < arcnum; k++) { + if(fp == NULL) { + printf("µÚ %2d Ìõ»¡¼°ÆäȨֵ£º", k + 1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v2); + } else { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + skipBlank(fp); + ReadData(fp, "%c%c", &v1, &v2); + } + + // Èç¹ûÐèҪ¼È뻡µÄÆäËû¸½¼ÓÐÅÏ¢ + if(IncInfo) { + // ×îºó¼È븽¼ÓÐÅÏ¢(´Ë´¦ÐèҪ¼ÈëÍøµÄȨֵ) + Input(*G, &info); + } + + // ²åÈ뻡 + InsertArc(G, v1, v2, info); + } + + // ´ÓÎļþÖжÁÈ¡Êý¾Ýʱ£¬×îºóÆäʵӦµ±ÅжÏÒ»ÏÂÊÇ·ñ¶Áµ½ÁË×ã¹»µÄÐÅÏ¢ + return OK; +} + +/* + * ¹¹ÔìÎÞÏòͼ + */ +static Status CreateUDG(OLGraph* G) { + int i, k; + int vexnum, arcnum; + VertexType v1, v2; + InfoType* info = NULL; + + (*G).vexnum = (*G).arcnum = 0; + + if(fp == NULL) { + printf("ÇëÊäÈëÎÞÏòͼµÄ¶¥µãÊý£º"); + scanf("%d", &vexnum); + printf("ÇëÊäÈëÎÞÏòͼµÄ±ßÊý£º"); + scanf("%d", &arcnum); + printf("¸ÃÎÞÏòͼµÄ±ßÉÏÊÇ·ñ°üº¬ÆäËû¸½¼ÓÐÅÏ¢(0-²»°üº¬©¦1-°üº¬)£º"); + scanf("%d", &IncInfo); + + // ¼Èë¶¥µã¼¯ + printf("Çë¼Èë %d ¸ö¶¥µã£¬²»Í¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º", vexnum); + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(stdin); + scanf("%c", &((*G).xlist[i].data)); + (*G).xlist[i].firstin = NULL; + (*G).xlist[i].firstout = NULL; + (*G).vexnum++; + } + } else { + ReadData(fp, "%d", &vexnum); // ¼Èë¶¥µãÊý + ReadData(fp, "%d", &arcnum); // ¼Èë±ßÊý + ReadData(fp, "%d", &IncInfo);// ÅжϱßÉÏÊÇ·ñ°üº¬¸½¼ÓÐÅÏ¢ + + // ¼Èë¶¥µã¼¯ + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(fp); + ReadData(fp, "%c", &((*G).xlist[i].data)); + (*G).xlist[i].firstin = NULL; + (*G).xlist[i].firstout = NULL; + (*G).vexnum++; + } + } + + // ½öÔÚ¿ØÖÆÌ¨Â¼ÈëÐÅϢʱÊä³ö´ËÌáʾ + if(fp == NULL && arcnum != 0) { + printf("ÇëΪÎÞÏòͼÒÀ´Î¼Èë %d Ìõ±ßµÄÐÅÏ¢£¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º\n", arcnum); + } + + // ¼Èë±ßµÄÐÅÏ¢ + for(k = 0; k < arcnum; k++) { + if(fp == NULL) { + printf("µÚ %2d Ìõ±ß£º", k + 1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v2); + } else { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + skipBlank(fp); + ReadData(fp, "%c%c", &v1, &v2); + } + + // Èç¹ûÐèҪ¼Èë±ßµÄÆäËû¸½¼ÓÐÅÏ¢ + if(IncInfo) { + // ×îºó¼È븽¼ÓÐÅÏ¢ + Input(*G, &info); + } + + // ²åÈë±ß + InsertArc(G, v1, v2, info); + } + + // ´ÓÎļþÖжÁÈ¡Êý¾Ýʱ£¬×îºóÆäʵӦµ±ÅжÏÒ»ÏÂÊÇ·ñ¶Áµ½ÁË×ã¹»µÄÐÅÏ¢ + return OK; +} + +/* + * ¹¹ÔìÎÞÏòÍø + */ +static Status CreateUDN(OLGraph* G) { + int i, k; + int vexnum, arcnum; + VertexType v1, v2; + InfoType* info = NULL; + + (*G).vexnum = (*G).arcnum = 0; + + if(fp == NULL) { + printf("ÇëÊäÈëÎÞÏòÍøµÄ¶¥µãÊý£º"); + scanf("%d", &vexnum); + printf("ÇëÊäÈëÎÞÏòÍøµÄ±ßÊý£º"); + scanf("%d", &arcnum); + printf("¸ÃÎÞÏòÍøµÄ±ßÉϱØÐë°üº¬ÆäËû¸½¼ÓÐÅÏ¢£¬ÒòΪ´Ë´¦µÄȨֵÐèÒª´æ´¢µ½¸½¼ÓÐÅÏ¢ÖÐ...\n"); + IncInfo = 1; + + // ¼Èë¶¥µã¼¯ + printf("Çë¼Èë %d ¸ö¶¥µã£¬²»Í¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º", vexnum); + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(stdin); + scanf("%c", &((*G).xlist[i].data)); + (*G).xlist[i].firstin = NULL; + (*G).xlist[i].firstout = NULL; + (*G).vexnum++; + } + } else { + ReadData(fp, "%d", &vexnum); // ¼Èë¶¥µãÊý + ReadData(fp, "%d", &arcnum); // ¼Èë±ßÊý + ReadData(fp, "%d", &IncInfo);// ÅжϱßÉÏÊÇ·ñ°üº¬¸½¼ÓÐÅÏ¢ + IncInfo = 1; // Ç¿ÖÆ½«È¨ÖµÂ¼Èëµ½¸½¼ÓÐÅÏ¢ÖÐ + + // ¼Èë¶¥µã¼¯ + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(fp); + ReadData(fp, "%c", &((*G).xlist[i].data)); + (*G).xlist[i].firstin = NULL; + (*G).xlist[i].firstout = NULL; + (*G).vexnum++; + } + } + + // ½öÔÚ¿ØÖÆÌ¨Â¼ÈëÐÅϢʱÊä³ö´ËÌáʾ + if(fp == NULL && arcnum != 0) { + printf("ÇëΪÎÞÏòÍøÒÀ´Î¼Èë %d Ìõ±ß(´øÈ¨Öµ)µÄÐÅÏ¢£¬¶¥µã¼°È¨ÖµÖ®¼äÓÿոñ¸ô¿ª£º\n", arcnum); + } + + // ¼Èë±ßµÄÐÅÏ¢ + for(k = 0; k < arcnum; k++) { + if(fp == NULL) { + printf("µÚ %2d Ìõ±ß¼°ÆäȨֵ£º", k + 1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v2); + } else { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + skipBlank(fp); + ReadData(fp, "%c%c", &v1, &v2); + } + + // Èç¹ûÐèҪ¼Èë±ßµÄÆäËû¸½¼ÓÐÅÏ¢ + if(IncInfo) { + // ×îºó¼È븽¼ÓÐÅÏ¢(´Ë´¦ÐèҪ¼ÈëÍøµÄȨֵ) + Input(*G, &info); + } + + // ²åÈë±ß + InsertArc(G, v1, v2, info); + } + + // ´ÓÎļþÖжÁÈ¡Êý¾Ýʱ£¬×îºóÆäʵӦµ±ÅжÏÒ»ÏÂÊÇ·ñ¶Áµ½ÁË×ã¹»µÄÐÅÏ¢ + return OK; +} + +/* + * ¼È뻡µÄÏà¹Ø¸½¼ÓÐÅÏ¢ + */ +static void Input(OLGraph G, InfoType** info) { + int weight; + + // ÔÚ"Íø"µÄÇéÐÎÏÂÐèҪ¼ÈëȨֵÐÅÏ¢ + if(G.kind == DN || G.kind == UDN) { + *info = (InfoType*) malloc(sizeof(InfoType)); + + if(fp == NULL) { + scanf("%d", &weight); + } else { + ReadData(fp, "%d", &weight); + } + + (*info)->weight = weight; + } +} + +/* + * ²éÕÒ + * + * ·µ»Ø¶¥µãuÔÚͼ/ÍøÖеÄλÖà + */ +int LocateVex(OLGraph G, VertexType u) { + int i; + + for(i = 0; i < G.vexnum; i++) { + if(G.xlist[i].data == u) { + return i; + } + } + + return -1; +} + +/* + * ²åÈë¶¥µã + * + * ½«Ö¸¶¨µÄ¶¥µãv×·¼Óµ½¶¥µã¼¯ÖУ¬Î´½¨Á¢¸Ã¶¥µãÓëÆäËû¶¥µãµÄ¹ØÏµ + */ +Status InsertVex(OLGraph* G, VertexType v) { + int k; + + // ¶¥µãÊý¹ý¶à + if((*G).vexnum == MAX_VERTEX_NUM) { + return ERROR; + } + + // Ê×ÏÈÐèÒªÅжϸö¥µãÊÇ·ñ´æÔÚ + k = LocateVex(*G, v); + if(k >= 0) { + return ERROR; // Ö¸¶¨µÄ¶¥µã´æÔÚʱ£¬ÎÞÐèÖØ¸´Ìí¼Ó + } + + G->xlist[(*G).vexnum].data = v; + G->xlist[(*G).vexnum].firstin = NULL; + G->xlist[(*G).vexnum].firstout = NULL; + + (*G).vexnum++; + + return OK; +} + +/* + * ɾ³ý¶¥µã + * + * ´Ó¶¥µã¼¯ÖÐɾ³ýÖ¸¶¨µÄ¶¥µãv£¬×¢ÒâÐèÒª¸üÐÂÏà¹ØµÄ¶¥µã¹ØÏµ + */ +Status DeleteVex(OLGraph* G, VertexType v) { + int k, i; + ArcBox* pre, * r; + ArcBox* pre2, * r2; + + // Ê×ÏÈÐèÒªÅжϸö¥µãÊÇ·ñ´æÔÚ + k = LocateVex(*G, v); + if(k == -1) { + return ERROR; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + // ÕÒµ½ÒÔ½áµãv³ö·¢µÄÁ´±í£¬ÊͷŸÃÁ´±íÉÏËùÓнáµã + r = G->xlist[k].firstout; + while(r != NULL) { + pre = r; + r = r->tlink; + + // ÔÚ×ÝÏòÁ´±íÉϲéÕÒpreµÄλÖà + pre2 = NULL; + r2 = G->xlist[pre->headvex].firstin; // ÖÁ´Ë£¬r2Ò»¶¨²»ÎªNULL + while(r2 != NULL && r2->tailvex != k) { + pre2 = r2; + r2 = r2->hlink; + } + + // ÖÁ´Ë£¬r2Ò»¶¨Ö¸ÏòÁË´ýɾ³ýµÄ»¡ + if(pre2 == NULL) { + G->xlist[pre->headvex].firstin = r2->hlink; + } else { + pre2->hlink = r2->hlink; + } + + free(pre); + + (*G).arcnum--; + } + + G->xlist[k].firstout = NULL; + + // ±éÀúÆäËüËùÓÐÁ´±í£¬É¾³ýÄÇЩָÏò¶¥µãvµÄ»¡£»¶øÇÒ£¬Ï±곬¹ýkµÄ¶¥µã£¬ÆäϱêÖµÐèÒªµÝ¼õ + for(i = 0; i < G->vexnum; i++) { + pre = NULL; + r = G->xlist[i].firstout; + while(r != NULL && r->headvex < k) { + if(r->tailvex > k) { + r->tailvex -= 1; + } + pre = r; + r = r->tlink; + } + + // Á´±íÉÏËùÓж¥µãµÄϱê¾ùСÓÚk + if(r == NULL) { + continue; + } + + if(r->headvex == k) { + // ´Ó¿ªÍ·É¾µô½áµãv + if(pre == NULL) { + G->xlist[i].firstout = r->tlink; + + // ´ÓÖмäij¸öλÖÃɾµô½áµãv + } else { + pre->tlink = r->tlink; + } + + // ÔÚ×ÝÏòÁ´±íÉϲéÕÒrµÄλÖà + pre2 = NULL; + r2 = G->xlist[k].firstin; // ÖÁ´Ë£¬r2Ò»¶¨²»ÎªNULL + while(r2 != NULL && r2->tailvex != r->tailvex) { + pre2 = r2; + r2 = r2->hlink; + } + + // ÖÁ´Ë£¬r2Ò»¶¨Ö¸ÏòÁË´ýɾ³ýµÄ»¡ + if(pre2 == NULL) { + G->xlist[k].firstin = r2->hlink; + } else { + pre2->hlink = r2->hlink; + } + + free(r); + + // Èç¹ûÕâÊÇÓÐÏòµÄͼ/Íø£¬ÒÀÈ»ÐèÒªµÝ¼õ±ß/»¡µÄÊýÁ¿ + if((*G).kind == DG || (*G).kind == DN) { + (*G).arcnum--; + } + } + + // ÔÙ´ÎÈ·¶¨rµÄλÖà + if(pre == NULL) { + r = G->xlist[i].firstout; + } else { + r = pre->tlink; + } + + // ϱ곬¹ýkµÄ¶¥µã£¬ÐèÒªµÝ¼õÆäϱê + while(r != NULL) { + if(r->tailvex > k) { + r->tailvex -= 1; + } + + if(r->headvex > k) { + r->headvex -= 1; + } + + r = r->tlink; + } + } + + // ¶¥µã¼¯Ç°ÒÆ + for(i = k + 1; i < (*G).vexnum; i++) { + G->xlist[i - 1] = G->xlist[i]; + } + + // ¶¥µãÊýµÝ¼õ + (*G).vexnum--; + + return OK; +} + +/* + * ¹¹ÔìÒ»¸ö±ß/»¡½áµã(½öÏÞÄÚ²¿Ê¹ÓÃ) + */ +static ArcBox* newArcBoxPtr(int tailvex, int headvex, ArcBox* hlink, ArcBox* tlink, InfoType* info) { + ArcBox* p = (ArcBox*) malloc(sizeof(ArcBox)); + if(!p) { + exit(OVERFLOW); + } + + p->tailvex = tailvex; + p->headvex = headvex; + + p->hlink = hlink; + p->tlink = tlink; + + p->info = info; + + return p; +} + +/* + * ²åÈë±ß/»¡ + * + * Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬Ôò²åÈëÒ»Ìõ»¡ÐèÒªÔö¼ÓÁ½¸ö¶¥µã¹ØÏµ£¬µ«»¡µÄÊýÁ¿Ö»ÔöÒ»¡£ + * ¶ÔÓÚͼ/ÍøÀ´Ëµ£¬¿ÉÒÔÔڿɱä²ÎÊýÖÐÁгö±ß/»¡µÄ¸½¼ÓÐÅÏ¢¡£ + * + * ×¢£º´Ë´¦½ÓÊյIJÎÊýÓëMGraphÓÐЩ²»Ò»Ñù£ºÍøµÄ¸½¼ÓÐÅÏ¢Öаüº¬Á˸÷Ìõ±ß/»¡µÄȨֵ¡£ + */ +Status InsertArc(OLGraph* G, VertexType v, VertexType w, ...) { + int tail, head, k, count; + ArcBox* p; + ArcBox* pre; + ArcBox* r; + Boolean overlay = FALSE; // ÊÇ·ñΪ¸²¸ÇÌí¼Ó + InfoType* info = NULL; // ±ß/»¡µÄ¸½¼ÓÐÅÏ¢ + va_list ap; + + tail = LocateVex(*G, v); // »ñÈ¡¶¥µãvÔÚ¶¥µã¼¯ÖеÄλÖà + if(tail == -1) { + return ERROR; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + head = LocateVex(*G, w); // »ñÈ¡¶¥µãwÔÚ¶¥µã¼¯ÖеÄλÖà + if(head == -1) { + return ERROR; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + // ¾Ü¾ø»· + if(tail == head) { + return ERROR; + } + + // Èç¹û±ß/»¡ÉÏ´æÔÚ¸½¼ÓÐÅÏ¢ + if(IncInfo) { + va_start(ap, w); // ÔÚwºó²éѯÊ׸ö¿É±ä²ÎÊý + info = va_arg(ap, InfoType*); // »ñÈ¡¸½¼ÓÐÅÏ¢ + va_end(ap); + } + + /* ½ÓÏÂÀ´£¬ÐèÒª²éÕÒºÏÊʵIJåÈëλÖà */ + + for(count = 0; count < 2; count++) { + + // ÔÚºáÏòÁ´±íÉϲéÕÒºÏÊʵIJåÈëλÖà + pre = NULL; + // Ö¸ÏòÒÔtailΪβµÄÊ×Ìõ±ß/»¡ + r = G->xlist[tail].firstout; + while(r != NULL && r->headvex < head) { + pre = r; + r = r->tlink; + } + + // Óöµ½ÁËÏàͬλÖõĽáµã + if(r != NULL && r->headvex == head) { + r->info = info; // ¸´Óøýáµã + overlay = TRUE; // ·¢ÉúÁ˸²¸Ç + } else { + p = newArcBoxPtr(tail, head, NULL, r, info); + + if(pre == NULL) { + G->xlist[tail].firstout = p; + } else { + pre->tlink = p; + } + } + + // Èç¹ûûÓз¢Éú¸²¸Ç£¬ËµÃ÷²åÈëÁËнáµã£¬´ËʱÐèÒª¿¼ÂÇÆäÔÚ×ÝÏòÁ´±íÉϵÄλÖà + if(overlay == FALSE) { + // ÔÚ×ÝÏòÁ´±íÉϲéÕÒºÏÊʵIJåÈëλÖà + pre = NULL; + // Ö¸ÏòÒÔheadΪͷµÄÊ×Ìõ±ß/»¡ + r = G->xlist[head].firstin; + while(r != NULL && r->tailvex < tail) { + pre = r; + r = r->hlink; + } + + // Óöµ½ÁËÏàͬλÖõĽáµã + if(r != NULL && r->tailvex == tail) { + // ²»»áÖ´Ðе½ÕâÀÒòΪÈç¹û·¢ÉúÁ˸²¸Ç£¬Ç°Ãæ½ø²»À´ + } else { + /* ÖÁ´Ë£¬½áµãpÒѾ­´æÔÚÁË */ + + if(pre == NULL) { + p->hlink = G->xlist[head].firstin; + G->xlist[head].firstin = p; + } else { + p->hlink = pre->hlink; + pre->hlink = p; + } + } + } + + // Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬ÐèÒª¿¼ÂǶԳÆÐÔ + if((G->kind == UDG || G->kind == UDN) && tail != head) { + // µßµ¹iºÍj + k = tail; + tail = head; + head = k; + } else { + break; // Èç¹ûÊÇÓÐÏòµÄ£¬¿ÉÒÔ½áÊøÁË + } + } + + // ÔڷǸ²¸ÇµÄÇéÐÎÏ£¬²Å¿¼ÂǸüбß/»¡µÄÊýÁ¿ + if(!overlay) { + (*G).arcnum++; // ²»ÂÛÓÐÏòÎÞÏò£¬±ß/»¡ÊýÖ»ÔöÒ» + } + + return OK; +} + +/* + * ɾ³ý±ß/»¡ + */ +Status DeleteArc(OLGraph* G, VertexType v, VertexType w) { + int tail, head, k, count; + ArcBox* pre, * r; + ArcBox* pre2, * r2; + + tail = LocateVex(*G, v); + if(tail == -1) { + return ERROR; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + head = LocateVex(*G, w); + if(head == -1) { + return ERROR; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + for(count = 0; count < 2; count++) { + pre = NULL; + // ÔÚºáÏòÁ´±íÖÐÕÒµ½´ýɾ³ýµÄ±ß/»¡ + r = G->xlist[tail].firstout; + while(r != NULL && r->headvex < head) { + pre = r; + r = r->tlink; + } + + // ÕÒµ½ÁË´ýɾ³ýµÄ±ß/»¡ + if(r != NULL && r->headvex == head) { + if(pre == NULL) { + G->xlist[tail].firstout = r->tlink; + } else { + pre->tlink = r->tlink; + } + + // ÔÚ×ÝÏòÁ´±íÉϲéÕÒrµÄλÖà + pre2 = NULL; + r2 = G->xlist[head].firstin; // ÖÁ´Ë£¬r2Ò»¶¨²»ÎªNULL + while(r2 != NULL && r2->tailvex != r->tailvex) { + pre2 = r2; + r2 = r2->hlink; + } + + // ÖÁ´Ë£¬r2Ò»¶¨Ö¸ÏòÁË´ýɾ³ýµÄ»¡ + if(pre2 == NULL) { + G->xlist[head].firstin = r2->hlink; + } else { + pre2->hlink = r2->hlink; + } + + free(r); + } else { + return ERROR; // ûÕÒµ½ + } + + // Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬ÐèÒª¿¼ÂǶԳÆÐÔ + if((G->kind == UDG || G->kind == UDN) && tail != head) { + // µßµ¹tailºÍhead + k = tail; + tail = head; + head = k; + } else { + break; // Èç¹ûÊÇÓÐÏòµÄ£¬¿ÉÒÔ½áÊøÁË + } + } + + (*G).arcnum--; // ²»ÂÛÓÐÏòÎÞÏò£¬±ß/»¡ÊýÖ»¼õÒ» + + return OK; +} + +/* + * ÒÔͼÐλ¯ÐÎʽÊä³öµ±Ç°½á¹¹ + */ +void PrintGraph(OLGraph G) { + int i, head; + ArcBox* p; + + if(G.vexnum == 0) { + printf("¿Õͼ£¬ÎÞÐè´òÓ¡£¡\n"); + return; + } + + printf("µ±Ç°Í¼/Íø°üº¬ %2d ¸ö¶¥µã£¬ %2d Ìõ±ß/»¡...\n", G.vexnum, G.arcnum); + + for(i = 0; i < G.vexnum; i++) { + printf("%c ===> ", G.xlist[i].data); + + head = 0; + p = G.xlist[i].firstout; + + while(p != NULL) { + if(head < p->headvex) { + if(IncInfo == 0) { + printf(" "); + + // ¶ÔÓÚÍø£¬»á´ÓÆä¸½¼ÓÐÅÏ¢ÖлñÈ¡µ½È¨Öµ + } else { + printf(" "); + } + } else { + if(IncInfo == 0) { + printf("<%c, %c>", G.xlist[p->tailvex].data, G.xlist[p->headvex].data); + + // ¶ÔÓÚÍø£¬»á´ÓÆä¸½¼ÓÐÅÏ¢ÖлñÈ¡µ½È¨Öµ + } else { + printf("<%c, %c, %2d>", G.xlist[p->tailvex].data, G.xlist[p->headvex].data, p->info->weight); + } + + p = p->tlink; + } + + head++; + + if(p != NULL) { + printf(" "); + } + } + + printf("\n"); + } +} diff --git a/VisualC++/ExerciseBook/07.17/OLGraph.h b/VisualC++/ExerciseBook/07.17/OLGraph.h new file mode 100644 index 0000000..dc80aba --- /dev/null +++ b/VisualC++/ExerciseBook/07.17/OLGraph.h @@ -0,0 +1,178 @@ +/*==================== + * ͼµÄÊ®×ÖÁ´±í´æ´¢±íʾ + * + * °üº¬Ëã·¨: 7.3 + ====================*/ + +#ifndef OLGRAPH_H +#define OLGRAPH_H + +#include +#include // Ìṩmemset¡¢strcmp Ô­ÐÍ +#include // Ìṩºêva_list¡¢va_start¡¢va_arg¡¢va_end +#include // Ìṩmalloc¡¢realloc¡¢free¡¢exitÔ­ÐÍ +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// + +/* + * ×¢£º + * + * ͨ³£À´½²£¬ÎÞȨͼ±»¼ò³ÆÎª¡¾Í¼¡¿£¬ÓÐȨͼ±»¼ò³ÆÎª¡¾Íø¡¿¡£ + * ÎÞÏòͼ/ÍøÖеĶ¥µã¹ØÏµ±»³ÆÎª¡¾±ß¡¿£¬ÓÐÏòͼ/ÍøÖеĶ¥µã¹ØÏµ±»³ÆÎª¡¾»¡¡¿£¬²¢Çø·Ö»¡Í·Ó뻡β¡£ + * ʵ¼Ê±íÊöÖУ¬Î´±Ø»áÑϸñ×ñÊØÒÔÉÏÃüÃû¡£ + * + * µ±Ç°½á¹¹Êʺϴ洢ÓÐÏòͼ¡£ + * + * ¡ï ²åÈë±ß/»¡µÄÐÅϢʱ£¬ÕâÀïµÄʵÏÖÊǰ´"ÉýÐò"²åÈëµÄ£¬ÕâʹµÃ²åÈëµÄ»¡Êǰ´"ÉýÐò"ÅÅÁеġ£ + */ + + +/* ºê¶¨Òå */ +#define MAX_VERTEX_NUM 26 // ×î´ó¶¥µã¸öÊý + + +// ͼµÄÀàÐÍ +typedef enum { + DG, // 0-ÓÐÏòͼ + DN, // 1-ÓÐÏòÍø(´øÈ¨Öµ) + UDG, // 2-ÎÞÏòͼ + UDN // 3-ÎÞÏòÍø(´øÈ¨Öµ) +} GraphKind; + +// ¶¥µãÀàÐÍ +typedef char VertexType; + +// ±ß/»¡µÄÏà¹Ø¸½¼ÓÐÅÏ¢ +typedef struct { + /* + * ×¢£º + * ½Ì²ÄÖиø³öµÄ½á¹¹Ö»¿¼ÂÇÁËÎÞȨͼ£¬¶øÃ»¿¼ÂÇÓÐȨͼ(Íø)¡£ + * ÕâÀïΪÁ˰ѡ°Íø¡±µÄÇéÐÎÒ²¿¼ÂǽøÈ¥£¬ÌØÔÚ¸½¼ÓÐÅÏ¢ÖÐÔö¼ÓÁË"È¨ÖØ"ÊôÐÔ¡£ + */ + int weight; +} InfoType; + +/* ±ß/»¡½áµã */ +typedef struct ArcBox { + int tailvex; // »¡Í·¶¥µãλÖà + int headvex; // »¡Î²¶¥µãλÖà + struct ArcBox* hlink; // Ö¸ÏòÏÂÒ»¸öÓµÓÐÏàͬ»¡Í·µÄ»¡ + struct ArcBox* tlink; // Ö¸ÏòÏÂÒ»¸öÓµÓÐÏàͬ»¡Î²µÄ»¡ + InfoType* info; // ¸Ã»¡µÄÏà¹Ø¸½¼ÓÐÅÏ¢ +} ArcBox; + +// ÿ¸öºáÏòÁ´±íµÄÍ·½áµã +typedef struct VexNode { + VertexType data; // ¶¥µã + ArcBox* firstin; // Ö¸Ïò¸Ã¶¥µãµÄµÚÒ»ÌõÈ뻡 + ArcBox* firstout; // Ö¸Ïò¸Ã¶¥µãµÄµÚÒ»Ìõ³ö»¡ +} VexNode; + +/* ͼµÄÊ®×ÖÁ´±í´æ´¢±íʾÀàÐͶ¨Òå */ +typedef struct { + VexNode xlist[MAX_VERTEX_NUM]; // ±íÍ·ÏòÁ¿ + int vexnum, arcnum; // ¶¥µãÊýºÍ»¡Êý + GraphKind kind; // ͼµÄÀàÐͱêÖ¾ +} OLGraph; + + +// ±ß/»¡ÉÏÊÇ·ñ´æÔÚ¸½¼ÓÐÅÏ¢ +extern Boolean IncInfo; + + +/* + * ´´½¨ + * + *¡¾±¸×¢¡¿ + * + * ½Ì²ÄÖÐĬÈÏ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý¡£ + * ÕâÀïΪÁË·½±ã²âÊÔ£¬±ÜÃâÿ´ÎÔËÐж¼ÊÖ¶¯ÊäÈëÊý¾Ý£¬ + * Òò¶øÔÊÐíÑ¡Ôñ´ÓÔ¤ÉèµÄÎļþpathÖжÁÈ¡²âÊÔÊý¾Ý¡£ + * + * Èç¹ûÐèÒª´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý£¬ÔòpathΪNULL£¬»òpath[kind]Ϊ""¡£ + * Èç¹ûÐèÒª´ÓÎļþÖжÁÈ¡Êý¾Ý£¬ÔòÐèÒªÔÚpathÖÐÌîдÎļþÃûÐÅÏ¢¡£ + */ +Status CreateGraph(OLGraph* G, char* path[]); + +/* + * ¨€¨€¨€¨€¨€¨€¨€¨€ Ëã·¨7.3 ¨€¨€¨€¨€¨€¨€¨€¨€ + * + * ¹¹ÔìÓÐÏòͼ + * + * ×¢£º + * ½Ì²ÄÖÐʹÓÃÁËÍ·²å·¨À´²åÈ뻡£¬ÕâÖÖ×ö·¨µÄΨһÓŵãÊDzåÈë·½±ã£¬ + * µ«ÊÇÔÚÉæ¼°µ½É¾³ý»ò²éÕÒʱ£¬Ð§Âʽϵͣ» + * ¶øÇÒ£¬"Í·²å·¨"ÒÀÀµÊäÈëµÄ˳Ðò£¬Èç¹ûÊäÈëµÄ±ß/»¡ÊÇÂÒÐòµÄ£¬ + * Ôò×îÖÕ¹¹Ôì³öµÄͼ/ÍøÖеıß/»¡Ò²ÊÇÎÞÐòµÄ¡£ + * + * ΪÁ˿˷þÒÔÉÏȱµã£¬ÕâÀï¸ÄÓÃ"ÉýÐò"²åÈë·¨£¬±£Ö¤²åÈëµÄ»¡ÊÇ"ÉýÐò"µÄ¡£ + * µ«Í¬Ê±£¬ÕâÑù×ö»áʹ"²åÈë"Ëã·¨±äµÃ½ÏΪ¸´ÔÓ¡£ + */ +static Status CreateDG(OLGraph* G); + +/* + * ¹¹ÔìÓÐÏòÍø + */ +static Status CreateDN(OLGraph* G); + +/* + * ¹¹ÔìÎÞÏòͼ + */ +static Status CreateUDG(OLGraph* G); + +/* + * ¹¹ÔìÎÞÏòÍø + */ +static Status CreateUDN(OLGraph* G); + +/* + * ¼È뻡µÄÏà¹Ø¸½¼ÓÐÅÏ¢ + */ +static void Input(OLGraph G, InfoType** info); + +/* + * ²éÕÒ + * + * ·µ»Ø¶¥µãuÔÚͼ/ÍøÖеÄλÖà + */ +int LocateVex(OLGraph G, VertexType u); + +/* + * ²åÈë¶¥µã + * + * ½«Ö¸¶¨µÄ¶¥µãv×·¼Óµ½¶¥µã¼¯ÖУ¬Î´½¨Á¢¸Ã¶¥µãÓëÆäËû¶¥µãµÄ¹ØÏµ + */ +Status InsertVex(OLGraph* G, VertexType v); + +/* + * ɾ³ý¶¥µã + * + * ´Ó¶¥µã¼¯ÖÐɾ³ýÖ¸¶¨µÄ¶¥µãv£¬×¢ÒâÐèÒª¸üÐÂÏà¹ØµÄ¶¥µã¹ØÏµ + */ +Status DeleteVex(OLGraph* G, VertexType v); + +/* + * ¹¹ÔìÒ»¸ö±ß/»¡½áµã(½öÏÞÄÚ²¿Ê¹ÓÃ) + */ +static ArcBox* newArcBoxPtr(int tailvex, int headvex, ArcBox* hlink, ArcBox* tlink, InfoType* info); + +/* + * ²åÈë±ß/»¡ + * + * Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬Ôò²åÈëÒ»Ìõ»¡ÐèÒªÔö¼ÓÁ½¸ö¶¥µã¹ØÏµ£¬µ«»¡µÄÊýÁ¿Ö»ÔöÒ»¡£ + * ¶ÔÓÚͼ/ÍøÀ´Ëµ£¬¿ÉÒÔÔڿɱä²ÎÊýÖÐÁгö±ß/»¡µÄ¸½¼ÓÐÅÏ¢¡£ + * + * ×¢£º´Ë´¦½ÓÊյIJÎÊýÓëMGraphÓÐЩ²»Ò»Ñù£ºÍøµÄ¸½¼ÓÐÅÏ¢Öаüº¬Á˸÷Ìõ±ß/»¡µÄȨֵ¡£ + */ +Status InsertArc(OLGraph* G, VertexType v, VertexType w, ...); + +/* + * ɾ³ý±ß/»¡ + */ +Status DeleteArc(OLGraph* G, VertexType v, VertexType w); + +/* + * ÒÔͼÐλ¯ÐÎʽÊä³öµ±Ç°½á¹¹ + */ +void PrintGraph(OLGraph G); + +#endif diff --git a/VisualC++/ExerciseBook/07.17/TestData_DG.txt b/VisualC++/ExerciseBook/07.17/TestData_DG.txt new file mode 100644 index 0000000..ae011ea --- /dev/null +++ b/VisualC++/ExerciseBook/07.17/TestData_DG.txt @@ -0,0 +1,6 @@ +ͼÀàÐÍ¡ú0£¨ÓÐÏòͼ£© +¶¥µãÊý¡ú6 +»¡Êý¡ú14 +»¡ÊÇ·ñ´øÓÐÆäËûÐÅÏ¢¡ú0 +¶¥µã¼¯¡ú¡¾A£¬X£¬B£¬C£¬D£¬E¡¿ +»¡µÄ¼¯ºÏ¡ú¡¾A£¬B¡¿¡¾A£¬C¡¿¡¾A£¬D¡¿¡¾B£¬C¡¿¡¾B£¬D¡¿¡¾B£¬E¡¿¡¾C£¬B¡¿¡¾C£¬E¡¿¡¾C£¬X¡¿¡¾E£¬A¡¿¡¾E£¬D¡¿¡¾E£¬X¡¿¡¾X£¬A¡¿¡¾X£¬D¡¿ \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.17/TestData_DN.txt b/VisualC++/ExerciseBook/07.17/TestData_DN.txt new file mode 100644 index 0000000..c41b879 --- /dev/null +++ b/VisualC++/ExerciseBook/07.17/TestData_DN.txt @@ -0,0 +1,6 @@ +ͼÀàÐÍ¡ú1£¨ÓÐÏòÍø£© +¶¥µãÊý¡ú6 +»¡Êý¡ú14 +»¡ÊÇ·ñ´øÓÐÆäËûÐÅÏ¢¡ú1 +¶¥µã¼¯¡ú¡¾A£¬X£¬B£¬C£¬D£¬E¡¿ +»¡µÄ¼¯ºÏ¡ú¡¾A£¬B£¬3¡¿¡¾A£¬C£¬8¡¿¡¾A£¬D£¬11¡¿¡¾B£¬C£¬7¡¿¡¾B£¬D£¬4¡¿¡¾B£¬E£¬1¡¿¡¾C£¬B£¬5¡¿¡¾C£¬E£¬17¡¿¡¾C£¬X£¬3¡¿¡¾E£¬A£¬6¡¿¡¾E£¬D£¬4¡¿¡¾E£¬X£¬2¡¿¡¾X£¬A£¬8¡¿¡¾X£¬D£¬10¡¿ \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.17/TestData_UDG.txt b/VisualC++/ExerciseBook/07.17/TestData_UDG.txt new file mode 100644 index 0000000..6c08d74 --- /dev/null +++ b/VisualC++/ExerciseBook/07.17/TestData_UDG.txt @@ -0,0 +1,6 @@ +ͼÀàÐÍ¡ú2£¨ÎÞÏòͼ£© +¶¥µãÊý¡ú6 +±ßÊý¡ú13 +±ßÊÇ·ñ´øÓÐÆäËûÐÅÏ¢¡ú0 +¶¥µã¼¯¡ú¡¾A£¬X£¬B£¬C£¬D£¬E¡¿ +±ßµÄ¼¯ºÏ¡ú¡¾A£¬B¡¿¡¾A£¬C¡¿¡¾A£¬D¡¿¡¾B£¬C¡¿¡¾B£¬D¡¿¡¾B£¬E¡¿¡¾C£¬E¡¿¡¾C£¬X¡¿¡¾E£¬A¡¿¡¾E£¬D¡¿¡¾E£¬X¡¿¡¾X£¬A¡¿¡¾X£¬D¡¿ \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.17/TestData_UDN.txt b/VisualC++/ExerciseBook/07.17/TestData_UDN.txt new file mode 100644 index 0000000..2117df2 --- /dev/null +++ b/VisualC++/ExerciseBook/07.17/TestData_UDN.txt @@ -0,0 +1,6 @@ +ͼÀàÐÍ¡ú3£¨ÎÞÏòÍø£© +¶¥µãÊý¡ú6 +±ßÊý¡ú13 +±ßÊÇ·ñ´øÓÐÆäËûÐÅÏ¢¡ú1 +¶¥µã¼¯¡ú¡¾A£¬X£¬B£¬C£¬D£¬E¡¿ +±ßµÄ¼¯ºÏ¡ú¡¾A£¬B£¬3¡¿¡¾A£¬C£¬8¡¿¡¾A£¬D£¬11¡¿¡¾B£¬C£¬7¡¿¡¾B£¬D£¬4¡¿¡¾B£¬E£¬1¡¿¡¾C£¬E£¬17¡¿¡¾C£¬X£¬3¡¿¡¾E£¬A£¬6¡¿¡¾E£¬D£¬4¡¿¡¾E£¬X£¬2¡¿¡¾X£¬A£¬8¡¿¡¾X£¬D£¬10¡¿ \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.18-07.19/07.18-07.19.c b/VisualC++/ExerciseBook/07.18-07.19/07.18-07.19.c new file mode 100644 index 0000000..fb299e2 --- /dev/null +++ b/VisualC++/ExerciseBook/07.18-07.19/07.18-07.19.c @@ -0,0 +1,181 @@ +#include +#include // Ìṩºêva_list¡¢va_start¡¢va_arg¡¢va_end +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// +#include "AMLGraph.h" //**¡ø07 ͼ**// + +/* + * ´´½¨Í¼/±í + */ +Status CreateGraph_7_19(AMLGraph* G, char* path[]); + +/* + * ²åÈë¶¥µã + * + * ½«Ö¸¶¨µÄ¶¥µãv×·¼Óµ½¶¥µã¼¯ÖУ¬Î´½¨Á¢¸Ã¶¥µãÓëÆäËû¶¥µãµÄ¹ØÏµ + */ +Status InsertVex_7_18(AMLGraph* G, VertexType v); + +/* + * ɾ³ý¶¥µã + * + * ´Ó¶¥µã¼¯ÖÐɾ³ýÖ¸¶¨µÄ¶¥µãv£¬×¢ÒâÐèÒª¸üÐÂÏà¹ØµÄ¶¥µã¹ØÏµ + */ +Status DeleteVex_7_18(AMLGraph* G, VertexType v); + +/* + * ²åÈë±ß/»¡ + * + * Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬Ôò²åÈëÒ»Ìõ»¡ÐèÒªÔö¼ÓÁ½¸ö¶¥µã¹ØÏµ£¬µ«»¡µÄÊýÁ¿Ö»ÔöÒ»¡£ + * + * ¶ÔÓÚͼÀ´Ëµ£¬¿ÉÒÔÔڿɱä²ÎÊýÖÐÁгö±ß/»¡µÄ¸½¼ÓÐÅÏ¢£» + * ¶ÔÓÚÍøÀ´Ëµ£¬¿ÉÒÔÔڿɱä²ÎÊýÖÐÒÀ´ÎÁгö±ß/»¡µÄȨֵÒÔ¼°¸½¼ÓÐÅÏ¢¡£ + */ +Status InsertArc_7_18(AMLGraph* G, VertexType v, VertexType w, ...); + +/* + * ɾ³ý±ß/»¡ + * + * ´Ëɾ³ýÖ»ÊǸüбß/»¡µÄÁ¬Í¨¹ØÏµ + */ +Status DeleteArc_7_18(AMLGraph* G, VertexType v, VertexType w); + + +int main(int argc, char* argv[]) { + AMLGraph G; + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ´´½¨²¢Êä³öͼ/Íø...\n"); + { + char* path[4]; + + path[0] = ""; + path[1] = ""; + path[2] = "TestData_UDG.txt"; + path[3] = "TestData_UDN.txt"; + + CreateGraph_7_19(&G, path); + PrintGraph(G); + printf("\n"); + } + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ɾ³ý¶¥µã...\n"); + { + VertexType v = 'X'; + + printf("ɾ³ý¶¥µã '%c' ºóµÄͼΪ£º\n", v); + DeleteVex_7_18(&G, v); + PrintGraph(G); + printf("\n"); + } + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ²åÈë¶¥µã...\n"); + { + VertexType v = 'Y'; + + printf("²åÈë¶¥µã '%c' ºóµÄͼΪ£º\n", v); + InsertVex_7_18(&G, v); + PrintGraph(G); + printf("\n"); + } + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ²åÈë±ß/»¡...\n"); + { + // ×¢£ºÊÇÖØ¸´µÄ±ß + VertexType v[10] = {'B', 'C', 'E', 'Y', 'Y', 'Y', 'D', 'D', 'E', 'E'}; + VertexType w[10] = {'Y', 'Y', 'Y', 'A', 'B', 'D', 'C', 'A', 'B', 'D'}; + InfoType info[10] = {{8}, {5}, {1}, {11}, {2}, {6}, {3}, {7}, {2}, {9}}; + int k; + + // ͼ + if(G.kind == DG || G.kind == UDG) { + for(k = 0; k < 10; k++) { + printf("²åÈëÎÞȨֵµÄ±ß£º<%c, %c>...\n", v[k], w[k]); + InsertArc_7_18(&G, v[k], w[k]); + } + + // Íø + } else if(G.kind == DN || G.kind == UDN) { + for(k = 0; k < 10; k++) { + printf("²åÈë´øÈ¨ÖµµÄ±ß£º<%c, %c, %d>...\n", v[k], w[k], info[k].weight); + InsertArc_7_18(&G, v[k], w[k], &info[k]); + } + } else { + return ERROR; + } + + PrintGraph(G); + printf("\n"); + } + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ɾ³ý±ß/»¡...\n"); + { + VertexType v[3] = {'D', 'E', 'F'}; + VertexType w[3] = {'A', 'B', 'B'}; + int k; + + for(k = 0; k < 3; k++) { + printf("ɾ³ý±ß£º<%c, %c>...\n", v[k], w[k]); + DeleteArc_7_18(&G, v[k], w[k]); + } + PrintGraph(G); + printf("\n"); + } + + return 0; +} + + +/* + * ´´½¨Í¼/±í + */ +Status CreateGraph_7_19(AMLGraph* G, char* path[]) { + return CreateGraph(G, path); +} + +/* + * ²åÈë¶¥µã + * + * ½«Ö¸¶¨µÄ¶¥µãv×·¼Óµ½¶¥µã¼¯ÖУ¬Î´½¨Á¢¸Ã¶¥µãÓëÆäËû¶¥µãµÄ¹ØÏµ + */ +Status InsertVex_7_18(AMLGraph* G, VertexType v) { + return InsertVex(G, v); +} + +/* + * ɾ³ý¶¥µã + * + * ´Ó¶¥µã¼¯ÖÐɾ³ýÖ¸¶¨µÄ¶¥µãv£¬×¢ÒâÐèÒª¸üÐÂÏà¹ØµÄ¶¥µã¹ØÏµ + */ +Status DeleteVex_7_18(AMLGraph* G, VertexType v) { + return DeleteVex(G, v); +} + +/* + * ²åÈë±ß/»¡ + * + * Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬Ôò²åÈëÒ»Ìõ»¡ÐèÒªÔö¼ÓÁ½¸ö¶¥µã¹ØÏµ£¬µ«»¡µÄÊýÁ¿Ö»ÔöÒ»¡£ + * + * ¶ÔÓÚͼÀ´Ëµ£¬¿ÉÒÔÔڿɱä²ÎÊýÖÐÁгö±ß/»¡µÄ¸½¼ÓÐÅÏ¢£» + * ¶ÔÓÚÍøÀ´Ëµ£¬¿ÉÒÔÔڿɱä²ÎÊýÖÐÒÀ´ÎÁгö±ß/»¡µÄȨֵÒÔ¼°¸½¼ÓÐÅÏ¢¡£ + */ +Status InsertArc_7_18(AMLGraph* G, VertexType v, VertexType w, ...) { + va_list ap; + InfoType* info = NULL; // ±ß/»¡µÄ¸½¼ÓÐÅÏ¢ + + // Èç¹û±ß/»¡ÉÏ´æÔÚ¸½¼ÓÐÅÏ¢ + if(IncInfo) { + va_start(ap, w); // ÔÚwºó²éѯÊ׸ö¿É±ä²ÎÊý + info = va_arg(ap, InfoType*); // »ñÈ¡¸½¼ÓÐÅÏ¢ + va_end(ap); + } + + return InsertArc(G, v, w, info); +} + +/* + * ɾ³ý±ß/»¡ + * + * ´Ëɾ³ýÖ»ÊǸüбß/»¡µÄÁ¬Í¨¹ØÏµ + */ +Status DeleteArc_7_18(AMLGraph* G, VertexType v, VertexType w) { + return DeleteArc(G, v, w); +} diff --git a/VisualC++/ExerciseBook/07.18-07.19/07.18-07.19.vcxproj b/VisualC++/ExerciseBook/07.18-07.19/07.18-07.19.vcxproj new file mode 100644 index 0000000..5fa09df --- /dev/null +++ b/VisualC++/ExerciseBook/07.18-07.19/07.18-07.19.vcxproj @@ -0,0 +1,80 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {3FF8A41C-0672-4B72-8677-E8F0438B848F} + My07180719 + + + + Application + true + MultiByte + + + Application + false + true + MultiByte + + + + + + + + + + + + + $(SolutionDir)\..\Status;$(IncludePath) + + + + Level3 + Disabled + + + true + $(SolutionDir)\..\Status\Status.lib;%(AdditionalDependencies) + Console + + + + + Level3 + MaxSpeed + true + true + + + true + true + true + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.18-07.19/07.18-07.19.vcxproj.filters b/VisualC++/ExerciseBook/07.18-07.19/07.18-07.19.vcxproj.filters new file mode 100644 index 0000000..eecb14b --- /dev/null +++ b/VisualC++/ExerciseBook/07.18-07.19/07.18-07.19.vcxproj.filters @@ -0,0 +1,38 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + æºæ–‡ä»¶ + + + æºæ–‡ä»¶ + + + + + 头文件 + + + + + èµ„æºæ–‡ä»¶ + + + èµ„æºæ–‡ä»¶ + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.18-07.19/07.18-07.19.vcxproj.user b/VisualC++/ExerciseBook/07.18-07.19/07.18-07.19.vcxproj.user new file mode 100644 index 0000000..ace9a86 --- /dev/null +++ b/VisualC++/ExerciseBook/07.18-07.19/07.18-07.19.vcxproj.user @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.18-07.19/AMLGraph.c b/VisualC++/ExerciseBook/07.18-07.19/AMLGraph.c new file mode 100644 index 0000000..b165d56 --- /dev/null +++ b/VisualC++/ExerciseBook/07.18-07.19/AMLGraph.c @@ -0,0 +1,715 @@ +/*===================== + * ͼµÄÁÚ½Ó¶àÖØ±í´æ´¢±íʾ + ======================*/ + +#include "AMLGraph.h" + +// ¼ÈëÊý¾ÝµÄÔ´Îļþ£»fpΪnullʱ£¬ËµÃ÷ÐèÒª´Ó¿ØÖÆÌ¨Â¼Èë +static FILE* fp = NULL; + +/* + * IncInfoָʾ¸ÃͼµÄ±ßÉÏÊÇ·ñ´æÔÚ¸½¼ÓÐÅÏ¢¡£ + * Èç¹ûÆäÖµ²»Îª0£¬Ôò±íʾÎÞ¸½¼ÓÐÅÏ¢£¬·ñÔò£¬±íʾ´æÔÚ¸½¼ÓÐÅÏ¢¡£ + */ +Boolean IncInfo = FALSE; + +// ·ÃÎʱêÖ¾Êý×飬¼Ç¼·ÃÎʹýµÄ¶¥µã +static Boolean visited[MAX_VERTEX_NUM]; + +// º¯Êý±äÁ¿ +static Status (* VisitFunc)(VertexType e); + + +/* + * ´´½¨ + * + *¡¾±¸×¢¡¿ + * + * ½Ì²ÄÖÐĬÈÏ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý¡£ + * ÕâÀïΪÁË·½±ã²âÊÔ£¬±ÜÃâÿ´ÎÔËÐж¼ÊÖ¶¯ÊäÈëÊý¾Ý£¬ + * Òò¶øÔÊÐíÑ¡Ôñ´ÓÔ¤ÉèµÄÎļþpathÖжÁÈ¡²âÊÔÊý¾Ý¡£ + * + * Èç¹ûÐèÒª´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý£¬ÔòpathΪNULL£¬»òpath[kind]Ϊ""¡£ + * Èç¹ûÐèÒª´ÓÎļþÖжÁÈ¡Êý¾Ý£¬ÔòÐèÒªÔÚpathÖÐÌîдÎļþÃûÐÅÏ¢¡£ + */ +Status CreateGraph(AMLGraph* G, char* path[]) { + int readFromConsole; // ÊÇ·ñ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý + int kind; + Status flag; + + printf("ÇëÊäÈëͼµÄÀàÐÍ(2-ÎÞÏòͼ ©¦ 3-ÎÞÏòÍø)£º"); + scanf("%d", &kind); + + // ÀàÐͲ»ºÏ¹æ(Ö»½ÓÊÜÎÞÏòµÄͼ/Íø) + if(kind < 2 || kind > 3) { + return ERROR; + } + + // Èç¹ûûÓÐÎļþ·¾¶ÐÅÏ¢£¬Ôò´Ó¿ØÖÆÌ¨¶ÁÈ¡ÊäÈë + readFromConsole = (path == NULL) || strcmp(path[kind], "") == 0; + + // ÐèÒª´ÓÎļþ¶ÁÈ¡ + if(readFromConsole) { + (*G).kind = kind; // ¼Ç¼ͼ/ÍøµÄÀàÐÍ + } else { + // ´ò¿ªÎļþ£¬×¼±¸¶ÁÈ¡²âÊÔÊý¾Ý + fp = fopen(path[kind], "r"); + if(fp == NULL) { + return ERROR; + } + + // ¼ÈëͼµÄÀàÐÍ + ReadData(fp, "%d", &((*G).kind)); + } + + // Ëæ»ú´´½¨ÎÞÏòͼ»òÎÞÏòÍøµÄÒ»ÖÖ + switch((*G).kind) { + case UDG: + flag = CreateUDG(G); + break; + case UDN: + flag = CreateUDN(G); + break; + default: + flag = ERROR; + break; + } + + if(fp != NULL) { + fclose(fp); + fp = NULL; + } + + return flag; +} + +/* + * ¹¹ÔìÎÞÏòͼ + */ +static Status CreateUDG(AMLGraph* G) { + int i, k; + int vexnum, arcnum; + VertexType v1, v2; + InfoType* info = NULL; + + (*G).vexnum = (*G).edgenum = 0; + + if(fp == NULL) { + printf("ÇëÊäÈëÎÞÏòͼµÄ¶¥µãÊý£º"); + scanf("%d", &vexnum); + printf("ÇëÊäÈëÎÞÏòͼµÄ±ßÊý£º"); + scanf("%d", &arcnum); + printf("¸ÃÎÞÏòͼµÄ±ßÉÏÊÇ·ñ°üº¬ÆäËû¸½¼ÓÐÅÏ¢(0-²»°üº¬©¦1-°üº¬)£º"); + scanf("%d", &IncInfo); + + // ¼Èë¶¥µã¼¯ + printf("Çë¼Èë %d ¸ö¶¥µã£¬²»Í¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º", vexnum); + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(stdin); + scanf("%c", &((*G).adjmulist[i].data)); + (*G).adjmulist[i].firstedge = NULL; + (*G).vexnum++; + } + } else { + ReadData(fp, "%d", &vexnum); // ¼Èë¶¥µãÊý + ReadData(fp, "%d", &arcnum); // ¼Èë±ßÊý + ReadData(fp, "%d", &IncInfo);// ÅжϱßÉÏÊÇ·ñ°üº¬¸½¼ÓÐÅÏ¢ + + // ¼Èë¶¥µã¼¯ + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(fp); + ReadData(fp, "%c", &((*G).adjmulist[i].data)); + (*G).adjmulist[i].firstedge = NULL; + (*G).vexnum++; + } + } + + // ½öÔÚ¿ØÖÆÌ¨Â¼ÈëÐÅϢʱÊä³ö´ËÌáʾ + if(fp == NULL && arcnum != 0) { + printf("ÇëΪÎÞÏòͼÒÀ´Î¼Èë %d Ìõ±ßµÄÐÅÏ¢£¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º\n", arcnum); + } + + // ¼Èë±ßµÄÐÅÏ¢ + for(k = 0; k < arcnum; k++) { + if(fp == NULL) { + printf("µÚ %2d Ìõ±ß£º", k + 1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v2); + } else { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + skipBlank(fp); + ReadData(fp, "%c%c", &v1, &v2); + } + + // Èç¹ûÐèҪ¼Èë±ßµÄÆäËû¸½¼ÓÐÅÏ¢ + if(IncInfo) { + // ×îºó¼È븽¼ÓÐÅÏ¢ + Input(*G, &info); + } + + // ²åÈë±ß + InsertArc(G, v1, v2, info); + } + + // ´ÓÎļþÖжÁÈ¡Êý¾Ýʱ£¬×îºóÆäʵӦµ±ÅжÏÒ»ÏÂÊÇ·ñ¶Áµ½ÁË×ã¹»µÄÐÅÏ¢ + return OK; +} + +/* + * ¹¹ÔìÎÞÏòÍø + */ +static Status CreateUDN(AMLGraph* G) { + int i, k; + int vexnum, arcnum; + VertexType v1, v2; + InfoType* info = NULL; + + (*G).vexnum = (*G).edgenum = 0; + + if(fp == NULL) { + printf("ÇëÊäÈëÎÞÏòÍøµÄ¶¥µãÊý£º"); + scanf("%d", &vexnum); + printf("ÇëÊäÈëÎÞÏòÍøµÄ±ßÊý£º"); + scanf("%d", &arcnum); + printf("¸ÃÎÞÏòÍøµÄ±ßÉϱØÐë°üº¬ÆäËû¸½¼ÓÐÅÏ¢£¬ÒòΪ´Ë´¦µÄȨֵÐèÒª´æ´¢µ½¸½¼ÓÐÅÏ¢ÖÐ...\n"); + IncInfo = 1; + + // ¼Èë¶¥µã¼¯ + printf("Çë¼Èë %d ¸ö¶¥µã£¬²»Í¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º", vexnum); + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(stdin); + scanf("%c", &((*G).adjmulist[i].data)); + (*G).adjmulist[i].firstedge = NULL; + (*G).vexnum++; + } + } else { + ReadData(fp, "%d", &vexnum); // ¼Èë¶¥µãÊý + ReadData(fp, "%d", &arcnum); // ¼Èë±ßÊý + ReadData(fp, "%d", &IncInfo);// ÅжϱßÉÏÊÇ·ñ°üº¬¸½¼ÓÐÅÏ¢ + IncInfo = 1; // Ç¿ÖÆ½«È¨ÖµÂ¼Èëµ½¸½¼ÓÐÅÏ¢ÖÐ + + // ¼Èë¶¥µã¼¯ + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(fp); + ReadData(fp, "%c", &((*G).adjmulist[i].data)); + (*G).adjmulist[i].firstedge = NULL; + (*G).vexnum++; + } + } + + // ½öÔÚ¿ØÖÆÌ¨Â¼ÈëÐÅϢʱÊä³ö´ËÌáʾ + if(fp == NULL && arcnum != 0) { + printf("ÇëΪÎÞÏòÍøÒÀ´Î¼Èë %d Ìõ±ß(´øÈ¨Öµ)µÄÐÅÏ¢£¬¶¥µã¼°È¨ÖµÖ®¼äÓÿոñ¸ô¿ª£º\n", arcnum); + } + + // ¼Èë±ßµÄÐÅÏ¢ + for(k = 0; k < arcnum; k++) { + if(fp == NULL) { + printf("µÚ %2d Ìõ±ß¼°ÆäȨֵ£º", k + 1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v2); + } else { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + skipBlank(fp); + ReadData(fp, "%c%c", &v1, &v2); + } + + // Èç¹ûÐèҪ¼Èë±ßµÄÆäËû¸½¼ÓÐÅÏ¢ + if(IncInfo) { + // ×îºó¼È븽¼ÓÐÅÏ¢(´Ë´¦ÐèҪ¼ÈëÍøµÄȨֵ) + Input(*G, &info); + } + + // ²åÈë±ß + InsertArc(G, v1, v2, info); + } + + // ´ÓÎļþÖжÁÈ¡Êý¾Ýʱ£¬×îºóÆäʵӦµ±ÅжÏÒ»ÏÂÊÇ·ñ¶Áµ½ÁË×ã¹»µÄÐÅÏ¢ + return OK; +} + +/* + * ¼Èë±ßµÄÏà¹Ø¸½¼ÓÐÅÏ¢ + */ +static void Input(AMLGraph G, InfoType** info) { + int weight; + + // ÔÚ"Íø"µÄÇéÐÎÏÂÐèҪ¼ÈëȨֵÐÅÏ¢ + if(G.kind == UDN) { + *info = (InfoType*) malloc(sizeof(InfoType)); + + if(fp == NULL) { + scanf("%d", &weight); + } else { + ReadData(fp, "%d", &weight); + } + + (*info)->weight = weight; + } +} + +/* + * ²éÕÒ + * + * ·µ»Ø¶¥µãuÔÚͼ/ÍøÖеÄλÖà + */ +int LocateVex(AMLGraph G, VertexType u) { + int i; + + for(i = 0; i < G.vexnum; i++) { + if(G.adjmulist[i].data == u) { + return i; + } + } + + return -1; +} + +/* + * ²åÈë¶¥µã + * + * ½«Ö¸¶¨µÄ¶¥µãv×·¼Óµ½¶¥µã¼¯ÖУ¬Î´½¨Á¢¸Ã¶¥µãÓëÆäËû¶¥µãµÄ¹ØÏµ + */ +Status InsertVex(AMLGraph* G, VertexType v) { + int k; + + // ¶¥µãÊý¹ý¶à + if((*G).vexnum == MAX_VERTEX_NUM) { + return ERROR; + } + + // Ê×ÏÈÐèÒªÅжϸö¥µãÊÇ·ñ´æÔÚ + k = LocateVex(*G, v); + if(k >= 0) { + return ERROR; // Ö¸¶¨µÄ¶¥µã´æÔÚʱ£¬ÎÞÐèÖØ¸´Ìí¼Ó + } + + G->adjmulist[(*G).vexnum].data = v; + G->adjmulist[(*G).vexnum].firstedge = NULL; + + (*G).vexnum++; + + return OK; +} + +/* + * ɾ³ý¶¥µã + * + * ´Ó¶¥µã¼¯ÖÐɾ³ýÖ¸¶¨µÄ¶¥µãv£¬×¢ÒâÐèÒª¸üÐÂÏà¹ØµÄ¶¥µã¹ØÏµ + */ +Status DeleteVex(AMLGraph* G, VertexType v) { + int i, k, other; + EBox* p; + EBox* pre, * r; + + // Ê×ÏÈÐèÒªÅжϸö¥µãÊÇ·ñ´æÔÚ + k = LocateVex(*G, v); + if(k == -1) { + return ERROR; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + while((p = G->adjmulist[k].firstedge) != NULL) { + if(p->ivex == k) { + G->adjmulist[k].firstedge = p->ilink; + other = p->jvex; + } else if(p->jvex == k) { + G->adjmulist[k].firstedge = p->jlink; + other = p->ivex; + } else { + // ûÓÐÆäËû¿ÉÄÜ + } + + pre = NULL; + r = G->adjmulist[other].firstedge; + + // ²éÕұߣ¬¿Ï¶¨ÄÜÕÒµ½ + while(r != NULL) { + if(r->ivex == other && r->jvex < k) { + pre = r; + r = r->ilink; + } else if(r->jvex == other && r->ivex < k) { + pre = r; + r = r->jlink; + } else { + break; + } + } + + if(r != NULL && r->ivex == other && r->jvex == k) { + if(pre == NULL) { + G->adjmulist[other].firstedge = r->ilink; + } else { + if(pre->ivex == other) { + pre->ilink = r->ilink; + } else if(pre->jvex == other) { + pre->jlink = r->ilink; + } else { + // ûÓÐÆäËû¿ÉÄÜ + } + } + } else if(r != NULL && r->jvex == other && r->ivex == k) { + if(pre == NULL) { + G->adjmulist[other].firstedge = r->jlink; + } else { + if(pre->ivex == other) { + pre->ilink = r->jlink; + } else if(pre->jvex == other) { + pre->jlink = r->jlink; + } else { + // ûÓÐÆäËû¿ÉÄÜ + } + } + } else { + // ²»»áÖÁ´Ë£¬ÒòΪ¿Ï¶¨ÄÜÕÒµ½ + } + + free(p); + + (*G).edgenum--; // ±ßÊý¼õÒ» + } + + // ϱ곬¹ýkµÄ¶¥µã£¬ÐèÒªµÝ¼õÆäϱê + for(i = k + 1; i < (*G).vexnum; i++) { + r = G->adjmulist[i].firstedge; + + while(r!=NULL){ + if(r->ivex==i) { + r->ivex--; + r = r->ilink; + } else if(r->jvex==i) { + r->jvex--; + r = r->jlink; + } else { + // ²»»áÖÁ´Ë + } + } + } + + // ¶¥µã¼¯Ç°ÒÆ + for(i = k + 1; i < (*G).vexnum; i++) { + G->adjmulist[i - 1] = G->adjmulist[i]; + } + + // ¶¥µãÊýµÝ¼õ + (*G).vexnum--; + + return OK; +} + +/* + * ¹¹ÔìÒ»¸ö±ß½áµã(½öÏÞÄÚ²¿Ê¹ÓÃ) + */ +static EBox* newEBoxPtr(VisitIf mark, int ivex, int jvex, EBox* ilink, EBox* jlink, InfoType* info) { + EBox* p = (EBox*) malloc(sizeof(EBox)); + if(!p) { + exit(OVERFLOW); + } + + p->mark = mark; + + p->ivex = ivex; + p->jvex = jvex; + + p->ilink = ilink; + p->jlink = jlink; + + p->info = info; + + return p; +} + +/* + * ²åÈë±ß + * + * µ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬ÇÒÓÉÓÚÌØÊâµÄ½á¹¹£¬Ê¹µÃ²åÈëÒ»Ìõ±ßʱֻÐèÒªÔö¼ÓÒ»¶Ô¶¥µã¹ØÏµ£¬±ßµÄÊýÁ¿ÒÀÈ»ÔöÒ»¡£ + * ¶ÔÓÚͼ/ÍøÀ´Ëµ£¬¿ÉÒÔÔڿɱä²ÎÊýÖÐÁгö±ßµÄ¸½¼ÓÐÅÏ¢¡£ + * + * ×¢£º´Ë´¦½ÓÊյIJÎÊýÓëMGraphÓÐЩ²»Ò»Ñù£ºÍøµÄ¸½¼ÓÐÅÏ¢Öаüº¬Á˸÷Ìõ±ßµÄȨֵ¡£ + */ +Status InsertArc(AMLGraph* G, VertexType v, VertexType w, ...) { + int tail, head, k; + EBox* p; + EBox* pre; + EBox* r; + Boolean overlay = FALSE; // ÊÇ·ñΪ¸²¸ÇÌí¼Ó + InfoType* info = NULL; // ±ßµÄ¸½¼ÓÐÅÏ¢ + va_list ap; + + tail = LocateVex(*G, v); // »ñÈ¡¶¥µãvÔÚ¶¥µã¼¯ÖеÄλÖà + if(tail == -1) { + return ERROR; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + head = LocateVex(*G, w); // »ñÈ¡¶¥µãwÔÚ¶¥µã¼¯ÖеÄλÖà + if(head == -1) { + return ERROR; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + // ¾Ü¾ø»· + if(tail == head) { + return ERROR; + } + + // Èç¹û±ßÉÏ´æÔÚ¸½¼ÓÐÅÏ¢ + if(IncInfo) { + va_start(ap, w); // ÔÚwºó²éѯÊ׸ö¿É±ä²ÎÊý + info = va_arg(ap, InfoType*); // »ñÈ¡¸½¼ÓÐÅÏ¢ + va_end(ap); + } + + /* ½ÓÏÂÀ´£¬ÐèÒª²éÕÒºÏÊʵIJåÈëλÖà */ + + pre = NULL; + r = G->adjmulist[tail].firstedge; + + while(r != NULL) { + if(r->ivex == tail && r->jvex < head) { + pre = r; + r = r->ilink; + } else if(r->jvex == tail && r->ivex < head) { + pre = r; + r = r->jlink; + } else { + break; + } + } + + if(r != NULL && r->ivex == tail && r->jvex == head) { + r->info = info; // ¸´Óøýáµã + overlay = TRUE; // ·¢ÉúÁ˸²¸Ç + } else if(r != NULL && r->jvex == tail && r->ivex == head) { + r->info = info; // ¸´Óøýáµã + overlay = TRUE; // ·¢ÉúÁ˸²¸Ç + } else { + p = newEBoxPtr(unvisit, tail, head, r, NULL, info); + + if(pre == NULL) { + G->adjmulist[tail].firstedge = p; + } else { + if(pre->ivex == tail) { + pre->ilink = p; + } else if(pre->jvex == tail) { + pre->jlink = p; + } else { + // ûÓÐÆäËû¿ÉÄÜ + } + } + } + + if(!overlay) { + pre = NULL; + r = G->adjmulist[head].firstedge; + + while(r != NULL) { + if(r->ivex == head && r->jvex < tail) { + pre = r; + r = r->ilink; + } else if(r->jvex == head && r->ivex < tail) { + pre = r; + r = r->jlink; + } else { + break; + } + } + + p->jlink = r; + + if(pre == NULL) { + G->adjmulist[head].firstedge = p; + } else { + if(pre->ivex == head) { + pre->ilink = p; + } else if(pre->jvex == head) { + pre->jlink = p; + } else { + // ûÓÐÆäËû¿ÉÄÜ + } + } + } + + (*G).edgenum++; // ±ßÊýÔöÒ» + + return OK; +} + +/* + * ɾ³ý±ß + */ +Status DeleteArc(AMLGraph* G, VertexType v, VertexType w) { + int tail, head; + EBox* r; + EBox* pre; + + tail = LocateVex(*G, v); + if(tail == -1) { + return ERROR; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + head = LocateVex(*G, w); + if(head == -1) { + return ERROR; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + pre = NULL; + r = G->adjmulist[tail].firstedge; + + while(r != NULL) { + if(r->ivex == tail && r->jvex < head) { + pre = r; + r = r->ilink; + } else if(r->jvex == tail && r->ivex < head) { + pre = r; + r = r->jlink; + } else { + break; + } + } + + if(r != NULL && r->ivex == tail && r->jvex == head) { + if(pre == NULL) { + G->adjmulist[tail].firstedge = r->ilink; + } else { + if(pre->ivex == tail) { + pre->ilink = r->ilink; + } else if(pre->jvex == tail) { + pre->jlink = r->ilink; + } else { + // ûÓÐÆäËû¿ÉÄÜ + } + } + } else if(r != NULL && r->jvex == tail && r->ivex == head) { + if(pre == NULL) { + G->adjmulist[tail].firstedge = r->jlink; + } else { + if(pre->ivex == tail) { + pre->ilink = r->jlink; + } else if(pre->jvex == tail) { + pre->jlink = r->jlink; + } else { + // ûÓÐÆäËû¿ÉÄÜ + } + } + } else { + return ERROR; // δÕÒµ½ + } + + + pre = NULL; + r = G->adjmulist[head].firstedge; + + while(r != NULL) { + if(r->ivex == head && r->jvex < tail) { + pre = r; + r = r->ilink; + } else if(r->jvex == head && r->ivex < tail) { + pre = r; + r = r->jlink; + } else { + break; + } + } + + if(r != NULL && r->ivex == head && r->jvex == tail) { + if(pre == NULL) { + G->adjmulist[head].firstedge = r->ilink; + } else { + if(pre->ivex == head) { + pre->ilink = r->ilink; + } else if(pre->jvex == head) { + pre->jlink = r->ilink; + } else { + // ûÓÐÆäËû¿ÉÄÜ + } + } + } else if(r != NULL && r->jvex == head && r->ivex == tail) { + if(pre == NULL) { + G->adjmulist[head].firstedge = r->jlink; + } else { + if(pre->ivex == head) { + pre->ilink = r->jlink; + } else if(pre->jvex == head) { + pre->jlink = r->jlink; + } else { + // ûÓÐÆäËû¿ÉÄÜ + } + } + } else { + // ²»»áÖÁ´Ë£¬ÒòÎªÇ°ÃæÕÒµ½ÁË£¬´Ë´¦¿Ï¶¨Ò²ÄÜÕÒµ½ + } + + free(r); // ÊÍ·ÅÄÚ´æ + + (*G).edgenum--; // ±ßÊý¼õÒ» + + return OK; +} + +/* + * ÒÔͼÐλ¯ÐÎʽÊä³öµ±Ç°½á¹¹ + */ +void PrintGraph(AMLGraph G) { + int i, cur, pos; + EBox* p; + + if(G.vexnum == 0) { + printf("¿Õͼ£¬ÎÞÐè´òÓ¡£¡\n"); + return; + } + + printf("µ±Ç°Í¼/Íø°üº¬ %2d ¸ö¶¥µã£¬ %2d Ìõ±ß...\n", G.vexnum, G.edgenum); + + for(i = 0; i < G.vexnum; i++) { + printf("%c ===> ", G.adjmulist[i].data); + + cur = 0; + p = G.adjmulist[i].firstedge; + + while(p != NULL) { + if(p->ivex == i) { + pos = p->jvex; + } else { + pos = p->ivex; + } + + if(cur < pos) { + if(IncInfo == 0) { + printf(" "); + + // ¶ÔÓÚÍø£¬»á´ÓÆä¸½¼ÓÐÅÏ¢ÖлñÈ¡µ½È¨Öµ + } else { + printf(" "); + } + } else { + if(IncInfo == 0) { + printf("%c", G.adjmulist[pos].data); + + // ¶ÔÓÚÍø£¬»á´ÓÆä¸½¼ÓÐÅÏ¢ÖлñÈ¡µ½È¨Öµ + } else { + printf("%c[%2d]", G.adjmulist[pos].data, p->info->weight); + } + + if(p->ivex == i) { + p = p->ilink; + } else { + p = p->jlink; + } + } + + cur++; + + if(p != NULL) { + printf(" "); + } + } + + printf("\n"); + } +} diff --git a/VisualC++/ExerciseBook/07.18-07.19/AMLGraph.h b/VisualC++/ExerciseBook/07.18-07.19/AMLGraph.h new file mode 100644 index 0000000..5045840 --- /dev/null +++ b/VisualC++/ExerciseBook/07.18-07.19/AMLGraph.h @@ -0,0 +1,162 @@ +/*===================== + * ͼµÄÁÚ½Ó¶àÖØ±í´æ´¢±íʾ + ======================*/ + +#ifndef AMLGRAPH_H +#define AMLGRAPH_H + +#include +#include // Ìṩmemset¡¢strcmp Ô­ÐÍ +#include // Ìṩºêva_list¡¢va_start¡¢va_arg¡¢va_end +#include // Ìṩmalloc¡¢realloc¡¢free¡¢exitÔ­ÐÍ +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// + +/* + * ×¢£º + * + * ͨ³£À´½²£¬ÎÞȨͼ±»¼ò³ÆÎª¡¾Í¼¡¿£¬ÓÐȨͼ±»¼ò³ÆÎª¡¾Íø¡¿¡£ + * ÎÞÏòͼ/ÍøÖеĶ¥µã¹ØÏµ±»³ÆÎª¡¾±ß¡¿£¬ÓÐÏòͼ/ÍøÖеĶ¥µã¹ØÏµ±»³ÆÎª¡¾»¡¡¿£¬²¢Çø·Ö»¡Í·Ó뻡β¡£ + * ʵ¼Ê±íÊöÖУ¬Î´±Ø»áÑϸñ×ñÊØÒÔÉÏÃüÃû¡£ + * + * µ±Ç°½á¹¹Êʺϴ洢ÎÞÏòͼ/Íø¡£ + * + * ¡ï ²åÈë±ß/»¡µÄÐÅϢʱ£¬ÕâÀïµÄʵÏÖÊǰ´"ÉýÐò"²åÈëµÄ£¬ÕâʹµÃ²åÈëµÄ»¡Êǰ´"ÉýÐò"ÅÅÁеġ£ + */ + + +/* ºê¶¨Òå */ +#define MAX_VERTEX_NUM 26 // ×î´ó¶¥µã¸öÊý + + +// ͼµÄÀàÐÍ +// ͼµÄÀàÐÍ +typedef enum { + DG, // 0-ÓÐÏòͼ£»´Ë´¦²»Ö§³Ö + DN, // 1-ÓÐÏòÍø(´øÈ¨Öµ)£»´Ë´¦²»Ö§³Ö + UDG, // 2-ÎÞÏòͼ + UDN // 3-ÎÞÏòÍø(´øÈ¨Öµ) +} GraphKind; + + +/* ÎÞÏòͼ£¨ÁÚ½Ó¶àÖØ±í£©ÀàÐͶ¨Òå */ +typedef enum { + unvisit, visit +} VisitIf; + +// ¶¥µãÀàÐÍ +typedef char VertexType; + +// ±ßµÄÏà¹Ø¸½¼ÓÐÅÏ¢ +typedef struct { + /* + * ×¢£º + * ½Ì²ÄÖиø³öµÄ½á¹¹Ö»¿¼ÂÇÁËÎÞȨͼ£¬¶øÃ»¿¼ÂÇÓÐȨͼ(Íø)¡£ + * ÕâÀïΪÁ˰ѡ°Íø¡±µÄÇéÐÎÒ²¿¼ÂǽøÈ¥£¬ÌØÔÚ¸½¼ÓÐÅÏ¢ÖÐÔö¼ÓÁË"È¨ÖØ"ÊôÐÔ¡£ + */ + int weight; +} InfoType; + +/* ±ß½áµã */ +typedef struct EBox { + VisitIf mark; // ·ÃÎʱê¼Ç + int ivex; // ¸Ã±ßÒÀ¸½µÄÁ½¸ö¶¥µãµÄλÖà + int jvex; // ¸Ã±ßÒÀ¸½µÄÁ½¸ö¶¥µãµÄλÖà + struct EBox* ilink; // ·Ö±ðÖ¸ÏòÒÀ¸½ÕâÁ½¸ö¶¥µãµÄÏÂÒ»Ìõ±ß + struct EBox* jlink; // ·Ö±ðÖ¸ÏòÒÀ¸½ÕâÁ½¸ö¶¥µãµÄÏÂÒ»Ìõ±ß + InfoType* info; +} EBox; + +// ÿ¸öÁ´±íµÄÍ·½áµã +typedef struct VexBox { + VertexType data; // ¶¥µãÐÅÏ¢ + EBox* firstedge; // Ö¸ÏòµÚÒ»ÌõÒÀ¸½¸Ã¶¥µãµÄ±ßµÄÖ¸Õë +} VexBox; + +/* ͼµÄÁÚ½Ó¶àÖØ±í´æ´¢±íʾÀàÐͶ¨Òå */ +typedef struct { + VexBox adjmulist[MAX_VERTEX_NUM]; // ±íÍ·ÏòÁ¿ + int vexnum, edgenum; // ͼ/ÍøµÄ¶¥µãÊýºÍ±ßÊý + GraphKind kind; // ͼµÄÀàÐͱêÖ¾ +} AMLGraph; + + +// ±ß/»¡ÉÏÊÇ·ñ´æÔÚ¸½¼ÓÐÅÏ¢ +extern Boolean IncInfo; + + +/* + * ´´½¨ + * + *¡¾±¸×¢¡¿ + * + * ½Ì²ÄÖÐĬÈÏ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý¡£ + * ÕâÀïΪÁË·½±ã²âÊÔ£¬±ÜÃâÿ´ÎÔËÐж¼ÊÖ¶¯ÊäÈëÊý¾Ý£¬ + * Òò¶øÔÊÐíÑ¡Ôñ´ÓÔ¤ÉèµÄÎļþpathÖжÁÈ¡²âÊÔÊý¾Ý¡£ + * + * Èç¹ûÐèÒª´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý£¬ÔòpathΪNULL£¬»òpath[kind]Ϊ""¡£ + * Èç¹ûÐèÒª´ÓÎļþÖжÁÈ¡Êý¾Ý£¬ÔòÐèÒªÔÚpathÖÐÌîдÎļþÃûÐÅÏ¢¡£ + */ +Status CreateGraph(AMLGraph* G, char* path[]); + +/* + * ¹¹ÔìÎÞÏòͼ + */ +static Status CreateUDG(AMLGraph* G); + +/* + * ¹¹ÔìÎÞÏòÍø + */ +static Status CreateUDN(AMLGraph* G); + +/* + * ¼Èë±ßµÄÏà¹Ø¸½¼ÓÐÅÏ¢ + */ +static void Input(AMLGraph G, InfoType** info); + +/* + * ²éÕÒ + * + * ·µ»Ø¶¥µãuÔÚͼ/ÍøÖеÄλÖà + */ +int LocateVex(AMLGraph G, VertexType u); + +/* + * ²åÈë¶¥µã + * + * ½«Ö¸¶¨µÄ¶¥µãv×·¼Óµ½¶¥µã¼¯ÖУ¬Î´½¨Á¢¸Ã¶¥µãÓëÆäËû¶¥µãµÄ¹ØÏµ + */ +Status InsertVex(AMLGraph* G, VertexType v); + +/* + * ɾ³ý¶¥µã + * + * ´Ó¶¥µã¼¯ÖÐɾ³ýÖ¸¶¨µÄ¶¥µãv£¬×¢ÒâÐèÒª¸üÐÂÏà¹ØµÄ¶¥µã¹ØÏµ + */ +Status DeleteVex(AMLGraph* G, VertexType v); + +/* + * ¹¹ÔìÒ»¸ö±ß½áµã(½öÏÞÄÚ²¿Ê¹ÓÃ) + */ +static EBox* newEBoxPtr(VisitIf mark, int ivex, int jvex, EBox* ilink, EBox* jlink, InfoType* info); + +/* + * ²åÈë±ß + * + * µ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬ÇÒÓÉÓÚÌØÊâµÄ½á¹¹£¬Ê¹µÃ²åÈëÒ»Ìõ±ßʱֻÐèÒªÔö¼ÓÒ»¶Ô¶¥µã¹ØÏµ£¬±ßµÄÊýÁ¿ÒÀÈ»ÔöÒ»¡£ + * ¶ÔÓÚͼ/ÍøÀ´Ëµ£¬¿ÉÒÔÔڿɱä²ÎÊýÖÐÁгö±ßµÄ¸½¼ÓÐÅÏ¢¡£ + * + * ×¢£º´Ë´¦½ÓÊյIJÎÊýÓëMGraphÓÐЩ²»Ò»Ñù£ºÍøµÄ¸½¼ÓÐÅÏ¢Öаüº¬Á˸÷Ìõ±ßµÄȨֵ¡£ + */ +Status InsertArc(AMLGraph* G, VertexType v, VertexType w, ...); + +/* + * ɾ³ý±ß + */ +Status DeleteArc(AMLGraph* G, VertexType v, VertexType w); + +/* + * ÒÔͼÐλ¯ÐÎʽÊä³öµ±Ç°½á¹¹ + */ +void PrintGraph(AMLGraph G); + +#endif diff --git a/VisualC++/ExerciseBook/07.18-07.19/TestData_UDG.txt b/VisualC++/ExerciseBook/07.18-07.19/TestData_UDG.txt new file mode 100644 index 0000000..6c08d74 --- /dev/null +++ b/VisualC++/ExerciseBook/07.18-07.19/TestData_UDG.txt @@ -0,0 +1,6 @@ +ͼÀàÐÍ¡ú2£¨ÎÞÏòͼ£© +¶¥µãÊý¡ú6 +±ßÊý¡ú13 +±ßÊÇ·ñ´øÓÐÆäËûÐÅÏ¢¡ú0 +¶¥µã¼¯¡ú¡¾A£¬X£¬B£¬C£¬D£¬E¡¿ +±ßµÄ¼¯ºÏ¡ú¡¾A£¬B¡¿¡¾A£¬C¡¿¡¾A£¬D¡¿¡¾B£¬C¡¿¡¾B£¬D¡¿¡¾B£¬E¡¿¡¾C£¬E¡¿¡¾C£¬X¡¿¡¾E£¬A¡¿¡¾E£¬D¡¿¡¾E£¬X¡¿¡¾X£¬A¡¿¡¾X£¬D¡¿ \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.18-07.19/TestData_UDN.txt b/VisualC++/ExerciseBook/07.18-07.19/TestData_UDN.txt new file mode 100644 index 0000000..2117df2 --- /dev/null +++ b/VisualC++/ExerciseBook/07.18-07.19/TestData_UDN.txt @@ -0,0 +1,6 @@ +ͼÀàÐÍ¡ú3£¨ÎÞÏòÍø£© +¶¥µãÊý¡ú6 +±ßÊý¡ú13 +±ßÊÇ·ñ´øÓÐÆäËûÐÅÏ¢¡ú1 +¶¥µã¼¯¡ú¡¾A£¬X£¬B£¬C£¬D£¬E¡¿ +±ßµÄ¼¯ºÏ¡ú¡¾A£¬B£¬3¡¿¡¾A£¬C£¬8¡¿¡¾A£¬D£¬11¡¿¡¾B£¬C£¬7¡¿¡¾B£¬D£¬4¡¿¡¾B£¬E£¬1¡¿¡¾C£¬E£¬17¡¿¡¾C£¬X£¬3¡¿¡¾E£¬A£¬6¡¿¡¾E£¬D£¬4¡¿¡¾E£¬X£¬2¡¿¡¾X£¬A£¬8¡¿¡¾X£¬D£¬10¡¿ \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.20/07.20.c b/VisualC++/ExerciseBook/07.20/07.20.c new file mode 100644 index 0000000..8412f5a --- /dev/null +++ b/VisualC++/ExerciseBook/07.20/07.20.c @@ -0,0 +1,78 @@ +#include +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// +#include "MGraph.h" //**¡ø07 ͼ**// + +/* + * ÅжÏͼGÊÇ·ñ¿É´«µÝ + */ +Status Algo_7_20(MGraph G); + + +int main(int argc, char* argv[]) { + MGraph G; + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ´´½¨²¢Êä³öͼ...\n"); + { + char* path[4]; + + path[0] = "TestData_DG.txt"; + path[1] = "TestData_DN.txt"; + path[2] = "TestData_UDG.txt"; + path[3] = "TestData_UDN.txt"; + + CreateGraph(&G, path); + PrintGraph(G); + printf("\n"); + } + + Algo_7_20(G) ? printf("ͼG¿É´«µÝ£¡\n") : printf("ͼG²»¿É´«µÝ£¡\n"); + printf("\n"); + + return 0; +} + + +/* + * ÅжÏͼGÊÇ·ñ¿É´«µÝ + */ +Status Algo_7_20(MGraph G) { + Status trans; + int x, y, z; + int flag; // ²»Á¬Í¨µÄ±ê¼Ç + + // ¶ÔÓÚͼ£¬²»Á¬Í¨±ê¼ÇÊÇ0 + if(G.kind == DG || G.kind == UDG) { + flag = 0; + + // ¶ÔÓÚÍø£¬²»Á¬Í¨±ê¼ÇÊÇINFINITE + } else if(G.kind == DN || G.kind == UDN) { + flag = INFINITE; + } else { + return ERROR; + } + + // Ô¤ÉèΪ¿É´«µÝ + trans = TRUE; + + // ¶ÔÓÚVÖÐÿ¸öx + for(x = 0; x < G.vexnum; x++) { + // N(x)ÖÐÿ¸öy + for(y = 0; y < G.vexnum; y++) { + if(G.arcs[x][y].adj != flag) { + // N(y)Öв»µÈÓÚxµÄÿ¸öz + for(z = 0; z < G.vexnum; z++) { + if(G.arcs[y][z].adj != flag && z != x) { + // z²»ÔÚN(x)ÖÐ + if(G.arcs[x][z].adj == flag) { + // ²»¿É´«µÝ + trans = FALSE; + return trans; + } + } + } + } + } + } + + return trans; +} diff --git a/VisualC++/ExerciseBook/07.20/07.20.png b/VisualC++/ExerciseBook/07.20/07.20.png new file mode 100644 index 0000000000000000000000000000000000000000..29a4418760cc5fd0d0e3904258af3a0fd49246d9 GIT binary patch literal 16161 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 literal 0 HcmV?d00001 diff --git a/VisualC++/ExerciseBook/07.20/07.20.vcxproj b/VisualC++/ExerciseBook/07.20/07.20.vcxproj new file mode 100644 index 0000000..8cb0615 --- /dev/null +++ b/VisualC++/ExerciseBook/07.20/07.20.vcxproj @@ -0,0 +1,82 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {6B15728F-E00B-46B5-8961-E407695ABF7C} + My0720 + + + + Application + true + MultiByte + + + Application + false + true + MultiByte + + + + + + + + + + + + + $(SolutionDir)\..\Status;$(IncludePath) + + + + Level3 + Disabled + + + true + $(SolutionDir)\..\Status\Status.lib;%(AdditionalDependencies) + Console + + + + + Level3 + MaxSpeed + true + true + + + true + true + true + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.20/07.20.vcxproj.filters b/VisualC++/ExerciseBook/07.20/07.20.vcxproj.filters new file mode 100644 index 0000000..5e6e5d1 --- /dev/null +++ b/VisualC++/ExerciseBook/07.20/07.20.vcxproj.filters @@ -0,0 +1,44 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + æºæ–‡ä»¶ + + + æºæ–‡ä»¶ + + + + + 头文件 + + + + + èµ„æºæ–‡ä»¶ + + + èµ„æºæ–‡ä»¶ + + + èµ„æºæ–‡ä»¶ + + + èµ„æºæ–‡ä»¶ + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.20/07.20.vcxproj.user b/VisualC++/ExerciseBook/07.20/07.20.vcxproj.user new file mode 100644 index 0000000..ace9a86 --- /dev/null +++ b/VisualC++/ExerciseBook/07.20/07.20.vcxproj.user @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.20/MGraph.c b/VisualC++/ExerciseBook/07.20/MGraph.c new file mode 100644 index 0000000..b6219a9 --- /dev/null +++ b/VisualC++/ExerciseBook/07.20/MGraph.c @@ -0,0 +1,482 @@ +/*================================= + * ͼµÄÊý×é(ÁÚ½Ó¾ØÕó)´æ´¢±íʾ + * + * °üº¬Ëã·¨: 7.1¡¢7.2¡¢7.4¡¢7.5¡¢7.6 + ==================================*/ + +#include "MGraph.h" //**¡ø07 ͼ**// + +// ¼ÈëÊý¾ÝµÄÔ´Îļþ£»fpΪnullʱ£¬ËµÃ÷ÐèÒª´Ó¿ØÖÆÌ¨Â¼Èë +static FILE* fp = NULL; + +/* + * IncInfoָʾ¸Ãͼ/ÍøµÄ±ß/»¡ÉÏÊÇ·ñ´æÔÚ¸½¼ÓÐÅÏ¢¡£ + * Èç¹ûÆäÖµ²»Îª0£¬Ôò±íʾÎÞ¸½¼ÓÐÅÏ¢£¬·ñÔò£¬±íʾ´æÔÚ¸½¼ÓÐÅÏ¢¡£ + */ +Boolean IncInfo = FALSE; + +// ·ÃÎʱêÖ¾Êý×飬¼Ç¼·ÃÎʹýµÄ¶¥µã +static Boolean visited[MAX_VERTEX_NUM]; + +// º¯Êý±äÁ¿ +static Status (* VisitFunc)(VertexType e); + + +/* + * ¨€¨€¨€¨€¨€¨€¨€¨€ Ëã·¨7.1 ¨€¨€¨€¨€¨€¨€¨€¨€ + * + * ´´½¨Í¼/±í + * + *¡¾±¸×¢¡¿ + * + * ½Ì²ÄÖÐĬÈÏ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý¡£ + * ÕâÀïΪÁË·½±ã²âÊÔ£¬±ÜÃâÿ´ÎÔËÐж¼ÊÖ¶¯ÊäÈëÊý¾Ý£¬ + * Òò¶øÔÊÐíÑ¡Ôñ´ÓÔ¤ÉèµÄÎļþpathÖжÁÈ¡²âÊÔÊý¾Ý¡£ + * + * Èç¹ûÐèÒª´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý£¬ÔòpathΪNULL£¬»òpath[kind]Ϊ""¡£ + * Èç¹ûÐèÒª´ÓÎļþÖжÁÈ¡Êý¾Ý£¬ÔòÐèÒªÔÚpathÖÐÌîдÎļþÃûÐÅÏ¢¡£ + */ +Status CreateGraph(MGraph* G, char* path[]) { + int readFromConsole; // ÊÇ·ñ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý + int kind; + Status flag; + + printf("ÇëÊäÈëͼµÄÀàÐÍ(0-ÓÐÏòͼ ©¦ 1-ÓÐÏòÍø ©¦ 2-ÎÞÏòͼ ©¦ 3-ÎÞÏòÍø)£º"); + scanf("%d", &kind); + + // ÀàÐͲ»ºÏ¹æ + if(kind < 0 || kind > 3) { + return ERROR; + } + + // Èç¹ûûÓÐÎļþ·¾¶ÐÅÏ¢£¬Ôò´Ó¿ØÖÆÌ¨¶ÁÈ¡ÊäÈë + readFromConsole = (path == NULL) || strcmp(path[kind], "") == 0; + + // ÐèÒª´ÓÎļþ¶ÁÈ¡ + if(readFromConsole) { + (*G).kind = kind; // ¼Ç¼ͼ/ÍøµÄÀàÐÍ + } else { + // ´ò¿ªÎļþ£¬×¼±¸¶ÁÈ¡²âÊÔÊý¾Ý + fp = fopen(path[kind], "r"); + if(fp == NULL) { + return ERROR; + } + + // ¼ÈëͼµÄÀàÐÍ + ReadData(fp, "%d", &((*G).kind)); + } + + // Ëæ»ú´´½¨ÓÐÏòͼ/Íø»òÎÞÏòͼ/ÍøµÄÒ»ÖÖ + switch((*G).kind) { + case DG: + flag = CreateDG(G); + break; + case DN: + flag = CreateDN(G); + break; + case UDG: + flag = CreateUDG(G); + break; + case UDN: + flag = CreateUDN(G); + break; + default: + flag = ERROR; + break; + } + + if(fp != NULL) { + fclose(fp); + fp = NULL; + } + + return flag; +} + +/* + * ¹¹ÔìÓÐÏòͼ + */ +static Status CreateDG(MGraph* G) { + int i, j, k; + ArcCell arcs = {0, NULL}; // ÓÐÏòͼÿÌõ±ßµÄ³õʼֵ + VertexType v1, v2; + + if(fp == NULL) { + printf("ÇëÊäÈëÓÐÏòͼµÄ¶¥µãÊý£º"); + scanf("%d", &((*G).vexnum)); + printf("ÇëÊäÈëÓÐÏòͼµÄ»¡Êý£º"); + scanf("%d", &((*G).arcnum)); + printf("¸ÃÓÐÏòͼµÄ»¡ÉÏÊÇ·ñ°üº¬ÆäËû¸½¼ÓÐÅÏ¢(0-²»°üº¬©¦1-°üº¬)£º"); + scanf("%d", &IncInfo); + + // ¼Èë¶¥µã¼¯ + printf("Çë¼Èë %d ¸ö¶¥µã£¬²»Í¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º", (*G).vexnum); + for(i = 0; i < (*G).vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(stdin); + scanf("%c", &((*G).vexs[i])); + } + } else { + ReadData(fp, "%d", &((*G).vexnum)); // ¼Èë¶¥µãÊý + ReadData(fp, "%d", &((*G).arcnum)); // ¼È뻡Êý + ReadData(fp, "%d", &IncInfo); // Åжϻ¡ÉÏÊÇ·ñ°üº¬¸½¼ÓÐÅÏ¢ + + // ¼Èë¶¥µã¼¯ + for(i = 0; i < (*G).vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(fp); + ReadData(fp, "%c", &((*G).vexs[i])); + } + } + + // ³õʼ»¯ÓÐÏòͼµÄÁÚ½Ó¾ØÕó + for(i = 0; i < (*G).vexnum; i++) { + for(j = 0; j < (*G).vexnum; j++) { + (*G).arcs[i][j] = arcs; + } + } + + // ½öÔÚ¿ØÖÆÌ¨Â¼ÈëÐÅϢʱÊä³ö´ËÌáʾ + if(fp == NULL && (*G).arcnum != 0) { + printf("ÇëΪÓÐÏòͼÒÀ´Î¼Èë %d Ìõ»¡µÄÐÅÏ¢£¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º\n", (*G).arcnum); + } + + // ¼È뻡µÄÐÅÏ¢ + for(k = 0; k < (*G).arcnum; k++) { + if(fp == NULL) { + printf("µÚ %2d Ìõ»¡£º", k + 1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v2); + } else { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + skipBlank(fp); + ReadData(fp, "%c%c", &v1, &v2); + } + + i = LocateVex(*G, v1); // »ñÈ¡¶¥µãv1ÔÚ¶¥µã¼¯ÖеÄλÖà + j = LocateVex(*G, v2); // »ñÈ¡¶¥µãv2ÔÚ¶¥µã¼¯ÖеÄλÖà + + // ½«Ö¸¶¨µÄ¶¥µã¹ØÏµÉèÖÃΪ1£¬Ö¸Ê¾ÕâÁ½¸ö¶¥µãÊÇÖ±½ÓÁ¬½ÓµÄ(×¢£ºÕâÀïûÓÐÑé֤ϱêÊÇ·ñÔ½½ç) + (*G).arcs[i][j].adj = 1; + + // Èç¹ûÐèҪ¼È뻡µÄÆäËû¸½¼ÓÐÅÏ¢ + if(IncInfo) { + // ×îºó¼È븽¼ÓÐÅÏ¢ + Input(*G, &((*G).arcs[i][j].info)); + } + } + + // ´ÓÎļþÖжÁÈ¡Êý¾Ýʱ£¬×îºóÆäʵӦµ±ÅжÏÒ»ÏÂÊÇ·ñ¶Áµ½ÁË×ã¹»µÄÐÅÏ¢ + return OK; +} + +/* + * ¹¹ÔìÓÐÏòÍø + */ +static Status CreateDN(MGraph* G) { + int i, j, k; + ArcCell arcs = {INFINITE, NULL}; // ÓÐÏòÍøÃ¿Ìõ»¡µÄ³õʼֵ + VertexType v1, v2; + VRType w; + + if(fp == NULL) { + printf("ÇëÊäÈëÓÐÏòÍøµÄ¶¥µãÊý£º"); + scanf("%d", &((*G).vexnum)); + printf("ÇëÊäÈëÓÐÏòÍøµÄ»¡Êý£º"); + scanf("%d", &((*G).arcnum)); + printf("¸ÃÓÐÏòÍøµÄ»¡ÉÏÊÇ·ñ°üº¬ÆäËû¸½¼ÓÐÅÏ¢(0-²»°üº¬©¦1-°üº¬)£º"); + scanf("%d", &IncInfo); + + // ¼Èë¶¥µã¼¯ + printf("Çë¼Èë %d ¸ö¶¥µã£¬²»Í¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º", (*G).vexnum); + for(i = 0; i < (*G).vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(stdin); + scanf("%c", &((*G).vexs[i])); + } + } else { + ReadData(fp, "%d", &((*G).vexnum)); // ¼Èë¶¥µãÊý + ReadData(fp, "%d", &((*G).arcnum)); // ¼È뻡Êý + ReadData(fp, "%d", &IncInfo); // Åжϻ¡ÉÏÊÇ·ñ°üº¬¸½¼ÓÐÅÏ¢ + + // ¼Èë¶¥µã¼¯ + for(i = 0; i < (*G).vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(fp); + ReadData(fp, "%c", &((*G).vexs[i])); + } + } + + // ³õʼ»¯ÓÐÏòÍøµÄÁÚ½Ó¾ØÕó + for(i = 0; i < (*G).vexnum; i++) { + for(j = 0; j < (*G).vexnum; j++) { + (*G).arcs[i][j] = arcs; + } + } + + // ½öÔÚ¿ØÖÆÌ¨Â¼ÈëÐÅϢʱÊä³ö´ËÌáʾ + if(fp == NULL && (*G).arcnum != 0) { + printf("ÇëΪÓÐÏòÍøÒÀ´Î¼Èë %d Ìõ»¡(´øÈ¨Öµ)µÄÐÅÏ¢£¬¶¥µã¼°È¨ÖµÖ®¼äÓÿոñ¸ô¿ª£º\n", (*G).arcnum); + } + + // ¼È뻡µÄÐÅÏ¢ + for(k = 0; k < (*G).arcnum; k++) { + if(fp == NULL) { + printf("µÚ %2d Ìõ»¡¼°ÆäȨֵ£º", k + 1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v2); + scanf("%d", &w); + } else { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + skipBlank(fp); + ReadData(fp, "%c%c%d", &v1, &v2, &w); + } + + i = LocateVex(*G, v1); // »ñÈ¡¶¥µãv1ÔÚ¶¥µã¼¯ÖеÄλÖà + j = LocateVex(*G, v2); // »ñÈ¡¶¥µãv2ÔÚ¶¥µã¼¯ÖеÄλÖà + + // ÔÚÖ¸¶¨µÄ¶¥µã¹ØÏµÉϼǼȨֵ(×¢£ºÕâÀïûÓÐÑé֤ϱêÊÇ·ñÔ½½ç) + (*G).arcs[i][j].adj = w; + + // Èç¹ûÐèҪ¼È뻡µÄÆäËû¸½¼ÓÐÅÏ¢ + if(IncInfo) { + // ×îºó¼È븽¼ÓÐÅÏ¢ + Input(*G, &((*G).arcs[i][j].info)); + } + } + + // ´ÓÎļþÖжÁÈ¡Êý¾Ýʱ£¬×îºóÆäʵӦµ±ÅжÏÒ»ÏÂÊÇ·ñ¶Áµ½ÁË×ã¹»µÄÐÅÏ¢ + return OK; +} + +/* + * ¹¹ÔìÎÞÏòͼ + */ +static Status CreateUDG(MGraph* G) { + int i, j, k; + ArcCell arcs = {0, NULL}; // ÎÞÏòͼÿÌõ±ßµÄ³õʼֵ + VertexType v1, v2; + + if(fp == NULL) { + printf("ÇëÊäÈëÎÞÏòͼµÄ¶¥µãÊý£º"); + scanf("%d", &((*G).vexnum)); + printf("ÇëÊäÈëÎÞÏòͼµÄ±ßÊý£º"); + scanf("%d", &((*G).arcnum)); + printf("¸ÃÎÞÏòͼµÄ±ßÉÏÊÇ·ñ°üº¬ÆäËû¸½¼ÓÐÅÏ¢(0-²»°üº¬©¦1-°üº¬)£º"); + scanf("%d", &IncInfo); + + // ¼Èë¶¥µã¼¯ + printf("Çë¼Èë %d ¸ö¶¥µã£¬²»Í¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º", (*G).vexnum); + for(i = 0; i < (*G).vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(stdin); + scanf("%c", &((*G).vexs[i])); + } + } else { + ReadData(fp, "%d", &((*G).vexnum)); // ¼Èë¶¥µãÊý + ReadData(fp, "%d", &((*G).arcnum)); // ¼Èë±ßÊý + ReadData(fp, "%d", &IncInfo); // ÅжϱßÉÏÊÇ·ñ°üº¬¸½¼ÓÐÅÏ¢ + + // ¼Èë¶¥µã¼¯ + for(i = 0; i < (*G).vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(fp); + ReadData(fp, "%c", &((*G).vexs[i])); + } + } + + // ³õʼ»¯ÎÞÏòͼµÄÁÚ½Ó¾ØÕó + for(i = 0; i < (*G).vexnum; i++) { + for(j = 0; j < (*G).vexnum; j++) { + (*G).arcs[i][j] = arcs; + } + } + + // ½öÔÚ¿ØÖÆÌ¨Â¼ÈëÐÅϢʱÊä³ö´ËÌáʾ + if(fp == NULL && (*G).arcnum != 0) { + printf("ÇëΪÎÞÏòͼÒÀ´Î¼Èë %d Ìõ±ßµÄÐÅÏ¢£¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º\n", (*G).arcnum); + } + + // ¼Èë±ßµÄÐÅÏ¢ + for(k = 0; k < (*G).arcnum; k++) { + if(fp == NULL) { + printf("µÚ %2d Ìõ±ß£º", k + 1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v2); + } else { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + skipBlank(fp); + ReadData(fp, "%c%c", &v1, &v2); + } + + i = LocateVex(*G, v1); // »ñÈ¡¶¥µãv1ÔÚ¶¥µã¼¯ÖеÄλÖà + j = LocateVex(*G, v2); // »ñÈ¡¶¥µãv2ÔÚ¶¥µã¼¯ÖеÄλÖà + + // ½«Ö¸¶¨µÄ¶¥µã¹ØÏµÉèÖÃΪ1£¬Ö¸Ê¾ÕâÁ½¸ö¶¥µãÊÇÖ±½ÓÁ¬½ÓµÄ(×¢£ºÕâÀïûÓÐÑé֤ϱêÊÇ·ñÔ½½ç) + (*G).arcs[i][j].adj = 1; + + // Èç¹ûÐèҪ¼Èë±ßµÄÆäËû¸½¼ÓÐÅÏ¢ + if(IncInfo) { + // ×îºó¼È븽¼ÓÐÅÏ¢ + Input(*G, &((*G).arcs[i][j].info)); + } + + // Ìî³ä¶Ô³Æµã + (*G).arcs[j][i] = (*G).arcs[i][j]; + } + + // ´ÓÎļþÖжÁÈ¡Êý¾Ýʱ£¬×îºóÆäʵӦµ±ÅжÏÒ»ÏÂÊÇ·ñ¶Áµ½ÁË×ã¹»µÄÐÅÏ¢ + return OK; +} + +/* + * ¨€¨€¨€¨€¨€¨€¨€¨€ Ëã·¨7.2 ¨€¨€¨€¨€¨€¨€¨€¨€ + * + * ¹¹ÔìÎÞÏòÍø + */ +static Status CreateUDN(MGraph* G) { + int i, j, k; + ArcCell arcs = {INFINITE, NULL}; // ÎÞÏòÍøÃ¿Ìõ±ßµÄ³õʼֵ + VertexType v1, v2; + VRType w; + + if(fp == NULL) { + printf("ÇëÊäÈëÎÞÏòÍøµÄ¶¥µãÊý£º"); + scanf("%d", &((*G).vexnum)); + printf("ÇëÊäÈëÎÞÏòÍøµÄ±ßÊý£º"); + scanf("%d", &((*G).arcnum)); + printf("¸ÃÎÞÏòÍøµÄ±ßÉÏÊÇ·ñ°üº¬ÆäËû¸½¼ÓÐÅÏ¢(0-²»°üº¬©¦1-°üº¬)£º"); + scanf("%d", &IncInfo); + + // ¼Èë¶¥µã¼¯ + printf("Çë¼Èë %d ¸ö¶¥µã£¬²»Í¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º", (*G).vexnum); + for(i = 0; i < (*G).vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(stdin); + scanf("%c", &((*G).vexs[i])); + } + } else { + ReadData(fp, "%d", &((*G).vexnum)); // ¼Èë¶¥µãÊý + ReadData(fp, "%d", &((*G).arcnum)); // ¼Èë±ßÊý + ReadData(fp, "%d", &IncInfo); // ÅжϱßÉÏÊÇ·ñ°üº¬¸½¼ÓÐÅÏ¢ + + // ¼Èë¶¥µã¼¯ + for(i = 0; i < (*G).vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(fp); + ReadData(fp, "%c", &((*G).vexs[i])); + } + } + + // ³õʼ»¯ÎÞÏòÍøµÄÁÚ½Ó¾ØÕó + for(i = 0; i < (*G).vexnum; i++) { + for(j = 0; j < (*G).vexnum; j++) { + (*G).arcs[i][j] = arcs; + } + } + + // ½öÔÚ¿ØÖÆÌ¨Â¼ÈëÐÅϢʱÊä³ö´ËÌáʾ + if(fp == NULL && (*G).arcnum != 0) { + printf("ÇëΪÎÞÏòÍøÒÀ´Î¼Èë %d Ìõ±ß(´øÈ¨Öµ)µÄÐÅÏ¢£¬¶¥µã¼°È¨ÖµÖ®¼äÓÿոñ¸ô¿ª£º\n", (*G).arcnum); + } + + // ¼Èë±ßµÄÐÅÏ¢ + for(k = 0; k < (*G).arcnum; k++) { + if(fp == NULL) { + printf("µÚ %2d Ìõ±ß¼°ÆäȨֵ£º", k + 1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v2); + scanf("%d", &w); + } else { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + skipBlank(fp); + ReadData(fp, "%c%c%d", &v1, &v2, &w); + } + + i = LocateVex(*G, v1); // »ñÈ¡¶¥µãv1ÔÚ¶¥µã¼¯ÖеÄλÖà + j = LocateVex(*G, v2); // »ñÈ¡¶¥µãv2ÔÚ¶¥µã¼¯ÖеÄλÖà + + // ÔÚÖ¸¶¨µÄ¶¥µã¹ØÏµÉϼǼȨֵ(×¢£ºÕâÀïûÓÐÑé֤ϱêÊÇ·ñÔ½½ç) + (*G).arcs[i][j].adj = w; + + // Èç¹ûÐèҪ¼Èë±ßµÄÆäËû¸½¼ÓÐÅÏ¢ + if(IncInfo) { + // ×îºó¼È븽¼ÓÐÅÏ¢ + Input(*G, &((*G).arcs[i][j].info)); + } + + // Ìî³ä¶Ô³Æµã + (*G).arcs[j][i] = (*G).arcs[i][j]; + } + + // ´ÓÎļþÖжÁÈ¡Êý¾Ýʱ£¬×îºóÆäʵӦµ±ÅжÏÒ»ÏÂÊÇ·ñ¶Áµ½ÁË×ã¹»µÄÐÅÏ¢ + return OK; +} + +/* + * ¼Èë±ß/»¡µÄÏà¹Ø¸½¼ÓÐÅÏ¢ + */ +static void Input(MGraph G, InfoType** info) { + //¼Èë±ß/»¡µÄÐÅÏ¢£¬±¾²âÊÔÉæ¼°µ½µÄ±ß/»¡Ä¬ÈÏÎÞÆäËû¸½¼ÓÐÅÏ¢ +} + +/* + * ²éÕÒ + * + * ·µ»Ø¶¥µãuÔÚͼ/ÍøÖеÄλÖà + */ +int LocateVex(MGraph G, VertexType u) { + int i; + + for(i = 0; i < G.vexnum; i++) { + if(G.vexs[i] == u) { + return i; + } + } + + return -1; +} + +/* + * ÒÔͼÐλ¯ÐÎʽÊä³öµ±Ç°½á¹¹ + * + * ×¢£ºÔÚͼ/ÍøÖУ¬Ê¹ÓÃ"-"À´±íʾÁ½¶¥µã²»Ö±½ÓÁ¬Í¨ + */ +void PrintGraph(MGraph G) { + int i, j; + + if(G.vexnum == 0) { + printf("¿Õͼ£¬ÎÞÐè´òÓ¡£¡\n"); + return; + } + + printf("µ±Ç°Í¼/Íø°üº¬ %2d ¸ö¶¥µã£¬ %2d Ìõ±ß/»¡...\n", G.vexnum, G.arcnum); + + printf(" "); + for(i = 0; i < G.vexnum; i++) { + printf(" %c", G.vexs[i]); + } + printf("\n"); + + for(i = 0; i < G.vexnum; i++) { + printf("%c ", G.vexs[i]); + + for(j = 0; j < G.vexnum; j++) { + if(((G.kind == DG || G.kind == UDG) && G.arcs[i][j].adj == 0) || ((G.kind == DN || G.kind == UDN) && G.arcs[i][j].adj == INFINITE)) { + printf(" -"); + } else { + printf("%3d", G.arcs[i][j].adj); + } + } + + printf("\n"); + } +} diff --git a/VisualC++/ExerciseBook/07.20/MGraph.h b/VisualC++/ExerciseBook/07.20/MGraph.h new file mode 100644 index 0000000..19da8a3 --- /dev/null +++ b/VisualC++/ExerciseBook/07.20/MGraph.h @@ -0,0 +1,130 @@ +/*================================= + * ͼµÄÊý×é(ÁÚ½Ó¾ØÕó)´æ´¢±íʾ + * + * °üº¬Ëã·¨: 7.1¡¢7.2¡¢7.4¡¢7.5¡¢7.6 + ==================================*/ + +#ifndef MGRAPH_H +#define MGRAPH_H + +#include +#include // ÌṩºêINT_MAX +#include // Ìṩmemset¡¢strcmp Ô­ÐÍ +#include // Ìṩºêva_list¡¢va_start¡¢va_arg¡¢va_end +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// + +/* + * ×¢£º + * + * ͨ³£À´½²£¬ÎÞȨͼ±»¼ò³ÆÎª¡¾Í¼¡¿£¬ÓÐȨͼ±»¼ò³ÆÎª¡¾Íø¡¿¡£ + * ÎÞÏòͼ/ÍøÖеĶ¥µã¹ØÏµ±»³ÆÎª¡¾±ß¡¿£¬ÓÐÏòͼ/ÍøÖеĶ¥µã¹ØÏµ±»³ÆÎª¡¾»¡¡¿£¬²¢Çø·Ö»¡Í·Ó뻡β¡£ + * ʵ¼Ê±íÊöÖУ¬Î´±Ø»áÑϸñ×ñÊØÒÔÉÏÃüÃû¡£ + */ + +/* ºê¶¨Òå */ +#define INFINITE INT_MAX // ×î´óÖµ£¬ÓÃÀ´±íÊ¾ÍøÖеÄÁ½¸ö¶¥µã²»Ö±½ÓÁ¬½Ó +#define MAX_VERTEX_NUM 26 // ×î´ó¶¥µã¸öÊý + + +// ͼµÄÀàÐÍ +typedef enum { + DG, // 0-ÓÐÏòͼ + DN, // 1-ÓÐÏòÍø(´øÈ¨Öµ) + UDG, // 2-ÎÞÏòͼ + UDN // 3-ÎÞÏòÍø(´øÈ¨Öµ) +} GraphKind; + +// ¶¥µãÀàÐÍ +typedef char VertexType; + +/* + * ¶¥µã¹ØÏµÀàÐÍ + * + * ÔÚÎÞȨͼÖУ¬¸Ãֵͨ³£Îª0»ò1£¬±íʾÁ½¶¥µãÊÇ·ñÖ±½ÓÁ¬Í¨£» + * ÔÚÓÐȨͼÖУ¬¸Ãֵͨ³£ÎªÈ¨Öµ¡£ + */ +typedef int VRType; + +// ±ßµÄÏà¹Ø¸½¼ÓÐÅÏ¢ +typedef struct { + // Èç¹ûÓеϰ£¬ºóÐø»áÌí¼ÓÏàÓ¦µÄÊôÐÔ + void* v; // Ìí¼ÓÒ»¸öÎÞÒâÒåµÄ±äÁ¿À´Õ¼Î»£¬Èç¹û½á¹¹ÌåΪ¿ÕµÄ»°£¬ÔÚVC++Öлᱨ´í +} InfoType; + +// ±ßµÄÀàÐÍ£¬Ã¿Ìõ±ßÉÏ¿ÉÄÜÓи½¼ÓÐÅÏ¢info +typedef struct ArcCell { + VRType adj; // ¶¥µã¹ØÏµ£¬ÔÚÓÐȨͼ¸úÎÞȨͼÖеĺ¬Ò岻ͬ + InfoType* info; // ±ßµÄ¸½¼ÓÐÅÏ¢£¬Í¨³£ºöÂÔ +} ArcCell; + +/* ͼ/ÍøµÄÊý×é(ÁÚ½Ó¾ØÕó)´æ´¢±íʾÀàÐͶ¨Òå */ +typedef struct { + VertexType vexs[MAX_VERTEX_NUM]; // ¶¥µãÏòÁ¿ + ArcCell arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; // ÁÚ½Ó¾ØÕó + int vexnum, arcnum; // ͼ/ÍøµÄ¶¥µãÊýºÍ»¡Êý + GraphKind kind; // ͼµÄÀàÐͱêÖ¾ +} MGraph; + + +// ±ß/»¡ÉÏÊÇ·ñ´æÔÚ¸½¼ÓÐÅÏ¢ +extern Boolean IncInfo; + + +/* + * ¨€¨€¨€¨€¨€¨€¨€¨€ Ëã·¨7.1 ¨€¨€¨€¨€¨€¨€¨€¨€ + * + * ´´½¨ + * + *¡¾±¸×¢¡¿ + * + * ½Ì²ÄÖÐĬÈÏ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý¡£ + * ÕâÀïΪÁË·½±ã²âÊÔ£¬±ÜÃâÿ´ÎÔËÐж¼ÊÖ¶¯ÊäÈëÊý¾Ý£¬ + * Òò¶øÔÊÐíÑ¡Ôñ´ÓÔ¤ÉèµÄÎļþpathÖжÁÈ¡²âÊÔÊý¾Ý¡£ + * + * Èç¹ûÐèÒª´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý£¬ÔòpathΪNULL£¬»òpath[kind]Ϊ""¡£ + * Èç¹ûÐèÒª´ÓÎļþÖжÁÈ¡Êý¾Ý£¬ÔòÐèÒªÔÚpathÖÐÌîдÎļþÃûÐÅÏ¢¡£ + */ +Status CreateGraph(MGraph* G, char* path[]); + +/* + * ¹¹ÔìÓÐÏòͼ + */ +static Status CreateDG(MGraph* G); + +/* + * ¹¹ÔìÓÐÏòÍø + */ +static Status CreateDN(MGraph* G); + +/* + * ¹¹ÔìÎÞÏòͼ + */ +static Status CreateUDG(MGraph* G); + +/* + * ¨€¨€¨€¨€¨€¨€¨€¨€ Ëã·¨7.2 ¨€¨€¨€¨€¨€¨€¨€¨€ + * + * ¹¹ÔìÎÞÏòÍø + */ +static Status CreateUDN(MGraph* G); + +/* + * ¼Èë±ßµÄÏà¹Ø¸½¼ÓÐÅÏ¢ + */ +static void Input(MGraph G, InfoType** info); + +/* + * ²éÕÒ + * + * ·µ»Ø¶¥µãuÔÚͼ/ÍøÖеÄλÖà + */ +int LocateVex(MGraph G, VertexType u); + +/* + * ÒÔͼÐλ¯ÐÎʽÊä³öµ±Ç°½á¹¹ + * + * ×¢£ºÔÚͼ/ÍøÖУ¬Ê¹ÓÃ"-"À´±íʾÁ½¶¥µã²»Ö±½ÓÁ¬Í¨ + */ +void PrintGraph(MGraph G); + +#endif diff --git a/VisualC++/ExerciseBook/07.20/TestData_DG.txt b/VisualC++/ExerciseBook/07.20/TestData_DG.txt new file mode 100644 index 0000000..b8bfff7 --- /dev/null +++ b/VisualC++/ExerciseBook/07.20/TestData_DG.txt @@ -0,0 +1,6 @@ +ͼÀàÐÍ¡ú0£¨ÓÐÏòͼ£© +¶¥µãÊý¡ú5 +»¡Êý¡ú10 +»¡ÊÇ·ñ´øÓÐÆäËûÐÅÏ¢¡ú0 +¶¥µã¼¯¡ú¡¾A£¬B£¬C£¬D£¬E¡¿ +»¡µÄ¼¯ºÏ¡ú¡¾A£¬B¡¿¡¾A£¬C¡¿¡¾A£¬D¡¿¡¾A£¬E¡¿¡¾B£¬A¡¿¡¾B£¬C¡¿¡¾B£¬D¡¿¡¾B£¬E¡¿¡¾C£¬D¡¿¡¾E£¬D¡¿ \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.20/TestData_DN.txt b/VisualC++/ExerciseBook/07.20/TestData_DN.txt new file mode 100644 index 0000000..bf8212d --- /dev/null +++ b/VisualC++/ExerciseBook/07.20/TestData_DN.txt @@ -0,0 +1,6 @@ +ͼÀàÐÍ¡ú1£¨ÓÐÏòÍø£© +¶¥µãÊý¡ú5 +»¡Êý¡ú10 +»¡ÊÇ·ñ´øÓÐÆäËûÐÅÏ¢¡ú0 +¶¥µã¼¯¡ú¡¾A£¬B£¬C£¬D£¬E¡¿ +»¡µÄ¼¯ºÏ¡ú¡¾A£¬B£¬5¡¿¡¾A£¬C£¬1¡¿¡¾A£¬D£¬2¡¿¡¾A£¬E£¬6¡¿¡¾B£¬A£¬5¡¿¡¾B£¬C£¬2¡¿¡¾B£¬D£¬8¡¿¡¾B£¬E£¬7¡¿¡¾C£¬D£¬2¡¿¡¾E£¬D£¬3¡¿ \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.20/TestData_UDG.txt b/VisualC++/ExerciseBook/07.20/TestData_UDG.txt new file mode 100644 index 0000000..35622d5 --- /dev/null +++ b/VisualC++/ExerciseBook/07.20/TestData_UDG.txt @@ -0,0 +1,6 @@ +ͼÀàÐÍ¡ú2£¨ÎÞÏòͼ£© +¶¥µãÊý¡ú5 +±ßÊý¡ú10 +±ßÊÇ·ñ´øÓÐÆäËûÐÅÏ¢¡ú0 +¶¥µã¼¯¡ú¡¾A£¬B£¬C£¬D£¬E¡¿ +±ßµÄ¼¯ºÏ¡ú¡¾A£¬B¡¿¡¾A£¬C¡¿¡¾A£¬D¡¿¡¾A£¬E¡¿¡¾B£¬C¡¿¡¾B£¬D¡¿¡¾B£¬E¡¿¡¾C£¬D¡¿¡¾C£¬E¡¿¡¾D£¬E¡¿ \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.20/TestData_UDN.txt b/VisualC++/ExerciseBook/07.20/TestData_UDN.txt new file mode 100644 index 0000000..eb2425f --- /dev/null +++ b/VisualC++/ExerciseBook/07.20/TestData_UDN.txt @@ -0,0 +1,6 @@ +ͼÀàÐÍ¡ú3£¨ÎÞÏòÍø£© +¶¥µãÊý¡ú5 +±ßÊý¡ú10 +±ßÊÇ·ñ´øÓÐÆäËûÐÅÏ¢¡ú0 +¶¥µã¼¯¡ú¡¾A£¬B£¬C£¬D£¬E¡¿ +±ßµÄ¼¯ºÏ¡ú¡¾A£¬B£¬1¡¿¡¾A£¬C£¬3¡¿¡¾A£¬D£¬2¡¿¡¾A£¬E£¬1¡¿¡¾B£¬C£¬5¡¿¡¾B£¬D£¬3¡¿¡¾B£¬E£¬6¡¿¡¾C£¬D£¬8¡¿¡¾C£¬E£¬4¡¿¡¾D£¬E£¬7¡¿ \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.21/07.21.c b/VisualC++/ExerciseBook/07.21/07.21.c new file mode 100644 index 0000000..0b8f01c --- /dev/null +++ b/VisualC++/ExerciseBook/07.21/07.21.c @@ -0,0 +1,75 @@ +#include +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// +#include "ALGraph.h" //**¡ø07 ͼ**// + +/* + * ÅжÏͼGÊÇ·ñ¿É´«µÝ + */ +Status Algo_7_21(ALGraph G); + + +int main(int argc, char* argv[]) { + ALGraph G; + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ´´½¨²¢Êä³öͼ...\n"); + { + char* path[4]; + + path[0] = "TestData_DG.txt"; + path[1] = "TestData_DN.txt"; + path[2] = "TestData_UDG.txt"; + path[3] = "TestData_UDN.txt"; + + CreateGraph(&G, path); + PrintGraph(G); + printf("\n"); + } + + Algo_7_21(G) ? printf("ͼG¿É´«µÝ£¡\n") : printf("ͼG²»¿É´«µÝ£¡\n"); + printf("\n"); + + return 0; +} + + +/* + * ÅжÏͼGÊÇ·ñ¿É´«µÝ + */ +Status Algo_7_21(ALGraph G) { + Status trans; + int x, y, z; + ArcNode* py, * pz, * px; + + // Ô¤ÉèΪ¿É´«µÝ + trans = TRUE; + + // ¶ÔÓÚVÖÐÿ¸öx + for(x = 0; x < G.vexnum; x++) { + // N(x)ÖÐÿ¸öy + for(py = G.vertices[x].firstarc; py != NULL; py = py->nextarc) { + y = py->adjvex; + + for(pz = G.vertices[y].firstarc; pz != NULL; pz = pz->nextarc) { + z = pz->adjvex; + + // ÅųýÓëxÏàµÈµÄz + if(z != x) { + for(px = G.vertices[x].firstarc; px != NULL; px = px->nextarc) { + if(px->adjvex == z) { + break; // ÕÒµ½zºó¼°Ê±Ìø³ö + } + } + + // Èç¹ûz²»ÔÚN(x)ÖÐ + if(px == NULL) { + trans = FALSE; + return trans; + } + } + + } + } + } + + return trans; +} diff --git a/VisualC++/ExerciseBook/07.21/07.21.png b/VisualC++/ExerciseBook/07.21/07.21.png new file mode 100644 index 0000000000000000000000000000000000000000..29a4418760cc5fd0d0e3904258af3a0fd49246d9 GIT binary patch literal 16161 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 literal 0 HcmV?d00001 diff --git a/VisualC++/ExerciseBook/07.21/07.21.vcxproj b/VisualC++/ExerciseBook/07.21/07.21.vcxproj new file mode 100644 index 0000000..d15e380 --- /dev/null +++ b/VisualC++/ExerciseBook/07.21/07.21.vcxproj @@ -0,0 +1,82 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {F65B5E57-8A19-4D71-BCB7-C80BC575A47D} + My0721 + + + + Application + true + MultiByte + + + Application + false + true + MultiByte + + + + + + + + + + + + + $(SolutionDir)\..\Status;$(IncludePath) + + + + Level3 + Disabled + + + true + $(SolutionDir)\..\Status\Status.lib;%(AdditionalDependencies) + Console + + + + + Level3 + MaxSpeed + true + true + + + true + true + true + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.21/07.21.vcxproj.filters b/VisualC++/ExerciseBook/07.21/07.21.vcxproj.filters new file mode 100644 index 0000000..3e718ed --- /dev/null +++ b/VisualC++/ExerciseBook/07.21/07.21.vcxproj.filters @@ -0,0 +1,44 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + æºæ–‡ä»¶ + + + æºæ–‡ä»¶ + + + + + 头文件 + + + + + èµ„æºæ–‡ä»¶ + + + èµ„æºæ–‡ä»¶ + + + èµ„æºæ–‡ä»¶ + + + èµ„æºæ–‡ä»¶ + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.21/07.21.vcxproj.user b/VisualC++/ExerciseBook/07.21/07.21.vcxproj.user new file mode 100644 index 0000000..ace9a86 --- /dev/null +++ b/VisualC++/ExerciseBook/07.21/07.21.vcxproj.user @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.21/ALGraph.c b/VisualC++/ExerciseBook/07.21/ALGraph.c new file mode 100644 index 0000000..feecee6 --- /dev/null +++ b/VisualC++/ExerciseBook/07.21/ALGraph.c @@ -0,0 +1,570 @@ +/*================== + * ͼµÄÁÚ½Ó±í´æ´¢±íʾ + ===================*/ + +#include "ALGraph.h" + +// ¼ÈëÊý¾ÝµÄÔ´Îļþ£»fpΪnullʱ£¬ËµÃ÷ÐèÒª´Ó¿ØÖÆÌ¨Â¼Èë +static FILE* fp = NULL; + +/* + * IncInfoָʾ¸Ãͼ/ÍøµÄ±ß/»¡ÉÏÊÇ·ñ´æÔÚ¸½¼ÓÐÅÏ¢¡£ + * Èç¹ûÆäÖµ²»Îª0£¬Ôò±íʾÎÞ¸½¼ÓÐÅÏ¢£¬·ñÔò£¬±íʾ´æÔÚ¸½¼ÓÐÅÏ¢¡£ + */ +Boolean IncInfo = FALSE; + +// ·ÃÎʱêÖ¾Êý×飬¼Ç¼·ÃÎʹýµÄ¶¥µã +static Boolean visited[MAX_VERTEX_NUM]; + +// º¯Êý±äÁ¿ +static Status (* VisitFunc)(VertexType e); + + +/* + * ´´½¨ + * + *¡¾±¸×¢¡¿ + * + * ½Ì²ÄÖÐĬÈÏ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý¡£ + * ÕâÀïΪÁË·½±ã²âÊÔ£¬±ÜÃâÿ´ÎÔËÐж¼ÊÖ¶¯ÊäÈëÊý¾Ý£¬ + * Òò¶øÔÊÐíÑ¡Ôñ´ÓÔ¤ÉèµÄÎļþpathÖжÁÈ¡²âÊÔÊý¾Ý¡£ + * + * Èç¹ûÐèÒª´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý£¬ÔòpathΪNULL£¬»òpath[kind]Ϊ""¡£ + * Èç¹ûÐèÒª´ÓÎļþÖжÁÈ¡Êý¾Ý£¬ÔòÐèÒªÔÚpathÖÐÌîдÎļþÃûÐÅÏ¢¡£ + */ +Status CreateGraph(ALGraph* G, char* path[]) { + int readFromConsole; // ÊÇ·ñ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý + int kind; + Status flag; + + printf("ÇëÊäÈëͼµÄÀàÐÍ(0-ÓÐÏòͼ ©¦ 1-ÓÐÏòÍø ©¦ 2-ÎÞÏòͼ ©¦ 3-ÎÞÏòÍø)£º"); + scanf("%d", &kind); + + // ÀàÐͲ»ºÏ¹æ + if(kind < 0 || kind > 3) { + return ERROR; + } + + // Èç¹ûûÓÐÎļþ·¾¶ÐÅÏ¢£¬Ôò´Ó¿ØÖÆÌ¨¶ÁÈ¡ÊäÈë + readFromConsole = (path == NULL) || strcmp(path[kind], "") == 0; + + // ÐèÒª´ÓÎļþ¶ÁÈ¡ + if(readFromConsole) { + (*G).kind = kind; // ¼Ç¼ͼ/ÍøµÄÀàÐÍ + } else { + // ´ò¿ªÎļþ£¬×¼±¸¶ÁÈ¡²âÊÔÊý¾Ý + fp = fopen(path[kind], "r"); + if(fp == NULL) { + return ERROR; + } + + // ¼ÈëͼµÄÀàÐÍ + ReadData(fp, "%d", &((*G).kind)); + } + + // Ëæ»ú´´½¨ÓÐÏòͼ/Íø»òÎÞÏòͼ/ÍøµÄÒ»ÖÖ + switch((*G).kind) { + case DG: + flag = CreateDG(G); + break; + case DN: + flag = CreateDN(G); + break; + case UDG: + flag = CreateUDG(G); + break; + case UDN: + flag = CreateUDN(G); + break; + default: + flag = ERROR; + break; + } + + if(fp != NULL) { + fclose(fp); + fp = NULL; + } + + return flag; +} + +/* + * ¹¹ÔìÓÐÏòͼ + */ +static Status CreateDG(ALGraph* G) { + int i, k; + int vexnum, arcnum; + VertexType v1, v2; + InfoType* info = NULL; + + (*G).vexnum = (*G).arcnum = 0; + + if(fp == NULL) { + printf("ÇëÊäÈëÓÐÏòͼµÄ¶¥µãÊý£º"); + scanf("%d", &vexnum); + printf("ÇëÊäÈëÓÐÏòͼµÄ»¡Êý£º"); + scanf("%d", &arcnum); + printf("¸ÃÓÐÏòͼµÄ»¡ÉÏÊÇ·ñ°üº¬ÆäËû¸½¼ÓÐÅÏ¢(0-²»°üº¬©¦1-°üº¬)£º"); + scanf("%d", &IncInfo); + + // ¼Èë¶¥µã¼¯ + printf("Çë¼Èë %d ¸ö¶¥µã£¬²»Í¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º", vexnum); + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(stdin); + scanf("%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } else { + ReadData(fp, "%d", &vexnum); // ¼Èë¶¥µãÊý + ReadData(fp, "%d", &arcnum); // ¼È뻡Êý + ReadData(fp, "%d", &IncInfo); // Åжϻ¡ÉÏÊÇ·ñ°üº¬¸½¼ÓÐÅÏ¢ + + // ¼Èë¶¥µã¼¯ + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(fp); + ReadData(fp, "%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } + + // ½öÔÚ¿ØÖÆÌ¨Â¼ÈëÐÅϢʱÊä³ö´ËÌáʾ + if(fp == NULL && arcnum != 0) { + printf("ÇëΪÓÐÏòͼÒÀ´Î¼Èë %d Ìõ»¡µÄÐÅÏ¢£¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º\n", arcnum); + } + + // ¼È뻡µÄÐÅÏ¢ + for(k = 0; k < arcnum; k++) { + if(fp == NULL) { + printf("µÚ %2d Ìõ»¡£º", k + 1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v2); + } else { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + skipBlank(fp); + ReadData(fp, "%c%c", &v1, &v2); + } + + // Èç¹ûÐèҪ¼È뻡µÄÆäËû¸½¼ÓÐÅÏ¢ + if(IncInfo) { + // ×îºó¼È븽¼ÓÐÅÏ¢ + Input(*G, &info); + } + + // ²åÈ뻡 + InsertArc(G, v1, v2, info); + } + + // ´ÓÎļþÖжÁÈ¡Êý¾Ýʱ£¬×îºóÆäʵӦµ±ÅжÏÒ»ÏÂÊÇ·ñ¶Áµ½ÁË×ã¹»µÄÐÅÏ¢ + return OK; +} + +/* + * ¹¹ÔìÓÐÏòÍø + */ +static Status CreateDN(ALGraph* G) { + int i, k; + int vexnum, arcnum; + VertexType v1, v2; + InfoType* info = NULL; + + (*G).vexnum = (*G).arcnum = 0; + + if(fp == NULL) { + printf("ÇëÊäÈëÓÐÏòÍøµÄ¶¥µãÊý£º"); + scanf("%d", &vexnum); + printf("ÇëÊäÈëÓÐÏòÍøµÄ»¡Êý£º"); + scanf("%d", &arcnum); + printf("¸ÃÓÐÏòÍøµÄ»¡ÉϱØÐë°üº¬ÆäËû¸½¼ÓÐÅÏ¢£¬ÒòΪ´Ë´¦µÄȨֵÐèÒª´æ´¢µ½¸½¼ÓÐÅÏ¢ÖÐ...\n"); + IncInfo = 1; + + // ¼Èë¶¥µã¼¯ + printf("Çë¼Èë %d ¸ö¶¥µã£¬²»Í¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º", vexnum); + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(stdin); + scanf("%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } else { + ReadData(fp, "%d", &vexnum); // ¼Èë¶¥µãÊý + ReadData(fp, "%d", &arcnum); // ¼È뻡Êý + ReadData(fp, "%d", &IncInfo);// Åжϻ¡ÉÏÊÇ·ñ°üº¬¸½¼ÓÐÅÏ¢(´Ë´¦Ó¦µ±°üº¬) + IncInfo = 1; // Ç¿ÖÆ½«È¨ÖµÂ¼Èëµ½¸½¼ÓÐÅÏ¢ÖÐ + + // ¼Èë¶¥µã¼¯ + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(fp); + ReadData(fp, "%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } + + // ½öÔÚ¿ØÖÆÌ¨Â¼ÈëÐÅϢʱÊä³ö´ËÌáʾ + if(fp == NULL && arcnum != 0) { + printf("ÇëΪÓÐÏòÍøÒÀ´Î¼Èë %d Ìõ»¡(´øÈ¨Öµ)µÄÐÅÏ¢£¬¶¥µã¼°È¨ÖµÖ®¼äÓÿոñ¸ô¿ª£º\n", arcnum); + } + + // ¼È뻡µÄÐÅÏ¢ + for(k = 0; k < arcnum; k++) { + if(fp == NULL) { + printf("µÚ %2d Ìõ»¡¼°ÆäȨֵ£º", k + 1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v2); + } else { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + skipBlank(fp); + ReadData(fp, "%c%c", &v1, &v2); + } + + // Èç¹ûÐèҪ¼È뻡µÄÆäËû¸½¼ÓÐÅÏ¢ + if(IncInfo) { + // ×îºó¼È븽¼ÓÐÅÏ¢(´Ë´¦ÐèҪ¼ÈëÍøµÄȨֵ) + Input(*G, &info); + } + + // ²åÈ뻡 + InsertArc(G, v1, v2, info); + } + + // ´ÓÎļþÖжÁÈ¡Êý¾Ýʱ£¬×îºóÆäʵӦµ±ÅжÏÒ»ÏÂÊÇ·ñ¶Áµ½ÁË×ã¹»µÄÐÅÏ¢ + return OK; +} + +/* + * ¹¹ÔìÎÞÏòͼ + */ +static Status CreateUDG(ALGraph* G) { + int i, k; + int vexnum, arcnum; + VertexType v1, v2; + InfoType* info = NULL; + + (*G).vexnum = (*G).arcnum = 0; + + if(fp == NULL) { + printf("ÇëÊäÈëÎÞÏòͼµÄ¶¥µãÊý£º"); + scanf("%d", &vexnum); + printf("ÇëÊäÈëÎÞÏòͼµÄ±ßÊý£º"); + scanf("%d", &arcnum); + printf("¸ÃÎÞÏòͼµÄ±ßÉÏÊÇ·ñ°üº¬ÆäËû¸½¼ÓÐÅÏ¢(0-²»°üº¬©¦1-°üº¬)£º"); + scanf("%d", &IncInfo); + + // ¼Èë¶¥µã¼¯ + printf("Çë¼Èë %d ¸ö¶¥µã£¬²»Í¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º", vexnum); + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(stdin); + scanf("%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } else { + ReadData(fp, "%d", &vexnum); // ¼Èë¶¥µãÊý + ReadData(fp, "%d", &arcnum); // ¼Èë±ßÊý + ReadData(fp, "%d", &IncInfo);// ÅжϱßÉÏÊÇ·ñ°üº¬¸½¼ÓÐÅÏ¢ + + // ¼Èë¶¥µã¼¯ + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(fp); + ReadData(fp, "%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } + + // ½öÔÚ¿ØÖÆÌ¨Â¼ÈëÐÅϢʱÊä³ö´ËÌáʾ + if(fp == NULL && arcnum != 0) { + printf("ÇëΪÎÞÏòͼÒÀ´Î¼Èë %d Ìõ±ßµÄÐÅÏ¢£¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º\n", arcnum); + } + + // ¼Èë±ßµÄÐÅÏ¢ + for(k = 0; k < arcnum; k++) { + if(fp == NULL) { + printf("µÚ %2d Ìõ±ß£º", k + 1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v2); + } else { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + skipBlank(fp); + ReadData(fp, "%c%c", &v1, &v2); + } + + // Èç¹ûÐèҪ¼Èë±ßµÄÆäËû¸½¼ÓÐÅÏ¢ + if(IncInfo) { + // ×îºó¼È븽¼ÓÐÅÏ¢ + Input(*G, &info); + + } + + // ²åÈë±ß + InsertArc(G, v1, v2, info); + } + + // ´ÓÎļþÖжÁÈ¡Êý¾Ýʱ£¬×îºóÆäʵӦµ±ÅжÏÒ»ÏÂÊÇ·ñ¶Áµ½ÁË×ã¹»µÄÐÅÏ¢ + return OK; +} + +/* + * ¹¹ÔìÎÞÏòÍø + */ +static Status CreateUDN(ALGraph* G) { + int i, k; + int vexnum, arcnum; + VertexType v1, v2; + InfoType* info = NULL; + + (*G).vexnum = (*G).arcnum = 0; + + if(fp == NULL) { + printf("ÇëÊäÈëÎÞÏòÍøµÄ¶¥µãÊý£º"); + scanf("%d", &vexnum); + printf("ÇëÊäÈëÎÞÏòÍøµÄ±ßÊý£º"); + scanf("%d", &arcnum); + printf("¸ÃÎÞÏòÍøµÄ±ßÉϱØÐë°üº¬ÆäËû¸½¼ÓÐÅÏ¢£¬ÒòΪ´Ë´¦µÄȨֵÐèÒª´æ´¢µ½¸½¼ÓÐÅÏ¢ÖÐ...\n"); + IncInfo = 1; + + // ¼Èë¶¥µã¼¯ + printf("Çë¼Èë %d ¸ö¶¥µã£¬²»Í¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º", vexnum); + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(stdin); + scanf("%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } else { + ReadData(fp, "%d", &vexnum); // ¼Èë¶¥µãÊý + ReadData(fp, "%d", &arcnum); // ¼Èë±ßÊý + ReadData(fp, "%d", &IncInfo);// ÅжϱßÉÏÊÇ·ñ°üº¬¸½¼ÓÐÅÏ¢ + IncInfo = 1; // Ç¿ÖÆ½«È¨ÖµÂ¼Èëµ½¸½¼ÓÐÅÏ¢ÖÐ + + // ¼Èë¶¥µã¼¯ + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(fp); + ReadData(fp, "%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } + + // ½öÔÚ¿ØÖÆÌ¨Â¼ÈëÐÅϢʱÊä³ö´ËÌáʾ + if(fp == NULL && arcnum != 0) { + printf("ÇëΪÎÞÏòÍøÒÀ´Î¼Èë %d Ìõ±ß(´øÈ¨Öµ)µÄÐÅÏ¢£¬¶¥µã¼°È¨ÖµÖ®¼äÓÿոñ¸ô¿ª£º\n", arcnum); + } + + // ¼Èë±ßµÄÐÅÏ¢ + for(k = 0; k < arcnum; k++) { + if(fp == NULL) { + printf("µÚ %2d Ìõ±ß¼°ÆäȨֵ£º", k + 1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v2); + } else { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + skipBlank(fp); + ReadData(fp, "%c%c", &v1, &v2); + } + + // Èç¹ûÐèҪ¼Èë±ßµÄÆäËû¸½¼ÓÐÅÏ¢ + if(IncInfo) { + // ×îºó¼È븽¼ÓÐÅÏ¢(´Ë´¦ÐèҪ¼ÈëÍøµÄȨֵ) + Input(*G, &info); + } + + // ²åÈë±ß + InsertArc(G, v1, v2, info); + } + + // ´ÓÎļþÖжÁÈ¡Êý¾Ýʱ£¬×îºóÆäʵӦµ±ÅжÏÒ»ÏÂÊÇ·ñ¶Áµ½ÁË×ã¹»µÄÐÅÏ¢ + return OK; +} + +/* + * ¼Èë±ß/»¡µÄÏà¹Ø¸½¼ÓÐÅÏ¢ + */ +static void Input(ALGraph G, InfoType** info) { + int weight; + + // ÔÚ"Íø"µÄÇéÐÎÏÂÐèҪ¼ÈëȨֵÐÅÏ¢ + if(G.kind == DN || G.kind == UDN) { + *info = (InfoType*) malloc(sizeof(InfoType)); + + if(fp == NULL) { + scanf("%d", &weight); + } else { + ReadData(fp, "%d", &weight); + } + + (*info)->weight = weight; + } +} + +/* + * ²éÕÒ + * + * ·µ»Ø¶¥µãuÔÚͼ/ÍøÖеÄλÖà + */ +int LocateVex(ALGraph G, VertexType u) { + int i; + + for(i = 0; i < G.vexnum; i++) { + if(G.vertices[i].data == u) { + return i; + } + } + + return -1; +} + +/* + * ¹¹ÔìÒ»¸ö±ß/»¡½áµã(½öÏÞÄÚ²¿Ê¹ÓÃ) + */ +static ArcNode* newArcNodePtr(int adjvex, ArcNode* nextarc, InfoType* info) { + ArcNode* p = (ArcNode*) malloc(sizeof(ArcNode)); + if(!p) { + exit(OVERFLOW); + } + + p->adjvex = adjvex; + + p->nextarc = nextarc; + + p->info = info; + + return p; +} + +/* + * ²åÈë±ß/»¡ + * + * Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬Ôò²åÈëÒ»Ìõ»¡ÐèÒªÔö¼ÓÁ½¸ö¶¥µã¹ØÏµ£¬µ«»¡µÄÊýÁ¿Ö»ÔöÒ»¡£ + * ¶ÔÓÚͼ/ÍøÀ´Ëµ£¬¿ÉÒÔÔڿɱä²ÎÊýÖÐÁгö±ß/»¡µÄ¸½¼ÓÐÅÏ¢¡£ + * + * ×¢£º´Ë´¦½ÓÊյIJÎÊýÓëMGraphÓÐЩ²»Ò»Ñù£ºÍøµÄ¸½¼ÓÐÅÏ¢Öаüº¬Á˸÷Ìõ±ß/»¡µÄȨֵ¡£ + */ +Status InsertArc(ALGraph* G, VertexType v, VertexType w, ...) { + int tail, head, k, count; + ArcNode* r; + ArcNode* pre; + Boolean overlay = FALSE; // ÊÇ·ñΪ¸²¸ÇÌí¼Ó + InfoType* info = NULL; // ±ß/»¡µÄ¸½¼ÓÐÅÏ¢ + va_list ap; + + tail = LocateVex(*G, v); // »ñÈ¡¶¥µãvÔÚ¶¥µã¼¯ÖеÄλÖà + if(tail == -1) { + return ERROR; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + head = LocateVex(*G, w); // »ñÈ¡¶¥µãwÔÚ¶¥µã¼¯ÖеÄλÖà + if(head == -1) { + return ERROR; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + // ¾Ü¾ø»· + if(tail == head) { + return ERROR; + } + + // Èç¹û±ß/»¡ÉÏ´æÔÚ¸½¼ÓÐÅÏ¢ + if(IncInfo) { + va_start(ap, w); // ÔÚwºó²éѯÊ׸ö¿É±ä²ÎÊý + info = va_arg(ap, InfoType*); // »ñÈ¡¸½¼ÓÐÅÏ¢ + va_end(ap); + } + + /* ½ÓÏÂÀ´£¬ÐèÒª²éÕÒºÏÊʵIJåÈëλÖà */ + + for(count = 0; count < 2; count++) { + pre = NULL; + // Ö¸ÏòÒÔtailΪβµÄÊ×Ìõ±ß/»¡ + r = G->vertices[tail].firstarc; + while(r != NULL && r->adjvex < head) { + pre = r; + r = r->nextarc; + } + + // Óöµ½ÁËÏàͬλÖõĽáµã + if(r != NULL && r->adjvex == head) { + r->info = info; // ¸´Óøýáµã + overlay = TRUE; // ·¢ÉúÁ˸²¸Ç + } else { + if(pre == NULL) { + G->vertices[tail].firstarc = newArcNodePtr(head, r, info); + } else { + pre->nextarc = newArcNodePtr(head, r, info); + } + } + + // Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬ÐèÒª¿¼ÂǶԳÆÐÔ + if((G->kind == UDG || G->kind == UDN) && tail != head) { + // µßµ¹iºÍj + k = tail; + tail = head; + head = k; + } else { + break; // Èç¹ûÊÇÓÐÏòµÄ£¬¿ÉÒÔ½áÊøÁË + } + } + + // ÔڷǸ²¸ÇµÄÇéÐÎÏ£¬²Å¿¼ÂǸüбß/»¡µÄÊýÁ¿ + if(!overlay) { + (*G).arcnum++; // ²»ÂÛÓÐÏòÎÞÏò£¬±ß/»¡ÊýÖ»ÔöÒ» + } + + return OK; +} + +/* + * ÒÔͼÐλ¯ÐÎʽÊä³öµ±Ç°½á¹¹ + */ +void PrintGraph(ALGraph G) { + int i; + ArcNode* p; + + if(G.vexnum == 0) { + printf("¿Õͼ£¬ÎÞÐè´òÓ¡£¡\n"); + return; + } + + printf("µ±Ç°Í¼/Íø°üº¬ %2d ¸ö¶¥µã£¬ %2d Ìõ±ß/»¡...\n", G.vexnum, G.arcnum); + + for(i = 0; i < G.vexnum; i++) { + printf("%c ===> ", G.vertices[i].data); + + p = G.vertices[i].firstarc; + while(p != NULL) { + if(IncInfo == 0) { + printf("%c ", G.vertices[p->adjvex].data); + + // ¶ÔÓÚÍø£¬»á´ÓÆä¸½¼ÓÐÅÏ¢ÖлñÈ¡µ½È¨Öµ + } else { + printf("%c[%2d] ", G.vertices[p->adjvex].data, p->info->weight); + } + + p = p->nextarc; + + if(p != NULL) { + printf("- "); + } + } + + printf("\n"); + } +} diff --git a/VisualC++/ExerciseBook/07.21/ALGraph.h b/VisualC++/ExerciseBook/07.21/ALGraph.h new file mode 100644 index 0000000..aa625ae --- /dev/null +++ b/VisualC++/ExerciseBook/07.21/ALGraph.h @@ -0,0 +1,143 @@ +/*================== + * ͼµÄÁÚ½Ó±í´æ´¢±íʾ + ===================*/ + +#ifndef ALGRAPH_H +#define ALGRAPH_H + +#include +#include // Ìṩmemset¡¢strcmp Ô­ÐÍ +#include // Ìṩºêva_list¡¢va_start¡¢va_arg¡¢va_end +#include // Ìṩmalloc¡¢realloc¡¢free¡¢exitÔ­ÐÍ +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// + +/* + * ×¢£º + * + * ͨ³£À´½²£¬ÎÞȨͼ±»¼ò³ÆÎª¡¾Í¼¡¿£¬ÓÐȨͼ±»¼ò³ÆÎª¡¾Íø¡¿¡£ + * ÎÞÏòͼ/ÍøÖеĶ¥µã¹ØÏµ±»³ÆÎª¡¾±ß¡¿£¬ÓÐÏòͼ/ÍøÖеĶ¥µã¹ØÏµ±»³ÆÎª¡¾»¡¡¿£¬²¢Çø·Ö»¡Í·Ó뻡β¡£ + * ʵ¼Ê±íÊöÖУ¬Î´±Ø»áÑϸñ×ñÊØÒÔÉÏÃüÃû¡£ + * + * µ±Ç°½á¹¹Êʺϴ洢±ß/»¡±È½ÏÏ¡ÊèµÄͼ/Íø¡£ + * + * ¡ï ²åÈë±ß/»¡µÄÐÅϢʱ£¬ÕâÀïµÄʵÏÖÊǰ´"ÉýÐò"²åÈëµÄ£¬ÕâʹµÃ²åÈëµÄ»¡Êǰ´"ÉýÐò"ÅÅÁеġ£ + */ + + +/* ºê¶¨Òå */ +#define MAX_VERTEX_NUM 26 // ×î´ó¶¥µã¸öÊý + + +// ͼµÄÀàÐÍ +typedef enum { + DG, // 0-ÓÐÏòͼ + DN, // 1-ÓÐÏòÍø(´øÈ¨Öµ) + UDG, // 2-ÎÞÏòͼ + UDN // 3-ÎÞÏòÍø(´øÈ¨Öµ) +} GraphKind; + +// ¶¥µãÀàÐÍ +typedef char VertexType; + +// ±ß/»¡µÄÏà¹Ø¸½¼ÓÐÅÏ¢ +typedef struct { + /* + * ×¢£º + * ½Ì²ÄÖиø³öµÄ½á¹¹Ö»¿¼ÂÇÁËÎÞȨͼ£¬¶øÃ»¿¼ÂÇÓÐȨͼ(Íø)¡£ + * ÕâÀïΪÁ˰ѡ°Íø¡±µÄÇéÐÎÒ²¿¼ÂǽøÈ¥£¬ÌØÔÚ¸½¼ÓÐÅÏ¢ÖÐÔö¼ÓÁË"È¨ÖØ"ÊôÐÔ¡£ + */ + int weight; +} InfoType; + +/* ±ß/»¡½áµã */ +typedef struct ArcNode { + int adjvex; // ¸Ã»¡ËùÖ¸ÏòµÄ¶¥µãµÄλÖà + struct ArcNode* nextarc; // Ö¸ÏòÏÂÒ»Ìõ»¡µÄÖ¸Õë + InfoType* info; // »¡µÄ¸½¼ÓÐÅÏ¢£¬Í¨³£ºöÂÔ +} ArcNode; + +// ÿ¸öÁ´±íµÄÍ·½áµã +typedef struct VNode { + VertexType data; // ¶¥µãÐÅÏ¢ + ArcNode* firstarc; // Ö¸ÏòµÚÒ»ÌõÒÀ¸½¸Ã¶¥µãµÄ»¡µÄÖ¸Õë +} VNode; + +/* ͼµÄÁÚ½Ó±í´æ´¢±íʾÀàÐͶ¨Òå */ +typedef struct { + VNode vertices[MAX_VERTEX_NUM]; // ÁÚ½Ó±í + int vexnum, arcnum; // ͼ/ÍøµÄ¶¥µãÊýºÍ»¡Êý + GraphKind kind; // ͼµÄÀàÐͱêÖ¾ +} ALGraph; + + +// ±ß/»¡ÉÏÊÇ·ñ´æÔÚ¸½¼ÓÐÅÏ¢ +extern Boolean IncInfo; + + +/* + * ´´½¨ + * + *¡¾±¸×¢¡¿ + * + * ½Ì²ÄÖÐĬÈÏ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý¡£ + * ÕâÀïΪÁË·½±ã²âÊÔ£¬±ÜÃâÿ´ÎÔËÐж¼ÊÖ¶¯ÊäÈëÊý¾Ý£¬ + * Òò¶øÔÊÐíÑ¡Ôñ´ÓÔ¤ÉèµÄÎļþpathÖжÁÈ¡²âÊÔÊý¾Ý¡£ + * + * Èç¹ûÐèÒª´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý£¬ÔòpathΪNULL£¬»òpath[kind]Ϊ""¡£ + * Èç¹ûÐèÒª´ÓÎļþÖжÁÈ¡Êý¾Ý£¬ÔòÐèÒªÔÚpathÖÐÌîдÎļþÃûÐÅÏ¢¡£ + */ +Status CreateGraph(ALGraph* G, char* path[]); + +/* + * ¹¹ÔìÓÐÏòͼ + */ +static Status CreateDG(ALGraph* G); + +/* + * ¹¹ÔìÓÐÏòÍø + */ +static Status CreateDN(ALGraph* G); + +/* + * ¹¹ÔìÎÞÏòͼ + */ +static Status CreateUDG(ALGraph* G); + +/* + * ¹¹ÔìÎÞÏòÍø + */ +static Status CreateUDN(ALGraph* G); + +/* + * ¼Èë±ß/»¡µÄÏà¹Ø¸½¼ÓÐÅÏ¢ + */ +static void Input(ALGraph G, InfoType** info); + +/* + * ²éÕÒ + * + * ·µ»Ø¶¥µãuÔÚͼ/ÍøÖеÄλÖà + */ +int LocateVex(ALGraph G, VertexType u); + +/* + * ¹¹ÔìÒ»¸ö±ß/»¡½áµã(½öÏÞÄÚ²¿Ê¹ÓÃ) + */ +static ArcNode* newArcNodePtr(int adjvex, ArcNode* nextarc, InfoType* info); + +/* + * ²åÈë±ß/»¡ + * + * Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬Ôò²åÈëÒ»Ìõ»¡ÐèÒªÔö¼ÓÁ½¸ö¶¥µã¹ØÏµ£¬µ«»¡µÄÊýÁ¿Ö»ÔöÒ»¡£ + * ¶ÔÓÚͼ/ÍøÀ´Ëµ£¬¿ÉÒÔÔڿɱä²ÎÊýÖÐÁгö±ß/»¡µÄ¸½¼ÓÐÅÏ¢¡£ + * + * ×¢£º´Ë´¦½ÓÊյIJÎÊýÓëMGraphÓÐЩ²»Ò»Ñù£ºÍøµÄ¸½¼ÓÐÅÏ¢Öаüº¬Á˸÷Ìõ±ß/»¡µÄȨֵ¡£ + */ +Status InsertArc(ALGraph* G, VertexType v, VertexType w, ...); + +/* + * ÒÔͼÐλ¯ÐÎʽÊä³öµ±Ç°½á¹¹ + */ +void PrintGraph(ALGraph G); + +#endif diff --git a/VisualC++/ExerciseBook/07.21/TestData_DG.txt b/VisualC++/ExerciseBook/07.21/TestData_DG.txt new file mode 100644 index 0000000..b8bfff7 --- /dev/null +++ b/VisualC++/ExerciseBook/07.21/TestData_DG.txt @@ -0,0 +1,6 @@ +ͼÀàÐÍ¡ú0£¨ÓÐÏòͼ£© +¶¥µãÊý¡ú5 +»¡Êý¡ú10 +»¡ÊÇ·ñ´øÓÐÆäËûÐÅÏ¢¡ú0 +¶¥µã¼¯¡ú¡¾A£¬B£¬C£¬D£¬E¡¿ +»¡µÄ¼¯ºÏ¡ú¡¾A£¬B¡¿¡¾A£¬C¡¿¡¾A£¬D¡¿¡¾A£¬E¡¿¡¾B£¬A¡¿¡¾B£¬C¡¿¡¾B£¬D¡¿¡¾B£¬E¡¿¡¾C£¬D¡¿¡¾E£¬D¡¿ \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.21/TestData_DN.txt b/VisualC++/ExerciseBook/07.21/TestData_DN.txt new file mode 100644 index 0000000..ad267ed --- /dev/null +++ b/VisualC++/ExerciseBook/07.21/TestData_DN.txt @@ -0,0 +1,6 @@ +ͼÀàÐÍ¡ú1£¨ÓÐÏòÍø£© +¶¥µãÊý¡ú5 +»¡Êý¡ú10 +»¡ÊÇ·ñ´øÓÐÆäËûÐÅÏ¢¡ú1 +¶¥µã¼¯¡ú¡¾A£¬B£¬C£¬D£¬E¡¿ +»¡µÄ¼¯ºÏ¡ú¡¾A£¬B£¬5¡¿¡¾A£¬C£¬1¡¿¡¾A£¬D£¬2¡¿¡¾A£¬E£¬6¡¿¡¾B£¬A£¬5¡¿¡¾B£¬C£¬2¡¿¡¾B£¬D£¬8¡¿¡¾B£¬E£¬7¡¿¡¾C£¬D£¬2¡¿¡¾E£¬D£¬3¡¿ \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.21/TestData_UDG.txt b/VisualC++/ExerciseBook/07.21/TestData_UDG.txt new file mode 100644 index 0000000..35622d5 --- /dev/null +++ b/VisualC++/ExerciseBook/07.21/TestData_UDG.txt @@ -0,0 +1,6 @@ +ͼÀàÐÍ¡ú2£¨ÎÞÏòͼ£© +¶¥µãÊý¡ú5 +±ßÊý¡ú10 +±ßÊÇ·ñ´øÓÐÆäËûÐÅÏ¢¡ú0 +¶¥µã¼¯¡ú¡¾A£¬B£¬C£¬D£¬E¡¿ +±ßµÄ¼¯ºÏ¡ú¡¾A£¬B¡¿¡¾A£¬C¡¿¡¾A£¬D¡¿¡¾A£¬E¡¿¡¾B£¬C¡¿¡¾B£¬D¡¿¡¾B£¬E¡¿¡¾C£¬D¡¿¡¾C£¬E¡¿¡¾D£¬E¡¿ \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.21/TestData_UDN.txt b/VisualC++/ExerciseBook/07.21/TestData_UDN.txt new file mode 100644 index 0000000..0cd5c13 --- /dev/null +++ b/VisualC++/ExerciseBook/07.21/TestData_UDN.txt @@ -0,0 +1,6 @@ +ͼÀàÐÍ¡ú3£¨ÎÞÏòÍø£© +¶¥µãÊý¡ú5 +±ßÊý¡ú10 +±ßÊÇ·ñ´øÓÐÆäËûÐÅÏ¢¡ú1 +¶¥µã¼¯¡ú¡¾A£¬B£¬C£¬D£¬E¡¿ +±ßµÄ¼¯ºÏ¡ú¡¾A£¬B£¬1¡¿¡¾A£¬C£¬3¡¿¡¾A£¬D£¬2¡¿¡¾A£¬E£¬1¡¿¡¾B£¬C£¬5¡¿¡¾B£¬D£¬3¡¿¡¾B£¬E£¬6¡¿¡¾C£¬D£¬8¡¿¡¾C£¬E£¬4¡¿¡¾D£¬E£¬7¡¿ \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.22-07.23/07.22-07.23.c b/VisualC++/ExerciseBook/07.22-07.23/07.22-07.23.c new file mode 100644 index 0000000..bd95121 --- /dev/null +++ b/VisualC++/ExerciseBook/07.22-07.23/07.22-07.23.c @@ -0,0 +1,213 @@ +#include +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// +#include "ALGraph.h" //**¡ø07 ͼ**// + +// ·ÃÎʱêÖ¾Êý×飬¼Ç¼·ÃÎʹýµÄ¶¥µã +static Boolean visited[MAX_VERTEX_NUM]; + + +/* + * ͨ¹ýÉî¶ÈÓÅÏȱéÀú£¬Êä³ö¶¥µãviµ½vjÖ®¼äµÄ·¾¶ + */ +void Algo_7_22(ALGraph G, VertexType vi, VertexType vj); + +/* + * Éî¶ÈÓÅÏȱéÀúͼG£¬²éÕÒ¶¥µãiµ½¶¥µãjÖ®¼äµÄ·¾¶´æÈëpath + */ +static Status DFS_7_22(ALGraph G, int i, int j, int path[MAX_VERTEX_NUM + 1]); + +/* + * ͨ¹ý¹ã¶ÈÓÅÏȱéÀú£¬Êä³ö¶¥µãviµ½vjÖ®¼äµÄ·¾¶ + */ +void Algo_7_23(ALGraph G, VertexType vi, VertexType vj); + +/* + * ¹ã¶ÈÓÅÏȱéÀúͼG£¬²éÕÒ¶¥µãiµ½¶¥µãjÖ®¼äµÄ·¾¶´æÈëpath + */ +static Status BFS_7_23(ALGraph G, int i, int j, int path[MAX_VERTEX_NUM + 1]); + + +int main(int argc, char* argv[]) { + ALGraph G; + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ´´½¨²¢Êä³öͼ...\n"); + { + char* path[4]; + + path[0] = "TestData_DG.txt"; + path[1] = ""; + path[2] = ""; + path[3] = ""; + + CreateGraph(&G, path); + PrintGraph(G); + printf("\n"); + } + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ Ìâ7.22£ºÍ¨¹ýÉî¶ÈÓÅÏȱéÀúÅжÏÁ½¶¥µã¼äÊÇ·ñ´æÔÚ·¾¶...\n"); + { + VertexType vi = 'A'; + VertexType vj = 'F'; + + Algo_7_22(G, vi, vj); + printf("\n"); + } + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ Ìâ7.23£ºÍ¨¹ý¹ã¶ÈÓÅÏȱéÀúÅжÏÁ½¶¥µã¼äÊÇ·ñ´æÔÚ·¾¶...\n"); + { + VertexType vi = 'A'; + VertexType vj = 'F'; + + Algo_7_23(G, vi, vj); + printf("\n"); + } + + return 0; +} + + +/* + * ͨ¹ýÉî¶ÈÓÅÏȱéÀú£¬Åж϶¥µãviµ½vjÖ®¼äÊÇ·ñ´æÔÚ·¾¶ + */ +void Algo_7_22(ALGraph G, VertexType vi, VertexType vj) { + int i, j, k; + int path[MAX_VERTEX_NUM + 1]; + + for(k = 0; k < G.vexnum; k++) { + visited[k] = FALSE; + } + + i = LocateVex(G, vi); + j = LocateVex(G, vj); + + path[0] = 0; + + if(DFS_7_22(G, i, j, path) == ERROR) { + printf("%c µ½ %c Ö®¼ä²»´æÔÚͨ·£¡\n", vi, vj); + return; + } + + printf("%c µ½ %c Ö®¼äµÄͨ·Ϊ£º", vi, vj); + for(k = 1; k <= path[0]; k++) { + printf("%c ", GetVex(G, path[k])); + } + printf("\n"); +} + +/* + * Éî¶ÈÓÅÏȱéÀúͼG£¬²éÕÒ¶¥µãiµ½¶¥µãjÖ®¼äµÄ·¾¶´æÈëpath + */ +static Status DFS_7_22(ALGraph G, int i, int j, int path[MAX_VERTEX_NUM + 1]) { + int w; + + // ½«¶¥µãi¼ÓÈë·¾¶ + visited[i] = TRUE; + path[0]++; + path[path[0]] = i; + + if(i == j) { + return OK; + } + + // ±éÀúviËùÓÐÁÚ½Óµã + for(w = FirstAdjVex(G, GetVex(G, i)); w >= 0; w = NextAdjVex(G, GetVex(G, i), GetVex(G, w))) { + // Ìø¹ýÒÑ·ÃÎʵĶ¥µã + if(visited[w]) { + continue; + } + + // µÝ¹é(Éî¶ÈÓÅÏÈ) + if(DFS_7_22(G, w, j, path) == OK) { + return OK; + } + } + + // ÒÆ³ý¶¥µãi + visited[i] = FALSE; + path[0]--; + + return ERROR; +} + +/* + * ͨ¹ý¹ã¶ÈÓÅÏȱéÀú£¬Åж϶¥µãviµ½vjÖ®¼äÊÇ·ñ´æÔÚ·¾¶ + */ +void Algo_7_23(ALGraph G, VertexType vi, VertexType vj) { + int i, j, k; + int path[MAX_VERTEX_NUM + 1]; + + for(k = 0; k < G.vexnum; k++) { + visited[k] = FALSE; + } + + i = LocateVex(G, vi); + j = LocateVex(G, vj); + + path[0] = 0; + + if(BFS_7_23(G, i, j, path) == ERROR) { + printf("%c µ½ %c Ö®¼ä²»´æÔÚͨ·£¡\n", vi, vj); + return; + } + + printf("%c µ½ %c Ö®¼äµÄͨ·Ϊ£º", vi, vj); + for(k = 1; k <= path[0]; k++) { + printf("%c ", GetVex(G, path[k])); + } + printf("\n"); +} + +/* + * ¹ã¶ÈÓÅÏȱéÀúͼG£¬²éÕÒ¶¥µãiµ½¶¥µãjÖ®¼äµÄ·¾¶´æÈëpath + */ +static Status BFS_7_23(ALGraph G, int i, int j, int path[MAX_VERTEX_NUM + 1]) { + int w; + LinkQueue Q; + QElemType e; + + // ½«¶¥µãi¼ÓÈë·¾¶ + visited[i] = TRUE; + path[0]++; + path[path[0]] = i; + + if(i == j) { + return OK; + } + + // Öÿո¨Öú¶ÓÁÐ + InitQueue(&Q); + + // ±éÀúviËùÓÐÁÚ½Óµã + for(w = FirstAdjVex(G, GetVex(G, i)); w >= 0; w = NextAdjVex(G, GetVex(G, i), GetVex(G, w))) { + // Ìø¹ýÒÑ·ÃÎʵĶ¥µã + if(visited[w]) { + continue; + } + + if(w == j) { + // ½«¶¥µãw¼ÓÈë·¾¶ + visited[w] = TRUE; + path[0]++; + path[path[0]] = w; + return OK; + } + + EnQueue(&Q, w); + } + + // ´ÓÁÚ½Óµã³ö·¢£¬¼ÌÐøÑ°ÕÒÄ¿±ê·¾¶ + while(!QueueEmpty(Q)) { + DeQueue(&Q, &e); + + // µÝ¹é(¹ã¶ÈÓÅÏÈ) + if(BFS_7_23(G, e, j, path) == OK) { + return OK; + } + } + + // ÒÆ³ý¶¥µãi + visited[i] = FALSE; + path[0]--; + + return ERROR; +} diff --git a/VisualC++/ExerciseBook/07.22-07.23/07.22-07.23.png b/VisualC++/ExerciseBook/07.22-07.23/07.22-07.23.png new file mode 100644 index 0000000000000000000000000000000000000000..cfe4c39968b1c8e22b3675a030cdf7d1da88b0f6 GIT binary patch literal 8413 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 S1n!XpJoP8qDrNAOsQ&|B!4&TR literal 0 HcmV?d00001 diff --git a/VisualC++/ExerciseBook/07.22-07.23/07.22-07.23.vcxproj b/VisualC++/ExerciseBook/07.22-07.23/07.22-07.23.vcxproj new file mode 100644 index 0000000..bc84a09 --- /dev/null +++ b/VisualC++/ExerciseBook/07.22-07.23/07.22-07.23.vcxproj @@ -0,0 +1,81 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {B144CAC0-81E4-4F92-9E6D-252CC12F3FD4} + My07220723 + + + + Application + true + MultiByte + + + Application + false + true + MultiByte + + + + + + + + + + + + + $(SolutionDir)\..\Status;$(IncludePath) + + + + Level3 + Disabled + + + true + $(SolutionDir)\..\Status\Status.lib;%(AdditionalDependencies) + Console + + + + + Level3 + MaxSpeed + true + true + + + true + true + true + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.22-07.23/07.22-07.23.vcxproj.filters b/VisualC++/ExerciseBook/07.22-07.23/07.22-07.23.vcxproj.filters new file mode 100644 index 0000000..ace575b --- /dev/null +++ b/VisualC++/ExerciseBook/07.22-07.23/07.22-07.23.vcxproj.filters @@ -0,0 +1,41 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + æºæ–‡ä»¶ + + + æºæ–‡ä»¶ + + + æºæ–‡ä»¶ + + + + + 头文件 + + + 头文件 + + + + + èµ„æºæ–‡ä»¶ + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.22-07.23/07.22-07.23.vcxproj.user b/VisualC++/ExerciseBook/07.22-07.23/07.22-07.23.vcxproj.user new file mode 100644 index 0000000..ace9a86 --- /dev/null +++ b/VisualC++/ExerciseBook/07.22-07.23/07.22-07.23.vcxproj.user @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.22-07.23/ALGraph.c b/VisualC++/ExerciseBook/07.22-07.23/ALGraph.c new file mode 100644 index 0000000..965a07c --- /dev/null +++ b/VisualC++/ExerciseBook/07.22-07.23/ALGraph.c @@ -0,0 +1,405 @@ +/*================== + * ͼµÄÁÚ½Ó±í´æ´¢±íʾ + ===================*/ + +#include "ALGraph.h" + +// ¼ÈëÊý¾ÝµÄÔ´Îļþ£»fpΪnullʱ£¬ËµÃ÷ÐèÒª´Ó¿ØÖÆÌ¨Â¼Èë +static FILE* fp = NULL; + +/* + * IncInfoָʾ¸Ãͼ/ÍøµÄ±ß/»¡ÉÏÊÇ·ñ´æÔÚ¸½¼ÓÐÅÏ¢¡£ + * Èç¹ûÆäÖµ²»Îª0£¬Ôò±íʾÎÞ¸½¼ÓÐÅÏ¢£¬·ñÔò£¬±íʾ´æÔÚ¸½¼ÓÐÅÏ¢¡£ + */ +Boolean IncInfo = FALSE; + +// ·ÃÎʱêÖ¾Êý×飬¼Ç¼·ÃÎʹýµÄ¶¥µã +static Boolean visited[MAX_VERTEX_NUM]; + +// º¯Êý±äÁ¿ +static Status (* VisitFunc)(VertexType e); + + +/* + * ´´½¨ + * + *¡¾±¸×¢¡¿ + * + * ½Ì²ÄÖÐĬÈÏ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý¡£ + * ÕâÀïΪÁË·½±ã²âÊÔ£¬±ÜÃâÿ´ÎÔËÐж¼ÊÖ¶¯ÊäÈëÊý¾Ý£¬ + * Òò¶øÔÊÐíÑ¡Ôñ´ÓÔ¤ÉèµÄÎļþpathÖжÁÈ¡²âÊÔÊý¾Ý¡£ + * + * Èç¹ûÐèÒª´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý£¬ÔòpathΪNULL£¬»òpath[kind]Ϊ""¡£ + * Èç¹ûÐèÒª´ÓÎļþÖжÁÈ¡Êý¾Ý£¬ÔòÐèÒªÔÚpathÖÐÌîдÎļþÃûÐÅÏ¢¡£ + */ +Status CreateGraph(ALGraph* G, char* path[]) { + int readFromConsole; // ÊÇ·ñ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý + int kind; + Status flag; + + // ¡ï¡ï¡ï´Ë´¦¹Ì¶¨ÎªÓÐÏòͼ + kind = 0; + + // Èç¹ûûÓÐÎļþ·¾¶ÐÅÏ¢£¬Ôò´Ó¿ØÖÆÌ¨¶ÁÈ¡ÊäÈë + readFromConsole = (path == NULL) || strcmp(path[kind], "") == 0; + + // ÐèÒª´ÓÎļþ¶ÁÈ¡ + if(readFromConsole) { + (*G).kind = kind; // ¼Ç¼ͼ/ÍøµÄÀàÐÍ + } else { + // ´ò¿ªÎļþ£¬×¼±¸¶ÁÈ¡²âÊÔÊý¾Ý + fp = fopen(path[kind], "r"); + if(fp == NULL) { + return ERROR; + } + + // ¼ÈëͼµÄÀàÐÍ + ReadData(fp, "%d", &((*G).kind)); + } + + // Ëæ»ú´´½¨ÓÐÏòͼ/Íø»òÎÞÏòͼ/ÍøµÄÒ»ÖÖ + switch((*G).kind) { + case DG: + flag = CreateDG(G); + break; + default: + flag = ERROR; + break; + } + + if(fp != NULL) { + fclose(fp); + fp = NULL; + } + + return flag; +} + +/* + * ¹¹ÔìÓÐÏòͼ + */ +static Status CreateDG(ALGraph* G) { + int i, k; + int vexnum, arcnum; + VertexType v1, v2; + InfoType* info = NULL; + + (*G).vexnum = (*G).arcnum = 0; + + if(fp == NULL) { + printf("ÇëÊäÈëÓÐÏòͼµÄ¶¥µãÊý£º"); + scanf("%d", &vexnum); + printf("ÇëÊäÈëÓÐÏòͼµÄ»¡Êý£º"); + scanf("%d", &arcnum); + printf("¸ÃÓÐÏòͼµÄ»¡ÉÏÊÇ·ñ°üº¬ÆäËû¸½¼ÓÐÅÏ¢(0-²»°üº¬©¦1-°üº¬)£º"); + scanf("%d", &IncInfo); + + // ¼Èë¶¥µã¼¯ + printf("Çë¼Èë %d ¸ö¶¥µã£¬²»Í¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º", vexnum); + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(stdin); + scanf("%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } else { + ReadData(fp, "%d", &vexnum); // ¼Èë¶¥µãÊý + ReadData(fp, "%d", &arcnum); // ¼È뻡Êý + ReadData(fp, "%d", &IncInfo); // Åжϻ¡ÉÏÊÇ·ñ°üº¬¸½¼ÓÐÅÏ¢ + + // ¼Èë¶¥µã¼¯ + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(fp); + ReadData(fp, "%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } + + // ½öÔÚ¿ØÖÆÌ¨Â¼ÈëÐÅϢʱÊä³ö´ËÌáʾ + if(fp == NULL && arcnum != 0) { + printf("ÇëΪÓÐÏòͼÒÀ´Î¼Èë %d Ìõ»¡µÄÐÅÏ¢£¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º\n", arcnum); + } + + // ¼È뻡µÄÐÅÏ¢ + for(k = 0; k < arcnum; k++) { + if(fp == NULL) { + printf("µÚ %2d Ìõ»¡£º", k + 1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v2); + } else { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + skipBlank(fp); + ReadData(fp, "%c%c", &v1, &v2); + } + + // Èç¹ûÐèҪ¼È뻡µÄÆäËû¸½¼ÓÐÅÏ¢ + if(IncInfo) { + // ×îºó¼È븽¼ÓÐÅÏ¢ + Input(*G, &info); + } + + // ²åÈ뻡 + InsertArc(G, v1, v2, info); + } + + // ´ÓÎļþÖжÁÈ¡Êý¾Ýʱ£¬×îºóÆäʵӦµ±ÅжÏÒ»ÏÂÊÇ·ñ¶Áµ½ÁË×ã¹»µÄÐÅÏ¢ + return OK; +} + +/* + * ¼Èë±ß/»¡µÄÏà¹Ø¸½¼ÓÐÅÏ¢ + */ +static void Input(ALGraph G, InfoType** info) { + int weight; + + // ÔÚ"Íø"µÄÇéÐÎÏÂÐèҪ¼ÈëȨֵÐÅÏ¢ + if(G.kind == DN || G.kind == UDN) { + *info = (InfoType*) malloc(sizeof(InfoType)); + + if(fp == NULL) { + scanf("%d", &weight); + } else { + ReadData(fp, "%d", &weight); + } + + (*info)->weight = weight; + } +} + +/* + * ²éÕÒ + * + * ·µ»Ø¶¥µãuÔÚͼ/ÍøÖеÄλÖà + */ +int LocateVex(ALGraph G, VertexType u) { + int i; + + for(i = 0; i < G.vexnum; i++) { + if(G.vertices[i].data == u) { + return i; + } + } + + return -1; +} + +/* + * ȡֵ + * + * ·µ»ØË÷Òýv´¦µÄ¶¥µãÖµ + */ +VertexType GetVex(ALGraph G, int v) { + if(v < 0 || v >= G.vexnum) { + return '\0'; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + return G.vertices[v].data; +} + +/* + * Ê׸öÁÚ½Óµã + * + * ·µ»Ø¶¥µãvµÄÊ׸öÁÚ½Óµã + */ +int FirstAdjVex(ALGraph G, VertexType v) { + int k; + ArcNode* r; + + // Ê×ÏÈÐèÒªÅжϸö¥µãÊÇ·ñ´æÔÚ + k = LocateVex(G, v); + if(k == -1) { + return -1; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + r = G.vertices[k].firstarc; + if(r == NULL) { + return -1; + } else { + return r->adjvex; + } +} + +/* + * ÏÂÒ»¸öÁÚ½Óµã + * + * ·µ»Ø¶¥µãvµÄ(Ïà¶ÔÓÚwµÄ)ÏÂÒ»¸öÁÚ½Óµã + */ +int NextAdjVex(ALGraph G, VertexType v, VertexType w) { + int kv, kw; + ArcNode* r; + + // Ê×ÏÈÐèÒªÅжϸö¥µãÊÇ·ñ´æÔÚ + kv = LocateVex(G, v); + if(kv == -1) { + return -1; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + // Ê×ÏÈÐèÒªÅжϸö¥µãÊÇ·ñ´æÔÚ + kw = LocateVex(G, w); + if(kw == -1) { + return -1; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + r = G.vertices[kv].firstarc; + if(r == NULL) { + return -1; // Á´±íΪ¿Õ + } + + // ÔÚÁ´±íÖвéÕÒw + while(r != NULL && r->adjvex < kw) { + r = r->nextarc; + } + + // Èç¹ûûÕÒµ½w + if(r == NULL) { + return -1; + } + + // Èç¹ûÕÒµ½ÁËw£¬µ«ÊÇwºóÃæÃ»ÓбðµÄ¶¥µã£¬ÄÇôҲÎÞ·¨·µ»ØÁÚ½Óµã + if(r->adjvex == kw && r->nextarc != NULL) { + return r->nextarc->adjvex; + } + + return -1; +} + +/* + * ¹¹ÔìÒ»¸ö±ß/»¡½áµã(½öÏÞÄÚ²¿Ê¹ÓÃ) + */ +static ArcNode* newArcNodePtr(int adjvex, ArcNode* nextarc, InfoType* info) { + ArcNode* p = (ArcNode*) malloc(sizeof(ArcNode)); + if(!p) { + exit(OVERFLOW); + } + + p->adjvex = adjvex; + + p->nextarc = nextarc; + + p->info = info; + + return p; +} + +/* + * ²åÈë±ß/»¡ + * + * Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬Ôò²åÈëÒ»Ìõ»¡ÐèÒªÔö¼ÓÁ½¸ö¶¥µã¹ØÏµ£¬µ«»¡µÄÊýÁ¿Ö»ÔöÒ»¡£ + * ¶ÔÓÚͼ/ÍøÀ´Ëµ£¬¿ÉÒÔÔڿɱä²ÎÊýÖÐÁгö±ß/»¡µÄ¸½¼ÓÐÅÏ¢¡£ + * + * ×¢£º´Ë´¦½ÓÊյIJÎÊýÓëMGraphÓÐЩ²»Ò»Ñù£ºÍøµÄ¸½¼ÓÐÅÏ¢Öаüº¬Á˸÷Ìõ±ß/»¡µÄȨֵ¡£ + */ +Status InsertArc(ALGraph* G, VertexType v, VertexType w, ...) { + int tail, head, k, count; + ArcNode* r; + ArcNode* pre; + Boolean overlay = FALSE; // ÊÇ·ñΪ¸²¸ÇÌí¼Ó + InfoType* info = NULL; // ±ß/»¡µÄ¸½¼ÓÐÅÏ¢ + va_list ap; + + tail = LocateVex(*G, v); // »ñÈ¡¶¥µãvÔÚ¶¥µã¼¯ÖеÄλÖà + if(tail == -1) { + return ERROR; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + head = LocateVex(*G, w); // »ñÈ¡¶¥µãwÔÚ¶¥µã¼¯ÖеÄλÖà + if(head == -1) { + return ERROR; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + // ¾Ü¾ø»· + if(tail == head) { + return ERROR; + } + + // Èç¹û±ß/»¡ÉÏ´æÔÚ¸½¼ÓÐÅÏ¢ + if(IncInfo) { + va_start(ap, w); // ÔÚwºó²éѯÊ׸ö¿É±ä²ÎÊý + info = va_arg(ap, InfoType*); // »ñÈ¡¸½¼ÓÐÅÏ¢ + va_end(ap); + } + + /* ½ÓÏÂÀ´£¬ÐèÒª²éÕÒºÏÊʵIJåÈëλÖà */ + + for(count = 0; count < 2; count++) { + pre = NULL; + // Ö¸ÏòÒÔtailΪβµÄÊ×Ìõ±ß/»¡ + r = G->vertices[tail].firstarc; + while(r != NULL && r->adjvex < head) { + pre = r; + r = r->nextarc; + } + + // Óöµ½ÁËÏàͬλÖõĽáµã + if(r != NULL && r->adjvex == head) { + r->info = info; // ¸´Óøýáµã + overlay = TRUE; // ·¢ÉúÁ˸²¸Ç + } else { + if(pre == NULL) { + G->vertices[tail].firstarc = newArcNodePtr(head, r, info); + } else { + pre->nextarc = newArcNodePtr(head, r, info); + } + } + + // Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬ÐèÒª¿¼ÂǶԳÆÐÔ + if((G->kind == UDG || G->kind == UDN) && tail != head) { + // µßµ¹iºÍj + k = tail; + tail = head; + head = k; + } else { + break; // Èç¹ûÊÇÓÐÏòµÄ£¬¿ÉÒÔ½áÊøÁË + } + } + + // ÔڷǸ²¸ÇµÄÇéÐÎÏ£¬²Å¿¼ÂǸüбß/»¡µÄÊýÁ¿ + if(!overlay) { + (*G).arcnum++; // ²»ÂÛÓÐÏòÎÞÏò£¬±ß/»¡ÊýÖ»ÔöÒ» + } + + return OK; +} + +/* + * ÒÔͼÐλ¯ÐÎʽÊä³öµ±Ç°½á¹¹ + */ +void PrintGraph(ALGraph G) { + int i; + ArcNode* p; + + if(G.vexnum == 0) { + printf("¿Õͼ£¬ÎÞÐè´òÓ¡£¡\n"); + return; + } + + printf("µ±Ç°Í¼/Íø°üº¬ %2d ¸ö¶¥µã£¬ %2d Ìõ±ß/»¡...\n", G.vexnum, G.arcnum); + + for(i = 0; i < G.vexnum; i++) { + printf("%c ===> ", G.vertices[i].data); + + p = G.vertices[i].firstarc; + while(p != NULL) { + if(IncInfo == 0) { + printf("%c ", G.vertices[p->adjvex].data); + + // ¶ÔÓÚÍø£¬»á´ÓÆä¸½¼ÓÐÅÏ¢ÖлñÈ¡µ½È¨Öµ + } else { + printf("%c[%2d] ", G.vertices[p->adjvex].data, p->info->weight); + } + + p = p->nextarc; + + if(p != NULL) { + printf("- "); + } + } + + printf("\n"); + } +} diff --git a/VisualC++/ExerciseBook/07.22-07.23/ALGraph.h b/VisualC++/ExerciseBook/07.22-07.23/ALGraph.h new file mode 100644 index 0000000..beac42a --- /dev/null +++ b/VisualC++/ExerciseBook/07.22-07.23/ALGraph.h @@ -0,0 +1,150 @@ +/*================== + * ͼµÄÁÚ½Ó±í´æ´¢±íʾ + ===================*/ + +#ifndef ALGRAPH_H +#define ALGRAPH_H + +#include +#include // Ìṩmemset¡¢strcmp Ô­ÐÍ +#include // Ìṩºêva_list¡¢va_start¡¢va_arg¡¢va_end +#include // Ìṩmalloc¡¢realloc¡¢free¡¢exitÔ­ÐÍ +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// +#include "LinkQueue.h" //**¡ø03 Õ»ºÍ¶ÓÁÐ**// + +/* + * ×¢£º + * + * ͨ³£À´½²£¬ÎÞȨͼ±»¼ò³ÆÎª¡¾Í¼¡¿£¬ÓÐȨͼ±»¼ò³ÆÎª¡¾Íø¡¿¡£ + * ÎÞÏòͼ/ÍøÖеĶ¥µã¹ØÏµ±»³ÆÎª¡¾±ß¡¿£¬ÓÐÏòͼ/ÍøÖеĶ¥µã¹ØÏµ±»³ÆÎª¡¾»¡¡¿£¬²¢Çø·Ö»¡Í·Ó뻡β¡£ + * ʵ¼Ê±íÊöÖУ¬Î´±Ø»áÑϸñ×ñÊØÒÔÉÏÃüÃû¡£ + * + * µ±Ç°½á¹¹Êʺϴ洢±ß/»¡±È½ÏÏ¡ÊèµÄͼ/Íø¡£ + * + * ¡ï ²åÈë±ß/»¡µÄÐÅϢʱ£¬ÕâÀïµÄʵÏÖÊǰ´"ÉýÐò"²åÈëµÄ£¬ÕâʹµÃ²åÈëµÄ»¡Êǰ´"ÉýÐò"ÅÅÁеġ£ + */ + + +/* ºê¶¨Òå */ +#define MAX_VERTEX_NUM 26 // ×î´ó¶¥µã¸öÊý + + +// ͼµÄÀàÐÍ +typedef enum { + DG, // 0-ÓÐÏòͼ + DN, // 1-ÓÐÏòÍø(´øÈ¨Öµ) + UDG, // 2-ÎÞÏòͼ + UDN // 3-ÎÞÏòÍø(´øÈ¨Öµ) +} GraphKind; + +// ¶¥µãÀàÐÍ +typedef char VertexType; + +// ±ß/»¡µÄÏà¹Ø¸½¼ÓÐÅÏ¢ +typedef struct { + /* + * ×¢£º + * ½Ì²ÄÖиø³öµÄ½á¹¹Ö»¿¼ÂÇÁËÎÞȨͼ£¬¶øÃ»¿¼ÂÇÓÐȨͼ(Íø)¡£ + * ÕâÀïΪÁ˰ѡ°Íø¡±µÄÇéÐÎÒ²¿¼ÂǽøÈ¥£¬ÌØÔÚ¸½¼ÓÐÅÏ¢ÖÐÔö¼ÓÁË"È¨ÖØ"ÊôÐÔ¡£ + */ + int weight; +} InfoType; + +/* ±ß/»¡½áµã */ +typedef struct ArcNode { + int adjvex; // ¸Ã»¡ËùÖ¸ÏòµÄ¶¥µãµÄλÖà + struct ArcNode* nextarc; // Ö¸ÏòÏÂÒ»Ìõ»¡µÄÖ¸Õë + InfoType* info; // »¡µÄ¸½¼ÓÐÅÏ¢£¬Í¨³£ºöÂÔ +} ArcNode; + +// ÿ¸öÁ´±íµÄÍ·½áµã +typedef struct VNode { + VertexType data; // ¶¥µãÐÅÏ¢ + ArcNode* firstarc; // Ö¸ÏòµÚÒ»ÌõÒÀ¸½¸Ã¶¥µãµÄ»¡µÄÖ¸Õë +} VNode; + +/* ͼµÄÁÚ½Ó±í´æ´¢±íʾÀàÐͶ¨Òå */ +typedef struct { + VNode vertices[MAX_VERTEX_NUM]; // ÁÚ½Ó±í + int vexnum, arcnum; // ͼ/ÍøµÄ¶¥µãÊýºÍ»¡Êý + GraphKind kind; // ͼµÄÀàÐͱêÖ¾ +} ALGraph; + + +// ±ß/»¡ÉÏÊÇ·ñ´æÔÚ¸½¼ÓÐÅÏ¢ +extern Boolean IncInfo; + + +/* + * ´´½¨ + * + *¡¾±¸×¢¡¿ + * + * ½Ì²ÄÖÐĬÈÏ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý¡£ + * ÕâÀïΪÁË·½±ã²âÊÔ£¬±ÜÃâÿ´ÎÔËÐж¼ÊÖ¶¯ÊäÈëÊý¾Ý£¬ + * Òò¶øÔÊÐíÑ¡Ôñ´ÓÔ¤ÉèµÄÎļþpathÖжÁÈ¡²âÊÔÊý¾Ý¡£ + * + * Èç¹ûÐèÒª´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý£¬ÔòpathΪNULL£¬»òpath[kind]Ϊ""¡£ + * Èç¹ûÐèÒª´ÓÎļþÖжÁÈ¡Êý¾Ý£¬ÔòÐèÒªÔÚpathÖÐÌîдÎļþÃûÐÅÏ¢¡£ + */ +Status CreateGraph(ALGraph* G, char* path[]); + +/* + * ¹¹ÔìÓÐÏòͼ + */ +static Status CreateDG(ALGraph* G); + +/* + * ¼Èë±ß/»¡µÄÏà¹Ø¸½¼ÓÐÅÏ¢ + */ +static void Input(ALGraph G, InfoType** info); + +/* + * ²éÕÒ + * + * ·µ»Ø¶¥µãuÔÚͼ/ÍøÖеÄλÖà + */ +int LocateVex(ALGraph G, VertexType u); + +/* + * ȡֵ + * + * ·µ»ØË÷Òýv´¦µÄ¶¥µãÖµ + */ +VertexType GetVex(ALGraph G, int v); + +/* + * Ê׸öÁÚ½Óµã + * + * ·µ»Ø¶¥µãvµÄÊ׸öÁÚ½Óµã + */ +int FirstAdjVex(ALGraph G, VertexType v); + +/* + * ÏÂÒ»¸öÁÚ½Óµã + * + * ·µ»Ø¶¥µãvµÄ(Ïà¶ÔÓÚwµÄ)ÏÂÒ»¸öÁÚ½Óµã + */ +int NextAdjVex(ALGraph G, VertexType v, VertexType w); + +/* + * ¹¹ÔìÒ»¸ö±ß/»¡½áµã(½öÏÞÄÚ²¿Ê¹ÓÃ) + */ +static ArcNode* newArcNodePtr(int adjvex, ArcNode* nextarc, InfoType* info); + +/* + * ²åÈë±ß/»¡ + * + * Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬Ôò²åÈëÒ»Ìõ»¡ÐèÒªÔö¼ÓÁ½¸ö¶¥µã¹ØÏµ£¬µ«»¡µÄÊýÁ¿Ö»ÔöÒ»¡£ + * ¶ÔÓÚͼ/ÍøÀ´Ëµ£¬¿ÉÒÔÔڿɱä²ÎÊýÖÐÁгö±ß/»¡µÄ¸½¼ÓÐÅÏ¢¡£ + * + * ×¢£º´Ë´¦½ÓÊյIJÎÊýÓëMGraphÓÐЩ²»Ò»Ñù£ºÍøµÄ¸½¼ÓÐÅÏ¢Öаüº¬Á˸÷Ìõ±ß/»¡µÄȨֵ¡£ + */ +Status InsertArc(ALGraph* G, VertexType v, VertexType w, ...); + +/* + * ÒÔͼÐλ¯ÐÎʽÊä³öµ±Ç°½á¹¹ + */ +void PrintGraph(ALGraph G); + +#endif diff --git a/VisualC++/ExerciseBook/07.22-07.23/LinkQueue.c b/VisualC++/ExerciseBook/07.22-07.23/LinkQueue.c new file mode 100644 index 0000000..ac47060 --- /dev/null +++ b/VisualC++/ExerciseBook/07.22-07.23/LinkQueue.c @@ -0,0 +1,102 @@ +/*========================= + * ¶ÓÁеÄÁ´Ê½´æ´¢½á¹¹£¨Á´¶Ó£© + ==========================*/ + +#ifndef LINKQUEUE_C +#define LINKQUEUE_C + +#include "LinkQueue.h" //**¡ø03 Õ»ºÍ¶ÓÁÐ**// + +/* + * ³õʼ»¯ + * + * ¹¹ÔìÒ»¸ö¿ÕµÄÁ´¶Ó¡£ + * ³õʼ»¯³É¹¦Ôò·µ»ØOK£¬·ñÔò·µ»ØERROR¡£ + * + *¡¾×¢¡¿ + * ÕâÀïµÄ¶ÓÁдøÓÐÍ·½áµã + */ +Status InitQueue(LinkQueue* Q) { + if(Q == NULL) { + return ERROR; + } + + (*Q).front = (*Q).rear = (QueuePtr) malloc(sizeof(QNode)); + if(!(*Q).front) { + exit(OVERFLOW); + } + + (*Q).front->next = NULL; + + return OK; +} + +/* + * ÅÐ¿Õ + * + * ÅжÏÁ´¶ÓÖÐÊÇ·ñ°üº¬ÓÐЧÊý¾Ý¡£ + * + * ·µ»ØÖµ£º + * TRUE : Á´¶ÓΪ¿Õ + * FALSE: Á´¶Ó²»Îª¿Õ + */ +Status QueueEmpty(LinkQueue Q) { + if(Q.front == Q.rear) { + return TRUE; + } else { + return FALSE; + } +} + +/* + * Èë¶Ó + * + * ½«ÔªËØeÌí¼Óµ½¶ÓÁÐβ²¿¡£ + */ +Status EnQueue(LinkQueue* Q, QElemType e) { + QueuePtr p; + + if(Q == NULL || (*Q).front == NULL) { + return ERROR; + } + + p = (QueuePtr) malloc(sizeof(QNode)); + if(!p) { + exit(OVERFLOW); + } + + p->data = e; + p->next = NULL; + + (*Q).rear->next = p; + (*Q).rear = p; + + return OK; +} + +/* + * ³ö¶Ó + * + * ÒÆ³ý¶ÓÁÐÍ·²¿µÄÔªËØ£¬½«Æä´æ´¢µ½eÖС£ + */ +Status DeQueue(LinkQueue* Q, QElemType* e) { + QueuePtr p; + + if(Q == NULL || (*Q).front == NULL || (*Q).front == (*Q).rear) { + return ERROR; + } + + p = (*Q).front->next; + *e = p->data; + + (*Q).front->next = p->next; + if((*Q).rear == p) { + (*Q).rear = (*Q).front; + } + + free(p); + + return OK; +} + +#endif diff --git a/VisualC++/ExerciseBook/07.22-07.23/LinkQueue.h b/VisualC++/ExerciseBook/07.22-07.23/LinkQueue.h new file mode 100644 index 0000000..a380617 --- /dev/null +++ b/VisualC++/ExerciseBook/07.22-07.23/LinkQueue.h @@ -0,0 +1,64 @@ +/*========================= + * ¶ÓÁеÄÁ´Ê½´æ´¢½á¹¹£¨Á´¶Ó£© + ==========================*/ + +#ifndef LINKQUEUE_H +#define LINKQUEUE_H + +#include +#include // Ìṩmalloc¡¢realloc¡¢free¡¢exitÔ­ÐÍ +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// + +/* Á´¶ÓÔªËØÀàÐͶ¨Òå */ +typedef int QElemType; + +// ¶ÓÁÐÔªËØ½á¹¹ +typedef struct QNode { + QElemType data; + struct QNode* next; +} QNode, * QueuePtr; + +// ¶ÓÁнṹ +typedef struct { + QueuePtr front; // ¶ÓÍ·Ö¸Õë + QueuePtr rear; // ¶ÓβָÕë +} LinkQueue; // ¶ÓÁеÄÁ´Ê½´æ´¢±íʾ + + +/* + * ³õʼ»¯ + * + * ¹¹ÔìÒ»¸ö¿ÕµÄÁ´¶Ó¡£ + * ³õʼ»¯³É¹¦Ôò·µ»ØOK£¬·ñÔò·µ»ØERROR¡£ + * + *¡¾×¢¡¿ + * ÕâÀïµÄ¶ÓÁдøÓÐÍ·½áµã + */ +Status InitQueue(LinkQueue* Q); + +/* + * ÅÐ¿Õ + * + * ÅжÏÁ´¶ÓÖÐÊÇ·ñ°üº¬ÓÐЧÊý¾Ý¡£ + * + * ·µ»ØÖµ£º + * TRUE : Á´¶ÓΪ¿Õ + * FALSE: Á´¶Ó²»Îª¿Õ + */ +Status QueueEmpty(LinkQueue Q); + +/* + * Èë¶Ó + * + * ½«ÔªËØeÌí¼Óµ½¶ÓÁÐβ²¿¡£ + */ +Status EnQueue(LinkQueue* Q, QElemType e); + +/* + * ³ö¶Ó + * + * ÒÆ³ý¶ÓÁÐÍ·²¿µÄÔªËØ£¬½«Æä´æ´¢µ½eÖС£ + */ +Status DeQueue(LinkQueue* Q, QElemType* e); + +#endif diff --git a/VisualC++/ExerciseBook/07.22-07.23/TestData_DG.txt b/VisualC++/ExerciseBook/07.22-07.23/TestData_DG.txt new file mode 100644 index 0000000..c17bb67 --- /dev/null +++ b/VisualC++/ExerciseBook/07.22-07.23/TestData_DG.txt @@ -0,0 +1,6 @@ +ͼÀàÐÍ¡ú0£¨ÓÐÏòͼ£© +¶¥µãÊý¡ú6 +»¡Êý¡ú11 +»¡ÊÇ·ñ´øÓÐÆäËûÐÅÏ¢¡ú0 +¶¥µã¼¯¡ú¡¾A£¬B£¬C£¬D£¬E£¬F¡¿ +»¡µÄ¼¯ºÏ¡ú¡¾A£¬C¡¿¡¾A£¬D¡¿¡¾B£¬D¡¿¡¾C£¬D¡¿¡¾C£¬E¡¿¡¾D£¬C¡¿¡¾E£¬A¡¿¡¾E£¬B¡¿¡¾E£¬F¡¿¡¾F£¬B¡¿¡¾F£¬D¡¿ \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.24/07.24.c b/VisualC++/ExerciseBook/07.24/07.24.c new file mode 100644 index 0000000..c01fdb0 --- /dev/null +++ b/VisualC++/ExerciseBook/07.24/07.24.c @@ -0,0 +1,91 @@ +#include +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// +#include "SqStack.h" //**¡ø03 Õ»ºÍ¶ÓÁÐ**// +#include "MGraph.h" //**¡ø07 ͼ**// + +// ·ÃÎʱêÖ¾Êý×飬¼Ç¼·ÃÎʹýµÄ¶¥µã +static Boolean visited[MAX_VERTEX_NUM]; + + +/* + * ÀûÓÃÕ»¶ÔÓÐÏòÇ¿Á¬Í¨Í¼½øÐÐÉî¶ÈÓÅÏȱéÀú£¬ + * ϰÌâÖÐÖ¸³ö²»¾ÐÄàÓÚ¾ßÌåµÄͼ½á¹¹£¬µ«ÊÇÕâÀïÒÀ¾É²ÉÓÃÁËÁÚ½Ó¾ØÕó´æ´¢µÄͼ×÷ΪʾÀý¡£ + */ +Status Algo_7_24(MGraph G); + + +int main(int argc, char* argv[]) { + MGraph G; + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ´´½¨²¢Êä³öͼ...\n"); + { + char* path[4]; + + path[0] = "TestData_DG.txt"; + path[1] = ""; + path[2] = ""; + path[3] = ""; + + CreateGraph(&G, path); + PrintGraph(G); + printf("\n"); + } + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ Éî¶ÈÓÅÏȱéÀúͼ...\n"); + { + Algo_7_24(G); + printf("\n"); + } + + return 0; +} + + +/* + * ÀûÓÃÕ»¶ÔÓÐÏòÇ¿Á¬Í¨Í¼½øÐÐÉî¶ÈÓÅÏȱéÀú£¬ + * ϰÌâÖÐÖ¸³ö²»¾ÐÄàÓÚ¾ßÌåµÄͼ½á¹¹£¬µ«ÊÇÕâÀïÒÀ¾É²ÉÓÃÁËÁÚ½Ó¾ØÕó´æ´¢µÄͼ×÷ΪʾÀý¡£ + */ +Status Algo_7_24(MGraph G) { + SqStack S; + SElemType e; + int i; + + if(G.vexnum < 1) { + return ERROR; + } + + for(i = 0; i < G.vexnum; i++) { + visited[i] = FALSE; + } + + InitStack(&S); + + // µÚÒ»¸ö¶¥µãÈëÕ» + Push(&S, 0); + visited[0] = TRUE; + printf("%c ", G.vexs[0]); + + while(!StackEmpty(S)) { + GetTop(S, &e); + + for(i = 0; i < G.vexnum; i++) { + if(G.arcs[e][i].adj!=0 && visited[i]==FALSE) { + Push(&S, i); + visited[i] = TRUE; + printf("%c ", G.vexs[i]); + + // Á¢¿ÌÌø³öµ±Ç°Ñ­»·£¬½øÐÐÏÂÒ»ÂÖÉî¶ÈËÑѰ + break; + } + } + + // Èç¹û¶¥µãeûÓÐδ·ÃÎʵÄÁÚ½ÓµãÁË£¬Ôò½«¸Ã¶¥µã³öÕ» + if(i == G.vexnum) { + Pop(&S, &e); + } + } + + printf("\n"); + + return OK; +} diff --git a/VisualC++/ExerciseBook/07.24/07.24.png b/VisualC++/ExerciseBook/07.24/07.24.png new file mode 100644 index 0000000000000000000000000000000000000000..ff528b7b145bad37a63ed8525603b8a93b51006b GIT binary patch literal 12105 zcmb`tbzfD__dX0Fb!g=P(g=bcq(KlwQc9Y$=>`RkC`e05cPZUnn+B1RmXK}*x0X?my1!>^*zU%$hZ^)^)83R92KGfKkHG(9j5EWh7P6(9px69|q11sH8~7 zjt%-lw^fxEM=S25UV&b2nu#fhp`n$9Nb#c#y9vs-~qi%{x_J0Nw zdKV{b8yk3cQc3HicDpoD=eIZnyy!E`bb#RC;1w#9s#N85+A7)<1zmv-yfFHJWd`5` zR~0U{PoWx}N)M1ohX4Osumw^o&e*p_mhDe#^y_X?IC;Mk`6ys(N9Q!R%xbn7BrL%K`zQe=BOw{!=Ag+) zIpXrFu7vYWz3aP&7pHqgS2V6|@owAXj-PFHP{&168@h$j_jdS2-rsl-l3X%PvuI_# zK6khfTj&_%-#Rngm9B4f@ou9YH$}Wt*W%)CSlxx3(Bylz{2+Q`&ypI10cex;tiRDU z3hxDfiet#E_T2XLXM?`#LqEIzOADbN;N+!?PbU4TG|=7M9V(SMkH&}2@#f8&T}NWV zv9U2_fl*X6c}&~T(9m$M(uq)jISz>E$7rHy#4+Hke4UGQ?9k+1aBVELXe(gRf8Umj zJ@FnZ;vI|u?CNW53KO}UWj(IwRUd6{$9lRcKIc6+IB4l$TyE`F%>AOHD4)vdt=;~H z>t(%jeHj0q!J3J>hDP^-ji7Lfe2Vm3PmG9Nj3&DyU$Wx8Nb;aIi-3?TLJ~v@;9EB2 zVDhrJ`kwFp+99>Wlrr{)2Gj6wA-CUg+4J5)vR=asUwVaWZ0{civGsa$lzmtXbU=+! zrY001e#=!(3iBe4myJv|=@Q?cELAKh?&O`U*l~sPYandh5>3Tal^qcFZyN+Js&Z5D zp8XDKEa4+tb)+wsf9d4|7leT}@iK7>bDPT%BQnPRgy-O@@Ao3ylDheq9doq$W&Ld# zd@+_+wHNM;fbUy5guO)$@5x4ctT@lwEvG%*1xB2LL8nf~5xS z-g+Yy#>XM|gf1WXgAQUDh%%ox>SqL3|abck; z_sV9gFb8_08MnqM8&xRI3&5!Q>tdpInaRjv&#Orou{!+IX#1kKgHJAcni~H`>kgA* z=ZgM2Ez)5{z{sasxCV=@{HpTus+`Ys}F`~WlHv9ZfU)JCj2_@euUmaL0< zoj0g&-P5}l(F-s*^!<2_98FmyFA>>Q&{D@_O?JA7<|)Gau+doY>=mpqT1iXI@}((2 z;Yc6YF2v_~LHs7>c||E4lxHcU=7UJ zTkExssecJL0?!guCyZ35f+yE;8$)zL6J3m2>8OUrI8%X1u{(qKdnP;aecbaw4V}6qkcfG$wxr%$4l@*~Ff}^+kgYcc z-oI=q-tOt!kmE4VN9<26*ZWEhaWzo5f3`{`)`={xvJbFS58tYLZE0zDr{FHXq~HA{ zZU4AwK_)T{)}IOX^=h{aiXNJB-#*Xtfg!ZuRGF2@cqFmCK7We}Dh%7V$UB@5F^8K;po!kF_gjF+_$}Yq6+q!8lHX;tD{` zB>lV@677Io^H<$rwKl?O^~jt^btS5wDb&F->ajzC#dMrLAJSr>AR6N z<>loq;R;SUsYtl~S6$%b+y&&vm`yJRS-LAN4=F{gL&|_QYuKyTui4_Ca3p=-oYMeK zTt81(mNy1%6Xtg*L6zcrzG|@IiR0~%u7am$+P^~i-M_u@yJNO{@}w#XgSpVx*LP

=-L3vq)SMxuB^K0oUTLHW6vn{7_@Ts3NF%tv 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 D-4|Tz literal 0 HcmV?d00001 diff --git a/VisualC++/ExerciseBook/07.24/07.24.vcxproj b/VisualC++/ExerciseBook/07.24/07.24.vcxproj new file mode 100644 index 0000000..a9d9547 --- /dev/null +++ b/VisualC++/ExerciseBook/07.24/07.24.vcxproj @@ -0,0 +1,81 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {D2C4BE28-73F2-49EE-B61C-3668CE1D790D} + My0724 + + + + Application + true + MultiByte + + + Application + false + true + MultiByte + + + + + + + + + + + + + $(SolutionDir)\..\Status;$(IncludePath) + + + + Level3 + Disabled + + + true + $(SolutionDir)\..\Status\Status.lib;%(AdditionalDependencies) + Console + + + + + Level3 + MaxSpeed + true + true + + + true + true + true + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.24/07.24.vcxproj.filters b/VisualC++/ExerciseBook/07.24/07.24.vcxproj.filters new file mode 100644 index 0000000..abfb303 --- /dev/null +++ b/VisualC++/ExerciseBook/07.24/07.24.vcxproj.filters @@ -0,0 +1,41 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + æºæ–‡ä»¶ + + + æºæ–‡ä»¶ + + + æºæ–‡ä»¶ + + + + + 头文件 + + + 头文件 + + + + + èµ„æºæ–‡ä»¶ + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.24/07.24.vcxproj.user b/VisualC++/ExerciseBook/07.24/07.24.vcxproj.user new file mode 100644 index 0000000..ace9a86 --- /dev/null +++ b/VisualC++/ExerciseBook/07.24/07.24.vcxproj.user @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.24/MGraph.c b/VisualC++/ExerciseBook/07.24/MGraph.c new file mode 100644 index 0000000..638d5a9 --- /dev/null +++ b/VisualC++/ExerciseBook/07.24/MGraph.c @@ -0,0 +1,219 @@ +/*================================= + * ͼµÄÊý×é(ÁÚ½Ó¾ØÕó)´æ´¢±íʾ + * + * °üº¬Ëã·¨: 7.1¡¢7.2¡¢7.4¡¢7.5¡¢7.6 + ==================================*/ + +#include "MGraph.h" //**¡ø07 ͼ**// + +// ¼ÈëÊý¾ÝµÄÔ´Îļþ£»fpΪnullʱ£¬ËµÃ÷ÐèÒª´Ó¿ØÖÆÌ¨Â¼Èë +static FILE* fp = NULL; + +/* + * IncInfoָʾ¸Ãͼ/ÍøµÄ±ß/»¡ÉÏÊÇ·ñ´æÔÚ¸½¼ÓÐÅÏ¢¡£ + * Èç¹ûÆäÖµ²»Îª0£¬Ôò±íʾÎÞ¸½¼ÓÐÅÏ¢£¬·ñÔò£¬±íʾ´æÔÚ¸½¼ÓÐÅÏ¢¡£ + */ +Boolean IncInfo = FALSE; + +// ·ÃÎʱêÖ¾Êý×飬¼Ç¼·ÃÎʹýµÄ¶¥µã +static Boolean visited[MAX_VERTEX_NUM]; + +// º¯Êý±äÁ¿ +static Status (* VisitFunc)(VertexType e); + + +/* + * ¨€¨€¨€¨€¨€¨€¨€¨€ Ëã·¨7.1 ¨€¨€¨€¨€¨€¨€¨€¨€ + * + * ´´½¨Í¼/±í + * + *¡¾±¸×¢¡¿ + * + * ½Ì²ÄÖÐĬÈÏ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý¡£ + * ÕâÀïΪÁË·½±ã²âÊÔ£¬±ÜÃâÿ´ÎÔËÐж¼ÊÖ¶¯ÊäÈëÊý¾Ý£¬ + * Òò¶øÔÊÐíÑ¡Ôñ´ÓÔ¤ÉèµÄÎļþpathÖжÁÈ¡²âÊÔÊý¾Ý¡£ + * + * Èç¹ûÐèÒª´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý£¬ÔòpathΪNULL£¬»òpath[kind]Ϊ""¡£ + * Èç¹ûÐèÒª´ÓÎļþÖжÁÈ¡Êý¾Ý£¬ÔòÐèÒªÔÚpathÖÐÌîдÎļþÃûÐÅÏ¢¡£ + */ +Status CreateGraph(MGraph* G, char* path[]) { + int readFromConsole; // ÊÇ·ñ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý + int kind; + Status flag; + + // ¡ï¡ï¡ï´Ë´¦¹Ì¶¨ÎªÓÐÏòͼ + kind = 0; + + // Èç¹ûûÓÐÎļþ·¾¶ÐÅÏ¢£¬Ôò´Ó¿ØÖÆÌ¨¶ÁÈ¡ÊäÈë + readFromConsole = (path == NULL) || strcmp(path[kind], "") == 0; + + // ÐèÒª´ÓÎļþ¶ÁÈ¡ + if(readFromConsole) { + (*G).kind = kind; // ¼Ç¼ͼ/ÍøµÄÀàÐÍ + } else { + // ´ò¿ªÎļþ£¬×¼±¸¶ÁÈ¡²âÊÔÊý¾Ý + fp = fopen(path[kind], "r"); + if(fp == NULL) { + return ERROR; + } + + // ¼ÈëͼµÄÀàÐÍ + ReadData(fp, "%d", &((*G).kind)); + } + + // Ëæ»ú´´½¨ÓÐÏòͼ/Íø»òÎÞÏòͼ/ÍøµÄÒ»ÖÖ + switch((*G).kind) { + case DG: + flag = CreateDG(G); + break; + default: + flag = ERROR; + break; + } + + if(fp != NULL) { + fclose(fp); + fp = NULL; + } + + return flag; +} + +/* + * ¹¹ÔìÓÐÏòͼ + */ +static Status CreateDG(MGraph* G) { + int i, j, k; + ArcCell arcs = {0, NULL}; // ÓÐÏòͼÿÌõ±ßµÄ³õʼֵ + VertexType v1, v2; + + if(fp == NULL) { + printf("ÇëÊäÈëÓÐÏòͼµÄ¶¥µãÊý£º"); + scanf("%d", &((*G).vexnum)); + printf("ÇëÊäÈëÓÐÏòͼµÄ»¡Êý£º"); + scanf("%d", &((*G).arcnum)); + printf("¸ÃÓÐÏòͼµÄ»¡ÉÏÊÇ·ñ°üº¬ÆäËû¸½¼ÓÐÅÏ¢(0-²»°üº¬©¦1-°üº¬)£º"); + scanf("%d", &IncInfo); + + // ¼Èë¶¥µã¼¯ + printf("Çë¼Èë %d ¸ö¶¥µã£¬²»Í¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º", (*G).vexnum); + for(i = 0; i < (*G).vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(stdin); + scanf("%c", &((*G).vexs[i])); + } + } else { + ReadData(fp, "%d", &((*G).vexnum)); // ¼Èë¶¥µãÊý + ReadData(fp, "%d", &((*G).arcnum)); // ¼È뻡Êý + ReadData(fp, "%d", &IncInfo); // Åжϻ¡ÉÏÊÇ·ñ°üº¬¸½¼ÓÐÅÏ¢ + + // ¼Èë¶¥µã¼¯ + for(i = 0; i < (*G).vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(fp); + ReadData(fp, "%c", &((*G).vexs[i])); + } + } + + // ³õʼ»¯ÓÐÏòͼµÄÁÚ½Ó¾ØÕó + for(i = 0; i < (*G).vexnum; i++) { + for(j = 0; j < (*G).vexnum; j++) { + (*G).arcs[i][j] = arcs; + } + } + + // ½öÔÚ¿ØÖÆÌ¨Â¼ÈëÐÅϢʱÊä³ö´ËÌáʾ + if(fp == NULL && (*G).arcnum != 0) { + printf("ÇëΪÓÐÏòͼÒÀ´Î¼Èë %d Ìõ»¡µÄÐÅÏ¢£¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º\n", (*G).arcnum); + } + + // ¼È뻡µÄÐÅÏ¢ + for(k = 0; k < (*G).arcnum; k++) { + if(fp == NULL) { + printf("µÚ %2d Ìõ»¡£º", k + 1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v2); + } else { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + skipBlank(fp); + ReadData(fp, "%c%c", &v1, &v2); + } + + i = LocateVex(*G, v1); // »ñÈ¡¶¥µãv1ÔÚ¶¥µã¼¯ÖеÄλÖà + j = LocateVex(*G, v2); // »ñÈ¡¶¥µãv2ÔÚ¶¥µã¼¯ÖеÄλÖà + + // ½«Ö¸¶¨µÄ¶¥µã¹ØÏµÉèÖÃΪ1£¬Ö¸Ê¾ÕâÁ½¸ö¶¥µãÊÇÖ±½ÓÁ¬½ÓµÄ(×¢£ºÕâÀïûÓÐÑé֤ϱêÊÇ·ñÔ½½ç) + (*G).arcs[i][j].adj = 1; + + // Èç¹ûÐèҪ¼È뻡µÄÆäËû¸½¼ÓÐÅÏ¢ + if(IncInfo) { + // ×îºó¼È븽¼ÓÐÅÏ¢ + Input(*G, &((*G).arcs[i][j].info)); + } + } + + // ´ÓÎļþÖжÁÈ¡Êý¾Ýʱ£¬×îºóÆäʵӦµ±ÅжÏÒ»ÏÂÊÇ·ñ¶Áµ½ÁË×ã¹»µÄÐÅÏ¢ + return OK; +} + +/* + * ¼Èë±ß/»¡µÄÏà¹Ø¸½¼ÓÐÅÏ¢ + */ +static void Input(MGraph G, InfoType** info) { + //¼Èë±ß/»¡µÄÐÅÏ¢£¬±¾²âÊÔÉæ¼°µ½µÄ±ß/»¡Ä¬ÈÏÎÞÆäËû¸½¼ÓÐÅÏ¢ +} + +/* + * ²éÕÒ + * + * ·µ»Ø¶¥µãuÔÚͼ/ÍøÖеÄλÖà + */ +int LocateVex(MGraph G, VertexType u) { + int i; + + for(i = 0; i < G.vexnum; i++) { + if(G.vexs[i] == u) { + return i; + } + } + + return -1; +} + +/* + * ÒÔͼÐλ¯ÐÎʽÊä³öµ±Ç°½á¹¹ + * + * ×¢£ºÔÚͼ/ÍøÖУ¬Ê¹ÓÃ"-"À´±íʾÁ½¶¥µã²»Ö±½ÓÁ¬Í¨ + */ +void PrintGraph(MGraph G) { + int i, j; + + if(G.vexnum == 0) { + printf("¿Õͼ£¬ÎÞÐè´òÓ¡£¡\n"); + return; + } + + printf("µ±Ç°Í¼/Íø°üº¬ %2d ¸ö¶¥µã£¬ %2d Ìõ±ß/»¡...\n", G.vexnum, G.arcnum); + + printf(" "); + for(i = 0; i < G.vexnum; i++) { + printf(" %c", G.vexs[i]); + } + printf("\n"); + + for(i = 0; i < G.vexnum; i++) { + printf("%c ", G.vexs[i]); + + for(j = 0; j < G.vexnum; j++) { + if(((G.kind == DG || G.kind == UDG) && G.arcs[i][j].adj == 0) || ((G.kind == DN || G.kind == UDN) && G.arcs[i][j].adj == INFINITE)) { + printf(" -"); + } else { + printf("%3d", G.arcs[i][j].adj); + } + } + + printf("\n"); + } +} diff --git a/VisualC++/ExerciseBook/07.24/MGraph.h b/VisualC++/ExerciseBook/07.24/MGraph.h new file mode 100644 index 0000000..45283af --- /dev/null +++ b/VisualC++/ExerciseBook/07.24/MGraph.h @@ -0,0 +1,113 @@ +/*================================= + * ͼµÄÊý×é(ÁÚ½Ó¾ØÕó)´æ´¢±íʾ + * + * °üº¬Ëã·¨: 7.1¡¢7.2¡¢7.4¡¢7.5¡¢7.6 + ==================================*/ + +#ifndef MGRAPH_H +#define MGRAPH_H + +#include +#include // ÌṩºêINT_MAX +#include // Ìṩmemset¡¢strcmp Ô­ÐÍ +#include // Ìṩºêva_list¡¢va_start¡¢va_arg¡¢va_end +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// + +/* + * ×¢£º + * + * ͨ³£À´½²£¬ÎÞȨͼ±»¼ò³ÆÎª¡¾Í¼¡¿£¬ÓÐȨͼ±»¼ò³ÆÎª¡¾Íø¡¿¡£ + * ÎÞÏòͼ/ÍøÖеĶ¥µã¹ØÏµ±»³ÆÎª¡¾±ß¡¿£¬ÓÐÏòͼ/ÍøÖеĶ¥µã¹ØÏµ±»³ÆÎª¡¾»¡¡¿£¬²¢Çø·Ö»¡Í·Ó뻡β¡£ + * ʵ¼Ê±íÊöÖУ¬Î´±Ø»áÑϸñ×ñÊØÒÔÉÏÃüÃû¡£ + */ + +/* ºê¶¨Òå */ +#define INFINITE INT_MAX // ×î´óÖµ£¬ÓÃÀ´±íÊ¾ÍøÖеÄÁ½¸ö¶¥µã²»Ö±½ÓÁ¬½Ó +#define MAX_VERTEX_NUM 26 // ×î´ó¶¥µã¸öÊý + + +// ͼµÄÀàÐÍ +typedef enum { + DG, // 0-ÓÐÏòͼ + DN, // 1-ÓÐÏòÍø(´øÈ¨Öµ) + UDG, // 2-ÎÞÏòͼ + UDN // 3-ÎÞÏòÍø(´øÈ¨Öµ) +} GraphKind; + +// ¶¥µãÀàÐÍ +typedef char VertexType; + +/* + * ¶¥µã¹ØÏµÀàÐÍ + * + * ÔÚÎÞȨͼÖУ¬¸Ãֵͨ³£Îª0»ò1£¬±íʾÁ½¶¥µãÊÇ·ñÖ±½ÓÁ¬Í¨£» + * ÔÚÓÐȨͼÖУ¬¸Ãֵͨ³£ÎªÈ¨Öµ¡£ + */ +typedef int VRType; + +// ±ßµÄÏà¹Ø¸½¼ÓÐÅÏ¢ +typedef struct { + // Èç¹ûÓеϰ£¬ºóÐø»áÌí¼ÓÏàÓ¦µÄÊôÐÔ + void* v; // Ìí¼ÓÒ»¸öÎÞÒâÒåµÄ±äÁ¿À´Õ¼Î»£¬Èç¹û½á¹¹ÌåΪ¿ÕµÄ»°£¬ÔÚVC++Öлᱨ´í +} InfoType; + +// ±ßµÄÀàÐÍ£¬Ã¿Ìõ±ßÉÏ¿ÉÄÜÓи½¼ÓÐÅÏ¢info +typedef struct ArcCell { + VRType adj; // ¶¥µã¹ØÏµ£¬ÔÚÓÐȨͼ¸úÎÞȨͼÖеĺ¬Ò岻ͬ + InfoType* info; // ±ßµÄ¸½¼ÓÐÅÏ¢£¬Í¨³£ºöÂÔ +} ArcCell; + +/* ͼ/ÍøµÄÊý×é(ÁÚ½Ó¾ØÕó)´æ´¢±íʾÀàÐͶ¨Òå */ +typedef struct { + VertexType vexs[MAX_VERTEX_NUM]; // ¶¥µãÏòÁ¿ + ArcCell arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; // ÁÚ½Ó¾ØÕó + int vexnum, arcnum; // ͼ/ÍøµÄ¶¥µãÊýºÍ»¡Êý + GraphKind kind; // ͼµÄÀàÐͱêÖ¾ +} MGraph; + + +// ±ß/»¡ÉÏÊÇ·ñ´æÔÚ¸½¼ÓÐÅÏ¢ +extern Boolean IncInfo; + + +/* + * ¨€¨€¨€¨€¨€¨€¨€¨€ Ëã·¨7.1 ¨€¨€¨€¨€¨€¨€¨€¨€ + * + * ´´½¨ + * + *¡¾±¸×¢¡¿ + * + * ½Ì²ÄÖÐĬÈÏ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý¡£ + * ÕâÀïΪÁË·½±ã²âÊÔ£¬±ÜÃâÿ´ÎÔËÐж¼ÊÖ¶¯ÊäÈëÊý¾Ý£¬ + * Òò¶øÔÊÐíÑ¡Ôñ´ÓÔ¤ÉèµÄÎļþpathÖжÁÈ¡²âÊÔÊý¾Ý¡£ + * + * Èç¹ûÐèÒª´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý£¬ÔòpathΪNULL£¬»òpath[kind]Ϊ""¡£ + * Èç¹ûÐèÒª´ÓÎļþÖжÁÈ¡Êý¾Ý£¬ÔòÐèÒªÔÚpathÖÐÌîдÎļþÃûÐÅÏ¢¡£ + */ +Status CreateGraph(MGraph* G, char* path[]); + +/* + * ¹¹ÔìÓÐÏòͼ + */ +static Status CreateDG(MGraph* G); + +/* + * ¼Èë±ßµÄÏà¹Ø¸½¼ÓÐÅÏ¢ + */ +static void Input(MGraph G, InfoType** info); + +/* + * ²éÕÒ + * + * ·µ»Ø¶¥µãuÔÚͼ/ÍøÖеÄλÖà + */ +int LocateVex(MGraph G, VertexType u); + +/* + * ÒÔͼÐλ¯ÐÎʽÊä³öµ±Ç°½á¹¹ + * + * ×¢£ºÔÚͼ/ÍøÖУ¬Ê¹ÓÃ"-"À´±íʾÁ½¶¥µã²»Ö±½ÓÁ¬Í¨ + */ +void PrintGraph(MGraph G); + +#endif diff --git a/VisualC++/ExerciseBook/07.24/SqStack.c b/VisualC++/ExerciseBook/07.24/SqStack.c new file mode 100644 index 0000000..f0b3b3d --- /dev/null +++ b/VisualC++/ExerciseBook/07.24/SqStack.c @@ -0,0 +1,106 @@ +/*========================= + * Õ»µÄ˳Ðò´æ´¢½á¹¹£¨Ë³ÐòÕ»£© + ==========================*/ + +#include "SqStack.h" //**¡ø03 Õ»ºÍ¶ÓÁÐ**// + +/* + * ³õʼ»¯ + * + * ¹¹ÔìÒ»¸ö¿ÕÕ»¡£³õʼ»¯³É¹¦Ôò·µ»ØOK£¬·ñÔò·µ»ØERROR¡£ + */ +Status InitStack(SqStack* S) { + if(S == NULL) { + return ERROR; + } + + (*S).base = (SElemType*) malloc(STACK_INIT_SIZE * sizeof(SElemType)); + if((*S).base == NULL) { + exit(OVERFLOW); + } + + (*S).top = (*S).base; + (*S).stacksize = STACK_INIT_SIZE; + + return OK; +} + +/* + * ÅÐ¿Õ + * + * ÅжÏ˳ÐòÕ»ÖÐÊÇ·ñ°üº¬ÓÐЧÊý¾Ý¡£ + * + * ·µ»ØÖµ£º + * TRUE : ˳ÐòջΪ¿Õ + * FALSE: ˳ÐòÕ»²»Îª¿Õ + */ +Status StackEmpty(SqStack S) { + if(S.top == S.base) { + return TRUE; + } else { + return FALSE; + } +} + +/* + * ȡֵ + * + * ·µ»ØÕ»¶¥ÔªËØ£¬²¢ÓÃe½ÓÊÕ¡£ + */ +Status GetTop(SqStack S, SElemType* e) { + if(S.base == NULL || S.top == S.base) { + return 0; + } + + // ²»»á¸Ä±äÕ»ÖÐÔªËØ + *e = *(S.top - 1); + + return OK; +} + +/* + * ÈëÕ» + * + * ½«ÔªËØeѹÈëµ½Õ»¶¥¡£ + */ +Status Push(SqStack* S, SElemType e) { + if(S == NULL || (*S).base == NULL) { + return ERROR; + } + + // Õ»Âúʱ£¬×·¼Ó´æ´¢¿Õ¼ä + if((*S).top - (*S).base >= (*S).stacksize) { + (*S).base = (SElemType*) realloc((*S).base, ((*S).stacksize + STACKINCREMENT) * sizeof(SElemType)); + if((*S).base == NULL) { + exit(OVERFLOW); // ´æ´¢·ÖÅäʧ°Ü + } + + (*S).top = (*S).base + (*S).stacksize; + (*S).stacksize += STACKINCREMENT; + } + + // ½øÕ»Ïȸ³Öµ£¬Õ»¶¥Ö¸ÕëÔÙ×ÔÔö + *(S->top++) = e; + + return OK; +} + +/* + * ³öÕ» + * + * ½«Õ»¶¥ÔªËص¯³ö£¬²¢ÓÃe½ÓÊÕ¡£ + */ +Status Pop(SqStack* S, SElemType* e) { + if(S == NULL || (*S).base == NULL) { + return ERROR; + } + + if((*S).top == (*S).base) { + return ERROR; + } + + // ³öÕ»Õ»¶¥Ö¸ÕëÏȵݼõ£¬ÔÙ¸³Öµ + *e = *(--(*S).top); + + return OK; +} diff --git a/VisualC++/ExerciseBook/07.24/SqStack.h b/VisualC++/ExerciseBook/07.24/SqStack.h new file mode 100644 index 0000000..a7a5f21 --- /dev/null +++ b/VisualC++/ExerciseBook/07.24/SqStack.h @@ -0,0 +1,66 @@ +/*========================= + * Õ»µÄ˳Ðò´æ´¢½á¹¹£¨Ë³ÐòÕ»£© + ==========================*/ + +#ifndef SQSTACK_H +#define SQSTACK_H + +#include +#include // Ìṩmalloc¡¢realloc¡¢free¡¢exitÔ­ÐÍ +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// + +/* ºê¶¨Òå */ +#define STACK_INIT_SIZE 100 // ˳ÐòÕ»´æ´¢¿Õ¼äµÄ³õʼ·ÖÅäÁ¿ +#define STACKINCREMENT 10 // ˳ÐòÕ»´æ´¢¿Õ¼äµÄ·ÖÅäÔöÁ¿ + +/* ˳ÐòÕ»ÔªËØÀàÐͶ¨Òå */ +typedef int SElemType; + +// ˳ÐòÕ»ÔªËØ½á¹¹ +typedef struct { + SElemType* base; // Õ»µ×Ö¸Õë + SElemType* top; // Õ»¶¥Ö¸Õë + int stacksize; // µ±Ç°ÒÑ·ÖÅäµÄ´æ´¢¿Õ¼ä£¬ÒÔÔªËØÎªµ¥Î» +} SqStack; + + +/* + * ³õʼ»¯ + * + * ¹¹ÔìÒ»¸ö¿ÕÕ»¡£³õʼ»¯³É¹¦Ôò·µ»ØOK£¬·ñÔò·µ»ØERROR¡£ + */ +Status InitStack(SqStack* S); + +/* + * ÅÐ¿Õ + * + * ÅжÏ˳ÐòÕ»ÖÐÊÇ·ñ°üº¬ÓÐЧÊý¾Ý¡£ + * + * ·µ»ØÖµ£º + * TRUE : ˳ÐòջΪ¿Õ + * FALSE: ˳ÐòÕ»²»Îª¿Õ + */ +Status StackEmpty(SqStack S); + +/* + * ȡֵ + * + * ·µ»ØÕ»¶¥ÔªËØ£¬²¢ÓÃe½ÓÊÕ¡£ + */ +Status GetTop(SqStack S, SElemType* e); + +/* + * ÈëÕ» + * + * ½«ÔªËØeѹÈëµ½Õ»¶¥¡£ + */ +Status Push(SqStack* S, SElemType e); + +/* + * ³öÕ» + * + * ½«Õ»¶¥ÔªËص¯³ö£¬²¢ÓÃe½ÓÊÕ¡£ + */ +Status Pop(SqStack* S, SElemType* e); + +#endif diff --git a/VisualC++/ExerciseBook/07.24/TestData_DG.txt b/VisualC++/ExerciseBook/07.24/TestData_DG.txt new file mode 100644 index 0000000..e330f24 --- /dev/null +++ b/VisualC++/ExerciseBook/07.24/TestData_DG.txt @@ -0,0 +1,6 @@ +ͼÀàÐÍ¡ú0£¨ÓÐÏòͼ£© +¶¥µãÊý¡ú10 +»¡Êý¡ú14 +»¡ÊÇ·ñ´øÓÐÆäËûÐÅÏ¢¡ú0 +¶¥µã¼¯¡ú¡¾A£¬B£¬C£¬D£¬E£¬F£¬G£¬H£¬I£¬J¡¿ +»¡µÄ¼¯ºÏ¡ú¡¾A£¬C¡¿¡¾C£¬D¡¿¡¾D£¬A¡¿¡¾A£¬B¡¿¡¾D£¬E¡¿¡¾E£¬F¡¿¡¾E£¬H¡¿¡¾F£¬D¡¿¡¾F£¬G¡¿¡¾G£¬H¡¿¡¾H£¬E¡¿¡¾B£¬J¡¿¡¾J£¬I¡¿¡¾I£¬B¡¿ \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.25/07.25.c b/VisualC++/ExerciseBook/07.25/07.25.c new file mode 100644 index 0000000..9fa230d --- /dev/null +++ b/VisualC++/ExerciseBook/07.25/07.25.c @@ -0,0 +1,134 @@ +#include +#include "Graph.h" + +// ·ÃÎʱêÖ¾ +typedef enum { + UnVisited, // δ·ÃÎÊ + Visited, // ÒÑ·ÃÎÊ + InPath, // ÔÚ·¾¶ÉÏ +} FLAG; + +// ·ÃÎʱêÖ¾Êý×飬¼Ç¼·ÃÎʹýµÄ¶¥µã +static FLAG flags[MAX_VERTEX_NUM]; + + +/* + * ÕÒ³öÓÐÏòͼÖеĻØÂ· + */ +void Algo_7_25(Graph G); + +/* + * ´Óstart¶¥µã¿ªÊ¼²éÕÒ»ØÂ·¡£ + * + * pathÓÃÀ´´æ´¢Â·¹ýµÄ¶¥µã£¬path[0]´æ´¢pathÖеĶ¥µãÊýÁ¿¡£ + * + * Èç¹ûÕÒµ½»ØÂ·£¬·µ»Ø»ØÂ·Æðʼ¶¥µãµÄÐòºÅ£» + * Èç¹ûûÕÒµ½»ØÂ·£¬Ôò·µ»Ø-1¡£ + */ +int Circuit_7_25(Graph G, int start, int path[MAX_VERTEX_NUM + 1]); + + +int main(int argc, char* argv[]) { + Graph G; + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ´´½¨²¢Êä³öͼ...\n"); + { + char* path = "TestData_DG.txt"; + + CreateGraph(&G, path); + PrintGraph(G); + printf("\n"); + } + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ²éÕÒͼÖеĻØÂ·...\n"); + { + Algo_7_25(G); + printf("\n"); + } + + return 0; +} + + +/* + * ÕÒ³öÓÐÏòͼÖеĻØÂ· + */ +void Algo_7_25(Graph G) { + int i, w = -1; + int path[MAX_VERTEX_NUM + 1]; // 0ºÅµ¥ÔªÓÃÀ´¼Ç¼pathÖд洢µÄ¶¥µãÊýÁ¿ + + // °ÑËùÓж¥µã±ê¼ÇΪδ·ÃÎÊ + for(i = 0; i < G.vexnum; i++) { + flags[i] = UnVisited; + } + + path[0] = 0; + + for(i = 0; i < G.vexnum; i++) { + w = Circuit_7_25(G, i, path); + + if(w != -1) { + break; // Èç¹ûÕÒµ½ÁËÈÎÒâÒ»Ìõ»ØÂ·£¬Ìø³öÑ­»· + } + } + + if(w == -1) { + printf("¸ø¶¨µÄÓÐÏòͼÖв»´æÔÚ»ØÂ·£¡\n"); + return; + } + + printf("ÓÐÏòͼÖÐÕÒµ½µÄÊ×Ìõ»ØÂ·Îª£º"); + for(i = 1; path[i] != w; i++) { + // ѰÕÒ»ØÂ·Æðµã + } + // ÕÒµ½ÁË»ØÂ·Æðµã + if(path[i] == w) { + while(i <= path[0]) { + printf("%c -> ", G.vexs[path[i]]); + i++; + } + printf("%c\n", G.vexs[w]); + } +} + +/* + * ´Óstart¶¥µã¿ªÊ¼²éÕÒ»ØÂ·¡£ + * + * pathÓÃÀ´´æ´¢Â·¹ýµÄ¶¥µã£¬path[0]´æ´¢pathÖеĶ¥µãÊýÁ¿¡£ + * + * Èç¹ûÕÒµ½»ØÂ·£¬·µ»Ø»ØÂ·Æðʼ¶¥µãµÄÐòºÅ£» + * Èç¹ûûÕÒµ½»ØÂ·£¬Ôò·µ»Ø-1¡£ + */ +int Circuit_7_25(Graph G, int start, int path[MAX_VERTEX_NUM]) { + int i; + int v, w; + + path[0]++; + path[path[0]] = start; + flags[start] = InPath; // ±ê¼Ç¸Ã¶¥µãÒѽøÈë·¾¶ + + // ±éÀú¶¥µãstartµÄÁÚ½Óµã + for(i = G.fst[start]; i <= G.lst[start]; i++) { + v = G.s[i]; // »ñÈ¡ÁÚ½ÓµãÐòºÅ + + // Èç¹ûÓöµ½ÁËÒÑÔÚ·¾¶ÖеÄÁڽӵ㣬˵Ã÷³öÏÖÁË»ØÂ· + if(flags[v] == InPath) { + return v; + + // ºöÂÔÒÑ·ÃÎʵÄÁÚ½Óµã + } else if(flags[v] == Visited) { + continue; + } else { + w = Circuit_7_25(G, v, path); + if(w != -1) { + return w; + } + } + } + + // ´Ó·¾¶ÖÐÒÆ³ý¸Ã¶¥µã£¬²¢½«Æä״̬½µ¼¶Îª"ÒÑ·ÃÎÊ" + path[0]--; + flags[start] = Visited; + + return -1; +} diff --git a/VisualC++/ExerciseBook/07.25/07.25.png b/VisualC++/ExerciseBook/07.25/07.25.png new file mode 100644 index 0000000000000000000000000000000000000000..d902081ad316df7ba5f6b9180d24562b0c8d4b2d GIT binary patch literal 8338 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 ARR910 literal 0 HcmV?d00001 diff --git a/VisualC++/ExerciseBook/07.25/07.25.vcxproj b/VisualC++/ExerciseBook/07.25/07.25.vcxproj new file mode 100644 index 0000000..01cc0a1 --- /dev/null +++ b/VisualC++/ExerciseBook/07.25/07.25.vcxproj @@ -0,0 +1,79 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {299C3272-DB66-4B45-9444-7BFFE0B67E0E} + My0725 + + + + Application + true + MultiByte + + + Application + false + true + MultiByte + + + + + + + + + + + + + $(SolutionDir)\..\Status;$(IncludePath) + + + + Level3 + Disabled + + + true + $(SolutionDir)\..\Status\Status.lib;%(AdditionalDependencies) + Console + + + + + Level3 + MaxSpeed + true + true + + + true + true + true + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.25/07.25.vcxproj.filters b/VisualC++/ExerciseBook/07.25/07.25.vcxproj.filters new file mode 100644 index 0000000..81f9878 --- /dev/null +++ b/VisualC++/ExerciseBook/07.25/07.25.vcxproj.filters @@ -0,0 +1,35 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + æºæ–‡ä»¶ + + + æºæ–‡ä»¶ + + + + + 头文件 + + + + + èµ„æºæ–‡ä»¶ + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.25/07.25.vcxproj.user b/VisualC++/ExerciseBook/07.25/07.25.vcxproj.user new file mode 100644 index 0000000..ace9a86 --- /dev/null +++ b/VisualC++/ExerciseBook/07.25/07.25.vcxproj.user @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.25/Graph.c b/VisualC++/ExerciseBook/07.25/Graph.c new file mode 100644 index 0000000..5642088 --- /dev/null +++ b/VisualC++/ExerciseBook/07.25/Graph.c @@ -0,0 +1,164 @@ +/*================================= + * ÓÉÌâ7.25µÄÃèÊö´´½¨µÄÒ»ÖÖÓÐÏòͼ½á¹¹ + ==================================*/ + +#include "Graph.h" + +// ¼ÈëÊý¾ÝµÄÔ´Îļþ£»fpΪnullʱ£¬ËµÃ÷ÐèÒª´Ó¿ØÖÆÌ¨Â¼Èë +static FILE* fp = NULL; + + +/* + * ´´½¨ÓÐÏòͼ + * + * pathΪNULL»òΪ""ʱ£¬´Ó¿ØÖÆÌ¨¶ÁȡͼµÄ³õʼ»¯ÐÅÏ¢¡£ + * ·ñÔò£¬´ÓÔ¤ÉèµÄÎļþÖжÁȡͼµÄ³õʼ»¯ÐÅÏ¢¡£ + */ +Status CreateGraph(Graph* G, char* path) { + int readFromConsole; // ÊÇ·ñ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý + + // Èç¹ûûÓÐÎļþ·¾¶ÐÅÏ¢£¬Ôò´Ó¿ØÖÆÌ¨¶ÁÈ¡ÊäÈë + readFromConsole = path == NULL || strcmp(path, "") == 0; + + // ÐèÒª´ÓÎļþ¶ÁÈ¡ + if(!readFromConsole) { + // ´ò¿ªÎļþ£¬×¼±¸¶ÁÈ¡²âÊÔÊý¾Ý + fp = fopen(path, "r"); + if(fp == NULL) { + return ERROR; + } + } + + Create(G); + + if(fp != NULL) { + fclose(fp); + fp = NULL; + } + + return OK; +} + +/* + * ´´½¨ÓÐÏòͼµÄºËÐÄËã·¨ + */ +static void Create(Graph* G) { + int i, j, k; + VertexType v1, v2; + Boolean adjs[MAX_VERTEX_NUM][MAX_VERTEX_NUM] = {FALSE}; // ¼Ç¼ÁÚ½ÓµãÐÅÏ¢ + int cur; + + // ´Ó¿ØÖÆÌ¨¶ÁÈ¡ + if(fp == NULL) { + printf("ÇëÊäÈëÓÐÏòͼµÄ¶¥µãÊý£º"); + scanf("%d", &((*G).vexnum)); + printf("ÇëÊäÈëÓÐÏòͼµÄ»¡Êý£º"); + scanf("%d", &((*G).arcnum)); + + // ¼Èë¶¥µã¼¯ + printf("Çë¼Èë %d ¸ö¶¥µã£¬²»Í¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º", (*G).vexnum); + for(i = 0; i < (*G).vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(stdin); + scanf("%c", &((*G).vexs[i])); + } + + // ´ÓÎļþ¶ÁÈ¡ + } else { + ReadData(fp, "%d", &((*G).vexnum)); // ¼Èë¶¥µãÊý + ReadData(fp, "%d", &((*G).arcnum)); // ¼È뻡Êý + + // ¼Èë¶¥µã¼¯ + for(i = 0; i < (*G).vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(fp); + ReadData(fp, "%c", &((*G).vexs[i])); + } + } + + // ½öÔÚ¿ØÖÆÌ¨Â¼ÈëÐÅϢʱÊä³ö´ËÌáʾ + if(fp == NULL && (*G).arcnum != 0) { + printf("ÇëΪÓÐÏòͼÒÀ´Î¼Èë %d Ìõ»¡µÄÐÅÏ¢£¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º\n", (*G).arcnum); + } + + // ¼È뻡µÄÐÅÏ¢ + for(k = 0; k < (*G).arcnum; k++) { + if(fp == NULL) { + printf("µÚ %2d Ìõ»¡£º", k + 1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v2); + } else { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + skipBlank(fp); + ReadData(fp, "%c%c", &v1, &v2); + } + + i = LocateVex(*G, v1); // »ñÈ¡¶¥µãv1ÔÚ¶¥µã¼¯ÖеÄλÖà + j = LocateVex(*G, v2); // »ñÈ¡¶¥µãv2ÔÚ¶¥µã¼¯ÖеÄλÖà + + adjs[i][j] = TRUE; + } + + cur = 0; + + // ¼Ç¼ÁÚ½ÓµãÐÅÏ¢ + for(i = 0; i < G->vexnum; i++) { + G->fst[i] = -1; + G->lst[i] = -2; + + for(j = 0; j < G->vexnum; j++) { + if(adjs[i][j] == TRUE) { + if(G->fst[i] == -1) { + G->fst[i] = cur; + } + + G->s[cur++] = j; // ´æ´¢ºó¼Ì¶¥µãÐÅÏ¢ + } + } + + if(G->fst[i] != -1) { + G->lst[i] = cur - 1; + } + } +} + +/* + * ²éÕÒ + * + * ·µ»Ø¶¥µãuÔÚÓÐÏòͼÖеÄλÖà + */ +int LocateVex(Graph G, VertexType u) { + int i; + + for(i = 0; i < G.vexnum; i++) { + if(G.vexs[i] == u) { + return i; + } + } + + return -1; +} + +/* + * ´òÓ¡ÓÐÏòͼ½á¹¹ + */ +void PrintGraph(Graph G) { + int i, j; + + if(G.vexnum == 0) { + printf("¿Õͼ£¬ÎÞÐè´òÓ¡£¡\n"); + return; + } + + printf("µ±Ç°ÓÐÏòͼ°üº¬ %2d ¸ö¶¥µã£¬ %2d Ìõ»¡...\n", G.vexnum, G.arcnum); + + for(i = 0; i < G.vexnum; i++) { + printf("%c -> ", G.vexs[i]); + for(j = G.fst[i]; j <= G.lst[i]; j++) { + printf("%c ", G.vexs[G.s[j]]); + } + printf("\n"); + } +} diff --git a/VisualC++/ExerciseBook/07.25/Graph.h b/VisualC++/ExerciseBook/07.25/Graph.h new file mode 100644 index 0000000..b3224dc --- /dev/null +++ b/VisualC++/ExerciseBook/07.25/Graph.h @@ -0,0 +1,53 @@ +/*================================= + * ÓÉÌâ7.25µÄÃèÊö´´½¨µÄÒ»ÖÖÓÐÏòͼ½á¹¹ + ==================================*/ + +#ifndef GRAPH_H +#define GRAPH_H + +#include +#include // Ìṩmemset¡¢strcmp Ô­ÐÍ +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// + +#define MAX_VERTEX_NUM 26 // ¶¥µã¸öÊý×î´óÖµ +#define MAX_ADJ_NUM 650 // ËùÓж¥µãµÄÁÚ½ÓµãÊýÁ¿ºÍ×î´óÖµ + +// ¶¥µãÀàÐÍ +typedef char VertexType; + +// ÓÐÏòͼÀàÐͶ¨Òå +typedef struct Graph { + VertexType vexs[MAX_VERTEX_NUM]; // ¶¥µãÏòÁ¿ + int s[MAX_ADJ_NUM]; // ¸÷¶¥µãµÄÁÚ½Óµã + int fst[MAX_VERTEX_NUM]; // fst[v] -> ¶¥µãvµÄÁÚ½ÓµãÔÚsÖÐµÄÆðʼϱê + int lst[MAX_VERTEX_NUM]; // lst[v] -> ¶¥µãvµÄÁÚ½ÓµãÔÚsÖеÄÖÕֹϱê + int vexnum, arcnum; // ÓÐÏòͼµÄ¶¥µãÊýºÍ»¡Êý +} Graph; + + +/* + * ´´½¨ÓÐÏòͼ + * + * pathΪNULL»òΪ""ʱ£¬´Ó¿ØÖÆÌ¨¶ÁȡͼµÄ³õʼ»¯ÐÅÏ¢¡£ + * ·ñÔò£¬´ÓÔ¤ÉèµÄÎļþÖжÁȡͼµÄ³õʼ»¯ÐÅÏ¢¡£ + */ +Status CreateGraph(Graph* G, char* path); + +/* + * ´´½¨ÓÐÏòͼµÄºËÐÄËã·¨ + */ +static void Create(Graph* G); + +/* + * ²éÕÒ + * + * ·µ»Ø¶¥µãuÔÚÓÐÏòͼÖеÄλÖà + */ +int LocateVex(Graph G, VertexType u); + +/* + * ´òÓ¡ÓÐÏòͼ½á¹¹ + */ +void PrintGraph(Graph G); + +#endif diff --git a/VisualC++/ExerciseBook/07.25/TestData_DG.txt b/VisualC++/ExerciseBook/07.25/TestData_DG.txt new file mode 100644 index 0000000..7941f40 --- /dev/null +++ b/VisualC++/ExerciseBook/07.25/TestData_DG.txt @@ -0,0 +1,4 @@ +¶¥µãÊý¡ú9 +»¡Êý¡ú11 +¶¥µã¼¯¡ú¡¾A£¬B£¬C£¬D£¬E£¬F£¬G£¬H£¬I¡¿ +»¡µÄ¼¯ºÏ¡ú¡¾A£¬B¡¿¡¾A£¬D¡¿¡¾B£¬C¡¿¡¾D£¬E¡¿¡¾E£¬F¡¿¡¾F£¬C¡¿¡¾F£¬G¡¿¡¾F£¬H¡¿¡¾H£¬I¡¿¡¾I£¬D¡¿¡¾E£¬B¡¿ \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.26/07.26.c b/VisualC++/ExerciseBook/07.26/07.26.c new file mode 100644 index 0000000..d833b2a --- /dev/null +++ b/VisualC++/ExerciseBook/07.26/07.26.c @@ -0,0 +1,141 @@ +#include +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// +#include "ALGraph.h" //**¡ø07 ͼ**// +#include "TopologicalSorting.h" //**¡ø07 ͼ**// + +/* + * ¶ÔÎÞ»ØÂ·µÄÓÐÏòͼÖеĶ¥µãÊʵ±µØ±àºÅ£¬Ê¹ÆäÁÚ½Ó¾ØÕóΪÏÂÈý½ÇÐÎÇÒÖ÷¶Ô½ÇÏßΪȫÁã¡£ + * µ÷Õû³É¹¦ºó£¬Êä³öоɱàºÅ¶ÔÕÕ±í¡£ + * + * ×¢£º±¾ÖÊÉÏÇóÍØÆËÅÅÐòµÄÄæÐòÁÐ + */ +void Algo_7_26(ALGraph G); + +/* + * ÒÔͼÐλ¯ÐÎʽÊä³öµ÷Õû½áµã˳ÐòºóµÄͼ½á¹¹ + * + * ×¢£ºÔÚͼ/ÍøÖУ¬Ê¹ÓÃ"-"À´±íʾÁ½¶¥µã²»Ö±½ÓÁ¬Í¨ + */ +static void PrintGraph_7_26(ALGraph G, int topo[MAX_VERTEX_NUM]); + + +int main(int argc, char* argv[]) { + ALGraph G; + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ´´½¨²¢Êä³öͼ...\n"); + { + char* path[4]; + + path[0] = "TestData_DG.txt"; + path[1] = ""; + path[2] = ""; + path[3] = ""; + + CreateGraph(&G, path); + PrintGraph(G); + printf("\n"); + } + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ Êä³öÓÐÏòͼµÄ¶¥µã˳Ðò...\n"); + { + Algo_7_26(G); + printf("\n"); + } + + return 0; +} + + +/* + * ¶ÔÎÞ»ØÂ·µÄÓÐÏòͼÖеĶ¥µãÊʵ±µØ±àºÅ£¬Ê¹ÆäÁÚ½Ó¾ØÕóΪÏÂÈý½ÇÐÎÇÒÖ÷¶Ô½ÇÏßΪȫÁã¡£ + * µ÷Õû³É¹¦ºó£¬Êä³öоɱàºÅ¶ÔÕÕ±í¡£ + * + * ×¢£º±¾ÖÊÉÏÇóÍØÆËÅÅÐòµÄÄæÐòÁÐ + */ +void Algo_7_26(ALGraph G) { + int i; + int tmp; + int topo[MAX_VERTEX_NUM]; + + if(TopologicalSort(G, topo) == ERROR) { + printf("¸ø¶¨µÄÓÐÏòͼ´æÔÚ»ØÂ·£¬ÎÞ·¨»ñÈ¡ÆäÍØÆËÐòÁÐ...\n"); + return; + } + + printf("µ÷Õûǰ£º"); + for(i = 0; i < G.vexnum; i++) { + printf("%c ", G.vertices[i].data); + } + printf("\n"); + + // ¶ÔµÃµ½µÄÍØÆËÐòÁÐ×öÒ»¸ö¼òµ¥µÄÄæÖà + for(i = 0; i < G.vexnum / 2; i++) { + tmp = topo[i]; + topo[i] = topo[G.vexnum - i - 1]; + topo[G.vexnum - i - 1] = tmp; + } + + printf("µ÷Õûºó£º"); + for(i = 0; i < G.vexnum; i++) { + printf("%c ", G.vertices[topo[i]].data); + } + printf("\n\n"); + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ¸ù¾Ýµ÷ÕûºóµÄ¶¥µã´ÎÐò£¬´òÓ¡Æä´æ´¢½á¹¹(´Ë²½Öè¿ÉÑ¡)...\n"); + PrintGraph_7_26(G, topo); +} + +/* + * ÒÔͼÐλ¯ÐÎʽÊä³öµ÷Õû½áµã˳ÐòºóµÄͼ½á¹¹ + * + * ×¢£ºÔÚͼ/ÍøÖУ¬Ê¹ÓÃ"-"À´±íʾÁ½¶¥µã²»Ö±½ÓÁ¬Í¨ + */ +static void PrintGraph_7_26(ALGraph G, int topo[MAX_VERTEX_NUM]) { + int i, j; + int pos[MAX_VERTEX_NUM]; + int adjs[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; + ArcNode* p; + + // ¼Ç¼¸÷¶¥µãÔÚÍØÆËÐòÁÐÖеÄË÷Òý + for(i = 0; i < G.vexnum; i++) { + pos[topo[i]] = i; + } + + // ³õʼ»¯ + for(i = 0; i < G.vexnum; i++) { + for(j = 0; j < G.vexnum; j++) { + adjs[i][j] = 0; + } + } + + // ±éÀúÓÐÏòͼ¸÷»¡Ö®¼äµÄ¹ØÏµ + for(i = 0; i < G.vexnum; i++) { + p = G.vertices[i].firstarc; + + while(p != NULL) { + adjs[pos[i]][pos[p->adjvex]] = 1; + p = p->nextarc; + } + } + + + printf(" "); + for(i = 0; i < G.vexnum; i++) { + printf(" %c", G.vertices[topo[i]].data); + } + printf("\n"); + + for(i = 0; i < G.vexnum; i++) { + printf("%c ", G.vertices[topo[i]].data); + + for(j = 0; j < G.vexnum; j++) { + if(adjs[i][j] == 0) { + printf(" -"); + } else { + printf("%3d", adjs[i][j]); + } + } + + printf("\n"); + } +} diff --git a/VisualC++/ExerciseBook/07.26/07.26.png b/VisualC++/ExerciseBook/07.26/07.26.png new file mode 100644 index 0000000000000000000000000000000000000000..6bb19199dc12ec07185960e5914dd51744fe7485 GIT binary patch literal 16448 zcmYMbby$?$_dQH^3?VRd35Ya9cMk|iNlAlrtCTcDH%d65G=c~S2+}P*G$P$7A|(9nq0;mUewXc%N@Xy`V07@(!EfZ;Rv zh5l4eO%bhfgnk?Rf#sl}rGSQ3olJOXjSc?B_k^1~MMER$zWqV(^C-1LLzA0US5`3a zv)FBQ^PrfSI~~p3E)Ra$wtx0R4DbEjz%XmlXS5}=N~e@Kr}Ab3J**{%?tu}_w)d!L zR+p+f%uXV`AL)AB+%J#QL407iR%@Zsclbgoyk0F#+V}8X!8gXy8kz5=eg2j2B+gPH zig<@OA`yt*&Q66^3*Q{6lExaCvgnJ>8pHT6Cx+#BN$=W;2DCEfpz1wnduxts(JO1~ z=H2|c@b5U|;D_1Q#=g%UGB@LwY_52>f9i96RJ}fT(LK}d<1BT;nPmG!=yl+=#pn6- zefA#CL{+7kDyO+8;`7<3qwTwLOxv#YL6{?kTno`n{k~}edG;x{`aiLbllE&iEQ zOM3OW3i-GxxXw5b(W3k|5<<%SFw#_-YvH=}LhrCV702PlIG2*SMlrGEV`Cj*xcuKM z*}0%0)5B7#xZSA`g!d=Y=HJf{3AiIs$CUo>)#`Lyo9odXlmgivs@aDk6~aCJ{2b?( z3m1*J-|@c)Ij60Vuc+sJsL{`r!kV=;SZ=R!$YhD*P`f)F5Ty3@6;>otA#if%glK)< zQc9%Q6sI;(uT7_c|DjgDdeb6b4zDp^`M2on`IEIpjZIE}XL3AeoI|ztWwkMC4F(^# z+RHrCAZ|kD4GOpe3r)x|GOl~rCPp`FZUjRl;=J2y?^pfXdncYgPwC@r>6F3vcWXG9 zE7e=im($PV5rHmwdb4xyrS-V2xuTG+G?L#}$TPkDk4)-H&(*n3uMg@fEjKmaTj>bL z80qxEb_r;Gi*cf!fN6o-*jckL4$sflyU-O+MDZk?hanYO!X=}SB~z`Q#AUtL*KIt> zMOg~eKlH!Ibcskl7AS@GP_$Z*ZeL!m$y#fQ;K}PJ;g}yLjwOyz5rL0VuKVj+8)#Yf z{OF_E9;*~mU%Oau_Pw+LJ=-%Sv{xvLA7>Xe25ZEiCn6cj(;j$oxFGQ*>8mz_XfGqB zyBIC83Ag&)sOn#CLT6j!-`~GunE!*)S4*nzbd}l5-X?X%c|Eea%EBsC+?H533yYA! zaYD21Z0OIM*#WEP%l+POACQLyx?2Hy?K;B!&*paP-IjHJW^-N?F)fL#k47w-?WOT# zvA@zNuKDz-$Z5`LvqQLF4ftU}kQfqCtev4>ex38P8D5+@UW7pL6Af*w&8JZL+tb-44g;>8a*X zliqUg{MLA8ZqWOV+@MSEKU3&06DFA^(O~PJOz})BGS-dbj1sC%MAkoFeUGZ>%f zvxhvitEFCIYBPMlAnn?Gnnjny@z(vbl=~!!G^s=O*@%5tJvV8-#eYM2sGRS)eAaKr zT>BxNWIy_)JJrXs3ITUFI<(t0Ry%7pw5<2u>_?OVM`kmO5997VmUCJ?xl^^OGAARu z)E?m}qBZ!ns9jK8?=@SCl_@x(JusC9ew)z9_-d`FDYC6P9c;3qQ2ds%jn(697v zO=~PHv~PF?z=N2h*#@|Ry+J)smdbGcYl>)Xl^HU9-ItT$`$8(?d4v~}m(%BE@sYD5 z&w8=lkoi+B6QV)Lf6;OSWS#o>&jLqD0nSwcqS-rr%$%a^@(7+F@MxmTJd2OIL-{wUqaLan4~N^}3T;E;dP%z8|Xl7xf=QnleNaZU%r z9G%*c%BcGd#mpt7NJ>7)y@Q|$soZKup z$5QQ^GukMDW5rcj+|~gBJm$DBtZU@kZVw*(3AAWI7+OqLy1x2)xo3S;a#dSt$(zpD zJQAgsa{uWi56u*jP)0y2-~ByKqHgiUK{gzEuIPxtG6SP8%)I=xPv+aKP0D{Ivvxm| zWa#rM$|cqh zvnH#tbBGngKVpuY=6OE$qn1WJuSfkR?YCKV{j&BK(K_UrrdP(!1Q`XJ0uPBQsoa@% zJ_))09%8p>ZW@m0&+Lo%n{Y-FHF`e?za^RmpFpXbsN?Va7f~lNGII} zOV1W0PiQAc7Rj|&wAev{pHn3>T(Q0rHpe!V@F@ZdqY)cJas&GNo+6d@=Xr*=>Cqu6 zCw#8EBn5XVIhj&ob%ZAf3mOAulkwu6up}Nss^kSme4cZ{Y|Y+kMdjNUkzsjFJ3pHI zWM6wPmv!UUN4JY%2dk&j3&8qR*kIXCK%<#GE?+E0v7Wj~gRdd;k!n--;lY58u%7bg zc@=rwk$Q?y2(?|)-X61V==!QYFd5$6S>WEIV-}%Rpai3HOp1OOg-i`xP+3fP3x5Wo za4vlPTlHNtPq>b7+VHl@B0?D*!C&vD=9BN(BeyiGh=OyhQ$433$1aeo78!IJyKP~9 zN&TF{yT0d12Y3ftzCAku-%k!QP77kM!f`H2g5T&+c@!KEUffukt(;>)B!;!&*MK3y zcFJtGUf@n1v{D-5WFywmd+3SntlF{)ny6E7`(PhpyL^nt!;oY~4W-#VF{Z;FMcgG7 z!a|r+3FnhIfzXSWTODHhBF zDWv3T$iD6}s4gPDN&UmNPjgJqONO0Sx7PzVQxU$i>L>ZGA>h&1qIZ4ENgZy()TAP8 zik`Y+>S)_e>XQM|J+m4NJSm}z%wzw@1+w*_e^k{W*8GJla^`8{gUGHR zK0$T%ZF;EospE}PDbzt7gX%e{d-O-=d9kHWAwDWL;aC12FA8*3slq?8&Ds_@v7v-@ z^hJP6;&f@%rOgJC+6*a5TwMawvd7ErGopF)zbZ6vJZ;aPB8{4g9Vnxb)s7G|PT){m zGqve5W2CF;?=P-HbTd2K13Lh+MDzt5iwKV8>;Q@v+d?ly!0 z{~(WsXfct6%Q(@HzOx^GgW&x+@_oP6+3=NWh!42FUirHBq;?YF-G8&bv=0Bt_n2=g zK_a~A)kl@ZlfNSYhm{ix(Kh>}mOFnRjdUiGwOWkAv@B{S**(OTtxKUttp4#$Zj>#I`<2e)4^`AUOMSo;;yIV%6@<6dJOE=t{;~80J6s61I~aZaxHz43#^>=vhVMx{Y0BxQ6^7jD8<;{-om+VI zfho+T(EQX;l|>49;c8t|edM{nvFHny!`eHxTJI*Sc^=3zQz*EEGV96038oStaPaa0 z7Hr-?ga}`IBf7`l+^Qemo0B<86QoCApgDfMwW}q z+QK@m%`E)W_l;jt4;;g>Xe-}F6_2o_wJ;?j$#U#?ex7#aIh;mKG$ac@5>DE!Ewr5K z?w!rWZEjq+Ya$R!KJZpiQjR<$M^`vJrC#c}7;PeM`0M)U}NCrLFOhK3*Gmi zBH9NJ9@JQoL&;}F+6B^JU@;x^DJbqwCGKOh(2E6FmKoG@V;4VRa^MtMFAuXn?-#a0 z`beOpid0iREwb7$va3ETgIXxOK!Pdj{eAEiP!661Igk`}!IycfzGIn^mU=9-B9VfTMSMSHiEFsZ$T<}(A~QvYCuZ_v0Y&jOKv-^fN~iHvWFI=qNQsTV^syk@*IR92!EsF$2RcC71<|n z%*HoGE38CR#qtwAzue09Kp5aHIQ6`E@uI}v+-bINwzTaY(@{zAe%sWEOMw|WUs%>x zvoeEkBnaE0^waat7)WuQ~XqcYJm}ndAcD?9DjK~KnVma!Nj611rp$FSd zVUVz)?)>o5ygeS%diZ}v`6`mJ+(}wz?toG&Dr&1Py`P*(QMI}l3&}=VWYI3MVk1_z zn?{}tdoi5(nal3 zCx7@fkI4n{i+Zwz$AzA&%Q8R3sU(biOUtejXW)WEtAm&xcsxa%7xFIpzI~D5{M#L$ zA8;Y&2f@*)p1TJk6#it?qy=%QCLFJss_94{mf6dHBMT~&N!%8g!r~w@8paETbsOJi zyG}dZH5G$}8c!ZjZBeB1uwJow@Ze&i^I)d*_7S?-QlaShJ~JuLc{{G1%j; zaT8yoZ9tYShDwLZi5`=Cp*dUCd~ZQvUfMv+uiYIm78sowGRwraClWSzf1XO22}(sU zzHgaW8+8N+6l8i4H2lug)YEYs3R-&jXX228A z_U0^*(=1?035%Gh_@OXOUfki5+5qOX^jdijc{wyj@NkDt&~mEv96Sh8|E6HK^50|Y z^{kaw^*8hZwkG9-blx5OvBN}iY?* zj6qBpXDd^SoN(qaE*B2p2vbC^#-Vkzr;;k*dpE}Ks5q4C`Hgek%$4E4Ff{KIb}Scu zttlI_KYS6R98J{2hT`RDlhv>6C*Q0S8W<;nJw7y_N*txHTaB|?;bv|vH{b>r>yYW4 zCjnL|>}h$7`C2KY10fOTI z<2q>Nz%a)Hc&MJU8E$&2V1#b4@h9j?N}(sc=zF7Qw-yqNf^ez#uf%TOY zG;P1FOrZ&6SR8?G@~;AS5~CvGjnsw(IP1E1MIl8_nodlYpP#Y_=5wK%fA8`3Jn`DL zttJwXe6zyNGZH8*?TtjoS2;+Mgo1#NzLFWk@7|ov2EDEY4o%sBD7&(DG)87NTt5xqc+i zB5tM-7&iBqi!zUXP)J_+FRM~|@^?}V#96Pey})6Av+q8iSpzc`ro8k9;Zu$V`#ixn ztuiWjQO;4GvIOcdSxwp8QTy62HmTir*wISKQgA0><~L>2&IKB{c$jBrXP6rVDV33t zIU65BJ(x@HRNj^U#%r04ljEFmNXmo^lg=}k6F}WLBzu0vt$CTud6-tEjLsy<8s9{g zs=&^C=UgC#_zw?@0+}s-z1z)M$c@;g##CyV%m`lgN-$W`-NsZNfrJ3y&qlJ(ls95xoUL2 z{nq;pX}loFZDF%1-l+Qrh3mHR!Y!Ao2rRVJ$!#mh>f1nnw4{4fO!;js&hGafIpu%= zx%rWQsgu!dM4N$rVAo?!6r_i-(dk9M{V12_Z7AVc=*x~rD*|zZiLicrkl*q>B>vmy zjAO$zc}b!YU=VNJ{rEt&B}g2q2EoczT?;gHmytH}s=r5~j=6`R!uBo2ypiYi`6xWdRdttd!#+-wnm97m43 zw+m{mpY1)^eAY(f(WmaoT}suK@LV;%iG>tw2|}FliEVbJl%Y+Xa+f-{Aya%v3h{i^ z8>Dq$d=12#`=|~cAdmUD%wWX`S(2X^3G7oE9X|1VFmLgQ+$56>IqulP|6+y(t z(+Py_p2{&Zu_)rTN-xY8p3|K(11oeW^!cyorIY}!NVVduRq=b zGg|}>n#CENpSjxEZpUrb)l)_V;8hC6qt^cDa2Si!arwHq8olQ2|qFFMMd3j;fr{Hkk}fZPSA z71x4#4_kD;jV!fQcEF}%vscAvf%#d)PLoWop754fnxHGXst7oB$k8Tt%=RX7RE474 z{tM`e(9TYi}zA6W)j;uZsu-Z|<4a?-o>d95iM{8H42{M)N%=c=%g9{K;=P0Qf&kxY+ zs6~fKq9@L{VBT#YNEV$}N|Tj-OXCV(-S!)sZ62p%u{}&BleVj4?0Q6US!IBzJ{>YDFb#S?-{xk<{m^FcqdlJ4 z=E0=O@jWWt;ad9+9TwJP3_Y*~>$t%4?)HB-@%wF$UeE1-T{{C03s6 z!R;X*pc!>PZQD;~VVKzY;*=Wju9Uhz6x~X+v%j$S$LpqMODXtoq+$jhyk00;))RYT|5U3T3B z1H!NyhA8kCB3WnvQP<_Zt%zv2o|5=HW+B`89mVA@+q=HLrct8gdM;B@0`AhrPG)udcy;S9O_I6=Q$$5_ zPg`B01(qnHiZc9{CyAn@EoQ0$W-(u}?OSIyCUuj5P)8tb~DnY1V7Noy}ics9QWjL1cHIUX8PZ*>3YY zY!Cjs&1ol=BdQIrni1CO?j!M-{IyyrwH$Io>hF^V_EEdzv@Vh5CbEo9(od)0y?iC!0K z-|;1%Nr%i4pRwMQ*MQw0!lI6w`ua(QY&jL?sH8%PjmdrYOv?A^l{*VgaUFM8Xu>E= z#Mu`n>OGQnsAwyo;ebJ$tUQ12qRYM%^LdCO5tpfaa$8=QzAvoLK?n+mH=4PNW}6Kt zkUwl}Dcdm$`UQ~`z_Oz&7BO!xaqW&cCwh*16633;E#XPjfSc3fF?Iv+vq>5M2Oa82 z^s$olD{;cOTuIMpOwTMX?;KSv9PMO}c;kDyqjXW#pFUyX-%Hmx33xLd%1&N%18yI# zzS^IEr&>LHA3vOlCwWg}qkcESSE0=v$>FT^Q4*epzJRHXVHDP_Y3_G6e|=OjsHD|w z#Qe5MExXA#*p>XrG?lO7d8`OdLyU>MBe;juS|8#dvzc68_X z5G9tIPy{ozf@*jR7P%1LFIINdyd^MQx)nOp@n4=_QVe&Kwa#L85wFAPy_!8&v^}{S zzIJ>`!cDu`DfFIB!X&B?!`cNfC3H!afQdYM@E^UArKPvlH1NUM_y_hZ1IYYP z$MSCfR`x}M@<&ODFHPX7_FN4Sinl#g0E)I{&PDmn`T<6Y1xlQl9dQ((uHguyg^M2; z$#V42O(j%&TJWojMn^~Yi>@ruFR?A<+xta=UaVo5Y>eTY!sNF^Bi8M6Hld~+&-3Z& z2iO3vj==nWlGcE!CZbiV!zJLsL6K)aj6Je*S5PG(v0Hc3R#96KWsC)!u)#{R7v~nT zKdnid)Da%Rf#ZP(xhCB|i)bn3u`y8yg(AuD#j7%vA?Fs2W?SFHp;1UOmD>hfKepdi zer!R>XwIrcD=ik@Tg*Euzq%6Naq69v=pk&*5lvWZ|aF-*+_^*WQvWBSsyf6V@MczvBuJ;OMzJ_Bs~a2)uLPu1p(4| zz~_hDarF$Y3`a6eC2U~g|p(a3gc%jq4+d}wuOLE@+4{rC^Kk~ztj&hOx+&ORDq;FrYA(!hvOSSDNCn;gyGKHbO~t3(-p<|Sj-jI z>7T+{%{98F5sF+(#WXn}HtMM{TyfQuQbZtAeK>}9%+1Zy;{?(0%gHKbxP3-#Yc53Bp1&GY=is{6oeqWtMSKaYNx_XKhF~B{kb4c$3 z0fq$n&vvOQBj+!WMzaxyjM5q3vAvsd7w$(>%>bL$JZi4prQoz4cZ9*TvM052QifP% zPUw(C^YOjynoo;ob_Rsg@&LExsMB1elVc+w`5PR4XG%8}dcs$8`-_<+PRxi`#cARZ z(rm}s;w%#KvQ4^!_uo=<1kZ=K(=6BII;#Ti64ozTq)ZehjhWcBJAZ1pnXku!IS(`- z{YK*D+=9<=#Jt`cmggU1-yt~j1^I?7#kUpL|EGIMC^6%EkZ){S<3`sQS?ZM78xO87 zjYm1-*V5lq(E8JDV$q$^Z^FEXX$Sxmly67V4T62Zu*#cS-M+aPyy0=&F(#7Q>Y$EQ_l-JO#Q2=T=%$nz>{>H2<%z9SU ziP)={Czd@jptW-6@6=scf*3}Co%2L2y#!hZ8qj%AI-oczQN}89Xj;eMY z?XgD1Jx20^&e=TmVHZq!6!Y6G-vv$}FVW?8>t|K3aZGNCrKm~Kj~4 zDoBsJiq8E0{K}NNsZ}oU&5*gxai)RilcCKTC!~!ly_1?~wmGe9EC&fh9{x2xX^k$Q z4u(I%5zqb>u*nZ83C=8GgBlgt(I#IBKHpIng%I`Q^w_$&X=x5);%RIQG0DxHqRKAD z5H=?fK7VYpsud96eDc z42L6OF^{7kL!*e=AnCK&@jsjTxCwO?gWVd%tg@tsctC960HLuk`Z>>jv047``T0U0 zf6$cmH?T~ag0+BbV$iBb@ul}6el@9m`Ls9vgTuJP`oN8VInE=-5+cJW{`h2NY2ebN z6O5LW;B)$4(SZ@twKo2CnyFR(q*q4oph!{^0d=mJy-01YU;FzPw8P?m^?vj?sI?Ql z{qy9{kIStC^p}ZBwCJ~*3WM@#aD8Y5Wm^?+FjWjNan z*LfV!s{Jk^5aT!62lS>&!r2C|^?eJ6#~)&q4cVa~#Q8y&m-kQl4@;af8)qx{!6K9d zRI&C|tln%dvUH$eY0z}H>P1|w$;9wt^G%VxGW1q@k-Qh)-jww)t7-|;a2>YJRwlD3 zCPH83SL=F;ad!V0`&P*@N^>6L&(pW{?nRvWuv72o%IoaMfh>I;LC(EER0LT4e*%k? z?N9S=RZHTwRa2i+IiyOWY6)^* zKK>sKlvR{$QT5I#6Nq8#+IdK;wvW=s+Z$$RfkK7rfXr5}Hz2fk) zu6(>ln!RouEat=sgcGsOC$si{+VnQJtj%&1aGvrhHv1ol128@Q*K0bPzd$1;4Z_-I zS3jlq#>8BIWwBa?ge(g@`y!?&_MfomeuR1ooyHf!nFeGs-Wak_%V>ektgsdvY>*aj zPtQCjqpeJ5fju_9BOlSF#rwBnjR=h=F6F=BWx@G0rno&pgI9BK+(+@ZJNrLc zjU@Zlg6gEJsG9qV;18Hzi9y$_n?S@9qYQ=qQ2*htO3!TO%Ui09{v8|{Phw@(pP7Gl zYt}21SJ9dLd)4MtiIBSE{Xdl!#|8zsZlex&nOaNM1a5i2(fQC(Ak<1IF|8m#i6=TC zXR3Cru|rF{&5Tr{6dW;D!eR{Em)nRP2=A&YL{(d~JTALrk7o%3%WeEPK;|A9=Qxa* zp9SsH?*8p5I6aXG&VXHUstDP&y%@eXt})(?fq>kZI(<}IaGuN`Q9FC;+}g$#&#sUU zEIeyojHl)wjJv?^7Ff`dzqksnKJTx=IMrA1cy`6zCxAzjIR!%A>MfFxqdzZV1OQoM zKtB-gHY2*?+HbDxWk*#C-M}g}D%QgvKveE%EQs;Y@QE)8WPtNXn!67yFe4PNfz=OU z&PoXNB&;}>7@Sp`LzqD3Q)vnA$6Z~C6<46r08t>f+t_SZI8q@=!HtKK0Bo5in_KuOd6=mk=xpDo$gvxG zW-LQ^TiwtMl-qpLR148JL&-a40Y7XQerIOZ^#UiS0%+@UUL&wY*jnW=$G(0)@;Bh^ z^U}HVu+IiAuDtt(nTF5rMXSZFh{~fq{cM{ONRN12>Wt042YcGF13`@$pJk)BO2BaF zK>VkCEKdMw#9FDeS%>bp?)p4t)KH8>rb;RgxzGEEW=C4diz;Ux!ZnJ?ljwcX-bR08 z7Ez#LE&m1avtU%~_XAYRirlpGoxKf7y=voE{4Zk^P;kQjE0;RjpLTqiN|DDjku1pU zJTA2Fl<8*Zjf59i{dOy+aQ>7pO+o4Xyekqh_TrZilTs)?ZaQRIk14c>7c(*P2wW%h|~i9!yg_#6Q(Y#m~{^kLoO! zmt`K0K&H~`Od?VC`8x8>9`mBCSJ=lS`E!LI%=kDrZN~147{#(y+nWU_tljDw=ouM- zdZ^E*?#}ZB@G_Y>bnr2{^$-9p` z*HOJ5FLczJ1gP6My}Up#s*Lkq^tOsko_!Bdk7K$9_B5%MPqnexr4L?2W%PUMY{LCFM{Kc*0L$wWYK4mcLby(JJ%dl`)JxcRIIg1F*eH%k5DDN$4e*z@&`nw-EID=zo^K?dVVz?JK|?+>ae z3}kixAvw8=asUW&Hf+-XsjaKvy1l9$f@~@7v-!5X{F#T4DfW$a51V^{LasXZRDv+h z>lYw>(b9L_CQCKH)Hyn|ChA_{#f|aJvM54#?wwt6-_Cb3Ei;&#pMS}(jOIuqdnb+Y zPgaVPKr5VdDj_obBg3JTshyyajB_pN;UTl_m;ekN$Z1MCk69n-2ybb(FMAO0Ile;K z^A0IqGIqXZKZn~GJ=HGYT(S;GRRnZD#x#Dak!)_XL7s%gw+zN$vImtAPE|Xu$R6wx z>TLv)ObG8=s(QoY0A=gHlUN6bFs*VDcVD(#Ry$fv{@XyB9_UR?mxLE4y7@0IE=rtO ziEZjQ+vIJ~IUNF0K~yaqmSOa3mtb)7cY~G)E4H%YaAD$<9WT(eNc8ijSS#0Nrt{!9 zt3nodWyXGgb*`gHq+^4Iw|Ft~9ukrh`f1P4^MACw@NI(4N95hiPW}kyNa5XJ>i`AHQfMJ`X#$hXQ1g4f z;!=;a=~w?XYVaKUR00LK-Ho{Kz-mm7>yHoOV;~aA8Cap)*ic-N^(^goYft7Q0VosGfsg=b+H;>W-ZSS(Y_-kYw5wcDuf8U6x}L7p(ITb zC4Y>F6Kp9~6AJf&=VhtId$8xS_6Te8$EZydKugI_0vPI8sU8QMM;sfI*W7*^e`l*8Qnj?W9=m+GHE3V?? zg1D1}AwacTi$--OKk!wqso=@UM$BvRPW+o56#S7&V= zknRimDa(HVf~u4-KoH!w3<+0|2BK#+Q)%$NZEdriFK?UcvF@f@{VEjVSR!VQ(`+OE1F%E z^7s;p>V}RNb)HVVp<38^fGDk_uJ6q zLmj`weNo%_(hS)8J7OnK{G_zQ^<%*)z(bIm^c-SP=DKi z0c*;zRS+ot#>Sj)|IDh2F*x&f~*nI>^v(_YluuafHoIr^~Sc&;-wOYK0hdY0# zvrfB@FM=+G!uq&5>4H6Ta%2pg{uisFch!KoqwB5ViA`xd%(MsTLM`c_)<*@o;V2#+ zLy(CAU~Y2<;V5;&6#qr7Mj*}1^n!7Che8Vx`s!s-H>(t@2$wf8e z`}5%|;Hmv&g4k}Z+eHab_!FA9i&}rTomQ^{^uL?4c*rSTdBX^dC<34 zbpJW$DWW9sfj;7H^TXROwx1*#sd^{?P8%luePDEV4qQIYoYgDF!k1VI@9ob|JSY)s z%Clq&<3wRPB$HREWy!l(tj6nANH}1hMF31->J5)OO`mPbyB70 zWTl{HhfciE)~zr+G-_OU=~~}*ukwWD>647Zg!bN!8x5%vlb$|dvpNX>pX@!MZ2Ok^ zc|p`2UA|bhC~LSFZGkb*S}_o2C0`AKA#j*J@owaiC1=Th`T>f*rS(QYZiHdhUq8+i z4`*nd>As~k;K{_D-UZz71w$lPZRYF!rk4lDCWG_^M)fJgG+aPJ@ah5l z2fd4G-QVG(3WTYTTK>IY0MsY(`Re{5cq%m6()Rf?Cn1Md9sq0Ar=Pc4 zRK;guuCZV#O@6YL>q~X9UjFD(^dG{qCg~|8mn4FD{`e{76stIz?46KFw+LF!xn8^& zg+?<~o7BjqB%uB2?vbjqYGccv52gl}{LkXoPicZB z_rf0sdhn%j&+Upn!;ny}GiCT(-tL5C`@ENRh7v{)yT{C?sgMid7TF(ML)Ybz$;mSB zvXAlOxA|W(rrZS@ZFr>HJh(_@rJ_s4~*X0@}*8RUcM(& z)}c$67-daU;cHw{-gr2H!04dO}C@25F<#uKJUM< z`uyY56FL(j373V~S~&lfS7D~a=7*R8&B>VY1Z8qdZAYA}=!bG#3r;YLeheEzQ=d=! zgGSloq8fhy97-iW^2)x}Y5w$}XI4U&TZZIJb`U>i0G^;Dg4ywIJmX$4^xNLjg~jBx zXmX0%VO|hF~G@+ALURsdbx+gCZ*HfuanHeJAx z@%=M0zG24KK%i{;b@_3Hxxa2hYe z2pf9iVsy|ud6uj2oHuhwC#hi+PuUnbx~w$0|3E)vJ|xMq7mz?L!lbXoR<(18u>;vB zm7i1xE|ffhq&UrO>N(j~uJa)h?9%M<{_%;dHA`F-S`g9}1g0kq$=enc+V|z_;xWJ1 zmY%WpM8FD8L1K;nAdn0mXW1)|(dfUh_Ik2s7NUSx>|_K9cYVZ|ls$2ke?z4Q*m0@M zX1uC(%6s01nlnV`bG~-RV-cO#E}3Nf%~8>Q`$A*xpHn@V*WzD%K+HX^nn{&e zQIijny&7UpIX)Rm`PfnXdZ%aBvy<}!NKJWGgd@J~@T(2l^8;7f+vB?8E1tV7aE%-?m`l?1-hkaDTC@P z5^sSN_5*a^HJ-C|wv7)lpX~8^nAHH4!K@}3dvV)MnFxk?d~xMmN3bbh&XUWj9!=qZ zAIp3=MubkAYE$heJ?MKqCVW5H*#~!e)(v4LyP3SoYUQ7Mg{;WrUwVi#dCa_yc&j zdW}6EWWzhf7X7w|6Z0P=x_G~!Q9$c0w*$svLY^C@)S-|x=EXT;SpMkNW8xzCt;bmm zm(L*haO_~!+r~#l+QL|PDbLN-y8GOHEkWtS4@8#ukPIunI?KIjB2Ziz6Gb`*5QGhV zJ0dU`Lp9-HE)dx{H^#H+B0fgcgs1ozynKX-qkAx+6#?~SrmOv@30i-f< zFB@bGfB<$9c8hwkcNVtJ&xd^jhyR*ueBT>!7bFLmY{ftYlz1no(0mo63!_amb(^pE zXpsx7;0oghm}@hD8M$RLiunkN)W8-1OO^#xo+V%(He_9}12D;VZ$b5O6`s5msPF>( z!4vBvJFw4$ZdV}!D+;-qZs;=O#Z$bPJ1#mz`hNOdO{fGj$A~ks7x=ydEL_5(5nr=no2FdTX#z7rIL&w|j5LJGbKZudamr?8(Ku^D60Y9=?V-P6u_ zPJg?9Sn`!nS=tr#t)RYO?k~jcKYFAqyzACHwmd4UYjrih(h^k189Dt>f)&w5<>O}e z_uT$hMG=*y_+M42>7Uz}_?Iuqo!jxCA{DVEC~5rd?xE(irX;o@cv~m10lQro-iA8D z9RF!5Cfbs#QH7(ULDIf^>wi!bq@e6^!`c>AV+ame9zV*3+wNPSdzgH1>kqEP3mU01 zC{Ws8-z-q8aVEXC8-4%9+h3n5FwLhKb?Xlo@K(9(Q?>bv53oI3SGX{UnDKf6Il3I(2mU#q@$6?U~?~bFYzFU%1zvqn3nK9GK?Y7;Fzv#0`bF z8(NVSTf~+eXk`39A3a1K4qQ6-GPQ0kU;E6y5tsU%#DIW!*8_X`PDW#|?gLl#MY?CK zqCOTE-@Tnjz%cZ(V{Afm8Ln!0n%>Ex@_*YwIN`5&vLK4A_`q;juP~0}Y6wlBpL7I7 zvEa4|{ks;i94P4oL$Z6^a!(O2mUb#Z9m_Ho{phu`rg5$U9t&9*QV?Hmr^BJHY^MXC zWn(zsUXvyKLW@kX-$Vh-jon$@T|~+kFu{sF`?n9oBfwfPUU-)bQKUi>v6U2TViIRT z4Bv5%;sk|G);}DV)2Tv0b#wXjT>2M?BK#A8m#}%I=6s94{Qt`j4R|6wMZ}aBWXZqu zXzr>52<=zQ?kU1s^6bwG4d?53=>Xb)A7f?cHWPWFQQY^t2mv9dD229xQq8QALy+wj zU@`74E&*i@*h!%J8$!-h3RM6)eXu9B+P}YI?$TUXZsz~&lB{(E;0>ob)88myMX3~88=g~WT0z_Udt!oIi1b@T*X~IH+x4hj z+t(A9;t8Cmgo<#CJbMJb5b2mB?B_|-dHeGI&fvHlCMY#9vV9kA|kM MqODx1Xchkd0f5#y;s5{u literal 0 HcmV?d00001 diff --git a/VisualC++/ExerciseBook/07.26/07.26.vcxproj b/VisualC++/ExerciseBook/07.26/07.26.vcxproj new file mode 100644 index 0000000..051cfe0 --- /dev/null +++ b/VisualC++/ExerciseBook/07.26/07.26.vcxproj @@ -0,0 +1,83 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {CFBDCCF8-D245-46A4-9840-485429938441} + My0726 + + + + Application + true + MultiByte + + + Application + false + true + MultiByte + + + + + + + + + + + + + $(SolutionDir)\..\Status;$(IncludePath) + + + + Level3 + Disabled + + + true + $(SolutionDir)\..\Status\Status.lib;%(AdditionalDependencies) + Console + + + + + Level3 + MaxSpeed + true + true + + + true + true + true + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.26/07.26.vcxproj.filters b/VisualC++/ExerciseBook/07.26/07.26.vcxproj.filters new file mode 100644 index 0000000..23484b7 --- /dev/null +++ b/VisualC++/ExerciseBook/07.26/07.26.vcxproj.filters @@ -0,0 +1,47 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + æºæ–‡ä»¶ + + + æºæ–‡ä»¶ + + + æºæ–‡ä»¶ + + + æºæ–‡ä»¶ + + + + + 头文件 + + + 头文件 + + + 头文件 + + + + + èµ„æºæ–‡ä»¶ + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.26/07.26.vcxproj.user b/VisualC++/ExerciseBook/07.26/07.26.vcxproj.user new file mode 100644 index 0000000..ace9a86 --- /dev/null +++ b/VisualC++/ExerciseBook/07.26/07.26.vcxproj.user @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.26/ALGraph.c b/VisualC++/ExerciseBook/07.26/ALGraph.c new file mode 100644 index 0000000..4f5206b --- /dev/null +++ b/VisualC++/ExerciseBook/07.26/ALGraph.c @@ -0,0 +1,325 @@ +/*================== + * ͼµÄÁÚ½Ó±í´æ´¢±íʾ + ===================*/ + +#include "ALGraph.h" + +// ¼ÈëÊý¾ÝµÄÔ´Îļþ£»fpΪnullʱ£¬ËµÃ÷ÐèÒª´Ó¿ØÖÆÌ¨Â¼Èë +static FILE* fp = NULL; + +/* + * IncInfoָʾ¸Ãͼ/ÍøµÄ±ß/»¡ÉÏÊÇ·ñ´æÔÚ¸½¼ÓÐÅÏ¢¡£ + * Èç¹ûÆäÖµ²»Îª0£¬Ôò±íʾÎÞ¸½¼ÓÐÅÏ¢£¬·ñÔò£¬±íʾ´æÔÚ¸½¼ÓÐÅÏ¢¡£ + */ +Boolean IncInfo = FALSE; + +// ·ÃÎʱêÖ¾Êý×飬¼Ç¼·ÃÎʹýµÄ¶¥µã +static Boolean visited[MAX_VERTEX_NUM]; + +// º¯Êý±äÁ¿ +static Status (* VisitFunc)(VertexType e); + + +/* + * ´´½¨ + * + *¡¾±¸×¢¡¿ + * + * ½Ì²ÄÖÐĬÈÏ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý¡£ + * ÕâÀïΪÁË·½±ã²âÊÔ£¬±ÜÃâÿ´ÎÔËÐж¼ÊÖ¶¯ÊäÈëÊý¾Ý£¬ + * Òò¶øÔÊÐíÑ¡Ôñ´ÓÔ¤ÉèµÄÎļþpathÖжÁÈ¡²âÊÔÊý¾Ý¡£ + * + * Èç¹ûÐèÒª´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý£¬ÔòpathΪNULL£¬»òpath[kind]Ϊ""¡£ + * Èç¹ûÐèÒª´ÓÎļþÖжÁÈ¡Êý¾Ý£¬ÔòÐèÒªÔÚpathÖÐÌîдÎļþÃûÐÅÏ¢¡£ + */ +Status CreateGraph(ALGraph* G, char* path[]) { + int readFromConsole; // ÊÇ·ñ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý + int kind; + Status flag; + + // ¡ï¡ï¡ï´Ë´¦¹Ì¶¨ÎªÓÐÏòͼ + kind = 0; + + // Èç¹ûûÓÐÎļþ·¾¶ÐÅÏ¢£¬Ôò´Ó¿ØÖÆÌ¨¶ÁÈ¡ÊäÈë + readFromConsole = (path == NULL) || strcmp(path[kind], "") == 0; + + // ÐèÒª´ÓÎļþ¶ÁÈ¡ + if(readFromConsole) { + (*G).kind = kind; // ¼Ç¼ͼ/ÍøµÄÀàÐÍ + } else { + // ´ò¿ªÎļþ£¬×¼±¸¶ÁÈ¡²âÊÔÊý¾Ý + fp = fopen(path[kind], "r"); + if(fp == NULL) { + return ERROR; + } + + // ¼ÈëͼµÄÀàÐÍ + ReadData(fp, "%d", &((*G).kind)); + } + + // Ëæ»ú´´½¨ÓÐÏòͼ/Íø»òÎÞÏòͼ/ÍøµÄÒ»ÖÖ + switch((*G).kind) { + case DG: + flag = CreateDG(G); + break; + default: + flag = ERROR; + break; + } + + if(fp != NULL) { + fclose(fp); + fp = NULL; + } + + return flag; +} + +/* + * ¹¹ÔìÓÐÏòͼ + */ +static Status CreateDG(ALGraph* G) { + int i, k; + int vexnum, arcnum; + VertexType v1, v2; + InfoType* info = NULL; + + (*G).vexnum = (*G).arcnum = 0; + + if(fp == NULL) { + printf("ÇëÊäÈëÓÐÏòͼµÄ¶¥µãÊý£º"); + scanf("%d", &vexnum); + printf("ÇëÊäÈëÓÐÏòͼµÄ»¡Êý£º"); + scanf("%d", &arcnum); + printf("¸ÃÓÐÏòͼµÄ»¡ÉÏÊÇ·ñ°üº¬ÆäËû¸½¼ÓÐÅÏ¢(0-²»°üº¬©¦1-°üº¬)£º"); + scanf("%d", &IncInfo); + + // ¼Èë¶¥µã¼¯ + printf("Çë¼Èë %d ¸ö¶¥µã£¬²»Í¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º", vexnum); + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(stdin); + scanf("%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } else { + ReadData(fp, "%d", &vexnum); // ¼Èë¶¥µãÊý + ReadData(fp, "%d", &arcnum); // ¼È뻡Êý + ReadData(fp, "%d", &IncInfo); // Åжϻ¡ÉÏÊÇ·ñ°üº¬¸½¼ÓÐÅÏ¢ + + // ¼Èë¶¥µã¼¯ + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(fp); + ReadData(fp, "%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } + + // ½öÔÚ¿ØÖÆÌ¨Â¼ÈëÐÅϢʱÊä³ö´ËÌáʾ + if(fp == NULL && arcnum != 0) { + printf("ÇëΪÓÐÏòͼÒÀ´Î¼Èë %d Ìõ»¡µÄÐÅÏ¢£¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º\n", arcnum); + } + + // ¼È뻡µÄÐÅÏ¢ + for(k = 0; k < arcnum; k++) { + if(fp == NULL) { + printf("µÚ %2d Ìõ»¡£º", k + 1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v2); + } else { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + skipBlank(fp); + ReadData(fp, "%c%c", &v1, &v2); + } + + // Èç¹ûÐèҪ¼È뻡µÄÆäËû¸½¼ÓÐÅÏ¢ + if(IncInfo) { + // ×îºó¼È븽¼ÓÐÅÏ¢ + Input(*G, &info); + } + + // ²åÈ뻡 + InsertArc(G, v1, v2, info); + } + + // ´ÓÎļþÖжÁÈ¡Êý¾Ýʱ£¬×îºóÆäʵӦµ±ÅжÏÒ»ÏÂÊÇ·ñ¶Áµ½ÁË×ã¹»µÄÐÅÏ¢ + return OK; +} + +/* + * ¼Èë±ß/»¡µÄÏà¹Ø¸½¼ÓÐÅÏ¢ + */ +static void Input(ALGraph G, InfoType** info) { + int weight; + + // ÔÚ"Íø"µÄÇéÐÎÏÂÐèҪ¼ÈëȨֵÐÅÏ¢ + if(G.kind == DN || G.kind == UDN) { + *info = (InfoType*) malloc(sizeof(InfoType)); + + if(fp == NULL) { + scanf("%d", &weight); + } else { + ReadData(fp, "%d", &weight); + } + + (*info)->weight = weight; + } +} + +/* + * ²éÕÒ + * + * ·µ»Ø¶¥µãuÔÚͼ/ÍøÖеÄλÖà + */ +int LocateVex(ALGraph G, VertexType u) { + int i; + + for(i = 0; i < G.vexnum; i++) { + if(G.vertices[i].data == u) { + return i; + } + } + + return -1; +} + +/* + * ¹¹ÔìÒ»¸ö±ß/»¡½áµã(½öÏÞÄÚ²¿Ê¹ÓÃ) + */ +static ArcNode* newArcNodePtr(int adjvex, ArcNode* nextarc, InfoType* info) { + ArcNode* p = (ArcNode*) malloc(sizeof(ArcNode)); + if(!p) { + exit(OVERFLOW); + } + + p->adjvex = adjvex; + + p->nextarc = nextarc; + + p->info = info; + + return p; +} + +/* + * ²åÈë±ß/»¡ + * + * Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬Ôò²åÈëÒ»Ìõ»¡ÐèÒªÔö¼ÓÁ½¸ö¶¥µã¹ØÏµ£¬µ«»¡µÄÊýÁ¿Ö»ÔöÒ»¡£ + * ¶ÔÓÚͼ/ÍøÀ´Ëµ£¬¿ÉÒÔÔڿɱä²ÎÊýÖÐÁгö±ß/»¡µÄ¸½¼ÓÐÅÏ¢¡£ + * + * ×¢£º´Ë´¦½ÓÊյIJÎÊýÓëMGraphÓÐЩ²»Ò»Ñù£ºÍøµÄ¸½¼ÓÐÅÏ¢Öаüº¬Á˸÷Ìõ±ß/»¡µÄȨֵ¡£ + */ +Status InsertArc(ALGraph* G, VertexType v, VertexType w, ...) { + int tail, head, k, count; + ArcNode* r; + ArcNode* pre; + Boolean overlay = FALSE; // ÊÇ·ñΪ¸²¸ÇÌí¼Ó + InfoType* info = NULL; // ±ß/»¡µÄ¸½¼ÓÐÅÏ¢ + va_list ap; + + tail = LocateVex(*G, v); // »ñÈ¡¶¥µãvÔÚ¶¥µã¼¯ÖеÄλÖà + if(tail == -1) { + return ERROR; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + head = LocateVex(*G, w); // »ñÈ¡¶¥µãwÔÚ¶¥µã¼¯ÖеÄλÖà + if(head == -1) { + return ERROR; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + // ¾Ü¾ø»· + if(tail == head) { + return ERROR; + } + + // Èç¹û±ß/»¡ÉÏ´æÔÚ¸½¼ÓÐÅÏ¢ + if(IncInfo) { + va_start(ap, w); // ÔÚwºó²éѯÊ׸ö¿É±ä²ÎÊý + info = va_arg(ap, InfoType*); // »ñÈ¡¸½¼ÓÐÅÏ¢ + va_end(ap); + } + + /* ½ÓÏÂÀ´£¬ÐèÒª²éÕÒºÏÊʵIJåÈëλÖà */ + + for(count = 0; count < 2; count++) { + pre = NULL; + // Ö¸ÏòÒÔtailΪβµÄÊ×Ìõ±ß/»¡ + r = G->vertices[tail].firstarc; + while(r != NULL && r->adjvex < head) { + pre = r; + r = r->nextarc; + } + + // Óöµ½ÁËÏàͬλÖõĽáµã + if(r != NULL && r->adjvex == head) { + r->info = info; // ¸´Óøýáµã + overlay = TRUE; // ·¢ÉúÁ˸²¸Ç + } else { + if(pre == NULL) { + G->vertices[tail].firstarc = newArcNodePtr(head, r, info); + } else { + pre->nextarc = newArcNodePtr(head, r, info); + } + } + + // Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬ÐèÒª¿¼ÂǶԳÆÐÔ + if((G->kind == UDG || G->kind == UDN) && tail != head) { + // µßµ¹iºÍj + k = tail; + tail = head; + head = k; + } else { + break; // Èç¹ûÊÇÓÐÏòµÄ£¬¿ÉÒÔ½áÊøÁË + } + } + + // ÔڷǸ²¸ÇµÄÇéÐÎÏ£¬²Å¿¼ÂǸüбß/»¡µÄÊýÁ¿ + if(!overlay) { + (*G).arcnum++; // ²»ÂÛÓÐÏòÎÞÏò£¬±ß/»¡ÊýÖ»ÔöÒ» + } + + return OK; +} + +/* + * ÒÔͼÐλ¯ÐÎʽÊä³öµ±Ç°½á¹¹ + */ +void PrintGraph(ALGraph G) { + int i; + ArcNode* p; + + if(G.vexnum == 0) { + printf("¿Õͼ£¬ÎÞÐè´òÓ¡£¡\n"); + return; + } + + printf("µ±Ç°Í¼/Íø°üº¬ %2d ¸ö¶¥µã£¬ %2d Ìõ±ß/»¡...\n", G.vexnum, G.arcnum); + + for(i = 0; i < G.vexnum; i++) { + printf("%c ===> ", G.vertices[i].data); + + p = G.vertices[i].firstarc; + while(p != NULL) { + if(IncInfo == 0) { + printf("%c ", G.vertices[p->adjvex].data); + + // ¶ÔÓÚÍø£¬»á´ÓÆä¸½¼ÓÐÅÏ¢ÖлñÈ¡µ½È¨Öµ + } else { + printf("%c[%2d] ", G.vertices[p->adjvex].data, p->info->weight); + } + + p = p->nextarc; + + if(p != NULL) { + printf("- "); + } + } + + printf("\n"); + } +} diff --git a/VisualC++/ExerciseBook/07.26/ALGraph.h b/VisualC++/ExerciseBook/07.26/ALGraph.h new file mode 100644 index 0000000..e70b2c2 --- /dev/null +++ b/VisualC++/ExerciseBook/07.26/ALGraph.h @@ -0,0 +1,128 @@ +/*================== + * ͼµÄÁÚ½Ó±í´æ´¢±íʾ + ===================*/ + +#ifndef ALGRAPH_H +#define ALGRAPH_H + +#include +#include // Ìṩmemset¡¢strcmp Ô­ÐÍ +#include // Ìṩºêva_list¡¢va_start¡¢va_arg¡¢va_end +#include // Ìṩmalloc¡¢realloc¡¢free¡¢exitÔ­ÐÍ +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// + +/* + * ×¢£º + * + * ͨ³£À´½²£¬ÎÞȨͼ±»¼ò³ÆÎª¡¾Í¼¡¿£¬ÓÐȨͼ±»¼ò³ÆÎª¡¾Íø¡¿¡£ + * ÎÞÏòͼ/ÍøÖеĶ¥µã¹ØÏµ±»³ÆÎª¡¾±ß¡¿£¬ÓÐÏòͼ/ÍøÖеĶ¥µã¹ØÏµ±»³ÆÎª¡¾»¡¡¿£¬²¢Çø·Ö»¡Í·Ó뻡β¡£ + * ʵ¼Ê±íÊöÖУ¬Î´±Ø»áÑϸñ×ñÊØÒÔÉÏÃüÃû¡£ + * + * µ±Ç°½á¹¹Êʺϴ洢±ß/»¡±È½ÏÏ¡ÊèµÄͼ/Íø¡£ + * + * ¡ï ²åÈë±ß/»¡µÄÐÅϢʱ£¬ÕâÀïµÄʵÏÖÊǰ´"ÉýÐò"²åÈëµÄ£¬ÕâʹµÃ²åÈëµÄ»¡Êǰ´"ÉýÐò"ÅÅÁеġ£ + */ + + +/* ºê¶¨Òå */ +#define MAX_VERTEX_NUM 26 // ×î´ó¶¥µã¸öÊý + + +// ͼµÄÀàÐÍ +typedef enum { + DG, // 0-ÓÐÏòͼ + DN, // 1-ÓÐÏòÍø(´øÈ¨Öµ) + UDG, // 2-ÎÞÏòͼ + UDN // 3-ÎÞÏòÍø(´øÈ¨Öµ) +} GraphKind; + +// ¶¥µãÀàÐÍ +typedef char VertexType; + +// ±ß/»¡µÄÏà¹Ø¸½¼ÓÐÅÏ¢ +typedef struct { + /* + * ×¢£º + * ½Ì²ÄÖиø³öµÄ½á¹¹Ö»¿¼ÂÇÁËÎÞȨͼ£¬¶øÃ»¿¼ÂÇÓÐȨͼ(Íø)¡£ + * ÕâÀïΪÁ˰ѡ°Íø¡±µÄÇéÐÎÒ²¿¼ÂǽøÈ¥£¬ÌØÔÚ¸½¼ÓÐÅÏ¢ÖÐÔö¼ÓÁË"È¨ÖØ"ÊôÐÔ¡£ + */ + int weight; +} InfoType; + +/* ±ß/»¡½áµã */ +typedef struct ArcNode { + int adjvex; // ¸Ã»¡ËùÖ¸ÏòµÄ¶¥µãµÄλÖà + struct ArcNode* nextarc; // Ö¸ÏòÏÂÒ»Ìõ»¡µÄÖ¸Õë + InfoType* info; // »¡µÄ¸½¼ÓÐÅÏ¢£¬Í¨³£ºöÂÔ +} ArcNode; + +// ÿ¸öÁ´±íµÄÍ·½áµã +typedef struct VNode { + VertexType data; // ¶¥µãÐÅÏ¢ + ArcNode* firstarc; // Ö¸ÏòµÚÒ»ÌõÒÀ¸½¸Ã¶¥µãµÄ»¡µÄÖ¸Õë +} VNode; + +/* ͼµÄÁÚ½Ó±í´æ´¢±íʾÀàÐͶ¨Òå */ +typedef struct { + VNode vertices[MAX_VERTEX_NUM]; // ÁÚ½Ó±í + int vexnum, arcnum; // ͼ/ÍøµÄ¶¥µãÊýºÍ»¡Êý + GraphKind kind; // ͼµÄÀàÐͱêÖ¾ +} ALGraph; + + +// ±ß/»¡ÉÏÊÇ·ñ´æÔÚ¸½¼ÓÐÅÏ¢ +extern Boolean IncInfo; + + +/* + * ´´½¨ + * + *¡¾±¸×¢¡¿ + * + * ½Ì²ÄÖÐĬÈÏ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý¡£ + * ÕâÀïΪÁË·½±ã²âÊÔ£¬±ÜÃâÿ´ÎÔËÐж¼ÊÖ¶¯ÊäÈëÊý¾Ý£¬ + * Òò¶øÔÊÐíÑ¡Ôñ´ÓÔ¤ÉèµÄÎļþpathÖжÁÈ¡²âÊÔÊý¾Ý¡£ + * + * Èç¹ûÐèÒª´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý£¬ÔòpathΪNULL£¬»òpath[kind]Ϊ""¡£ + * Èç¹ûÐèÒª´ÓÎļþÖжÁÈ¡Êý¾Ý£¬ÔòÐèÒªÔÚpathÖÐÌîдÎļþÃûÐÅÏ¢¡£ + */ +Status CreateGraph(ALGraph* G, char* path[]); + +/* + * ¹¹ÔìÓÐÏòͼ + */ +static Status CreateDG(ALGraph* G); + +/* + * ¼Èë±ß/»¡µÄÏà¹Ø¸½¼ÓÐÅÏ¢ + */ +static void Input(ALGraph G, InfoType** info); + +/* + * ²éÕÒ + * + * ·µ»Ø¶¥µãuÔÚͼ/ÍøÖеÄλÖà + */ +int LocateVex(ALGraph G, VertexType u); + +/* + * ¹¹ÔìÒ»¸ö±ß/»¡½áµã(½öÏÞÄÚ²¿Ê¹ÓÃ) + */ +static ArcNode* newArcNodePtr(int adjvex, ArcNode* nextarc, InfoType* info); + +/* + * ²åÈë±ß/»¡ + * + * Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬Ôò²åÈëÒ»Ìõ»¡ÐèÒªÔö¼ÓÁ½¸ö¶¥µã¹ØÏµ£¬µ«»¡µÄÊýÁ¿Ö»ÔöÒ»¡£ + * ¶ÔÓÚͼ/ÍøÀ´Ëµ£¬¿ÉÒÔÔڿɱä²ÎÊýÖÐÁгö±ß/»¡µÄ¸½¼ÓÐÅÏ¢¡£ + * + * ×¢£º´Ë´¦½ÓÊյIJÎÊýÓëMGraphÓÐЩ²»Ò»Ñù£ºÍøµÄ¸½¼ÓÐÅÏ¢Öаüº¬Á˸÷Ìõ±ß/»¡µÄȨֵ¡£ + */ +Status InsertArc(ALGraph* G, VertexType v, VertexType w, ...); + +/* + * ÒÔͼÐλ¯ÐÎʽÊä³öµ±Ç°½á¹¹ + */ +void PrintGraph(ALGraph G); + +#endif diff --git a/VisualC++/ExerciseBook/07.26/SqStack.c b/VisualC++/ExerciseBook/07.26/SqStack.c new file mode 100644 index 0000000..f056778 --- /dev/null +++ b/VisualC++/ExerciseBook/07.26/SqStack.c @@ -0,0 +1,90 @@ +/*========================= + * Õ»µÄ˳Ðò´æ´¢½á¹¹£¨Ë³ÐòÕ»£© + ==========================*/ + +#include "SqStack.h" //**¡ø03 Õ»ºÍ¶ÓÁÐ**// + +/* + * ³õʼ»¯ + * + * ¹¹ÔìÒ»¸ö¿ÕÕ»¡£³õʼ»¯³É¹¦Ôò·µ»ØOK£¬·ñÔò·µ»ØERROR¡£ + */ +Status InitStack(SqStack* S) { + if(S == NULL) { + return ERROR; + } + + (*S).base = (SElemType*) malloc(STACK_INIT_SIZE * sizeof(SElemType)); + if((*S).base == NULL) { + exit(OVERFLOW); + } + + (*S).top = (*S).base; + (*S).stacksize = STACK_INIT_SIZE; + + return OK; +} + +/* + * ÅÐ¿Õ + * + * ÅжÏ˳ÐòÕ»ÖÐÊÇ·ñ°üº¬ÓÐЧÊý¾Ý¡£ + * + * ·µ»ØÖµ£º + * TRUE : ˳ÐòջΪ¿Õ + * FALSE: ˳ÐòÕ»²»Îª¿Õ + */ +Status StackEmpty(SqStack S) { + if(S.top == S.base) { + return TRUE; + } else { + return FALSE; + } +} + +/* + * ÈëÕ» + * + * ½«ÔªËØeѹÈëµ½Õ»¶¥¡£ + */ +Status Push(SqStack* S, SElemType e) { + if(S == NULL || (*S).base == NULL) { + return ERROR; + } + + // Õ»Âúʱ£¬×·¼Ó´æ´¢¿Õ¼ä + if((*S).top - (*S).base >= (*S).stacksize) { + (*S).base = (SElemType*) realloc((*S).base, ((*S).stacksize + STACKINCREMENT) * sizeof(SElemType)); + if((*S).base == NULL) { + exit(OVERFLOW); // ´æ´¢·ÖÅäʧ°Ü + } + + (*S).top = (*S).base + (*S).stacksize; + (*S).stacksize += STACKINCREMENT; + } + + // ½øÕ»Ïȸ³Öµ£¬Õ»¶¥Ö¸ÕëÔÙ×ÔÔö + *(S->top++) = e; + + return OK; +} + +/* + * ³öÕ» + * + * ½«Õ»¶¥ÔªËص¯³ö£¬²¢ÓÃe½ÓÊÕ¡£ + */ +Status Pop(SqStack* S, SElemType* e) { + if(S == NULL || (*S).base == NULL) { + return ERROR; + } + + if((*S).top == (*S).base) { + return ERROR; + } + + // ³öÕ»Õ»¶¥Ö¸ÕëÏȵݼõ£¬ÔÙ¸³Öµ + *e = *(--(*S).top); + + return OK; +} diff --git a/VisualC++/ExerciseBook/07.26/SqStack.h b/VisualC++/ExerciseBook/07.26/SqStack.h new file mode 100644 index 0000000..a8fe835 --- /dev/null +++ b/VisualC++/ExerciseBook/07.26/SqStack.h @@ -0,0 +1,59 @@ +/*========================= + * Õ»µÄ˳Ðò´æ´¢½á¹¹£¨Ë³ÐòÕ»£© + ==========================*/ + +#ifndef SQSTACK_H +#define SQSTACK_H + +#include +#include // Ìṩmalloc¡¢realloc¡¢free¡¢exitÔ­ÐÍ +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// + +/* ºê¶¨Òå */ +#define STACK_INIT_SIZE 100 // ˳ÐòÕ»´æ´¢¿Õ¼äµÄ³õʼ·ÖÅäÁ¿ +#define STACKINCREMENT 10 // ˳ÐòÕ»´æ´¢¿Õ¼äµÄ·ÖÅäÔöÁ¿ + +/* ˳ÐòÕ»ÔªËØÀàÐͶ¨Òå */ +typedef int SElemType; + +// ˳ÐòÕ»ÔªËØ½á¹¹ +typedef struct { + SElemType* base; // Õ»µ×Ö¸Õë + SElemType* top; // Õ»¶¥Ö¸Õë + int stacksize; // µ±Ç°ÒÑ·ÖÅäµÄ´æ´¢¿Õ¼ä£¬ÒÔÔªËØÎªµ¥Î» +} SqStack; + + +/* + * ³õʼ»¯ + * + * ¹¹ÔìÒ»¸ö¿ÕÕ»¡£³õʼ»¯³É¹¦Ôò·µ»ØOK£¬·ñÔò·µ»ØERROR¡£ + */ +Status InitStack(SqStack* S); + +/* + * ÅÐ¿Õ + * + * ÅжÏ˳ÐòÕ»ÖÐÊÇ·ñ°üº¬ÓÐЧÊý¾Ý¡£ + * + * ·µ»ØÖµ£º + * TRUE : ˳ÐòջΪ¿Õ + * FALSE: ˳ÐòÕ»²»Îª¿Õ + */ +Status StackEmpty(SqStack S); + +/* + * ÈëÕ» + * + * ½«ÔªËØeѹÈëµ½Õ»¶¥¡£ + */ +Status Push(SqStack* S, SElemType e); + +/* + * ³öÕ» + * + * ½«Õ»¶¥ÔªËص¯³ö£¬²¢ÓÃe½ÓÊÕ¡£ + */ +Status Pop(SqStack* S, SElemType* e); + +#endif diff --git a/VisualC++/ExerciseBook/07.26/TestData_DG.txt b/VisualC++/ExerciseBook/07.26/TestData_DG.txt new file mode 100644 index 0000000..a240ed8 --- /dev/null +++ b/VisualC++/ExerciseBook/07.26/TestData_DG.txt @@ -0,0 +1,6 @@ +ͼÀàÐÍ¡ú0£¨ÓÐÏòͼ£© +¶¥µãÊý¡ú12 +»¡Êý¡ú16 +»¡ÊÇ·ñ´øÓÐÆäËûÐÅÏ¢¡ú0 +¶¥µã¼¯¡ú¡¾A£¬B£¬C£¬D£¬E£¬F£¬G£¬H£¬I£¬J£¬K£¬L¡¿ +»¡µÄ¼¯ºÏ¡ú¡¾F£¬J¡¿¡¾F£¬B¡¿¡¾F£¬C¡¿¡¾F£¬A¡¿¡¾B£¬C¡¿¡¾J£¬I¡¿¡¾C£¬I¡¿¡¾C£¬H¡¿¡¾I£¬H¡¿¡¾C£¬G¡¿¡¾D£¬A¡¿¡¾D£¬L¡¿¡¾L£¬A¡¿¡¾D£¬K¡¿¡¾K£¬E¡¿¡¾E£¬G¡¿ \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.26/TopologicalSorting.c b/VisualC++/ExerciseBook/07.26/TopologicalSorting.c new file mode 100644 index 0000000..82001f5 --- /dev/null +++ b/VisualC++/ExerciseBook/07.26/TopologicalSorting.c @@ -0,0 +1,96 @@ +/*======================= + * AOV-Íø(ÓÐÏòͼ)µÄÍØÆËÅÅÐò + * + * °üº¬Ëã·¨: 7.12 + ========================*/ + +#include "TopologicalSorting.h" + +/* + * ¨€¨€¨€¨€¨€¨€¨€¨€ Ëã·¨7.12 ¨€¨€¨€¨€¨€¨€¨€¨€ + * + * Èç¹ûÓÐÏòͼGÎÞ»ØÂ·£¬ÔòÊä³öËüµÄÒ»¸öÍØÆËÐòÁв¢·µ»ØOK£»·ñÔò£¬·µ»ØFALSE¡£ + * ÍØÆËÐòÁÐͨ³£²»Î¨Ò»£¬µ«ÊDZØÐ뱣֤ijЩ¹Ø¼ü½ÚµãµÄÏȺó´ÎÐò¡£ + * + * ×¢£ºÓë½Ì²Ä²»Í¬Ö®´¦ÔÚÓÚ£¬´Ë´¦Ôö¼ÓÁËÒ»¸ötopoÊý×é×ö²ÎÊý¡£ + * ¡¡¡¡¶ÔÓÚÇó³öµÄÍØÆËÐòÁУ¬²»»áÖ±½ÓÊä³ö£¬¶øÊǻỺ´æµ½topoÖС£ + * ¡¡¡¡ÕâÑùµÄ×öµÄÄ¿µÄÊǺóÐøµÄϰÌâÖлáÓжദÓõ½¸ÃÍØÆËÐòÁС£ + */ +Status TopologicalSort(ALGraph G, int topo[MAX_VERTEX_NUM]) { + int i, k, count; + int indegree[MAX_VERTEX_NUM]; + SqStack S; + ArcNode* p; + + // ¶Ô¸÷¶¥µãÇóÈë¶È + FindInDegree(G, indegree); + + // ³õʼ»¯ÁãÈë¶È¶¥µãÕ» + InitStack(&S); + + // ½¨Á¢Èë¶ÈΪ0µÄ¶¥µãÕ» + for(i = 0; i < G.vexnum; i++) { + // ½«Èë¶ÈΪ0µÄ¶¥µãÌí¼Óµ½Õ»ÖÐ + if(indegree[i] == 0) { + Push(&S, i); + } + } + + // ¶ÔÍØÆËÐòÁÐÖеĶ¥µã¼ÆÊý + count = 0; + + // ±éÀú¶¥µãÕ» + while(!StackEmpty(S)) { + // »ñȡһ¸öÁãÈë¶È¶¥µã + Pop(&S, &i); + + // ½«¸÷¶¥µãµÄÐòºÅÔÝ´æÆðÀ´ + topo[count++] = i; + + // ±éÀúiºÅ¶¥µãµÄÁÚ½Óµã + for(p = G.vertices[i].firstarc; p != NULL; p = p->nextarc) { + // »ñÈ¡¶¥µãÐòºÅ + k = p->adjvex; + + /* + * ½«iºÅ¶¥µãÿ¸öÁÚ½ÓµãµÄÈë¶È¼õÒ»£¬ÕâÏ൱ÓÚÇжÎiºÅ¶¥µãµ½ÆäËüÁÚ½ÓµãµÄÁªÏµ¡£ + * Èç¹û³öÏÖÁËеÄÈë¶ÈΪ0µÄ¶¥µã£¬¼ÌÐø½«ÆäÈëÕ»¡£ + */ + if((--indegree[k]) == 0) { + Push(&S, k); + } + } + } + + // Èç¹ûÓöµ½ÁË»ØÂ·£¬Ôò·µ»ØERROR + if(count < G.vexnum) { + return ERROR; + } else { + return OK; + } +} + +/* + * ¼ÆËã¸÷¶¥µãµÄÈë¶È + */ +static void FindInDegree(ALGraph G, int indegree[MAX_VERTEX_NUM]) { + int i; + ArcNode* p; + + // ³õʼ»¯ËùÓж¥µãµÄÈë¶ÈΪ0 + for(i = 0; i < G.vexnum; i++) { + indegree[i] = 0; + } + + // ±éÀúËùÓж¥µã + for(i = 0; i < G.vexnum; i++) { + // Ö¸Ïò¸Ã¶¥µãµÄÊ׸öÁÚ½Óµã + p = G.vertices[i].firstarc; + + // ±éÀú¸Ã¶¥µãµÄËùÓÐÁڽӵ㣬ͳ¼Æ¸÷¶¥µãµÄÈë¶È + while(p != NULL) { + indegree[p->adjvex]++; + p = p->nextarc; + } + } +} diff --git a/VisualC++/ExerciseBook/07.26/TopologicalSorting.h b/VisualC++/ExerciseBook/07.26/TopologicalSorting.h new file mode 100644 index 0000000..3fae677 --- /dev/null +++ b/VisualC++/ExerciseBook/07.26/TopologicalSorting.h @@ -0,0 +1,28 @@ +/*======================= + * AOV-Íø(ÓÐÏòͼ)µÄÍØÆËÅÅÐò + * + * °üº¬Ëã·¨: 7.12 + ========================*/ + +#ifndef TOPOLOGICALSORTING_H +#define TOPOLOGICALSORTING_H + +#include +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// +#include "SqStack.h" //**¡ø03 Õ»ºÍ¶ÓÁÐ**// +#include "ALGraph.h" //**¡ø07 ͼ**// + +/* + * ¨€¨€¨€¨€¨€¨€¨€¨€ Ëã·¨7.12 ¨€¨€¨€¨€¨€¨€¨€¨€ + * + * Èç¹ûÓÐÏòͼGÎÞ»ØÂ·£¬ÔòÊä³öËüµÄÒ»¸öÍØÆËÐòÁв¢·µ»ØOK£»·ñÔò£¬·µ»ØFALSE¡£ + * ÍØÆËÐòÁÐͨ³£²»Î¨Ò»£¬µ«ÊDZØÐ뱣֤ijЩ¹Ø¼ü½ÚµãµÄÏȺó´ÎÐò¡£ + */ +Status TopologicalSort(ALGraph G, int topo[MAX_VERTEX_NUM]); + +/* + * ¼ÆËã¸÷¶¥µãµÄÈë¶È + */ +static void FindInDegree(ALGraph G, int indegree[MAX_VERTEX_NUM]); + +#endif diff --git a/VisualC++/ExerciseBook/07.27/07.27.c b/VisualC++/ExerciseBook/07.27/07.27.c new file mode 100644 index 0000000..91012db --- /dev/null +++ b/VisualC++/ExerciseBook/07.27/07.27.c @@ -0,0 +1,133 @@ +#include +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// +#include "ALGraph.h" //**¡ø07 ͼ**// + +// ·ÃÎʱêÖ¾Êý×飬¼Ç¼·ÃÎʹýµÄ¶¥µã +static Boolean visited[MAX_VERTEX_NUM]; + + +/* + * Êä³öÂú×ãÌõ¼þµÄ¼òµ¥Â·¾¶ + */ +void Algo_7_27(ALGraph G, VertexType start, VertexType end, int k); + +/* + * ²éÕÒÂú×ãÌõ¼þµÄ¼òµ¥Â·¾¶¡£ + * + * pathÓÃÀ´´æ´¢Â·¹ýµÄ¶¥µã£¬path[0]´æ´¢pathÖеĶ¥µãÊýÁ¿¡£ + * + * Èç¹ûÕÒµ½¼òµ¥Â·¾¶£¬Ôò½«Æä´æ´¢µ½pathÖУ¬²¢·µ»ØOK£»·ñÔò£¬·µ»ØERROR¡£ + */ +Status SimplePath_7_27(ALGraph G, int start, int end, int k, int path[MAX_VERTEX_NUM]); + + +int main(int argc, char* argv[]) { + ALGraph G; + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ´´½¨²¢Êä³öͼ...\n"); + { + char* path[4]; + + path[0] = ""; + path[1] = ""; + path[2] = "TestData_UDG.txt"; + path[3] = ""; + + CreateGraph(&G, path); + PrintGraph(G); + printf("\n"); + } + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ²éÕÒ¼òµ¥Â·¾¶...\n"); + { + VertexType start = 'A'; + VertexType end = 'B'; + int k = 4; + + Algo_7_27(G, start, end, k); + printf("\n"); + } + + return 0; +} + + +/* + * Êä³öÂú×ãÌõ¼þµÄ¼òµ¥Â·¾¶ + */ +void Algo_7_27(ALGraph G, VertexType start, VertexType end, int k) { + int i, m, n; + int path[MAX_VERTEX_NUM + 1]; // 0ºÅµ¥ÔªÓÃÀ´¼Ç¼pathÖд洢µÄ¶¥µãÊýÁ¿ + Status s; + + m = LocateVex(G, start); + n = LocateVex(G, end); + + if(k <= 0 || m == -1 || n == -1 || m == n) { + printf("²ÎÊý´íÎó£¡\n"); + return; + } + + // °ÑËùÓж¥µã±ê¼ÇΪδ·ÃÎÊ + for(i = 0; i < G.vexnum; i++) { + visited[i] = FALSE; + } + + path[0] = 0; + + s = SimplePath_7_27(G, m, n, k, path); + + if(s == ERROR) { + printf("δÕÒµ½·ûºÏÌõ¼þµÄ¼òµ¥Â·¾¶£¡\n"); + return; + } + + printf("%c µ½ %c Ö®¼ä´æÔÚµÄÒ»Ìõ³¤¶ÈΪ %d µÄ¼òµ¥Â·¾¶Îª£º", start, end, k); + for(i = 1; i <= path[0]; i++) { + printf("%c ", GetVex(G, path[i])); + } + printf("\n"); +} + +/* + * ²éÕÒÂú×ãÌõ¼þµÄ¼òµ¥Â·¾¶¡£ + * + * pathÓÃÀ´´æ´¢Â·¹ýµÄ¶¥µã£¬path[0]´æ´¢pathÖеĶ¥µãÊýÁ¿¡£ + * + * Èç¹ûÕÒµ½¼òµ¥Â·¾¶£¬Ôò½«Æä´æ´¢µ½pathÖУ¬²¢·µ»ØOK£»·ñÔò£¬·µ»ØERROR¡£ + */ +Status SimplePath_7_27(ALGraph G, int start, int end, int k, int path[MAX_VERTEX_NUM]) { + int w; + + path[0]++; + path[path[0]] = start; + visited[start] = TRUE; // ±ê¼Ç¸Ã¶¥µãÒÑ·ÃÎÊ + + // Èç¹ûÓöµ½Öյ㣬ÔòÐèÒªÊÓÇéÐηµ»Ø + if(start == end) { + // ¶¥µãÊý = ·¾¶³¤¶È+1 + if(path[0] == k + 1) { + return OK; + } + } else { + // Éî¶ÈÓÅÏȱéÀú + for(w = FirstAdjVex(G, G.vertices[start].data); + w >= 0; + w = NextAdjVex(G, G.vertices[start].data, G.vertices[w].data)) { + // ºöÂÔÒÑ·ÃÎʹýµÄ¶¥µã + if(visited[w] == TRUE) { + continue; + } + + if(SimplePath_7_27(G, w, end, k, path) == OK) { + return OK; + } + } + } + + // ´Ó·¾¶ÖÐÒÆ³ý¸Ã¶¥µã£¬²¢½«Æä״̬½µ¼¶Îª"ÒÑ·ÃÎÊ" + path[0]--; + visited[start] = FALSE; // Çå³ý·ÃÎʱê¼Ç + + return ERROR; +} diff --git a/VisualC++/ExerciseBook/07.27/07.27.png b/VisualC++/ExerciseBook/07.27/07.27.png new file mode 100644 index 0000000000000000000000000000000000000000..a37e6ceb71414701b75b1862516f5f9183058992 GIT binary patch literal 8809 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 + + + + Debug + Win32 + + + Release + Win32 + + + + {1C7805E6-3FDA-414E-89AD-081A1F15898A} + My0727 + + + + Application + true + MultiByte + + + Application + false + true + MultiByte + + + + + + + + + + + + + $(SolutionDir)\..\Status;$(IncludePath) + + + + Level3 + Disabled + + + true + $(SolutionDir)\..\Status\Status.lib;%(AdditionalDependencies) + Console + + + + + Level3 + MaxSpeed + true + true + + + true + true + true + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.27/07.27.vcxproj.filters b/VisualC++/ExerciseBook/07.27/07.27.vcxproj.filters new file mode 100644 index 0000000..64a37b8 --- /dev/null +++ b/VisualC++/ExerciseBook/07.27/07.27.vcxproj.filters @@ -0,0 +1,35 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + æºæ–‡ä»¶ + + + æºæ–‡ä»¶ + + + + + 头文件 + + + + + èµ„æºæ–‡ä»¶ + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.27/07.27.vcxproj.user b/VisualC++/ExerciseBook/07.27/07.27.vcxproj.user new file mode 100644 index 0000000..ace9a86 --- /dev/null +++ b/VisualC++/ExerciseBook/07.27/07.27.vcxproj.user @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.27/ALGraph.c b/VisualC++/ExerciseBook/07.27/ALGraph.c new file mode 100644 index 0000000..c5ea562 --- /dev/null +++ b/VisualC++/ExerciseBook/07.27/ALGraph.c @@ -0,0 +1,595 @@ +/*================== + * ͼµÄÁÚ½Ó±í´æ´¢±íʾ + ===================*/ + +#include "ALGraph.h" + +// ¼ÈëÊý¾ÝµÄÔ´Îļþ£»fpΪnullʱ£¬ËµÃ÷ÐèÒª´Ó¿ØÖÆÌ¨Â¼Èë +static FILE* fp = NULL; + +/* + * IncInfoָʾ¸Ãͼ/ÍøµÄ±ß/»¡ÉÏÊÇ·ñ´æÔÚ¸½¼ÓÐÅÏ¢¡£ + * Èç¹ûÆäÖµ²»Îª0£¬Ôò±íʾÎÞ¸½¼ÓÐÅÏ¢£¬·ñÔò£¬±íʾ´æÔÚ¸½¼ÓÐÅÏ¢¡£ + */ +Boolean IncInfo = FALSE; + +// ·ÃÎʱêÖ¾Êý×飬¼Ç¼·ÃÎʹýµÄ¶¥µã +static Boolean visited[MAX_VERTEX_NUM]; + +// º¯Êý±äÁ¿ +static Status (* VisitFunc)(VertexType e); + + +/* + * ´´½¨ + * + *¡¾±¸×¢¡¿ + * + * ½Ì²ÄÖÐĬÈÏ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý¡£ + * ÕâÀïΪÁË·½±ã²âÊÔ£¬±ÜÃâÿ´ÎÔËÐж¼ÊÖ¶¯ÊäÈëÊý¾Ý£¬ + * Òò¶øÔÊÐíÑ¡Ôñ´ÓÔ¤ÉèµÄÎļþpathÖжÁÈ¡²âÊÔÊý¾Ý¡£ + * + * Èç¹ûÐèÒª´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý£¬ÔòpathΪNULL£¬»òpath[kind]Ϊ""¡£ + * Èç¹ûÐèÒª´ÓÎļþÖжÁÈ¡Êý¾Ý£¬ÔòÐèÒªÔÚpathÖÐÌîдÎļþÃûÐÅÏ¢¡£ + */ +Status CreateGraph(ALGraph* G, char* path[]) { + int readFromConsole; // ÊÇ·ñ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý + int kind; + Status flag; + + // ¡ï¡ï¡ï´Ë´¦¹Ì¶¨ÎªÎÞÏòͼ + kind = 2; + + // Èç¹ûûÓÐÎļþ·¾¶ÐÅÏ¢£¬Ôò´Ó¿ØÖÆÌ¨¶ÁÈ¡ÊäÈë + readFromConsole = (path == NULL) || strcmp(path[kind], "") == 0; + + // ÐèÒª´ÓÎļþ¶ÁÈ¡ + if(readFromConsole) { + (*G).kind = kind; // ¼Ç¼ͼ/ÍøµÄÀàÐÍ + } else { + // ´ò¿ªÎļþ£¬×¼±¸¶ÁÈ¡²âÊÔÊý¾Ý + fp = fopen(path[kind], "r"); + if(fp == NULL) { + return ERROR; + } + + // ¼ÈëͼµÄÀàÐÍ + ReadData(fp, "%d", &((*G).kind)); + } + + // Ëæ»ú´´½¨ÓÐÏòͼ/Íø»òÎÞÏòͼ/ÍøµÄÒ»ÖÖ + switch((*G).kind) { + case UDG: + flag = CreateUDG(G); + break; + default: + flag = ERROR; + break; + } + + if(fp != NULL) { + fclose(fp); + fp = NULL; + } + + return flag; +} + +/* + * ¹¹ÔìÎÞÏòͼ + */ +static Status CreateUDG(ALGraph* G) { + int i, k; + int vexnum, arcnum; + VertexType v1, v2; + InfoType* info = NULL; + + (*G).vexnum = (*G).arcnum = 0; + + if(fp == NULL) { + printf("ÇëÊäÈëÎÞÏòͼµÄ¶¥µãÊý£º"); + scanf("%d", &vexnum); + printf("ÇëÊäÈëÎÞÏòͼµÄ±ßÊý£º"); + scanf("%d", &arcnum); + printf("¸ÃÎÞÏòͼµÄ±ßÉÏÊÇ·ñ°üº¬ÆäËû¸½¼ÓÐÅÏ¢(0-²»°üº¬©¦1-°üº¬)£º"); + scanf("%d", &IncInfo); + + // ¼Èë¶¥µã¼¯ + printf("Çë¼Èë %d ¸ö¶¥µã£¬²»Í¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º", vexnum); + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(stdin); + scanf("%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } else { + ReadData(fp, "%d", &vexnum); // ¼Èë¶¥µãÊý + ReadData(fp, "%d", &arcnum); // ¼Èë±ßÊý + ReadData(fp, "%d", &IncInfo);// ÅжϱßÉÏÊÇ·ñ°üº¬¸½¼ÓÐÅÏ¢ + + // ¼Èë¶¥µã¼¯ + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(fp); + ReadData(fp, "%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } + + // ½öÔÚ¿ØÖÆÌ¨Â¼ÈëÐÅϢʱÊä³ö´ËÌáʾ + if(fp == NULL && arcnum != 0) { + printf("ÇëΪÎÞÏòͼÒÀ´Î¼Èë %d Ìõ±ßµÄÐÅÏ¢£¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º\n", arcnum); + } + + // ¼Èë±ßµÄÐÅÏ¢ + for(k = 0; k < arcnum; k++) { + if(fp == NULL) { + printf("µÚ %2d Ìõ±ß£º", k + 1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v2); + } else { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + skipBlank(fp); + ReadData(fp, "%c%c", &v1, &v2); + } + + // Èç¹ûÐèҪ¼Èë±ßµÄÆäËû¸½¼ÓÐÅÏ¢ + if(IncInfo) { + // ×îºó¼È븽¼ÓÐÅÏ¢ + Input(*G, &info); + + } + + // ²åÈë±ß + InsertArc(G, v1, v2, info); + } + + // ´ÓÎļþÖжÁÈ¡Êý¾Ýʱ£¬×îºóÆäʵӦµ±ÅжÏÒ»ÏÂÊÇ·ñ¶Áµ½ÁË×ã¹»µÄÐÅÏ¢ + return OK; +} + +/* + * ¼Èë±ß/»¡µÄÏà¹Ø¸½¼ÓÐÅÏ¢ + */ +static void Input(ALGraph G, InfoType** info) { + int weight; + + // ÔÚ"Íø"µÄÇéÐÎÏÂÐèҪ¼ÈëȨֵÐÅÏ¢ + if(G.kind == DN || G.kind == UDN) { + *info = (InfoType*) malloc(sizeof(InfoType)); + + if(fp == NULL) { + scanf("%d", &weight); + } else { + ReadData(fp, "%d", &weight); + } + + (*info)->weight = weight; + } +} + +/* + * ²éÕÒ + * + * ·µ»Ø¶¥µãuÔÚͼ/ÍøÖеÄλÖà + */ +int LocateVex(ALGraph G, VertexType u) { + int i; + + for(i = 0; i < G.vexnum; i++) { + if(G.vertices[i].data == u) { + return i; + } + } + + return -1; +} + +/* + * ȡֵ + * + * ·µ»ØË÷Òýv´¦µÄ¶¥µãÖµ + */ +VertexType GetVex(ALGraph G, int v) { + if(v < 0 || v >= G.vexnum) { + return '\0'; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + return G.vertices[v].data; +} + +/* + * ¸³Öµ + * + * ½«¶¥µãv¸³ÖµÎªvalue + */ +Status PutVex(ALGraph* G, VertexType v, VertexType value) { + int k; + + // Ê×ÏÈÐèÒªÅжϸö¥µãÊÇ·ñ´æÔÚ + k = LocateVex((*G), v); + if(k == -1) { + return ERROR; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + // Ìæ»»Í·½áµã + (*G).vertices[k].data = value; + + /* Á´±íÖеÄÔªËØ´æ´¢µÄÊǶ¥µãµÄλÖã¬ËùÒÔÎÞÐè±éÀúÁ´±íÀ´Ì滻Ŀ±êÖµ */ + + return OK; +} + +/* + * Ê׸öÁÚ½Óµã + * + * ·µ»Ø¶¥µãvµÄÊ׸öÁÚ½Óµã + */ +int FirstAdjVex(ALGraph G, VertexType v) { + int k; + ArcNode* r; + + // Ê×ÏÈÐèÒªÅжϸö¥µãÊÇ·ñ´æÔÚ + k = LocateVex(G, v); + if(k == -1) { + return -1; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + r = G.vertices[k].firstarc; + if(r == NULL) { + return -1; + } else { + return r->adjvex; + } +} + +/* + * ÏÂÒ»¸öÁÚ½Óµã + * + * ·µ»Ø¶¥µãvµÄ(Ïà¶ÔÓÚwµÄ)ÏÂÒ»¸öÁÚ½Óµã + */ +int NextAdjVex(ALGraph G, VertexType v, VertexType w) { + int kv, kw; + ArcNode* r; + + // Ê×ÏÈÐèÒªÅжϸö¥µãÊÇ·ñ´æÔÚ + kv = LocateVex(G, v); + if(kv == -1) { + return -1; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + // Ê×ÏÈÐèÒªÅжϸö¥µãÊÇ·ñ´æÔÚ + kw = LocateVex(G, w); + if(kw == -1) { + return -1; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + r = G.vertices[kv].firstarc; + if(r == NULL) { + return -1; // Á´±íΪ¿Õ + } + + // ÔÚÁ´±íÖвéÕÒw + while(r != NULL && r->adjvex < kw) { + r = r->nextarc; + } + + // Èç¹ûûÕÒµ½w + if(r == NULL) { + return -1; + } + + // Èç¹ûÕÒµ½ÁËw£¬µ«ÊÇwºóÃæÃ»ÓбðµÄ¶¥µã£¬ÄÇôҲÎÞ·¨·µ»ØÁÚ½Óµã + if(r->adjvex == kw && r->nextarc != NULL) { + return r->nextarc->adjvex; + } + + return -1; +} + +/* + * ²åÈë¶¥µã + * + * ½«Ö¸¶¨µÄ¶¥µãv×·¼Óµ½¶¥µã¼¯ÖУ¬Î´½¨Á¢¸Ã¶¥µãÓëÆäËû¶¥µãµÄ¹ØÏµ + */ +Status InsertVex(ALGraph* G, VertexType v) { + int k; + + // ¶¥µãÊý¹ý¶à + if((*G).vexnum == MAX_VERTEX_NUM) { + return ERROR; + } + + // Ê×ÏÈÐèÒªÅжϸö¥µãÊÇ·ñ´æÔÚ + k = LocateVex(*G, v); + if(k >= 0) { + return ERROR; // Ö¸¶¨µÄ¶¥µã´æÔÚʱ£¬ÎÞÐèÖØ¸´Ìí¼Ó + } + + G->vertices[(*G).vexnum].data = v; + G->vertices[(*G).vexnum].firstarc = NULL; + + (*G).vexnum++; + + return OK; +} + +/* + * ɾ³ý¶¥µã + * + * ´Ó¶¥µã¼¯ÖÐɾ³ýÖ¸¶¨µÄ¶¥µãv£¬×¢ÒâÐèÒª¸üÐÂÏà¹ØµÄ¶¥µã¹ØÏµ + */ +Status DeleteVex(ALGraph* G, VertexType v) { + int k, i; + ArcNode* pre, * r; + + // Ê×ÏÈÐèÒªÅжϸö¥µãÊÇ·ñ´æÔÚ + k = LocateVex(*G, v); + if(k == -1) { + return ERROR; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + // ÕÒµ½ÒÔ½áµãv³ö·¢µÄÁ´±í£¬ÊͷŸÃÁ´±íÉÏËùÓнáµã + r = G->vertices[k].firstarc; + while(r != NULL) { + pre = r; + r = r->nextarc; + free(pre); + + (*G).arcnum--; + } + + G->vertices[k].firstarc = NULL; + + // ±éÀúÆäËüËùÓÐÁ´±í£¬É¾³ýÄÇЩָÏò¶¥µãvµÄ»¡£»¶øÇÒ£¬Ï±곬¹ýkµÄ¶¥µã£¬ÆäϱêÖµÐèÒªµÝ¼õ + for(i = 0; i < G->vexnum; i++) { + pre = NULL; + r = G->vertices[i].firstarc; + while(r != NULL && r->adjvex < k) { + pre = r; + r = r->nextarc; + } + + // Á´±íÉÏËùÓж¥µãµÄϱê¾ùСÓÚk + if(r == NULL) { + continue; + } + + if(r->adjvex == k) { + // ´Ó¿ªÍ·É¾µô½áµãv + if(pre == NULL) { + G->vertices[i].firstarc = r->nextarc; + + // ´ÓÖмäij¸öλÖÃɾµô½áµãv + } else { + pre->nextarc = r->nextarc; + } + + free(r); + + // Èç¹ûÕâÊÇÓÐÏòµÄͼ/Íø£¬ÒÀÈ»ÐèÒªµÝ¼õ±ß/»¡µÄÊýÁ¿ + if((*G).kind == DG || (*G).kind == DN) { + (*G).arcnum--; + } + } + + // ÔÙ´ÎÈ·¶¨rµÄλÖà + if(pre == NULL) { + r = G->vertices[i].firstarc; + } else { + r = pre->nextarc; + } + + // ϱ곬¹ýkµÄ¶¥µã£¬ÐèÒªµÝ¼õÆäϱê + while(r != NULL && r->adjvex > k) { + r->adjvex -= 1; + r = r->nextarc; + } + } + + // ¶¥µã¼¯Ç°ÒÆ + for(i = k + 1; i < (*G).vexnum; i++) { + G->vertices[i - 1] = G->vertices[i]; + } + + // ¶¥µãÊýµÝ¼õ + (*G).vexnum--; + + return OK; +} + +/* + * ¹¹ÔìÒ»¸ö±ß/»¡½áµã(½öÏÞÄÚ²¿Ê¹ÓÃ) + */ +static ArcNode* newArcNodePtr(int adjvex, ArcNode* nextarc, InfoType* info) { + ArcNode* p = (ArcNode*) malloc(sizeof(ArcNode)); + if(!p) { + exit(OVERFLOW); + } + + p->adjvex = adjvex; + + p->nextarc = nextarc; + + p->info = info; + + return p; +} + +/* + * ²åÈë±ß/»¡ + * + * Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬Ôò²åÈëÒ»Ìõ»¡ÐèÒªÔö¼ÓÁ½¸ö¶¥µã¹ØÏµ£¬µ«»¡µÄÊýÁ¿Ö»ÔöÒ»¡£ + * ¶ÔÓÚͼ/ÍøÀ´Ëµ£¬¿ÉÒÔÔڿɱä²ÎÊýÖÐÁгö±ß/»¡µÄ¸½¼ÓÐÅÏ¢¡£ + * + * ×¢£º´Ë´¦½ÓÊյIJÎÊýÓëMGraphÓÐЩ²»Ò»Ñù£ºÍøµÄ¸½¼ÓÐÅÏ¢Öаüº¬Á˸÷Ìõ±ß/»¡µÄȨֵ¡£ + */ +Status InsertArc(ALGraph* G, VertexType v, VertexType w, ...) { + int tail, head, k, count; + ArcNode* r; + ArcNode* pre; + Boolean overlay = FALSE; // ÊÇ·ñΪ¸²¸ÇÌí¼Ó + InfoType* info = NULL; // ±ß/»¡µÄ¸½¼ÓÐÅÏ¢ + va_list ap; + + tail = LocateVex(*G, v); // »ñÈ¡¶¥µãvÔÚ¶¥µã¼¯ÖеÄλÖà + if(tail == -1) { + return ERROR; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + head = LocateVex(*G, w); // »ñÈ¡¶¥µãwÔÚ¶¥µã¼¯ÖеÄλÖà + if(head == -1) { + return ERROR; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + // ¾Ü¾ø»· + if(tail == head) { + return ERROR; + } + + // Èç¹û±ß/»¡ÉÏ´æÔÚ¸½¼ÓÐÅÏ¢ + if(IncInfo) { + va_start(ap, w); // ÔÚwºó²éѯÊ׸ö¿É±ä²ÎÊý + info = va_arg(ap, InfoType*); // »ñÈ¡¸½¼ÓÐÅÏ¢ + va_end(ap); + } + + /* ½ÓÏÂÀ´£¬ÐèÒª²éÕÒºÏÊʵIJåÈëλÖà */ + + for(count = 0; count < 2; count++) { + pre = NULL; + // Ö¸ÏòÒÔtailΪβµÄÊ×Ìõ±ß/»¡ + r = G->vertices[tail].firstarc; + while(r != NULL && r->adjvex < head) { + pre = r; + r = r->nextarc; + } + + // Óöµ½ÁËÏàͬλÖõĽáµã + if(r != NULL && r->adjvex == head) { + r->info = info; // ¸´Óøýáµã + overlay = TRUE; // ·¢ÉúÁ˸²¸Ç + } else { + if(pre == NULL) { + G->vertices[tail].firstarc = newArcNodePtr(head, r, info); + } else { + pre->nextarc = newArcNodePtr(head, r, info); + } + } + + // Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬ÐèÒª¿¼ÂǶԳÆÐÔ + if((G->kind == UDG || G->kind == UDN) && tail != head) { + // µßµ¹iºÍj + k = tail; + tail = head; + head = k; + } else { + break; // Èç¹ûÊÇÓÐÏòµÄ£¬¿ÉÒÔ½áÊøÁË + } + } + + // ÔڷǸ²¸ÇµÄÇéÐÎÏ£¬²Å¿¼ÂǸüбß/»¡µÄÊýÁ¿ + if(!overlay) { + (*G).arcnum++; // ²»ÂÛÓÐÏòÎÞÏò£¬±ß/»¡ÊýÖ»ÔöÒ» + } + + return OK; +} + +/* + * ɾ³ý±ß/»¡ + */ +Status DeleteArc(ALGraph* G, VertexType v, VertexType w) { + int tail, head, k, count; + ArcNode* r; + ArcNode* pre; + + tail = LocateVex(*G, v); + if(tail == -1) { + return ERROR; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + head = LocateVex(*G, w); + if(head == -1) { + return ERROR; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + for(count = 0; count < 2; count++) { + pre = NULL; + // ÔÚµ±Ç°Á´±íÖÐÕÒµ½´ýɾ³ýµÄ±ß/»¡ + r = G->vertices[tail].firstarc; + while(r != NULL && r->adjvex < head) { + pre = r; + r = r->nextarc; + } + + // ÕÒµ½ÁË´ýɾ³ýµÄ±ß/»¡ + if(r != NULL && r->adjvex == head) { + if(pre == NULL) { + G->vertices[tail].firstarc = r->nextarc; + } else { + pre->nextarc = r->nextarc; + } + + free(r); + } else { + return ERROR; // ûÕÒµ½ + } + + // Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬ÐèÒª¿¼ÂǶԳÆÐÔ + if((G->kind == UDG || G->kind == UDN) && tail != head) { + // µßµ¹tailºÍhead + k = tail; + tail = head; + head = k; + } else { + break; // Èç¹ûÊÇÓÐÏòµÄ£¬¿ÉÒÔ½áÊøÁË + } + } + + (*G).arcnum--; // ²»ÂÛÓÐÏòÎÞÏò£¬±ß/»¡ÊýÖ»¼õÒ» + + return OK; +} + +/* + * ÒÔͼÐλ¯ÐÎʽÊä³öµ±Ç°½á¹¹ + */ +void PrintGraph(ALGraph G) { + int i; + ArcNode* p; + + if(G.vexnum == 0) { + printf("¿Õͼ£¬ÎÞÐè´òÓ¡£¡\n"); + return; + } + + printf("µ±Ç°Í¼/Íø°üº¬ %2d ¸ö¶¥µã£¬ %2d Ìõ±ß/»¡...\n", G.vexnum, G.arcnum); + + for(i = 0; i < G.vexnum; i++) { + printf("%c ===> ", G.vertices[i].data); + + p = G.vertices[i].firstarc; + while(p != NULL) { + if(IncInfo == 0) { + printf("%c ", G.vertices[p->adjvex].data); + + // ¶ÔÓÚÍø£¬»á´ÓÆä¸½¼ÓÐÅÏ¢ÖлñÈ¡µ½È¨Öµ + } else { + printf("%c[%2d] ", G.vertices[p->adjvex].data, p->info->weight); + } + + p = p->nextarc; + + if(p != NULL) { + printf("- "); + } + } + + printf("\n"); + } +} diff --git a/VisualC++/ExerciseBook/07.27/ALGraph.h b/VisualC++/ExerciseBook/07.27/ALGraph.h new file mode 100644 index 0000000..f3bbcad --- /dev/null +++ b/VisualC++/ExerciseBook/07.27/ALGraph.h @@ -0,0 +1,175 @@ +/*================== + * ͼµÄÁÚ½Ó±í´æ´¢±íʾ + ===================*/ + +#ifndef ALGRAPH_H +#define ALGRAPH_H + +#include +#include // Ìṩmemset¡¢strcmp Ô­ÐÍ +#include // Ìṩºêva_list¡¢va_start¡¢va_arg¡¢va_end +#include // Ìṩmalloc¡¢realloc¡¢free¡¢exitÔ­ÐÍ +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// + +/* + * ×¢£º + * + * ͨ³£À´½²£¬ÎÞȨͼ±»¼ò³ÆÎª¡¾Í¼¡¿£¬ÓÐȨͼ±»¼ò³ÆÎª¡¾Íø¡¿¡£ + * ÎÞÏòͼ/ÍøÖеĶ¥µã¹ØÏµ±»³ÆÎª¡¾±ß¡¿£¬ÓÐÏòͼ/ÍøÖеĶ¥µã¹ØÏµ±»³ÆÎª¡¾»¡¡¿£¬²¢Çø·Ö»¡Í·Ó뻡β¡£ + * ʵ¼Ê±íÊöÖУ¬Î´±Ø»áÑϸñ×ñÊØÒÔÉÏÃüÃû¡£ + * + * µ±Ç°½á¹¹Êʺϴ洢±ß/»¡±È½ÏÏ¡ÊèµÄͼ/Íø¡£ + * + * ¡ï ²åÈë±ß/»¡µÄÐÅϢʱ£¬ÕâÀïµÄʵÏÖÊǰ´"ÉýÐò"²åÈëµÄ£¬ÕâʹµÃ²åÈëµÄ»¡Êǰ´"ÉýÐò"ÅÅÁеġ£ + */ + + +/* ºê¶¨Òå */ +#define MAX_VERTEX_NUM 26 // ×î´ó¶¥µã¸öÊý + + +// ͼµÄÀàÐÍ +typedef enum { + DG, // 0-ÓÐÏòͼ + DN, // 1-ÓÐÏòÍø(´øÈ¨Öµ) + UDG, // 2-ÎÞÏòͼ + UDN // 3-ÎÞÏòÍø(´øÈ¨Öµ) +} GraphKind; + +// ¶¥µãÀàÐÍ +typedef char VertexType; + +// ±ß/»¡µÄÏà¹Ø¸½¼ÓÐÅÏ¢ +typedef struct { + /* + * ×¢£º + * ½Ì²ÄÖиø³öµÄ½á¹¹Ö»¿¼ÂÇÁËÎÞȨͼ£¬¶øÃ»¿¼ÂÇÓÐȨͼ(Íø)¡£ + * ÕâÀïΪÁ˰ѡ°Íø¡±µÄÇéÐÎÒ²¿¼ÂǽøÈ¥£¬ÌØÔÚ¸½¼ÓÐÅÏ¢ÖÐÔö¼ÓÁË"È¨ÖØ"ÊôÐÔ¡£ + */ + int weight; +} InfoType; + +/* ±ß/»¡½áµã */ +typedef struct ArcNode { + int adjvex; // ¸Ã»¡ËùÖ¸ÏòµÄ¶¥µãµÄλÖà + struct ArcNode* nextarc; // Ö¸ÏòÏÂÒ»Ìõ»¡µÄÖ¸Õë + InfoType* info; // »¡µÄ¸½¼ÓÐÅÏ¢£¬Í¨³£ºöÂÔ +} ArcNode; + +// ÿ¸öÁ´±íµÄÍ·½áµã +typedef struct VNode { + VertexType data; // ¶¥µãÐÅÏ¢ + ArcNode* firstarc; // Ö¸ÏòµÚÒ»ÌõÒÀ¸½¸Ã¶¥µãµÄ»¡µÄÖ¸Õë +} VNode; + +/* ͼµÄÁÚ½Ó±í´æ´¢±íʾÀàÐͶ¨Òå */ +typedef struct { + VNode vertices[MAX_VERTEX_NUM]; // ÁÚ½Ó±í + int vexnum, arcnum; // ͼ/ÍøµÄ¶¥µãÊýºÍ»¡Êý + GraphKind kind; // ͼµÄÀàÐͱêÖ¾ +} ALGraph; + + +// ±ß/»¡ÉÏÊÇ·ñ´æÔÚ¸½¼ÓÐÅÏ¢ +extern Boolean IncInfo; + + +/* + * ´´½¨ + * + *¡¾±¸×¢¡¿ + * + * ½Ì²ÄÖÐĬÈÏ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý¡£ + * ÕâÀïΪÁË·½±ã²âÊÔ£¬±ÜÃâÿ´ÎÔËÐж¼ÊÖ¶¯ÊäÈëÊý¾Ý£¬ + * Òò¶øÔÊÐíÑ¡Ôñ´ÓÔ¤ÉèµÄÎļþpathÖжÁÈ¡²âÊÔÊý¾Ý¡£ + * + * Èç¹ûÐèÒª´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý£¬ÔòpathΪNULL£¬»òpath[kind]Ϊ""¡£ + * Èç¹ûÐèÒª´ÓÎļþÖжÁÈ¡Êý¾Ý£¬ÔòÐèÒªÔÚpathÖÐÌîдÎļþÃûÐÅÏ¢¡£ + */ +Status CreateGraph(ALGraph* G, char* path[]); + +/* + * ¹¹ÔìÎÞÏòͼ + */ +static Status CreateUDG(ALGraph* G); + +/* + * ¼Èë±ß/»¡µÄÏà¹Ø¸½¼ÓÐÅÏ¢ + */ +static void Input(ALGraph G, InfoType** info); + +/* + * ²éÕÒ + * + * ·µ»Ø¶¥µãuÔÚͼ/ÍøÖеÄλÖà + */ +int LocateVex(ALGraph G, VertexType u); + +/* + * ȡֵ + * + * ·µ»ØË÷Òýv´¦µÄ¶¥µãÖµ + */ +VertexType GetVex(ALGraph G, int v); + +/* + * ¸³Öµ + * + * ½«¶¥µãv¸³ÖµÎªvalue + */ +Status PutVex(ALGraph* G, VertexType v, VertexType value); + +/* + * Ê׸öÁÚ½Óµã + * + * ·µ»Ø¶¥µãvµÄÊ׸öÁÚ½Óµã + */ +int FirstAdjVex(ALGraph G, VertexType v); + +/* + * ÏÂÒ»¸öÁÚ½Óµã + * + * ·µ»Ø¶¥µãvµÄ(Ïà¶ÔÓÚwµÄ)ÏÂÒ»¸öÁÚ½Óµã + */ +int NextAdjVex(ALGraph G, VertexType v, VertexType w); + +/* + * ²åÈë¶¥µã + * + * ½«Ö¸¶¨µÄ¶¥µãv×·¼Óµ½¶¥µã¼¯ÖУ¬Î´½¨Á¢¸Ã¶¥µãÓëÆäËû¶¥µãµÄ¹ØÏµ + */ +Status InsertVex(ALGraph* G, VertexType v); + +/* + * ɾ³ý¶¥µã + * + * ´Ó¶¥µã¼¯ÖÐɾ³ýÖ¸¶¨µÄ¶¥µãv£¬×¢ÒâÐèÒª¸üÐÂÏà¹ØµÄ¶¥µã¹ØÏµ + */ +Status DeleteVex(ALGraph* G, VertexType v); + +/* + * ¹¹ÔìÒ»¸ö±ß/»¡½áµã(½öÏÞÄÚ²¿Ê¹ÓÃ) + */ +static ArcNode* newArcNodePtr(int adjvex, ArcNode* nextarc, InfoType* info); + +/* + * ²åÈë±ß/»¡ + * + * Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬Ôò²åÈëÒ»Ìõ»¡ÐèÒªÔö¼ÓÁ½¸ö¶¥µã¹ØÏµ£¬µ«»¡µÄÊýÁ¿Ö»ÔöÒ»¡£ + * ¶ÔÓÚͼ/ÍøÀ´Ëµ£¬¿ÉÒÔÔڿɱä²ÎÊýÖÐÁгö±ß/»¡µÄ¸½¼ÓÐÅÏ¢¡£ + * + * ×¢£º´Ë´¦½ÓÊյIJÎÊýÓëMGraphÓÐЩ²»Ò»Ñù£ºÍøµÄ¸½¼ÓÐÅÏ¢Öаüº¬Á˸÷Ìõ±ß/»¡µÄȨֵ¡£ + */ +Status InsertArc(ALGraph* G, VertexType v, VertexType w, ...); + +/* + * ɾ³ý±ß/»¡ + */ +Status DeleteArc(ALGraph* G, VertexType v, VertexType w); + +/* + * ÒÔͼÐλ¯ÐÎʽÊä³öµ±Ç°½á¹¹ + */ +void PrintGraph(ALGraph G); + +#endif diff --git a/VisualC++/ExerciseBook/07.27/TestData_UDG.txt b/VisualC++/ExerciseBook/07.27/TestData_UDG.txt new file mode 100644 index 0000000..589753c --- /dev/null +++ b/VisualC++/ExerciseBook/07.27/TestData_UDG.txt @@ -0,0 +1,6 @@ +ͼÀàÐÍ¡ú2£¨ÎÞÏòͼ£© +¶¥µãÊý¡ú9 +±ßÊý¡ú13 +±ßÊÇ·ñ´øÓÐÆäËûÐÅÏ¢¡ú0 +¶¥µã¼¯¡ú¡¾A£¬B£¬C£¬D£¬E£¬F£¬G£¬H£¬I¡¿ +±ßµÄ¼¯ºÏ¡ú¡¾A£¬B¡¿¡¾B£¬E¡¿¡¾E£¬D¡¿¡¾D£¬F¡¿¡¾F£¬A¡¿¡¾B£¬D¡¿¡¾A£¬C¡¿¡¾C£¬E¡¿¡¾A£¬H¡¿¡¾H£¬G¡¿¡¾G£¬C¡¿¡¾C£¬I¡¿¡¾H£¬I¡¿ \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.28/07.28.c b/VisualC++/ExerciseBook/07.28/07.28.c new file mode 100644 index 0000000..d3df298 --- /dev/null +++ b/VisualC++/ExerciseBook/07.28/07.28.c @@ -0,0 +1,110 @@ +#include +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// +#include "MGraph.h" //**¡ø07 ͼ**// + +// ·ÃÎʱêÖ¾Êý×飬¼Ç¼·ÃÎʹýµÄ¶¥µã +static Boolean visited[MAX_VERTEX_NUM]; + + +/* + * Êä³öÂú×ãÌõ¼þµÄ¼òµ¥Â·¾¶ + */ +void Algo_7_28(MGraph G, VertexType start, VertexType end); + +/* + * ²éÕÒstartµ½endÖ®¼äµÄËùÓеļòµ¥Â·¾¶ + */ +void SimplePath_7_28(MGraph G, int start, int end, int path[MAX_VERTEX_NUM]); + + +int main(int argc, char* argv[]) { + MGraph G; + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ´´½¨²¢Êä³öͼ...\n"); + { + char* path[4]; + + path[0] = "TestData_DG.txt"; + path[1] = ""; + path[2] = ""; + path[3] = ""; + + CreateGraph(&G, path); + PrintGraph(G); + printf("\n"); + } + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ²éÕÒ¼òµ¥Â·¾¶...\n"); + { + VertexType start = 'u'; + VertexType end = 'v'; + + Algo_7_28(G, start, end); + printf("\n"); + } + + return 0; +} + + +/* + * Êä³östartµ½endÖ®¼äµÄËùÓеļòµ¥Â·¾¶ + */ +void Algo_7_28(MGraph G, VertexType start, VertexType end) { + int i, m, n; + int path[MAX_VERTEX_NUM + 1]; // 0ºÅµ¥ÔªÓÃÀ´¼Ç¼pathÖд洢µÄ¶¥µãÊýÁ¿ + + m = LocateVex(G, start); + n = LocateVex(G, end); + + if(m == -1 || n == -1 || m == n) { + printf("²ÎÊý´íÎó£¡\n"); + return; + } + + // °ÑËùÓж¥µã±ê¼ÇΪδ·ÃÎÊ + for(i = 0; i < G.vexnum; i++) { + visited[i] = FALSE; + } + + path[0] = 0; + + printf("²éÕÒ %c µ½ %c Ö®¼ä´æÔÚµÄËùÓмòµ¥Â·¾¶...\n", start, end); + SimplePath_7_28(G, m, n, path); +} + +/* + * ²éÕÒstartµ½endÖ®¼äµÄËùÓеļòµ¥Â·¾¶ + */ +void SimplePath_7_28(MGraph G, int start, int end, int path[MAX_VERTEX_NUM]) { + int i, w; + + path[0]++; + path[path[0]] = start; + visited[start] = TRUE; // ±ê¼Ç¸Ã¶¥µãÒÑ·ÃÎÊ + + // Èç¹ûÓöµ½Âú×ãÌâÒâµÄ·¾¶£¬ÔòÊä³öËü + if(start == end) { + // Êä³öÕÒµ½µÄ¼òµ¥Â·¾¶ + for(i = 1; i <= path[0]; i++) { + printf("%c ", GetVex(G, path[i])); + } + printf("\n"); + } else { + // Éî¶ÈÓÅÏȱéÀú + for(w = FirstAdjVex(G, G.vexs[start]); + w >= 0; + w = NextAdjVex(G, G.vexs[start], G.vexs[w])) { + // ºöÂÔÒÑ·ÃÎʹýµÄ¶¥µã + if(visited[w] == TRUE) { + continue; + } + + SimplePath_7_28(G, w, end, path); + } + } + + // ´Ó·¾¶ÖÐÒÆ³ý¸Ã¶¥µã£¬²¢½«Æä״̬½µ¼¶Îª"ÒÑ·ÃÎÊ" + path[0]--; + visited[start] = FALSE; // Çå³ý·ÃÎʱê¼Ç +} diff --git a/VisualC++/ExerciseBook/07.28/07.28.png b/VisualC++/ExerciseBook/07.28/07.28.png new file mode 100644 index 0000000000000000000000000000000000000000..d814ec27df79db865275062fa483cfa48ee7242e GIT binary patch literal 10441 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 + + + + Debug + Win32 + + + Release + Win32 + + + + {924160F4-B4AF-44AF-B599-09F1713B1270} + My0728 + + + + Application + true + MultiByte + + + Application + false + true + MultiByte + + + + + + + + + + + + + $(SolutionDir)\..\Status;$(IncludePath) + + + + Level3 + Disabled + + + true + $(SolutionDir)\..\Status\Status.lib;%(AdditionalDependencies) + Console + + + + + Level3 + MaxSpeed + true + true + + + true + true + true + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.28/07.28.vcxproj.filters b/VisualC++/ExerciseBook/07.28/07.28.vcxproj.filters new file mode 100644 index 0000000..95dd3c5 --- /dev/null +++ b/VisualC++/ExerciseBook/07.28/07.28.vcxproj.filters @@ -0,0 +1,35 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + æºæ–‡ä»¶ + + + æºæ–‡ä»¶ + + + + + 头文件 + + + + + èµ„æºæ–‡ä»¶ + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.28/07.28.vcxproj.user b/VisualC++/ExerciseBook/07.28/07.28.vcxproj.user new file mode 100644 index 0000000..ace9a86 --- /dev/null +++ b/VisualC++/ExerciseBook/07.28/07.28.vcxproj.user @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.28/MGraph.c b/VisualC++/ExerciseBook/07.28/MGraph.c new file mode 100644 index 0000000..e11656a --- /dev/null +++ b/VisualC++/ExerciseBook/07.28/MGraph.c @@ -0,0 +1,299 @@ +/*================================= + * ͼµÄÊý×é(ÁÚ½Ó¾ØÕó)´æ´¢±íʾ + * + * °üº¬Ëã·¨: 7.1¡¢7.2¡¢7.4¡¢7.5¡¢7.6 + ==================================*/ + +#include "MGraph.h" //**¡ø07 ͼ**// + +// ¼ÈëÊý¾ÝµÄÔ´Îļþ£»fpΪnullʱ£¬ËµÃ÷ÐèÒª´Ó¿ØÖÆÌ¨Â¼Èë +static FILE* fp = NULL; + +/* + * IncInfoָʾ¸Ãͼ/ÍøµÄ±ß/»¡ÉÏÊÇ·ñ´æÔÚ¸½¼ÓÐÅÏ¢¡£ + * Èç¹ûÆäÖµ²»Îª0£¬Ôò±íʾÎÞ¸½¼ÓÐÅÏ¢£¬·ñÔò£¬±íʾ´æÔÚ¸½¼ÓÐÅÏ¢¡£ + */ +Boolean IncInfo = FALSE; + + +/* + * ¨€¨€¨€¨€¨€¨€¨€¨€ Ëã·¨7.1 ¨€¨€¨€¨€¨€¨€¨€¨€ + * + * ´´½¨Í¼/±í + * + *¡¾±¸×¢¡¿ + * + * ½Ì²ÄÖÐĬÈÏ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý¡£ + * ÕâÀïΪÁË·½±ã²âÊÔ£¬±ÜÃâÿ´ÎÔËÐж¼ÊÖ¶¯ÊäÈëÊý¾Ý£¬ + * Òò¶øÔÊÐíÑ¡Ôñ´ÓÔ¤ÉèµÄÎļþpathÖжÁÈ¡²âÊÔÊý¾Ý¡£ + * + * Èç¹ûÐèÒª´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý£¬ÔòpathΪNULL£¬»òpath[kind]Ϊ""¡£ + * Èç¹ûÐèÒª´ÓÎļþÖжÁÈ¡Êý¾Ý£¬ÔòÐèÒªÔÚpathÖÐÌîдÎļþÃûÐÅÏ¢¡£ + */ +Status CreateGraph(MGraph* G, char* path[]) { + int readFromConsole; // ÊÇ·ñ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý + int kind; + Status flag; + + // ¡ï¡ï¡ï´Ë´¦¹Ì¶¨ÎªÓÐÏòͼ + kind = 0; + + // Èç¹ûûÓÐÎļþ·¾¶ÐÅÏ¢£¬Ôò´Ó¿ØÖÆÌ¨¶ÁÈ¡ÊäÈë + readFromConsole = (path == NULL) || strcmp(path[kind], "") == 0; + + // ÐèÒª´ÓÎļþ¶ÁÈ¡ + if(readFromConsole) { + (*G).kind = kind; // ¼Ç¼ͼ/ÍøµÄÀàÐÍ + } else { + // ´ò¿ªÎļþ£¬×¼±¸¶ÁÈ¡²âÊÔÊý¾Ý + fp = fopen(path[kind], "r"); + if(fp == NULL) { + return ERROR; + } + + // ¼ÈëͼµÄÀàÐÍ + ReadData(fp, "%d", &((*G).kind)); + } + + // Ëæ»ú´´½¨ÓÐÏòͼ/Íø»òÎÞÏòͼ/ÍøµÄÒ»ÖÖ + switch((*G).kind) { + case DG: + flag = CreateDG(G); + break; + default: + flag = ERROR; + break; + } + + if(fp != NULL) { + fclose(fp); + fp = NULL; + } + + return flag; +} + +/* + * ¹¹ÔìÓÐÏòͼ + */ +static Status CreateDG(MGraph* G) { + int i, j, k; + ArcCell arcs = {0, NULL}; // ÓÐÏòͼÿÌõ±ßµÄ³õʼֵ + VertexType v1, v2; + + if(fp == NULL) { + printf("ÇëÊäÈëÓÐÏòͼµÄ¶¥µãÊý£º"); + scanf("%d", &((*G).vexnum)); + printf("ÇëÊäÈëÓÐÏòͼµÄ»¡Êý£º"); + scanf("%d", &((*G).arcnum)); + printf("¸ÃÓÐÏòͼµÄ»¡ÉÏÊÇ·ñ°üº¬ÆäËû¸½¼ÓÐÅÏ¢(0-²»°üº¬©¦1-°üº¬)£º"); + scanf("%d", &IncInfo); + + // ¼Èë¶¥µã¼¯ + printf("Çë¼Èë %d ¸ö¶¥µã£¬²»Í¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º", (*G).vexnum); + for(i = 0; i < (*G).vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(stdin); + scanf("%c", &((*G).vexs[i])); + } + } else { + ReadData(fp, "%d", &((*G).vexnum)); // ¼Èë¶¥µãÊý + ReadData(fp, "%d", &((*G).arcnum)); // ¼È뻡Êý + ReadData(fp, "%d", &IncInfo); // Åжϻ¡ÉÏÊÇ·ñ°üº¬¸½¼ÓÐÅÏ¢ + + // ¼Èë¶¥µã¼¯ + for(i = 0; i < (*G).vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(fp); + ReadData(fp, "%c", &((*G).vexs[i])); + } + } + + // ³õʼ»¯ÓÐÏòͼµÄÁÚ½Ó¾ØÕó + for(i = 0; i < (*G).vexnum; i++) { + for(j = 0; j < (*G).vexnum; j++) { + (*G).arcs[i][j] = arcs; + } + } + + // ½öÔÚ¿ØÖÆÌ¨Â¼ÈëÐÅϢʱÊä³ö´ËÌáʾ + if(fp == NULL && (*G).arcnum != 0) { + printf("ÇëΪÓÐÏòͼÒÀ´Î¼Èë %d Ìõ»¡µÄÐÅÏ¢£¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º\n", (*G).arcnum); + } + + // ¼È뻡µÄÐÅÏ¢ + for(k = 0; k < (*G).arcnum; k++) { + if(fp == NULL) { + printf("µÚ %2d Ìõ»¡£º", k + 1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v2); + } else { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + skipBlank(fp); + ReadData(fp, "%c%c", &v1, &v2); + } + + i = LocateVex(*G, v1); // »ñÈ¡¶¥µãv1ÔÚ¶¥µã¼¯ÖеÄλÖà + j = LocateVex(*G, v2); // »ñÈ¡¶¥µãv2ÔÚ¶¥µã¼¯ÖеÄλÖà + + // ½«Ö¸¶¨µÄ¶¥µã¹ØÏµÉèÖÃΪ1£¬Ö¸Ê¾ÕâÁ½¸ö¶¥µãÊÇÖ±½ÓÁ¬½ÓµÄ(×¢£ºÕâÀïûÓÐÑé֤ϱêÊÇ·ñÔ½½ç) + (*G).arcs[i][j].adj = 1; + + // Èç¹ûÐèҪ¼È뻡µÄÆäËû¸½¼ÓÐÅÏ¢ + if(IncInfo) { + // ×îºó¼È븽¼ÓÐÅÏ¢ + Input(*G, &((*G).arcs[i][j].info)); + } + } + + // ´ÓÎļþÖжÁÈ¡Êý¾Ýʱ£¬×îºóÆäʵӦµ±ÅжÏÒ»ÏÂÊÇ·ñ¶Áµ½ÁË×ã¹»µÄÐÅÏ¢ + return OK; +} + +/* + * ¼Èë±ß/»¡µÄÏà¹Ø¸½¼ÓÐÅÏ¢ + */ +static void Input(MGraph G, InfoType** info) { + //¼Èë±ß/»¡µÄÐÅÏ¢£¬±¾²âÊÔÉæ¼°µ½µÄ±ß/»¡Ä¬ÈÏÎÞÆäËû¸½¼ÓÐÅÏ¢ +} + +/* + * ²éÕÒ + * + * ·µ»Ø¶¥µãuÔÚͼ/ÍøÖеÄλÖà + */ +int LocateVex(MGraph G, VertexType u) { + int i; + + for(i = 0; i < G.vexnum; i++) { + if(G.vexs[i] == u) { + return i; + } + } + + return -1; +} + +/* + * ȡֵ + * + * ·µ»ØË÷Òýv´¦µÄ¶¥µãÖµ + */ +VertexType GetVex(MGraph G, int v) { + if(v < 0 || v >= G.vexnum) { + return '\0'; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + return G.vexs[v]; +} + +/* + * Ê׸öÁÚ½Óµã + * + * ·µ»Ø¶¥µãvµÄÊ׸öÁÚ½Óµã + */ +int FirstAdjVex(MGraph G, VertexType v) { + int kv, j; + VRType adj; + + kv = LocateVex(G, v); + if(kv == -1) { + return -1; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + // È·¶¨Ò»¸ö·ÇÁ¬Í¨±ê¼Ç + if(G.kind == DG || G.kind == UDG) { + adj = 0; // ͼ + } else if(G.kind == DN || G.kind == UDN) { + adj = INFINITE; // Íø + } else { + return -1; + } + + // ´ÓÍ·¿ªÊ¼²éÕÒ + for(j = 0; j < G.vexnum; j++) { + // ÕÒµ½ÓëvÖ±½ÓÁ¬½ÓµÄ¶¥µã + if(G.arcs[kv][j].adj != adj) { + return j; + } + } + + return -1; +} + +/* + * ÏÂÒ»¸öÁÚ½Óµã + * + * ·µ»Ø¶¥µãvµÄ(Ïà¶ÔÓÚwµÄ)ÏÂÒ»¸öÁÚ½Óµã + */ +int NextAdjVex(MGraph G, VertexType v, VertexType w) { + int kv, kw, j; + VRType adj; + + kv = LocateVex(G, v); + if(kv == -1) { + return -1; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + kw = LocateVex(G, w); + if(kw == -1) { + return -1; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + // È·¶¨Ò»¸ö·ÇÁ¬Í¨±ê¼Ç + if(G.kind == DG || G.kind == UDG) { + adj = 0; // ͼ + } else if(G.kind == DN || G.kind == UDN) { + adj = INFINITE; // Íø + } else { + return -1; + } + + // ´Ó¶¥µãwºó¿ªÊ¼²éÕÒ + for(j = kw + 1; j < G.vexnum; j++) { + // ÕÒµ½ÓëvÖ±½ÓÁ¬½ÓµÄ¶¥µã + if(G.arcs[kv][j].adj != adj) { + return j; + } + } + + return -1; +} + +/* + * ÒÔͼÐλ¯ÐÎʽÊä³öµ±Ç°½á¹¹ + * + * ×¢£ºÔÚÍøÖУ¬Ê¹ÓÃ"-"À´±íʾÁ½¶¥µã²»Ö±½ÓÁ¬Í¨ + */ +void PrintGraph(MGraph G) { + int i, j; + + if(G.vexnum == 0) { + printf("¿Õͼ£¬ÎÞÐè´òÓ¡£¡\n"); + return; + } + + printf("µ±Ç°Í¼/Íø°üº¬ %2d ¸ö¶¥µã£¬ %2d Ìõ±ß/»¡...\n", G.vexnum, G.arcnum); + + printf(" "); + for(i = 0; i < G.vexnum; i++) { + printf(" %c", G.vexs[i]); + } + printf("\n"); + + for(i = 0; i < G.vexnum; i++) { + printf("%c ", G.vexs[i]); + + for(j = 0; j < G.vexnum; j++) { + if(((G.kind == DG || G.kind == UDG) && G.arcs[i][j].adj == 0) || ((G.kind == DN || G.kind == UDN) && G.arcs[i][j].adj == INFINITE)) { + printf(" -"); + } else { + printf("%3d", G.arcs[i][j].adj); + } + } + + printf("\n"); + } +} diff --git a/VisualC++/ExerciseBook/07.28/MGraph.h b/VisualC++/ExerciseBook/07.28/MGraph.h new file mode 100644 index 0000000..3308db0 --- /dev/null +++ b/VisualC++/ExerciseBook/07.28/MGraph.h @@ -0,0 +1,134 @@ +/*================================= + * ͼµÄÊý×é(ÁÚ½Ó¾ØÕó)´æ´¢±íʾ + * + * °üº¬Ëã·¨: 7.1¡¢7.2¡¢7.4¡¢7.5¡¢7.6 + ==================================*/ + +#ifndef MGRAPH_H +#define MGRAPH_H + +#include +#include // ÌṩºêINT_MAX +#include // Ìṩmemset¡¢strcmp Ô­ÐÍ +#include // Ìṩºêva_list¡¢va_start¡¢va_arg¡¢va_end +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// + +/* + * ×¢£º + * + * ͨ³£À´½²£¬ÎÞȨͼ±»¼ò³ÆÎª¡¾Í¼¡¿£¬ÓÐȨͼ±»¼ò³ÆÎª¡¾Íø¡¿¡£ + * ÎÞÏòͼ/ÍøÖеĶ¥µã¹ØÏµ±»³ÆÎª¡¾±ß¡¿£¬ÓÐÏòͼ/ÍøÖеĶ¥µã¹ØÏµ±»³ÆÎª¡¾»¡¡¿£¬²¢Çø·Ö»¡Í·Ó뻡β¡£ + * ʵ¼Ê±íÊöÖУ¬Î´±Ø»áÑϸñ×ñÊØÒÔÉÏÃüÃû¡£ + */ + +/* ºê¶¨Òå */ +#define INFINITE INT_MAX // ×î´óÖµ£¬ÓÃÀ´±íÊ¾ÍøÖеÄÁ½¸ö¶¥µã²»Ö±½ÓÁ¬½Ó +#define MAX_VERTEX_NUM 26 // ×î´ó¶¥µã¸öÊý + + +// ͼµÄÀàÐÍ +typedef enum { + DG, // 0-ÓÐÏòͼ + DN, // 1-ÓÐÏòÍø(´øÈ¨Öµ) + UDG, // 2-ÎÞÏòͼ + UDN // 3-ÎÞÏòÍø(´øÈ¨Öµ) +} GraphKind; + +// ¶¥µãÀàÐÍ +typedef char VertexType; + +/* + * ¶¥µã¹ØÏµÀàÐÍ + * + * ÔÚÎÞȨͼÖУ¬¸Ãֵͨ³£Îª0»ò1£¬±íʾÁ½¶¥µãÊÇ·ñÖ±½ÓÁ¬Í¨£» + * ÔÚÓÐȨͼÖУ¬¸Ãֵͨ³£ÎªÈ¨Öµ¡£ + */ +typedef int VRType; + +// ±ßµÄÏà¹Ø¸½¼ÓÐÅÏ¢ +typedef struct { + // Èç¹ûÓеϰ£¬ºóÐø»áÌí¼ÓÏàÓ¦µÄÊôÐÔ + void* v; // Ìí¼ÓÒ»¸öÎÞÒâÒåµÄ±äÁ¿À´Õ¼Î»£¬Èç¹û½á¹¹ÌåΪ¿ÕµÄ»°£¬ÔÚVC++Öлᱨ´í +} InfoType; + +// ±ßµÄÀàÐÍ£¬Ã¿Ìõ±ßÉÏ¿ÉÄÜÓи½¼ÓÐÅÏ¢info +typedef struct ArcCell { + VRType adj; // ¶¥µã¹ØÏµ£¬ÔÚÓÐȨͼ¸úÎÞȨͼÖеĺ¬Ò岻ͬ + InfoType* info; // ±ßµÄ¸½¼ÓÐÅÏ¢£¬Í¨³£ºöÂÔ +} ArcCell; + +/* ͼ/ÍøµÄÊý×é(ÁÚ½Ó¾ØÕó)´æ´¢±íʾÀàÐͶ¨Òå */ +typedef struct { + VertexType vexs[MAX_VERTEX_NUM]; // ¶¥µãÏòÁ¿ + ArcCell arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; // ÁÚ½Ó¾ØÕó + int vexnum, arcnum; // ͼ/ÍøµÄ¶¥µãÊýºÍ»¡Êý + GraphKind kind; // ͼµÄÀàÐͱêÖ¾ +} MGraph; + + +// ±ß/»¡ÉÏÊÇ·ñ´æÔÚ¸½¼ÓÐÅÏ¢ +extern Boolean IncInfo; + + +/* + * ¨€¨€¨€¨€¨€¨€¨€¨€ Ëã·¨7.1 ¨€¨€¨€¨€¨€¨€¨€¨€ + * + * ´´½¨ + * + *¡¾±¸×¢¡¿ + * + * ½Ì²ÄÖÐĬÈÏ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý¡£ + * ÕâÀïΪÁË·½±ã²âÊÔ£¬±ÜÃâÿ´ÎÔËÐж¼ÊÖ¶¯ÊäÈëÊý¾Ý£¬ + * Òò¶øÔÊÐíÑ¡Ôñ´ÓÔ¤ÉèµÄÎļþpathÖжÁÈ¡²âÊÔÊý¾Ý¡£ + * + * Èç¹ûÐèÒª´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý£¬ÔòpathΪNULL£¬»òpath[kind]Ϊ""¡£ + * Èç¹ûÐèÒª´ÓÎļþÖжÁÈ¡Êý¾Ý£¬ÔòÐèÒªÔÚpathÖÐÌîдÎļþÃûÐÅÏ¢¡£ + */ +Status CreateGraph(MGraph* G, char* path[]); + +/* + * ¹¹ÔìÎÞÏòͼ + */ +static Status CreateDG(MGraph* G); + +/* + * ¼Èë±ßµÄÏà¹Ø¸½¼ÓÐÅÏ¢ + */ +static void Input(MGraph G, InfoType** info); + +/* + * ²éÕÒ + * + * ·µ»Ø¶¥µãuÔÚͼ/ÍøÖеÄλÖà + */ +int LocateVex(MGraph G, VertexType u); + +/* + * ȡֵ + * + * ·µ»ØË÷Òýv´¦µÄ¶¥µãÖµ + */ +VertexType GetVex(MGraph G, int v); + +/* + * Ê׸öÁÚ½Óµã + * + * ·µ»Ø¶¥µãvµÄÊ׸öÁÚ½Óµã + */ +int FirstAdjVex(MGraph G, VertexType v); + +/* + * ÏÂÒ»¸öÁÚ½Óµã + * + * ·µ»Ø¶¥µãvµÄ(Ïà¶ÔÓÚwµÄ)ÏÂÒ»¸öÁÚ½Óµã + */ +int NextAdjVex(MGraph G, VertexType v, VertexType w); + +/* + * ÒÔͼÐλ¯ÐÎʽÊä³öµ±Ç°½á¹¹ + * + * ×¢£ºÔÚÍøÖУ¬Ê¹ÓÃ"-"À´±íʾÁ½¶¥µã²»Ö±½ÓÁ¬Í¨ + */ +void PrintGraph(MGraph G); + +#endif diff --git a/VisualC++/ExerciseBook/07.28/TestData_DG.txt b/VisualC++/ExerciseBook/07.28/TestData_DG.txt new file mode 100644 index 0000000..a19ece0 --- /dev/null +++ b/VisualC++/ExerciseBook/07.28/TestData_DG.txt @@ -0,0 +1,6 @@ +ͼÀàÐÍ¡ú0£¨ÓÐÏòͼ£© +¶¥µãÊý¡ú8 +»¡Êý¡ú11 +»¡ÊÇ·ñ´øÓÐÆäËûÐÅÏ¢¡ú0 +¶¥µã¼¯¡ú¡¾a£¬b£¬c£¬d£¬e£¬f£¬u£¬v¡¿ +»¡µÄ¼¯ºÏ¡ú¡¾u£¬c¡¿¡¾c£¬d¡¿¡¾d£¬e¡¿¡¾e£¬u¡¿¡¾d£¬v¡¿¡¾e£¬f¡¿¡¾f£¬v¡¿¡¾v£¬b¡¿¡¾b£¬f¡¿¡¾u£¬a¡¿¡¾a£¬b¡¿ \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.29/07.29.c b/VisualC++/ExerciseBook/07.29/07.29.c new file mode 100644 index 0000000..03bdcb4 --- /dev/null +++ b/VisualC++/ExerciseBook/07.29/07.29.c @@ -0,0 +1,110 @@ +#include +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// +#include "MGraph.h" //**¡ø07 ͼ**// + +// ·ÃÎʱêÖ¾Êý×飬¼Ç¼·ÃÎʹýµÄ¶¥µã +static Boolean visited[MAX_VERTEX_NUM]; + + +/* + * Êä³öÓÐÏòͼGÖ㤶ÈΪkµÄ¼òµ¥Â·¾¶ + */ +void Algo_7_29(MGraph G, int k); + +/* + * ²éÕÒÓÐÏòͼGÖ㤶ÈΪkµÄ¼òµ¥Â·¾¶ + */ +void SimplePath_7_29(MGraph G, int start, int k, int path[MAX_VERTEX_NUM]); + + +int main(int argc, char* argv[]) { + MGraph G; + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ´´½¨²¢Êä³öͼ...\n"); + { + char* path[4]; + + path[0] = "TestData_DG.txt"; + path[1] = ""; + path[2] = ""; + path[3] = ""; + + CreateGraph(&G, path); + PrintGraph(G); + printf("\n"); + } + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ²éÕÒ¶¨³¤µÄ¼òµ¥Â·¾¶...\n"); + { + int k = 4; + + Algo_7_29(G, k); + printf("\n"); + } + + return 0; +} + + +/* + * Êä³öÓÐÏòͼGÖ㤶ÈΪkµÄ¼òµ¥Â·¾¶ + */ +void Algo_7_29(MGraph G, int k) { + int i; + int path[MAX_VERTEX_NUM + 1]; // 0ºÅµ¥ÔªÓÃÀ´¼Ç¼pathÖд洢µÄ¶¥µãÊýÁ¿ + + if(k <= 0) { + printf("²ÎÊý´íÎó£¡\n"); + return; + } + + // °ÑËùÓж¥µã±ê¼ÇΪδ·ÃÎÊ + for(i = 0; i < G.vexnum; i++) { + visited[i] = FALSE; + } + + path[0] = 0; + + printf("²éÕÒËùÓ㤶ÈΪ %d µÄ¼òµ¥Â·¾¶...\n", k); + + for(i = 0; i < G.vexnum; i++) { + SimplePath_7_29(G, i, k, path); + } + +} + +/* + * ²éÕÒÓÐÏòͼGÖ㤶ÈΪkµÄ¼òµ¥Â·¾¶ + */ +void SimplePath_7_29(MGraph G, int start, int k, int path[MAX_VERTEX_NUM]) { + int i, w; + + path[0]++; + path[path[0]] = start; + visited[start] = TRUE; // ±ê¼Ç¸Ã¶¥µãÒÑ·ÃÎÊ + + // Èç¹ûÓöµ½³¤¶ÈΪkµÄ·¾¶(¶¥µãÊý = ·¾¶³¤¶È+1)£¬ÔòÊä³öËü + if(path[0] == k + 1) { + // Êä³öÕÒµ½µÄ¼òµ¥Â·¾¶ + for(i = 1; i <= path[0]; i++) { + printf("%c ", GetVex(G, path[i])); + } + printf("\n"); + } else { + // Éî¶ÈÓÅÏȱéÀú + for(w = FirstAdjVex(G, G.vexs[start]); + w >= 0; + w = NextAdjVex(G, G.vexs[start], G.vexs[w])) { + // ºöÂÔÒÑ·ÃÎʹýµÄ¶¥µã + if(visited[w] == TRUE) { + continue; + } + + SimplePath_7_29(G, w, k, path); + } + } + + // ´Ó·¾¶ÖÐÒÆ³ý¸Ã¶¥µã£¬²¢½«Æä״̬½µ¼¶Îª"ÒÑ·ÃÎÊ" + path[0]--; + visited[start] = FALSE; // Çå³ý·ÃÎʱê¼Ç +} diff --git a/VisualC++/ExerciseBook/07.29/07.29.png b/VisualC++/ExerciseBook/07.29/07.29.png new file mode 100644 index 0000000000000000000000000000000000000000..d814ec27df79db865275062fa483cfa48ee7242e GIT binary patch literal 10441 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 + + + + Debug + Win32 + + + Release + Win32 + + + + {1053D204-9B69-40BF-92CC-860752E200D0} + My0729 + + + + Application + true + MultiByte + + + Application + false + true + MultiByte + + + + + + + + + + + + + $(SolutionDir)\..\Status;$(IncludePath) + + + + Level3 + Disabled + + + true + $(SolutionDir)\..\Status\Status.lib;%(AdditionalDependencies) + Console + + + + + Level3 + MaxSpeed + true + true + + + true + true + true + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.29/07.29.vcxproj.filters b/VisualC++/ExerciseBook/07.29/07.29.vcxproj.filters new file mode 100644 index 0000000..abf46a6 --- /dev/null +++ b/VisualC++/ExerciseBook/07.29/07.29.vcxproj.filters @@ -0,0 +1,35 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + æºæ–‡ä»¶ + + + æºæ–‡ä»¶ + + + + + 头文件 + + + + + èµ„æºæ–‡ä»¶ + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.29/07.29.vcxproj.user b/VisualC++/ExerciseBook/07.29/07.29.vcxproj.user new file mode 100644 index 0000000..ace9a86 --- /dev/null +++ b/VisualC++/ExerciseBook/07.29/07.29.vcxproj.user @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.29/MGraph.c b/VisualC++/ExerciseBook/07.29/MGraph.c new file mode 100644 index 0000000..e11656a --- /dev/null +++ b/VisualC++/ExerciseBook/07.29/MGraph.c @@ -0,0 +1,299 @@ +/*================================= + * ͼµÄÊý×é(ÁÚ½Ó¾ØÕó)´æ´¢±íʾ + * + * °üº¬Ëã·¨: 7.1¡¢7.2¡¢7.4¡¢7.5¡¢7.6 + ==================================*/ + +#include "MGraph.h" //**¡ø07 ͼ**// + +// ¼ÈëÊý¾ÝµÄÔ´Îļþ£»fpΪnullʱ£¬ËµÃ÷ÐèÒª´Ó¿ØÖÆÌ¨Â¼Èë +static FILE* fp = NULL; + +/* + * IncInfoָʾ¸Ãͼ/ÍøµÄ±ß/»¡ÉÏÊÇ·ñ´æÔÚ¸½¼ÓÐÅÏ¢¡£ + * Èç¹ûÆäÖµ²»Îª0£¬Ôò±íʾÎÞ¸½¼ÓÐÅÏ¢£¬·ñÔò£¬±íʾ´æÔÚ¸½¼ÓÐÅÏ¢¡£ + */ +Boolean IncInfo = FALSE; + + +/* + * ¨€¨€¨€¨€¨€¨€¨€¨€ Ëã·¨7.1 ¨€¨€¨€¨€¨€¨€¨€¨€ + * + * ´´½¨Í¼/±í + * + *¡¾±¸×¢¡¿ + * + * ½Ì²ÄÖÐĬÈÏ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý¡£ + * ÕâÀïΪÁË·½±ã²âÊÔ£¬±ÜÃâÿ´ÎÔËÐж¼ÊÖ¶¯ÊäÈëÊý¾Ý£¬ + * Òò¶øÔÊÐíÑ¡Ôñ´ÓÔ¤ÉèµÄÎļþpathÖжÁÈ¡²âÊÔÊý¾Ý¡£ + * + * Èç¹ûÐèÒª´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý£¬ÔòpathΪNULL£¬»òpath[kind]Ϊ""¡£ + * Èç¹ûÐèÒª´ÓÎļþÖжÁÈ¡Êý¾Ý£¬ÔòÐèÒªÔÚpathÖÐÌîдÎļþÃûÐÅÏ¢¡£ + */ +Status CreateGraph(MGraph* G, char* path[]) { + int readFromConsole; // ÊÇ·ñ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý + int kind; + Status flag; + + // ¡ï¡ï¡ï´Ë´¦¹Ì¶¨ÎªÓÐÏòͼ + kind = 0; + + // Èç¹ûûÓÐÎļþ·¾¶ÐÅÏ¢£¬Ôò´Ó¿ØÖÆÌ¨¶ÁÈ¡ÊäÈë + readFromConsole = (path == NULL) || strcmp(path[kind], "") == 0; + + // ÐèÒª´ÓÎļþ¶ÁÈ¡ + if(readFromConsole) { + (*G).kind = kind; // ¼Ç¼ͼ/ÍøµÄÀàÐÍ + } else { + // ´ò¿ªÎļþ£¬×¼±¸¶ÁÈ¡²âÊÔÊý¾Ý + fp = fopen(path[kind], "r"); + if(fp == NULL) { + return ERROR; + } + + // ¼ÈëͼµÄÀàÐÍ + ReadData(fp, "%d", &((*G).kind)); + } + + // Ëæ»ú´´½¨ÓÐÏòͼ/Íø»òÎÞÏòͼ/ÍøµÄÒ»ÖÖ + switch((*G).kind) { + case DG: + flag = CreateDG(G); + break; + default: + flag = ERROR; + break; + } + + if(fp != NULL) { + fclose(fp); + fp = NULL; + } + + return flag; +} + +/* + * ¹¹ÔìÓÐÏòͼ + */ +static Status CreateDG(MGraph* G) { + int i, j, k; + ArcCell arcs = {0, NULL}; // ÓÐÏòͼÿÌõ±ßµÄ³õʼֵ + VertexType v1, v2; + + if(fp == NULL) { + printf("ÇëÊäÈëÓÐÏòͼµÄ¶¥µãÊý£º"); + scanf("%d", &((*G).vexnum)); + printf("ÇëÊäÈëÓÐÏòͼµÄ»¡Êý£º"); + scanf("%d", &((*G).arcnum)); + printf("¸ÃÓÐÏòͼµÄ»¡ÉÏÊÇ·ñ°üº¬ÆäËû¸½¼ÓÐÅÏ¢(0-²»°üº¬©¦1-°üº¬)£º"); + scanf("%d", &IncInfo); + + // ¼Èë¶¥µã¼¯ + printf("Çë¼Èë %d ¸ö¶¥µã£¬²»Í¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º", (*G).vexnum); + for(i = 0; i < (*G).vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(stdin); + scanf("%c", &((*G).vexs[i])); + } + } else { + ReadData(fp, "%d", &((*G).vexnum)); // ¼Èë¶¥µãÊý + ReadData(fp, "%d", &((*G).arcnum)); // ¼È뻡Êý + ReadData(fp, "%d", &IncInfo); // Åжϻ¡ÉÏÊÇ·ñ°üº¬¸½¼ÓÐÅÏ¢ + + // ¼Èë¶¥µã¼¯ + for(i = 0; i < (*G).vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(fp); + ReadData(fp, "%c", &((*G).vexs[i])); + } + } + + // ³õʼ»¯ÓÐÏòͼµÄÁÚ½Ó¾ØÕó + for(i = 0; i < (*G).vexnum; i++) { + for(j = 0; j < (*G).vexnum; j++) { + (*G).arcs[i][j] = arcs; + } + } + + // ½öÔÚ¿ØÖÆÌ¨Â¼ÈëÐÅϢʱÊä³ö´ËÌáʾ + if(fp == NULL && (*G).arcnum != 0) { + printf("ÇëΪÓÐÏòͼÒÀ´Î¼Èë %d Ìõ»¡µÄÐÅÏ¢£¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º\n", (*G).arcnum); + } + + // ¼È뻡µÄÐÅÏ¢ + for(k = 0; k < (*G).arcnum; k++) { + if(fp == NULL) { + printf("µÚ %2d Ìõ»¡£º", k + 1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v2); + } else { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + skipBlank(fp); + ReadData(fp, "%c%c", &v1, &v2); + } + + i = LocateVex(*G, v1); // »ñÈ¡¶¥µãv1ÔÚ¶¥µã¼¯ÖеÄλÖà + j = LocateVex(*G, v2); // »ñÈ¡¶¥µãv2ÔÚ¶¥µã¼¯ÖеÄλÖà + + // ½«Ö¸¶¨µÄ¶¥µã¹ØÏµÉèÖÃΪ1£¬Ö¸Ê¾ÕâÁ½¸ö¶¥µãÊÇÖ±½ÓÁ¬½ÓµÄ(×¢£ºÕâÀïûÓÐÑé֤ϱêÊÇ·ñÔ½½ç) + (*G).arcs[i][j].adj = 1; + + // Èç¹ûÐèҪ¼È뻡µÄÆäËû¸½¼ÓÐÅÏ¢ + if(IncInfo) { + // ×îºó¼È븽¼ÓÐÅÏ¢ + Input(*G, &((*G).arcs[i][j].info)); + } + } + + // ´ÓÎļþÖжÁÈ¡Êý¾Ýʱ£¬×îºóÆäʵӦµ±ÅжÏÒ»ÏÂÊÇ·ñ¶Áµ½ÁË×ã¹»µÄÐÅÏ¢ + return OK; +} + +/* + * ¼Èë±ß/»¡µÄÏà¹Ø¸½¼ÓÐÅÏ¢ + */ +static void Input(MGraph G, InfoType** info) { + //¼Èë±ß/»¡µÄÐÅÏ¢£¬±¾²âÊÔÉæ¼°µ½µÄ±ß/»¡Ä¬ÈÏÎÞÆäËû¸½¼ÓÐÅÏ¢ +} + +/* + * ²éÕÒ + * + * ·µ»Ø¶¥µãuÔÚͼ/ÍøÖеÄλÖà + */ +int LocateVex(MGraph G, VertexType u) { + int i; + + for(i = 0; i < G.vexnum; i++) { + if(G.vexs[i] == u) { + return i; + } + } + + return -1; +} + +/* + * ȡֵ + * + * ·µ»ØË÷Òýv´¦µÄ¶¥µãÖµ + */ +VertexType GetVex(MGraph G, int v) { + if(v < 0 || v >= G.vexnum) { + return '\0'; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + return G.vexs[v]; +} + +/* + * Ê׸öÁÚ½Óµã + * + * ·µ»Ø¶¥µãvµÄÊ׸öÁÚ½Óµã + */ +int FirstAdjVex(MGraph G, VertexType v) { + int kv, j; + VRType adj; + + kv = LocateVex(G, v); + if(kv == -1) { + return -1; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + // È·¶¨Ò»¸ö·ÇÁ¬Í¨±ê¼Ç + if(G.kind == DG || G.kind == UDG) { + adj = 0; // ͼ + } else if(G.kind == DN || G.kind == UDN) { + adj = INFINITE; // Íø + } else { + return -1; + } + + // ´ÓÍ·¿ªÊ¼²éÕÒ + for(j = 0; j < G.vexnum; j++) { + // ÕÒµ½ÓëvÖ±½ÓÁ¬½ÓµÄ¶¥µã + if(G.arcs[kv][j].adj != adj) { + return j; + } + } + + return -1; +} + +/* + * ÏÂÒ»¸öÁÚ½Óµã + * + * ·µ»Ø¶¥µãvµÄ(Ïà¶ÔÓÚwµÄ)ÏÂÒ»¸öÁÚ½Óµã + */ +int NextAdjVex(MGraph G, VertexType v, VertexType w) { + int kv, kw, j; + VRType adj; + + kv = LocateVex(G, v); + if(kv == -1) { + return -1; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + kw = LocateVex(G, w); + if(kw == -1) { + return -1; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + // È·¶¨Ò»¸ö·ÇÁ¬Í¨±ê¼Ç + if(G.kind == DG || G.kind == UDG) { + adj = 0; // ͼ + } else if(G.kind == DN || G.kind == UDN) { + adj = INFINITE; // Íø + } else { + return -1; + } + + // ´Ó¶¥µãwºó¿ªÊ¼²éÕÒ + for(j = kw + 1; j < G.vexnum; j++) { + // ÕÒµ½ÓëvÖ±½ÓÁ¬½ÓµÄ¶¥µã + if(G.arcs[kv][j].adj != adj) { + return j; + } + } + + return -1; +} + +/* + * ÒÔͼÐλ¯ÐÎʽÊä³öµ±Ç°½á¹¹ + * + * ×¢£ºÔÚÍøÖУ¬Ê¹ÓÃ"-"À´±íʾÁ½¶¥µã²»Ö±½ÓÁ¬Í¨ + */ +void PrintGraph(MGraph G) { + int i, j; + + if(G.vexnum == 0) { + printf("¿Õͼ£¬ÎÞÐè´òÓ¡£¡\n"); + return; + } + + printf("µ±Ç°Í¼/Íø°üº¬ %2d ¸ö¶¥µã£¬ %2d Ìõ±ß/»¡...\n", G.vexnum, G.arcnum); + + printf(" "); + for(i = 0; i < G.vexnum; i++) { + printf(" %c", G.vexs[i]); + } + printf("\n"); + + for(i = 0; i < G.vexnum; i++) { + printf("%c ", G.vexs[i]); + + for(j = 0; j < G.vexnum; j++) { + if(((G.kind == DG || G.kind == UDG) && G.arcs[i][j].adj == 0) || ((G.kind == DN || G.kind == UDN) && G.arcs[i][j].adj == INFINITE)) { + printf(" -"); + } else { + printf("%3d", G.arcs[i][j].adj); + } + } + + printf("\n"); + } +} diff --git a/VisualC++/ExerciseBook/07.29/MGraph.h b/VisualC++/ExerciseBook/07.29/MGraph.h new file mode 100644 index 0000000..3308db0 --- /dev/null +++ b/VisualC++/ExerciseBook/07.29/MGraph.h @@ -0,0 +1,134 @@ +/*================================= + * ͼµÄÊý×é(ÁÚ½Ó¾ØÕó)´æ´¢±íʾ + * + * °üº¬Ëã·¨: 7.1¡¢7.2¡¢7.4¡¢7.5¡¢7.6 + ==================================*/ + +#ifndef MGRAPH_H +#define MGRAPH_H + +#include +#include // ÌṩºêINT_MAX +#include // Ìṩmemset¡¢strcmp Ô­ÐÍ +#include // Ìṩºêva_list¡¢va_start¡¢va_arg¡¢va_end +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// + +/* + * ×¢£º + * + * ͨ³£À´½²£¬ÎÞȨͼ±»¼ò³ÆÎª¡¾Í¼¡¿£¬ÓÐȨͼ±»¼ò³ÆÎª¡¾Íø¡¿¡£ + * ÎÞÏòͼ/ÍøÖеĶ¥µã¹ØÏµ±»³ÆÎª¡¾±ß¡¿£¬ÓÐÏòͼ/ÍøÖеĶ¥µã¹ØÏµ±»³ÆÎª¡¾»¡¡¿£¬²¢Çø·Ö»¡Í·Ó뻡β¡£ + * ʵ¼Ê±íÊöÖУ¬Î´±Ø»áÑϸñ×ñÊØÒÔÉÏÃüÃû¡£ + */ + +/* ºê¶¨Òå */ +#define INFINITE INT_MAX // ×î´óÖµ£¬ÓÃÀ´±íÊ¾ÍøÖеÄÁ½¸ö¶¥µã²»Ö±½ÓÁ¬½Ó +#define MAX_VERTEX_NUM 26 // ×î´ó¶¥µã¸öÊý + + +// ͼµÄÀàÐÍ +typedef enum { + DG, // 0-ÓÐÏòͼ + DN, // 1-ÓÐÏòÍø(´øÈ¨Öµ) + UDG, // 2-ÎÞÏòͼ + UDN // 3-ÎÞÏòÍø(´øÈ¨Öµ) +} GraphKind; + +// ¶¥µãÀàÐÍ +typedef char VertexType; + +/* + * ¶¥µã¹ØÏµÀàÐÍ + * + * ÔÚÎÞȨͼÖУ¬¸Ãֵͨ³£Îª0»ò1£¬±íʾÁ½¶¥µãÊÇ·ñÖ±½ÓÁ¬Í¨£» + * ÔÚÓÐȨͼÖУ¬¸Ãֵͨ³£ÎªÈ¨Öµ¡£ + */ +typedef int VRType; + +// ±ßµÄÏà¹Ø¸½¼ÓÐÅÏ¢ +typedef struct { + // Èç¹ûÓеϰ£¬ºóÐø»áÌí¼ÓÏàÓ¦µÄÊôÐÔ + void* v; // Ìí¼ÓÒ»¸öÎÞÒâÒåµÄ±äÁ¿À´Õ¼Î»£¬Èç¹û½á¹¹ÌåΪ¿ÕµÄ»°£¬ÔÚVC++Öлᱨ´í +} InfoType; + +// ±ßµÄÀàÐÍ£¬Ã¿Ìõ±ßÉÏ¿ÉÄÜÓи½¼ÓÐÅÏ¢info +typedef struct ArcCell { + VRType adj; // ¶¥µã¹ØÏµ£¬ÔÚÓÐȨͼ¸úÎÞȨͼÖеĺ¬Ò岻ͬ + InfoType* info; // ±ßµÄ¸½¼ÓÐÅÏ¢£¬Í¨³£ºöÂÔ +} ArcCell; + +/* ͼ/ÍøµÄÊý×é(ÁÚ½Ó¾ØÕó)´æ´¢±íʾÀàÐͶ¨Òå */ +typedef struct { + VertexType vexs[MAX_VERTEX_NUM]; // ¶¥µãÏòÁ¿ + ArcCell arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; // ÁÚ½Ó¾ØÕó + int vexnum, arcnum; // ͼ/ÍøµÄ¶¥µãÊýºÍ»¡Êý + GraphKind kind; // ͼµÄÀàÐͱêÖ¾ +} MGraph; + + +// ±ß/»¡ÉÏÊÇ·ñ´æÔÚ¸½¼ÓÐÅÏ¢ +extern Boolean IncInfo; + + +/* + * ¨€¨€¨€¨€¨€¨€¨€¨€ Ëã·¨7.1 ¨€¨€¨€¨€¨€¨€¨€¨€ + * + * ´´½¨ + * + *¡¾±¸×¢¡¿ + * + * ½Ì²ÄÖÐĬÈÏ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý¡£ + * ÕâÀïΪÁË·½±ã²âÊÔ£¬±ÜÃâÿ´ÎÔËÐж¼ÊÖ¶¯ÊäÈëÊý¾Ý£¬ + * Òò¶øÔÊÐíÑ¡Ôñ´ÓÔ¤ÉèµÄÎļþpathÖжÁÈ¡²âÊÔÊý¾Ý¡£ + * + * Èç¹ûÐèÒª´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý£¬ÔòpathΪNULL£¬»òpath[kind]Ϊ""¡£ + * Èç¹ûÐèÒª´ÓÎļþÖжÁÈ¡Êý¾Ý£¬ÔòÐèÒªÔÚpathÖÐÌîдÎļþÃûÐÅÏ¢¡£ + */ +Status CreateGraph(MGraph* G, char* path[]); + +/* + * ¹¹ÔìÎÞÏòͼ + */ +static Status CreateDG(MGraph* G); + +/* + * ¼Èë±ßµÄÏà¹Ø¸½¼ÓÐÅÏ¢ + */ +static void Input(MGraph G, InfoType** info); + +/* + * ²éÕÒ + * + * ·µ»Ø¶¥µãuÔÚͼ/ÍøÖеÄλÖà + */ +int LocateVex(MGraph G, VertexType u); + +/* + * ȡֵ + * + * ·µ»ØË÷Òýv´¦µÄ¶¥µãÖµ + */ +VertexType GetVex(MGraph G, int v); + +/* + * Ê׸öÁÚ½Óµã + * + * ·µ»Ø¶¥µãvµÄÊ׸öÁÚ½Óµã + */ +int FirstAdjVex(MGraph G, VertexType v); + +/* + * ÏÂÒ»¸öÁÚ½Óµã + * + * ·µ»Ø¶¥µãvµÄ(Ïà¶ÔÓÚwµÄ)ÏÂÒ»¸öÁÚ½Óµã + */ +int NextAdjVex(MGraph G, VertexType v, VertexType w); + +/* + * ÒÔͼÐλ¯ÐÎʽÊä³öµ±Ç°½á¹¹ + * + * ×¢£ºÔÚÍøÖУ¬Ê¹ÓÃ"-"À´±íʾÁ½¶¥µã²»Ö±½ÓÁ¬Í¨ + */ +void PrintGraph(MGraph G); + +#endif diff --git a/VisualC++/ExerciseBook/07.29/TestData_DG.txt b/VisualC++/ExerciseBook/07.29/TestData_DG.txt new file mode 100644 index 0000000..a19ece0 --- /dev/null +++ b/VisualC++/ExerciseBook/07.29/TestData_DG.txt @@ -0,0 +1,6 @@ +ͼÀàÐÍ¡ú0£¨ÓÐÏòͼ£© +¶¥µãÊý¡ú8 +»¡Êý¡ú11 +»¡ÊÇ·ñ´øÓÐÆäËûÐÅÏ¢¡ú0 +¶¥µã¼¯¡ú¡¾a£¬b£¬c£¬d£¬e£¬f£¬u£¬v¡¿ +»¡µÄ¼¯ºÏ¡ú¡¾u£¬c¡¿¡¾c£¬d¡¿¡¾d£¬e¡¿¡¾e£¬u¡¿¡¾d£¬v¡¿¡¾e£¬f¡¿¡¾f£¬v¡¿¡¾v£¬b¡¿¡¾b£¬f¡¿¡¾u£¬a¡¿¡¾a£¬b¡¿ \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.30/07.30.c b/VisualC++/ExerciseBook/07.30/07.30.c new file mode 100644 index 0000000..3deb3ff --- /dev/null +++ b/VisualC++/ExerciseBook/07.30/07.30.c @@ -0,0 +1,99 @@ +#include +#include "Status.h" +#include "MGraph.h" + +// ·ÃÎʱêÖ¾Êý×飬¼Ç¼·ÃÎʹýµÄ¶¥µã +static Boolean visited[MAX_VERTEX_NUM]; + + +/* + * ÕÒ³öÓÐÏòͼÖÐËùÓлØÂ· + */ +void Algo_7_30(MGraph G); + +/* + * ´òÓ¡ÓÐÏòͼÖÐËùÓлØÂ· + */ +void Circuit_7_30(MGraph G, int start, int end, int path[MAX_VERTEX_NUM + 1]); + + +int main(int argc, char* argv[]) { + MGraph G; + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ´´½¨²¢Êä³öͼ...\n"); + { + char* path[4]; + + path[0] = "TestData_DG.txt"; + path[1] = ""; + path[2] = ""; + path[3] = ""; + + CreateGraph(&G, path); + PrintGraph(G); + printf("\n"); + } + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ²éÕÒͼÖеĻØÂ·...\n"); + { + Algo_7_30(G); + printf("\n"); + } + + return 0; +} + + +/* + * ÕÒ³öÓÐÏòͼÖÐËùÓлØÂ· + */ +void Algo_7_30(MGraph G) { + int i; + int path[MAX_VERTEX_NUM + 1]; // 0ºÅµ¥ÔªÓÃÀ´¼Ç¼pathÖд洢µÄ¶¥µãÊýÁ¿ + + // °ÑËùÓж¥µã±ê¼ÇΪδ·ÃÎÊ + for(i = 0; i < G.vexnum; i++) { + visited[i] = FALSE; + } + + path[0] = 0; + + for(i = 0; i < G.vexnum; i++) { + Circuit_7_30(G, i, i, path); + } +} + +/* + * ´òÓ¡ÓÐÏòͼÖÐËùÓлØÂ· + */ +void Circuit_7_30(MGraph G, int start, int end, int path[MAX_VERTEX_NUM]) { + int i, w; + + path[0]++; + path[path[0]] = start; + visited[start] = TRUE; // ±ê¼Ç¸Ã¶¥µãÒѽøÈë·¾¶ + + // ±éÀú¶¥µãstartµÄÁÚ½Óµã + for(w = FirstAdjVex(G, G.vexs[start]); w >= 0; w = NextAdjVex(G, G.vexs[start], G.vexs[w])) { + // Èç¹ûÓöµ½ÁËÒÑÔÚ·¾¶ÖеÄÁڽӵ㣬˵Ã÷³öÏÖÁË»ØÂ· + if(visited[w] == TRUE) { + if(w == end) { + // Êä³ö»ØÂ· + for(i = 1; i <= path[0]; i++) { + printf("%c -> ", GetVex(G, path[i])); + } + printf("%c\n", GetVex(G, w)); + } + + } else { + // ɸµôÖØ¸´Â·¾¶ + if(w > end) { + Circuit_7_30(G, w, end, path); + } + } + } + + // ´Ó·¾¶ÖÐÒÆ³ý¸Ã¶¥µã£¬²¢½«Æä״̬½µ¼¶Îª"ÒÑ·ÃÎÊ" + path[0]--; + visited[start] = FALSE; +} diff --git a/VisualC++/ExerciseBook/07.30/07.30.png b/VisualC++/ExerciseBook/07.30/07.30.png new file mode 100644 index 0000000000000000000000000000000000000000..02410bc62be3037124e596cce3277db9eab58733 GIT binary patch literal 10195 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 literal 0 HcmV?d00001 diff --git a/VisualC++/ExerciseBook/07.30/07.30.vcxproj b/VisualC++/ExerciseBook/07.30/07.30.vcxproj new file mode 100644 index 0000000..0c4197c --- /dev/null +++ b/VisualC++/ExerciseBook/07.30/07.30.vcxproj @@ -0,0 +1,79 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {4C169B2E-6DE8-4BFA-AAE1-45F64C042136} + My0730 + + + + Application + true + MultiByte + + + Application + false + true + MultiByte + + + + + + + + + + + + + $(SolutionDir)\..\Status;$(IncludePath) + + + + Level3 + Disabled + + + true + $(SolutionDir)\..\Status\Status.lib;%(AdditionalDependencies) + Console + + + + + Level3 + MaxSpeed + true + true + + + true + true + true + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.30/07.30.vcxproj.filters b/VisualC++/ExerciseBook/07.30/07.30.vcxproj.filters new file mode 100644 index 0000000..9a8b78c --- /dev/null +++ b/VisualC++/ExerciseBook/07.30/07.30.vcxproj.filters @@ -0,0 +1,35 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + æºæ–‡ä»¶ + + + æºæ–‡ä»¶ + + + + + 头文件 + + + + + èµ„æºæ–‡ä»¶ + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.30/07.30.vcxproj.user b/VisualC++/ExerciseBook/07.30/07.30.vcxproj.user new file mode 100644 index 0000000..ace9a86 --- /dev/null +++ b/VisualC++/ExerciseBook/07.30/07.30.vcxproj.user @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.30/MGraph.c b/VisualC++/ExerciseBook/07.30/MGraph.c new file mode 100644 index 0000000..e11656a --- /dev/null +++ b/VisualC++/ExerciseBook/07.30/MGraph.c @@ -0,0 +1,299 @@ +/*================================= + * ͼµÄÊý×é(ÁÚ½Ó¾ØÕó)´æ´¢±íʾ + * + * °üº¬Ëã·¨: 7.1¡¢7.2¡¢7.4¡¢7.5¡¢7.6 + ==================================*/ + +#include "MGraph.h" //**¡ø07 ͼ**// + +// ¼ÈëÊý¾ÝµÄÔ´Îļþ£»fpΪnullʱ£¬ËµÃ÷ÐèÒª´Ó¿ØÖÆÌ¨Â¼Èë +static FILE* fp = NULL; + +/* + * IncInfoָʾ¸Ãͼ/ÍøµÄ±ß/»¡ÉÏÊÇ·ñ´æÔÚ¸½¼ÓÐÅÏ¢¡£ + * Èç¹ûÆäÖµ²»Îª0£¬Ôò±íʾÎÞ¸½¼ÓÐÅÏ¢£¬·ñÔò£¬±íʾ´æÔÚ¸½¼ÓÐÅÏ¢¡£ + */ +Boolean IncInfo = FALSE; + + +/* + * ¨€¨€¨€¨€¨€¨€¨€¨€ Ëã·¨7.1 ¨€¨€¨€¨€¨€¨€¨€¨€ + * + * ´´½¨Í¼/±í + * + *¡¾±¸×¢¡¿ + * + * ½Ì²ÄÖÐĬÈÏ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý¡£ + * ÕâÀïΪÁË·½±ã²âÊÔ£¬±ÜÃâÿ´ÎÔËÐж¼ÊÖ¶¯ÊäÈëÊý¾Ý£¬ + * Òò¶øÔÊÐíÑ¡Ôñ´ÓÔ¤ÉèµÄÎļþpathÖжÁÈ¡²âÊÔÊý¾Ý¡£ + * + * Èç¹ûÐèÒª´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý£¬ÔòpathΪNULL£¬»òpath[kind]Ϊ""¡£ + * Èç¹ûÐèÒª´ÓÎļþÖжÁÈ¡Êý¾Ý£¬ÔòÐèÒªÔÚpathÖÐÌîдÎļþÃûÐÅÏ¢¡£ + */ +Status CreateGraph(MGraph* G, char* path[]) { + int readFromConsole; // ÊÇ·ñ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý + int kind; + Status flag; + + // ¡ï¡ï¡ï´Ë´¦¹Ì¶¨ÎªÓÐÏòͼ + kind = 0; + + // Èç¹ûûÓÐÎļþ·¾¶ÐÅÏ¢£¬Ôò´Ó¿ØÖÆÌ¨¶ÁÈ¡ÊäÈë + readFromConsole = (path == NULL) || strcmp(path[kind], "") == 0; + + // ÐèÒª´ÓÎļþ¶ÁÈ¡ + if(readFromConsole) { + (*G).kind = kind; // ¼Ç¼ͼ/ÍøµÄÀàÐÍ + } else { + // ´ò¿ªÎļþ£¬×¼±¸¶ÁÈ¡²âÊÔÊý¾Ý + fp = fopen(path[kind], "r"); + if(fp == NULL) { + return ERROR; + } + + // ¼ÈëͼµÄÀàÐÍ + ReadData(fp, "%d", &((*G).kind)); + } + + // Ëæ»ú´´½¨ÓÐÏòͼ/Íø»òÎÞÏòͼ/ÍøµÄÒ»ÖÖ + switch((*G).kind) { + case DG: + flag = CreateDG(G); + break; + default: + flag = ERROR; + break; + } + + if(fp != NULL) { + fclose(fp); + fp = NULL; + } + + return flag; +} + +/* + * ¹¹ÔìÓÐÏòͼ + */ +static Status CreateDG(MGraph* G) { + int i, j, k; + ArcCell arcs = {0, NULL}; // ÓÐÏòͼÿÌõ±ßµÄ³õʼֵ + VertexType v1, v2; + + if(fp == NULL) { + printf("ÇëÊäÈëÓÐÏòͼµÄ¶¥µãÊý£º"); + scanf("%d", &((*G).vexnum)); + printf("ÇëÊäÈëÓÐÏòͼµÄ»¡Êý£º"); + scanf("%d", &((*G).arcnum)); + printf("¸ÃÓÐÏòͼµÄ»¡ÉÏÊÇ·ñ°üº¬ÆäËû¸½¼ÓÐÅÏ¢(0-²»°üº¬©¦1-°üº¬)£º"); + scanf("%d", &IncInfo); + + // ¼Èë¶¥µã¼¯ + printf("Çë¼Èë %d ¸ö¶¥µã£¬²»Í¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º", (*G).vexnum); + for(i = 0; i < (*G).vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(stdin); + scanf("%c", &((*G).vexs[i])); + } + } else { + ReadData(fp, "%d", &((*G).vexnum)); // ¼Èë¶¥µãÊý + ReadData(fp, "%d", &((*G).arcnum)); // ¼È뻡Êý + ReadData(fp, "%d", &IncInfo); // Åжϻ¡ÉÏÊÇ·ñ°üº¬¸½¼ÓÐÅÏ¢ + + // ¼Èë¶¥µã¼¯ + for(i = 0; i < (*G).vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(fp); + ReadData(fp, "%c", &((*G).vexs[i])); + } + } + + // ³õʼ»¯ÓÐÏòͼµÄÁÚ½Ó¾ØÕó + for(i = 0; i < (*G).vexnum; i++) { + for(j = 0; j < (*G).vexnum; j++) { + (*G).arcs[i][j] = arcs; + } + } + + // ½öÔÚ¿ØÖÆÌ¨Â¼ÈëÐÅϢʱÊä³ö´ËÌáʾ + if(fp == NULL && (*G).arcnum != 0) { + printf("ÇëΪÓÐÏòͼÒÀ´Î¼Èë %d Ìõ»¡µÄÐÅÏ¢£¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º\n", (*G).arcnum); + } + + // ¼È뻡µÄÐÅÏ¢ + for(k = 0; k < (*G).arcnum; k++) { + if(fp == NULL) { + printf("µÚ %2d Ìõ»¡£º", k + 1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v2); + } else { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + skipBlank(fp); + ReadData(fp, "%c%c", &v1, &v2); + } + + i = LocateVex(*G, v1); // »ñÈ¡¶¥µãv1ÔÚ¶¥µã¼¯ÖеÄλÖà + j = LocateVex(*G, v2); // »ñÈ¡¶¥µãv2ÔÚ¶¥µã¼¯ÖеÄλÖà + + // ½«Ö¸¶¨µÄ¶¥µã¹ØÏµÉèÖÃΪ1£¬Ö¸Ê¾ÕâÁ½¸ö¶¥µãÊÇÖ±½ÓÁ¬½ÓµÄ(×¢£ºÕâÀïûÓÐÑé֤ϱêÊÇ·ñÔ½½ç) + (*G).arcs[i][j].adj = 1; + + // Èç¹ûÐèҪ¼È뻡µÄÆäËû¸½¼ÓÐÅÏ¢ + if(IncInfo) { + // ×îºó¼È븽¼ÓÐÅÏ¢ + Input(*G, &((*G).arcs[i][j].info)); + } + } + + // ´ÓÎļþÖжÁÈ¡Êý¾Ýʱ£¬×îºóÆäʵӦµ±ÅжÏÒ»ÏÂÊÇ·ñ¶Áµ½ÁË×ã¹»µÄÐÅÏ¢ + return OK; +} + +/* + * ¼Èë±ß/»¡µÄÏà¹Ø¸½¼ÓÐÅÏ¢ + */ +static void Input(MGraph G, InfoType** info) { + //¼Èë±ß/»¡µÄÐÅÏ¢£¬±¾²âÊÔÉæ¼°µ½µÄ±ß/»¡Ä¬ÈÏÎÞÆäËû¸½¼ÓÐÅÏ¢ +} + +/* + * ²éÕÒ + * + * ·µ»Ø¶¥µãuÔÚͼ/ÍøÖеÄλÖà + */ +int LocateVex(MGraph G, VertexType u) { + int i; + + for(i = 0; i < G.vexnum; i++) { + if(G.vexs[i] == u) { + return i; + } + } + + return -1; +} + +/* + * ȡֵ + * + * ·µ»ØË÷Òýv´¦µÄ¶¥µãÖµ + */ +VertexType GetVex(MGraph G, int v) { + if(v < 0 || v >= G.vexnum) { + return '\0'; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + return G.vexs[v]; +} + +/* + * Ê׸öÁÚ½Óµã + * + * ·µ»Ø¶¥µãvµÄÊ׸öÁÚ½Óµã + */ +int FirstAdjVex(MGraph G, VertexType v) { + int kv, j; + VRType adj; + + kv = LocateVex(G, v); + if(kv == -1) { + return -1; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + // È·¶¨Ò»¸ö·ÇÁ¬Í¨±ê¼Ç + if(G.kind == DG || G.kind == UDG) { + adj = 0; // ͼ + } else if(G.kind == DN || G.kind == UDN) { + adj = INFINITE; // Íø + } else { + return -1; + } + + // ´ÓÍ·¿ªÊ¼²éÕÒ + for(j = 0; j < G.vexnum; j++) { + // ÕÒµ½ÓëvÖ±½ÓÁ¬½ÓµÄ¶¥µã + if(G.arcs[kv][j].adj != adj) { + return j; + } + } + + return -1; +} + +/* + * ÏÂÒ»¸öÁÚ½Óµã + * + * ·µ»Ø¶¥µãvµÄ(Ïà¶ÔÓÚwµÄ)ÏÂÒ»¸öÁÚ½Óµã + */ +int NextAdjVex(MGraph G, VertexType v, VertexType w) { + int kv, kw, j; + VRType adj; + + kv = LocateVex(G, v); + if(kv == -1) { + return -1; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + kw = LocateVex(G, w); + if(kw == -1) { + return -1; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + // È·¶¨Ò»¸ö·ÇÁ¬Í¨±ê¼Ç + if(G.kind == DG || G.kind == UDG) { + adj = 0; // ͼ + } else if(G.kind == DN || G.kind == UDN) { + adj = INFINITE; // Íø + } else { + return -1; + } + + // ´Ó¶¥µãwºó¿ªÊ¼²éÕÒ + for(j = kw + 1; j < G.vexnum; j++) { + // ÕÒµ½ÓëvÖ±½ÓÁ¬½ÓµÄ¶¥µã + if(G.arcs[kv][j].adj != adj) { + return j; + } + } + + return -1; +} + +/* + * ÒÔͼÐλ¯ÐÎʽÊä³öµ±Ç°½á¹¹ + * + * ×¢£ºÔÚÍøÖУ¬Ê¹ÓÃ"-"À´±íʾÁ½¶¥µã²»Ö±½ÓÁ¬Í¨ + */ +void PrintGraph(MGraph G) { + int i, j; + + if(G.vexnum == 0) { + printf("¿Õͼ£¬ÎÞÐè´òÓ¡£¡\n"); + return; + } + + printf("µ±Ç°Í¼/Íø°üº¬ %2d ¸ö¶¥µã£¬ %2d Ìõ±ß/»¡...\n", G.vexnum, G.arcnum); + + printf(" "); + for(i = 0; i < G.vexnum; i++) { + printf(" %c", G.vexs[i]); + } + printf("\n"); + + for(i = 0; i < G.vexnum; i++) { + printf("%c ", G.vexs[i]); + + for(j = 0; j < G.vexnum; j++) { + if(((G.kind == DG || G.kind == UDG) && G.arcs[i][j].adj == 0) || ((G.kind == DN || G.kind == UDN) && G.arcs[i][j].adj == INFINITE)) { + printf(" -"); + } else { + printf("%3d", G.arcs[i][j].adj); + } + } + + printf("\n"); + } +} diff --git a/VisualC++/ExerciseBook/07.30/MGraph.h b/VisualC++/ExerciseBook/07.30/MGraph.h new file mode 100644 index 0000000..3308db0 --- /dev/null +++ b/VisualC++/ExerciseBook/07.30/MGraph.h @@ -0,0 +1,134 @@ +/*================================= + * ͼµÄÊý×é(ÁÚ½Ó¾ØÕó)´æ´¢±íʾ + * + * °üº¬Ëã·¨: 7.1¡¢7.2¡¢7.4¡¢7.5¡¢7.6 + ==================================*/ + +#ifndef MGRAPH_H +#define MGRAPH_H + +#include +#include // ÌṩºêINT_MAX +#include // Ìṩmemset¡¢strcmp Ô­ÐÍ +#include // Ìṩºêva_list¡¢va_start¡¢va_arg¡¢va_end +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// + +/* + * ×¢£º + * + * ͨ³£À´½²£¬ÎÞȨͼ±»¼ò³ÆÎª¡¾Í¼¡¿£¬ÓÐȨͼ±»¼ò³ÆÎª¡¾Íø¡¿¡£ + * ÎÞÏòͼ/ÍøÖеĶ¥µã¹ØÏµ±»³ÆÎª¡¾±ß¡¿£¬ÓÐÏòͼ/ÍøÖеĶ¥µã¹ØÏµ±»³ÆÎª¡¾»¡¡¿£¬²¢Çø·Ö»¡Í·Ó뻡β¡£ + * ʵ¼Ê±íÊöÖУ¬Î´±Ø»áÑϸñ×ñÊØÒÔÉÏÃüÃû¡£ + */ + +/* ºê¶¨Òå */ +#define INFINITE INT_MAX // ×î´óÖµ£¬ÓÃÀ´±íÊ¾ÍøÖеÄÁ½¸ö¶¥µã²»Ö±½ÓÁ¬½Ó +#define MAX_VERTEX_NUM 26 // ×î´ó¶¥µã¸öÊý + + +// ͼµÄÀàÐÍ +typedef enum { + DG, // 0-ÓÐÏòͼ + DN, // 1-ÓÐÏòÍø(´øÈ¨Öµ) + UDG, // 2-ÎÞÏòͼ + UDN // 3-ÎÞÏòÍø(´øÈ¨Öµ) +} GraphKind; + +// ¶¥µãÀàÐÍ +typedef char VertexType; + +/* + * ¶¥µã¹ØÏµÀàÐÍ + * + * ÔÚÎÞȨͼÖУ¬¸Ãֵͨ³£Îª0»ò1£¬±íʾÁ½¶¥µãÊÇ·ñÖ±½ÓÁ¬Í¨£» + * ÔÚÓÐȨͼÖУ¬¸Ãֵͨ³£ÎªÈ¨Öµ¡£ + */ +typedef int VRType; + +// ±ßµÄÏà¹Ø¸½¼ÓÐÅÏ¢ +typedef struct { + // Èç¹ûÓеϰ£¬ºóÐø»áÌí¼ÓÏàÓ¦µÄÊôÐÔ + void* v; // Ìí¼ÓÒ»¸öÎÞÒâÒåµÄ±äÁ¿À´Õ¼Î»£¬Èç¹û½á¹¹ÌåΪ¿ÕµÄ»°£¬ÔÚVC++Öлᱨ´í +} InfoType; + +// ±ßµÄÀàÐÍ£¬Ã¿Ìõ±ßÉÏ¿ÉÄÜÓи½¼ÓÐÅÏ¢info +typedef struct ArcCell { + VRType adj; // ¶¥µã¹ØÏµ£¬ÔÚÓÐȨͼ¸úÎÞȨͼÖеĺ¬Ò岻ͬ + InfoType* info; // ±ßµÄ¸½¼ÓÐÅÏ¢£¬Í¨³£ºöÂÔ +} ArcCell; + +/* ͼ/ÍøµÄÊý×é(ÁÚ½Ó¾ØÕó)´æ´¢±íʾÀàÐͶ¨Òå */ +typedef struct { + VertexType vexs[MAX_VERTEX_NUM]; // ¶¥µãÏòÁ¿ + ArcCell arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; // ÁÚ½Ó¾ØÕó + int vexnum, arcnum; // ͼ/ÍøµÄ¶¥µãÊýºÍ»¡Êý + GraphKind kind; // ͼµÄÀàÐͱêÖ¾ +} MGraph; + + +// ±ß/»¡ÉÏÊÇ·ñ´æÔÚ¸½¼ÓÐÅÏ¢ +extern Boolean IncInfo; + + +/* + * ¨€¨€¨€¨€¨€¨€¨€¨€ Ëã·¨7.1 ¨€¨€¨€¨€¨€¨€¨€¨€ + * + * ´´½¨ + * + *¡¾±¸×¢¡¿ + * + * ½Ì²ÄÖÐĬÈÏ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý¡£ + * ÕâÀïΪÁË·½±ã²âÊÔ£¬±ÜÃâÿ´ÎÔËÐж¼ÊÖ¶¯ÊäÈëÊý¾Ý£¬ + * Òò¶øÔÊÐíÑ¡Ôñ´ÓÔ¤ÉèµÄÎļþpathÖжÁÈ¡²âÊÔÊý¾Ý¡£ + * + * Èç¹ûÐèÒª´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý£¬ÔòpathΪNULL£¬»òpath[kind]Ϊ""¡£ + * Èç¹ûÐèÒª´ÓÎļþÖжÁÈ¡Êý¾Ý£¬ÔòÐèÒªÔÚpathÖÐÌîдÎļþÃûÐÅÏ¢¡£ + */ +Status CreateGraph(MGraph* G, char* path[]); + +/* + * ¹¹ÔìÎÞÏòͼ + */ +static Status CreateDG(MGraph* G); + +/* + * ¼Èë±ßµÄÏà¹Ø¸½¼ÓÐÅÏ¢ + */ +static void Input(MGraph G, InfoType** info); + +/* + * ²éÕÒ + * + * ·µ»Ø¶¥µãuÔÚͼ/ÍøÖеÄλÖà + */ +int LocateVex(MGraph G, VertexType u); + +/* + * ȡֵ + * + * ·µ»ØË÷Òýv´¦µÄ¶¥µãÖµ + */ +VertexType GetVex(MGraph G, int v); + +/* + * Ê׸öÁÚ½Óµã + * + * ·µ»Ø¶¥µãvµÄÊ׸öÁÚ½Óµã + */ +int FirstAdjVex(MGraph G, VertexType v); + +/* + * ÏÂÒ»¸öÁÚ½Óµã + * + * ·µ»Ø¶¥µãvµÄ(Ïà¶ÔÓÚwµÄ)ÏÂÒ»¸öÁÚ½Óµã + */ +int NextAdjVex(MGraph G, VertexType v, VertexType w); + +/* + * ÒÔͼÐλ¯ÐÎʽÊä³öµ±Ç°½á¹¹ + * + * ×¢£ºÔÚÍøÖУ¬Ê¹ÓÃ"-"À´±íʾÁ½¶¥µã²»Ö±½ÓÁ¬Í¨ + */ +void PrintGraph(MGraph G); + +#endif diff --git a/VisualC++/ExerciseBook/07.30/TestData_DG.txt b/VisualC++/ExerciseBook/07.30/TestData_DG.txt new file mode 100644 index 0000000..1a2f808 --- /dev/null +++ b/VisualC++/ExerciseBook/07.30/TestData_DG.txt @@ -0,0 +1,6 @@ +ͼÀàÐÍ¡ú0£¨ÓÐÏòͼ£© +¶¥µãÊý¡ú12 +»¡Êý¡ú16 +»¡ÊÇ·ñ´øÓÐÆäËûÐÅÏ¢¡ú0 +¶¥µã¼¯¡ú¡¾A£¬B£¬C£¬D£¬E£¬F£¬G£¬H£¬I£¬J£¬K£¬L¡¿ +»¡µÄ¼¯ºÏ¡ú¡¾A£¬E¡¿¡¾B£¬E¡¿¡¾E£¬C¡¿¡¾C£¬F¡¿¡¾F£¬E¡¿¡¾D£¬E¡¿¡¾G£¬D¡¿¡¾E£¬H¡¿¡¾E£¬I¡¿¡¾I£¬H¡¿¡¾H£¬G¡¿¡¾J£¬G¡¿¡¾H£¬K¡¿¡¾L£¬I¡¿¡¾L£¬K¡¿¡¾K£¬J¡¿ \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.31/07.31.c b/VisualC++/ExerciseBook/07.31/07.31.c new file mode 100644 index 0000000..ea76379 --- /dev/null +++ b/VisualC++/ExerciseBook/07.31/07.31.c @@ -0,0 +1,47 @@ +#include +#include "OLGraph.h" +#include "StronglyConnectedComponents.h" + +/* + * ÇóÓÐÏòͼµÄÇ¿Á¬Í¨·ÖÁ¿ + */ +void Algo_7_31(OLGraph G); + + +int main(int argc, char* argv[]) { + OLGraph G; + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ´´½¨²¢´òÓ¡ÓÐÏòͼ... \n"); + { + char* path[4]; + + path[0] = "TestData_DG.txt"; + path[1] = ""; + path[2] = ""; + path[3] = ""; + + CreateGraph(&G, path); + PrintGraph(G); + printf("\n"); + } + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ÇóÓÐÏòͼµÄÇ¿Á¬Í¨·ÖÁ¿... \n"); + { + Algo_7_31(G); + printf("\n"); + } + + return 0; +} + + +/* + * ÇóÓÐÏòͼµÄÇ¿Á¬Í¨·ÖÁ¿ + */ +void Algo_7_31(OLGraph G) { + printf("TarjanËã·¨£º\n"); + Tarjan(G); + +// printf("KosarajuËã·¨£º\n"); +// Kosaraju(G); +} diff --git a/VisualC++/ExerciseBook/07.31/07.31.png b/VisualC++/ExerciseBook/07.31/07.31.png new file mode 100644 index 0000000000000000000000000000000000000000..51f1816934785bad42bae40219de9d96274fca32 GIT binary patch literal 55908 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 P{<*89saPRz8T5Yu3gj_8 literal 0 HcmV?d00001 diff --git a/VisualC++/ExerciseBook/07.31/07.31.vcxproj b/VisualC++/ExerciseBook/07.31/07.31.vcxproj new file mode 100644 index 0000000..d87d975 --- /dev/null +++ b/VisualC++/ExerciseBook/07.31/07.31.vcxproj @@ -0,0 +1,81 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {13AD1B48-1644-461F-9C16-B64FE5B12D79} + My0731 + + + + Application + true + MultiByte + + + Application + false + true + MultiByte + + + + + + + + + + + + + $(SolutionDir)\..\Status;$(IncludePath) + + + + Level3 + Disabled + + + true + $(SolutionDir)\..\Status\Status.lib;%(AdditionalDependencies) + Console + + + + + Level3 + MaxSpeed + true + true + + + true + true + true + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.31/07.31.vcxproj.filters b/VisualC++/ExerciseBook/07.31/07.31.vcxproj.filters new file mode 100644 index 0000000..bb98ff2 --- /dev/null +++ b/VisualC++/ExerciseBook/07.31/07.31.vcxproj.filters @@ -0,0 +1,41 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + æºæ–‡ä»¶ + + + æºæ–‡ä»¶ + + + æºæ–‡ä»¶ + + + + + 头文件 + + + 头文件 + + + + + èµ„æºæ–‡ä»¶ + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.31/07.31.vcxproj.user b/VisualC++/ExerciseBook/07.31/07.31.vcxproj.user new file mode 100644 index 0000000..ace9a86 --- /dev/null +++ b/VisualC++/ExerciseBook/07.31/07.31.vcxproj.user @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.31/OLGraph.c b/VisualC++/ExerciseBook/07.31/OLGraph.c new file mode 100644 index 0000000..35a212a --- /dev/null +++ b/VisualC++/ExerciseBook/07.31/OLGraph.c @@ -0,0 +1,509 @@ +/*==================== + * ͼµÄÊ®×ÖÁ´±í´æ´¢±íʾ + * + * °üº¬Ëã·¨: 7.3 + ====================*/ + +#include "OLGraph.h" + +// ¼ÈëÊý¾ÝµÄÔ´Îļþ£»fpΪnullʱ£¬ËµÃ÷ÐèÒª´Ó¿ØÖÆÌ¨Â¼Èë +static FILE* fp = NULL; + +/* + * IncInfoָʾ¸ÃͼµÄ±ßÉÏÊÇ·ñ´æÔÚ¸½¼ÓÐÅÏ¢¡£ + * Èç¹ûÆäÖµ²»Îª0£¬Ôò±íʾÎÞ¸½¼ÓÐÅÏ¢£¬·ñÔò£¬±íʾ´æÔÚ¸½¼ÓÐÅÏ¢¡£ + */ +Boolean IncInfo = FALSE; + +// ·ÃÎʱêÖ¾Êý×飬¼Ç¼·ÃÎʹýµÄ¶¥µã +static Boolean visited[MAX_VERTEX_NUM]; + +// º¯Êý±äÁ¿ +static Status (* VisitFunc)(VertexType e); + + +/* + * ´´½¨ + * + *¡¾±¸×¢¡¿ + * + * ½Ì²ÄÖÐĬÈÏ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý¡£ + * ÕâÀïΪÁË·½±ã²âÊÔ£¬±ÜÃâÿ´ÎÔËÐж¼ÊÖ¶¯ÊäÈëÊý¾Ý£¬ + * Òò¶øÔÊÐíÑ¡Ôñ´ÓÔ¤ÉèµÄÎļþpathÖжÁÈ¡²âÊÔÊý¾Ý¡£ + * + * Èç¹ûÐèÒª´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý£¬ÔòpathΪNULL£¬»òpath[kind]Ϊ""¡£ + * Èç¹ûÐèÒª´ÓÎļþÖжÁÈ¡Êý¾Ý£¬ÔòÐèÒªÔÚpathÖÐÌîдÎļþÃûÐÅÏ¢¡£ + */ +Status CreateGraph(OLGraph* G, char* path[]) { + int readFromConsole; // ÊÇ·ñ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý + int kind; + Status flag; + + // ¡ï¡ï¡ï´Ë´¦¹Ì¶¨ÎªÓÐÏòͼ + kind = 0; + + // Èç¹ûûÓÐÎļþ·¾¶ÐÅÏ¢£¬Ôò´Ó¿ØÖÆÌ¨¶ÁÈ¡ÊäÈë + readFromConsole = (path == NULL) || strcmp(path[kind], "") == 0; + + // ÐèÒª´ÓÎļþ¶ÁÈ¡ + if(readFromConsole) { + (*G).kind = kind; // ¼Ç¼ͼ/ÍøµÄÀàÐÍ + } else { + // ´ò¿ªÎļþ£¬×¼±¸¶ÁÈ¡²âÊÔÊý¾Ý + fp = fopen(path[kind], "r"); + if(fp == NULL) { + return ERROR; + } + + // ¼ÈëͼµÄÀàÐÍ + ReadData(fp, "%d", &((*G).kind)); + } + + // Ëæ»ú´´½¨ÓÐÏòͼ/Íø»òÎÞÏòͼ/ÍøµÄÒ»ÖÖ + switch((*G).kind) { + case DG: + flag = CreateDG(G); + break; + default: + flag = ERROR; + break; + } + + if(fp != NULL) { + fclose(fp); + fp = NULL; + } + + return flag; +} + +/* + * ¨€¨€¨€¨€¨€¨€¨€¨€ Ëã·¨7.3 ¨€¨€¨€¨€¨€¨€¨€¨€ + * + * ¹¹ÔìÓÐÏòͼ + * + * ×¢£º + * ½Ì²ÄÖÐʹÓÃÁËÍ·²å·¨À´²åÈ뻡£¬ÕâÖÖ×ö·¨µÄΨһÓŵãÊDzåÈë·½±ã£¬ + * µ«ÊÇÔÚÉæ¼°µ½É¾³ý»ò²éÕÒʱ£¬Ð§Âʽϵͣ» + * ¶øÇÒ£¬"Í·²å·¨"ÒÀÀµÊäÈëµÄ˳Ðò£¬Èç¹ûÊäÈëµÄ±ß/»¡ÊÇÂÒÐòµÄ£¬ + * Ôò×îÖÕ¹¹Ôì³öµÄͼ/ÍøÖеıß/»¡Ò²ÊÇÎÞÐòµÄ¡£ + * + * ΪÁ˿˷þÒÔÉÏȱµã£¬ÕâÀï¸ÄÓÃ"ÉýÐò"²åÈë·¨£¬±£Ö¤²åÈëµÄ»¡ÊÇ"ÉýÐò"µÄ¡£ + * µ«Í¬Ê±£¬ÕâÑù×ö»áʹ"²åÈë"Ëã·¨±äµÃ½ÏΪ¸´ÔÓ¡£ + */ +static Status CreateDG(OLGraph* G) { + int i, k; + int vexnum, arcnum; + VertexType v1, v2; + InfoType* info = NULL; + + (*G).vexnum = (*G).arcnum = 0; + + if(fp == NULL) { + printf("ÇëÊäÈëÓÐÏòͼµÄ¶¥µãÊý£º"); + scanf("%d", &vexnum); + printf("ÇëÊäÈëÓÐÏòͼµÄ»¡Êý£º"); + scanf("%d", &arcnum); + printf("¸ÃÓÐÏòͼµÄ»¡ÉÏÊÇ·ñ°üº¬ÆäËû¸½¼ÓÐÅÏ¢(0-²»°üº¬©¦1-°üº¬)£º"); + scanf("%d", &IncInfo); + + // ¼Èë¶¥µã¼¯ + printf("Çë¼Èë %d ¸ö¶¥µã£¬²»Í¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º", vexnum); + for(i = 0; i < vexnum; i++) { + scanf("%c", &((*G).xlist[i].data)); + (*G).xlist[i].firstin = NULL; + (*G).xlist[i].firstout = NULL; + (*G).vexnum++; + } + } else { + ReadData(fp, "%d", &vexnum); // ¼Èë¶¥µãÊý + ReadData(fp, "%d", &arcnum); // ¼È뻡Êý + ReadData(fp, "%d", &IncInfo); // Åжϻ¡ÉÏÊÇ·ñ°üº¬¸½¼ÓÐÅÏ¢ + + // ¼Èë¶¥µã¼¯ + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(fp); + ReadData(fp, "%c", &((*G).xlist[i].data)); + (*G).xlist[i].firstin = NULL; + (*G).xlist[i].firstout = NULL; + (*G).vexnum++; + } + } + + // ½öÔÚ¿ØÖÆÌ¨Â¼ÈëÐÅϢʱÊä³ö´ËÌáʾ + if(fp == NULL && arcnum != 0) { + printf("ÇëΪÓÐÏòͼÒÀ´Î¼Èë %d Ìõ»¡µÄÐÅÏ¢£¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º\n", arcnum); + } + + // ¼È뻡µÄÐÅÏ¢ + for(k = 0; k < arcnum; k++) { + if(fp == NULL) { + printf("µÚ %2d Ìõ»¡£º", k + 1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v2); + } else { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + skipBlank(fp); + ReadData(fp, "%c%c", &v1, &v2); + } + + // Èç¹ûÐèҪ¼È뻡µÄÆäËû¸½¼ÓÐÅÏ¢ + if(IncInfo) { + // ×îºó¼È븽¼ÓÐÅÏ¢ + Input(*G, &info); + } + + // ²åÈ뻡 + InsertArc(G, v1, v2, info); + } + + // ´ÓÎļþÖжÁÈ¡Êý¾Ýʱ£¬×îºóÆäʵӦµ±ÅжÏÒ»ÏÂÊÇ·ñ¶Áµ½ÁË×ã¹»µÄÐÅÏ¢ + return OK; +} + +/* + * ¼È뻡µÄÏà¹Ø¸½¼ÓÐÅÏ¢ + */ +static void Input(OLGraph G, InfoType** info) { + int weight; + + // ÔÚ"Íø"µÄÇéÐÎÏÂÐèҪ¼ÈëȨֵÐÅÏ¢ + if(G.kind == DN || G.kind == UDN) { + *info = (InfoType*) malloc(sizeof(InfoType)); + + if(fp == NULL) { + scanf("%d", &weight); + } else { + ReadData(fp, "%d", &weight); + } + + (*info)->weight = weight; + } +} + +/* + * ²éÕÒ + * + * ·µ»Ø¶¥µãuÔÚͼ/ÍøÖеÄλÖà + */ +int LocateVex(OLGraph G, VertexType u) { + int i; + + for(i = 0; i < G.vexnum; i++) { + if(G.xlist[i].data == u) { + return i; + } + } + + return -1; +} + +/* + * ȡֵ + * + * ·µ»ØË÷Òýv´¦µÄ¶¥µãÖµ + */ +VertexType GetVex(OLGraph G, int v) { + if(v < 0 || v >= G.vexnum) { + return '\0'; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + return G.xlist[v].data; +} + +/* + * Ê׸öÁÚ½Óµã + * + * ·µ»Ø¶¥µãvµÄÊ׸öÁÚ½Óµã + */ +int FirstAdjVex(OLGraph G, VertexType v) { + int k; + ArcBox* r; + + // Ê×ÏÈÐèÒªÅжϸö¥µãÊÇ·ñ´æÔÚ + k = LocateVex(G, v); + if(k == -1) { + return -1; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + r = G.xlist[k].firstout; + if(r == NULL) { + return -1; + } else { + return r->headvex; + } +} + +/* + * ÏÂÒ»¸öÁÚ½Óµã + * + * ·µ»Ø¶¥µãvµÄ(Ïà¶ÔÓÚwµÄ)ÏÂÒ»¸öÁÚ½Óµã + */ +int NextAdjVex(OLGraph G, VertexType v, VertexType w) { + int kv, kw; + ArcBox* r; + + // Ê×ÏÈÐèÒªÅжϸö¥µãÊÇ·ñ´æÔÚ + kv = LocateVex(G, v); + if(kv == -1) { + return -1; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + // Ê×ÏÈÐèÒªÅжϸö¥µãÊÇ·ñ´æÔÚ + kw = LocateVex(G, w); + if(kw == -1) { + return -1; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + r = G.xlist[kv].firstout; + if(r == NULL) { + return -1; // Á´±íΪ¿Õ + } + + // ÔÚÁ´±íÖвéÕÒw + while(r != NULL && r->headvex < kw) { + r = r->tlink; + } + + // Èç¹ûûÕÒµ½w + if(r == NULL) { + return -1; + } + + // Èç¹ûÕÒµ½ÁËw£¬µ«ÊÇwºóÃæÃ»ÓбðµÄ¶¥µã£¬ÄÇôҲÎÞ·¨·µ»ØÁÚ½Óµã + if(r->headvex == kw && r->tlink != NULL) { + return r->tlink->headvex; + } + + return -1; +} + +/* + * ¹¹ÔìÒ»¸ö±ß/»¡½áµã(½öÏÞÄÚ²¿Ê¹ÓÃ) + */ +static ArcBox* newArcBoxPtr(int tailvex, int headvex, ArcBox* hlink, ArcBox* tlink, InfoType* info) { + ArcBox* p = (ArcBox*) malloc(sizeof(ArcBox)); + if(!p) { + exit(OVERFLOW); + } + + p->tailvex = tailvex; + p->headvex = headvex; + + p->hlink = hlink; + p->tlink = tlink; + + p->info = info; + + return p; +} + +/* + * ²åÈë±ß/»¡ + * + * Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬Ôò²åÈëÒ»Ìõ»¡ÐèÒªÔö¼ÓÁ½¸ö¶¥µã¹ØÏµ£¬µ«»¡µÄÊýÁ¿Ö»ÔöÒ»¡£ + * ¶ÔÓÚͼ/ÍøÀ´Ëµ£¬¿ÉÒÔÔڿɱä²ÎÊýÖÐÁгö±ß/»¡µÄ¸½¼ÓÐÅÏ¢¡£ + * + * ×¢£º´Ë´¦½ÓÊյIJÎÊýÓëMGraphÓÐЩ²»Ò»Ñù£ºÍøµÄ¸½¼ÓÐÅÏ¢Öаüº¬Á˸÷Ìõ±ß/»¡µÄȨֵ¡£ + */ +Status InsertArc(OLGraph* G, VertexType v, VertexType w, ...) { + int tail, head, k, count; + ArcBox* p; + ArcBox* pre; + ArcBox* r; + Boolean overlay = FALSE; // ÊÇ·ñΪ¸²¸ÇÌí¼Ó + InfoType* info = NULL; // ±ß/»¡µÄ¸½¼ÓÐÅÏ¢ + va_list ap; + + tail = LocateVex(*G, v); // »ñÈ¡¶¥µãvÔÚ¶¥µã¼¯ÖеÄλÖà + if(tail == -1) { + return ERROR; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + head = LocateVex(*G, w); // »ñÈ¡¶¥µãwÔÚ¶¥µã¼¯ÖеÄλÖà + if(head == -1) { + return ERROR; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + // ¾Ü¾ø»· + if(tail == head) { + return ERROR; + } + + // Èç¹û±ß/»¡ÉÏ´æÔÚ¸½¼ÓÐÅÏ¢ + if(IncInfo) { + va_start(ap, w); // ÔÚwºó²éѯÊ׸ö¿É±ä²ÎÊý + info = va_arg(ap, InfoType*); // »ñÈ¡¸½¼ÓÐÅÏ¢ + va_end(ap); + } + + /* ½ÓÏÂÀ´£¬ÐèÒª²éÕÒºÏÊʵIJåÈëλÖà */ + + for(count = 0; count < 2; count++) { + + // ÔÚºáÏòÁ´±íÉϲéÕÒºÏÊʵIJåÈëλÖà + pre = NULL; + // Ö¸ÏòÒÔtailΪβµÄÊ×Ìõ±ß/»¡ + r = G->xlist[tail].firstout; + while(r != NULL && r->headvex < head) { + pre = r; + r = r->tlink; + } + + // Óöµ½ÁËÏàͬλÖõĽáµã + if(r != NULL && r->headvex == head) { + r->info = info; // ¸´Óøýáµã + overlay = TRUE; // ·¢ÉúÁ˸²¸Ç + } else { + p = newArcBoxPtr(tail, head, NULL, r, info); + + if(pre == NULL) { + G->xlist[tail].firstout = p; + } else { + pre->tlink = p; + } + } + + // Èç¹ûûÓз¢Éú¸²¸Ç£¬ËµÃ÷²åÈëÁËнáµã£¬´ËʱÐèÒª¿¼ÂÇÆäÔÚ×ÝÏòÁ´±íÉϵÄλÖà + if(overlay == FALSE) { + // ÔÚ×ÝÏòÁ´±íÉϲéÕÒºÏÊʵIJåÈëλÖà + pre = NULL; + // Ö¸ÏòÒÔheadΪͷµÄÊ×Ìõ±ß/»¡ + r = G->xlist[head].firstin; + while(r != NULL && r->tailvex < tail) { + pre = r; + r = r->hlink; + } + + // Óöµ½ÁËÏàͬλÖõĽáµã + if(r != NULL && r->tailvex == tail) { + // ²»»áÖ´Ðе½ÕâÀÒòΪÈç¹û·¢ÉúÁ˸²¸Ç£¬Ç°Ãæ½ø²»À´ + } else { + /* ÖÁ´Ë£¬½áµãpÒѾ­´æÔÚÁË */ + + if(pre == NULL) { + p->hlink = G->xlist[head].firstin; + G->xlist[head].firstin = p; + } else { + p->hlink = pre->hlink; + pre->hlink = p; + } + } + } + + // Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬ÐèÒª¿¼ÂǶԳÆÐÔ + if((G->kind == UDG || G->kind == UDN) && tail != head) { + // µßµ¹iºÍj + k = tail; + tail = head; + head = k; + } else { + break; // Èç¹ûÊÇÓÐÏòµÄ£¬¿ÉÒÔ½áÊøÁË + } + } + + // ÔڷǸ²¸ÇµÄÇéÐÎÏ£¬²Å¿¼ÂǸüбß/»¡µÄÊýÁ¿ + if(!overlay) { + (*G).arcnum++; // ²»ÂÛÓÐÏòÎÞÏò£¬±ß/»¡ÊýÖ»ÔöÒ» + } + + return OK; +} + +/* + * Éî¶ÈÓÅÏȱéÀú(´Ë´¦½èÖúµÝ¹éʵÏÖ) + */ +void DFSTraverse(OLGraph G, Status(Visit)(VertexType)) { + int v; + + // ʹÓÃÈ«¾Ö±äÁ¿VisitFunc£¬Ê¹µÃDFS²»±ØÉèÖú¯ÊýÖ¸Õë²ÎÊý + VisitFunc = Visit; + + // ·ÃÎʱêÖ¾Êý×é³õʼ»¯ + for(v = 0; v < G.vexnum; v++) { + visited[v] = FALSE; + } + + // ´Ë´¦ÐèÒª±éÀúµÄÔ­ÒòÊDz¢²»Äܱ£Ö¤ËùÓж¥µã¶¼Á¬½ÓÔÚÁËÒ»Æð + for(v = 0; v < G.vexnum; v++) { + if(!visited[v]) { + DFS(G, v); // ¶ÔÉÐδ·ÃÎʵĶ¥µãµ÷ÓÃDFS + } + } +} + +/* + * Éî¶ÈÓÅÏȱéÀúºËÐĺ¯Êý + */ +static void DFS(OLGraph G, int v) { + int w; + + // ´ÓµÚv¸ö¶¥µã³ö·¢µÝ¹éµØÉî¶ÈÓÅÏȱéÀúͼG + visited[v] = TRUE; + + // ·ÃÎʵÚv¸ö¶¥µã + VisitFunc(G.xlist[v].data); + + for(w = FirstAdjVex(G, G.xlist[v].data); + w >= 0; + w = NextAdjVex(G, G.xlist[v].data, G.xlist[w].data)) { + if(!visited[w]) { + DFS(G, w); // ¶ÔÉÐδ·ÃÎʵĶ¥µãµ÷ÓÃDFS + } + } +} + +/* + * ÒÔͼÐλ¯ÐÎʽÊä³öµ±Ç°½á¹¹ + */ +void PrintGraph(OLGraph G) { + int i, head; + ArcBox* p; + + if(G.vexnum == 0) { + printf("¿Õͼ£¬ÎÞÐè´òÓ¡£¡\n"); + return; + } + + printf("µ±Ç°Í¼/Íø°üº¬ %2d ¸ö¶¥µã£¬ %2d Ìõ±ß/»¡...\n", G.vexnum, G.arcnum); + + for(i = 0; i < G.vexnum; i++) { + printf("%c ===> ", G.xlist[i].data); + + head = 0; + p = G.xlist[i].firstout; + + while(p != NULL) { + if(head < p->headvex) { + if(IncInfo == 0) { + printf(" "); + + // ¶ÔÓÚÍø£¬»á´ÓÆä¸½¼ÓÐÅÏ¢ÖлñÈ¡µ½È¨Öµ + } else { + printf(" "); + } + } else { + if(IncInfo == 0) { + printf("<%c, %c>", G.xlist[p->tailvex].data, G.xlist[p->headvex].data); + + // ¶ÔÓÚÍø£¬»á´ÓÆä¸½¼ÓÐÅÏ¢ÖлñÈ¡µ½È¨Öµ + } else { + printf("<%c, %c, %2d>", G.xlist[p->tailvex].data, G.xlist[p->headvex].data, p->info->weight); + } + + p = p->tlink; + } + + head++; + + if(p != NULL) { + printf(" "); + } + } + + printf("\n"); + } +} diff --git a/VisualC++/ExerciseBook/07.31/OLGraph.h b/VisualC++/ExerciseBook/07.31/OLGraph.h new file mode 100644 index 0000000..7008739 --- /dev/null +++ b/VisualC++/ExerciseBook/07.31/OLGraph.h @@ -0,0 +1,175 @@ +/*==================== + * ͼµÄÊ®×ÖÁ´±í´æ´¢±íʾ + * + * °üº¬Ëã·¨: 7.3 + ====================*/ + +#ifndef OLGRAPH_H +#define OLGRAPH_H + +#include +#include // Ìṩmemset¡¢strcmp Ô­ÐÍ +#include // Ìṩºêva_list¡¢va_start¡¢va_arg¡¢va_end +#include // Ìṩmalloc¡¢realloc¡¢free¡¢exitÔ­ÐÍ +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// + +/* + * ×¢£º + * + * ͨ³£À´½²£¬ÎÞȨͼ±»¼ò³ÆÎª¡¾Í¼¡¿£¬ÓÐȨͼ±»¼ò³ÆÎª¡¾Íø¡¿¡£ + * ÎÞÏòͼ/ÍøÖеĶ¥µã¹ØÏµ±»³ÆÎª¡¾±ß¡¿£¬ÓÐÏòͼ/ÍøÖеĶ¥µã¹ØÏµ±»³ÆÎª¡¾»¡¡¿£¬²¢Çø·Ö»¡Í·Ó뻡β¡£ + * ʵ¼Ê±íÊöÖУ¬Î´±Ø»áÑϸñ×ñÊØÒÔÉÏÃüÃû¡£ + * + * µ±Ç°½á¹¹Êʺϴ洢ÓÐÏòͼ¡£ + * + * ¡ï ²åÈë±ß/»¡µÄÐÅϢʱ£¬ÕâÀïµÄʵÏÖÊǰ´"ÉýÐò"²åÈëµÄ£¬ÕâʹµÃ²åÈëµÄ»¡Êǰ´"ÉýÐò"ÅÅÁеġ£ + */ + + +/* ºê¶¨Òå */ +#define MAX_VERTEX_NUM 26 // ×î´ó¶¥µã¸öÊý + + +// ͼµÄÀàÐÍ +typedef enum { + DG, // 0-ÓÐÏòͼ + DN, // 1-ÓÐÏòÍø(´øÈ¨Öµ) + UDG, // 2-ÎÞÏòͼ + UDN // 3-ÎÞÏòÍø(´øÈ¨Öµ) +} GraphKind; + +// ¶¥µãÀàÐÍ +typedef char VertexType; + +// ±ß/»¡µÄÏà¹Ø¸½¼ÓÐÅÏ¢ +typedef struct { + /* + * ×¢£º + * ½Ì²ÄÖиø³öµÄ½á¹¹Ö»¿¼ÂÇÁËÎÞȨͼ£¬¶øÃ»¿¼ÂÇÓÐȨͼ(Íø)¡£ + * ÕâÀïΪÁ˰ѡ°Íø¡±µÄÇéÐÎÒ²¿¼ÂǽøÈ¥£¬ÌØÔÚ¸½¼ÓÐÅÏ¢ÖÐÔö¼ÓÁË"È¨ÖØ"ÊôÐÔ¡£ + */ + int weight; +} InfoType; + +/* ±ß/»¡½áµã */ +typedef struct ArcBox { + int tailvex; // »¡Í·¶¥µãλÖà + int headvex; // »¡Î²¶¥µãλÖà + struct ArcBox* hlink; // Ö¸ÏòÏÂÒ»¸öÓµÓÐÏàͬ»¡Í·µÄ»¡ + struct ArcBox* tlink; // Ö¸ÏòÏÂÒ»¸öÓµÓÐÏàͬ»¡Î²µÄ»¡ + InfoType* info; // ¸Ã»¡µÄÏà¹Ø¸½¼ÓÐÅÏ¢ +} ArcBox; + +// ÿ¸öºáÏòÁ´±íµÄÍ·½áµã +typedef struct VexNode { + VertexType data; // ¶¥µã + ArcBox* firstin; // Ö¸Ïò¸Ã¶¥µãµÄµÚÒ»ÌõÈ뻡 + ArcBox* firstout; // Ö¸Ïò¸Ã¶¥µãµÄµÚÒ»Ìõ³ö»¡ +} VexNode; + +/* ͼµÄÊ®×ÖÁ´±í´æ´¢±íʾÀàÐͶ¨Òå */ +typedef struct { + VexNode xlist[MAX_VERTEX_NUM]; // ±íÍ·ÏòÁ¿ + int vexnum, arcnum; // ¶¥µãÊýºÍ»¡Êý + GraphKind kind; // ͼµÄÀàÐͱêÖ¾ +} OLGraph; + + +// ±ß/»¡ÉÏÊÇ·ñ´æÔÚ¸½¼ÓÐÅÏ¢ +extern Boolean IncInfo; + + +/* + * ´´½¨ + * + *¡¾±¸×¢¡¿ + * + * ½Ì²ÄÖÐĬÈÏ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý¡£ + * ÕâÀïΪÁË·½±ã²âÊÔ£¬±ÜÃâÿ´ÎÔËÐж¼ÊÖ¶¯ÊäÈëÊý¾Ý£¬ + * Òò¶øÔÊÐíÑ¡Ôñ´ÓÔ¤ÉèµÄÎļþpathÖжÁÈ¡²âÊÔÊý¾Ý¡£ + * + * Èç¹ûÐèÒª´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý£¬ÔòpathΪNULL£¬»òpath[kind]Ϊ""¡£ + * Èç¹ûÐèÒª´ÓÎļþÖжÁÈ¡Êý¾Ý£¬ÔòÐèÒªÔÚpathÖÐÌîдÎļþÃûÐÅÏ¢¡£ + */ +Status CreateGraph(OLGraph* G, char* path[]); + +/* + * ¨€¨€¨€¨€¨€¨€¨€¨€ Ëã·¨7.3 ¨€¨€¨€¨€¨€¨€¨€¨€ + * + * ¹¹ÔìÓÐÏòͼ + * + * ×¢£º + * ½Ì²ÄÖÐʹÓÃÁËÍ·²å·¨À´²åÈ뻡£¬ÕâÖÖ×ö·¨µÄΨһÓŵãÊDzåÈë·½±ã£¬ + * µ«ÊÇÔÚÉæ¼°µ½É¾³ý»ò²éÕÒʱ£¬Ð§Âʽϵͣ» + * ¶øÇÒ£¬"Í·²å·¨"ÒÀÀµÊäÈëµÄ˳Ðò£¬Èç¹ûÊäÈëµÄ±ß/»¡ÊÇÂÒÐòµÄ£¬ + * Ôò×îÖÕ¹¹Ôì³öµÄͼ/ÍøÖеıß/»¡Ò²ÊÇÎÞÐòµÄ¡£ + * + * ΪÁ˿˷þÒÔÉÏȱµã£¬ÕâÀï¸ÄÓÃ"ÉýÐò"²åÈë·¨£¬±£Ö¤²åÈëµÄ»¡ÊÇ"ÉýÐò"µÄ¡£ + * µ«Í¬Ê±£¬ÕâÑù×ö»áʹ"²åÈë"Ëã·¨±äµÃ½ÏΪ¸´ÔÓ¡£ + */ +static Status CreateDG(OLGraph* G); + +/* + * ¼È뻡µÄÏà¹Ø¸½¼ÓÐÅÏ¢ + */ +static void Input(OLGraph G, InfoType** info); + +/* + * ²éÕÒ + * + * ·µ»Ø¶¥µãuÔÚͼ/ÍøÖеÄλÖà + */ +int LocateVex(OLGraph G, VertexType u); + +/* + * ȡֵ + * + * ·µ»ØË÷Òýv´¦µÄ¶¥µãÖµ + */ +VertexType GetVex(OLGraph G, int v); + +/* + * Ê׸öÁÚ½Óµã + * + * ·µ»Ø¶¥µãvµÄÊ׸öÁÚ½Óµã + */ +int FirstAdjVex(OLGraph G, VertexType v); + +/* + * ÏÂÒ»¸öÁÚ½Óµã + * + * ·µ»Ø¶¥µãvµÄ(Ïà¶ÔÓÚwµÄ)ÏÂÒ»¸öÁÚ½Óµã + */ +int NextAdjVex(OLGraph G, VertexType v, VertexType w); + +/* + * ¹¹ÔìÒ»¸ö±ß/»¡½áµã(½öÏÞÄÚ²¿Ê¹ÓÃ) + */ +static ArcBox* newArcBoxPtr(int tailvex, int headvex, ArcBox* hlink, ArcBox* tlink, InfoType* info); + +/* + * ²åÈë±ß/»¡ + * + * Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬Ôò²åÈëÒ»Ìõ»¡ÐèÒªÔö¼ÓÁ½¸ö¶¥µã¹ØÏµ£¬µ«»¡µÄÊýÁ¿Ö»ÔöÒ»¡£ + * ¶ÔÓÚͼ/ÍøÀ´Ëµ£¬¿ÉÒÔÔڿɱä²ÎÊýÖÐÁгö±ß/»¡µÄ¸½¼ÓÐÅÏ¢¡£ + * + * ×¢£º´Ë´¦½ÓÊյIJÎÊýÓëMGraphÓÐЩ²»Ò»Ñù£ºÍøµÄ¸½¼ÓÐÅÏ¢Öаüº¬Á˸÷Ìõ±ß/»¡µÄȨֵ¡£ + */ +Status InsertArc(OLGraph* G, VertexType v, VertexType w, ...); + +/* + * Éî¶ÈÓÅÏȱéÀú(´Ë´¦½èÖúµÝ¹éʵÏÖ) + */ +void DFSTraverse(OLGraph G, Status(Visit)(VertexType)); + +/* + * Éî¶ÈÓÅÏȱéÀúºËÐĺ¯Êý + */ +static void DFS(OLGraph G, int v); + +/* + * ÒÔͼÐλ¯ÐÎʽÊä³öµ±Ç°½á¹¹ + */ +void PrintGraph(OLGraph G); + +#endif diff --git a/VisualC++/ExerciseBook/07.31/StronglyConnectedComponents.c b/VisualC++/ExerciseBook/07.31/StronglyConnectedComponents.c new file mode 100644 index 0000000..539f69d --- /dev/null +++ b/VisualC++/ExerciseBook/07.31/StronglyConnectedComponents.c @@ -0,0 +1,262 @@ +/*================== + * ÓÐÏòͼµÄÇ¿Á¬Í¨·ÖÁ¿ + ===================*/ + +#include "StronglyConnectedComponents.h" + + +/* È«¾Ö±äÁ¿ */ +static int count; // ¶Ô·ÃÎʹýµÄ½áµã¼ÆÊý + +// KosarajuËã·¨ +static Boolean visited[MAX_VERTEX_NUM]; // ·ÃÎʱêÖ¾Êý×飬¼Ç¼·ÃÎʹýµÄ¶¥µã +static int finished[MAX_VERTEX_NUM]; // ´æ´¢Éî¶ÈÓÅÏȱéÀúÖзÃÎʵ½µÄÔªËØ + +// TarjanËã·¨ +static int dfs[MAX_VERTEX_NUM]; // Éî¶ÈÓÅÏȱéÀúʱÒÀ´Î·ÃÎʵ½µÄÔªËØ(µÄÐòºÅ) +static int low[MAX_VERTEX_NUM]; // low[v] ==> ÔªËØv¿ÉÒÔ»ØËݵ½µÄ×îÔç׿ÏÈ +static int stack[MAX_VERTEX_NUM]; // ´æ´¢±éÀú¹ý³ÌÖÐÓöµ½µÄ½áµã + + +/* + * (1) TarjanËã·¨ÇóȡǿÁ¬Í¨·ÖÁ¿ + * + * ºËÐÄ˼ÏëÊÇÉî¶ÈÓÅÏȱéÀú+»ØËÝ£¬Óë±¾ÕµÚ8½ÚÇó¹Ø½ÚµãµÄËã·¨ÓÐÀàËÆÖ®´¦ + */ +void Tarjan(OLGraph G) { + int i; + + count = -1; // ³õʼ»¯¼ÆÊý + + // ³õʼ»¯¶¥µãΪÉÐδ·ÃÎÊ + for(i = 0; i < G.vexnum; i++) { + dfs[i] = -1; + low[i] = -1; + } + + printf("´òÓ¡µ±Ç°ÓÐÏòͼÖеĸ÷×éÇ¿Á¬Í¨·ÖÁ¿£º\n"); + + for(i = 0; i < G.vexnum; i++) { + if(dfs[i] == -1) { + DFS_Tarjan(G, i); + } + } +} + +/* + * Éî¶ÈÓÅÏȱéÀú¶¥µãv¿É´ïµÄËùÓÐÔªËØ£¬²¢³¢ÊÔÕÒ³öÆäÖеÄÇ¿Á¬Í¨·ÖÁ¿ + */ +static void DFS_Tarjan(OLGraph G, int v) { + int min; + int w; + int i; + + ++count; + + // ¼Ç¼·ÃÎÊ´ÎÐò + dfs[v] = min = count; + + // ¼Ç¼Óöµ½µÄ½áµã + stack[count] = v; + + // Éî¶È±éÀúvÆðʼµÄͼ + for(w = FirstAdjVex(G, G.xlist[v].data); w >= 0; w = NextAdjVex(G, G.xlist[v].data, G.xlist[w].data)) { + // Èç¹ûw½áµãδ·ÃÎÊ + if(dfs[w] == -1) { + DFS_Tarjan(G, w); // ¶ÔÉÐδ·ÃÎʵĶ¥µãµ÷ÓÃDFS + + if(low[w] < min) { + min = low[w]; + } + + // Óöµ½ÒÑ·ÃÎʹýµÄ½áµã + } else { + // Èç¹ûwÒѱ»·ÃÎʹý£¬ÇÒwÊÇvÔÚÉú³ÉÊ÷ÉϵÄ׿ÏÈ + if(dfs[w] < min) { + min = dfs[w]; + } + } + } + + // Èç¹û"׿ÏÈ"½áµã»¹Ã»ÓÐÈ·¶¨»ØËÝ׿ÏÈ£¬ÔòÖ»¼Ç¼"׿ÏÈ"½áµãÉϵķÃÎÊ´ÎÐò + if(low[stack[min]]==-1) { + low[v] = min; + } else { + // »ñÈ¡"׿ÏÈ"½áµãÉϵĿɻØËÝ׿ÏÈ + low[v] = low[stack[min]]; + } + + // »ñÈ¡µ±Ç°ÒÑËÑË÷µ½µÄÇ¿Á¬Í¨×Ó¼¯ + if(low[v] == dfs[v]) { + for(i = count; i >= 0; i--) { + if(low[stack[i]] == dfs[v]) { + printf("%c ", GetVex(G, stack[i])); + count--; + } else { + break; + } + } + printf("\n"); + } +} + + +/* + * (2) KosarajuËã·¨ÇóȡǿÁ¬Í¨·ÖÁ¿£¬ÕâÊǽ̲ÄÖÐÌáµ½µÄËã·¨ + * + * ºËÐÄ˼ÏëÊÇ£º + * 1.´Óij¶¥µã³ö·¢£¬Éî¶È±éÀúÓÐÏòͼ£¬µÃµ½Ò»¸ö·ÃÎÊÐòÁУ» + * 2.ÄæÖÃÓÐÏòͼ£» + * 3.±éÀúÉÏÃæµÃ³öµÄ·ÃÎÊÐòÁУ¬¶ÔÆäÖеÄÿ¸ö¶¥µã½øÐÐÉî¶ÈÓÅÏȱéÀú¡£ + */ +void Kosaraju(OLGraph G) { + int i, v; + + count = 0; // ³õʼ»¯¼ÆÊý + + // 1.´Óij¶¥µã³ö·¢£¬Éî¶È±éÀúÓÐÏòͼ£¬µÃµ½Ò»¸ö·ÃÎÊÐòÁÐ + DFSTraverse(G, StoreElem); + + // 2.ÄæÖÃÓÐÏòͼ + InverseGraph(&G); + + // ·ÃÎʱêÖ¾Êý×é³õʼ»¯ + for(i = 0; i < G.vexnum; i++) { + visited[i] = FALSE; + } + + printf("´òÓ¡µ±Ç°ÓÐÏòͼÖеĸ÷×éÇ¿Á¬Í¨·ÖÁ¿£º\n"); + + // 3.±éÀúÉÏÃæµÃ³öµÄ·ÃÎÊÐòÁУ¬¶ÔÆäÖеÄÿ¸ö¶¥µã½øÐÐÉî¶ÈÓÅÏȱéÀú + for(i = 0; i < count; i++) { + v = LocateVex(G, finished[i]); + + if(visited[v] == TRUE) { + continue; + } + + DFS_Inverse(G, v); + printf("\n"); + } +} + +/* + * ÄæÖÃÓÐÏòͼ£¨Ê®×ÖÁ´±í´æ´¢½á¹¹£©£¬¼´½«ËùÓл¡µÄ·½ÏòÄæÖà + * + * ºËÐÄ˼ÏëÊÇ£º + * 1.´´½¨Ò»¸ö²»°üº¬Èκλ¡µÄ¿Õͼ£» + * 2.ÒÀ´Î±éÀúÿ¸ö¶¥µãµÄÿÌõÈ뻡£» + * 3.ÕªÏÂÓöµ½µÄÈ뻡£¬½«Æä²åÈëµ½¿ÕͼÖбä³É³ö»¡¡£ + */ +static void InverseGraph(OLGraph* G) { + OLGraph newG = *G; + int i; + ArcBox* r; + ArcBox* pre, * p; + int tmp; + + for(i = 0; i < newG.vexnum; i++) { + newG.xlist[i].firstin = NULL; + newG.xlist[i].firstout = NULL; + } + + for(i = 0; i < (*G).vexnum; i++) { + while((*G).xlist[i].firstin != NULL) { + // ÕªÏÂÓöµ½µÄÖ¸Ïò¶¥µãiµÄÈ뻡 + r = (*G).xlist[i].firstin; + (*G).xlist[i].firstin = r->hlink; + + // ÄæÖû¡µÄ·½Ïò + tmp = r->headvex; + r->headvex = r->tailvex; + r->tailvex = tmp; + + r->hlink = NULL; + r->tlink = NULL; + + // ²åÈëµ½ÐÂͼµÄ×ÝÏòÉÏ + pre = newG.xlist[r->headvex].firstin; + if(pre == NULL) { + newG.xlist[r->headvex].firstin = r; + } else { + if(r->tailvex < pre->tailvex) { + r->hlink = newG.xlist[r->headvex].firstin; + newG.xlist[r->headvex].firstin = r; + } else if(r->tailvex > pre->tailvex) { + p = pre->hlink; + + while(p != NULL && r->tailvex > p->tailvex) { + pre = p; + p = p->hlink; + } + + if(p == NULL || r->tailvex < p->tailvex) { + r->hlink = p; + pre->hlink = r; + } + } else { + // µÈÓÚʱ²»´¦Àí + } + } + + // ²åÈëµ½ÐÂͼµÄºáÏòÉÏ + pre = newG.xlist[r->tailvex].firstout; + if(pre == NULL) { + newG.xlist[r->tailvex].firstout = r; + } else { + if(r->headvex < pre->headvex) { + r->tlink = newG.xlist[r->tailvex].firstout; + newG.xlist[r->tailvex].firstout = r; + } else if(r->headvex > pre->headvex) { + p = pre->tlink; + + while(p != NULL && r->headvex > p->headvex) { + pre = p; + p = p->tlink; + } + + if(p == NULL || r->headvex < p->headvex) { + r->tlink = p; + pre->tlink = r; + } + } else { + // µÈÓÚʱ²»´¦Àí + } + } + } + } + + *G = newG; +} + +/* + * ´æ´¢Éî¶ÈÓÅÏȱéÀúÖзÃÎʵ½µÄÔªËØ + */ +static Status StoreElem(VertexType c) { + finished[count++] = c; + return OK; +} + +/* + * Éî¶È±éÀúÒѾ­ÄæÖúóµÄͼ + */ +static void DFS_Inverse(OLGraph G, int v) { + int w; + + // Èç¹ûÒÑ·ÃÎʹý£¬Ö±½Ó·µ»Ø + if(visited[v] == TRUE) { + return; + } + + // ´ÓµÚv¸ö¶¥µã³ö·¢µÝ¹éµØÉî¶ÈÓÅÏȱéÀúͼG + visited[v] = TRUE; + + // ´òÓ¡·ÃÎʵ½µÄ¶¥µã + printf("%c ", GetVex(G, v)); + + for(w = FirstAdjVex(G, G.xlist[v].data); + w >= 0; + w = NextAdjVex(G, G.xlist[v].data, G.xlist[w].data)) { + DFS_Inverse(G, w); // ¶ÔÉÐδ·ÃÎʵĶ¥µãµ÷ÓÃDFS + } +} diff --git a/VisualC++/ExerciseBook/07.31/StronglyConnectedComponents.h b/VisualC++/ExerciseBook/07.31/StronglyConnectedComponents.h new file mode 100644 index 0000000..1dec1aa --- /dev/null +++ b/VisualC++/ExerciseBook/07.31/StronglyConnectedComponents.h @@ -0,0 +1,56 @@ +/*================== + * ÓÐÏòͼµÄÇ¿Á¬Í¨·ÖÁ¿ + ===================*/ + +#ifndef STRONGLYCONNECTEDCOMPONENTS_H +#define STRONGLYCONNECTEDCOMPONENTS_H + +#include +#include "OLGraph.h" //**¡ø07 ͼ**// + +/* + * (1) TarjanËã·¨ + * + * ÇóÈ¡ÓÐÏòͼµÄÇ¿Á¬Í¨·ÖÁ¿ + */ +void Tarjan(OLGraph G); + +/* + * Éî¶ÈÓÅÏȱéÀú¶¥µãv¿É´ïµÄËùÓÐÔªËØ£¬²¢³¢ÊÔÕÒ³öÆäÖеÄÇ¿Á¬Í¨·ÖÁ¿ + */ +static void DFS_Tarjan(OLGraph G, int v); + + +/* + * (2) KosarajuËã·¨ + * + * ÇóÈ¡ÓÐÏòͼµÄÇ¿Á¬Í¨·ÖÁ¿£¬ÕâÊǽ̲ÄÖÐÌáµ½µÄËã·¨ + * + * ºËÐÄ˼ÏëÊÇ£º + * 1.´Óij¶¥µã³ö·¢£¬Éî¶È±éÀúÓÐÏòͼ£¬µÃµ½Ò»¸ö·ÃÎÊÐòÁУ» + * 2.ÄæÖÃÓÐÏòͼ£» + * 3.±éÀúÉÏÃæµÃ³öµÄ·ÃÎÊÐòÁУ¬¶ÔÆäÖеÄÿ¸ö¶¥µã½øÐÐÉî¶ÈÓÅÏȱéÀú¡£ + */ +void Kosaraju(OLGraph G); + +/* + * ÄæÖÃÓÐÏòͼ£¨Ê®×ÖÁ´±í´æ´¢½á¹¹£©£¬¼´½«ËùÓл¡µÄ·½ÏòÄæÖà + * + * ºËÐÄ˼ÏëÊÇ£º + * 1.´´½¨Ò»¸ö²»°üº¬Èκλ¡µÄ¿Õͼ£» + * 2.ÒÀ´Î±éÀúÿ¸ö¶¥µãµÄÿÌõÈ뻡£» + * 3.ÕªÏÂÓöµ½µÄÈ뻡£¬½«Æä²åÈëµ½¿ÕͼÖбä³É³ö»¡¡£ + */ +static void InverseGraph(OLGraph *G); + +/* + * ´æ´¢Éî¶ÈÓÅÏȱéÀúÖзÃÎʵ½µÄÔªËØ + */ +static Status StoreElem(VertexType c); + +/* + * Éî¶È±éÀúÒѾ­ÄæÖúóµÄͼ£¬½öÏÞÄÚ²¿Ê¹Óà + */ +static void DFS_Inverse(OLGraph G, int v); + +#endif diff --git a/VisualC++/ExerciseBook/07.31/TestData_DG.txt b/VisualC++/ExerciseBook/07.31/TestData_DG.txt new file mode 100644 index 0000000..417c8b5 --- /dev/null +++ b/VisualC++/ExerciseBook/07.31/TestData_DG.txt @@ -0,0 +1,6 @@ +ͼÀàÐÍ¡ú0£¨ÓÐÏòͼ£© +¶¥µãÊý¡ú23 +»¡Êý¡ú32 +»¡ÊÇ·ñ´øÓÐÆäËûÐÅÏ¢¡ú0 +¶¥µã¼¯¡ú¡¾A£¬B£¬C£¬D£¬E£¬F£¬G£¬H£¬I£¬J£¬K£¬L£¬M£¬N£¬O£¬P£¬Q£¬R£¬S£¬T£¬U£¬V£¬W¡¿ +»¡µÄ¼¯ºÏ¡ú¡¾A£¬B¡¿¡¾B£¬D¡¿¡¾D£¬A¡¿¡¾B£¬C¡¿¡¾C£¬E¡¿¡¾E£¬F¡¿¡¾F£¬C¡¿¡¾C£¬G¡¿¡¾G£¬C¡¿¡¾E£¬U¡¿¡¾U£¬V¡¿¡¾V£¬W¡¿¡¾W£¬C¡¿¡¾V£¬E¡¿¡¾D£¬O¡¿¡¾D£¬I¡¿¡¾O£¬I¡¿¡¾I£¬J¡¿¡¾J£¬N¡¿¡¾N£¬O¡¿¡¾J£¬H¡¿¡¾N£¬R¡¿¡¾R£¬Q¡¿¡¾Q£¬R¡¿¡¾A£¬L¡¿¡¾L£¬M¡¿¡¾M£¬K¡¿¡¾K£¬L¡¿¡¾P£¬S¡¿¡¾S£¬P¡¿¡¾P£¬T¡¿¡¾T£¬S¡¿ \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.32/07.32.c b/VisualC++/ExerciseBook/07.32/07.32.c new file mode 100644 index 0000000..79f26d6 --- /dev/null +++ b/VisualC++/ExerciseBook/07.32/07.32.c @@ -0,0 +1,46 @@ +#include +#include "CSTree.h" +#include "ALGraph.h" +#include "MinimumSpanningTree.h" + +/* + * ÇóÎÞÏòÍøµÄ×îСÉú³ÉÉ­ÁÖ + */ +void Algo_7_32(ALGraph G); + + +int main(int argc, char* argv[]) { + ALGraph G; + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ´´½¨²¢´òÓ¡ÎÞÏòÍø... \n"); + { + char* path[4]; + + path[0] = ""; + path[1] = ""; + path[2] = ""; + path[3] = "TestData_UDN.txt"; + + CreateGraph(&G, path); + PrintGraph(G); + } + PressEnterToContinue(debug); + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ʹÓÃÆÕÀïÄ·Ëã·¨»ñÈ¡×îСÉú³ÉÉ­ÁÖ... \n"); + { + Algo_7_32(G); + } + PressEnterToContinue(debug); + +} + + +/* + * ÇóÎÞÏòÍøµÄ×îСÉú³ÉÉ­ÁÖ + */ +void Algo_7_32(ALGraph G) { + CSTree T = MinSpanTree_PRIM(G); + + // Êä³öÇóÈ¡µÄ×îСÉú³ÉÉ­ÁÖ£¬´Ë²½Öè¿ÉÑ¡ + PrintTree(T); +} diff --git a/VisualC++/ExerciseBook/07.32/07.32.png b/VisualC++/ExerciseBook/07.32/07.32.png new file mode 100644 index 0000000000000000000000000000000000000000..efa1f3f0fdd5da47688fe5366d058d26e043cc72 GIT binary patch literal 14783 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 literal 0 HcmV?d00001 diff --git a/VisualC++/ExerciseBook/07.32/07.32.vcxproj b/VisualC++/ExerciseBook/07.32/07.32.vcxproj new file mode 100644 index 0000000..6ee6b4f --- /dev/null +++ b/VisualC++/ExerciseBook/07.32/07.32.vcxproj @@ -0,0 +1,85 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {529A9C3D-E429-4128-911B-3D68F7FC0FDB} + My0732 + + + + Application + true + MultiByte + + + Application + false + true + MultiByte + + + + + + + + + + + + + $(SolutionDir)\..\Status;$(IncludePath) + + + + Level3 + Disabled + + + true + $(SolutionDir)\..\Status\Status.lib;%(AdditionalDependencies) + Console + + + + + Level3 + MaxSpeed + true + true + + + true + true + true + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.32/07.32.vcxproj.filters b/VisualC++/ExerciseBook/07.32/07.32.vcxproj.filters new file mode 100644 index 0000000..9cac618 --- /dev/null +++ b/VisualC++/ExerciseBook/07.32/07.32.vcxproj.filters @@ -0,0 +1,53 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + æºæ–‡ä»¶ + + + æºæ–‡ä»¶ + + + æºæ–‡ä»¶ + + + æºæ–‡ä»¶ + + + æºæ–‡ä»¶ + + + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + + + èµ„æºæ–‡ä»¶ + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.32/07.32.vcxproj.user b/VisualC++/ExerciseBook/07.32/07.32.vcxproj.user new file mode 100644 index 0000000..ace9a86 --- /dev/null +++ b/VisualC++/ExerciseBook/07.32/07.32.vcxproj.user @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.32/ALGraph.c b/VisualC++/ExerciseBook/07.32/ALGraph.c new file mode 100644 index 0000000..dabca2b --- /dev/null +++ b/VisualC++/ExerciseBook/07.32/ALGraph.c @@ -0,0 +1,326 @@ +/*================== + * ͼµÄÁÚ½Ó±í´æ´¢±íʾ + ===================*/ + +#include "ALGraph.h" + +// ¼ÈëÊý¾ÝµÄÔ´Îļþ£»fpΪnullʱ£¬ËµÃ÷ÐèÒª´Ó¿ØÖÆÌ¨Â¼Èë +static FILE* fp = NULL; + +/* + * IncInfoָʾ¸Ãͼ/ÍøµÄ±ß/»¡ÉÏÊÇ·ñ´æÔÚ¸½¼ÓÐÅÏ¢¡£ + * Èç¹ûÆäÖµ²»Îª0£¬Ôò±íʾÎÞ¸½¼ÓÐÅÏ¢£¬·ñÔò£¬±íʾ´æÔÚ¸½¼ÓÐÅÏ¢¡£ + */ +Boolean IncInfo = FALSE; + +// ·ÃÎʱêÖ¾Êý×飬¼Ç¼·ÃÎʹýµÄ¶¥µã +static Boolean visited[MAX_VERTEX_NUM]; + +// º¯Êý±äÁ¿ +static Status (* VisitFunc)(VertexType e); + + +/* + * ´´½¨ + * + *¡¾±¸×¢¡¿ + * + * ½Ì²ÄÖÐĬÈÏ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý¡£ + * ÕâÀïΪÁË·½±ã²âÊÔ£¬±ÜÃâÿ´ÎÔËÐж¼ÊÖ¶¯ÊäÈëÊý¾Ý£¬ + * Òò¶øÔÊÐíÑ¡Ôñ´ÓÔ¤ÉèµÄÎļþpathÖжÁÈ¡²âÊÔÊý¾Ý¡£ + * + * Èç¹ûÐèÒª´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý£¬ÔòpathΪNULL£¬»òpath[kind]Ϊ""¡£ + * Èç¹ûÐèÒª´ÓÎļþÖжÁÈ¡Êý¾Ý£¬ÔòÐèÒªÔÚpathÖÐÌîдÎļþÃûÐÅÏ¢¡£ + */ +Status CreateGraph(ALGraph* G, char* path[]) { + int readFromConsole; // ÊÇ·ñ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý + int kind; + Status flag; + + // ¡ï¡ï¡ï´Ë´¦¹Ì¶¨ÎªÎÞÏòͼ + kind = 3; + + // Èç¹ûûÓÐÎļþ·¾¶ÐÅÏ¢£¬Ôò´Ó¿ØÖÆÌ¨¶ÁÈ¡ÊäÈë + readFromConsole = (path == NULL) || strcmp(path[kind], "") == 0; + + // ÐèÒª´ÓÎļþ¶ÁÈ¡ + if(readFromConsole) { + (*G).kind = kind; // ¼Ç¼ͼ/ÍøµÄÀàÐÍ + } else { + // ´ò¿ªÎļþ£¬×¼±¸¶ÁÈ¡²âÊÔÊý¾Ý + fp = fopen(path[kind], "r"); + if(fp == NULL) { + return ERROR; + } + + // ¼ÈëͼµÄÀàÐÍ + ReadData(fp, "%d", &((*G).kind)); + } + + // Ëæ»ú´´½¨ÓÐÏòͼ/Íø»òÎÞÏòͼ/ÍøµÄÒ»ÖÖ + switch((*G).kind) { + case UDN: + flag = CreateUDN(G); + break; + default: + flag = ERROR; + break; + } + + if(fp != NULL) { + fclose(fp); + fp = NULL; + } + + return flag; +} + +/* + * ¹¹ÔìÎÞÏòÍø + */ +static Status CreateUDN(ALGraph* G) { + int i, k; + int vexnum, arcnum; + VertexType v1, v2; + InfoType* info = NULL; + + (*G).vexnum = (*G).arcnum = 0; + + if(fp == NULL) { + printf("ÇëÊäÈëÎÞÏòÍøµÄ¶¥µãÊý£º"); + scanf("%d", &vexnum); + printf("ÇëÊäÈëÎÞÏòÍøµÄ±ßÊý£º"); + scanf("%d", &arcnum); + printf("¸ÃÎÞÏòÍøµÄ±ßÉϱØÐë°üº¬ÆäËû¸½¼ÓÐÅÏ¢£¬ÒòΪ´Ë´¦µÄȨֵÐèÒª´æ´¢µ½¸½¼ÓÐÅÏ¢ÖÐ...\n"); + IncInfo = 1; + + // ¼Èë¶¥µã¼¯ + printf("Çë¼Èë %d ¸ö¶¥µã£¬²»Í¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º", vexnum); + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(stdin); + scanf("%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } else { + ReadData(fp, "%d", &vexnum); // ¼Èë¶¥µãÊý + ReadData(fp, "%d", &arcnum); // ¼Èë±ßÊý + ReadData(fp, "%d", &IncInfo);// ÅжϱßÉÏÊÇ·ñ°üº¬¸½¼ÓÐÅÏ¢ + IncInfo = 1; // Ç¿ÖÆ½«È¨ÖµÂ¼Èëµ½¸½¼ÓÐÅÏ¢ÖÐ + + // ¼Èë¶¥µã¼¯ + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(fp); + ReadData(fp, "%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } + + // ½öÔÚ¿ØÖÆÌ¨Â¼ÈëÐÅϢʱÊä³ö´ËÌáʾ + if(fp == NULL && arcnum != 0) { + printf("ÇëΪÎÞÏòÍøÒÀ´Î¼Èë %d Ìõ±ß(´øÈ¨Öµ)µÄÐÅÏ¢£¬¶¥µã¼°È¨ÖµÖ®¼äÓÿոñ¸ô¿ª£º\n", arcnum); + } + + // ¼Èë±ßµÄÐÅÏ¢ + for(k = 0; k < arcnum; k++) { + if(fp == NULL) { + printf("µÚ %2d Ìõ±ß¼°ÆäȨֵ£º", k + 1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v2); + } else { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + skipBlank(fp); + ReadData(fp, "%c%c", &v1, &v2); + } + + // Èç¹ûÐèҪ¼Èë±ßµÄÆäËû¸½¼ÓÐÅÏ¢ + if(IncInfo) { + // ×îºó¼È븽¼ÓÐÅÏ¢(´Ë´¦ÐèҪ¼ÈëÍøµÄȨֵ) + Input(*G, &info); + } + + // ²åÈë±ß + InsertArc(G, v1, v2, info); + } + + // ´ÓÎļþÖжÁÈ¡Êý¾Ýʱ£¬×îºóÆäʵӦµ±ÅжÏÒ»ÏÂÊÇ·ñ¶Áµ½ÁË×ã¹»µÄÐÅÏ¢ + return OK; +} + +/* + * ¼Èë±ß/»¡µÄÏà¹Ø¸½¼ÓÐÅÏ¢ + */ +static void Input(ALGraph G, InfoType** info) { + int weight; + + // ÔÚ"Íø"µÄÇéÐÎÏÂÐèҪ¼ÈëȨֵÐÅÏ¢ + if(G.kind == DN || G.kind == UDN) { + *info = (InfoType*) malloc(sizeof(InfoType)); + + if(fp == NULL) { + scanf("%d", &weight); + } else { + ReadData(fp, "%d", &weight); + } + + (*info)->weight = weight; + } +} + +/* + * ²éÕÒ + * + * ·µ»Ø¶¥µãuÔÚͼ/ÍøÖеÄλÖà + */ +int LocateVex(ALGraph G, VertexType u) { + int i; + + for(i = 0; i < G.vexnum; i++) { + if(G.vertices[i].data == u) { + return i; + } + } + + return -1; +} + +/* + * ¹¹ÔìÒ»¸ö±ß/»¡½áµã(½öÏÞÄÚ²¿Ê¹ÓÃ) + */ +static ArcNode* newArcNodePtr(int adjvex, ArcNode* nextarc, InfoType* info) { + ArcNode* p = (ArcNode*) malloc(sizeof(ArcNode)); + if(!p) { + exit(OVERFLOW); + } + + p->adjvex = adjvex; + + p->nextarc = nextarc; + + p->info = info; + + return p; +} + +/* + * ²åÈë±ß/»¡ + * + * Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬Ôò²åÈëÒ»Ìõ»¡ÐèÒªÔö¼ÓÁ½¸ö¶¥µã¹ØÏµ£¬µ«»¡µÄÊýÁ¿Ö»ÔöÒ»¡£ + * ¶ÔÓÚͼ/ÍøÀ´Ëµ£¬¿ÉÒÔÔڿɱä²ÎÊýÖÐÁгö±ß/»¡µÄ¸½¼ÓÐÅÏ¢¡£ + * + * ×¢£º´Ë´¦½ÓÊյIJÎÊýÓëMGraphÓÐЩ²»Ò»Ñù£ºÍøµÄ¸½¼ÓÐÅÏ¢Öаüº¬Á˸÷Ìõ±ß/»¡µÄȨֵ¡£ + */ +Status InsertArc(ALGraph* G, VertexType v, VertexType w, ...) { + int tail, head, k, count; + ArcNode* r; + ArcNode* pre; + Boolean overlay = FALSE; // ÊÇ·ñΪ¸²¸ÇÌí¼Ó + InfoType* info = NULL; // ±ß/»¡µÄ¸½¼ÓÐÅÏ¢ + va_list ap; + + tail = LocateVex(*G, v); // »ñÈ¡¶¥µãvÔÚ¶¥µã¼¯ÖеÄλÖà + if(tail == -1) { + return ERROR; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + head = LocateVex(*G, w); // »ñÈ¡¶¥µãwÔÚ¶¥µã¼¯ÖеÄλÖà + if(head == -1) { + return ERROR; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + // ¾Ü¾ø»· + if(tail == head) { + return ERROR; + } + + // Èç¹û±ß/»¡ÉÏ´æÔÚ¸½¼ÓÐÅÏ¢ + if(IncInfo) { + va_start(ap, w); // ÔÚwºó²éѯÊ׸ö¿É±ä²ÎÊý + info = va_arg(ap, InfoType*); // »ñÈ¡¸½¼ÓÐÅÏ¢ + va_end(ap); + } + + /* ½ÓÏÂÀ´£¬ÐèÒª²éÕÒºÏÊʵIJåÈëλÖà */ + + for(count = 0; count < 2; count++) { + pre = NULL; + // Ö¸ÏòÒÔtailΪβµÄÊ×Ìõ±ß/»¡ + r = G->vertices[tail].firstarc; + while(r != NULL && r->adjvex < head) { + pre = r; + r = r->nextarc; + } + + // Óöµ½ÁËÏàͬλÖõĽáµã + if(r != NULL && r->adjvex == head) { + r->info = info; // ¸´Óøýáµã + overlay = TRUE; // ·¢ÉúÁ˸²¸Ç + } else { + if(pre == NULL) { + G->vertices[tail].firstarc = newArcNodePtr(head, r, info); + } else { + pre->nextarc = newArcNodePtr(head, r, info); + } + } + + // Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬ÐèÒª¿¼ÂǶԳÆÐÔ + if((G->kind == UDG || G->kind == UDN) && tail != head) { + // µßµ¹iºÍj + k = tail; + tail = head; + head = k; + } else { + break; // Èç¹ûÊÇÓÐÏòµÄ£¬¿ÉÒÔ½áÊøÁË + } + } + + // ÔڷǸ²¸ÇµÄÇéÐÎÏ£¬²Å¿¼ÂǸüбß/»¡µÄÊýÁ¿ + if(!overlay) { + (*G).arcnum++; // ²»ÂÛÓÐÏòÎÞÏò£¬±ß/»¡ÊýÖ»ÔöÒ» + } + + return OK; +} + +/* + * ÒÔͼÐλ¯ÐÎʽÊä³öµ±Ç°½á¹¹ + */ +void PrintGraph(ALGraph G) { + int i; + ArcNode* p; + + if(G.vexnum == 0) { + printf("¿Õͼ£¬ÎÞÐè´òÓ¡£¡\n"); + return; + } + + printf("µ±Ç°Í¼/Íø°üº¬ %2d ¸ö¶¥µã£¬ %2d Ìõ±ß/»¡...\n", G.vexnum, G.arcnum); + + for(i = 0; i < G.vexnum; i++) { + printf("%c ===> ", G.vertices[i].data); + + p = G.vertices[i].firstarc; + while(p != NULL) { + if(IncInfo == 0) { + printf("%c ", G.vertices[p->adjvex].data); + + // ¶ÔÓÚÍø£¬»á´ÓÆä¸½¼ÓÐÅÏ¢ÖлñÈ¡µ½È¨Öµ + } else { + printf("%c[%2d] ", G.vertices[p->adjvex].data, p->info->weight); + } + + p = p->nextarc; + + if(p != NULL) { + printf("- "); + } + } + + printf("\n"); + } +} diff --git a/VisualC++/ExerciseBook/07.32/ALGraph.h b/VisualC++/ExerciseBook/07.32/ALGraph.h new file mode 100644 index 0000000..dfce53d --- /dev/null +++ b/VisualC++/ExerciseBook/07.32/ALGraph.h @@ -0,0 +1,128 @@ +/*================== + * ͼµÄÁÚ½Ó±í´æ´¢±íʾ + ===================*/ + +#ifndef ALGRAPH_H +#define ALGRAPH_H + +#include +#include // Ìṩmemset¡¢strcmp Ô­ÐÍ +#include // Ìṩºêva_list¡¢va_start¡¢va_arg¡¢va_end +#include // Ìṩmalloc¡¢realloc¡¢free¡¢exitÔ­ÐÍ +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// + +/* + * ×¢£º + * + * ͨ³£À´½²£¬ÎÞȨͼ±»¼ò³ÆÎª¡¾Í¼¡¿£¬ÓÐȨͼ±»¼ò³ÆÎª¡¾Íø¡¿¡£ + * ÎÞÏòͼ/ÍøÖеĶ¥µã¹ØÏµ±»³ÆÎª¡¾±ß¡¿£¬ÓÐÏòͼ/ÍøÖеĶ¥µã¹ØÏµ±»³ÆÎª¡¾»¡¡¿£¬²¢Çø·Ö»¡Í·Ó뻡β¡£ + * ʵ¼Ê±íÊöÖУ¬Î´±Ø»áÑϸñ×ñÊØÒÔÉÏÃüÃû¡£ + * + * µ±Ç°½á¹¹Êʺϴ洢±ß/»¡±È½ÏÏ¡ÊèµÄͼ/Íø¡£ + * + * ¡ï ²åÈë±ß/»¡µÄÐÅϢʱ£¬ÕâÀïµÄʵÏÖÊǰ´"ÉýÐò"²åÈëµÄ£¬ÕâʹµÃ²åÈëµÄ»¡Êǰ´"ÉýÐò"ÅÅÁеġ£ + */ + + +/* ºê¶¨Òå */ +#define MAX_VERTEX_NUM 26 // ×î´ó¶¥µã¸öÊý + + +// ͼµÄÀàÐÍ +typedef enum { + DG, // 0-ÓÐÏòͼ + DN, // 1-ÓÐÏòÍø(´øÈ¨Öµ) + UDG, // 2-ÎÞÏòͼ + UDN // 3-ÎÞÏòÍø(´øÈ¨Öµ) +} GraphKind; + +// ¶¥µãÀàÐÍ +typedef char VertexType; + +// ±ß/»¡µÄÏà¹Ø¸½¼ÓÐÅÏ¢ +typedef struct { + /* + * ×¢£º + * ½Ì²ÄÖиø³öµÄ½á¹¹Ö»¿¼ÂÇÁËÎÞȨͼ£¬¶øÃ»¿¼ÂÇÓÐȨͼ(Íø)¡£ + * ÕâÀïΪÁ˰ѡ°Íø¡±µÄÇéÐÎÒ²¿¼ÂǽøÈ¥£¬ÌØÔÚ¸½¼ÓÐÅÏ¢ÖÐÔö¼ÓÁË"È¨ÖØ"ÊôÐÔ¡£ + */ + int weight; +} InfoType; + +/* ±ß/»¡½áµã */ +typedef struct ArcNode { + int adjvex; // ¸Ã»¡ËùÖ¸ÏòµÄ¶¥µãµÄλÖà + struct ArcNode* nextarc; // Ö¸ÏòÏÂÒ»Ìõ»¡µÄÖ¸Õë + InfoType* info; // »¡µÄ¸½¼ÓÐÅÏ¢£¬Í¨³£ºöÂÔ +} ArcNode; + +// ÿ¸öÁ´±íµÄÍ·½áµã +typedef struct VNode { + VertexType data; // ¶¥µãÐÅÏ¢ + ArcNode* firstarc; // Ö¸ÏòµÚÒ»ÌõÒÀ¸½¸Ã¶¥µãµÄ»¡µÄÖ¸Õë +} VNode; + +/* ͼµÄÁÚ½Ó±í´æ´¢±íʾÀàÐͶ¨Òå */ +typedef struct { + VNode vertices[MAX_VERTEX_NUM]; // ÁÚ½Ó±í + int vexnum, arcnum; // ͼ/ÍøµÄ¶¥µãÊýºÍ»¡Êý + GraphKind kind; // ͼµÄÀàÐͱêÖ¾ +} ALGraph; + + +// ±ß/»¡ÉÏÊÇ·ñ´æÔÚ¸½¼ÓÐÅÏ¢ +extern Boolean IncInfo; + + +/* + * ´´½¨ + * + *¡¾±¸×¢¡¿ + * + * ½Ì²ÄÖÐĬÈÏ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý¡£ + * ÕâÀïΪÁË·½±ã²âÊÔ£¬±ÜÃâÿ´ÎÔËÐж¼ÊÖ¶¯ÊäÈëÊý¾Ý£¬ + * Òò¶øÔÊÐíÑ¡Ôñ´ÓÔ¤ÉèµÄÎļþpathÖжÁÈ¡²âÊÔÊý¾Ý¡£ + * + * Èç¹ûÐèÒª´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý£¬ÔòpathΪNULL£¬»òpath[kind]Ϊ""¡£ + * Èç¹ûÐèÒª´ÓÎļþÖжÁÈ¡Êý¾Ý£¬ÔòÐèÒªÔÚpathÖÐÌîдÎļþÃûÐÅÏ¢¡£ + */ +Status CreateGraph(ALGraph* G, char* path[]); + +/* + * ¹¹ÔìÎÞÏòÍø + */ +static Status CreateUDN(ALGraph* G); + +/* + * ¼Èë±ß/»¡µÄÏà¹Ø¸½¼ÓÐÅÏ¢ + */ +static void Input(ALGraph G, InfoType** info); + +/* + * ²éÕÒ + * + * ·µ»Ø¶¥µãuÔÚͼ/ÍøÖеÄλÖà + */ +int LocateVex(ALGraph G, VertexType u); + +/* + * ¹¹ÔìÒ»¸ö±ß/»¡½áµã(½öÏÞÄÚ²¿Ê¹ÓÃ) + */ +static ArcNode* newArcNodePtr(int adjvex, ArcNode* nextarc, InfoType* info); + +/* + * ²åÈë±ß/»¡ + * + * Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬Ôò²åÈëÒ»Ìõ»¡ÐèÒªÔö¼ÓÁ½¸ö¶¥µã¹ØÏµ£¬µ«»¡µÄÊýÁ¿Ö»ÔöÒ»¡£ + * ¶ÔÓÚͼ/ÍøÀ´Ëµ£¬¿ÉÒÔÔڿɱä²ÎÊýÖÐÁгö±ß/»¡µÄ¸½¼ÓÐÅÏ¢¡£ + * + * ×¢£º´Ë´¦½ÓÊյIJÎÊýÓëMGraphÓÐЩ²»Ò»Ñù£ºÍøµÄ¸½¼ÓÐÅÏ¢Öаüº¬Á˸÷Ìõ±ß/»¡µÄȨֵ¡£ + */ +Status InsertArc(ALGraph* G, VertexType v, VertexType w, ...); + +/* + * ÒÔͼÐλ¯ÐÎʽÊä³öµ±Ç°½á¹¹ + */ +void PrintGraph(ALGraph G); + +#endif diff --git a/VisualC++/ExerciseBook/07.32/CSTree.c b/VisualC++/ExerciseBook/07.32/CSTree.c new file mode 100644 index 0000000..3a1f268 --- /dev/null +++ b/VisualC++/ExerciseBook/07.32/CSTree.c @@ -0,0 +1,76 @@ +/*=================================== + * Ê÷µÄ¶þ²æÁ´±í£¨º¢×Ó-Ðֵܣ©½á¹¹´æ´¢±íʾ + ====================================*/ + +#include "CSTree.h" + +int count = 0; + +/* + * ³õʼ»¯ + * + * ¹¹Ôì¿ÕÊ÷¡£ + */ +Status InitTree(CSTree* T) { + if(T == NULL) { + return ERROR; + } + + *T = NULL; + + return OK; +} + +/* + * ÅÐ¿Õ + * + * ÅжÏÊ÷ÊÇ·ñΪ¿ÕÊ÷¡£ + */ +Status TreeEmpty(CSTree T) { + return T == NULL ? TRUE : FALSE; +} + + +/*©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥ ͼÐλ¯Êä³ö ©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥*/ + +// ÒÔͼÐλ¯ÐÎʽÊä³öµ±Ç°½á¹¹ +void PrintTree(CSTree T) { + + // Óöµ½¿ÕÊ÷ÔòÎÞÐè¼ÌÐø¼ÆËã + if(TreeEmpty(T)) { + printf("\n"); + return; + } + + Print(T, 0); + + printf("\n"); +} + +// ͼÐλ¯Êä³öµ±Ç°½á¹¹ÄÚ²¿ÊµÏÖ +static void Print(CSTree T, int row) { + int k; + + if(T == NULL) { + return; + } + + if(row==0) { + printf("\nµÚ %d ¿ÃÊ÷...\n", ++count); + } + + // ·ÃÎʵ±Ç°½áµã + printf("%c ", T->data); + + Print(T->firstchild, row + 1); + + if(T->nextsibling != NULL) { + printf("\n"); + + for(k = 0; k < row; k++) { + printf(". "); + } + + Print(T->nextsibling, row); + } +} diff --git a/VisualC++/ExerciseBook/07.32/CSTree.h b/VisualC++/ExerciseBook/07.32/CSTree.h new file mode 100644 index 0000000..b864682 --- /dev/null +++ b/VisualC++/ExerciseBook/07.32/CSTree.h @@ -0,0 +1,54 @@ +/*=================================== + * Ê÷µÄ¶þ²æÁ´±í£¨º¢×Ó-Ðֵܣ©½á¹¹´æ´¢±íʾ + ====================================*/ + +#ifndef CSTREE_H +#define CSTREE_H + +#include +#include // Ìṩ malloc¡¢free Ô­ÐÍ +#include // Ìṩ memset¡¢strcmp Ô­ÐÍ +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// +#include "ALGraph.h" + +/* µ¥¸ö½áµã×î´óµÄº¢×ÓÊýÁ¿ */ +#define MAX_CHILD_COUNT 8 + +/* Ê÷µÄÔªËØÀàÐͶ¨Ò壬ÕâÀï¼ÙÉèÆäÔªËØÀàÐÍΪchar */ +typedef char TElemType; + +/* (º¢×Ó-ÐÖµÜ)Ê÷µÄ½áµã¶¨Òå */ +typedef struct CSNode { + TElemType data; + struct CSNode* firstchild; // Ö¸Ïò³¤×Ó + struct CSNode* nextsibling; // Ö¸ÏòÓÒÐÖµÜ +} CSNode; + +/* (º¢×Ó-ÐÖµÜ)Ê÷ÀàÐͶ¨Òå */ +typedef CSNode* CSTree; + + +/* + * ³õʼ»¯ + * + * ¹¹Ôì¿ÕÊ÷¡£ + */ +Status InitTree(CSTree* T); + +/* + * ÅÐ¿Õ + * + * ÅжÏÊ÷ÊÇ·ñΪ¿ÕÊ÷¡£ + */ +Status TreeEmpty(CSTree T); + + +/*©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥ ͼÐλ¯Êä³ö ©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥*/ + +// ÒÔͼÐλ¯ÐÎʽÊä³öµ±Ç°½á¹¹ +void PrintTree(CSTree T); + +// ͼÐλ¯Êä³öµ±Ç°½á¹¹ÄÚ²¿ÊµÏÖ +static void Print(CSTree T, int row); + +#endif diff --git a/VisualC++/ExerciseBook/07.32/MFSet.c b/VisualC++/ExerciseBook/07.32/MFSet.c new file mode 100644 index 0000000..8b9d29d --- /dev/null +++ b/VisualC++/ExerciseBook/07.32/MFSet.c @@ -0,0 +1,93 @@ +/*===== + * ¼¯ºÏ + ======*/ + +#include "MFSet.h" + +/* + * ³õʼ»¯Ò»¸öÓɶà¸ö×Ó¼¯£¨Ã¿¸ö×Ó¼¯Ö»°üº¬µ¥¸ö³ÉÔ±£©¹¹³ÉµÄ¼¯ºÏS¡£ + * + * + *¡¾±¸×¢¡¿ + * + * ÕâÀï¶ÔµÚ6ÕµÄMFSet×öÁ˸͝£º + * 1.Ö±½ÓÔÚ²ÎÊýÖд«Èë×Ó¼¯ÊýÁ¿ + * 2.×Ó¼¯±àºÅ´Ó0¿ªÊ¼¼ÆÊý£¬Õâ»áÓ°Ïìµ½ºóÃæµÄº¯ÊýÖйØÓÚϱêµÄÅÐ¶Ï + */ +Status initial_mfset(MFSet* S, int n) { + int i; + + if(n <= 0) { + return ERROR; + } + + S->n = n; + S->r = 0; // µÚÒ»¸ö×Ó¼¯µÄλÖÃÔÚ0ºÅµ¥Ôª + + // ×Ó¼¯±àºÅ´Ó0¿ªÊ¼¼ÆÊý + for(i = 0; i < n; i++) { + S->nodes[i].parent = -1; + } + + return OK; +} + +/* + * ÇóÁ½¸ö»¥²»ÏཻµÄ×Ó¼¯SiºÍ×Ó¼¯SjµÄ²¢¼¯¡£ + */ +Status merge_mfset(MFSet* S, int i, int j) { + + // Ë÷ÒýÔ½½ç + if(i < 0 || i > S->n - 1 || j < 0 || j > S->n - 1) { + return ERROR; + } + + // ÏàͬµÄ×Ó¼¯ÎÞÐèºÏ²¢£¬Ö±½Ó·µ»Ø + if(i == j) { + return OK; + } + + S->nodes[i].parent = j; + + return OK; +} + +/* + * ÔÚ¼¯ºÏSÖвéÕÒÔªËØiµ±Ç°ËùÊôµÄ×Ó¼¯¡£ + */ +int find_mfset(MFSet S, int i) { + int j; + + // Ë÷ÒýÔ½½ç + if(i < 0 || i > S.n - 1) { + return -1; + } + + // ²éÕÒiËùÊôµÄ×Ó¼¯µÄ¸ù½áµã + for(j = i; S.nodes[j].parent >= 0; j = S.nodes[j].parent) { + // ´ÓÏÂÍùÉϲéÕÒ + } + + return j; +} + +/* + * ¸ù¾ÝµÈ¼Û¹ØÏµRÀ´ÕûÀí/½¨Á¢¼¯ºÏSÖеÄÔªËØ(×Ó¼¯)¡£ + */ +Status build_mfset(MFSet* S, Relation R) { + int k; + int i, j; + + for(k = 0; k < R.n; k++) { + // ÏÈ»ñÈ¡×Ó¼¯¸ù½áµã + i = find_mfset(*S, R.pairs[k].i); + j = find_mfset(*S, R.pairs[k].j); + + // ¶ÔÁ½¸ö»¥²»ÏཻµÄ×Ó¼¯½øÐй鲢 + if(!merge_mfset(S, i, j)) { + return ERROR; + } + } + + return OK; +} diff --git a/VisualC++/ExerciseBook/07.32/MFSet.h b/VisualC++/ExerciseBook/07.32/MFSet.h new file mode 100644 index 0000000..2a061a5 --- /dev/null +++ b/VisualC++/ExerciseBook/07.32/MFSet.h @@ -0,0 +1,92 @@ +/*===== + * ¼¯ºÏ + ======*/ + +#ifndef MFSET_H +#define MFSET_H + +#include +#include // Ìṩ malloc¡¢free Ô­ÐÍ +#include // Ìṩ memset¡¢strcmp Ô­ÐÍ +#include // +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// + +/* Ê÷µÄ×î´ó½áµãÊý£¬ÕâÀïָʾ×Ó¼¯×î´óÊýÁ¿ */ +#define MAX_TREE_SIZE 1024 + +/* ¶þÔª¹ØÏµ¶ÔÊýÁ¿ */ +#define MAX_PAIR_SIZE 100 + +/* + * (Ë«Ç×)Ê÷µÄ½áµã¶¨Òå + * + *¡¾×¢¡¿ + * 1.ÒÀÕս̲ĵÄͼʾ£¬Ë«Ç×Ê÷ÔÚ¼¯ºÏµÄÓ¦ÓÃÖУ¬ÆäÄ£ÐÍÒѱ»¼ò»¯£º¼´Ë«Ç×½áµã²»ÔÙ±£ÁôÊý¾ÝÓò¡£ + * 2.½áµãµÄË÷ÒýÓÃÀ´±íʾËüÊÇÄÄÒ»¸ö×Ó¼¯£¬Ëü»á×÷Ϊ¸ü´ó×Ó¼¯µÄÒ»¸öÔªËØ´æÔÚ¡£ + * 3.È·¶¨Ä³¸ö×Ó¼¯ÊôÓÚSÖÐÄĸö¸ü´óµÄ×Ó¼¯Ê±£¬ÐèÒªÏòÉÏ×·Ëݵ½¸ü´ó×Ó¼¯µÄ¸ù¡£ + * 4.ʵ¼ÊʹÓÃÖУ¬Ã¿¸ö×Ó¼¯»á°üº¬ºÜ¶àÊý¾ÝÔªËØ£¬´Ëʱ¿ÉÒÔ½«Ã¿¸öÊý¾ÝÔªËØÓëÆäËùÊôµÄ×Ó¼¯½¨Á¢¹ØÁª¹ØÏµ + * ¼´°Ñÿ¸öÊý¾ÝÔªËØÓ뼯ºÏSÖи÷½áµãµÄË÷Òý¹ØÁªÆðÀ´ + */ +typedef struct PTNode { + int parent; // Ë«Ç×λÖÃÓò£¬ÓÃÀ´Ö¸Ê¾¸Ã½áµãËùÊôµÄ×Ó¼¯ +} PTNode; + +/* + * (Ë«Ç×)Ê÷ÀàÐͶ¨Òå + * + *¡¾×¢¡¿ + * 1.Ê÷ÖнáµãÔÚnodesÖÐ"½ôÁÚ"´æ´¢£¬Ã»ÓпÕ϶ + * 2.µ±×Ó¼¯´æÔÚʱ£¬Ê÷¸ùrÉèÖÃΪ1£¬·ñÔò£¬Ê÷¸ùrÉèÖÃΪ0 + * 3.³ý¸ù½áµãÍ⣬ÆäËû½áµãÒÀ´Î°´²ãÐò˳ןù½áµãÍùÏÂÅÅÁÐ + * 5.ÕâÀï¼ÙÉènodes¿Õ¼äÊÇ×ã¹»´óµÄ£¬¿ÉÒÔÊÓÐèÇ󽫯ä¸ÄΪ¶¯Ì¬·ÖÅä´æ´¢ + */ +typedef struct { + PTNode nodes[MAX_TREE_SIZE]; // ´æ´¢Ê÷Öнáµã + int r; // Ê÷¸ùλÖÃ(Ë÷Òý)£¬ÕâÀïÓÃÀ´Ö¸Ê¾µÚÒ»¸ö×Ó¼¯µÄλÖà + int n; // Ê÷µÄ½áµãÊý£¬ÕâÀïÓÃÀ´Ö¸Ê¾ËùÓÐ +} PTree; + +/* ¼¯ºÏÀàÐͶ¨Òå */ +typedef PTree MFSet; + +/* µ¥¸ö¶þÔª¹ØÏµ¶Ô */ +typedef struct { + int i; + int j; +} Pair; + +/* ¼¯ºÏÄڵĵȼ۹ØÏµ */ +typedef struct { + Pair pairs[MAX_PAIR_SIZE]; // ×ã¹»´óµÄ¿Õ¼ä´æ´¢¶þÔª¹ØÏµ + int n; // ÒÑÖªµÄµÈ¼Û¹ØÏµÊýÁ¿ +} Relation; + + +/* + * ³õʼ»¯Ò»¸öÓɶà¸ö×Ó¼¯£¨Ã¿¸ö×Ó¼¯Ö»°üº¬µ¥¸ö³ÉÔ±£©¹¹³ÉµÄ¼¯ºÏS¡£ + * + * + *¡¾±¸×¢¡¿ + * + * ÕâÀï¶ÔµÚ6ÕµÄMFSet×öÁ˸͝£º + * 1.Ö±½ÓÔÚ²ÎÊýÖд«Èë×Ó¼¯ÊýÁ¿ + * 2.×Ó¼¯±àºÅ´Ó0¿ªÊ¼¼ÆÊý£¬Õâ»áÓ°Ïìµ½ºóÃæµÄº¯ÊýÖйØÓÚϱêµÄÅÐ¶Ï + */ +Status initial_mfset(MFSet* S, int n); + +/* + * ÇóÁ½¸ö»¥²»ÏཻµÄ×Ó¼¯SiºÍ×Ó¼¯SjµÄ²¢¼¯¡£ + */ +Status merge_mfset(MFSet* S, int i, int j); + +/* + * ÔÚ¼¯ºÏSÖвéÕÒÔªËØiµ±Ç°ËùÊôµÄ×Ó¼¯¡£ + */ +int find_mfset(MFSet S, int i); + +/* + * ¸ù¾ÝµÈ¼Û¹ØÏµRÀ´ÕûÀí/½¨Á¢¼¯ºÏSÖеÄÔªËØ(×Ó¼¯)¡£ + */ +Status build_mfset(MFSet* S, Relation R); + +#endif diff --git a/VisualC++/ExerciseBook/07.32/MinimumSpanningTree.c b/VisualC++/ExerciseBook/07.32/MinimumSpanningTree.c new file mode 100644 index 0000000..ff02e10 --- /dev/null +++ b/VisualC++/ExerciseBook/07.32/MinimumSpanningTree.c @@ -0,0 +1,118 @@ +/*=================== + * ÎÞÏòÍøµÄ×îСÉú³ÉÉ­ÁÖ + ===================*/ + +#include "MinimumSpanningTree.h" + +/* + * ÆÕÀïÄ·Ëã·¨ÖÐÓõ½µÄ¸¨ÖúÊý×飬 + * ÓÃÀ´¼Ç¼´Ó¶¥µã×Ó¼¯Uµ½¶¥µã×Ó¼¯V-UµÄ´ú¼Û×îСµÄ±ß + */ +static struct { + VertexType adjvex; // ¶¥µã×Ó¼¯UÖеĶ¥µã + int lowcost; // ¶¥µã×Ó¼¯V-Uµ½µ±Ç°¶¥µãadjvexµÄ±ßµÄȨֵ +} closedge[MAX_VERTEX_NUM]; // ¸¨ÖúÊý×é + + +/* + * ʹÓÃÆÕÀïÄ·Ëã·¨¹¹ÔìÎÞÏòÍøGµÄ×îСÉú³ÉÉ­ÁÖ + */ +CSTree MinSpanTree_PRIM(ALGraph G) { + int i, j, k; + ArcNode* p; + CSTree r; + CSTree T = NULL; + CSTree curRoot = NULL; // ×·×ÙÉ­ÁÖÖÐ×ÓÊ÷µÄ¸ù½áµã + CSTree parent[MAX_VERTEX_NUM] = {NULL}; // ×·×Ù¸÷¶¥µãÔÚÉ­ÁÖÖеÄλÖÃ(ÓÃÖ¸ÕëÖ¸Ïò¸Ã¶¥µã) + + // ¸¨ÖúÊý×é³õʼ»¯£º³õʼ»¯ËùÓÐȨֵΪ0 + for(j=0; jfirstchild = r->nextsibling = NULL; + + // ³öÏÖÁËеÄ×ÓÊ÷ + if(k==-1) { + printf("----------\n"); + + // È·¶¨É­ÁÖÖÐ×ÓÊ÷µÄ¸ù + for(k=0; kdata = G.vertices[k].data; + parent[k] = r; + + if(curRoot==NULL) { + T = curRoot = r; + } else { + // Á´½Óµ½É­ÁÖÖÐÏÂÒ»¿ÃÊ÷ + curRoot->nextsibling = r; + curRoot = r; + } + + break; + } + } + } else { + r->data = G.vertices[k].data; + + // »ñÈ¡¸¸½áµãÔÚͼÖеÄÐòºÅ + j = LocateVex(G, closedge[k].adjvex); + if(parent[j]->firstchild==NULL) { + parent[j]->firstchild = r; + } else { + // Ö±½Ó²ÉÓÃÍ·²å·¨¼´¿É + r->nextsibling = parent[j]->firstchild->nextsibling; + parent[j]->firstchild->nextsibling = r; + } + + parent[k] = r; + + // ´òÓ¡¶¥µãºÍ±ßµÄÐÅÏ¢ + printf("%c --%2d-- %c\n", closedge[k].adjvex, closedge[k].lowcost, G.vertices[k].data); + } + + // ½«¶¥µãk¼ÓÈëµ½¶¥µã×Ó¼¯U + closedge[k].lowcost = 0; + + // ж¥µã½øÈë¶¥µã×Ó¼¯Uºó£¬ÐèÒª¸üж¥µã×Ó¼¯UÓë¶¥µã×Ó¼¯V-UµÄ±ßµÄÐÅÏ¢ + for(p=G.vertices[k].firstarc; p!=NULL; p = p->nextarc) { + j = p->adjvex; + + if(p->info->weightinfo->weight; + } + } + } + + return T; +} + +/* + * ´Ó¶¥µã×Ó¼¯V-UÖÐÑ¡³öÏÂÒ»¸öºòÑ¡¶¥µãÒÔ±ãºóÐø¼ÓÈëµ½×îСÉú³ÉÊ÷ + * + * Ñ¡Ôñ¶¥µã×Ó¼¯Uµ½¶¥µã×Ó¼¯V-UµÄȨֵ×îСµÄ±ß£¬ + * ²¢·µ»Ø¸Ã±ßÔÚ¶¥µã×Ó¼¯V-UÖÐÄÇÍ·µÄ¶Ëµã£¬ + * ¸Ã¶ËµãºóÐø»á¼ÓÈëµ½¶¥µã×Ó¼¯UÖУ¬³ÉΪ×îСÉú³ÉÊ÷µÄнáµã¡£ + */ +static int minimum(ALGraph G) { + int i, k = -1; + int min = INT_MAX; + + // ´ÓȨֵ²»Îª0µÄ±ßÖÐÑ¡ÔñÓµÓÐ×îСȨֵµÄ±ß + for(i = 0; i < G.vexnum; i++) { + if(closedge[i].lowcost != 0 && closedge[i].lowcost < min) { + min = closedge[i].lowcost; + k = i; + } + } + + return k; +} diff --git a/VisualC++/ExerciseBook/07.32/MinimumSpanningTree.h b/VisualC++/ExerciseBook/07.32/MinimumSpanningTree.h new file mode 100644 index 0000000..8cf83b5 --- /dev/null +++ b/VisualC++/ExerciseBook/07.32/MinimumSpanningTree.h @@ -0,0 +1,30 @@ +/*=================== + * ÎÞÏòÍøµÄ×îСÉú³ÉÉ­ÁÖ + ===================*/ + +#ifndef MINIMUMSPANNINGTREE_H +#define MINIMUMSPANNINGTREE_H + +#include +#include /* ÌṩINT_MAXºê */ +#include "MFSet.h" //**¡ø06 Ê÷ºÍ¶þ²æÊ÷**// +#include "ALGraph.h" //**¡ø07 ͼ**// +#include "CSTree.h" //**¡ø06 Ê÷ºÍ¶þ²æÊ÷**// + +/* + * ʹÓÃÆÕÀïÄ·Ëã·¨¹¹ÔìÎÞÏòÍøGµÄ×îСÉú³ÉÉ­ÁÖ + */ +CSTree MinSpanTree_PRIM(ALGraph G); + +/* + * ´Ó¶¥µã×Ó¼¯V-UÖÐÑ¡³öÏÂÒ»¸öºòÑ¡¶¥µãÒÔ±ãºóÐø¼ÓÈëµ½×îСÉú³ÉÊ÷ + * + * Ñ¡Ôñ¶¥µã×Ó¼¯Uµ½¶¥µã×Ó¼¯V-UµÄȨֵ×îСµÄ±ß£¬ + * ²¢·µ»Ø¸Ã±ßÔÚ¶¥µã×Ó¼¯V-UÖÐÄÇÍ·µÄ¶Ëµã£¬ + * ¸Ã¶ËµãºóÐø»á¼ÓÈëµ½¶¥µã×Ó¼¯UÖУ¬³ÉΪ×îСÉú³ÉÊ÷µÄнáµã¡£ + * + * ×¢£ºÐβÎÓë½Ì²ÄÖиø³öµÄÄ£°åÓÐËù²»Í¬ + */ +static int minimum(ALGraph G); + +#endif diff --git a/VisualC++/ExerciseBook/07.32/TestData_UDN.txt b/VisualC++/ExerciseBook/07.32/TestData_UDN.txt new file mode 100644 index 0000000..27a36b9 --- /dev/null +++ b/VisualC++/ExerciseBook/07.32/TestData_UDN.txt @@ -0,0 +1,6 @@ +ͼÀàÐÍ¡ú3£¨ÎÞÏòÍø£© +¶¥µãÊý¡ú13 +±ßÊý¡ú13 +±ßÊÇ·ñ´øÓÐÆäËûÐÅÏ¢¡ú1 +¶¥µã¼¯¡ú¡¾A£¬B£¬C£¬D£¬E£¬F£¬G£¬H£¬I£¬J£¬K£¬M£¬N¡¿ +±ßµÄ¼¯ºÏ¡ú¡¾A£¬D£¬5¡¿¡¾A£¬B£¬1¡¿¡¾A£¬C£¬3¡¿¡¾A£¬N£¬7¡¿¡¾E£¬F£¬10¡¿¡¾G£¬I£¬1¡¿¡¾I£¬H£¬5¡¿¡¾G£¬J£¬2¡¿¡¾G£¬H£¬7¡¿¡¾D£¬K£¬4¡¿¡¾K£¬M£¬5¡¿¡¾K£¬N£¬2¡¿¡¾D£¬M£¬12¡¿ \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.33/07.33.c b/VisualC++/ExerciseBook/07.33/07.33.c new file mode 100644 index 0000000..062b5f1 --- /dev/null +++ b/VisualC++/ExerciseBook/07.33/07.33.c @@ -0,0 +1,38 @@ +#include +#include "CSTree.h" +#include "MinimumSpanningTree.h" +#include "Graph.h" + +/* + * ÇóÎÞÏòÍøµÄ×îСÉú³ÉÊ÷ + */ +void Algo_7_33(Graph G); + + +int main(int argc, char* argv[]) { + Graph G; + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ´´½¨²¢´òÓ¡ÎÞÏòÍø... \n"); + { + CreateGraph(&G, "TestData_UDN.txt"); + PrintGraph(G); + printf("\n"); + } + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ʹÓÿ˳˹¿¨¶ûËã·¨»ñÈ¡×îСÉú³ÉÊ÷... \n"); + { + Algo_7_33(G); + printf("\n"); + } +} + + +/* + * ÇóÎÞÏòÍøµÄ×îСÉú³ÉÊ÷ + */ +void Algo_7_33(Graph G) { + CSTree T = MinSpanTree_KRUSKAL(G); + + // Êä³öÇóÈ¡µÄ×îСÉú³ÉÊ÷£¬´Ë²½Öè¿ÉÑ¡ + PrintTree(T); +} diff --git a/VisualC++/ExerciseBook/07.33/07.33.png b/VisualC++/ExerciseBook/07.33/07.33.png new file mode 100644 index 0000000000000000000000000000000000000000..3c3b99a87eb5c3309a9d02b2686718cb859c314d GIT binary patch literal 34695 zcmeEu_dnI|8~?#Ej$|BrWOdABM4TwQIFgVegb=b<$lfFS*dc@@Wn^b(XYY_5vdP}x z`y72f-_MWVKj8a#ct75}&g^@whH>QG;uR8t#34%px?fLUF!=2mK-i?uad1A+K7B2G%?jOhLb#P5 z9d}19a!6?IzMEOHnwglrP0;WTI$epi&E{XiOKPC%DSuAw+L0?QAh}fDt`}G%;Lb(py6(ET+8X=#Jwrz z^7wf3YvV24`<9uf~;liIYgvS~GJ;^NnM0LbsAyDSoX0rJAP^YS@YE~CZLkuwoP6)!y z%`Lk>H9%==cT$+=SGf)2+Pvl7a(8zGk_WR?o4hPa`hDyAI=}3pf<;}7tUK+V;YyI> zQUCC8Jn|;?mESTbY4(=MNj?7kp@Hswb=!?Gy*0^pHoF zeA|a=*sUb3+^f^LcKRDG=2KU!q$Lya$ZfdO9VU2F7i zyq@fEo!yG>F+Kco@ikWPwHq3|m#&55^F-|Td5*r!R;N7-G{UaQ06t_`U0uymryaaZ zkyxh612$ksVX0~N2Gsaze<{;Ae)4A8L(J%5f5-oRgeSioJd#bM7r+sdwmts>BdsKE zZkQreIxIr**_(;hvDxHY=gHb)8yn*Ow1}cZ``S^>+?&9PKYpGF;@qo1;fO zkH}WXcU~M87+GbW3Z~U@z&WuCLNE&o(!gW0etM*&-g+MF6BEdbJiK?bqBUoK!61eQ z+}Muoysi!KQdmurXbwrpl3c_BY0at?0=_8!9ea?J5O9zXeUII8#yEpfzViUSeFQqFBDNGMABu{8ErebCl9najkrqw9ImHmz>t36ZV7NacihR_jt771` z-V3y*^4BY2vTXI2R#sgn%9xXfYXSk$jZREF$Qd{-CmQ#9oRoOe_zES`MZu@5QZ95z zV)y845`Q``E7(DC71&1xo-1o|m$j8uh>@Sh@@&tzl+sKUvESaG`xKO)uo7*;7zTgf zGLGsOe*TdT^@H^)nOD+o!HDas)EMJMv;ey#FDfrj=vkCVjX;(`qN7xDvWO;~bv{xt zgi}Xn1qjh&EjUCRoDClnqZ6=kjQ$1h_v!74qT9FI0u?v7HSjS96LJmn4pnILlROU6 zz&;?LuXU4doB@A5M<@Efl$I*67d`*CZ#>vn)xhDaXU&;yk*g;0yhjmm2BK~c5W)=q zNGAiN-;QLFvKC>OokqTC9*@+y$&)z7?+%Oqa3IuQ`SH4Oa+xK08|#IHeii&?MMLGBmEQub)Xb z9F6DtU0TwSIl*cd;)W`m{7Xs_+UU>AMVXQOvBzKD!mWf=PoG6h~i={}oOA6s#46pB5z-tsWjE8w~(8m1cUmkzD zlEr4lu;--)oZFx2`HqCyfun}A+xH+}97CChGNBdm!to>d4<2l+;PkHS#&)Z+V_x5) z1uHT6x9NMGmLhwD?NNfhQfFI{qn7cXyfKnd0~Y=fKU!#Z?)HIOIZiNjuI_b7 z$z5H%XSF06lyJQ*TCdc5khfyl$nZx?r#*;85b2UZvh)f@nq{Q_ z*~*D3{7-QR8rp1FG-Mv)*B*F5DO(Wu!ri-YK-|sbF5rN_JSiTvIG|123P0t*$ySFw ze9A-~^vS@~l+c`bpXs;#NXPtZ_m3kh6V{q1z8GGcfXCT++QxzN{fT^9NK>Vw_)Yz8 zfgz=i-NVHRg0p5*cfXCT5%ncfPoA?L!5{NCcKnd6gwr49?Qhu$hOMnxeJs#eHoS58 zI>QBTpJ}gT`_z0}!d>gLXG~XjS7+z%?Q&IL)KIW>hm-#6O6IYBR+q$fwQw%T3uXM_i0Hb@7=VywdP^61AUN==oN5vQ#0Q& zsMc^;2|6!^Amw1P0_Zv z-D}jV(SPb_9!1$a8?L>!(Ugmgu_^q%imVdAMdmA`I|qz<5GZfoYBkfl6Ixg(++ z^cW7}zHarw%K2g%3(C2_^!m{Hg}yf3#0Uq0HgI#3h(Xnjd9Vk>>5-T=-m)`^zK0~r zLHrya?=W7_vpi*;kc)i6H#tp$6~G12GVs;)^$!CH)jhNfA}N%nEr)lN*jQ80tZ8+n zeR}ch@0`Jr@Fl0tnPXFs3Ilb7%+Z{F&33oM#ygjdOv1luB~R%PGTC1X`?aFpqv}Zh zE#Z$&pRiuse!5h9_yQzqia7$Iu^6$-T2h*$qH1>b5jb2RMjIfvQzU)b+iYp<$FNDB~(jRgs8Ww)A_~|5DC^~y&lbb3z$Dw(uwXjP2SZ$ z?NW_zSJg2I3Q>`aC5KO{^>OXx<1HTq`RaMDRP@qBEqT1B2(( z2bF3bKBYSP7ta$VsAL(!1J|C)B}^%bop;XrOof$bRy{N^?Rlet)l*Ay9+d6U9pUw1 zUYJTPmt@Mpbmm!`Uwb=QvsP0GnPgG4ZXw#h#H8iyyWvy#>UfCQ%HN(q26Y*2_Q&?p z{LZH@7u}Zh!V5Fe^(DEF@T3@D0+U(4r-adsV}C6;-N37epBV_cg8`r2^D3(O`%)4m z&!t2=zs66qK8tadl6-}{)()Basm6+z9iJp$7$QZlA;a!yAO3sxj@&r|AGi&#gnHxC4M+GBy zFY?t^iflFChfVj=Harls8~c*<2M^Bc$l{r)8g0r&0-J@pj5aTIj5!bDbBp~tzsg^3V$QnufjeH zl@p?D1)Kk%DN(jac|l)F7N*V@#JPygl4?4(r4nHjIeNZ10}Y)_pk*OtU^3O!`)6A6 z@SU8$i~}yZ_kCq76@42YC=T>Uo&1?Qb!H3gWKwy)OsS44EH4)m-p<9G%5%yfrd1ce zlBoBJ5=dDN*o~yhG*QiL#+%>$5lF+bT{^yms<9=)J5_+M9w`UZ3Nw}mA6!|=u6Lh`NkgS0Oec&~lBQllap(=Wh z12v-J6>qA7?Ret?;#xfZsqswS4};=jQ)g%A|LTG(s+WbO@H3Q-9Tq`)Rm*ekDLmz1 zsEW&Tw^k_8Ao1tHAKRzC&z;bhp1=pqOS8wy)mJ}$k5W?P{2HVLM?UMG8GGl zniq3g!I!`D!Bjl{Zn=5fG3eeDT4O!)Ts)1GI{DpSyE}F5*ZF8eGBhF@y3p_IxAq_i z<%<_CH2GZsmQwq+zBFJl8+yJ;cD|WBb#jjh+6B@RcDwbVb;>2DL+guzLop8PMhV#B zpvN6vWaT@DLkbC`yY;nKx+kNNOk#yxu&iySq!8nW@RTDnFS>>k9=h^sHZ2rHJvUU! z=A8R()R}f+abQ_l*{30MQ8z0SlZBn7fi#ajvBe&)O&nHDP>nlPU72PNx~P^ht`$U5 zP+8RIJw%`|rf=xi8vze~COLKIb;WJzGQW|S-L9jNoz{&So6f)I#;e>7T(hPdYXx$J zXZ8l1{oIsuc;p1g5X7?x?P+xV(xnbvEmi>@xmf+Y>m2aK{-r^CkF(e1LI>{*%;FR* z9vj;@?eUe!urjihmvrF}h0w56ZB{vG*8=bC zDmWJbH%4{OKn8YuGf;iu%9@_mEVZ!D;q%=0qz@v(&^-&1TMrrnRPUOTL!||;_$ND+ zl&6b~Kb)MML8i7nUtskHCy%Y1sB2*9{@a8*ta?4hwS}j?xTa-VH97@SR6H00{C@^w z5(pW%w}}Jw^Af5Du3{h*)4cp>YGH8+=XBdz?nmHNzjy$43=cDh#F*pU>M_ng$p67y zZr(g=6-|Iu5=u;>r-;D$sIh)5;W6JZD~8NLR=I{?u`t>1M3?YzACVMDZ#z9 ztza323G{pibx66=BZ#T6--Pjvq;})Y;Gli2g1XeN)$t=Gz6Z(IZO4>Ny7#I3E21o& zy0^aJawQCym;ODh=1D0lFW-7lRWsx9*(kdxs^eJ>Gp0xmrp3?JWK4!QHLOlw%VUR-(x~cM7{IbD7siI);|t zD|V7*3J^LExgHw1ZgnN_N+*61p|P}1-KidLTP#lMOzA#N#U6(dhBYLIPy61UsO(8n z5`EKK;Ka!twWl1ydJYJt<_ZojdxrecJ?WVftZJ`2`P*^o=SS!2s^rd%q#&&PwF~OI z>fpj%}4oQN36qq35yhtAJl0dvUp>*t%{I8KWLSjo!S+?_s4zEQiW;RQM~fkkZ0`Y zwkIjor_O`()t;x?C*N=NY7d!HJ4?hQQ97URyi~+@$Kwe6+V}zw2$N_Fz%d>)FcfQa zm&s{rDyTPKih_Dm)Ok6~&Yg)Ifx(9WM&UL(E`4$xUE;ISQPjS=%6AijISLI7aqqcd zK=(?usR=zDS`uyi=#GZ+G-vbrSk;~X#?Lm3nW`|a6N-2&cYWLOi;i#CEh^sa?MM)4 z&cQoMn4@hO3n@WjG>Axz0Gw;+d&H&~?=z`l7NPqS%L4)BWX!kQ=Iw36)ELiL?KYOj>efy907+BUbAi$w4^;hbGnnNV)}bH+h$5Mx$Dqg@6Ck5 zSQ6#J=oA%AxDCxzN>Lu60RR?2U9NZlF{6h58MUM_OxG*euqhSUvvb#psJ{ zEQL1$GJ(3=*x}(p7%l$(x!rX1Zn^0PGQ2;zFK>CT+dO;QZv5HJc^HHoZ4}t&=e*d$ zXpR8cNqhWh^{El>t3GAg#Db@Zsj1C%F21umF?0N_SC<^e&bn1Ff?~^u-GfIFQMBz) zLuWyO7_G?q@+x4WFf5BFAw)?+{hLvGVr7xt7x(ayx=9uwxf{vZ9( z-b@%YW_9&5vN!bBGeVie(c*KDQ@W_TTkqcbAc=gH zUOdmX(wpqxPpH4&)wG^%>ShdUeR!BJ)pHdMuIx51 zi(vrAKx!Y%zPdc`Fc8$$goGI84pgz~%c9~S_(h$l-b?E_&M{%ZVgJ1|}jbhp*7zH3j0GMI1 z40)kgXcLXk!xu8a)v7#-6xAD|J44M!?Iy*4E&49B0wCF|Xr*l6Kbw7=0LdWiV!|5v zM#22{sNm|hu&{9E`Mep1!Xz!Q^E2GEu70!6+*i1X+Q}P+ho6Y2(p=EL4Cr@S0>-YZ z!UXkM_VINTr(R_oRmRmXlfn256o8z5;!_;1u38pSYJZ!s=68P3JS^9-JM|=wO#X(C zI&U2A)L$$*MTyUWV<$})Un82F2cl%Q_hhD3Ny7G_4!ch}Drew1-DivqwfzPl>-*M; zD(BkT)VS}iBYTl+LAis?^M0K_}yrP`d^FLE6_j!E7FJip3mt;1ol+b)O& zqjt)C0I+mTEKt|eaf|KhuK9T+^X9MBSl$HJr8vV}M?yo^gpOC@SL~cHFJEB#k)xwe z9p3dUESQLU99l1Z$g~R9+qk3ik`EEH$QVw&?QdaWk*(f-0qNd&3E(|bst;2tHQRev z8b5rP$`38r6{@h3!gX!h510*Cuowab6avSfbaCQTlXb2&?uYNIEr=u+JOr{xI+Opl zoJ!P#)4K{&0Y#w#(cZ}E&cWxuc`cQkPsB?USo+-ahIr%FJGi(|cgM zT6UV8oV?~#Ws)&!=~Okb2^L%nB0HAoVi;Jf%KNO=q$ z;ed`-CM8^>>z`G|)|@2MXbC+BmK^OXQ;Q%I{v*vST@q!QsGx-CQ7VaGbGSk6LEK70$>N zCNu{g4)a|*%z_L>JxhI+a>S2i8Wau9y()1pFl0`s67K9f4CW+$opi8wD!erXiD)5? z4OlX4ICt$F6Oc?%kMl+LBROBHj1yR0id%l-+M8(sbcioPc?A0T{7Ji;9q!ZtsV2 z^QAESF;3F#fu%2BuK)A4ATZB{VC&GQcIiYb*J5&ZY6PA}VsNC!%T0B&*m6%^0{ES4 zNy;V;4vzo?IXyf>@CFa??jOYpv_dbJJ{WH{>RzT=uExdIisay|3LL8@EJd%82Ftx^ zHq0A>Uoa^HY~0w;BWl!#Ms(NNOeXT-7H~k`_z=*(>WN}K_eP+Ra zeE=_GuNEyT{wzvz`lrjJSeHN4uSl9I#A3y1t=c23<0}RxffE4YrNWlFr^d!)wbE4d zB|VOIR#$<|b(a|bb#RYSekYKysPHO2ZzZFg?ERiRyO2mzYXUG#jc+lEDUGF|#do9$ zs$HJicH@Qg*uaRi=?)EEj*CF=3;gT>p6?v+Q#{ssIy!QnQ&e(5MpFCpXy&0!mET^6 zibd(+Gk#}k^9()x_-=Bv=S~B?B*oEmsvi_cE*2;~woUWk&B^-5}H;VnD zN+ZTtIP)h^rh~vz1r{6;-)WE-W*W}RxRo9o7rAmJ-JY_{f6E0rZb~@=3yTItfg9x4 zOUK~vPvTm99brZ!Z`$bYR0M|J=y}ASklgj*FbQi+(m)zEA`Ib5*}h~$%YM4+%O9Wn zY!SeO^v}L&Rfo5YpCLSlb{0u@U2Bw0taJCSL&IVnB=$f;Y@A=B9cicXF}3zKHmQP< zgR@{HvK7#;P3f7^&Od)b9FRIT_vCW){@Qr?$nbE}sNV-IK1ufj!PMH{D$6@-yOYI+ zTP>%@^B{q?Gsmi^G%%~$qN*yly;U!pFXuH>&?;g1Nw00OVgbEsa#OOmL1gD=BXuf2 z(+F=)eyXd={PTbm6CT-AFkg)Bc;+>BSVMK}T6EF!C2IUTySBEb%(-U$wU--|Ol8_0 ztndqRG1^KN_rpV>!^(<5gdjFh@hWRN3RF>`(UevFy4-LpureR(H4qpfk(G?Exl3Ma zuJRnUuhIR&|0dQKi^O_z&;OvsAh9u(-|x0yXo1mymE&q^fWW%v-j53fR@?%Iv$8Ai z>N@)Cm;50Ai*^OSpWeU8L$DPl6nLyHrOcwQAW4YMuPf`<`lvwz-bLjIICwaKP)&Pu(twU_FQaC<~|Fe>Oab~rgPEEllU zIQXHb`WdbMID67<8|Tc7@9mAoN1`52&qj%^t=ilfgy+IB2lgibcsKUAZwK3Zk?P(O z{kIi;0ek>3$@R6h5dSqh6D6g!HAk6~C9Rap-YzlF$l*`f{a2y|0lBildO)mPn3nO~ z^104f=%bw98*51eFDh0{<&E_Og9wJF-rX{CFKitf8=L5Vz(aQRfue7WP1eTRXy_M~ z{-qA~=NJ;mYk>dS2N*meChdOT8giQxW?z|?s-lo(h361#@XZ$K+;&EeBe)H?9;IS%CDkzp4(?UL{4R&?IyN|$9FxECa87R zJhpzmiS1`+XO0T(L#+89fKX)@xljr{bjNg7ORNk?FDYNKylu{Zy*}fCV?Kuq@C8nL zpD%Dfc>#<*Iu=LwrGdtzL+J^*dhyFW&I=z=7PiT1Yc{+DTn7^Fn z15CYt;6BI(LBmPi^Q6?$DSv$J%??H{WJ}~w($!xjr)Ig&DpqA3t<| z@&g@N*5{enGX?)2L&V9p+g38lP=89!gO4NY1YK9pKl$n?URqkpp^j}~!f-Kuqebc0 z6lyEq`S_*7&Ey(}RSOTd8a;6jRI^~4Z1zvH&%qbtB)GnqaPZ!#X+3y4`{PI`n4|e& zTuWsBBPtHy*p^P~m@$|jJ9IU2n9oKqSuSTBNb{}B$F0lR%(rl~ve)E& za8J_Cx4p_}=1_Q%lRG#_JY8ItY35lQ%69$JA^p=Tul z1JRA@ZBpW3Wa4cwmM{bR@+7a%EKv{SFW1gQbEVnO63+kXH#NwAt*N>E5QJ+Igfh9J zmJv+Jmq@S(oj$UXk<_zj1Df?&1G$z?{AoS>LrMpb`q1JejwY9z@o zf^K28?*{J?II(QF5>WSR;m4SsMWxIXXo(kUowfu+@@1rg&u^oYV-Y{c#=iTt%mqRY zUOGIs53B{Q)OVcDXZp3j_pH=Ik{C`{FL7+gelI(ixnZJItRD05jmKZ6_@ex!OyuRA zuwgAg$f&SnYPtR~BI))!$5(h8 z^}|CJfx~{RY~uBi+$VLXsrBc!HQo_hTHVc;!cb0mIP2;)FeWj;bK7jGFH)$2T(%yJ zQpktXDMuiryCSEVztn>f#GOB_blORvXK|q4weSh4_DhHgheIYSkqPB3%J|?+$>@3P zTNWFD{Cu46n0MPEg{paT$-t-CX4PhWA{c1sY;4((@LwZs3!wO4>Z)vfV$7i)#4FK6ea?C}ZG%d|``zzuO9*(X)hVJL%g&h7J=}n61 z%{1o5Rq|C7Vnf$|{-vgHe|{kMizv%)d;Mk?4tiqSRSq0xmSsnUE4Sq?uS0X*oX*bu zypJ0!C(^&pa8O$V#Cl+3e{^mr00SM58J}+}HwwpOv$c39lKc;B;0PRZx52~wW74C& zipRe!8HirN@N5Td1(L&_1-mm{UW3*0flK=Y%kLv)d> z^lyL_s5j}r(+jf)5?WW8X2)i=n=>J;TJY)UnFds3e^qmpNn{>EdOBkBnQQDMrr-g% z-0>-Dju)ok$d>e4;z|Ksx}Y-jMf-WJ(lX zSATPfyWTDi>Y~LfD?LCGQo*YJhPEgcTB9eBbbDi@le|5Q2PfgKk`PBe(CF@Cba4iO zsb5F43sR^B?d{_)L2_3bMb2Z$2Mddn=E*%cG%K<^Q1b>94c^=dn1}Tt&V1dZTbM^3yLsD@$CHYpyrAsv5+)`s#wRMxovgD`aN<@l(+Vk zS5-Sqr==BptaKMbeGE?@dYH|xh~MLU{KEA7nI?O?mNzcbeUx|W??2QU>wHNkw>=9! zzez&~j=2yDTyr!9z+3Ss6{;ly>;|$mP#pKm?M(c`dfQznz*mo$O26%pdz6FO5&78^ z#T)nj?`DbTW4C}H-;05ibb zLhrAT^7bAT5DV_&QE#?z(+%RVB!q2kbJl%R=}j<{LNh{}*rW`{G&k0b`IGJ!c+cBw zf&o!Q?!IC83FEZd0hqG5HD{~r(P@EzAXA}#9C5-r0IlbT(oJ_vMpU9lo(j$&b- z`QwMnB!!yRV)^zeQ0tzLPz=<}x$j7c%sQp=6@gZUOD33X^PjuhiNG;*lwaD&1 zHUuz5+W=~c6PCaWhlJ%l5f zCH^kZZH=dXztG`$H0az2JgJNRF|Jj0@}XcU;D@u|Z`vGm7%r1AYTCVn=wUbHI`LiJ z{s?@q1L^*|zrRTyN=z-RDjp0M3ZE4GT^~*iM%JX&1VYbPXW8 z>}y&ESjUUe#4_{TC+HvJ$ZK?s?vHXvrING9-Zj50fMB_4EpDs6C3mv$2FRwqJX=Au z8~hn2cI6FFlCn30$(r@E8V!5EhzwX~C=M!zhInA?5CxdQf5x74+__JCZ z5B$c&_3t-%e9UjI_#<$6eC($LBk-u{kZgplsHU;4cTWnwnN3@y1Ze;Zp#t!< zO_}iT)_u4?%kh;)K19t%#jlwCG)ro5ddcGeqUtzxDx52@h!3r!6 z=_wJXqw{$(cO>ENr#?b_B(O{}qDYjhEiYfZL#q)dW>^$t{{4QBo)--Uc^GoSuzewi z?n%Ab;aRcrUIh3?x}?Gv{yQ?%E#t}4U4Lp=yw|D3$APo#Fu2?= zr}2DCM~CFX@y_zXcI18j&D|l4aIiaotnIA&G;`x|3+q`l3(RvtF^|thLc{J9U8Lj{?S|t$$+67tKnWxo} zQjF}^51rb>^8ld$V*YAyt>0m1goZcZo)H+$yZYZ?qOo#(aG3%qu$B^TdPz;>3ONo~ z74j+haQ5u`Y%6;a5`G_*{%y|SU#S~<1;nsVZsfhZFK###txEoj-9-q9662XxK3onb zA`f9((Ox1PIzKBI16CE;&K<OYFh5fHFV z_@2F_*L?)J01z-A%)98j@l)4yz14(N8rk}a^_wto>e5(w~BD zpwwi3Uq^X2-hAJ@lmnA%02zFoQR~SpOL+I0Hgx6w%F#a`uLp-1as4gP51_|+p=)}E zLpAMkANMx$wq%`#PcGqX$)z<`p?D}j5*A0Sn~B&%n;9)EBAarJ9)xjVhAZao;JPvFbmuFR!1`Vu4buG8jW$7t^i;BDEP5sJ8lrKNH0?lT?)6ukTHXHUXH zg@|pdIdJOd8s&Cs+n}#pS9c-7fOP;c%f61R`3{oTq|P`O0iH6r4GJ>02AbmcBd?%r zKdCQ02{R4U3aJ51tx+htq{)MLuFo3 z!7nv$BLSH5Cij-~#H+*lfN4c=U_}K3G9W>f=1x<|(XIQi)2B^6E0~{rpOj+{4Vm_t zE&8@DA^6Q_k<)mPNZA)`xlPd}ph3Kj3k&X)-MSYh_U^0UMfMBQeK52NKv1AmgMarV z@B!++(4h||o{bJ^TwzqxuxRK-K`?TrPFZm|g^(Yr@Mh(=PzcCnF$28`RS|UEeJZ8k z5=<`~Oi|HoAcSMVXOJ!Z?5|PEp6h?8#cVU&nb(#}4{9QvNC2D47k8xWYgW0VyrZN; z!Te0q)7gj%q06IiDMcnf&I3e*br^I36kd9KJOra`{zPCl+{EGW$zp{crb?-Y{;Q7P_3x>;dy{^B@tjE(=wT> zQ`aZ_Md_&VWnp|nwE^<}mzrPcvP)_b1@)dyPQY|GVJ*1#GTbuHH9 zPM6+$&eN}TC72-A5L55_(|Et|RB$zY8kN5*vxR`+dQNb6EBxNom?Yt4pPm`K;BDms zY29D}hsu>M6X89H@QCN{5k9Db5gi>JKheabB$)t%GAdgVcke)dO=;NlJLM1ZP*4FX zlh4YXWxSGZB4hCuCLw^&|2;t{3(-Ln$eKXGg-Fyw8Q^C#P_W_F%Cq~BQQjQ8=7W1X z30+V8AG#XlcUMSm_<$#~o(IzW33*TQ4g_CP`ri`*&whYwX`t}NX{`_Xxglf_)E*0k z+Y%7K|2Z9Q*iri0L(Z6419cgk4+udYVP$(U+ca1LloNZ==mAqy2>9I=h73d|x^Tmk z=@fS^3c+;5pGGu^sy7cz89e5OK{$M%960HSLRpl-cj@<$SOvl7kYR~8_Qq948Gy&K zC~%<*fqj))377JJi6}(iQ5k?|*dJ*Ws|@DV&#Lf5!Kgn*Sml>N^#*a!r$ZjW0e}d8 zz#TGh?M)hG5P+`t_mOA8o-whKuOweP1V0fx!~8&0;fmN-!8IdJ62w2Bqzd18jw0Z$ z2hXrS-e_rG%&S@%2*Ky9eXZEs$`_s9GdamD2EX@DE(eSlHtWIg)RZFF6jIM|aL-rr zKkL?qAnL=99T)17&cj_0&MVjKbW*1?5#Gp!m0P$??rx-;@V4*K?$OZGPUYzpPdVS$ z=QU)G2kfwuA0&3IU_xxYE>d84_b&Y4-L+Yw;&y`BpNyU;TrY>aDYHi7R`MTI5DjBv z+D8kkr;8#5PWxMAR714W%vumvhzMDw>+FL&lk<|(I4JLf(p zMzSb0E71TSOjT0NBlAyp!ZyfI&zG#6dqLiAmu<&FjKlx9KtPyghay<$5e&dT|E?=p zORm1Knd{TOnbtFFI{)`h@(e9;;UkoHXZjCsQW=w|_mN3#PTn^@55;%7GI6XYq{cgL zKQGvSXH~*73GO%{B>e)N2L)CX;pvH)g_&)c(~&(SpGb{4lWSU9CiQ#2U3~*UVLlCF zkoQDc*S?gp%IAMl*I<)A+DjaIz68xdOFztS<5vBxwyB2Y73DlBQrs?TB%{HjA`$XT z5%+Q>yOFe9*aDpx&4cZOGRAO;w=N<(X6wyfWj+}D@D;Q|LtfB*LH^+SWYhlY9=)!4 zkt<=TdvPUiH(V5Sl9D_nZU#76Pkp#FyFzXl|2$ZT8)r!}@`k(t$ge8Sf!8bA&bCd;C0*xuF&rh z>;fF(KR{OTQ8_9pYVWc_D?Oy?vA75Q7m4@Wm~G5N<&6&XL02lJnR$=Hr(5?WySko_ zVZ`46cBxO>*1f7p=}I!qzRP!0nh7EhK4rQuIm9D;T4)~#ezFj0HH*#Gx$~p9H?vY9 z)24V$6jNN1e^7v@w}Wxhbm|1A<_I>WL;7#L;Op>5#gpIW|hz6>G*=`oC zs;dbr^U4dMTSeetAD|$1!Nnl`Th-+D0Og87aIkPX)4aX@bq(UZIh#Cis^1gF)-Kz9 z>-!lEZ6kRjN?Z}tnWg=ub=Gl)jlCNJGL_&wwJV!*m(Q;yRB7k_qFwyz^8l58OY?1T zgl4*TW@6;BH;WB-$49-dqZXpcmd9vm)BF-RMXPjiC}66v3Y?%Mb6RSK3C7t#pEDqE zKADId^1HX0W3L2%$}Hl#Lq&XS62E90Zwys7)13&=^*DZg+^WoZ$K(?Map4tkP|{4K zsWgUDot-~Jlx|Xbno7S4QyNW0Zj6H&qC z)PIUz`A(Te71xA%PGJ0`XV$CFh)p3)wpB&qI!#C{Czb8-T#(%5xUjB+o)3u4Ynn5w zYQ%L$=?!;_Exg*SKV~c`Kx{3!u#wwWa0tx`l7UZ8?JqfFE-PD#Qp!Gtd}!20uj~d9 zCEi{Z8c?MLRU*hTX9pEza3r6=50dFc$gsItqr6#agI4?8Qnz=q258)5u*=DsmQr;>kCmUamZxbPXQ#0;ZvgH5j@W& zS$a5=?*4vnXojF^v4fnLpDYfu08GP}0M6lWq1?Dc(%a81Q9HQg0ZOfaPD&Vw;5`5~ z)F>}ps%r{)IVVg>m0>jpoF=$Pov@xk3z|^WTl+;-GGPhO+C^e;-Klw0PR^_bmxE|t z@mr7{2{q}b)U7M8Ta|F99A4}^_M-US#ru7U&dj)P@TfmwL=1{&)N*(kgHrkD#(;V6 zWpF*LoveC%+xlw4F|Xw~c|ak8v8GV-*xle#q_`jaS!nGlE}pa-_#=Ld~y7tnJwnn62qSd4SfUfH*oRH{FPc3 z73udUXte<_*?hVdu*S$cplqU&| zD&l5W-YA*%Rpepv?-lB;{-!hU^_dMJZ6K%-hXp2y9wA`h0{(g#exZ@&L1cEH*3*wv zS;q^Rmqm-X>oXBP%bnA|Gsd3rTXsV{-hpe!$qShoS((+LO?)JAP?;B;+}{^S%)HfJ zyZ*8?2m@EW&J(*wGSIA>x-U8Xqtp6183Wa&KHUd$Clb{35q#;>^s#Il6YgaaiBW}> zl}YWo(eG;N%EsJP`KKtC@D-lB)j6TvV3#Ks5G)!mRxX^lDgp84f!FTvKl6A3YqGVo#3c zBzF5?b9FG3;Bh-@ZWD@V$bBg3`H(1(vhGGLb@lO9BIUPODEox7=WZX~;X}DDXVAlP zD0h71x}3Qhe(P1f%_FW!Dw^!6up9S$0KeTb;)jo20OT+g26+b0mm4mCdpPCFe`&@u!^y{ObVyKh|Mgr z{VpHjFc^x9e*B1hp`8WXFqfIHc$+{WT2F^(;a%iXAU_)PCmw z9B%*9w!eI3=o*2kJKdZ58pI#xkD>1l@F=Hh9e#J{Uuim3kX_r!-VgM&G5R=TYw#RO zc*~CJ7mLGK#?fzsEZniVIXRT@kNy@xU%<+PQ%NhcAG>(1;zpWN4y-QZw7bX2xRL_3 zw;W`tOvd-Ua-S@huXES?fmch{hv|RfBZEWDCrX7$oXSw(S$Ud{sX@;aD`}3S>u!+R zbDA+O0QHFX4Q3h@(!L}=HgcY_y-c;oCGRm2}SY0Jt!j^%WCzlJT>`yl9%2?fL$xNO}ID)wtmSr(vJ~& zc`CQdtOq2j>Xrp-d&|@xBUE`p{K@EeVJW|V|@3Dj?NiE$!-NKo(osv(KQ~?*(q@n9UH-Hl_+^-`YR%h8h z_DQ;Xri7dDOfqP}vc*>M3EjSHjbRZtsc(x_Lge!gwdK#yU#^9zc@uK@B)@wn=deIB z^Hc}dl&Jl_@UOicx`kePgZ_a8aBaQ;+&?%H$n4A%uFvX(;^U^PxJU zv`8I}Vd|OAYM+qojY5(Hy09=mT#mcn?gPFxNv?EU`Nx!2P!%3R!^c0Sv{|pl&{h@P zPzlB>M^78{q{#{U>C3k()Uo_ARH(2?`Z#c&jbuJCNkK&Qvcvd_-|NYixveRA+*QC-Af6aEvkpWMYm>?9Ls9P9I@^)AxcYYzW~; zH9I>MQP6%}3KaZL3KPkt_LFJ#ToL3WcJipp$Ba@g`$1|JZoMa3*Q|mn|1Q&I+Go@M z#))79Oqx}%=5KDTQ~N!VuLoWy@mhhNkcj4yP`)^ykALVZh5Q=BLXdm=IHL>#s|Zhb z@SF;9U0k9jSa3E)l>|*@$iZ#?n2t)kmr5)1ak2V zEXvVe`6Tx=;nEA7@HAA9TUZF%GGc$GH-qc)m4LyAAC>HRUu^*p40B^L3tfF+vfMU@ z9R57#fi)D^GDS?`uCC) zOubPci`-Q7Rmq9zcoqk4iEb~GWtzNte_Eu3i4^;W%_@8TmR zJ^v)&;|eQ{!Cd8}R!kSV8^b&Ckz!%!8aaYhgB->PoQVL+AjCQHEmJ8=ktbx$E>?Qd zu1#F2kmc9DRB{!WhvDen;H}f{GmmF%D=B{07~;p}wmq)nFlX&lxBl$I@Hh4pMT$xQ zjDH>9s%?BMLx_LuQtXsJT?x*XD`{()q~8sWi@1%36eX-xitD95w~e7k!7D~Re|!-R z8{N7m3`i%PqFfwex%Z$?CdN1psxqaw*eCRTQ;(ON83j>QSJnGxSG_)`8DNkPV|D(< z1oj_sVO%;2uDfphqLISObfm=sa1W;-oVTj--F02wrfhalUUBfqXILAs=T_f5uyqMpzV zANni7E9kT&4OOZQ%>*WaM>O$&dShIV0_~v$4y1zaIrbyl+4u~i6Ew7&lk`fpiI(H| z_|5G)EgJp~SEDv=A055b$x!<_3yg6To>oO$Nj$V`+eW9 z*Yo*!8PuHDJkR4!K%TXL~z@mPl5#!!fo5(i%KJp?4 zE71ZGbzJtW?US#vN{c(G=(lXN+q8@ z4N=e*#5G(lKi3o3D_+)So=+0#$*@o zaG63jOYL|r)W7_%DchV@{j@0)6yOAw;uyNg$DwbDsVNGwWimys~Iw16K1V zpIZp+d2iR4muC_*sQSr?6L|0EO@xzs{-_T=T0}B1ejC|wp!mf9CbM>1+i(A7sm8&` ztNrF0am&MpK{pZnR1RXtV{>*4%VN5p}R?Qu7hnh>zYCmenJw+q> z6AL%HMM)mA&Y{*5Z5g<}5-ZHULzHzwj=)4b+Ea?aazNp4@VI&}r$$8I6y(!mqJ2j; zLu+=*yA+2x$bI0N=GsS_UN$~wdW+YbHU^q#E71V`&VkjxpptD8m>t~MC|Svan#Aat zp8PgF+cl*LukLAuys*f+zG--wm5a;f@O|6;Pp(>kpl-V4@6H^a171yl+xW9;fQ#x6 zdh2St{PHeXE3E7Ztl!*h%mZ#HhDf}(uW~GjZS)Fg#Y^`6z4aot+bS1Nw5JfEhcUo;>@iAN)A zk6P8C`-x>o{iNc%Ti=gXA341F1k!EQtv)joJ>E5%X5Peevt1_}_#7?dTN$$OqGHLq zhjkp1uHJSIp>@n!J_997+tnadt$Q!t+s0lkbqkI4!hRfMJ^B!i%)OspdFyn(^N#BA) zQ<{=an79uoAE%vJL*p}gx(aAJDGk#BqUnBf@^T6fGHs7(;kIlCkNSdLWsng`6GDxwhK%6R z01t3RwF{@1ln=Z@ks$it&z5qk`VLz{N{Fg;re9u_pp9<}V&9a5@0eceCvyu{_EY;j zKYKDQOV-5yYc{DvfD=agkx_VTcb-A*huz3^KC(Eo?}JA~)Hm6rG+oP-k<9gA4P|z+ z&&Uu?siTaYQ8!2SL{h7wHVp3f@?_lNZpa&uM*+#C{#(8%uMv%+@K$o_iVJ!EC_DiMQh{kQz6LkMe zkXXT5RAnMC1+M1)U=+>gqhk=FLYc;>Oa<%X!LuhoY{nG;p?KG-dTVLEld1Zh%09fI zDz4ryJIV-Q7;s@`7%a;j=gn*D5NAYvSoCV}VTStxZznBF!)N5?`{UkF=LG_XhT zZ+DU7XpW7|;bpbUJQK!;E0aF^CG@M@`f)&ACc%`N-|3nMNz^YAn{U=i4UX!J!~qkD z)_0Di87${F?s-cfT3*5B*f((U%}!nusyGaj^0vt{ON!crA+R`;Hh`8*S#x$;D-mGI zoc8uJdK8O)SVaB;J`^`*MyC6OAB=VQLK)jdlNbbcK=wx!4pB(KR84w z6ranYwF#JRuTH@z{6({`L_E!V@KmzW=*+I_5Q%sZuN`*|bxPJA=#KarLD+AyxLpl$ zw?_sy~~+S6CNc)Rv|Z8j1&DI9?|+h~3E{OUcQMLmHPjXr{S&mK@`90kW9; zmcy5JU>;sPAhW>dQ0@$M@qeA&5N&<>8T4gNJy)?W3B6c!!+(_r)W(Q~)PcJEMKnA` zPk{)dwHvug&QIl=q>Wvnbli3tB!QE;m%qcYfNP@EJte*KrB5DV*YJ4!mr|15Fje~8 zwH!aHlZ7rXXUBW#h%#b-S|Wy=X4Utaa5Q>;V23?z&;ZeI*y?C3^4CicyQQ*smKu## z2MTerbihN9P=rIMlR@w(_ph32%XtD=ikD?QAS4rL^Lh($sfCXeJ>0ror#V$1KyCpH z5gYBDHVc9a;z4D9u|rkAIhb=t1{$r`^}eAlzxIfTcbd`PQt-2Es}LB4)U}_!IcVCI z3o~cs!*ie3@Cl`Vsa;f&|I)zAV^{Uq!|t;h_N+&V)^^6}z@4;^31;V}eNDP-wVkj< zBzEM@6vG?Wne9CHBf;xe8QWC-=2hkcsZnrWknFJLUt{mFI5qzs>xmJ`6@UD(pnv;M zX)QfATHTAW(4c6hc;r+w?U0ibv%rD1DI(al`@GikZknN_CDmG^<_1Gsf~F)+%+&PY zt!8Y;fSU{T0U+eoZzHM5kbg_?^bua^OuPB_w=Z9ndXwU?yEf0;FZ+U&w|KhnV+1&y zp5n1kiT8wyR=XRWY<%~Z=214sc-Hu<&0>GF>eO-{p2vQ_DLH_sv!tG0i4id6*WKi(|16k3;XL|>WrP9H-V+jcogieu2uU)e?drh zsr-(sxCz_``TQqQ)kGZc0*-F$gAA;Z_s&?I6jKZ{oIl(0>9`!%^(7%7;4JI|B$-5KGOv zx!088pi%ABTRM!)jo#>$(s`NeazDeb&Ux4VMAY-!OuT~;ZkB^wxVANqOV4h+s(A7i zjl@j}fgJ9iZS}bKDj2x;20PYMggg7+%W_S^OrpUhMVx72a&?~43xFV$+L9Rsrpkj% zBZ$7FU6bJFRm+?zoug4>S1#fkHfSj85!V&0&yd-%qk;*pEG8vq&eLkpV_00aNhnSayp92i}B$)gW>j0 zh=%cq`OEp5XM{ZpgD*c$3tr}MWZ-WwWWe{WY3ue_QbYADN>bGYMK{%QA7}d6*wjI{ zwpW-t{sV_=f-XhOa#$aM21meO+=z3=VOZ{|wBV^J6Yg)Vda*cW3rRq5$;j*zVR0CNTS*rFXhRGx-QlVt? zfc&1NK=Km-w;$8r-$V*KJ5KYl%fP_8R>RNMB@y7MLFO@1f4Wt5`@xY@i7+!jPV_(&(!|qx93p$|}#W_!>O)QTc)Q*~S@loZ0H{x`TQ_9d)`7 zhFX#Y5EA~B$3{#ki(7Ug^e#eMUzYl5^rA0Bi860ARm`x>eLD1R&b&=d_El@?b`fKz z;v+laJs7UN*&TKcEAz8C(9n7d>?}I@ipI622R&mPSZ6|i1%!PLdl zNd^3=a=T~!*SZe~;$BYNT^aVX+0Y;lzbY?>N3J;+)cR`Q#ihB?g(w&P4oKz}8HBVm z#Uq=UfGUN`jp}$SS!Tqy8^wHENPF4@^8oZ97?`)6!{G#E(su|vA+RWNq+P8b;D!zVx>^$bZ zqyvA$*+boX94vjD$qRd**B0zY>F6`Oz@(g^t++b+(IfLYgQZ>lKuvZi%~{LsbJ-BV zryVtHZigE_d7;n4wJ;LI1$Tsej}Dvk7BbEy>LF9s5kJMz+>WgSgR`eNM&hK?H~6W{ zT;ejK!$a83wk$QJGZ-_JD;1`D;4?^bMD@(3~ zPQb+2?>@ku*Ho%VodVX+qBD&La4n<76H`OOPba`SyO_Dp)fI?X9_pk1<8Q=fzi3`Y zoj;gVwA-UECwx7Qm~=ZRTVnn+`)NurbLvx@BMx_<`}n;k*oBDgH&Qx0j@72xKOe`U`p=N+xzyxG#&AI1{F~5l!a0Kb=i@? z?tlKFtuD33YtF^-^>^+SJSS!~#X{@&qCb|z zFJ#r9i!zS}{TXa|(%Hsq<>0R#tbt8e4Afh(at<{bqh{p;D9HE%_?G0~?VC*FF#EH8 zOo|Sky6&Ejdm8nCw?qENRX8b?w|!G|9LBVm-SP7qDX7ZkkFT#ESMxYa*?!4=45qTg zN_%BtDi-^ue=m(YBw(=jBc*}o5O1qjs+jO*1>2Q^Cges2q~k7p7VFM8y_QBnjO-vT zYA3MoP=K-(gta0@pr#|DjM6(lh>4C;;{tPtB-S>}-h+!$QreX*tZGgO+c{87yfkm*VugnkSzt>V)a%lu7rdy$weS=mzE zw}7_64$mzY#tyOIf3=;ERp#oJ7?he=fTI{(?&rX!Q*30_2X@V2pb^uFgR*>M%PY`UF)4 zMpw{!kYf^=sktX#z7z@uJQ48Ww@JBzFEy79((F*j$k*jpOHH=AdQVGw*yoTyaU^Z` znF7SGS;U3OPv0fact3itp~13>#SLU(C&g+#Hl1_hv3eZ@UnS&Tn3s!g2L11`q6!(E z{uaFxC=3$`^p*a0Zm$S(e%%DD0zk9<^h&Z72yq)xRNB0{LCM158!g)|3|LCP*Cl^` zqx*;B=HMWd+Vi~jCaLEqC6x@>a?$pddbETG?oDFqo9wga#{OfBDY%^nH}_yO>FF>jBvk2}8?&65eUl1ni{7a`C;-A%E!^kylOyI^m8vS9_l5e=EwI`a)pKy z10>_UFJrfV5r>c118olosP@18J2LkJw1_03V@r2;#Psi=d3Km;Eo7M=P_g;6(_Z4TLam>9?;VG_u*g#gLQcfw8o~AX&xg8&L4~Lfy!6O zdbXqsw%_|lSI=di{oAZzBjV0kUwNRFDaCo0SBKL&Pc02zWw0|zXCs~rrG1eL2S+$R zXSS|m@ax7e4PtW2SK~*Fb}-X$rrR$BOgJlC|DB zf=^v!(}j{tjzTmRif{mGVMa}?UroukRsS?Ki4bkir>?x-6G;fa4~eu*-u&4PvUbFh zlBc?Br(g%|FRj!SE-BV(vt9q(%>=)WZ@KN~KGyX(YXsib-yI4J@3q&LXM`h;Qe9MMuT@hV5#7uC8%oV!9SEdl$; zx9(F1&#m+Ij(ivpFlRTtIP@EAKM{%82`~RG5)oka+S(MDpny-H?4{NlHPBV#A>M_~ z-W)QsE$>eTbm80qwerLfPa9WTT-6-N|1)C=lA0Ae@_O{ zHe=sP2CVL=Tb30;kPGR2KcCGGa3g(|!i;vc?I)x(sbN#UzQQkEGvJc=4FcEwgIF zL;8RAAP5PGH*Jv52`;W^VjNP=!#?7;BxJ|0b>C*%1xyX;6F;a(dOVfIi2eb%G|kr| zAYqH5-;|s?WR%@Wj;C{KqS;k49!0&rdhL3Qa_+s;^+@x}$MhJe;^(}l3P9Ngg-4E9 z=VyS>KI|C=PJ$%haRjnCyqR&F?@87LG0>K#00N;)DpT-sc3@7VUbWc$K!ny-qJ`3I ztc8HyaOADvoH67;iD?)@W_CkFzBsDRcv|drj1vp(kgeCuLCa-RevX4&gepIr?8#i; zv)NbSa%S5!4)6jVigWQhQFQm*9>vRB#1-;BVK&Brh)u7TuZjL4c`hx7OBx;-)9O%ffxYL^4%kw9b9RTTx*R-m`!c>epB) zg=W_gGFe6VZoFnQ)+(0L2W%4eqM4rY*hg|X6r7yBO-ZQB>lg>&hGnnZmrpbA5w{+c z5?-qL`S~k3CAD}z4w#Vk!MESNI$ZHSDLvyL^^^@nKtN=AQ|2RpSED>wu7@GbSpN`x zon`yrn|hPT)$yK!oMm&=sI|LLq4`pZ)k2swqR_HDbmOvMzAVcPR5yYwYJ0+z~x13(f)}B2_l-6b;zmFWPS|{pb&yFAgCou z@C%>A4)FTx32K{AdpM%bT>@{IR6=Hqz9VKgfk7Cui3G+=z+tW=cqx`ZiXGZFFt0yGf5W}jRr%6@ z@+Eo%`|3&79tl+L99ROmZ_9T;HoCW>89`JGCEWZ0E=Iyg;*kVO z;+ce#gu87XDlE0zw8ame9U`)()UrE zycL)wLjK&(Cn8F~W|l1a{v+GCV-A$k*#0SD=pr9x&akido7ihu#m_-Zv2djG$s!y$ z8L%mEKamvSsJ?%Pgyjs~2*Il9H#>{n*zkQGfY+hL1^cu@4ZLwEivE{BwhaVh%J#0k z@ofXE0HgH+I%Q%_X6~e})jf#ll@XK6>5?C)^`Sk|T<%oEPxt6o9f!QI4Bb6(gjqh$ z-o>do23`ZN&6=(Lt>rmL(A8f!9T*V@c#SH7RZv>8SkX|RM!59fKtdHh#N>T*>qQOn zMqzpq33q^4iC7^Hde(4WF@c-;Q~n%%S|*sU$)9&D@4A!whG5U(g|^)p;`Uj&Uc>en zk8Dei+NGP+ol!0wK~SrgVGJ~TmaMU=##B;{^4na}{im>@L+Wr`s z#&Egl$DE8DAi$B+5WeL# zkq3cd;L9rTwl02vdtitR0tmU>sLZ?Ywvsv@J!s9lOtJs-Wp<@zO+Ef*-Q6~@zoe~r zt4o8?gsY}!MhAt;IT3qn|E6`nMmoTKtdOsFISK)&gZtcSFd!T8my1DNj|~>H)GE0# zs&Mw53ZGCSdxGu|^jRlj1(XA^bDWP!Cc(em27neXTP%c);p^XN{X%7lwwWhqlEVUBVXlqMJrG;SHSm0I!VVaU<$l1cfh_>3%|I=C_z~>=Az~M{NeTQMl=C(f>04zqg z_5FX2LjNK)32^T!UHKWAHzj%7CeaAwrii$BxOcnb4*&JwHw-8nqSGBJo^((ogwZHoG(^hRH8ALt z#ecgtfzC2`4b3A-+z~Rze$7Zgdsi0V=+z=C=7hs=TaJ0jPoV zfgf+Mhsw*Y#5+>a|ACZl}&8`NcS}oJfbGL|I8?rXrRNK#Nr%`fvCw;0xW3{|H*@zpX;Oqq7FS;V;dL zp7H1m(^SFC_7Pq3^e)amp(y=GrGC11X?q??clk~RfF?phP;5r0|9Ts<-mFNzMtCtB;7{yYDmGxE;v<{`{Bm*{(VU-pBzw!gH? z^3(8yI8IMZxj-`7dWTKL6&RL2bpfo*Lvb0)+_3o*YCcSaNC*> z1o*)8BjJ@KXo^Ld=Bv}cOWwyF-e6wnuP}Z6e{LFV&(3>8B9x!>G(O8}aWX@4NHor zukG%tVUsWHGZc8doETkWxIh{FJ88vcfGRg#7LFNkaNWyv!%>v(dv8Bv8NeYut*m0& z)uVz5s&>G1jMENfhY9s14Z(6qq0yq7)OPjMmq!W!Se8Klm|~qPz*A8MNWS^Q3Z7qn zmSi)99qKFqN~913m{N?if$PNLb3-?%97AYRcJ$$@AX_|?0C#h$r#@c&Eg;JzzZ-}L zW+vs}XxAx42Wfkgf$nbN3*1f35B`UNsI{{pUfAd60M73Aj;kIX9uCf~Rc;EKFA576 z?q*+u&)!XOu^9xPur;e-Y{BoI#4TM;y6Q^gsd&s2&nPYs#4`IV`)@0C<_-B<<|fxx zNp!HYXBOVOmA_(*Gdn&aam3ept&al}Vp+7B>Wd-cJ^zYrFgw>3`-SH~4SpbTS^B0! zS;j7WHRs)t5@^SuksXe0eg_Ha(*D2R!z`yS1c5mD#zF_be zJ-_w>S7uI2Z%ns%EeR^uQPnf=U+?&ItHqe4;GpJn$O-`bcoOOb>!s>JrK{`2PN8}o zeVdQBzLWM>%+%&GgCs zwUC+3jI{GvB-0CcPhJ(^mW&qZ*UGAu&klWm|6asuU2-ry1Obt=XIdq{kCWkBh6hJU zb@$c01B}39h=w{!oGy6p2#KXz7{0lrv-(LkceAD{pzA!fCl&3zMfZKyZc}BXiKS zXhtU4UPxDQmxv1+SClvoVwX9zV!-Gg%BB0KUdN@DL=gx zSv(R8Ea}#0igkUZ7>A-eMFSvxDSRN;9<5`vX_lJCmM$DG$=;OR5j+lnl^l z3gz$iqKF>RL~+yk;fUS?8kX(lU+3cx=}nw7;{Nms%gQrG+nQF(Ett8Qy`LhzIm;&s z@pRTWwyCdAN&xq$JJIB9H5`eM@n&&92r`KJ70{(C$3blBr<7@UyN?bYks_n+!=KZ; zgqq0dX0b&f2O_fgg^x&uN}C8&;X776nFL5KIljr*kT@CZ)XWOE-pv?gM0Z}O7W1om zkQr5A^*swbvwg|FY~=M%I0Jx+}f%&7)J5H4a03szsNj>NMaz zETZ!Tod^t9^9^&5xY>7Sf8PznWZro#@as$en=F+;o57n@{&CP6MWY)fG>|we%%c)VE0Ya#Gn{KHl1JU4C15YXD5ea@4h#AJxnvC@m0pw zDF7>=z)#M+T;=xRBlW;*?YK$~B9^bentJGjzRy%SnGdJ3fq}9SP!1R-fm?5IC7vc> zTqIk`nn%J{zIyWHcsoET0Y$H>k?%zGN9Cb+^2K{l0TfVadfR2Zo%>wmxAoGI(RyKw z^6_Q;k9av=043^56Uw5Znni-pgV{2csUHH|mn?O_lcJ0vw=lF$Cop-{=fa_&h{YrD z*lOz9SD97{8ug{#k$_;k+~IpKn5p{O>5eq7aUJ?j2uvQHf!#1?d&h6FNM}8~0-rFY zcx~)#&$~o7hq3Oqj*k}ZDDL$Fm?|7;W?K74`tzK;RiE;Pw2U9NQ`fF%zMzliF>$hnC+(7!83ZyHcul(_;d)=`?zC!1WP~aTw?GTHfsXD{H-VC-L4&FA(gh z&~3L1?FWHHma7f=&~ro9Z)L@Xj*R}Mw};aX0bjd%pO z1?igk1PI_C@zotJ+wi;W5Ug<-7xplO$ZnTVThD?F0b2PthWsvP`dJuukpUcCc%Uw5 z83ElJyzgv-Z+SDhrl_uQ44|R7IN$JVKaoMaXL7db5Q@KQ*UFm0;VX6nSI(KFl=6nP zQu+ixiAM3;Q1-*iU%v)R5Hh|Pt-P0JpG`hj%d2)?ZYcYCVg0MwIr)WH=2*9nKfk3l zxFLO-a;|FAuRtK%pI9lq9J^xX5xod4Dbf6m5vtr5&qE-c zgH`X=>3iS8MBxZMXu6rrVu7-m+os1O6jH;+gEMQ$kzL+#;42Vy#S6e4*|bIHn5iMW9XMr<967Dg>`;)~Qnm6);fOC_kW4 zT?&6l(o?cZqT;NI4gEl1m20bGuEo^P%>KYQl^8Rnx0Qs3G&$ z87fe|<5NGL?TpW$fzLzH8^#k&8m5Wfx4VZmULmnYuffuK=>IGdugVW|Mi|KL=RS=P zBJ1_xBroB)_rT}2icg^fA9}uprP4Wf-|@EX7k@#_&dy6)ka)8saoZ%6G+xo|muOi! z|C+r?W@h!nJOoOJo)rAiR$Rv=mu&v&XbgUb*7OUTi>+v;0bF#AYD+gxcpq16y?RqC z&J>vcl9MT5M}&lBw^g)C$7l+_D<|C^Y`Eip%Gv*|=417qi8W0Iv&yXNG2gwGcNJT5 zr7fl^a%Eu0n345@uMVC++xJcV4mi8{xKSQ}D3SD~>Y>&(pG(~DO?}L1x3-T9jNO&s zv83&0r*gQh#veCI3SLRLE&plNQ9@fj{>KIWI5~@-oXX5D4r3r)Ct}qv9oud2u3E%O zs}8Lbjc{l<98Hy8-rAJvt*dLi$WsOqWBMOsyh%_dd=oVx;sa4HW=HHTZRlxeZ90yuYr=-@*Y&0HR|>j=Tcz2BU9 zHDwrAVw(e?Pd)c#_xJXI$T{H;A3#+B^5i)tY2sD35}fs{hH$0sbFzqcf5S(_>tx^! ze$d&f43gP^OJM6N`Hoq|hl`Xt-N|>M8?*$ozT$R(qUyybs8{h4kHB^u1m5r;zCOSB za3EvR?8_oQ1P$%r>3q1R@RM5Z49r0@>sNSIiqmJiq-msWrx z!v3qUefXEJ%Gf_x^w^BYz>&yO_OI+Tbbj#_M2$ZrUyg-F1)DUw1uptp zSgoxzy5Xu1V4kypZRf3cC+CZ+ocTDu@7O9O)eob(LKMNoE0W6^*crBPLg<*Pcc1kmtr__5+^-??Dj~j9Rn*jkMVn&3m zYJ)h%Di%vGHKwj;v=)}n=W&_=Y$^^_uzWSEe##cm5SSj!hbJFxVYzbyti5=NpizRP zDAMCFN7r)p8rj*wH=T%c?N0vfG+2fd(WP7!rg0DMrZcvUM3{?k7)<|Cyy&S%g`Khw zi*fWyxn3*~7bK~iAN^ZR7`}IZDOq}?udD6Cu9NfmP{q@ia1DHwx%`y4Emd#xfyIY! z&%}j@6lPZ+SUh8ttNLeM21W=YSy-*`38jKh1!up1K9Pg=`Jd9j3hl-^da8VPxl~FC{Y;2nR)lc8bYVn84-kN|x zA#rVEbm!)1lEdhW)fSz*B^RuP9B@LPx13trve=Y%+8K2a8eA}d`mbhT4+KM^zsgis zKfKR0Yx5c!l|)%1(Du`nCuBgOpw3}*^7m*Zi4W@X55he}F!i+Em-WJuIIJM*;xL-9 zJ}MMZLY!5+qyu9;vguk`@T+i zI70U}-9}oK6!E`>Dc_?zUt1_wr4Vw(K*e-sLS|c%^d> zq#&G&r3lM3L2{>9*>=$45G5nL2eAX0Lzxw1i|5}pz$nVe!vm+9HFQuI6h1^@ecZx) z)6MDCkYo6+^v}!LdWun}6bpGj5KpZ$I{JO)7zTu=Fx0>}pU^8xP;dkhoe3MRwO;;* z2L_e}KKHyzi}4r(!H>E)S*+2UFrEF^xZ~qExg{k^zrh5-I@oR{QP9y=3GicJm~t{X z5S5KV(Cb%+1mz*%^^#GE!!y2)li}o`es}+Z6~eB-3V@Ynw>=(c2OBtgZwz#>=dzAZ zO?6u?>9o~cR=AGWy~l|G?Smd;;nCetrCAFHMR2NiQ%P}4N>Ds>jG&6)d-J^tOBEmP zPtG^Eq=0jyr?8vj64!R`vnRjY?JtB}MeK{8TRC+Ydy2al*HF`nO) z_*}m%$@Juq1B>tF)ssf2ktP7$L@TLAo-fk?evJ0X=R4YzHsgw4FO#<9DiA7AtM{^G z4}D8!R+!RIu2W|WjIit#cq+`X7AtX*^gyk=fE7iPoUy2IvgXlKV%`}OY6JBj_xkLMvM1>;-3E^Nuj-oH}BS(!v%!QKi&$Wm3f;R|&V zAFfxvDhg;I--Bf;cRBva3TA-Bn^njmE!T=YO$Wr{1Au9OHTsHmot6(yEVOC=JwuPV z;r6S+?9IldhgRXaKsf2`F%+r0X_L3DlP0O5qDQ4-7MO8lbY7sRc8RwE(+#vNk`++t|A^N4i7^ezPCC?j zftdCdXCu@vBp|Gv0jRHm#{jg?HB@7NkXz`PL$!7zRQ$dtr{b~8$m8Q`BVK?T!GW2A zO%mpp@*ntFrmSLBQE}-og{4wl(g9iI4NsFZ###vIc<%8{n}gW_9ss%y5bm-g<){xI z_r63U=T++)*?Q5qmzRwJ((KnkLAR3XS0Bv~ObkEy<0;DRLMgxfWe!LV^I}Olr6+=b ztgyF}30D+wr2Jw;l8>j_Er~!fa@c*YXh@?wHU>}&hhl-B7Syj7jXQPg15p8=+r)a2 z<73t_0pbxy5%o-QUmyEp)F{qC%?p~1QiTXd;39}U9OrR}7Kx$S!Pp`;Y(fGDyS8=Vom92$#RMggnGJ+9YLx2FJ z>v)=z*2T-nmU#^HTDs=-^d`@0C(7dK@*e4lBjBVZU>tZKR3@#DZ72Q7NN5ff`OE1U zsKqE|+M9j6mLvxH6QJhtktT>|aSRW4d^|+61M1@+H_<;;_aNlS8*XChR?q9}Q7DeZym44$#2;-sKu^09Cm zrm?qQyMssU5 zRy*bV1jJH(iDYmr8^vmZwNp)fT9L%ifJA^|X&$cQqE;+Dm z+O3Twmqba=;d4@$FVB(sBOsP{WCKIR{qv&hp?Aw>#6a}fYWB_-hl5rrZq8lQV*hw1 zGqN>!vCrKa&F|2NmOS^}okvHHt9=MUK@*u6IM{;FKZ@1&J=B!_qNNxM9$0k%Um=k> zx4+Y%m4*w0Es}BQmi6Ll;z;EEM?F*+N4ye5JKh` z#*ABKSZv5kGQd_sGve-pOPc`+R)X(LG=P`Xx!}g<5X{d z%b*yk80gn0_ZZ3V6`uSB(XykBW?oW){1I}KdvJMToi+3njO_`P_nwvaUQ&R*>qg^# z+jUvu(*^Hi5G$tfW+Nrw=S)yN$Le1c(_wp(<#x1ph9AWz+uX%U!4CodR1`GjOJvRb F{vRPR)V%-z literal 0 HcmV?d00001 diff --git a/VisualC++/ExerciseBook/07.33/07.33.vcxproj b/VisualC++/ExerciseBook/07.33/07.33.vcxproj new file mode 100644 index 0000000..5e600b6 --- /dev/null +++ b/VisualC++/ExerciseBook/07.33/07.33.vcxproj @@ -0,0 +1,87 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {82288C1F-279B-4FE6-AC8A-18B4FDAB7BE1} + My0733 + + + + Application + true + MultiByte + + + Application + false + true + MultiByte + + + + + + + + + + + + + $(SolutionDir)\..\Status;$(IncludePath) + + + + Level3 + Disabled + + + true + $(SolutionDir)\..\Status\Status.lib;%(AdditionalDependencies) + Console + + + + + Level3 + MaxSpeed + true + true + + + true + true + true + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.33/07.33.vcxproj.filters b/VisualC++/ExerciseBook/07.33/07.33.vcxproj.filters new file mode 100644 index 0000000..e83b99e --- /dev/null +++ b/VisualC++/ExerciseBook/07.33/07.33.vcxproj.filters @@ -0,0 +1,59 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + æºæ–‡ä»¶ + + + æºæ–‡ä»¶ + + + æºæ–‡ä»¶ + + + æºæ–‡ä»¶ + + + æºæ–‡ä»¶ + + + æºæ–‡ä»¶ + + + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + 头文件 + + + + + èµ„æºæ–‡ä»¶ + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.33/07.33.vcxproj.user b/VisualC++/ExerciseBook/07.33/07.33.vcxproj.user new file mode 100644 index 0000000..ace9a86 --- /dev/null +++ b/VisualC++/ExerciseBook/07.33/07.33.vcxproj.user @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.33/CSTree.c b/VisualC++/ExerciseBook/07.33/CSTree.c new file mode 100644 index 0000000..3a1f268 --- /dev/null +++ b/VisualC++/ExerciseBook/07.33/CSTree.c @@ -0,0 +1,76 @@ +/*=================================== + * Ê÷µÄ¶þ²æÁ´±í£¨º¢×Ó-Ðֵܣ©½á¹¹´æ´¢±íʾ + ====================================*/ + +#include "CSTree.h" + +int count = 0; + +/* + * ³õʼ»¯ + * + * ¹¹Ôì¿ÕÊ÷¡£ + */ +Status InitTree(CSTree* T) { + if(T == NULL) { + return ERROR; + } + + *T = NULL; + + return OK; +} + +/* + * ÅÐ¿Õ + * + * ÅжÏÊ÷ÊÇ·ñΪ¿ÕÊ÷¡£ + */ +Status TreeEmpty(CSTree T) { + return T == NULL ? TRUE : FALSE; +} + + +/*©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥ ͼÐλ¯Êä³ö ©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥*/ + +// ÒÔͼÐλ¯ÐÎʽÊä³öµ±Ç°½á¹¹ +void PrintTree(CSTree T) { + + // Óöµ½¿ÕÊ÷ÔòÎÞÐè¼ÌÐø¼ÆËã + if(TreeEmpty(T)) { + printf("\n"); + return; + } + + Print(T, 0); + + printf("\n"); +} + +// ͼÐλ¯Êä³öµ±Ç°½á¹¹ÄÚ²¿ÊµÏÖ +static void Print(CSTree T, int row) { + int k; + + if(T == NULL) { + return; + } + + if(row==0) { + printf("\nµÚ %d ¿ÃÊ÷...\n", ++count); + } + + // ·ÃÎʵ±Ç°½áµã + printf("%c ", T->data); + + Print(T->firstchild, row + 1); + + if(T->nextsibling != NULL) { + printf("\n"); + + for(k = 0; k < row; k++) { + printf(". "); + } + + Print(T->nextsibling, row); + } +} diff --git a/VisualC++/ExerciseBook/07.33/CSTree.h b/VisualC++/ExerciseBook/07.33/CSTree.h new file mode 100644 index 0000000..6f30d18 --- /dev/null +++ b/VisualC++/ExerciseBook/07.33/CSTree.h @@ -0,0 +1,53 @@ +/*=================================== + * Ê÷µÄ¶þ²æÁ´±í£¨º¢×Ó-Ðֵܣ©½á¹¹´æ´¢±íʾ + ====================================*/ + +#ifndef CSTREE_H +#define CSTREE_H + +#include +#include // Ìṩ malloc¡¢free Ô­ÐÍ +#include // Ìṩ memset¡¢strcmp Ô­ÐÍ +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// + +/* µ¥¸ö½áµã×î´óµÄº¢×ÓÊýÁ¿ */ +#define MAX_CHILD_COUNT 8 + +/* Ê÷µÄÔªËØÀàÐͶ¨Ò壬ÕâÀï¼ÙÉèÆäÔªËØÀàÐÍΪchar */ +typedef char TElemType; + +/* (º¢×Ó-ÐÖµÜ)Ê÷µÄ½áµã¶¨Òå */ +typedef struct CSNode { + TElemType data; + struct CSNode* firstchild; // Ö¸Ïò³¤×Ó + struct CSNode* nextsibling; // Ö¸ÏòÓÒÐÖµÜ +} CSNode; + +/* (º¢×Ó-ÐÖµÜ)Ê÷ÀàÐͶ¨Òå */ +typedef CSNode* CSTree; + + +/* + * ³õʼ»¯ + * + * ¹¹Ôì¿ÕÊ÷¡£ + */ +Status InitTree(CSTree* T); + +/* + * ÅÐ¿Õ + * + * ÅжÏÊ÷ÊÇ·ñΪ¿ÕÊ÷¡£ + */ +Status TreeEmpty(CSTree T); + + +/*©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥ ͼÐλ¯Êä³ö ©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥*/ + +// ÒÔͼÐλ¯ÐÎʽÊä³öµ±Ç°½á¹¹ +void PrintTree(CSTree T); + +// ͼÐλ¯Êä³öµ±Ç°½á¹¹ÄÚ²¿ÊµÏÖ +static void Print(CSTree T, int row); + +#endif diff --git a/VisualC++/ExerciseBook/07.33/Graph.c b/VisualC++/ExerciseBook/07.33/Graph.c new file mode 100644 index 0000000..131d209 --- /dev/null +++ b/VisualC++/ExerciseBook/07.33/Graph.c @@ -0,0 +1,244 @@ +/*================================= + * ÓÉÌâ7.33µÄÃèÊö´´½¨µÄÒ»ÖÖÎÞÏòÍø½á¹¹ + ==================================*/ + +#include "Graph.h" + +// ¼ÈëÊý¾ÝµÄÔ´Îļþ£»fpΪnullʱ£¬ËµÃ÷ÐèÒª´Ó¿ØÖÆÌ¨Â¼Èë +static FILE* fp = NULL; + + +/* + * ´´½¨ÎÞÏòÍø + * + * pathΪNULL»òΪ""ʱ£¬´Ó¿ØÖÆÌ¨¶ÁȡͼµÄ³õʼ»¯ÐÅÏ¢¡£ + * ·ñÔò£¬´ÓÔ¤ÉèµÄÎļþÖжÁȡͼµÄ³õʼ»¯ÐÅÏ¢¡£ + */ +Status CreateGraph(Graph* G, char* path) { + int readFromConsole; // ÊÇ·ñ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý + + // Èç¹ûûÓÐÎļþ·¾¶ÐÅÏ¢£¬Ôò´Ó¿ØÖÆÌ¨¶ÁÈ¡ÊäÈë + readFromConsole = path == NULL || strcmp(path, "") == 0; + + // ÐèÒª´ÓÎļþ¶ÁÈ¡ + if(!readFromConsole) { + // ´ò¿ªÎļþ£¬×¼±¸¶ÁÈ¡²âÊÔÊý¾Ý + fp = fopen(path, "r"); + if(fp == NULL) { + return ERROR; + } + } + + Create(G); + + if(fp != NULL) { + fclose(fp); + fp = NULL; + } + + return OK; +} + +/* + * ´´½¨ÎÞÏòÍøµÄºËÐÄËã·¨ + */ +static void Create(Graph* G) { + int u, v, k; + VertexType v1, v2; + int weight; + + // ´Ó¿ØÖÆÌ¨¶ÁÈ¡ + if(fp == NULL) { + printf("ÇëÊäÈëÎÞÏòÍøµÄ¶¥µãÊý£º"); + scanf("%d", &((*G).vexnum)); + printf("ÇëÊäÈëÎÞÏòÍøµÄ±ßÊý£º"); + scanf("%d", &((*G).arcnum)); + + // ¼Èë¶¥µã¼¯ + printf("Çë¼Èë %d ¸ö¶¥µã£¬²»Í¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º", (*G).vexnum); + for(k = 0; k < (*G).vexnum; k++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(stdin); + scanf("%c", &((*G).vexs[k])); + } + + // ´ÓÎļþ¶ÁÈ¡ + } else { + ReadData(fp, "%d", &((*G).vexnum)); // ¼Èë¶¥µãÊý + ReadData(fp, "%d", &((*G).arcnum)); // ¼Èë±ßÊý + + // ¼Èë¶¥µã¼¯ + for(k = 0; k < (*G).vexnum; k++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(fp); + ReadData(fp, "%c", &((*G).vexs[k])); + } + } + + // ½öÔÚ¿ØÖÆÌ¨Â¼ÈëÐÅϢʱÊä³ö´ËÌáʾ + if(fp == NULL && (*G).arcnum != 0) { + printf("ÇëΪÎÞÏòÍøÒÀ´Î¼Èë %d Ìõ±ßµÄÐÅÏ¢£¬¶¥µãÓëȨֵ֮¼äÓÿոñ¸ô¿ª£º\n", (*G).arcnum); + } + + // ¹¹Ôì±ß¼¯½á¹¹£¬0ºÅµ¥Ôª´æ´¢±ßµÄÊýÁ¿ + (*G).EdgeSet = (EdgeSetType*) malloc(((*G).arcnum + 1) * sizeof(EdgeSetType)); + if((*G).EdgeSet == NULL) { + exit(ERROR); + } + + // EdgeSetµÄ0ºÅµ¥Ôª´æ´¢ÁËÎÞÏòÍøÖбߵÄÊýÁ¿ + (*G).EdgeSet[0].weight = (*G).arcnum; + + // ¼Èë±ßµÄÐÅÏ¢ + for(k = 0; k < (*G).arcnum; k++) { + if(fp == NULL) { + printf("µÚ %2d Ìõ±ßÓëȨֵ£º", k + 1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v2); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%d", &weight); + } else { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + skipBlank(fp); + ReadData(fp, "%c%c%d", &v1, &v2, &weight); + } + + u = LocateVex(*G, v1); // »ñÈ¡¶¥µãv1ÔÚ¶¥µã¼¯ÖеÄλÖà + v = LocateVex(*G, v2); // »ñÈ¡¶¥µãv2ÔÚ¶¥µã¼¯ÖеÄλÖà + + (*G).EdgeSet[k + 1].u = u; + (*G).EdgeSet[k + 1].v = v; + (*G).EdgeSet[k + 1].weight = weight; + } +} + +/* + * ²éÕÒ + * + * ·µ»Ø¶¥µãuÔÚÎÞÏòÍøÖеÄλÖà + */ +int LocateVex(Graph G, VertexType u) { + int i; + + for(i = 0; i < G.vexnum; i++) { + if(G.vexs[i] == u) { + return i; + } + } + + return -1; +} + +/* + * ´Ó±ß¼¯EdgeSetÖлñÈ¡×îС±ßµÄ¶¥µãuºÍv£¬²¢·µ»ØTRUE¡£ + * Èô±ß¼¯Îª¿Õ£¬Ôò·µ»ØFASLE¡£ + */ +Boolean GetMinEdge(EdgeSetType* EdgeSet, int* u, int* v) { + int i, j, k; + int min = INT_MAX; // ¼Ç¼ȨֵµÄ×î´óÖµ + + // ±ß¼¯Îª¿Õ + if(EdgeSet[0].weight == 0) { + return FALSE; + } + + // ²éÕÒȨֵ×îСµÄ±ß + for(k = 1; k <= EdgeSet[0].weight; k++) { + if(EdgeSet[k].weight < min) { + min = EdgeSet[k].weight; + i = EdgeSet[k].u; + j = EdgeSet[k].v; + } + } + + // ¼Ç¼¶¥µãÐÅÏ¢ + *u = i; + *v = j; + + return TRUE; +} + +/* + * ´Ó±ß¼¯ÖÐɾ³ýÒÀ¸½ÓÚ¶¥µãuºÍvµÄ×îС±ß¡£ + * ɾ³ý³É¹¦·µ»ØTRUE£¬·ñÔò£¬·µ»ØFALSE¡£ + */ +Boolean DelMinEdge(EdgeSetType* EdgeSet, int u, int v) { + int k; + Boolean found = FALSE; // ÊÇ·ñÕÒµ½Á豧 + + // ±ß¼¯Îª¿Õ + if(EdgeSet[0].weight == 0) { + return FALSE; + } + + // ÏȲéÕÒ¸ÃÌõ±ßÔڱ߼¯ÖеÄλÖà + for(k = 1; k <= EdgeSet[0].weight; k++) { + if((EdgeSet[k].u == u && EdgeSet[k].v == v) || (EdgeSet[k].u == v && EdgeSet[k].v == u)) { + found = TRUE; + break; + } + } + + if(found == FALSE) { + return FALSE; + } + + // ÕâÀï²ÉÓõÄɾ³ý·½Ê½ÊÇÖ±½ÓÓÃ×îºóÒ»Ìõ±ßµÄÐÅÏ¢¸²¸Ç´ýɾ³ý±ßµÄÐÅÏ¢ + EdgeSet[k] = EdgeSet[EdgeSet[0].weight]; + EdgeSet[0].weight--; + + return TRUE; +} + +/* + * ´òÓ¡ÎÞÏòÍø½á¹¹ + */ +void PrintGraph(Graph G) { + int i, j, k, w; + int adjs[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; + + if(G.vexnum == 0) { + printf("¿Õͼ£¬ÎÞÐè´òÓ¡£¡\n"); + return; + } + + // ³õʼ»¯±ßµÄÐÅÏ¢ + for(i = 0; i < G.vexnum; i++) { + for(j = 0; j < G.vexnum; j++) { + adjs[i][j] = INFINITE; + } + } + + // ¹¹Ôì±ß¼¯¾ØÕó + for(k = 1; k <= G.EdgeSet[0].weight; k++) { + i = G.EdgeSet[k].u; + j = G.EdgeSet[k].v; + w = G.EdgeSet[k].weight; + + adjs[i][j] = adjs[j][i] = w; + } + + printf("µ±Ç°ÎÞÏòÍø°üº¬ %2d ¸ö¶¥µã£¬ %2d Ìõ±ß...\n", G.vexnum, G.arcnum); + + printf(" "); + for(i = 0; i < G.vexnum; i++) { + printf(" %c", G.vexs[i]); + } + printf("\n"); + + for(i = 0; i < G.vexnum; i++) { + printf("%c ", G.vexs[i]); + + for(j = 0; j < G.vexnum; j++) { + if(adjs[i][j] == INFINITE) { + printf(" -"); + } else { + printf("%3d", adjs[i][j]); + } + } + + printf("\n"); + } +} diff --git a/VisualC++/ExerciseBook/07.33/Graph.h b/VisualC++/ExerciseBook/07.33/Graph.h new file mode 100644 index 0000000..859b43c --- /dev/null +++ b/VisualC++/ExerciseBook/07.33/Graph.h @@ -0,0 +1,71 @@ +/*================================= + * ÓÉÌâ7.33µÄÃèÊö´´½¨µÄÒ»ÖÖÎÞÏòÍø½á¹¹ + ==================================*/ + +#ifndef GRAPH_H +#define GRAPH_H + +#include +#include // ÌṩºêINT_MAX +#include // Ìṩ malloc¡¢free Ô­ÐÍ +#include // Ìṩ memset¡¢strcmp Ô­ÐÍ +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// + +#define INFINITE INT_MAX // ×î´óÖµ£¬ÓÃÀ´±íÊ¾ÍøÖеÄÁ½¸ö¶¥µã²»Ö±½ÓÁ¬½Ó +#define MAX_VERTEX_NUM 26 // ¶¥µã¸öÊý×î´óÖµ + +// ¶¥µãÀàÐÍ +typedef char VertexType; + +// ±ß¼¯ÀàÐÍ +typedef struct { + int u, v; // ¶¥µã + int weight; // Ȩֵ +} EdgeSetType; + +// ÓÐÏòͼÀàÐͶ¨Òå +typedef struct Graph { + VertexType vexs[MAX_VERTEX_NUM]; // ¶¥µãÏòÁ¿ + EdgeSetType* EdgeSet; // ±ß¼¯ + int vexnum, arcnum; // ÓÐÏòͼµÄ¶¥µãÊýºÍ»¡Êý +} Graph; + + +/* + * ´´½¨ÓÐÏòͼ + * + * pathΪNULL»òΪ""ʱ£¬´Ó¿ØÖÆÌ¨¶ÁȡͼµÄ³õʼ»¯ÐÅÏ¢¡£ + * ·ñÔò£¬´ÓÔ¤ÉèµÄÎļþÖжÁȡͼµÄ³õʼ»¯ÐÅÏ¢¡£ + */ +Status CreateGraph(Graph* G, char* path); + +/* + * ´´½¨ÓÐÏòͼµÄºËÐÄËã·¨ + */ +static void Create(Graph* G); + +/* + * ²éÕÒ + * + * ·µ»Ø¶¥µãuÔÚÓÐÏòͼÖеÄλÖà + */ +int LocateVex(Graph G, VertexType u); + +/* + * ´Ó±ß¼¯EdgeSetÖлñÈ¡×îС±ßµÄ¶¥µãuºÍv£¬²¢·µ»ØTRUE¡£ + * Èô±ß¼¯Îª¿Õ£¬Ôò·µ»ØFASLE¡£ + */ +Boolean GetMinEdge(EdgeSetType* EdgeSet, int* u, int* v); + +/* + * ´Ó±ß¼¯ÖÐɾ³ýÒÀ¸½ÓÚ¶¥µãuºÍvµÄ×îС±ß¡£ + * ɾ³ý³É¹¦·µ»ØTRUE£¬·ñÔò£¬·µ»ØFALSE¡£ + */ +Boolean DelMinEdge(EdgeSetType* EdgeSet, int u, int v); + +/* + * ´òÓ¡ÓÐÏòͼ½á¹¹ + */ +void PrintGraph(Graph G); + +#endif diff --git a/VisualC++/ExerciseBook/07.33/MFSet.c b/VisualC++/ExerciseBook/07.33/MFSet.c new file mode 100644 index 0000000..8b9d29d --- /dev/null +++ b/VisualC++/ExerciseBook/07.33/MFSet.c @@ -0,0 +1,93 @@ +/*===== + * ¼¯ºÏ + ======*/ + +#include "MFSet.h" + +/* + * ³õʼ»¯Ò»¸öÓɶà¸ö×Ó¼¯£¨Ã¿¸ö×Ó¼¯Ö»°üº¬µ¥¸ö³ÉÔ±£©¹¹³ÉµÄ¼¯ºÏS¡£ + * + * + *¡¾±¸×¢¡¿ + * + * ÕâÀï¶ÔµÚ6ÕµÄMFSet×öÁ˸͝£º + * 1.Ö±½ÓÔÚ²ÎÊýÖд«Èë×Ó¼¯ÊýÁ¿ + * 2.×Ó¼¯±àºÅ´Ó0¿ªÊ¼¼ÆÊý£¬Õâ»áÓ°Ïìµ½ºóÃæµÄº¯ÊýÖйØÓÚϱêµÄÅÐ¶Ï + */ +Status initial_mfset(MFSet* S, int n) { + int i; + + if(n <= 0) { + return ERROR; + } + + S->n = n; + S->r = 0; // µÚÒ»¸ö×Ó¼¯µÄλÖÃÔÚ0ºÅµ¥Ôª + + // ×Ó¼¯±àºÅ´Ó0¿ªÊ¼¼ÆÊý + for(i = 0; i < n; i++) { + S->nodes[i].parent = -1; + } + + return OK; +} + +/* + * ÇóÁ½¸ö»¥²»ÏཻµÄ×Ó¼¯SiºÍ×Ó¼¯SjµÄ²¢¼¯¡£ + */ +Status merge_mfset(MFSet* S, int i, int j) { + + // Ë÷ÒýÔ½½ç + if(i < 0 || i > S->n - 1 || j < 0 || j > S->n - 1) { + return ERROR; + } + + // ÏàͬµÄ×Ó¼¯ÎÞÐèºÏ²¢£¬Ö±½Ó·µ»Ø + if(i == j) { + return OK; + } + + S->nodes[i].parent = j; + + return OK; +} + +/* + * ÔÚ¼¯ºÏSÖвéÕÒÔªËØiµ±Ç°ËùÊôµÄ×Ó¼¯¡£ + */ +int find_mfset(MFSet S, int i) { + int j; + + // Ë÷ÒýÔ½½ç + if(i < 0 || i > S.n - 1) { + return -1; + } + + // ²éÕÒiËùÊôµÄ×Ó¼¯µÄ¸ù½áµã + for(j = i; S.nodes[j].parent >= 0; j = S.nodes[j].parent) { + // ´ÓÏÂÍùÉϲéÕÒ + } + + return j; +} + +/* + * ¸ù¾ÝµÈ¼Û¹ØÏµRÀ´ÕûÀí/½¨Á¢¼¯ºÏSÖеÄÔªËØ(×Ó¼¯)¡£ + */ +Status build_mfset(MFSet* S, Relation R) { + int k; + int i, j; + + for(k = 0; k < R.n; k++) { + // ÏÈ»ñÈ¡×Ó¼¯¸ù½áµã + i = find_mfset(*S, R.pairs[k].i); + j = find_mfset(*S, R.pairs[k].j); + + // ¶ÔÁ½¸ö»¥²»ÏཻµÄ×Ó¼¯½øÐй鲢 + if(!merge_mfset(S, i, j)) { + return ERROR; + } + } + + return OK; +} diff --git a/VisualC++/ExerciseBook/07.33/MFSet.h b/VisualC++/ExerciseBook/07.33/MFSet.h new file mode 100644 index 0000000..2a061a5 --- /dev/null +++ b/VisualC++/ExerciseBook/07.33/MFSet.h @@ -0,0 +1,92 @@ +/*===== + * ¼¯ºÏ + ======*/ + +#ifndef MFSET_H +#define MFSET_H + +#include +#include // Ìṩ malloc¡¢free Ô­ÐÍ +#include // Ìṩ memset¡¢strcmp Ô­ÐÍ +#include // +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// + +/* Ê÷µÄ×î´ó½áµãÊý£¬ÕâÀïָʾ×Ó¼¯×î´óÊýÁ¿ */ +#define MAX_TREE_SIZE 1024 + +/* ¶þÔª¹ØÏµ¶ÔÊýÁ¿ */ +#define MAX_PAIR_SIZE 100 + +/* + * (Ë«Ç×)Ê÷µÄ½áµã¶¨Òå + * + *¡¾×¢¡¿ + * 1.ÒÀÕս̲ĵÄͼʾ£¬Ë«Ç×Ê÷ÔÚ¼¯ºÏµÄÓ¦ÓÃÖУ¬ÆäÄ£ÐÍÒѱ»¼ò»¯£º¼´Ë«Ç×½áµã²»ÔÙ±£ÁôÊý¾ÝÓò¡£ + * 2.½áµãµÄË÷ÒýÓÃÀ´±íʾËüÊÇÄÄÒ»¸ö×Ó¼¯£¬Ëü»á×÷Ϊ¸ü´ó×Ó¼¯µÄÒ»¸öÔªËØ´æÔÚ¡£ + * 3.È·¶¨Ä³¸ö×Ó¼¯ÊôÓÚSÖÐÄĸö¸ü´óµÄ×Ó¼¯Ê±£¬ÐèÒªÏòÉÏ×·Ëݵ½¸ü´ó×Ó¼¯µÄ¸ù¡£ + * 4.ʵ¼ÊʹÓÃÖУ¬Ã¿¸ö×Ó¼¯»á°üº¬ºÜ¶àÊý¾ÝÔªËØ£¬´Ëʱ¿ÉÒÔ½«Ã¿¸öÊý¾ÝÔªËØÓëÆäËùÊôµÄ×Ó¼¯½¨Á¢¹ØÁª¹ØÏµ + * ¼´°Ñÿ¸öÊý¾ÝÔªËØÓ뼯ºÏSÖи÷½áµãµÄË÷Òý¹ØÁªÆðÀ´ + */ +typedef struct PTNode { + int parent; // Ë«Ç×λÖÃÓò£¬ÓÃÀ´Ö¸Ê¾¸Ã½áµãËùÊôµÄ×Ó¼¯ +} PTNode; + +/* + * (Ë«Ç×)Ê÷ÀàÐͶ¨Òå + * + *¡¾×¢¡¿ + * 1.Ê÷ÖнáµãÔÚnodesÖÐ"½ôÁÚ"´æ´¢£¬Ã»ÓпÕ϶ + * 2.µ±×Ó¼¯´æÔÚʱ£¬Ê÷¸ùrÉèÖÃΪ1£¬·ñÔò£¬Ê÷¸ùrÉèÖÃΪ0 + * 3.³ý¸ù½áµãÍ⣬ÆäËû½áµãÒÀ´Î°´²ãÐò˳ןù½áµãÍùÏÂÅÅÁÐ + * 5.ÕâÀï¼ÙÉènodes¿Õ¼äÊÇ×ã¹»´óµÄ£¬¿ÉÒÔÊÓÐèÇ󽫯ä¸ÄΪ¶¯Ì¬·ÖÅä´æ´¢ + */ +typedef struct { + PTNode nodes[MAX_TREE_SIZE]; // ´æ´¢Ê÷Öнáµã + int r; // Ê÷¸ùλÖÃ(Ë÷Òý)£¬ÕâÀïÓÃÀ´Ö¸Ê¾µÚÒ»¸ö×Ó¼¯µÄλÖà + int n; // Ê÷µÄ½áµãÊý£¬ÕâÀïÓÃÀ´Ö¸Ê¾ËùÓÐ +} PTree; + +/* ¼¯ºÏÀàÐͶ¨Òå */ +typedef PTree MFSet; + +/* µ¥¸ö¶þÔª¹ØÏµ¶Ô */ +typedef struct { + int i; + int j; +} Pair; + +/* ¼¯ºÏÄڵĵȼ۹ØÏµ */ +typedef struct { + Pair pairs[MAX_PAIR_SIZE]; // ×ã¹»´óµÄ¿Õ¼ä´æ´¢¶þÔª¹ØÏµ + int n; // ÒÑÖªµÄµÈ¼Û¹ØÏµÊýÁ¿ +} Relation; + + +/* + * ³õʼ»¯Ò»¸öÓɶà¸ö×Ó¼¯£¨Ã¿¸ö×Ó¼¯Ö»°üº¬µ¥¸ö³ÉÔ±£©¹¹³ÉµÄ¼¯ºÏS¡£ + * + * + *¡¾±¸×¢¡¿ + * + * ÕâÀï¶ÔµÚ6ÕµÄMFSet×öÁ˸͝£º + * 1.Ö±½ÓÔÚ²ÎÊýÖд«Èë×Ó¼¯ÊýÁ¿ + * 2.×Ó¼¯±àºÅ´Ó0¿ªÊ¼¼ÆÊý£¬Õâ»áÓ°Ïìµ½ºóÃæµÄº¯ÊýÖйØÓÚϱêµÄÅÐ¶Ï + */ +Status initial_mfset(MFSet* S, int n); + +/* + * ÇóÁ½¸ö»¥²»ÏཻµÄ×Ó¼¯SiºÍ×Ó¼¯SjµÄ²¢¼¯¡£ + */ +Status merge_mfset(MFSet* S, int i, int j); + +/* + * ÔÚ¼¯ºÏSÖвéÕÒÔªËØiµ±Ç°ËùÊôµÄ×Ó¼¯¡£ + */ +int find_mfset(MFSet S, int i); + +/* + * ¸ù¾ÝµÈ¼Û¹ØÏµRÀ´ÕûÀí/½¨Á¢¼¯ºÏSÖеÄÔªËØ(×Ó¼¯)¡£ + */ +Status build_mfset(MFSet* S, Relation R); + +#endif diff --git a/VisualC++/ExerciseBook/07.33/MinimumSpanningTree.c b/VisualC++/ExerciseBook/07.33/MinimumSpanningTree.c new file mode 100644 index 0000000..6bdae68 --- /dev/null +++ b/VisualC++/ExerciseBook/07.33/MinimumSpanningTree.c @@ -0,0 +1,142 @@ +/*================== + * ÎÞÏòÍøµÄ×îСÉú³ÉÊ÷ + * + * °üº¬Ëã·¨: 7.9 + ==================*/ + +#include "MinimumSpanningTree.h" + +/* + * ʹÓÿ˳˹¿¨¶ûËã·¨ÇóÈ¡×îСÉú³ÉÊ÷ + */ +CSTree MinSpanTree_KRUSKAL(Graph G) { + int k; + int v1, v2; + int s1, s2; + + CSTree T = NULL; + CSTree parent[MAX_VERTEX_NUM] = {NULL}; // ×·×Ù¸÷¶¥µãÔÚÊ÷ÖеÄλÖÃ(ÓÃÖ¸ÕëÖ¸Ïò¸Ã¶¥µã) + SqQueue queue; + int root; + + // ¼Ç¼ÒѾ­¼ÓÈëµ½×îСÉú³ÉÊ÷µÄ¶¥µã¼¯£¬ÕâÀïʹÓü¯ºÏµÄÄ¿µÄÊÇ¿ìËÙÅжϺòÑ¡¶¥µãÊÇ·ñ»áÔì³É»·Â· + MFSet S; + Relation relation; + + // ´æ´¢ÓÐÏòÍø±ß¼¯µÄÒ»¸ö¸±±¾ + EdgeSetType* EdgeSet; + + // ´æ´¢×îСÉú³ÉÊ÷Öаüº¬µÄ±ß¼¯ + EdgeSetType* tree; + EdgeSetType edge; + + // ¸´ÖÆÓÐÏòÍøµÄ±ß¼¯ + EdgeSet = (EdgeSetType*) malloc((G.EdgeSet[0].weight * sizeof(EdgeSetType))); + for(k = 0; k <= G.EdgeSet[0].weight; k++) { + EdgeSet[k] = G.EdgeSet[k]; // ½á¹¹Ìå¿ÉÒÔÖ±½Ó¸´ÖÆ + } + + // ×îСÉú³ÉÊ÷Öаüº¬µÄ±ßµÄÊýÁ¿Îª¶¥µãÊý-1£¬µ«ÕâÀï¶à·ÖÅäÁËÒ»¸öµ¥Ôª£¬ÒòΪ0ºÅµ¥ÔªÒª´æ´¢±ßµÄÊýÁ¿ + tree = (EdgeSetType*) malloc(G.vexnum * sizeof(EdgeSetType)); + tree[0].weight = 0; + + // ³õʼ»¯¶¥µã¼¯ºÏ + initial_mfset(&S, G.vexnum); + + // ´Ó±ß¼¯ÖÐÒÀ´ÎÑ¡ÔñȨֵ×îС£¬ÇÒ²»¹¹³É»·Â·µÄ±ß¼ÓÈëµ½×îСÉú³ÉÊ÷ + for(k = 0; k < G.arcnum; k++) { + // Ñ¡³öÒ»ÌõȨֵ×îСµÄ±ß + GetMinEdge(EdgeSet, &v1, &v2); + // Ñ¡ÍêÖ®ºó¾Í¿ÉÒԴӱ߼¯µÄ¸±±¾ÖÐɾµôÕâÌõ±ßÁË£¬ÒòΪºóÐø²»ÔÙÐèÒªËü + DelMinEdge(EdgeSet, v1, v2); + + s1 = find_mfset(S, v1); + s2 = find_mfset(S, v2); + + // Èç¹ûÕâÁ½¸ö¶ËµãλÓÚͬһ¸ö¼¯ºÏ£¬ÔòÌø¹ý¸ÃÌõ±ß + if(s1 == s2) { + continue; + } + + // ¹¹Ôì¶þÔª¹ØÏµ + relation.n = 1; + relation.pairs[0].i = v1; + relation.pairs[0].j = v2; + + build_mfset(&S, relation); + + // ´òÓ¡¶¥µãºÍ±ßµÄÐÅÏ¢ + printf("%c %c\n", G.vexs[v1], G.vexs[v2]); + + // ´´½¨Ê÷½áµãv1 + if(parent[v1] == NULL) { + parent[v1] = (CSTree) malloc(sizeof(CSNode)); + parent[v1]->data = G.vexs[v1]; + parent[v1]->firstchild = parent[v1]->nextsibling = NULL; + } + + // ´´½¨Ê÷½áµãv2 + if(parent[v2] == NULL) { + parent[v2] = (CSTree) malloc(sizeof(CSNode)); + parent[v2]->data = G.vexs[v2]; + parent[v2]->firstchild = parent[v2]->nextsibling = NULL; + } + + // Ïò¼¯ºÏÖд洢¹¹³É×îСÉú³ÉÊ÷µÄ±ß + tree[0].weight++; + tree[tree[0].weight].u = v1; + tree[tree[0].weight].v = v2; + } + + + /* ½ÓÏÂÀ´Ê¹ÓÃÒÑÖªµÄ±ßÀ´¹¹ÔìÊ÷µÄº¢×Ó-ÐÖµÜÁ´±í´æ´¢½á¹¹ */ + + if(tree[0].weight<=0) { + return NULL; + } + + InitQueue(&queue); + + // È·¶¨Õû¿ÃÊ÷µÄ¸ù½áµã + T = parent[tree[1].u]; + + // ×·×Ùÿ¿Ã×ÓÊ÷µÄ¸ù½áµã + root = tree[1].u; + + while(tree[0].weight > 0) { + // ²éÕÒ°üº¬¶ËµãrootµÄ±ß + for(k = 1; k <= tree[0].weight; k++) { + if(tree[k].u == root || tree[k].v == root) { + break; + } + } + + // ÕÒµ½ÁËÕâÑùµÄ±ß + if(k <= tree[0].weight) { + edge = tree[k]; + + // ÒÆ³ýÕâÌõ±ß£¬´Ë´¦Ö»ÊÇÓÃ×îºóÒ»Ìõ±ßµÄÐÅÏ¢¼òµ¥µØ¸²¸ÇÕâÌõ±ßµÄÐÅÏ¢ + tree[k] = tree[tree[0].weight]; + tree[0].weight--; + + if(edge.u == root) { + // °Ñ½áµãvÌí¼ÓΪ½áµãuµÄÒ»¸öº¢×Ó½áµã£¬ÕâÀï¼òµ¥µØÊ¹ÓÃÍ·²å·¨ + parent[edge.v]->nextsibling = parent[edge.u]->firstchild; + parent[edge.u]->firstchild = parent[edge.v]; + + EnQueue(&queue, edge.v); + } else { + // °Ñ½áµãuÌí¼ÓΪ½áµãvµÄÒ»¸öº¢×Ó½áµã£¬ÕâÀï¼òµ¥µØÊ¹ÓÃÍ·²å·¨ + parent[edge.u]->nextsibling = parent[edge.v]->firstchild; + parent[edge.v]->firstchild = parent[edge.u]; + + EnQueue(&queue, edge.u); + } + } else { + // »ñȡеÄ×ÓÊ÷µÄroot + DeQueue(&queue, &root); + } + } + + return T; +} diff --git a/VisualC++/ExerciseBook/07.33/MinimumSpanningTree.h b/VisualC++/ExerciseBook/07.33/MinimumSpanningTree.h new file mode 100644 index 0000000..09cb58c --- /dev/null +++ b/VisualC++/ExerciseBook/07.33/MinimumSpanningTree.h @@ -0,0 +1,22 @@ +/*================== + * ÎÞÏòÍøµÄ×îСÉú³ÉÊ÷ + * + * °üº¬Ëã·¨: 7.9 + ==================*/ + +#ifndef MINIMUMSPANNINGTREE_H +#define MINIMUMSPANNINGTREE_H + +#include +#include // ÌṩINT_MAXºê +#include "SqQueue.h" //**¡ø03 Õ»ºÍ¶ÓÁÐ**// +#include "MFSet.h" //**¡ø06 Ê÷ºÍ¶þ²æÊ÷**// +#include "CSTree.h" //**¡ø06 Ê÷ºÍ¶þ²æÊ÷**// +#include "Graph.h" + +/* + * ʹÓÿ˳˹¿¨¶ûËã·¨ÇóÈ¡×îСÉú³ÉÊ÷ + */ +CSTree MinSpanTree_KRUSKAL(Graph G); + +#endif diff --git a/VisualC++/ExerciseBook/07.33/SqQueue.c b/VisualC++/ExerciseBook/07.33/SqQueue.c new file mode 100644 index 0000000..1d385f5 --- /dev/null +++ b/VisualC++/ExerciseBook/07.33/SqQueue.c @@ -0,0 +1,147 @@ +/*============================= + * ¶ÓÁеÄ˳Ðò´æ´¢½á¹¹£¨Ë³Ðò¶ÓÁУ© + ==============================*/ + +#include "SqQueue.h" //**¡ø03 Õ»ºÍ¶ÓÁÐ**// + +/* + * ³õʼ»¯ + * + * ¹¹ÔìÒ»¸ö¿ÕµÄ˳Ðò¶ÓÁС£ + * ³õʼ»¯³É¹¦Ôò·µ»ØOK£¬·ñÔò·µ»ØERROR¡£ + * + *¡¾×¢¡¿ + * ÕâÀïµÄ¶ÓÁÐÊÇÑ­»·¶ÓÁÐ + */ +Status InitQueue(SqQueue* Q) { + if(Q == NULL) { + return ERROR; + } + + (*Q).base = (QElemType*) malloc(MAXQSIZE * sizeof(QElemType)); + if(!(*Q).base) { + exit(OVERFLOW); + } + + (*Q).front = (*Q).rear = 0; + + return OK; +} + +/* + * ÅÐ¿Õ + * + * ÅжÏÑ­»·Ë³Ðò¶ÓÁÐÖÐÊÇ·ñ°üº¬ÓÐЧÊý¾Ý¡£ + * + * ·µ»ØÖµ£º + * TRUE : Ñ­»·Ë³Ðò¶ÓÁÐΪ¿Õ + * FALSE: Ñ­»·Ë³Ðò¶ÓÁв»Îª¿Õ + */ +Status QueueEmpty(SqQueue Q) { + // ¶ÓÁпյıêÖ¾ + if(Q.front == Q.rear) { + return TRUE; + } else { + return FALSE; + } +} + +/* + * ¼ÆÊý + * + * ·µ»ØÑ­»·Ë³Ðò¶ÓÁаüº¬µÄÓÐÐ§ÔªËØµÄÊýÁ¿¡£ + */ +int QueueLength(SqQueue Q) { + if(Q.base == NULL) { + return 0; + } + + // ¶ÓÁг¤¶È + return (Q.rear - Q.front + MAXQSIZE) % MAXQSIZE; +} + +/* + * ȡֵ + * + * »ñÈ¡¶ÓÍ·ÔªËØ£¬½«Æä´æ´¢µ½eÖС£ + * Èç¹û¿ÉÒÔÕÒµ½£¬·µ»ØOK£¬·ñÔò£¬·µ»ØERROR¡£ + */ +Status GetHead(SqQueue Q, QElemType* e) { + // ¶ÓÁпյıêÖ¾ + if(Q.base == NULL || Q.front == Q.rear) { + return ERROR; + } + + *e = Q.base[Q.front]; + + return OK; +} + +/* + * Èë¶Ó + * + * ½«ÔªËØeÌí¼Óµ½¶ÓÁÐβ²¿¡£ + */ +Status EnQueue(SqQueue* Q, QElemType e) { + if(Q == NULL || (*Q).base == NULL) { + return ERROR; + } + + // ¶ÓÁÐÂúµÄ±êÖ¾£¨»áÀË·ÑÒ»¸ö¿Õ¼äÀ´Çø·Ö¶ÓÁпպͶÓÁÐÂú£© + if(((*Q).rear + 1) % MAXQSIZE == (*Q).front) { + return ERROR; + } + + // Èë¶Ó + (*Q).base[(*Q).rear] = e; + + // βָÕëǰ½ø + (*Q).rear = ((*Q).rear + 1) % MAXQSIZE; + + return OK; +} + +/* + * ³ö¶Ó + * + * ÒÆ³ý¶ÓÁÐÍ·²¿µÄÔªËØ£¬½«Æä´æ´¢µ½eÖС£ + */ +Status DeQueue(SqQueue* Q, QElemType* e) { + if(Q == NULL || (*Q).base == NULL) { + return ERROR; + } + + // ¶ÓÁпյıêÖ¾ + if((*Q).front == (*Q).rear) { + return ERROR; + } + + // ³ö¶Ó + *e = (*Q).base[(*Q).front]; + + // Í·Ö¸Õëǰ½ø + (*Q).front = ((*Q).front + 1) % MAXQSIZE; + + return OK; +} + +/* + * ±éÀú + * + * ÓÃvisitº¯Êý·ÃÎʶÓÁÐQ + */ +Status QueueTraverse(SqQueue Q, void(Visit)(QElemType)) { + int i; + + if(Q.base == NULL) { + return ERROR; + } + + for(i = Q.front; i != Q.rear; i = (i + 1) % MAXQSIZE) { + Visit(Q.base[i]); + } + + printf("\n"); + + return OK; +} diff --git a/VisualC++/ExerciseBook/07.33/SqQueue.h b/VisualC++/ExerciseBook/07.33/SqQueue.h new file mode 100644 index 0000000..f739aee --- /dev/null +++ b/VisualC++/ExerciseBook/07.33/SqQueue.h @@ -0,0 +1,84 @@ +/*============================= + * ¶ÓÁеÄ˳Ðò´æ´¢½á¹¹£¨Ë³Ðò¶ÓÁУ© + ==============================*/ + +#ifndef SQQUEUE_H +#define SQQUEUE_H + +#include +#include // Ìṩmalloc¡¢realloc¡¢free¡¢exitÔ­ÐÍ +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// + +/* ºê¶¨Òå */ +#define MAXQSIZE 1000 //×î´ó¶ÓÁг¤¶È + +/* Ñ­»·¶ÓÁÐÔªËØÀàÐͶ¨Òå */ +typedef int QElemType; + +// Ñ­»·¶ÓÁеÄ˳Ðò´æ´¢½á¹¹ +typedef struct { + QElemType* base; // ¶¯Ì¬·ÖÅä´æ´¢¿Õ¼ä + int front; // Í·Ö¸Õ룬Èô¶ÓÁв»¿Õ£¬Ö¸Ïò¶ÓÍ·ÔªËØ + int rear; // βָÕ룬Èô¶ÓÁв»¿Õ£¬Ö¸Ïò¶ÓÁÐÎ²ÔªËØµÄÏÂÒ»¸öλÖà +} SqQueue; + + +/* + * ³õʼ»¯ + * + * ¹¹ÔìÒ»¸ö¿ÕµÄ˳Ðò¶ÓÁС£ + * ³õʼ»¯³É¹¦Ôò·µ»ØOK£¬·ñÔò·µ»ØERROR¡£ + * + *¡¾×¢¡¿ + * ÕâÀïµÄ¶ÓÁÐÊÇÑ­»·¶ÓÁÐ + */ +Status InitQueue(SqQueue* Q); + +/* + * ÅÐ¿Õ + * + * ÅжÏÑ­»·Ë³Ðò¶ÓÁÐÖÐÊÇ·ñ°üº¬ÓÐЧÊý¾Ý¡£ + * + * ·µ»ØÖµ£º + * TRUE : Ñ­»·Ë³Ðò¶ÓÁÐΪ¿Õ + * FALSE: Ñ­»·Ë³Ðò¶ÓÁв»Îª¿Õ + */ +Status QueueEmpty(SqQueue Q); + +/* + * ¼ÆÊý + * + * ·µ»ØÑ­»·Ë³Ðò¶ÓÁаüº¬µÄÓÐÐ§ÔªËØµÄÊýÁ¿¡£ + */ +int QueueLength(SqQueue Q); + +/* + * ȡֵ + * + * »ñÈ¡¶ÓÍ·ÔªËØ£¬½«Æä´æ´¢µ½eÖС£ + * Èç¹û¿ÉÒÔÕÒµ½£¬·µ»ØOK£¬·ñÔò£¬·µ»ØERROR¡£ + */ +Status GetHead(SqQueue Q, QElemType* e); + +/* + * Èë¶Ó + * + * ½«ÔªËØeÌí¼Óµ½¶ÓÁÐβ²¿¡£ + */ +Status EnQueue(SqQueue* Q, QElemType e); + +/* + * ³ö¶Ó + * + * ÒÆ³ý¶ÓÁÐÍ·²¿µÄÔªËØ£¬½«Æä´æ´¢µ½eÖС£ + */ +Status DeQueue(SqQueue* Q, QElemType* e); + +/* + * ±éÀú + * + * ÓÃvisitº¯Êý·ÃÎʶÓÁÐQ + */ +Status QueueTraverse(SqQueue Q, void(Visit)(QElemType)); + +#endif diff --git a/VisualC++/ExerciseBook/07.33/TestData_UDN.txt b/VisualC++/ExerciseBook/07.33/TestData_UDN.txt new file mode 100644 index 0000000..2f18fe7 --- /dev/null +++ b/VisualC++/ExerciseBook/07.33/TestData_UDN.txt @@ -0,0 +1,4 @@ +¶¥µãÊý¡ú6 +±ßÊý¡ú10 +¶¥µã¼¯¡ú¡¾A£¬B£¬C£¬D£¬E£¬F¡¿ +±ßµÄ¼¯ºÏ¡ú¡¾A£¬B£¬6¡¿¡¾A£¬C£¬1¡¿¡¾A£¬D£¬5¡¿¡¾B£¬C£¬5¡¿¡¾B£¬E£¬3¡¿¡¾C£¬D£¬5¡¿¡¾C£¬E£¬6¡¿¡¾C£¬F£¬4¡¿¡¾D£¬F£¬2¡¿¡¾E£¬F£¬6¡¿ \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.34/07.34.c b/VisualC++/ExerciseBook/07.34/07.34.c new file mode 100644 index 0000000..3047d0f --- /dev/null +++ b/VisualC++/ExerciseBook/07.34/07.34.c @@ -0,0 +1,131 @@ +#include +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// +#include "ALGraph.h" //**¡ø07 ͼ**// +#include "TopologicalSorting.h" //**¡ø07 ͼ**// + +/* + * ¶ÔÓÐÏòÎÞ»·Í¼ÖеĶ¥µãÊʵ±µØ±àºÅ£¬Ê¹ÆäËùÓл¡vi->vjÂú×ãivjÂú×ãiadjvex]] = 1; + p = p->nextarc; + } + } + + + printf(" "); + for(i = 0; i < G.vexnum; i++) { + printf(" %c", G.vertices[topo[i]].data); + } + printf("\n"); + + for(i = 0; i < G.vexnum; i++) { + printf("%c ", G.vertices[topo[i]].data); + + for(j = 0; j < G.vexnum; j++) { + if(adjs[i][j] == 0) { + printf(" -"); + } else { + printf("%3d", adjs[i][j]); + } + } + + printf("\n"); + } +} diff --git a/VisualC++/ExerciseBook/07.34/07.34.png b/VisualC++/ExerciseBook/07.34/07.34.png new file mode 100644 index 0000000000000000000000000000000000000000..6bb19199dc12ec07185960e5914dd51744fe7485 GIT binary patch literal 16448 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 MqODx1Xchkd0f5#y;s5{u literal 0 HcmV?d00001 diff --git a/VisualC++/ExerciseBook/07.34/07.34.vcxproj b/VisualC++/ExerciseBook/07.34/07.34.vcxproj new file mode 100644 index 0000000..ffbf94e --- /dev/null +++ b/VisualC++/ExerciseBook/07.34/07.34.vcxproj @@ -0,0 +1,83 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {B09BB515-33BE-468C-8290-81FC322805E0} + My0734 + + + + Application + true + MultiByte + + + Application + false + true + MultiByte + + + + + + + + + + + + + $(SolutionDir)\..\Status;$(IncludePath) + + + + Level3 + Disabled + + + true + $(SolutionDir)\..\Status\Status.lib;%(AdditionalDependencies) + Console + + + + + Level3 + MaxSpeed + true + true + + + true + true + true + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.34/07.34.vcxproj.filters b/VisualC++/ExerciseBook/07.34/07.34.vcxproj.filters new file mode 100644 index 0000000..04a03b0 --- /dev/null +++ b/VisualC++/ExerciseBook/07.34/07.34.vcxproj.filters @@ -0,0 +1,47 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + æºæ–‡ä»¶ + + + æºæ–‡ä»¶ + + + æºæ–‡ä»¶ + + + æºæ–‡ä»¶ + + + + + 头文件 + + + 头文件 + + + 头文件 + + + + + èµ„æºæ–‡ä»¶ + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.34/07.34.vcxproj.user b/VisualC++/ExerciseBook/07.34/07.34.vcxproj.user new file mode 100644 index 0000000..ace9a86 --- /dev/null +++ b/VisualC++/ExerciseBook/07.34/07.34.vcxproj.user @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.34/ALGraph.c b/VisualC++/ExerciseBook/07.34/ALGraph.c new file mode 100644 index 0000000..4f5206b --- /dev/null +++ b/VisualC++/ExerciseBook/07.34/ALGraph.c @@ -0,0 +1,325 @@ +/*================== + * ͼµÄÁÚ½Ó±í´æ´¢±íʾ + ===================*/ + +#include "ALGraph.h" + +// ¼ÈëÊý¾ÝµÄÔ´Îļþ£»fpΪnullʱ£¬ËµÃ÷ÐèÒª´Ó¿ØÖÆÌ¨Â¼Èë +static FILE* fp = NULL; + +/* + * IncInfoָʾ¸Ãͼ/ÍøµÄ±ß/»¡ÉÏÊÇ·ñ´æÔÚ¸½¼ÓÐÅÏ¢¡£ + * Èç¹ûÆäÖµ²»Îª0£¬Ôò±íʾÎÞ¸½¼ÓÐÅÏ¢£¬·ñÔò£¬±íʾ´æÔÚ¸½¼ÓÐÅÏ¢¡£ + */ +Boolean IncInfo = FALSE; + +// ·ÃÎʱêÖ¾Êý×飬¼Ç¼·ÃÎʹýµÄ¶¥µã +static Boolean visited[MAX_VERTEX_NUM]; + +// º¯Êý±äÁ¿ +static Status (* VisitFunc)(VertexType e); + + +/* + * ´´½¨ + * + *¡¾±¸×¢¡¿ + * + * ½Ì²ÄÖÐĬÈÏ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý¡£ + * ÕâÀïΪÁË·½±ã²âÊÔ£¬±ÜÃâÿ´ÎÔËÐж¼ÊÖ¶¯ÊäÈëÊý¾Ý£¬ + * Òò¶øÔÊÐíÑ¡Ôñ´ÓÔ¤ÉèµÄÎļþpathÖжÁÈ¡²âÊÔÊý¾Ý¡£ + * + * Èç¹ûÐèÒª´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý£¬ÔòpathΪNULL£¬»òpath[kind]Ϊ""¡£ + * Èç¹ûÐèÒª´ÓÎļþÖжÁÈ¡Êý¾Ý£¬ÔòÐèÒªÔÚpathÖÐÌîдÎļþÃûÐÅÏ¢¡£ + */ +Status CreateGraph(ALGraph* G, char* path[]) { + int readFromConsole; // ÊÇ·ñ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý + int kind; + Status flag; + + // ¡ï¡ï¡ï´Ë´¦¹Ì¶¨ÎªÓÐÏòͼ + kind = 0; + + // Èç¹ûûÓÐÎļþ·¾¶ÐÅÏ¢£¬Ôò´Ó¿ØÖÆÌ¨¶ÁÈ¡ÊäÈë + readFromConsole = (path == NULL) || strcmp(path[kind], "") == 0; + + // ÐèÒª´ÓÎļþ¶ÁÈ¡ + if(readFromConsole) { + (*G).kind = kind; // ¼Ç¼ͼ/ÍøµÄÀàÐÍ + } else { + // ´ò¿ªÎļþ£¬×¼±¸¶ÁÈ¡²âÊÔÊý¾Ý + fp = fopen(path[kind], "r"); + if(fp == NULL) { + return ERROR; + } + + // ¼ÈëͼµÄÀàÐÍ + ReadData(fp, "%d", &((*G).kind)); + } + + // Ëæ»ú´´½¨ÓÐÏòͼ/Íø»òÎÞÏòͼ/ÍøµÄÒ»ÖÖ + switch((*G).kind) { + case DG: + flag = CreateDG(G); + break; + default: + flag = ERROR; + break; + } + + if(fp != NULL) { + fclose(fp); + fp = NULL; + } + + return flag; +} + +/* + * ¹¹ÔìÓÐÏòͼ + */ +static Status CreateDG(ALGraph* G) { + int i, k; + int vexnum, arcnum; + VertexType v1, v2; + InfoType* info = NULL; + + (*G).vexnum = (*G).arcnum = 0; + + if(fp == NULL) { + printf("ÇëÊäÈëÓÐÏòͼµÄ¶¥µãÊý£º"); + scanf("%d", &vexnum); + printf("ÇëÊäÈëÓÐÏòͼµÄ»¡Êý£º"); + scanf("%d", &arcnum); + printf("¸ÃÓÐÏòͼµÄ»¡ÉÏÊÇ·ñ°üº¬ÆäËû¸½¼ÓÐÅÏ¢(0-²»°üº¬©¦1-°üº¬)£º"); + scanf("%d", &IncInfo); + + // ¼Èë¶¥µã¼¯ + printf("Çë¼Èë %d ¸ö¶¥µã£¬²»Í¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º", vexnum); + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(stdin); + scanf("%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } else { + ReadData(fp, "%d", &vexnum); // ¼Èë¶¥µãÊý + ReadData(fp, "%d", &arcnum); // ¼È뻡Êý + ReadData(fp, "%d", &IncInfo); // Åжϻ¡ÉÏÊÇ·ñ°üº¬¸½¼ÓÐÅÏ¢ + + // ¼Èë¶¥µã¼¯ + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(fp); + ReadData(fp, "%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } + + // ½öÔÚ¿ØÖÆÌ¨Â¼ÈëÐÅϢʱÊä³ö´ËÌáʾ + if(fp == NULL && arcnum != 0) { + printf("ÇëΪÓÐÏòͼÒÀ´Î¼Èë %d Ìõ»¡µÄÐÅÏ¢£¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º\n", arcnum); + } + + // ¼È뻡µÄÐÅÏ¢ + for(k = 0; k < arcnum; k++) { + if(fp == NULL) { + printf("µÚ %2d Ìõ»¡£º", k + 1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v2); + } else { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + skipBlank(fp); + ReadData(fp, "%c%c", &v1, &v2); + } + + // Èç¹ûÐèҪ¼È뻡µÄÆäËû¸½¼ÓÐÅÏ¢ + if(IncInfo) { + // ×îºó¼È븽¼ÓÐÅÏ¢ + Input(*G, &info); + } + + // ²åÈ뻡 + InsertArc(G, v1, v2, info); + } + + // ´ÓÎļþÖжÁÈ¡Êý¾Ýʱ£¬×îºóÆäʵӦµ±ÅжÏÒ»ÏÂÊÇ·ñ¶Áµ½ÁË×ã¹»µÄÐÅÏ¢ + return OK; +} + +/* + * ¼Èë±ß/»¡µÄÏà¹Ø¸½¼ÓÐÅÏ¢ + */ +static void Input(ALGraph G, InfoType** info) { + int weight; + + // ÔÚ"Íø"µÄÇéÐÎÏÂÐèҪ¼ÈëȨֵÐÅÏ¢ + if(G.kind == DN || G.kind == UDN) { + *info = (InfoType*) malloc(sizeof(InfoType)); + + if(fp == NULL) { + scanf("%d", &weight); + } else { + ReadData(fp, "%d", &weight); + } + + (*info)->weight = weight; + } +} + +/* + * ²éÕÒ + * + * ·µ»Ø¶¥µãuÔÚͼ/ÍøÖеÄλÖà + */ +int LocateVex(ALGraph G, VertexType u) { + int i; + + for(i = 0; i < G.vexnum; i++) { + if(G.vertices[i].data == u) { + return i; + } + } + + return -1; +} + +/* + * ¹¹ÔìÒ»¸ö±ß/»¡½áµã(½öÏÞÄÚ²¿Ê¹ÓÃ) + */ +static ArcNode* newArcNodePtr(int adjvex, ArcNode* nextarc, InfoType* info) { + ArcNode* p = (ArcNode*) malloc(sizeof(ArcNode)); + if(!p) { + exit(OVERFLOW); + } + + p->adjvex = adjvex; + + p->nextarc = nextarc; + + p->info = info; + + return p; +} + +/* + * ²åÈë±ß/»¡ + * + * Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬Ôò²åÈëÒ»Ìõ»¡ÐèÒªÔö¼ÓÁ½¸ö¶¥µã¹ØÏµ£¬µ«»¡µÄÊýÁ¿Ö»ÔöÒ»¡£ + * ¶ÔÓÚͼ/ÍøÀ´Ëµ£¬¿ÉÒÔÔڿɱä²ÎÊýÖÐÁгö±ß/»¡µÄ¸½¼ÓÐÅÏ¢¡£ + * + * ×¢£º´Ë´¦½ÓÊյIJÎÊýÓëMGraphÓÐЩ²»Ò»Ñù£ºÍøµÄ¸½¼ÓÐÅÏ¢Öаüº¬Á˸÷Ìõ±ß/»¡µÄȨֵ¡£ + */ +Status InsertArc(ALGraph* G, VertexType v, VertexType w, ...) { + int tail, head, k, count; + ArcNode* r; + ArcNode* pre; + Boolean overlay = FALSE; // ÊÇ·ñΪ¸²¸ÇÌí¼Ó + InfoType* info = NULL; // ±ß/»¡µÄ¸½¼ÓÐÅÏ¢ + va_list ap; + + tail = LocateVex(*G, v); // »ñÈ¡¶¥µãvÔÚ¶¥µã¼¯ÖеÄλÖà + if(tail == -1) { + return ERROR; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + head = LocateVex(*G, w); // »ñÈ¡¶¥µãwÔÚ¶¥µã¼¯ÖеÄλÖà + if(head == -1) { + return ERROR; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + // ¾Ü¾ø»· + if(tail == head) { + return ERROR; + } + + // Èç¹û±ß/»¡ÉÏ´æÔÚ¸½¼ÓÐÅÏ¢ + if(IncInfo) { + va_start(ap, w); // ÔÚwºó²éѯÊ׸ö¿É±ä²ÎÊý + info = va_arg(ap, InfoType*); // »ñÈ¡¸½¼ÓÐÅÏ¢ + va_end(ap); + } + + /* ½ÓÏÂÀ´£¬ÐèÒª²éÕÒºÏÊʵIJåÈëλÖà */ + + for(count = 0; count < 2; count++) { + pre = NULL; + // Ö¸ÏòÒÔtailΪβµÄÊ×Ìõ±ß/»¡ + r = G->vertices[tail].firstarc; + while(r != NULL && r->adjvex < head) { + pre = r; + r = r->nextarc; + } + + // Óöµ½ÁËÏàͬλÖõĽáµã + if(r != NULL && r->adjvex == head) { + r->info = info; // ¸´Óøýáµã + overlay = TRUE; // ·¢ÉúÁ˸²¸Ç + } else { + if(pre == NULL) { + G->vertices[tail].firstarc = newArcNodePtr(head, r, info); + } else { + pre->nextarc = newArcNodePtr(head, r, info); + } + } + + // Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬ÐèÒª¿¼ÂǶԳÆÐÔ + if((G->kind == UDG || G->kind == UDN) && tail != head) { + // µßµ¹iºÍj + k = tail; + tail = head; + head = k; + } else { + break; // Èç¹ûÊÇÓÐÏòµÄ£¬¿ÉÒÔ½áÊøÁË + } + } + + // ÔڷǸ²¸ÇµÄÇéÐÎÏ£¬²Å¿¼ÂǸüбß/»¡µÄÊýÁ¿ + if(!overlay) { + (*G).arcnum++; // ²»ÂÛÓÐÏòÎÞÏò£¬±ß/»¡ÊýÖ»ÔöÒ» + } + + return OK; +} + +/* + * ÒÔͼÐλ¯ÐÎʽÊä³öµ±Ç°½á¹¹ + */ +void PrintGraph(ALGraph G) { + int i; + ArcNode* p; + + if(G.vexnum == 0) { + printf("¿Õͼ£¬ÎÞÐè´òÓ¡£¡\n"); + return; + } + + printf("µ±Ç°Í¼/Íø°üº¬ %2d ¸ö¶¥µã£¬ %2d Ìõ±ß/»¡...\n", G.vexnum, G.arcnum); + + for(i = 0; i < G.vexnum; i++) { + printf("%c ===> ", G.vertices[i].data); + + p = G.vertices[i].firstarc; + while(p != NULL) { + if(IncInfo == 0) { + printf("%c ", G.vertices[p->adjvex].data); + + // ¶ÔÓÚÍø£¬»á´ÓÆä¸½¼ÓÐÅÏ¢ÖлñÈ¡µ½È¨Öµ + } else { + printf("%c[%2d] ", G.vertices[p->adjvex].data, p->info->weight); + } + + p = p->nextarc; + + if(p != NULL) { + printf("- "); + } + } + + printf("\n"); + } +} diff --git a/VisualC++/ExerciseBook/07.34/ALGraph.h b/VisualC++/ExerciseBook/07.34/ALGraph.h new file mode 100644 index 0000000..e70b2c2 --- /dev/null +++ b/VisualC++/ExerciseBook/07.34/ALGraph.h @@ -0,0 +1,128 @@ +/*================== + * ͼµÄÁÚ½Ó±í´æ´¢±íʾ + ===================*/ + +#ifndef ALGRAPH_H +#define ALGRAPH_H + +#include +#include // Ìṩmemset¡¢strcmp Ô­ÐÍ +#include // Ìṩºêva_list¡¢va_start¡¢va_arg¡¢va_end +#include // Ìṩmalloc¡¢realloc¡¢free¡¢exitÔ­ÐÍ +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// + +/* + * ×¢£º + * + * ͨ³£À´½²£¬ÎÞȨͼ±»¼ò³ÆÎª¡¾Í¼¡¿£¬ÓÐȨͼ±»¼ò³ÆÎª¡¾Íø¡¿¡£ + * ÎÞÏòͼ/ÍøÖеĶ¥µã¹ØÏµ±»³ÆÎª¡¾±ß¡¿£¬ÓÐÏòͼ/ÍøÖеĶ¥µã¹ØÏµ±»³ÆÎª¡¾»¡¡¿£¬²¢Çø·Ö»¡Í·Ó뻡β¡£ + * ʵ¼Ê±íÊöÖУ¬Î´±Ø»áÑϸñ×ñÊØÒÔÉÏÃüÃû¡£ + * + * µ±Ç°½á¹¹Êʺϴ洢±ß/»¡±È½ÏÏ¡ÊèµÄͼ/Íø¡£ + * + * ¡ï ²åÈë±ß/»¡µÄÐÅϢʱ£¬ÕâÀïµÄʵÏÖÊǰ´"ÉýÐò"²åÈëµÄ£¬ÕâʹµÃ²åÈëµÄ»¡Êǰ´"ÉýÐò"ÅÅÁеġ£ + */ + + +/* ºê¶¨Òå */ +#define MAX_VERTEX_NUM 26 // ×î´ó¶¥µã¸öÊý + + +// ͼµÄÀàÐÍ +typedef enum { + DG, // 0-ÓÐÏòͼ + DN, // 1-ÓÐÏòÍø(´øÈ¨Öµ) + UDG, // 2-ÎÞÏòͼ + UDN // 3-ÎÞÏòÍø(´øÈ¨Öµ) +} GraphKind; + +// ¶¥µãÀàÐÍ +typedef char VertexType; + +// ±ß/»¡µÄÏà¹Ø¸½¼ÓÐÅÏ¢ +typedef struct { + /* + * ×¢£º + * ½Ì²ÄÖиø³öµÄ½á¹¹Ö»¿¼ÂÇÁËÎÞȨͼ£¬¶øÃ»¿¼ÂÇÓÐȨͼ(Íø)¡£ + * ÕâÀïΪÁ˰ѡ°Íø¡±µÄÇéÐÎÒ²¿¼ÂǽøÈ¥£¬ÌØÔÚ¸½¼ÓÐÅÏ¢ÖÐÔö¼ÓÁË"È¨ÖØ"ÊôÐÔ¡£ + */ + int weight; +} InfoType; + +/* ±ß/»¡½áµã */ +typedef struct ArcNode { + int adjvex; // ¸Ã»¡ËùÖ¸ÏòµÄ¶¥µãµÄλÖà + struct ArcNode* nextarc; // Ö¸ÏòÏÂÒ»Ìõ»¡µÄÖ¸Õë + InfoType* info; // »¡µÄ¸½¼ÓÐÅÏ¢£¬Í¨³£ºöÂÔ +} ArcNode; + +// ÿ¸öÁ´±íµÄÍ·½áµã +typedef struct VNode { + VertexType data; // ¶¥µãÐÅÏ¢ + ArcNode* firstarc; // Ö¸ÏòµÚÒ»ÌõÒÀ¸½¸Ã¶¥µãµÄ»¡µÄÖ¸Õë +} VNode; + +/* ͼµÄÁÚ½Ó±í´æ´¢±íʾÀàÐͶ¨Òå */ +typedef struct { + VNode vertices[MAX_VERTEX_NUM]; // ÁÚ½Ó±í + int vexnum, arcnum; // ͼ/ÍøµÄ¶¥µãÊýºÍ»¡Êý + GraphKind kind; // ͼµÄÀàÐͱêÖ¾ +} ALGraph; + + +// ±ß/»¡ÉÏÊÇ·ñ´æÔÚ¸½¼ÓÐÅÏ¢ +extern Boolean IncInfo; + + +/* + * ´´½¨ + * + *¡¾±¸×¢¡¿ + * + * ½Ì²ÄÖÐĬÈÏ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý¡£ + * ÕâÀïΪÁË·½±ã²âÊÔ£¬±ÜÃâÿ´ÎÔËÐж¼ÊÖ¶¯ÊäÈëÊý¾Ý£¬ + * Òò¶øÔÊÐíÑ¡Ôñ´ÓÔ¤ÉèµÄÎļþpathÖжÁÈ¡²âÊÔÊý¾Ý¡£ + * + * Èç¹ûÐèÒª´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý£¬ÔòpathΪNULL£¬»òpath[kind]Ϊ""¡£ + * Èç¹ûÐèÒª´ÓÎļþÖжÁÈ¡Êý¾Ý£¬ÔòÐèÒªÔÚpathÖÐÌîдÎļþÃûÐÅÏ¢¡£ + */ +Status CreateGraph(ALGraph* G, char* path[]); + +/* + * ¹¹ÔìÓÐÏòͼ + */ +static Status CreateDG(ALGraph* G); + +/* + * ¼Èë±ß/»¡µÄÏà¹Ø¸½¼ÓÐÅÏ¢ + */ +static void Input(ALGraph G, InfoType** info); + +/* + * ²éÕÒ + * + * ·µ»Ø¶¥µãuÔÚͼ/ÍøÖеÄλÖà + */ +int LocateVex(ALGraph G, VertexType u); + +/* + * ¹¹ÔìÒ»¸ö±ß/»¡½áµã(½öÏÞÄÚ²¿Ê¹ÓÃ) + */ +static ArcNode* newArcNodePtr(int adjvex, ArcNode* nextarc, InfoType* info); + +/* + * ²åÈë±ß/»¡ + * + * Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬Ôò²åÈëÒ»Ìõ»¡ÐèÒªÔö¼ÓÁ½¸ö¶¥µã¹ØÏµ£¬µ«»¡µÄÊýÁ¿Ö»ÔöÒ»¡£ + * ¶ÔÓÚͼ/ÍøÀ´Ëµ£¬¿ÉÒÔÔڿɱä²ÎÊýÖÐÁгö±ß/»¡µÄ¸½¼ÓÐÅÏ¢¡£ + * + * ×¢£º´Ë´¦½ÓÊյIJÎÊýÓëMGraphÓÐЩ²»Ò»Ñù£ºÍøµÄ¸½¼ÓÐÅÏ¢Öаüº¬Á˸÷Ìõ±ß/»¡µÄȨֵ¡£ + */ +Status InsertArc(ALGraph* G, VertexType v, VertexType w, ...); + +/* + * ÒÔͼÐλ¯ÐÎʽÊä³öµ±Ç°½á¹¹ + */ +void PrintGraph(ALGraph G); + +#endif diff --git a/VisualC++/ExerciseBook/07.34/SqStack.c b/VisualC++/ExerciseBook/07.34/SqStack.c new file mode 100644 index 0000000..f056778 --- /dev/null +++ b/VisualC++/ExerciseBook/07.34/SqStack.c @@ -0,0 +1,90 @@ +/*========================= + * Õ»µÄ˳Ðò´æ´¢½á¹¹£¨Ë³ÐòÕ»£© + ==========================*/ + +#include "SqStack.h" //**¡ø03 Õ»ºÍ¶ÓÁÐ**// + +/* + * ³õʼ»¯ + * + * ¹¹ÔìÒ»¸ö¿ÕÕ»¡£³õʼ»¯³É¹¦Ôò·µ»ØOK£¬·ñÔò·µ»ØERROR¡£ + */ +Status InitStack(SqStack* S) { + if(S == NULL) { + return ERROR; + } + + (*S).base = (SElemType*) malloc(STACK_INIT_SIZE * sizeof(SElemType)); + if((*S).base == NULL) { + exit(OVERFLOW); + } + + (*S).top = (*S).base; + (*S).stacksize = STACK_INIT_SIZE; + + return OK; +} + +/* + * ÅÐ¿Õ + * + * ÅжÏ˳ÐòÕ»ÖÐÊÇ·ñ°üº¬ÓÐЧÊý¾Ý¡£ + * + * ·µ»ØÖµ£º + * TRUE : ˳ÐòջΪ¿Õ + * FALSE: ˳ÐòÕ»²»Îª¿Õ + */ +Status StackEmpty(SqStack S) { + if(S.top == S.base) { + return TRUE; + } else { + return FALSE; + } +} + +/* + * ÈëÕ» + * + * ½«ÔªËØeѹÈëµ½Õ»¶¥¡£ + */ +Status Push(SqStack* S, SElemType e) { + if(S == NULL || (*S).base == NULL) { + return ERROR; + } + + // Õ»Âúʱ£¬×·¼Ó´æ´¢¿Õ¼ä + if((*S).top - (*S).base >= (*S).stacksize) { + (*S).base = (SElemType*) realloc((*S).base, ((*S).stacksize + STACKINCREMENT) * sizeof(SElemType)); + if((*S).base == NULL) { + exit(OVERFLOW); // ´æ´¢·ÖÅäʧ°Ü + } + + (*S).top = (*S).base + (*S).stacksize; + (*S).stacksize += STACKINCREMENT; + } + + // ½øÕ»Ïȸ³Öµ£¬Õ»¶¥Ö¸ÕëÔÙ×ÔÔö + *(S->top++) = e; + + return OK; +} + +/* + * ³öÕ» + * + * ½«Õ»¶¥ÔªËص¯³ö£¬²¢ÓÃe½ÓÊÕ¡£ + */ +Status Pop(SqStack* S, SElemType* e) { + if(S == NULL || (*S).base == NULL) { + return ERROR; + } + + if((*S).top == (*S).base) { + return ERROR; + } + + // ³öÕ»Õ»¶¥Ö¸ÕëÏȵݼõ£¬ÔÙ¸³Öµ + *e = *(--(*S).top); + + return OK; +} diff --git a/VisualC++/ExerciseBook/07.34/SqStack.h b/VisualC++/ExerciseBook/07.34/SqStack.h new file mode 100644 index 0000000..a8fe835 --- /dev/null +++ b/VisualC++/ExerciseBook/07.34/SqStack.h @@ -0,0 +1,59 @@ +/*========================= + * Õ»µÄ˳Ðò´æ´¢½á¹¹£¨Ë³ÐòÕ»£© + ==========================*/ + +#ifndef SQSTACK_H +#define SQSTACK_H + +#include +#include // Ìṩmalloc¡¢realloc¡¢free¡¢exitÔ­ÐÍ +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// + +/* ºê¶¨Òå */ +#define STACK_INIT_SIZE 100 // ˳ÐòÕ»´æ´¢¿Õ¼äµÄ³õʼ·ÖÅäÁ¿ +#define STACKINCREMENT 10 // ˳ÐòÕ»´æ´¢¿Õ¼äµÄ·ÖÅäÔöÁ¿ + +/* ˳ÐòÕ»ÔªËØÀàÐͶ¨Òå */ +typedef int SElemType; + +// ˳ÐòÕ»ÔªËØ½á¹¹ +typedef struct { + SElemType* base; // Õ»µ×Ö¸Õë + SElemType* top; // Õ»¶¥Ö¸Õë + int stacksize; // µ±Ç°ÒÑ·ÖÅäµÄ´æ´¢¿Õ¼ä£¬ÒÔÔªËØÎªµ¥Î» +} SqStack; + + +/* + * ³õʼ»¯ + * + * ¹¹ÔìÒ»¸ö¿ÕÕ»¡£³õʼ»¯³É¹¦Ôò·µ»ØOK£¬·ñÔò·µ»ØERROR¡£ + */ +Status InitStack(SqStack* S); + +/* + * ÅÐ¿Õ + * + * ÅжÏ˳ÐòÕ»ÖÐÊÇ·ñ°üº¬ÓÐЧÊý¾Ý¡£ + * + * ·µ»ØÖµ£º + * TRUE : ˳ÐòջΪ¿Õ + * FALSE: ˳ÐòÕ»²»Îª¿Õ + */ +Status StackEmpty(SqStack S); + +/* + * ÈëÕ» + * + * ½«ÔªËØeѹÈëµ½Õ»¶¥¡£ + */ +Status Push(SqStack* S, SElemType e); + +/* + * ³öÕ» + * + * ½«Õ»¶¥ÔªËص¯³ö£¬²¢ÓÃe½ÓÊÕ¡£ + */ +Status Pop(SqStack* S, SElemType* e); + +#endif diff --git a/VisualC++/ExerciseBook/07.34/TestData_DG.txt b/VisualC++/ExerciseBook/07.34/TestData_DG.txt new file mode 100644 index 0000000..a240ed8 --- /dev/null +++ b/VisualC++/ExerciseBook/07.34/TestData_DG.txt @@ -0,0 +1,6 @@ +ͼÀàÐÍ¡ú0£¨ÓÐÏòͼ£© +¶¥µãÊý¡ú12 +»¡Êý¡ú16 +»¡ÊÇ·ñ´øÓÐÆäËûÐÅÏ¢¡ú0 +¶¥µã¼¯¡ú¡¾A£¬B£¬C£¬D£¬E£¬F£¬G£¬H£¬I£¬J£¬K£¬L¡¿ +»¡µÄ¼¯ºÏ¡ú¡¾F£¬J¡¿¡¾F£¬B¡¿¡¾F£¬C¡¿¡¾F£¬A¡¿¡¾B£¬C¡¿¡¾J£¬I¡¿¡¾C£¬I¡¿¡¾C£¬H¡¿¡¾I£¬H¡¿¡¾C£¬G¡¿¡¾D£¬A¡¿¡¾D£¬L¡¿¡¾L£¬A¡¿¡¾D£¬K¡¿¡¾K£¬E¡¿¡¾E£¬G¡¿ \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.34/TopologicalSorting.c b/VisualC++/ExerciseBook/07.34/TopologicalSorting.c new file mode 100644 index 0000000..82001f5 --- /dev/null +++ b/VisualC++/ExerciseBook/07.34/TopologicalSorting.c @@ -0,0 +1,96 @@ +/*======================= + * AOV-Íø(ÓÐÏòͼ)µÄÍØÆËÅÅÐò + * + * °üº¬Ëã·¨: 7.12 + ========================*/ + +#include "TopologicalSorting.h" + +/* + * ¨€¨€¨€¨€¨€¨€¨€¨€ Ëã·¨7.12 ¨€¨€¨€¨€¨€¨€¨€¨€ + * + * Èç¹ûÓÐÏòͼGÎÞ»ØÂ·£¬ÔòÊä³öËüµÄÒ»¸öÍØÆËÐòÁв¢·µ»ØOK£»·ñÔò£¬·µ»ØFALSE¡£ + * ÍØÆËÐòÁÐͨ³£²»Î¨Ò»£¬µ«ÊDZØÐ뱣֤ijЩ¹Ø¼ü½ÚµãµÄÏȺó´ÎÐò¡£ + * + * ×¢£ºÓë½Ì²Ä²»Í¬Ö®´¦ÔÚÓÚ£¬´Ë´¦Ôö¼ÓÁËÒ»¸ötopoÊý×é×ö²ÎÊý¡£ + * ¡¡¡¡¶ÔÓÚÇó³öµÄÍØÆËÐòÁУ¬²»»áÖ±½ÓÊä³ö£¬¶øÊǻỺ´æµ½topoÖС£ + * ¡¡¡¡ÕâÑùµÄ×öµÄÄ¿µÄÊǺóÐøµÄϰÌâÖлáÓжദÓõ½¸ÃÍØÆËÐòÁС£ + */ +Status TopologicalSort(ALGraph G, int topo[MAX_VERTEX_NUM]) { + int i, k, count; + int indegree[MAX_VERTEX_NUM]; + SqStack S; + ArcNode* p; + + // ¶Ô¸÷¶¥µãÇóÈë¶È + FindInDegree(G, indegree); + + // ³õʼ»¯ÁãÈë¶È¶¥µãÕ» + InitStack(&S); + + // ½¨Á¢Èë¶ÈΪ0µÄ¶¥µãÕ» + for(i = 0; i < G.vexnum; i++) { + // ½«Èë¶ÈΪ0µÄ¶¥µãÌí¼Óµ½Õ»ÖÐ + if(indegree[i] == 0) { + Push(&S, i); + } + } + + // ¶ÔÍØÆËÐòÁÐÖеĶ¥µã¼ÆÊý + count = 0; + + // ±éÀú¶¥µãÕ» + while(!StackEmpty(S)) { + // »ñȡһ¸öÁãÈë¶È¶¥µã + Pop(&S, &i); + + // ½«¸÷¶¥µãµÄÐòºÅÔÝ´æÆðÀ´ + topo[count++] = i; + + // ±éÀúiºÅ¶¥µãµÄÁÚ½Óµã + for(p = G.vertices[i].firstarc; p != NULL; p = p->nextarc) { + // »ñÈ¡¶¥µãÐòºÅ + k = p->adjvex; + + /* + * ½«iºÅ¶¥µãÿ¸öÁÚ½ÓµãµÄÈë¶È¼õÒ»£¬ÕâÏ൱ÓÚÇжÎiºÅ¶¥µãµ½ÆäËüÁÚ½ÓµãµÄÁªÏµ¡£ + * Èç¹û³öÏÖÁËеÄÈë¶ÈΪ0µÄ¶¥µã£¬¼ÌÐø½«ÆäÈëÕ»¡£ + */ + if((--indegree[k]) == 0) { + Push(&S, k); + } + } + } + + // Èç¹ûÓöµ½ÁË»ØÂ·£¬Ôò·µ»ØERROR + if(count < G.vexnum) { + return ERROR; + } else { + return OK; + } +} + +/* + * ¼ÆËã¸÷¶¥µãµÄÈë¶È + */ +static void FindInDegree(ALGraph G, int indegree[MAX_VERTEX_NUM]) { + int i; + ArcNode* p; + + // ³õʼ»¯ËùÓж¥µãµÄÈë¶ÈΪ0 + for(i = 0; i < G.vexnum; i++) { + indegree[i] = 0; + } + + // ±éÀúËùÓж¥µã + for(i = 0; i < G.vexnum; i++) { + // Ö¸Ïò¸Ã¶¥µãµÄÊ׸öÁÚ½Óµã + p = G.vertices[i].firstarc; + + // ±éÀú¸Ã¶¥µãµÄËùÓÐÁڽӵ㣬ͳ¼Æ¸÷¶¥µãµÄÈë¶È + while(p != NULL) { + indegree[p->adjvex]++; + p = p->nextarc; + } + } +} diff --git a/VisualC++/ExerciseBook/07.34/TopologicalSorting.h b/VisualC++/ExerciseBook/07.34/TopologicalSorting.h new file mode 100644 index 0000000..3fae677 --- /dev/null +++ b/VisualC++/ExerciseBook/07.34/TopologicalSorting.h @@ -0,0 +1,28 @@ +/*======================= + * AOV-Íø(ÓÐÏòͼ)µÄÍØÆËÅÅÐò + * + * °üº¬Ëã·¨: 7.12 + ========================*/ + +#ifndef TOPOLOGICALSORTING_H +#define TOPOLOGICALSORTING_H + +#include +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// +#include "SqStack.h" //**¡ø03 Õ»ºÍ¶ÓÁÐ**// +#include "ALGraph.h" //**¡ø07 ͼ**// + +/* + * ¨€¨€¨€¨€¨€¨€¨€¨€ Ëã·¨7.12 ¨€¨€¨€¨€¨€¨€¨€¨€ + * + * Èç¹ûÓÐÏòͼGÎÞ»ØÂ·£¬ÔòÊä³öËüµÄÒ»¸öÍØÆËÐòÁв¢·µ»ØOK£»·ñÔò£¬·µ»ØFALSE¡£ + * ÍØÆËÐòÁÐͨ³£²»Î¨Ò»£¬µ«ÊDZØÐ뱣֤ijЩ¹Ø¼ü½ÚµãµÄÏȺó´ÎÐò¡£ + */ +Status TopologicalSort(ALGraph G, int topo[MAX_VERTEX_NUM]); + +/* + * ¼ÆËã¸÷¶¥µãµÄÈë¶È + */ +static void FindInDegree(ALGraph G, int indegree[MAX_VERTEX_NUM]); + +#endif diff --git a/VisualC++/ExerciseBook/07.35/07.35.c b/VisualC++/ExerciseBook/07.35/07.35.c new file mode 100644 index 0000000..3358ebe --- /dev/null +++ b/VisualC++/ExerciseBook/07.35/07.35.c @@ -0,0 +1,94 @@ +#include +#include "ALGraph.h" //**¡ø07 ͼ**// + +/* + * ·µ»ØÓÐÏòÎÞ»·Í¼µÄ¸ùÔÚ¶¥µãÏòÁ¿ÖеÄÐòºÅ£¬Èç¹û²»´æÔÚ£¬·µ»Ø-1¡£ + * + * ×¢£ºÈç¹û¸ù½áµã´æÔÚ£¬ÔòÒâζןøù½áµãµÄÈë¶ÈÒ»¶¨Îª0¡£ + * ¡¡¡¡ÒòΪÈç¹û¸ùµÄÈë¶È²»Îª0£¬ÄÇô±Ø¶¨»áÐγɻ·¡£ + * ¡¡¡¡Òò´Ë£¬±¾Ìâ±¾ÖÊÉϾÍÊÇѰÕÒÓÐÏòÎÞ»·Í¼ÖÐÈë¶ÈΪ0µÄÄǸö¶¥µã¡£ + */ +int Algo_7_35(ALGraph G); + + +int main(int argc, char* argv[]) { + ALGraph G; + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ´´½¨²¢Êä³öͼ...\n"); + { + char* path[4]; + + path[0] = "TestData_DG.txt"; + path[1] = ""; + path[2] = ""; + path[3] = ""; + + CreateGraph(&G, path); + PrintGraph(G); + printf("\n"); + } + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ²éÕÒÓÐÏòÎÞ»·Í¼µÄ¸ù...\n"); + { + int r = Algo_7_35(G); + + if(r == -1) { + printf("¸ø¶¨µÄÓÐÏòͼÎÞ»·Í¼²»´æÔÚ¸ù\n"); + } else { + printf("¸ÃÓÐÏòÎÞ»·Í¼µÄ¸ùΪ£º%c\n", G.vertices[r].data); + } + + printf("\n"); + } + + return 0; +} + + +/* + * ·µ»ØÓÐÏòÎÞ»·Í¼µÄ¸ùÔÚ¶¥µãÏòÁ¿ÖеÄÐòºÅ£¬Èç¹û²»´æÔÚ£¬·µ»Ø-1 + * + * ×¢£ºÈç¹û¸ù½áµã´æÔÚ£¬ÔòÒâζןøù½áµãµÄÈë¶ÈÒ»¶¨Îª0¡£ + * ¡¡¡¡ÒòΪÈç¹û¸ùµÄÈë¶È²»Îª0£¬ÄÇô±Ø¶¨»áÐγɻ·¡£ + * ¡¡¡¡Òò´Ë£¬±¾Ìâ±¾ÖÊÉϾÍÊÇѰÕÒÓÐÏòÎÞ»·Í¼ÖÐÈë¶ÈΪ0µÄÄǸö¶¥µã¡£ + */ +int Algo_7_35(ALGraph G) { + int i, count, root; + int indegree[MAX_VERTEX_NUM]; + ArcNode* p; + + // ³õʼ»¯ËùÓж¥µãµÄÈë¶ÈΪ0 + for(i = 0; i < G.vexnum; i++) { + indegree[i] = 0; + } + + // ±éÀúËùÓж¥µã + for(i = 0; i < G.vexnum; i++) { + // Ö¸Ïò¸Ã¶¥µãµÄÊ׸öÁÚ½Óµã + p = G.vertices[i].firstarc; + + // ±éÀú¸Ã¶¥µãµÄËùÓÐÁڽӵ㣬ͳ¼Æ¸÷¶¥µãµÄÈë¶È + while(p != NULL) { + indegree[p->adjvex]++; + p = p->nextarc; + } + } + + // ͳ¼ÆÈë¶ÈΪ0µÄ¶¥µãÊýÁ¿ + count = 0; + root = -1; + + for(i = 0; i < G.vexnum; i++) { + if(indegree[i] == 0) { + count++; + root = i; + } + } + + // ×î¶àÖ»ÓÐÒ»¸ö¸ù + if(count==1) { + return root; + } else { + return -1; + } +} diff --git a/VisualC++/ExerciseBook/07.35/07.35.png b/VisualC++/ExerciseBook/07.35/07.35.png new file mode 100644 index 0000000000000000000000000000000000000000..48cbc3678a34120a9a0f38eb9ee95a63122673c9 GIT binary patch literal 17387 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 D5Pw{E literal 0 HcmV?d00001 diff --git a/VisualC++/ExerciseBook/07.35/07.35.vcxproj b/VisualC++/ExerciseBook/07.35/07.35.vcxproj new file mode 100644 index 0000000..40d89d3 --- /dev/null +++ b/VisualC++/ExerciseBook/07.35/07.35.vcxproj @@ -0,0 +1,79 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {A1E2C405-8E90-4B6D-AC8F-FF259A7629AC} + My0735 + + + + Application + true + MultiByte + + + Application + false + true + MultiByte + + + + + + + + + + + + + $(SolutionDir)\..\Status;$(IncludePath) + + + + Level3 + Disabled + + + true + $(SolutionDir)\..\Status\Status.lib;%(AdditionalDependencies) + Console + + + + + Level3 + MaxSpeed + true + true + + + true + true + true + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.35/07.35.vcxproj.filters b/VisualC++/ExerciseBook/07.35/07.35.vcxproj.filters new file mode 100644 index 0000000..164cb68 --- /dev/null +++ b/VisualC++/ExerciseBook/07.35/07.35.vcxproj.filters @@ -0,0 +1,35 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + æºæ–‡ä»¶ + + + æºæ–‡ä»¶ + + + + + 头文件 + + + + + èµ„æºæ–‡ä»¶ + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.35/07.35.vcxproj.user b/VisualC++/ExerciseBook/07.35/07.35.vcxproj.user new file mode 100644 index 0000000..ace9a86 --- /dev/null +++ b/VisualC++/ExerciseBook/07.35/07.35.vcxproj.user @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.35/ALGraph.c b/VisualC++/ExerciseBook/07.35/ALGraph.c new file mode 100644 index 0000000..4f5206b --- /dev/null +++ b/VisualC++/ExerciseBook/07.35/ALGraph.c @@ -0,0 +1,325 @@ +/*================== + * ͼµÄÁÚ½Ó±í´æ´¢±íʾ + ===================*/ + +#include "ALGraph.h" + +// ¼ÈëÊý¾ÝµÄÔ´Îļþ£»fpΪnullʱ£¬ËµÃ÷ÐèÒª´Ó¿ØÖÆÌ¨Â¼Èë +static FILE* fp = NULL; + +/* + * IncInfoָʾ¸Ãͼ/ÍøµÄ±ß/»¡ÉÏÊÇ·ñ´æÔÚ¸½¼ÓÐÅÏ¢¡£ + * Èç¹ûÆäÖµ²»Îª0£¬Ôò±íʾÎÞ¸½¼ÓÐÅÏ¢£¬·ñÔò£¬±íʾ´æÔÚ¸½¼ÓÐÅÏ¢¡£ + */ +Boolean IncInfo = FALSE; + +// ·ÃÎʱêÖ¾Êý×飬¼Ç¼·ÃÎʹýµÄ¶¥µã +static Boolean visited[MAX_VERTEX_NUM]; + +// º¯Êý±äÁ¿ +static Status (* VisitFunc)(VertexType e); + + +/* + * ´´½¨ + * + *¡¾±¸×¢¡¿ + * + * ½Ì²ÄÖÐĬÈÏ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý¡£ + * ÕâÀïΪÁË·½±ã²âÊÔ£¬±ÜÃâÿ´ÎÔËÐж¼ÊÖ¶¯ÊäÈëÊý¾Ý£¬ + * Òò¶øÔÊÐíÑ¡Ôñ´ÓÔ¤ÉèµÄÎļþpathÖжÁÈ¡²âÊÔÊý¾Ý¡£ + * + * Èç¹ûÐèÒª´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý£¬ÔòpathΪNULL£¬»òpath[kind]Ϊ""¡£ + * Èç¹ûÐèÒª´ÓÎļþÖжÁÈ¡Êý¾Ý£¬ÔòÐèÒªÔÚpathÖÐÌîдÎļþÃûÐÅÏ¢¡£ + */ +Status CreateGraph(ALGraph* G, char* path[]) { + int readFromConsole; // ÊÇ·ñ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý + int kind; + Status flag; + + // ¡ï¡ï¡ï´Ë´¦¹Ì¶¨ÎªÓÐÏòͼ + kind = 0; + + // Èç¹ûûÓÐÎļþ·¾¶ÐÅÏ¢£¬Ôò´Ó¿ØÖÆÌ¨¶ÁÈ¡ÊäÈë + readFromConsole = (path == NULL) || strcmp(path[kind], "") == 0; + + // ÐèÒª´ÓÎļþ¶ÁÈ¡ + if(readFromConsole) { + (*G).kind = kind; // ¼Ç¼ͼ/ÍøµÄÀàÐÍ + } else { + // ´ò¿ªÎļþ£¬×¼±¸¶ÁÈ¡²âÊÔÊý¾Ý + fp = fopen(path[kind], "r"); + if(fp == NULL) { + return ERROR; + } + + // ¼ÈëͼµÄÀàÐÍ + ReadData(fp, "%d", &((*G).kind)); + } + + // Ëæ»ú´´½¨ÓÐÏòͼ/Íø»òÎÞÏòͼ/ÍøµÄÒ»ÖÖ + switch((*G).kind) { + case DG: + flag = CreateDG(G); + break; + default: + flag = ERROR; + break; + } + + if(fp != NULL) { + fclose(fp); + fp = NULL; + } + + return flag; +} + +/* + * ¹¹ÔìÓÐÏòͼ + */ +static Status CreateDG(ALGraph* G) { + int i, k; + int vexnum, arcnum; + VertexType v1, v2; + InfoType* info = NULL; + + (*G).vexnum = (*G).arcnum = 0; + + if(fp == NULL) { + printf("ÇëÊäÈëÓÐÏòͼµÄ¶¥µãÊý£º"); + scanf("%d", &vexnum); + printf("ÇëÊäÈëÓÐÏòͼµÄ»¡Êý£º"); + scanf("%d", &arcnum); + printf("¸ÃÓÐÏòͼµÄ»¡ÉÏÊÇ·ñ°üº¬ÆäËû¸½¼ÓÐÅÏ¢(0-²»°üº¬©¦1-°üº¬)£º"); + scanf("%d", &IncInfo); + + // ¼Èë¶¥µã¼¯ + printf("Çë¼Èë %d ¸ö¶¥µã£¬²»Í¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º", vexnum); + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(stdin); + scanf("%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } else { + ReadData(fp, "%d", &vexnum); // ¼Èë¶¥µãÊý + ReadData(fp, "%d", &arcnum); // ¼È뻡Êý + ReadData(fp, "%d", &IncInfo); // Åжϻ¡ÉÏÊÇ·ñ°üº¬¸½¼ÓÐÅÏ¢ + + // ¼Èë¶¥µã¼¯ + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(fp); + ReadData(fp, "%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } + + // ½öÔÚ¿ØÖÆÌ¨Â¼ÈëÐÅϢʱÊä³ö´ËÌáʾ + if(fp == NULL && arcnum != 0) { + printf("ÇëΪÓÐÏòͼÒÀ´Î¼Èë %d Ìõ»¡µÄÐÅÏ¢£¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º\n", arcnum); + } + + // ¼È뻡µÄÐÅÏ¢ + for(k = 0; k < arcnum; k++) { + if(fp == NULL) { + printf("µÚ %2d Ìõ»¡£º", k + 1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v2); + } else { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + skipBlank(fp); + ReadData(fp, "%c%c", &v1, &v2); + } + + // Èç¹ûÐèҪ¼È뻡µÄÆäËû¸½¼ÓÐÅÏ¢ + if(IncInfo) { + // ×îºó¼È븽¼ÓÐÅÏ¢ + Input(*G, &info); + } + + // ²åÈ뻡 + InsertArc(G, v1, v2, info); + } + + // ´ÓÎļþÖжÁÈ¡Êý¾Ýʱ£¬×îºóÆäʵӦµ±ÅжÏÒ»ÏÂÊÇ·ñ¶Áµ½ÁË×ã¹»µÄÐÅÏ¢ + return OK; +} + +/* + * ¼Èë±ß/»¡µÄÏà¹Ø¸½¼ÓÐÅÏ¢ + */ +static void Input(ALGraph G, InfoType** info) { + int weight; + + // ÔÚ"Íø"µÄÇéÐÎÏÂÐèҪ¼ÈëȨֵÐÅÏ¢ + if(G.kind == DN || G.kind == UDN) { + *info = (InfoType*) malloc(sizeof(InfoType)); + + if(fp == NULL) { + scanf("%d", &weight); + } else { + ReadData(fp, "%d", &weight); + } + + (*info)->weight = weight; + } +} + +/* + * ²éÕÒ + * + * ·µ»Ø¶¥µãuÔÚͼ/ÍøÖеÄλÖà + */ +int LocateVex(ALGraph G, VertexType u) { + int i; + + for(i = 0; i < G.vexnum; i++) { + if(G.vertices[i].data == u) { + return i; + } + } + + return -1; +} + +/* + * ¹¹ÔìÒ»¸ö±ß/»¡½áµã(½öÏÞÄÚ²¿Ê¹ÓÃ) + */ +static ArcNode* newArcNodePtr(int adjvex, ArcNode* nextarc, InfoType* info) { + ArcNode* p = (ArcNode*) malloc(sizeof(ArcNode)); + if(!p) { + exit(OVERFLOW); + } + + p->adjvex = adjvex; + + p->nextarc = nextarc; + + p->info = info; + + return p; +} + +/* + * ²åÈë±ß/»¡ + * + * Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬Ôò²åÈëÒ»Ìõ»¡ÐèÒªÔö¼ÓÁ½¸ö¶¥µã¹ØÏµ£¬µ«»¡µÄÊýÁ¿Ö»ÔöÒ»¡£ + * ¶ÔÓÚͼ/ÍøÀ´Ëµ£¬¿ÉÒÔÔڿɱä²ÎÊýÖÐÁгö±ß/»¡µÄ¸½¼ÓÐÅÏ¢¡£ + * + * ×¢£º´Ë´¦½ÓÊյIJÎÊýÓëMGraphÓÐЩ²»Ò»Ñù£ºÍøµÄ¸½¼ÓÐÅÏ¢Öаüº¬Á˸÷Ìõ±ß/»¡µÄȨֵ¡£ + */ +Status InsertArc(ALGraph* G, VertexType v, VertexType w, ...) { + int tail, head, k, count; + ArcNode* r; + ArcNode* pre; + Boolean overlay = FALSE; // ÊÇ·ñΪ¸²¸ÇÌí¼Ó + InfoType* info = NULL; // ±ß/»¡µÄ¸½¼ÓÐÅÏ¢ + va_list ap; + + tail = LocateVex(*G, v); // »ñÈ¡¶¥µãvÔÚ¶¥µã¼¯ÖеÄλÖà + if(tail == -1) { + return ERROR; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + head = LocateVex(*G, w); // »ñÈ¡¶¥µãwÔÚ¶¥µã¼¯ÖеÄλÖà + if(head == -1) { + return ERROR; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + // ¾Ü¾ø»· + if(tail == head) { + return ERROR; + } + + // Èç¹û±ß/»¡ÉÏ´æÔÚ¸½¼ÓÐÅÏ¢ + if(IncInfo) { + va_start(ap, w); // ÔÚwºó²éѯÊ׸ö¿É±ä²ÎÊý + info = va_arg(ap, InfoType*); // »ñÈ¡¸½¼ÓÐÅÏ¢ + va_end(ap); + } + + /* ½ÓÏÂÀ´£¬ÐèÒª²éÕÒºÏÊʵIJåÈëλÖà */ + + for(count = 0; count < 2; count++) { + pre = NULL; + // Ö¸ÏòÒÔtailΪβµÄÊ×Ìõ±ß/»¡ + r = G->vertices[tail].firstarc; + while(r != NULL && r->adjvex < head) { + pre = r; + r = r->nextarc; + } + + // Óöµ½ÁËÏàͬλÖõĽáµã + if(r != NULL && r->adjvex == head) { + r->info = info; // ¸´Óøýáµã + overlay = TRUE; // ·¢ÉúÁ˸²¸Ç + } else { + if(pre == NULL) { + G->vertices[tail].firstarc = newArcNodePtr(head, r, info); + } else { + pre->nextarc = newArcNodePtr(head, r, info); + } + } + + // Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬ÐèÒª¿¼ÂǶԳÆÐÔ + if((G->kind == UDG || G->kind == UDN) && tail != head) { + // µßµ¹iºÍj + k = tail; + tail = head; + head = k; + } else { + break; // Èç¹ûÊÇÓÐÏòµÄ£¬¿ÉÒÔ½áÊøÁË + } + } + + // ÔڷǸ²¸ÇµÄÇéÐÎÏ£¬²Å¿¼ÂǸüбß/»¡µÄÊýÁ¿ + if(!overlay) { + (*G).arcnum++; // ²»ÂÛÓÐÏòÎÞÏò£¬±ß/»¡ÊýÖ»ÔöÒ» + } + + return OK; +} + +/* + * ÒÔͼÐλ¯ÐÎʽÊä³öµ±Ç°½á¹¹ + */ +void PrintGraph(ALGraph G) { + int i; + ArcNode* p; + + if(G.vexnum == 0) { + printf("¿Õͼ£¬ÎÞÐè´òÓ¡£¡\n"); + return; + } + + printf("µ±Ç°Í¼/Íø°üº¬ %2d ¸ö¶¥µã£¬ %2d Ìõ±ß/»¡...\n", G.vexnum, G.arcnum); + + for(i = 0; i < G.vexnum; i++) { + printf("%c ===> ", G.vertices[i].data); + + p = G.vertices[i].firstarc; + while(p != NULL) { + if(IncInfo == 0) { + printf("%c ", G.vertices[p->adjvex].data); + + // ¶ÔÓÚÍø£¬»á´ÓÆä¸½¼ÓÐÅÏ¢ÖлñÈ¡µ½È¨Öµ + } else { + printf("%c[%2d] ", G.vertices[p->adjvex].data, p->info->weight); + } + + p = p->nextarc; + + if(p != NULL) { + printf("- "); + } + } + + printf("\n"); + } +} diff --git a/VisualC++/ExerciseBook/07.35/ALGraph.h b/VisualC++/ExerciseBook/07.35/ALGraph.h new file mode 100644 index 0000000..e70b2c2 --- /dev/null +++ b/VisualC++/ExerciseBook/07.35/ALGraph.h @@ -0,0 +1,128 @@ +/*================== + * ͼµÄÁÚ½Ó±í´æ´¢±íʾ + ===================*/ + +#ifndef ALGRAPH_H +#define ALGRAPH_H + +#include +#include // Ìṩmemset¡¢strcmp Ô­ÐÍ +#include // Ìṩºêva_list¡¢va_start¡¢va_arg¡¢va_end +#include // Ìṩmalloc¡¢realloc¡¢free¡¢exitÔ­ÐÍ +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// + +/* + * ×¢£º + * + * ͨ³£À´½²£¬ÎÞȨͼ±»¼ò³ÆÎª¡¾Í¼¡¿£¬ÓÐȨͼ±»¼ò³ÆÎª¡¾Íø¡¿¡£ + * ÎÞÏòͼ/ÍøÖеĶ¥µã¹ØÏµ±»³ÆÎª¡¾±ß¡¿£¬ÓÐÏòͼ/ÍøÖеĶ¥µã¹ØÏµ±»³ÆÎª¡¾»¡¡¿£¬²¢Çø·Ö»¡Í·Ó뻡β¡£ + * ʵ¼Ê±íÊöÖУ¬Î´±Ø»áÑϸñ×ñÊØÒÔÉÏÃüÃû¡£ + * + * µ±Ç°½á¹¹Êʺϴ洢±ß/»¡±È½ÏÏ¡ÊèµÄͼ/Íø¡£ + * + * ¡ï ²åÈë±ß/»¡µÄÐÅϢʱ£¬ÕâÀïµÄʵÏÖÊǰ´"ÉýÐò"²åÈëµÄ£¬ÕâʹµÃ²åÈëµÄ»¡Êǰ´"ÉýÐò"ÅÅÁеġ£ + */ + + +/* ºê¶¨Òå */ +#define MAX_VERTEX_NUM 26 // ×î´ó¶¥µã¸öÊý + + +// ͼµÄÀàÐÍ +typedef enum { + DG, // 0-ÓÐÏòͼ + DN, // 1-ÓÐÏòÍø(´øÈ¨Öµ) + UDG, // 2-ÎÞÏòͼ + UDN // 3-ÎÞÏòÍø(´øÈ¨Öµ) +} GraphKind; + +// ¶¥µãÀàÐÍ +typedef char VertexType; + +// ±ß/»¡µÄÏà¹Ø¸½¼ÓÐÅÏ¢ +typedef struct { + /* + * ×¢£º + * ½Ì²ÄÖиø³öµÄ½á¹¹Ö»¿¼ÂÇÁËÎÞȨͼ£¬¶øÃ»¿¼ÂÇÓÐȨͼ(Íø)¡£ + * ÕâÀïΪÁ˰ѡ°Íø¡±µÄÇéÐÎÒ²¿¼ÂǽøÈ¥£¬ÌØÔÚ¸½¼ÓÐÅÏ¢ÖÐÔö¼ÓÁË"È¨ÖØ"ÊôÐÔ¡£ + */ + int weight; +} InfoType; + +/* ±ß/»¡½áµã */ +typedef struct ArcNode { + int adjvex; // ¸Ã»¡ËùÖ¸ÏòµÄ¶¥µãµÄλÖà + struct ArcNode* nextarc; // Ö¸ÏòÏÂÒ»Ìõ»¡µÄÖ¸Õë + InfoType* info; // »¡µÄ¸½¼ÓÐÅÏ¢£¬Í¨³£ºöÂÔ +} ArcNode; + +// ÿ¸öÁ´±íµÄÍ·½áµã +typedef struct VNode { + VertexType data; // ¶¥µãÐÅÏ¢ + ArcNode* firstarc; // Ö¸ÏòµÚÒ»ÌõÒÀ¸½¸Ã¶¥µãµÄ»¡µÄÖ¸Õë +} VNode; + +/* ͼµÄÁÚ½Ó±í´æ´¢±íʾÀàÐͶ¨Òå */ +typedef struct { + VNode vertices[MAX_VERTEX_NUM]; // ÁÚ½Ó±í + int vexnum, arcnum; // ͼ/ÍøµÄ¶¥µãÊýºÍ»¡Êý + GraphKind kind; // ͼµÄÀàÐͱêÖ¾ +} ALGraph; + + +// ±ß/»¡ÉÏÊÇ·ñ´æÔÚ¸½¼ÓÐÅÏ¢ +extern Boolean IncInfo; + + +/* + * ´´½¨ + * + *¡¾±¸×¢¡¿ + * + * ½Ì²ÄÖÐĬÈÏ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý¡£ + * ÕâÀïΪÁË·½±ã²âÊÔ£¬±ÜÃâÿ´ÎÔËÐж¼ÊÖ¶¯ÊäÈëÊý¾Ý£¬ + * Òò¶øÔÊÐíÑ¡Ôñ´ÓÔ¤ÉèµÄÎļþpathÖжÁÈ¡²âÊÔÊý¾Ý¡£ + * + * Èç¹ûÐèÒª´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý£¬ÔòpathΪNULL£¬»òpath[kind]Ϊ""¡£ + * Èç¹ûÐèÒª´ÓÎļþÖжÁÈ¡Êý¾Ý£¬ÔòÐèÒªÔÚpathÖÐÌîдÎļþÃûÐÅÏ¢¡£ + */ +Status CreateGraph(ALGraph* G, char* path[]); + +/* + * ¹¹ÔìÓÐÏòͼ + */ +static Status CreateDG(ALGraph* G); + +/* + * ¼Èë±ß/»¡µÄÏà¹Ø¸½¼ÓÐÅÏ¢ + */ +static void Input(ALGraph G, InfoType** info); + +/* + * ²éÕÒ + * + * ·µ»Ø¶¥µãuÔÚͼ/ÍøÖеÄλÖà + */ +int LocateVex(ALGraph G, VertexType u); + +/* + * ¹¹ÔìÒ»¸ö±ß/»¡½áµã(½öÏÞÄÚ²¿Ê¹ÓÃ) + */ +static ArcNode* newArcNodePtr(int adjvex, ArcNode* nextarc, InfoType* info); + +/* + * ²åÈë±ß/»¡ + * + * Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬Ôò²åÈëÒ»Ìõ»¡ÐèÒªÔö¼ÓÁ½¸ö¶¥µã¹ØÏµ£¬µ«»¡µÄÊýÁ¿Ö»ÔöÒ»¡£ + * ¶ÔÓÚͼ/ÍøÀ´Ëµ£¬¿ÉÒÔÔڿɱä²ÎÊýÖÐÁгö±ß/»¡µÄ¸½¼ÓÐÅÏ¢¡£ + * + * ×¢£º´Ë´¦½ÓÊյIJÎÊýÓëMGraphÓÐЩ²»Ò»Ñù£ºÍøµÄ¸½¼ÓÐÅÏ¢Öаüº¬Á˸÷Ìõ±ß/»¡µÄȨֵ¡£ + */ +Status InsertArc(ALGraph* G, VertexType v, VertexType w, ...); + +/* + * ÒÔͼÐλ¯ÐÎʽÊä³öµ±Ç°½á¹¹ + */ +void PrintGraph(ALGraph G); + +#endif diff --git a/VisualC++/ExerciseBook/07.35/TestData_DG.txt b/VisualC++/ExerciseBook/07.35/TestData_DG.txt new file mode 100644 index 0000000..777c5ed --- /dev/null +++ b/VisualC++/ExerciseBook/07.35/TestData_DG.txt @@ -0,0 +1,6 @@ +ͼÀàÐÍ¡ú0£¨ÓÐÏòͼ£© +¶¥µãÊý¡ú12 +»¡Êý¡ú17 +»¡ÊÇ·ñ´øÓÐÆäËûÐÅÏ¢¡ú0 +¶¥µã¼¯¡ú¡¾A£¬B£¬C£¬D£¬E£¬F£¬G£¬H£¬I£¬J£¬K£¬L¡¿ +»¡µÄ¼¯ºÏ¡ú¡¾F£¬J¡¿¡¾F£¬B¡¿¡¾F£¬C¡¿¡¾F£¬A¡¿¡¾B£¬C¡¿¡¾J£¬I¡¿¡¾C£¬I¡¿¡¾C£¬H¡¿¡¾I£¬H¡¿¡¾C£¬G¡¿¡¾D£¬A¡¿¡¾D£¬L¡¿¡¾L£¬A¡¿¡¾D£¬K¡¿¡¾K£¬E¡¿¡¾E£¬G¡¿¡¾F£¬D¡¿ \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.36-07.37/07.36-07.37.c b/VisualC++/ExerciseBook/07.36-07.37/07.36-07.37.c new file mode 100644 index 0000000..842d566 --- /dev/null +++ b/VisualC++/ExerciseBook/07.36-07.37/07.36-07.37.c @@ -0,0 +1,167 @@ +#include +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// +#include "ALGraph.h" //**¡ø07 ͼ**// +#include "TopologicalSorting.h" //**¡ø07 ͼ**// + +/* + * ÇóÓÐÏòÎÞ»·Í¼¸÷¶¥µãµÄ×·¾¶¡£ + * + * ¿ÉÒÔ½èÖúÆäÍØÆËÐòÁУ¬´ÓºóÏòǰ±éÀú¸÷¶¥µãÀ´¼ÆËã×·¾¶£¬ + * Ô­ÀíÊǶÔÓÚÈÎÒ»¶¥µã³ö·¢µÄ×·¾¶p1£¬ÆäÁÚ½ÓµãµÄ×·¾¶p2Ò²±Ø¶¨ÔÚ×·¾¶p1ÉÏ£¬ + * ¼´£ºÄ³¶¥µãµÄ×·¾¶ = max{ÁÚ½ÓµãµÄ×·¾¶} + * + * ÕâÀïûÓн«MPLÓòÖ±½ÓдÔÚALGraph½á¹¹ÖУ¬¶øÊǽ«Æäµ¥¶À×÷Ϊһ¸öÊý×éÈ¡ÉùÃ÷£¬ÔÚºËÐÄËã·¨ÉÏûÓÐÈκÎÇø±ð¡£ + */ +void Algo_7_36(ALGraph G, int MPL[MAX_VERTEX_NUM][MAX_VERTEX_NUM + 1]); + +/* + * ´òÓ¡¸÷¶¥µãµÄ×·¾¶ + */ +static void PrintPath_7_36(ALGraph G, int MPL[MAX_VERTEX_NUM][MAX_VERTEX_NUM + 1]); + +/* + * ÇóÈ¡ÓÐÏòÎÞ»·Í¼µÄ×·¾¶ + */ +void Algo_7_37(ALGraph G, int mpl[MAX_VERTEX_NUM + 1]); + + +int main(int argc, char* argv[]) { + ALGraph G; + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ´´½¨²¢Êä³öͼ...\n"); + { + char* path[4]; + + path[0] = "TestData_DG.txt"; + path[1] = ""; + path[2] = ""; + path[3] = ""; + + CreateGraph(&G, path); + PrintGraph(G); + printf("\n"); + } + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ Ìâ7.36£ºÇóÈ¡ÓÐÏòÎÞ»·Í¼¸÷¶¥µãµÄ×·¾¶...\n"); + { + int MPL[MAX_VERTEX_NUM][MAX_VERTEX_NUM + 1]; + + Algo_7_36(G, MPL); + PrintPath_7_36(G, MPL); + printf("\n"); + } + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ Ìâ7.37£ºÇóÈ¡ÓÐÏòÎÞ»·Í¼ÖеÄ×·¾¶...\n"); + { + int mpl[MAX_VERTEX_NUM + 1]; + int i; + + Algo_7_37(G, mpl); + for(i = 1; i <= mpl[0] + 1; i++) { + printf("%c ", G.vertices[mpl[i]].data); + } + printf("\n"); + } + + return 0; +} + + +/* + * ÇóÓÐÏòÎÞ»·Í¼¸÷¶¥µãµÄ×·¾¶¡£ + * + * ¿ÉÒÔ½èÖúÆäÍØÆËÐòÁУ¬´ÓºóÏòǰ±éÀú¸÷¶¥µãÀ´¼ÆËã×·¾¶£¬ + * Ô­ÀíÊǶÔÓÚÈÎÒ»¶¥µã³ö·¢µÄ×·¾¶p1£¬ÆäÁÚ½ÓµãµÄ×·¾¶p2Ò²±Ø¶¨ÔÚ×·¾¶p1ÉÏ£¬ + * ¼´£ºÄ³¶¥µãµÄ×·¾¶³¤¶È = max{ÁÚ½ÓµãµÄ×·¾¶³¤¶È} + 1 + * + * ÕâÀïûÓн«MPLÓòÖ±½ÓдÔÚALGraph½á¹¹ÖУ¬¶øÊǽ«Æäµ¥¶À×÷Ϊһ¸öÊý×éÈ¡ÉùÃ÷£¬ÔÚºËÐÄËã·¨ÉÏûÓÐÈκÎÇø±ð¡£ + */ +void Algo_7_36(ALGraph G, int MPL[MAX_VERTEX_NUM][MAX_VERTEX_NUM + 1]) { + int i, j, v, w; + int max, k; + int topo[MAX_VERTEX_NUM]; + ArcNode* p; + + if(TopologicalSort(G, topo) == ERROR) { + printf("¸ø¶¨µÄÓÐÏòͼ´æÔÚ»ØÂ·£¬ÎÞ·¨»ñÈ¡ÆäÍØÆËÐòÁÐ...\n"); + return; + } + + // ÄæÐò±éÀúÍØÆËÐòÁÐ + for(i = G.vexnum - 1; i >= 0; i--) { + v = topo[i]; + + MPL[v][0] = 0; // 0ºÅµ¥Ôª´æ´¢Â·¾¶³¤¶È + MPL[v][1] = v; // 1ºÅµ¥Ôª´æ´¢Â·¾¶µÄÆðʼ¶¥µãÐòºÅ + + p = G.vertices[v].firstarc; + + // ¶ÔÓÚûÓÐÁÚ½ÓµãµÄ¶¥µã£¬Æä×·¾¶³¤¶ÈΪ0£¬ÎÞÐèÔÙÑо¿ÏÂÈ¥ + if(p == NULL) { + continue; + } + + max = -1; // ÁÚ½ÓµãÖÐ×î´ó·¾¶³¤¶È + k = -1; // ¼Ç¼ӵÓÐ×î´ó·¾¶³¤¶ÈµÄÁÚ½ÓµãµÄÐòºÅ + + // ±éÀúÁÚ½Óµã + while(p != NULL) { + w = p->adjvex; // ÁÚ½ÓµãÐòºÅ + + // Èç¹ûÓжàÌõÏàͬ³¤¶ÈµÄ·¾¶£¬ÔòֻȡÊ×ÏÈ·¢ÏÖµÄÒ»Ìõ + if(MPL[w][0] > max) { + max = MPL[w][0]; + k = w; + } + + p = p->nextarc; + } + + // ¶¥µã×·¾¶³¤¶È = max{ÁÚ½ÓµãµÄ×·¾¶³¤¶È} + 1 + MPL[v][0] = max + 1; + + // ½«ÁÚ½Óµã³ö·¢µÄ×·¾¶¸´ÖƵ½µ±Ç°¶¥µãµÄ×·¾¶ÉÏ + for(j = 1; j <= max + 1; j++) { + MPL[v][j + 1] = MPL[k][j]; + } + } +} + +/* + * ´òÓ¡¸÷¶¥µãµÄ×·¾¶ + */ +static void PrintPath_7_36(ALGraph G, int MPL[MAX_VERTEX_NUM][MAX_VERTEX_NUM + 1]) { + int i, j; + + for(i = 0; i < G.vexnum; i++) { + printf("´Ó¶¥µã %c ³ö·¢µÄ×·¾¶Îª£º", G.vertices[i].data); + for(j = 1; j <= MPL[i][0] + 1; j++) { + printf("%c ", G.vertices[MPL[i][j]].data); + } + printf("\n"); + } +} + +/* + * ÇóÈ¡ÓÐÏòÎÞ»·Í¼µÄ×·¾¶ + */ +void Algo_7_37(ALGraph G, int mpl[MAX_VERTEX_NUM + 1]) { + int MPL[MAX_VERTEX_NUM][MAX_VERTEX_NUM + 1]; + int i, max, k; + + // ÇóÈ¡ËùÓж¥µãµÄ×·¾¶ + Algo_7_36(G, MPL); + + max = -1; + + for(i = 0; i < G.vexnum; i++) { + if(MPL[i][0] > max) { + max = MPL[i][0]; + k = i; + } + } + + for(i = 0; i <= MPL[k][0] + 1; i++) { + mpl[i] = MPL[k][i]; + } +} diff --git a/VisualC++/ExerciseBook/07.36-07.37/07.36-07.37.png b/VisualC++/ExerciseBook/07.36-07.37/07.36-07.37.png new file mode 100644 index 0000000000000000000000000000000000000000..6bb19199dc12ec07185960e5914dd51744fe7485 GIT binary patch literal 16448 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 MqODx1Xchkd0f5#y;s5{u literal 0 HcmV?d00001 diff --git a/VisualC++/ExerciseBook/07.36-07.37/07.36-07.37.vcxproj b/VisualC++/ExerciseBook/07.36-07.37/07.36-07.37.vcxproj new file mode 100644 index 0000000..15e9abe --- /dev/null +++ b/VisualC++/ExerciseBook/07.36-07.37/07.36-07.37.vcxproj @@ -0,0 +1,83 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {707A6B90-9FB4-4CF4-9ACA-6222CFA18D9A} + My07360737 + + + + Application + true + MultiByte + + + Application + false + true + MultiByte + + + + + + + + + + + + + $(SolutionDir)\..\Status;$(IncludePath) + + + + Level3 + Disabled + + + true + $(SolutionDir)\..\Status\Status.lib;%(AdditionalDependencies) + Console + + + + + Level3 + MaxSpeed + true + true + + + true + true + true + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.36-07.37/07.36-07.37.vcxproj.filters b/VisualC++/ExerciseBook/07.36-07.37/07.36-07.37.vcxproj.filters new file mode 100644 index 0000000..7bb5822 --- /dev/null +++ b/VisualC++/ExerciseBook/07.36-07.37/07.36-07.37.vcxproj.filters @@ -0,0 +1,47 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + æºæ–‡ä»¶ + + + æºæ–‡ä»¶ + + + æºæ–‡ä»¶ + + + æºæ–‡ä»¶ + + + + + 头文件 + + + 头文件 + + + 头文件 + + + + + èµ„æºæ–‡ä»¶ + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.36-07.37/07.36-07.37.vcxproj.user b/VisualC++/ExerciseBook/07.36-07.37/07.36-07.37.vcxproj.user new file mode 100644 index 0000000..ace9a86 --- /dev/null +++ b/VisualC++/ExerciseBook/07.36-07.37/07.36-07.37.vcxproj.user @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.36-07.37/ALGraph.c b/VisualC++/ExerciseBook/07.36-07.37/ALGraph.c new file mode 100644 index 0000000..4f5206b --- /dev/null +++ b/VisualC++/ExerciseBook/07.36-07.37/ALGraph.c @@ -0,0 +1,325 @@ +/*================== + * ͼµÄÁÚ½Ó±í´æ´¢±íʾ + ===================*/ + +#include "ALGraph.h" + +// ¼ÈëÊý¾ÝµÄÔ´Îļþ£»fpΪnullʱ£¬ËµÃ÷ÐèÒª´Ó¿ØÖÆÌ¨Â¼Èë +static FILE* fp = NULL; + +/* + * IncInfoָʾ¸Ãͼ/ÍøµÄ±ß/»¡ÉÏÊÇ·ñ´æÔÚ¸½¼ÓÐÅÏ¢¡£ + * Èç¹ûÆäÖµ²»Îª0£¬Ôò±íʾÎÞ¸½¼ÓÐÅÏ¢£¬·ñÔò£¬±íʾ´æÔÚ¸½¼ÓÐÅÏ¢¡£ + */ +Boolean IncInfo = FALSE; + +// ·ÃÎʱêÖ¾Êý×飬¼Ç¼·ÃÎʹýµÄ¶¥µã +static Boolean visited[MAX_VERTEX_NUM]; + +// º¯Êý±äÁ¿ +static Status (* VisitFunc)(VertexType e); + + +/* + * ´´½¨ + * + *¡¾±¸×¢¡¿ + * + * ½Ì²ÄÖÐĬÈÏ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý¡£ + * ÕâÀïΪÁË·½±ã²âÊÔ£¬±ÜÃâÿ´ÎÔËÐж¼ÊÖ¶¯ÊäÈëÊý¾Ý£¬ + * Òò¶øÔÊÐíÑ¡Ôñ´ÓÔ¤ÉèµÄÎļþpathÖжÁÈ¡²âÊÔÊý¾Ý¡£ + * + * Èç¹ûÐèÒª´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý£¬ÔòpathΪNULL£¬»òpath[kind]Ϊ""¡£ + * Èç¹ûÐèÒª´ÓÎļþÖжÁÈ¡Êý¾Ý£¬ÔòÐèÒªÔÚpathÖÐÌîдÎļþÃûÐÅÏ¢¡£ + */ +Status CreateGraph(ALGraph* G, char* path[]) { + int readFromConsole; // ÊÇ·ñ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý + int kind; + Status flag; + + // ¡ï¡ï¡ï´Ë´¦¹Ì¶¨ÎªÓÐÏòͼ + kind = 0; + + // Èç¹ûûÓÐÎļþ·¾¶ÐÅÏ¢£¬Ôò´Ó¿ØÖÆÌ¨¶ÁÈ¡ÊäÈë + readFromConsole = (path == NULL) || strcmp(path[kind], "") == 0; + + // ÐèÒª´ÓÎļþ¶ÁÈ¡ + if(readFromConsole) { + (*G).kind = kind; // ¼Ç¼ͼ/ÍøµÄÀàÐÍ + } else { + // ´ò¿ªÎļþ£¬×¼±¸¶ÁÈ¡²âÊÔÊý¾Ý + fp = fopen(path[kind], "r"); + if(fp == NULL) { + return ERROR; + } + + // ¼ÈëͼµÄÀàÐÍ + ReadData(fp, "%d", &((*G).kind)); + } + + // Ëæ»ú´´½¨ÓÐÏòͼ/Íø»òÎÞÏòͼ/ÍøµÄÒ»ÖÖ + switch((*G).kind) { + case DG: + flag = CreateDG(G); + break; + default: + flag = ERROR; + break; + } + + if(fp != NULL) { + fclose(fp); + fp = NULL; + } + + return flag; +} + +/* + * ¹¹ÔìÓÐÏòͼ + */ +static Status CreateDG(ALGraph* G) { + int i, k; + int vexnum, arcnum; + VertexType v1, v2; + InfoType* info = NULL; + + (*G).vexnum = (*G).arcnum = 0; + + if(fp == NULL) { + printf("ÇëÊäÈëÓÐÏòͼµÄ¶¥µãÊý£º"); + scanf("%d", &vexnum); + printf("ÇëÊäÈëÓÐÏòͼµÄ»¡Êý£º"); + scanf("%d", &arcnum); + printf("¸ÃÓÐÏòͼµÄ»¡ÉÏÊÇ·ñ°üº¬ÆäËû¸½¼ÓÐÅÏ¢(0-²»°üº¬©¦1-°üº¬)£º"); + scanf("%d", &IncInfo); + + // ¼Èë¶¥µã¼¯ + printf("Çë¼Èë %d ¸ö¶¥µã£¬²»Í¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º", vexnum); + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(stdin); + scanf("%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } else { + ReadData(fp, "%d", &vexnum); // ¼Èë¶¥µãÊý + ReadData(fp, "%d", &arcnum); // ¼È뻡Êý + ReadData(fp, "%d", &IncInfo); // Åжϻ¡ÉÏÊÇ·ñ°üº¬¸½¼ÓÐÅÏ¢ + + // ¼Èë¶¥µã¼¯ + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(fp); + ReadData(fp, "%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } + + // ½öÔÚ¿ØÖÆÌ¨Â¼ÈëÐÅϢʱÊä³ö´ËÌáʾ + if(fp == NULL && arcnum != 0) { + printf("ÇëΪÓÐÏòͼÒÀ´Î¼Èë %d Ìõ»¡µÄÐÅÏ¢£¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º\n", arcnum); + } + + // ¼È뻡µÄÐÅÏ¢ + for(k = 0; k < arcnum; k++) { + if(fp == NULL) { + printf("µÚ %2d Ìõ»¡£º", k + 1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v2); + } else { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + skipBlank(fp); + ReadData(fp, "%c%c", &v1, &v2); + } + + // Èç¹ûÐèҪ¼È뻡µÄÆäËû¸½¼ÓÐÅÏ¢ + if(IncInfo) { + // ×îºó¼È븽¼ÓÐÅÏ¢ + Input(*G, &info); + } + + // ²åÈ뻡 + InsertArc(G, v1, v2, info); + } + + // ´ÓÎļþÖжÁÈ¡Êý¾Ýʱ£¬×îºóÆäʵӦµ±ÅжÏÒ»ÏÂÊÇ·ñ¶Áµ½ÁË×ã¹»µÄÐÅÏ¢ + return OK; +} + +/* + * ¼Èë±ß/»¡µÄÏà¹Ø¸½¼ÓÐÅÏ¢ + */ +static void Input(ALGraph G, InfoType** info) { + int weight; + + // ÔÚ"Íø"µÄÇéÐÎÏÂÐèҪ¼ÈëȨֵÐÅÏ¢ + if(G.kind == DN || G.kind == UDN) { + *info = (InfoType*) malloc(sizeof(InfoType)); + + if(fp == NULL) { + scanf("%d", &weight); + } else { + ReadData(fp, "%d", &weight); + } + + (*info)->weight = weight; + } +} + +/* + * ²éÕÒ + * + * ·µ»Ø¶¥µãuÔÚͼ/ÍøÖеÄλÖà + */ +int LocateVex(ALGraph G, VertexType u) { + int i; + + for(i = 0; i < G.vexnum; i++) { + if(G.vertices[i].data == u) { + return i; + } + } + + return -1; +} + +/* + * ¹¹ÔìÒ»¸ö±ß/»¡½áµã(½öÏÞÄÚ²¿Ê¹ÓÃ) + */ +static ArcNode* newArcNodePtr(int adjvex, ArcNode* nextarc, InfoType* info) { + ArcNode* p = (ArcNode*) malloc(sizeof(ArcNode)); + if(!p) { + exit(OVERFLOW); + } + + p->adjvex = adjvex; + + p->nextarc = nextarc; + + p->info = info; + + return p; +} + +/* + * ²åÈë±ß/»¡ + * + * Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬Ôò²åÈëÒ»Ìõ»¡ÐèÒªÔö¼ÓÁ½¸ö¶¥µã¹ØÏµ£¬µ«»¡µÄÊýÁ¿Ö»ÔöÒ»¡£ + * ¶ÔÓÚͼ/ÍøÀ´Ëµ£¬¿ÉÒÔÔڿɱä²ÎÊýÖÐÁгö±ß/»¡µÄ¸½¼ÓÐÅÏ¢¡£ + * + * ×¢£º´Ë´¦½ÓÊյIJÎÊýÓëMGraphÓÐЩ²»Ò»Ñù£ºÍøµÄ¸½¼ÓÐÅÏ¢Öаüº¬Á˸÷Ìõ±ß/»¡µÄȨֵ¡£ + */ +Status InsertArc(ALGraph* G, VertexType v, VertexType w, ...) { + int tail, head, k, count; + ArcNode* r; + ArcNode* pre; + Boolean overlay = FALSE; // ÊÇ·ñΪ¸²¸ÇÌí¼Ó + InfoType* info = NULL; // ±ß/»¡µÄ¸½¼ÓÐÅÏ¢ + va_list ap; + + tail = LocateVex(*G, v); // »ñÈ¡¶¥µãvÔÚ¶¥µã¼¯ÖеÄλÖà + if(tail == -1) { + return ERROR; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + head = LocateVex(*G, w); // »ñÈ¡¶¥µãwÔÚ¶¥µã¼¯ÖеÄλÖà + if(head == -1) { + return ERROR; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + // ¾Ü¾ø»· + if(tail == head) { + return ERROR; + } + + // Èç¹û±ß/»¡ÉÏ´æÔÚ¸½¼ÓÐÅÏ¢ + if(IncInfo) { + va_start(ap, w); // ÔÚwºó²éѯÊ׸ö¿É±ä²ÎÊý + info = va_arg(ap, InfoType*); // »ñÈ¡¸½¼ÓÐÅÏ¢ + va_end(ap); + } + + /* ½ÓÏÂÀ´£¬ÐèÒª²éÕÒºÏÊʵIJåÈëλÖà */ + + for(count = 0; count < 2; count++) { + pre = NULL; + // Ö¸ÏòÒÔtailΪβµÄÊ×Ìõ±ß/»¡ + r = G->vertices[tail].firstarc; + while(r != NULL && r->adjvex < head) { + pre = r; + r = r->nextarc; + } + + // Óöµ½ÁËÏàͬλÖõĽáµã + if(r != NULL && r->adjvex == head) { + r->info = info; // ¸´Óøýáµã + overlay = TRUE; // ·¢ÉúÁ˸²¸Ç + } else { + if(pre == NULL) { + G->vertices[tail].firstarc = newArcNodePtr(head, r, info); + } else { + pre->nextarc = newArcNodePtr(head, r, info); + } + } + + // Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬ÐèÒª¿¼ÂǶԳÆÐÔ + if((G->kind == UDG || G->kind == UDN) && tail != head) { + // µßµ¹iºÍj + k = tail; + tail = head; + head = k; + } else { + break; // Èç¹ûÊÇÓÐÏòµÄ£¬¿ÉÒÔ½áÊøÁË + } + } + + // ÔڷǸ²¸ÇµÄÇéÐÎÏ£¬²Å¿¼ÂǸüбß/»¡µÄÊýÁ¿ + if(!overlay) { + (*G).arcnum++; // ²»ÂÛÓÐÏòÎÞÏò£¬±ß/»¡ÊýÖ»ÔöÒ» + } + + return OK; +} + +/* + * ÒÔͼÐλ¯ÐÎʽÊä³öµ±Ç°½á¹¹ + */ +void PrintGraph(ALGraph G) { + int i; + ArcNode* p; + + if(G.vexnum == 0) { + printf("¿Õͼ£¬ÎÞÐè´òÓ¡£¡\n"); + return; + } + + printf("µ±Ç°Í¼/Íø°üº¬ %2d ¸ö¶¥µã£¬ %2d Ìõ±ß/»¡...\n", G.vexnum, G.arcnum); + + for(i = 0; i < G.vexnum; i++) { + printf("%c ===> ", G.vertices[i].data); + + p = G.vertices[i].firstarc; + while(p != NULL) { + if(IncInfo == 0) { + printf("%c ", G.vertices[p->adjvex].data); + + // ¶ÔÓÚÍø£¬»á´ÓÆä¸½¼ÓÐÅÏ¢ÖлñÈ¡µ½È¨Öµ + } else { + printf("%c[%2d] ", G.vertices[p->adjvex].data, p->info->weight); + } + + p = p->nextarc; + + if(p != NULL) { + printf("- "); + } + } + + printf("\n"); + } +} diff --git a/VisualC++/ExerciseBook/07.36-07.37/ALGraph.h b/VisualC++/ExerciseBook/07.36-07.37/ALGraph.h new file mode 100644 index 0000000..e70b2c2 --- /dev/null +++ b/VisualC++/ExerciseBook/07.36-07.37/ALGraph.h @@ -0,0 +1,128 @@ +/*================== + * ͼµÄÁÚ½Ó±í´æ´¢±íʾ + ===================*/ + +#ifndef ALGRAPH_H +#define ALGRAPH_H + +#include +#include // Ìṩmemset¡¢strcmp Ô­ÐÍ +#include // Ìṩºêva_list¡¢va_start¡¢va_arg¡¢va_end +#include // Ìṩmalloc¡¢realloc¡¢free¡¢exitÔ­ÐÍ +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// + +/* + * ×¢£º + * + * ͨ³£À´½²£¬ÎÞȨͼ±»¼ò³ÆÎª¡¾Í¼¡¿£¬ÓÐȨͼ±»¼ò³ÆÎª¡¾Íø¡¿¡£ + * ÎÞÏòͼ/ÍøÖеĶ¥µã¹ØÏµ±»³ÆÎª¡¾±ß¡¿£¬ÓÐÏòͼ/ÍøÖеĶ¥µã¹ØÏµ±»³ÆÎª¡¾»¡¡¿£¬²¢Çø·Ö»¡Í·Ó뻡β¡£ + * ʵ¼Ê±íÊöÖУ¬Î´±Ø»áÑϸñ×ñÊØÒÔÉÏÃüÃû¡£ + * + * µ±Ç°½á¹¹Êʺϴ洢±ß/»¡±È½ÏÏ¡ÊèµÄͼ/Íø¡£ + * + * ¡ï ²åÈë±ß/»¡µÄÐÅϢʱ£¬ÕâÀïµÄʵÏÖÊǰ´"ÉýÐò"²åÈëµÄ£¬ÕâʹµÃ²åÈëµÄ»¡Êǰ´"ÉýÐò"ÅÅÁеġ£ + */ + + +/* ºê¶¨Òå */ +#define MAX_VERTEX_NUM 26 // ×î´ó¶¥µã¸öÊý + + +// ͼµÄÀàÐÍ +typedef enum { + DG, // 0-ÓÐÏòͼ + DN, // 1-ÓÐÏòÍø(´øÈ¨Öµ) + UDG, // 2-ÎÞÏòͼ + UDN // 3-ÎÞÏòÍø(´øÈ¨Öµ) +} GraphKind; + +// ¶¥µãÀàÐÍ +typedef char VertexType; + +// ±ß/»¡µÄÏà¹Ø¸½¼ÓÐÅÏ¢ +typedef struct { + /* + * ×¢£º + * ½Ì²ÄÖиø³öµÄ½á¹¹Ö»¿¼ÂÇÁËÎÞȨͼ£¬¶øÃ»¿¼ÂÇÓÐȨͼ(Íø)¡£ + * ÕâÀïΪÁ˰ѡ°Íø¡±µÄÇéÐÎÒ²¿¼ÂǽøÈ¥£¬ÌØÔÚ¸½¼ÓÐÅÏ¢ÖÐÔö¼ÓÁË"È¨ÖØ"ÊôÐÔ¡£ + */ + int weight; +} InfoType; + +/* ±ß/»¡½áµã */ +typedef struct ArcNode { + int adjvex; // ¸Ã»¡ËùÖ¸ÏòµÄ¶¥µãµÄλÖà + struct ArcNode* nextarc; // Ö¸ÏòÏÂÒ»Ìõ»¡µÄÖ¸Õë + InfoType* info; // »¡µÄ¸½¼ÓÐÅÏ¢£¬Í¨³£ºöÂÔ +} ArcNode; + +// ÿ¸öÁ´±íµÄÍ·½áµã +typedef struct VNode { + VertexType data; // ¶¥µãÐÅÏ¢ + ArcNode* firstarc; // Ö¸ÏòµÚÒ»ÌõÒÀ¸½¸Ã¶¥µãµÄ»¡µÄÖ¸Õë +} VNode; + +/* ͼµÄÁÚ½Ó±í´æ´¢±íʾÀàÐͶ¨Òå */ +typedef struct { + VNode vertices[MAX_VERTEX_NUM]; // ÁÚ½Ó±í + int vexnum, arcnum; // ͼ/ÍøµÄ¶¥µãÊýºÍ»¡Êý + GraphKind kind; // ͼµÄÀàÐͱêÖ¾ +} ALGraph; + + +// ±ß/»¡ÉÏÊÇ·ñ´æÔÚ¸½¼ÓÐÅÏ¢ +extern Boolean IncInfo; + + +/* + * ´´½¨ + * + *¡¾±¸×¢¡¿ + * + * ½Ì²ÄÖÐĬÈÏ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý¡£ + * ÕâÀïΪÁË·½±ã²âÊÔ£¬±ÜÃâÿ´ÎÔËÐж¼ÊÖ¶¯ÊäÈëÊý¾Ý£¬ + * Òò¶øÔÊÐíÑ¡Ôñ´ÓÔ¤ÉèµÄÎļþpathÖжÁÈ¡²âÊÔÊý¾Ý¡£ + * + * Èç¹ûÐèÒª´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý£¬ÔòpathΪNULL£¬»òpath[kind]Ϊ""¡£ + * Èç¹ûÐèÒª´ÓÎļþÖжÁÈ¡Êý¾Ý£¬ÔòÐèÒªÔÚpathÖÐÌîдÎļþÃûÐÅÏ¢¡£ + */ +Status CreateGraph(ALGraph* G, char* path[]); + +/* + * ¹¹ÔìÓÐÏòͼ + */ +static Status CreateDG(ALGraph* G); + +/* + * ¼Èë±ß/»¡µÄÏà¹Ø¸½¼ÓÐÅÏ¢ + */ +static void Input(ALGraph G, InfoType** info); + +/* + * ²éÕÒ + * + * ·µ»Ø¶¥µãuÔÚͼ/ÍøÖеÄλÖà + */ +int LocateVex(ALGraph G, VertexType u); + +/* + * ¹¹ÔìÒ»¸ö±ß/»¡½áµã(½öÏÞÄÚ²¿Ê¹ÓÃ) + */ +static ArcNode* newArcNodePtr(int adjvex, ArcNode* nextarc, InfoType* info); + +/* + * ²åÈë±ß/»¡ + * + * Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬Ôò²åÈëÒ»Ìõ»¡ÐèÒªÔö¼ÓÁ½¸ö¶¥µã¹ØÏµ£¬µ«»¡µÄÊýÁ¿Ö»ÔöÒ»¡£ + * ¶ÔÓÚͼ/ÍøÀ´Ëµ£¬¿ÉÒÔÔڿɱä²ÎÊýÖÐÁгö±ß/»¡µÄ¸½¼ÓÐÅÏ¢¡£ + * + * ×¢£º´Ë´¦½ÓÊյIJÎÊýÓëMGraphÓÐЩ²»Ò»Ñù£ºÍøµÄ¸½¼ÓÐÅÏ¢Öаüº¬Á˸÷Ìõ±ß/»¡µÄȨֵ¡£ + */ +Status InsertArc(ALGraph* G, VertexType v, VertexType w, ...); + +/* + * ÒÔͼÐλ¯ÐÎʽÊä³öµ±Ç°½á¹¹ + */ +void PrintGraph(ALGraph G); + +#endif diff --git a/VisualC++/ExerciseBook/07.36-07.37/SqStack.c b/VisualC++/ExerciseBook/07.36-07.37/SqStack.c new file mode 100644 index 0000000..f056778 --- /dev/null +++ b/VisualC++/ExerciseBook/07.36-07.37/SqStack.c @@ -0,0 +1,90 @@ +/*========================= + * Õ»µÄ˳Ðò´æ´¢½á¹¹£¨Ë³ÐòÕ»£© + ==========================*/ + +#include "SqStack.h" //**¡ø03 Õ»ºÍ¶ÓÁÐ**// + +/* + * ³õʼ»¯ + * + * ¹¹ÔìÒ»¸ö¿ÕÕ»¡£³õʼ»¯³É¹¦Ôò·µ»ØOK£¬·ñÔò·µ»ØERROR¡£ + */ +Status InitStack(SqStack* S) { + if(S == NULL) { + return ERROR; + } + + (*S).base = (SElemType*) malloc(STACK_INIT_SIZE * sizeof(SElemType)); + if((*S).base == NULL) { + exit(OVERFLOW); + } + + (*S).top = (*S).base; + (*S).stacksize = STACK_INIT_SIZE; + + return OK; +} + +/* + * ÅÐ¿Õ + * + * ÅжÏ˳ÐòÕ»ÖÐÊÇ·ñ°üº¬ÓÐЧÊý¾Ý¡£ + * + * ·µ»ØÖµ£º + * TRUE : ˳ÐòջΪ¿Õ + * FALSE: ˳ÐòÕ»²»Îª¿Õ + */ +Status StackEmpty(SqStack S) { + if(S.top == S.base) { + return TRUE; + } else { + return FALSE; + } +} + +/* + * ÈëÕ» + * + * ½«ÔªËØeѹÈëµ½Õ»¶¥¡£ + */ +Status Push(SqStack* S, SElemType e) { + if(S == NULL || (*S).base == NULL) { + return ERROR; + } + + // Õ»Âúʱ£¬×·¼Ó´æ´¢¿Õ¼ä + if((*S).top - (*S).base >= (*S).stacksize) { + (*S).base = (SElemType*) realloc((*S).base, ((*S).stacksize + STACKINCREMENT) * sizeof(SElemType)); + if((*S).base == NULL) { + exit(OVERFLOW); // ´æ´¢·ÖÅäʧ°Ü + } + + (*S).top = (*S).base + (*S).stacksize; + (*S).stacksize += STACKINCREMENT; + } + + // ½øÕ»Ïȸ³Öµ£¬Õ»¶¥Ö¸ÕëÔÙ×ÔÔö + *(S->top++) = e; + + return OK; +} + +/* + * ³öÕ» + * + * ½«Õ»¶¥ÔªËص¯³ö£¬²¢ÓÃe½ÓÊÕ¡£ + */ +Status Pop(SqStack* S, SElemType* e) { + if(S == NULL || (*S).base == NULL) { + return ERROR; + } + + if((*S).top == (*S).base) { + return ERROR; + } + + // ³öÕ»Õ»¶¥Ö¸ÕëÏȵݼõ£¬ÔÙ¸³Öµ + *e = *(--(*S).top); + + return OK; +} diff --git a/VisualC++/ExerciseBook/07.36-07.37/SqStack.h b/VisualC++/ExerciseBook/07.36-07.37/SqStack.h new file mode 100644 index 0000000..a8fe835 --- /dev/null +++ b/VisualC++/ExerciseBook/07.36-07.37/SqStack.h @@ -0,0 +1,59 @@ +/*========================= + * Õ»µÄ˳Ðò´æ´¢½á¹¹£¨Ë³ÐòÕ»£© + ==========================*/ + +#ifndef SQSTACK_H +#define SQSTACK_H + +#include +#include // Ìṩmalloc¡¢realloc¡¢free¡¢exitÔ­ÐÍ +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// + +/* ºê¶¨Òå */ +#define STACK_INIT_SIZE 100 // ˳ÐòÕ»´æ´¢¿Õ¼äµÄ³õʼ·ÖÅäÁ¿ +#define STACKINCREMENT 10 // ˳ÐòÕ»´æ´¢¿Õ¼äµÄ·ÖÅäÔöÁ¿ + +/* ˳ÐòÕ»ÔªËØÀàÐͶ¨Òå */ +typedef int SElemType; + +// ˳ÐòÕ»ÔªËØ½á¹¹ +typedef struct { + SElemType* base; // Õ»µ×Ö¸Õë + SElemType* top; // Õ»¶¥Ö¸Õë + int stacksize; // µ±Ç°ÒÑ·ÖÅäµÄ´æ´¢¿Õ¼ä£¬ÒÔÔªËØÎªµ¥Î» +} SqStack; + + +/* + * ³õʼ»¯ + * + * ¹¹ÔìÒ»¸ö¿ÕÕ»¡£³õʼ»¯³É¹¦Ôò·µ»ØOK£¬·ñÔò·µ»ØERROR¡£ + */ +Status InitStack(SqStack* S); + +/* + * ÅÐ¿Õ + * + * ÅжÏ˳ÐòÕ»ÖÐÊÇ·ñ°üº¬ÓÐЧÊý¾Ý¡£ + * + * ·µ»ØÖµ£º + * TRUE : ˳ÐòջΪ¿Õ + * FALSE: ˳ÐòÕ»²»Îª¿Õ + */ +Status StackEmpty(SqStack S); + +/* + * ÈëÕ» + * + * ½«ÔªËØeѹÈëµ½Õ»¶¥¡£ + */ +Status Push(SqStack* S, SElemType e); + +/* + * ³öÕ» + * + * ½«Õ»¶¥ÔªËص¯³ö£¬²¢ÓÃe½ÓÊÕ¡£ + */ +Status Pop(SqStack* S, SElemType* e); + +#endif diff --git a/VisualC++/ExerciseBook/07.36-07.37/TestData_DG.txt b/VisualC++/ExerciseBook/07.36-07.37/TestData_DG.txt new file mode 100644 index 0000000..a240ed8 --- /dev/null +++ b/VisualC++/ExerciseBook/07.36-07.37/TestData_DG.txt @@ -0,0 +1,6 @@ +ͼÀàÐÍ¡ú0£¨ÓÐÏòͼ£© +¶¥µãÊý¡ú12 +»¡Êý¡ú16 +»¡ÊÇ·ñ´øÓÐÆäËûÐÅÏ¢¡ú0 +¶¥µã¼¯¡ú¡¾A£¬B£¬C£¬D£¬E£¬F£¬G£¬H£¬I£¬J£¬K£¬L¡¿ +»¡µÄ¼¯ºÏ¡ú¡¾F£¬J¡¿¡¾F£¬B¡¿¡¾F£¬C¡¿¡¾F£¬A¡¿¡¾B£¬C¡¿¡¾J£¬I¡¿¡¾C£¬I¡¿¡¾C£¬H¡¿¡¾I£¬H¡¿¡¾C£¬G¡¿¡¾D£¬A¡¿¡¾D£¬L¡¿¡¾L£¬A¡¿¡¾D£¬K¡¿¡¾K£¬E¡¿¡¾E£¬G¡¿ \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.36-07.37/TopologicalSorting.c b/VisualC++/ExerciseBook/07.36-07.37/TopologicalSorting.c new file mode 100644 index 0000000..82001f5 --- /dev/null +++ b/VisualC++/ExerciseBook/07.36-07.37/TopologicalSorting.c @@ -0,0 +1,96 @@ +/*======================= + * AOV-Íø(ÓÐÏòͼ)µÄÍØÆËÅÅÐò + * + * °üº¬Ëã·¨: 7.12 + ========================*/ + +#include "TopologicalSorting.h" + +/* + * ¨€¨€¨€¨€¨€¨€¨€¨€ Ëã·¨7.12 ¨€¨€¨€¨€¨€¨€¨€¨€ + * + * Èç¹ûÓÐÏòͼGÎÞ»ØÂ·£¬ÔòÊä³öËüµÄÒ»¸öÍØÆËÐòÁв¢·µ»ØOK£»·ñÔò£¬·µ»ØFALSE¡£ + * ÍØÆËÐòÁÐͨ³£²»Î¨Ò»£¬µ«ÊDZØÐ뱣֤ijЩ¹Ø¼ü½ÚµãµÄÏȺó´ÎÐò¡£ + * + * ×¢£ºÓë½Ì²Ä²»Í¬Ö®´¦ÔÚÓÚ£¬´Ë´¦Ôö¼ÓÁËÒ»¸ötopoÊý×é×ö²ÎÊý¡£ + * ¡¡¡¡¶ÔÓÚÇó³öµÄÍØÆËÐòÁУ¬²»»áÖ±½ÓÊä³ö£¬¶øÊǻỺ´æµ½topoÖС£ + * ¡¡¡¡ÕâÑùµÄ×öµÄÄ¿µÄÊǺóÐøµÄϰÌâÖлáÓжദÓõ½¸ÃÍØÆËÐòÁС£ + */ +Status TopologicalSort(ALGraph G, int topo[MAX_VERTEX_NUM]) { + int i, k, count; + int indegree[MAX_VERTEX_NUM]; + SqStack S; + ArcNode* p; + + // ¶Ô¸÷¶¥µãÇóÈë¶È + FindInDegree(G, indegree); + + // ³õʼ»¯ÁãÈë¶È¶¥µãÕ» + InitStack(&S); + + // ½¨Á¢Èë¶ÈΪ0µÄ¶¥µãÕ» + for(i = 0; i < G.vexnum; i++) { + // ½«Èë¶ÈΪ0µÄ¶¥µãÌí¼Óµ½Õ»ÖÐ + if(indegree[i] == 0) { + Push(&S, i); + } + } + + // ¶ÔÍØÆËÐòÁÐÖеĶ¥µã¼ÆÊý + count = 0; + + // ±éÀú¶¥µãÕ» + while(!StackEmpty(S)) { + // »ñȡһ¸öÁãÈë¶È¶¥µã + Pop(&S, &i); + + // ½«¸÷¶¥µãµÄÐòºÅÔÝ´æÆðÀ´ + topo[count++] = i; + + // ±éÀúiºÅ¶¥µãµÄÁÚ½Óµã + for(p = G.vertices[i].firstarc; p != NULL; p = p->nextarc) { + // »ñÈ¡¶¥µãÐòºÅ + k = p->adjvex; + + /* + * ½«iºÅ¶¥µãÿ¸öÁÚ½ÓµãµÄÈë¶È¼õÒ»£¬ÕâÏ൱ÓÚÇжÎiºÅ¶¥µãµ½ÆäËüÁÚ½ÓµãµÄÁªÏµ¡£ + * Èç¹û³öÏÖÁËеÄÈë¶ÈΪ0µÄ¶¥µã£¬¼ÌÐø½«ÆäÈëÕ»¡£ + */ + if((--indegree[k]) == 0) { + Push(&S, k); + } + } + } + + // Èç¹ûÓöµ½ÁË»ØÂ·£¬Ôò·µ»ØERROR + if(count < G.vexnum) { + return ERROR; + } else { + return OK; + } +} + +/* + * ¼ÆËã¸÷¶¥µãµÄÈë¶È + */ +static void FindInDegree(ALGraph G, int indegree[MAX_VERTEX_NUM]) { + int i; + ArcNode* p; + + // ³õʼ»¯ËùÓж¥µãµÄÈë¶ÈΪ0 + for(i = 0; i < G.vexnum; i++) { + indegree[i] = 0; + } + + // ±éÀúËùÓж¥µã + for(i = 0; i < G.vexnum; i++) { + // Ö¸Ïò¸Ã¶¥µãµÄÊ׸öÁÚ½Óµã + p = G.vertices[i].firstarc; + + // ±éÀú¸Ã¶¥µãµÄËùÓÐÁڽӵ㣬ͳ¼Æ¸÷¶¥µãµÄÈë¶È + while(p != NULL) { + indegree[p->adjvex]++; + p = p->nextarc; + } + } +} diff --git a/VisualC++/ExerciseBook/07.36-07.37/TopologicalSorting.h b/VisualC++/ExerciseBook/07.36-07.37/TopologicalSorting.h new file mode 100644 index 0000000..3fae677 --- /dev/null +++ b/VisualC++/ExerciseBook/07.36-07.37/TopologicalSorting.h @@ -0,0 +1,28 @@ +/*======================= + * AOV-Íø(ÓÐÏòͼ)µÄÍØÆËÅÅÐò + * + * °üº¬Ëã·¨: 7.12 + ========================*/ + +#ifndef TOPOLOGICALSORTING_H +#define TOPOLOGICALSORTING_H + +#include +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// +#include "SqStack.h" //**¡ø03 Õ»ºÍ¶ÓÁÐ**// +#include "ALGraph.h" //**¡ø07 ͼ**// + +/* + * ¨€¨€¨€¨€¨€¨€¨€¨€ Ëã·¨7.12 ¨€¨€¨€¨€¨€¨€¨€¨€ + * + * Èç¹ûÓÐÏòͼGÎÞ»ØÂ·£¬ÔòÊä³öËüµÄÒ»¸öÍØÆËÐòÁв¢·µ»ØOK£»·ñÔò£¬·µ»ØFALSE¡£ + * ÍØÆËÐòÁÐͨ³£²»Î¨Ò»£¬µ«ÊDZØÐ뱣֤ijЩ¹Ø¼ü½ÚµãµÄÏȺó´ÎÐò¡£ + */ +Status TopologicalSort(ALGraph G, int topo[MAX_VERTEX_NUM]); + +/* + * ¼ÆËã¸÷¶¥µãµÄÈë¶È + */ +static void FindInDegree(ALGraph G, int indegree[MAX_VERTEX_NUM]); + +#endif diff --git a/VisualC++/ExerciseBook/07.38/07.38.c b/VisualC++/ExerciseBook/07.38/07.38.c new file mode 100644 index 0000000..3f82ce7 --- /dev/null +++ b/VisualC++/ExerciseBook/07.38/07.38.c @@ -0,0 +1,110 @@ +#include +#include "SqList.h" +#include "ALGraph.h" + +/* + * »ñÈ¡´æ´¢ÔÚÓÐÏòÎÞ»·Í¼Öеıí´ïʽµÄÄæ²¨À¼Ê½ + * + * ×¢£º±í´ïʽ½á¹¹²Î¿¼½Ì²Ä²åͼ7.23 + */ +void Algo_7_38(ALGraph G); + +/* + * ´Ó¶¥µãv³ö·¢»ñÈ¡ÓÐÏòͼÖд洢µÄ±í´ïʽµÄÄæ²¨À¼Ê½¡£ + * ÇóÈ¡µÄÄæ²¨À¼Ê½»á´æ´¢ÔÚRPNÖС£ + */ +static void AntiPolandFormula_7_38(ALGraph G, int v, SqList* RPN); + + +int main(int argc, char* argv[]) { + ALGraph G; + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ´´½¨²¢´òÓ¡ÓÐÏòÍø... \n"); + { + char* path[4]; + + path[0] = "TestData_DG.txt"; + path[1] = ""; + path[2] = ""; + path[3] = ""; + + CreateGraph(&G, path); + PrintGraph(G); + printf("\n"); + } + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ÇóÈ¡ÓÐÏòÍøÖд洢µÄ±í´ïʽµÄÄæ²¨À¼Ê½... \n"); + { + Algo_7_38(G); + printf("\n"); + } + + return 0; +} + + +/* + * »ñÈ¡´æ´¢ÔÚÓÐÏòÎÞ»·Í¼Öеıí´ïʽµÄÄæ²¨À¼Ê½ + * + * ×¢£º±í´ïʽ½á¹¹²Î¿¼½Ì²Ä²åͼ7.23 + */ +void Algo_7_38(ALGraph G) { + int i, root; + int indegree[MAX_VERTEX_NUM]; // ËùÓж¥µãµÄÈë¶ÈÐÅÏ¢ + ArcNode* p; + SqList RPN; // ´æ´¢Ä沨À¼±í´ïʽ + ElemType e; + + // ³õʼ»¯ËùÓж¥µãµÄÈë¶ÈΪ0 + for(i = 0; i < G.vexnum; i++) { + indegree[i] = 0; + } + + // ±éÀúËùÓж¥µã + for(i = 0; i < G.vexnum; i++) { + // Ö¸Ïò¸Ã¶¥µãµÄÊ׸öÁÚ½Óµã + p = G.vertices[i].firstarc; + + // ±éÀú¸Ã¶¥µãµÄËùÓÐÁڽӵ㣬ͳ¼Æ¸÷¶¥µãµÄÈë¶È + while(p != NULL) { + indegree[p->adjvex]++; + p = p->nextarc; + } + } + + // ²éÕÒµ½¸ù½áµã + for(i = 0; i < G.vexnum; i++) { + if(indegree[i] == 0) { + root = i; + break; + } + } + + // ³õʼ»¯³¤¶ÈΪ0µÄÏßÐÔ±í + InitList(&RPN); + + // ´ÓÓÐÏòÎÞ»·Í¼µÄ¸ù½áµã³ö·¢£¬Í¨¹ýβµÝ¹é»ñÈ¡µ½ÆäÖд洢µÄ±í´ïʽµÄÄæ²¨À¼Ê½ + AntiPolandFormula_7_38(G, root, &RPN); + + for(i = 1; i <= ListLength(RPN); i++) { + GetElem(RPN, i, &e); + printf("%c", ops[e]); + } + printf("\n"); +} + +/* + * ´Ó¶¥µãv³ö·¢»ñÈ¡ÓÐÏòͼÖд洢µÄ±í´ïʽµÄÄæ²¨À¼Ê½¡£ + * ÇóÈ¡µÄÄæ²¨À¼Ê½»á´æ´¢ÔÚRPNÖС£ + */ +void AntiPolandFormula_7_38(ALGraph G, int v, SqList* RPN) { + ArcNode* r; + + // ÏȱéÀúÁÚ½Óµã + for(r = G.vertices[v].firstarc; r != NULL; r = r->nextarc) { + AntiPolandFormula_7_38(G, r->adjvex, RPN); + } + + // µ±Ã»ÓÐÁÚ½Óµã¿É±éÀúʱ£¬´æ´¢¸Ã¶¥µã + ListInsert(RPN, ListLength(*RPN) + 1, v); +} diff --git a/VisualC++/ExerciseBook/07.38/07.38.png b/VisualC++/ExerciseBook/07.38/07.38.png new file mode 100644 index 0000000000000000000000000000000000000000..2b6df8a6e7f428f737000ebe395c8c43ff948fab GIT binary patch literal 27793 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 b*`=vzuIda`2N!sa*fsSBI?5G_R-yj|<&7Ks literal 0 HcmV?d00001 diff --git a/VisualC++/ExerciseBook/07.38/07.38.vcxproj b/VisualC++/ExerciseBook/07.38/07.38.vcxproj new file mode 100644 index 0000000..c83ff99 --- /dev/null +++ b/VisualC++/ExerciseBook/07.38/07.38.vcxproj @@ -0,0 +1,81 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {D5D2D36F-358D-43FA-B296-7192867B7224} + My0738 + + + + Application + true + MultiByte + + + Application + false + true + MultiByte + + + + + + + + + + + + + $(SolutionDir)\..\Status;$(IncludePath) + + + + Level3 + Disabled + + + true + $(SolutionDir)\..\Status\Status.lib;%(AdditionalDependencies) + Console + + + + + Level3 + MaxSpeed + true + true + + + true + true + true + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.38/07.38.vcxproj.filters b/VisualC++/ExerciseBook/07.38/07.38.vcxproj.filters new file mode 100644 index 0000000..aaea2f2 --- /dev/null +++ b/VisualC++/ExerciseBook/07.38/07.38.vcxproj.filters @@ -0,0 +1,41 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + æºæ–‡ä»¶ + + + æºæ–‡ä»¶ + + + æºæ–‡ä»¶ + + + + + 头文件 + + + 头文件 + + + + + èµ„æºæ–‡ä»¶ + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.38/07.38.vcxproj.user b/VisualC++/ExerciseBook/07.38/07.38.vcxproj.user new file mode 100644 index 0000000..ace9a86 --- /dev/null +++ b/VisualC++/ExerciseBook/07.38/07.38.vcxproj.user @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.38/ALGraph.c b/VisualC++/ExerciseBook/07.38/ALGraph.c new file mode 100644 index 0000000..da42955 --- /dev/null +++ b/VisualC++/ExerciseBook/07.38/ALGraph.c @@ -0,0 +1,344 @@ +/*================== + * ͼµÄÁÚ½Ó±í´æ´¢±íʾ + ===================*/ + +#include "ALGraph.h" + +// ¼ÈëÊý¾ÝµÄÔ´Îļþ£»fpΪnullʱ£¬ËµÃ÷ÐèÒª´Ó¿ØÖÆÌ¨Â¼Èë +static FILE* fp = NULL; + +/* + * IncInfoָʾ¸Ãͼ/ÍøµÄ±ß/»¡ÉÏÊÇ·ñ´æÔÚ¸½¼ÓÐÅÏ¢¡£ + * Èç¹ûÆäÖµ²»Îª0£¬Ôò±íʾÎÞ¸½¼ÓÐÅÏ¢£¬·ñÔò£¬±íʾ´æÔÚ¸½¼ÓÐÅÏ¢¡£ + */ +Boolean IncInfo = FALSE; + +// ·ÃÎʱêÖ¾Êý×飬¼Ç¼·ÃÎʹýµÄ¶¥µã +static Boolean visited[MAX_VERTEX_NUM]; + +// º¯Êý±äÁ¿ +static Status (* VisitFunc)(VertexType e); + +// Óë¶¥µãÒ»Ò»¶ÔÓ¦µÄ²Ù×÷ÊýÓë²Ù×÷·û +char ops[MAX_VERTEX_NUM]; + + +/* + * ´´½¨ + * + *¡¾±¸×¢¡¿ + * + * ½Ì²ÄÖÐĬÈÏ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý¡£ + * ÕâÀïΪÁË·½±ã²âÊÔ£¬±ÜÃâÿ´ÎÔËÐж¼ÊÖ¶¯ÊäÈëÊý¾Ý£¬ + * Òò¶øÔÊÐíÑ¡Ôñ´ÓÔ¤ÉèµÄÎļþpathÖжÁÈ¡²âÊÔÊý¾Ý¡£ + * + * Èç¹ûÐèÒª´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý£¬ÔòpathΪNULL£¬»òpath[kind]Ϊ""¡£ + * Èç¹ûÐèÒª´ÓÎļþÖжÁÈ¡Êý¾Ý£¬ÔòÐèÒªÔÚpathÖÐÌîдÎļþÃûÐÅÏ¢¡£ + */ +Status CreateGraph(ALGraph* G, char* path[]) { + int readFromConsole; // ÊÇ·ñ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý + int kind; + Status flag; + + // ¡ï¡ï¡ï´Ë´¦¹Ì¶¨ÎªÓÐÏòͼ + kind = 0; + + // Èç¹ûûÓÐÎļþ·¾¶ÐÅÏ¢£¬Ôò´Ó¿ØÖÆÌ¨¶ÁÈ¡ÊäÈë + readFromConsole = (path == NULL) || strcmp(path[kind], "") == 0; + + // ÐèÒª´ÓÎļþ¶ÁÈ¡ + if(readFromConsole) { + (*G).kind = kind; // ¼Ç¼ͼ/ÍøµÄÀàÐÍ + } else { + // ´ò¿ªÎļþ£¬×¼±¸¶ÁÈ¡²âÊÔÊý¾Ý + fp = fopen(path[kind], "r"); + if(fp == NULL) { + return ERROR; + } + + // ¼ÈëͼµÄÀàÐÍ + ReadData(fp, "%d", &((*G).kind)); + } + + // Ëæ»ú´´½¨ÓÐÏòͼ/Íø»òÎÞÏòͼ/ÍøµÄÒ»ÖÖ + switch((*G).kind) { + case DG: + flag = CreateDG(G); + break; + default: + flag = ERROR; + break; + } + + if(fp != NULL) { + fclose(fp); + fp = NULL; + } + + return flag; +} + +/* + * ¹¹ÔìÓÐÏòͼ + */ +static Status CreateDG(ALGraph* G) { + int i, k; + int vexnum, arcnum; + VertexType v1, v2; + InfoType* info = NULL; + + (*G).vexnum = (*G).arcnum = 0; + + if(fp == NULL) { + printf("ÇëÊäÈëÓÐÏòͼµÄ¶¥µãÊý£º"); + scanf("%d", &vexnum); + printf("ÇëÊäÈëÓÐÏòͼµÄ»¡Êý£º"); + scanf("%d", &arcnum); + printf("¸ÃÓÐÏòͼµÄ»¡ÉÏÊÇ·ñ°üº¬ÆäËû¸½¼ÓÐÅÏ¢(0-²»°üº¬©¦1-°üº¬)£º"); + scanf("%d", &IncInfo); + + // ¼Èë¶¥µã¼¯ + printf("Çë¼Èë %d ¸ö¶¥µã£¬²»Í¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º", vexnum); + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(stdin); + scanf("%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } else { + ReadData(fp, "%d", &vexnum); // ¼Èë¶¥µãÊý + ReadData(fp, "%d", &arcnum); // ¼È뻡Êý + ReadData(fp, "%d", &IncInfo); // Åжϻ¡ÉÏÊÇ·ñ°üº¬¸½¼ÓÐÅÏ¢ + + // ¼Èë¶¥µã¼¯ + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(fp); + ReadData(fp, "%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } + + // ½öÔÚ¿ØÖÆÌ¨Â¼ÈëÐÅϢʱÊä³ö´ËÌáʾ + if(fp == NULL && arcnum != 0) { + printf("ÇëΪÓÐÏòͼÒÀ´Î¼Èë %d Ìõ»¡µÄÐÅÏ¢£¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º\n", arcnum); + } + + // ¼È뻡µÄÐÅÏ¢ + for(k = 0; k < arcnum; k++) { + if(fp == NULL) { + printf("µÚ %2d Ìõ»¡£º", k + 1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v2); + } else { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + skipBlank(fp); + ReadData(fp, "%c%c", &v1, &v2); + } + + // Èç¹ûÐèҪ¼È뻡µÄÆäËû¸½¼ÓÐÅÏ¢ + if(IncInfo) { + // ×îºó¼È븽¼ÓÐÅÏ¢ + Input(*G, &info); + } + + // ²åÈ뻡 + InsertArc(G, v1, v2, info); + } + + // ¼ÈëÓë¶¥µã¶ÔÓ¦µÄ²Ù×÷ÊýÓë²Ù×÷·û + if(fp == NULL) { + printf("Çë¼Èë %d ¸öÓë¶¥µãÒ»Ò»¶ÔÓ¦µÄ²Ù×÷Êý/²Ù×÷·û£¬²»Í¬²Ù×÷Êý/²Ù×÷·ûÖ®¼äÓÿոñ¸ô¿ª£º", vexnum); + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(stdin); + scanf("%c", &(ops[i])); + } + } else { + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(fp); + ReadData(fp, "%c", &(ops[i])); + } + } + + // ´ÓÎļþÖжÁÈ¡Êý¾Ýʱ£¬×îºóÆäʵӦµ±ÅжÏÒ»ÏÂÊÇ·ñ¶Áµ½ÁË×ã¹»µÄÐÅÏ¢ + return OK; +} + +/* + * ¼Èë±ß/»¡µÄÏà¹Ø¸½¼ÓÐÅÏ¢ + */ +static void Input(ALGraph G, InfoType** info) { + int weight; + + // ÔÚ"Íø"µÄÇéÐÎÏÂÐèҪ¼ÈëȨֵÐÅÏ¢ + if(G.kind == DN || G.kind == UDN) { + *info = (InfoType*) malloc(sizeof(InfoType)); + + if(fp == NULL) { + scanf("%d", &weight); + } else { + ReadData(fp, "%d", &weight); + } + + (*info)->weight = weight; + } +} + +/* + * ²éÕÒ + * + * ·µ»Ø¶¥µãuÔÚͼ/ÍøÖеÄλÖà + */ +int LocateVex(ALGraph G, VertexType u) { + int i; + + for(i = 0; i < G.vexnum; i++) { + if(G.vertices[i].data == u) { + return i; + } + } + + return -1; +} + +/* + * ¹¹ÔìÒ»¸ö±ß/»¡½áµã(½öÏÞÄÚ²¿Ê¹ÓÃ) + */ +static ArcNode* newArcNodePtr(int adjvex, ArcNode* nextarc, InfoType* info) { + ArcNode* p = (ArcNode*) malloc(sizeof(ArcNode)); + if(!p) { + exit(OVERFLOW); + } + + p->adjvex = adjvex; + + p->nextarc = nextarc; + + p->info = info; + + return p; +} + +/* + * ²åÈë±ß/»¡ + * + * Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬Ôò²åÈëÒ»Ìõ»¡ÐèÒªÔö¼ÓÁ½¸ö¶¥µã¹ØÏµ£¬µ«»¡µÄÊýÁ¿Ö»ÔöÒ»¡£ + * ¶ÔÓÚͼ/ÍøÀ´Ëµ£¬¿ÉÒÔÔڿɱä²ÎÊýÖÐÁгö±ß/»¡µÄ¸½¼ÓÐÅÏ¢¡£ + * + * ×¢£º´Ë´¦½ÓÊյIJÎÊýÓëMGraphÓÐЩ²»Ò»Ñù£ºÍøµÄ¸½¼ÓÐÅÏ¢Öаüº¬Á˸÷Ìõ±ß/»¡µÄȨֵ¡£ + */ +Status InsertArc(ALGraph* G, VertexType v, VertexType w, ...) { + int tail, head, k, count; + ArcNode* r; + ArcNode* pre; + Boolean overlay = FALSE; // ÊÇ·ñΪ¸²¸ÇÌí¼Ó + InfoType* info = NULL; // ±ß/»¡µÄ¸½¼ÓÐÅÏ¢ + va_list ap; + + tail = LocateVex(*G, v); // »ñÈ¡¶¥µãvÔÚ¶¥µã¼¯ÖеÄλÖà + if(tail == -1) { + return ERROR; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + head = LocateVex(*G, w); // »ñÈ¡¶¥µãwÔÚ¶¥µã¼¯ÖеÄλÖà + if(head == -1) { + return ERROR; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + // ¾Ü¾ø»· + if(tail == head) { + return ERROR; + } + + // Èç¹û±ß/»¡ÉÏ´æÔÚ¸½¼ÓÐÅÏ¢ + if(IncInfo) { + va_start(ap, w); // ÔÚwºó²éѯÊ׸ö¿É±ä²ÎÊý + info = va_arg(ap, InfoType*); // »ñÈ¡¸½¼ÓÐÅÏ¢ + va_end(ap); + } + + /* ½ÓÏÂÀ´£¬ÐèÒª²éÕÒºÏÊʵIJåÈëλÖà */ + + for(count = 0; count < 2; count++) { + pre = NULL; + // Ö¸ÏòÒÔtailΪβµÄÊ×Ìõ±ß/»¡ + r = G->vertices[tail].firstarc; + while(r != NULL && r->adjvex < head) { + pre = r; + r = r->nextarc; + } + + // Óöµ½ÁËÏàͬλÖõĽáµã + if(r != NULL && r->adjvex == head) { + r->info = info; // ¸´Óøýáµã + overlay = TRUE; // ·¢ÉúÁ˸²¸Ç + } else { + if(pre == NULL) { + G->vertices[tail].firstarc = newArcNodePtr(head, r, info); + } else { + pre->nextarc = newArcNodePtr(head, r, info); + } + } + + // Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬ÐèÒª¿¼ÂǶԳÆÐÔ + if((G->kind == UDG || G->kind == UDN) && tail != head) { + // µßµ¹iºÍj + k = tail; + tail = head; + head = k; + } else { + break; // Èç¹ûÊÇÓÐÏòµÄ£¬¿ÉÒÔ½áÊøÁË + } + } + + // ÔڷǸ²¸ÇµÄÇéÐÎÏ£¬²Å¿¼ÂǸüбß/»¡µÄÊýÁ¿ + if(!overlay) { + (*G).arcnum++; // ²»ÂÛÓÐÏòÎÞÏò£¬±ß/»¡ÊýÖ»ÔöÒ» + } + + return OK; +} + +/* + * ÒÔͼÐλ¯ÐÎʽÊä³öµ±Ç°½á¹¹ + */ +void PrintGraph(ALGraph G) { + int i; + ArcNode* p; + + if(G.vexnum == 0) { + printf("¿Õͼ£¬ÎÞÐè´òÓ¡£¡\n"); + return; + } + + printf("µ±Ç°Í¼/Íø°üº¬ %2d ¸ö¶¥µã£¬ %2d Ìõ±ß/»¡...\n", G.vexnum, G.arcnum); + + for(i = 0; i < G.vexnum; i++) { + printf("%c ===> ", G.vertices[i].data); + + p = G.vertices[i].firstarc; + while(p != NULL) { + if(IncInfo == 0) { + printf("%c ", G.vertices[p->adjvex].data); + + // ¶ÔÓÚÍø£¬»á´ÓÆä¸½¼ÓÐÅÏ¢ÖлñÈ¡µ½È¨Öµ + } else { + printf("%c[%2d] ", G.vertices[p->adjvex].data, p->info->weight); + } + + p = p->nextarc; + + if(p != NULL) { + printf("- "); + } + } + + printf("\n"); + } +} diff --git a/VisualC++/ExerciseBook/07.38/ALGraph.h b/VisualC++/ExerciseBook/07.38/ALGraph.h new file mode 100644 index 0000000..2656c16 --- /dev/null +++ b/VisualC++/ExerciseBook/07.38/ALGraph.h @@ -0,0 +1,131 @@ +/*================== + * ͼµÄÁÚ½Ó±í´æ´¢±íʾ + ===================*/ + +#ifndef ALGRAPH_H +#define ALGRAPH_H + +#include +#include // Ìṩmemset¡¢strcmp Ô­ÐÍ +#include // Ìṩºêva_list¡¢va_start¡¢va_arg¡¢va_end +#include // Ìṩmalloc¡¢realloc¡¢free¡¢exitÔ­ÐÍ +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// + +/* + * ×¢£º + * + * ͨ³£À´½²£¬ÎÞȨͼ±»¼ò³ÆÎª¡¾Í¼¡¿£¬ÓÐȨͼ±»¼ò³ÆÎª¡¾Íø¡¿¡£ + * ÎÞÏòͼ/ÍøÖеĶ¥µã¹ØÏµ±»³ÆÎª¡¾±ß¡¿£¬ÓÐÏòͼ/ÍøÖеĶ¥µã¹ØÏµ±»³ÆÎª¡¾»¡¡¿£¬²¢Çø·Ö»¡Í·Ó뻡β¡£ + * ʵ¼Ê±íÊöÖУ¬Î´±Ø»áÑϸñ×ñÊØÒÔÉÏÃüÃû¡£ + * + * µ±Ç°½á¹¹Êʺϴ洢±ß/»¡±È½ÏÏ¡ÊèµÄͼ/Íø¡£ + * + * ¡ï ²åÈë±ß/»¡µÄÐÅϢʱ£¬ÕâÀïµÄʵÏÖÊǰ´"ÉýÐò"²åÈëµÄ£¬ÕâʹµÃ²åÈëµÄ»¡Êǰ´"ÉýÐò"ÅÅÁеġ£ + */ + + +/* ºê¶¨Òå */ +#define MAX_VERTEX_NUM 26 // ×î´ó¶¥µã¸öÊý + + +// ͼµÄÀàÐÍ +typedef enum { + DG, // 0-ÓÐÏòͼ + DN, // 1-ÓÐÏòÍø(´øÈ¨Öµ) + UDG, // 2-ÎÞÏòͼ + UDN // 3-ÎÞÏòÍø(´øÈ¨Öµ) +} GraphKind; + +// ¶¥µãÀàÐÍ +typedef char VertexType; + +// ±ß/»¡µÄÏà¹Ø¸½¼ÓÐÅÏ¢ +typedef struct { + /* + * ×¢£º + * ½Ì²ÄÖиø³öµÄ½á¹¹Ö»¿¼ÂÇÁËÎÞȨͼ£¬¶øÃ»¿¼ÂÇÓÐȨͼ(Íø)¡£ + * ÕâÀïΪÁ˰ѡ°Íø¡±µÄÇéÐÎÒ²¿¼ÂǽøÈ¥£¬ÌØÔÚ¸½¼ÓÐÅÏ¢ÖÐÔö¼ÓÁË"È¨ÖØ"ÊôÐÔ¡£ + */ + int weight; +} InfoType; + +/* ±ß/»¡½áµã */ +typedef struct ArcNode { + int adjvex; // ¸Ã»¡ËùÖ¸ÏòµÄ¶¥µãµÄλÖà + struct ArcNode* nextarc; // Ö¸ÏòÏÂÒ»Ìõ»¡µÄÖ¸Õë + InfoType* info; // »¡µÄ¸½¼ÓÐÅÏ¢£¬Í¨³£ºöÂÔ +} ArcNode; + +// ÿ¸öÁ´±íµÄÍ·½áµã +typedef struct VNode { + VertexType data; // ¶¥µãÐÅÏ¢ + ArcNode* firstarc; // Ö¸ÏòµÚÒ»ÌõÒÀ¸½¸Ã¶¥µãµÄ»¡µÄÖ¸Õë +} VNode; + +/* ͼµÄÁÚ½Ó±í´æ´¢±íʾÀàÐͶ¨Òå */ +typedef struct { + VNode vertices[MAX_VERTEX_NUM]; // ÁÚ½Ó±í + int vexnum, arcnum; // ͼ/ÍøµÄ¶¥µãÊýºÍ»¡Êý + GraphKind kind; // ͼµÄÀàÐͱêÖ¾ +} ALGraph; + + +// ±ß/»¡ÉÏÊÇ·ñ´æÔÚ¸½¼ÓÐÅÏ¢ +extern Boolean IncInfo; + +// Óë¶¥µãÒ»Ò»¶ÔÓ¦µÄ²Ù×÷ÊýÓë²Ù×÷·û +extern char ops[MAX_VERTEX_NUM]; + + +/* + * ´´½¨ + * + *¡¾±¸×¢¡¿ + * + * ½Ì²ÄÖÐĬÈÏ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý¡£ + * ÕâÀïΪÁË·½±ã²âÊÔ£¬±ÜÃâÿ´ÎÔËÐж¼ÊÖ¶¯ÊäÈëÊý¾Ý£¬ + * Òò¶øÔÊÐíÑ¡Ôñ´ÓÔ¤ÉèµÄÎļþpathÖжÁÈ¡²âÊÔÊý¾Ý¡£ + * + * Èç¹ûÐèÒª´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý£¬ÔòpathΪNULL£¬»òpath[kind]Ϊ""¡£ + * Èç¹ûÐèÒª´ÓÎļþÖжÁÈ¡Êý¾Ý£¬ÔòÐèÒªÔÚpathÖÐÌîдÎļþÃûÐÅÏ¢¡£ + */ +Status CreateGraph(ALGraph* G, char* path[]); + +/* + * ¹¹ÔìÓÐÏòͼ + */ +static Status CreateDG(ALGraph* G); + +/* + * ¼Èë±ß/»¡µÄÏà¹Ø¸½¼ÓÐÅÏ¢ + */ +static void Input(ALGraph G, InfoType** info); + +/* + * ²éÕÒ + * + * ·µ»Ø¶¥µãuÔÚͼ/ÍøÖеÄλÖà + */ +int LocateVex(ALGraph G, VertexType u); + +/* + * ¹¹ÔìÒ»¸ö±ß/»¡½áµã(½öÏÞÄÚ²¿Ê¹ÓÃ) + */ +static ArcNode* newArcNodePtr(int adjvex, ArcNode* nextarc, InfoType* info); + +/* + * ²åÈë±ß/»¡ + * + * Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬Ôò²åÈëÒ»Ìõ»¡ÐèÒªÔö¼ÓÁ½¸ö¶¥µã¹ØÏµ£¬µ«»¡µÄÊýÁ¿Ö»ÔöÒ»¡£ + * ¶ÔÓÚͼ/ÍøÀ´Ëµ£¬¿ÉÒÔÔڿɱä²ÎÊýÖÐÁгö±ß/»¡µÄ¸½¼ÓÐÅÏ¢¡£ + * + * ×¢£º´Ë´¦½ÓÊյIJÎÊýÓëMGraphÓÐЩ²»Ò»Ñù£ºÍøµÄ¸½¼ÓÐÅÏ¢Öаüº¬Á˸÷Ìõ±ß/»¡µÄȨֵ¡£ + */ +Status InsertArc(ALGraph* G, VertexType v, VertexType w, ...); + +/* + * ÒÔͼÐλ¯ÐÎʽÊä³öµ±Ç°½á¹¹ + */ +void PrintGraph(ALGraph G); + +#endif diff --git a/VisualC++/ExerciseBook/07.38/SqList.c b/VisualC++/ExerciseBook/07.38/SqList.c new file mode 100644 index 0000000..623d818 --- /dev/null +++ b/VisualC++/ExerciseBook/07.38/SqList.c @@ -0,0 +1,114 @@ +/*============================= + * ÏßÐÔ±íµÄ˳Ðò´æ´¢½á¹¹£¨Ë³Ðò±í£© + * + * °üº¬Ëã·¨: 2.3¡¢2.4¡¢2.5¡¢2.6 + =============================*/ + +#include "SqList.h" + +/* + * ¨€¨€¨€¨€¨€¨€¨€¨€ Ëã·¨2.3 ¨€¨€¨€¨€¨€¨€¨€¨€ + * + * ³õʼ»¯ + * + * ³õʼ»¯³É¹¦Ôò·µ»ØOK£¬·ñÔò·µ»ØERROR¡£ + */ +Status InitList(SqList* L) { + // ·ÖÅäÖ¸¶¨ÈÝÁ¿µÄÄڴ棬Èç¹û·ÖÅäʧ°Ü£¬Ôò·µ»ØNULL + (*L).elem = (ElemType*) malloc(LIST_INIT_SIZE * sizeof(ElemType)); + if((*L).elem == NULL) { + // ´æ´¢ÄÚ´æÊ§°Ü + exit(OVERFLOW); + } + + (*L).length = 0; // ³õʼ»¯Ë³Ðò±í³¤¶ÈΪ0 + (*L).listsize = LIST_INIT_SIZE; // ˳Ðò±í³õʼÄÚ´æ·ÖÅäÁ¿ + + return OK; // ³õʼ»¯³É¹¦ +} + +/* + * ¼ÆÊý + * + * ·µ»ØË³Ðò±í°üº¬µÄÓÐÐ§ÔªËØµÄÊýÁ¿¡£ + */ +int ListLength(SqList L) { + return L.length; +} + +/* + * ȡֵ + * + * »ñȡ˳Ðò±íÖеÚi¸öÔªËØ£¬½«Æä´æ´¢µ½eÖС£ + * Èç¹û¿ÉÒÔÕÒµ½£¬·µ»ØOK£¬·ñÔò£¬·µ»ØERROR¡£ + * + *¡¾±¸×¢¡¿ + * ½Ì²ÄÖÐiµÄº¬ÒåÊÇÔªËØÎ»Ö㬴Ó1¿ªÊ¼¼ÆÊý£¬µ«Õâ²»·ûºÏ±àÂëµÄͨÓÃÔ¼¶¨¡£ + * ͨ³££¬iµÄº¬ÒåÓ¦¸ÃÖ¸Ë÷Òý£¬¼´´Ó0¿ªÊ¼¼ÆÊý¡£ + */ +Status GetElem(SqList L, int i, ElemType* e) { + // ÒòΪiµÄº¬ÒåÊÇλÖã¬ËùÒÔÆäºÏ·¨·¶Î§ÊÇ£º[1, length] + if(i < 1 || i > L.length) { + return ERROR; //iÖµ²»ºÏ·¨ + } + + *e = L.elem[i - 1]; + + return OK; +} + +/* + * ¨€¨€¨€¨€¨€¨€¨€¨€ Ëã·¨2.4 ¨€¨€¨€¨€¨€¨€¨€¨€ + * + * ²åÈë + * + * Ïò˳Ðò±íµÚi¸öλÖÃÉϲåÈëe£¬²åÈë³É¹¦Ôò·µ»ØOK£¬·ñÔò·µ»ØERROR¡£ + * + *¡¾±¸×¢¡¿ + * ½Ì²ÄÖÐiµÄº¬ÒåÊÇÔªËØÎ»Ö㬴Ó1¿ªÊ¼¼ÆÊý + */ +Status ListInsert(SqList* L, int i, ElemType e) { + ElemType* newbase; + ElemType* p, * q; + + // È·±£Ë³Ðò±í½á¹¹´æÔÚ + if(L == NULL || (*L).elem == NULL) { + return ERROR; + } + + // iÖµÔ½½ç + if(i < 1 || i > (*L).length + 1) { + return ERROR; + } + + // Èô´æ´¢¿Õ¼äÒÑÂú£¬ÔòÔö¼Óпռä + if((*L).length >= (*L).listsize) { + // »ùÓÚÏÖÓпռäÀ©ÈÝ + newbase = (ElemType*) realloc((*L).elem, ((*L).listsize + LISTINCREMENT) * sizeof(ElemType)); + if(newbase == NULL) { + // ´æ´¢ÄÚ´æÊ§°Ü + exit(OVERFLOW); + } + + // лùÖ· + (*L).elem = newbase; + // ´æµÄ´æ´¢¿Õ¼ä + (*L).listsize += LISTINCREMENT; + } + + // qΪ²åÈëλÖà + q = &(*L).elem[i - 1]; + + // 1.ÓÒÒÆÔªËØ£¬ÌÚ³öλÖà + for(p = &(*L).elem[(*L).length - 1]; p >= q; --p) { + *(p + 1) = *p; + } + + // 2.²åÈëe + *q = e; + + // 3.±í³¤Ôö1 + (*L).length++; + + return OK; +} diff --git a/VisualC++/ExerciseBook/07.38/SqList.h b/VisualC++/ExerciseBook/07.38/SqList.h new file mode 100644 index 0000000..08db2a8 --- /dev/null +++ b/VisualC++/ExerciseBook/07.38/SqList.h @@ -0,0 +1,73 @@ +/*============================= + * ÏßÐÔ±íµÄ˳Ðò´æ´¢½á¹¹£¨Ë³Ðò±í£© + * + * °üº¬Ëã·¨: 2.3¡¢2.4¡¢2.5¡¢2.6 + =============================*/ + +#ifndef SQLIST_H +#define SQLIST_H + +#include +#include // Ìṩmalloc¡¢realloc¡¢free¡¢exitÔ­ÐÍ +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// + +/* ºê¶¨Òå */ +#define LIST_INIT_SIZE 100 // ˳Ðò±í´æ´¢¿Õ¼äµÄ³õʼ·ÖÅäÁ¿ +#define LISTINCREMENT 10 // ˳Ðò±í´æ´¢¿Õ¼äµÄ·ÖÅäÔöÁ¿ + +/* ˳Ðò±íÔªËØÀàÐͶ¨Òå */ +typedef int ElemType; + +/* + * ˳Ðò±í½á¹¹ + * + * ×¢£ºelemÔÚʹÓÃǰÐèÒªÏÈΪÆä·ÖÅäÄڴ棬ÇÒÔªËØ´Óelem[0]´¦¿ªÊ¼´æ´¢ + */ +typedef struct { + ElemType* elem; // ˳Ðò±í´æ´¢¿Õ¼äµÄ»ùÖ·£¨Ö¸Ïò˳Ðò±íËùÕ¼ÄÚ´æµÄÆðʼλÖã© + int length; // µ±Ç°Ë³Ðò±í³¤¶È£¨°üº¬¶àÉÙÔªËØ£© + int listsize; // µ±Ç°·ÖÅäµÄ´æ´¢ÈÝÁ¿£¨¿ÉÒÔ´æ´¢¶àÉÙÔªËØ£© +} SqList; + + +/* + * ¨€¨€¨€¨€¨€¨€¨€¨€ Ëã·¨2.3 ¨€¨€¨€¨€¨€¨€¨€¨€ + * + * ³õʼ»¯ + * + * ³õʼ»¯³É¹¦Ôò·µ»ØOK£¬·ñÔò·µ»ØERROR¡£ + */ +Status InitList(SqList* L); + +/* + * ¼ÆÊý + * + * ·µ»ØË³Ðò±í°üº¬µÄÓÐÐ§ÔªËØµÄÊýÁ¿¡£ + */ +int ListLength(SqList L); + +/* + * ȡֵ + * + * »ñȡ˳Ðò±íÖеÚi¸öÔªËØ£¬½«Æä´æ´¢µ½eÖС£ + * Èç¹û¿ÉÒÔÕÒµ½£¬·µ»ØOK£¬·ñÔò£¬·µ»ØERROR¡£ + * + *¡¾±¸×¢¡¿ + * ½Ì²ÄÖÐiµÄº¬ÒåÊÇÔªËØÎ»Ö㬴Ó1¿ªÊ¼¼ÆÊý£¬µ«Õâ²»·ûºÏ±àÂëµÄͨÓÃÔ¼¶¨¡£ + * ͨ³££¬iµÄº¬ÒåÓ¦¸ÃÖ¸Ë÷Òý£¬¼´´Ó0¿ªÊ¼¼ÆÊý¡£ + */ +Status GetElem(SqList L, int i, ElemType* e); + +/* + * ¨€¨€¨€¨€¨€¨€¨€¨€ Ëã·¨2.4 ¨€¨€¨€¨€¨€¨€¨€¨€ + * + * ²åÈë + * + * Ïò˳Ðò±íµÚi¸öλÖÃÉϲåÈëe£¬²åÈë³É¹¦Ôò·µ»ØOK£¬·ñÔò·µ»ØERROR¡£ + * + *¡¾±¸×¢¡¿ + * ½Ì²ÄÖÐiµÄº¬ÒåÊÇÔªËØÎ»Ö㬴Ó1¿ªÊ¼¼ÆÊý + */ +Status ListInsert(SqList* L, int i, ElemType e); + +#endif diff --git a/VisualC++/ExerciseBook/07.38/TestData_DG.txt b/VisualC++/ExerciseBook/07.38/TestData_DG.txt new file mode 100644 index 0000000..ee36cd9 --- /dev/null +++ b/VisualC++/ExerciseBook/07.38/TestData_DG.txt @@ -0,0 +1,8 @@ +ͼÀàÐÍ¡ú0£¨ÓÐÏòͼ£© +¶¥µãÊý¡ú12 +»¡Êý¡ú14 +»¡ÊÇ·ñ´øÓÐÆäËûÐÅÏ¢¡ú0 +¶¥µã¼¯¡ú¡¾A£¬B£¬C£¬D£¬E£¬F£¬G£¬H£¬I£¬J£¬K£¬L¡¿ +»¡µÄ¼¯ºÏ¡ú¡¾A£¬B¡¿¡¾A£¬D¡¿¡¾B£¬C¡¿¡¾B£¬D¡¿¡¾C£¬E¡¿¡¾C£¬F¡¿¡¾F£¬G¡¿¡¾D£¬G¡¿¡¾D£¬H¡¿¡¾E£¬I¡¿¡¾E£¬J¡¿¡¾F£¬J¡¿¡¾G£¬K¡¿¡¾G£¬L¡¿ + +Óë¶¥µã¶ÔÓ¦µÄ²Ù×÷ÊýÓë²Ù×÷·û¡ú¡¾*£¬+£¬*£¬*£¬+£¬*£¬+£¬e£¬a£¬b£¬c£¬d¡¿ \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.39/07.39.c b/VisualC++/ExerciseBook/07.39/07.39.c new file mode 100644 index 0000000..44c80db --- /dev/null +++ b/VisualC++/ExerciseBook/07.39/07.39.c @@ -0,0 +1,80 @@ +#include +#include "SqList.h" +#include "BiTree.h" + +/* + * »ñÈ¡´æ´¢ÔÚ¶þ²æÊ÷Öеıí´ïʽµÄÄæ²¨À¼Ê½ + * + * ×¢£º±í´ïʽ½á¹¹²Î¿¼½Ì²Ä²åͼ7.22 + */ +void Algo_7_39(BiTree T); + +/* + * ´Ó¶þ²æÊ÷µÄ¸ù½áµã³ö·¢»ñÈ¡Ê÷Öд洢µÄ±í´ïʽµÄÄæ²¨À¼Ê½¡£ + * ÇóÈ¡µÄÄæ²¨À¼Ê½»á´æ´¢ÔÚRPNÖС£ + * + * ×¢£ºÊ¹ÓÃÁ˺óÐø±éÀú + */ +static void AntiPolandFormula_7_39(BiTree T, SqList* RPN); + + +int main(int argc, char* argv[]) { + BiTree T; + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ´´½¨²¢´òÓ¡¶þ²æÊ÷... \n"); + { + InitBiTree(&T); + CreateBiTree(&T, "TestData_Pre.txt"); + PrintTree(T); + printf("\n"); + } + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ÇóÈ¡¶þ²æÊ÷Öд洢µÄ±í´ïʽµÄÄæ²¨À¼Ê½... \n"); + { + Algo_7_39(T); + printf("\n"); + } + + return 0; +} + + +/* + * »ñÈ¡´æ´¢ÔÚ¶þ²æÊ÷Öеıí´ïʽµÄÄæ²¨À¼Ê½ + * + * ×¢£º±í´ïʽ½á¹¹²Î¿¼½Ì²Ä²åͼ7.23 + */ +void Algo_7_39(BiTree T) { + int i; + SqList RPN; // ´æ´¢Ä沨À¼±í´ïʽ + ElemType e; + + // ³õʼ»¯³¤¶ÈΪ0µÄÏßÐÔ±í + InitList(&RPN); + + // ´ÓÓÐÏòÎÞ»·Í¼µÄ¸ù½áµã³ö·¢£¬Í¨¹ýβµÝ¹é»ñÈ¡µ½ÆäÖд洢µÄ±í´ïʽµÄÄæ²¨À¼Ê½ + AntiPolandFormula_7_39(T, &RPN); + + for(i = 1; i <= ListLength(RPN); i++) { + GetElem(RPN, i, &e); + printf("%c", e); + } + printf("\n"); +} + +/* + * ´Ó¶þ²æÊ÷µÄ¸ù½áµã³ö·¢»ñÈ¡Ê÷Öд洢µÄ±í´ïʽµÄÄæ²¨À¼Ê½¡£ + * ÇóÈ¡µÄÄæ²¨À¼Ê½»á´æ´¢ÔÚRPNÖС£ + * + * ×¢£ºÊ¹ÓÃÁ˺óÐø±éÀú + */ +void AntiPolandFormula_7_39(BiTree T, SqList* RPN) { + if(T == NULL) { + return; + } + + AntiPolandFormula_7_39(T->lchild, RPN); + AntiPolandFormula_7_39(T->rchild, RPN); + // µ±Ã»Óк¢×Ó½áµã¿É±éÀúʱ£¬´æ´¢µ±Ç°½áµã + ListInsert(RPN, ListLength(*RPN) + 1, T->data); +} diff --git a/VisualC++/ExerciseBook/07.39/07.39.png b/VisualC++/ExerciseBook/07.39/07.39.png new file mode 100644 index 0000000000000000000000000000000000000000..382fc999e12140b954c07f046d694aa27e551ce1 GIT binary patch literal 23608 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 z + + + + Debug + Win32 + + + Release + Win32 + + + + {82014D93-91CF-49B8-A063-648FF219A996} + My0739 + + + + Application + true + MultiByte + + + Application + false + true + MultiByte + + + + + + + + + + + + + $(SolutionDir)\..\Status;$(IncludePath) + + + + Level3 + Disabled + + + true + $(SolutionDir)\..\Status\Status.lib;%(AdditionalDependencies) + Console + + + + + Level3 + MaxSpeed + true + true + + + true + true + true + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.39/07.39.vcxproj.filters b/VisualC++/ExerciseBook/07.39/07.39.vcxproj.filters new file mode 100644 index 0000000..a1d6370 --- /dev/null +++ b/VisualC++/ExerciseBook/07.39/07.39.vcxproj.filters @@ -0,0 +1,47 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + æºæ–‡ä»¶ + + + æºæ–‡ä»¶ + + + æºæ–‡ä»¶ + + + æºæ–‡ä»¶ + + + + + 头文件 + + + 头文件 + + + 头文件 + + + + + èµ„æºæ–‡ä»¶ + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.39/07.39.vcxproj.user b/VisualC++/ExerciseBook/07.39/07.39.vcxproj.user new file mode 100644 index 0000000..ace9a86 --- /dev/null +++ b/VisualC++/ExerciseBook/07.39/07.39.vcxproj.user @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.39/BiTree.c b/VisualC++/ExerciseBook/07.39/BiTree.c new file mode 100644 index 0000000..eb4affb --- /dev/null +++ b/VisualC++/ExerciseBook/07.39/BiTree.c @@ -0,0 +1,193 @@ +/*============================= + * ¶þ²æÊ÷µÄ¶þ²æÁ´±í´æ´¢½á¹¹ + * + * °üº¬Ëã·¨: 6.1¡¢6.2¡¢6.3¡¢6.4 + =============================*/ + +#include "BiTree.h" +#include "LinkQueue.h" //**¡ø03 Õ»ºÍ¶ÓÁÐ**// + +/* + * ³õʼ»¯ + * + * ¹¹Ôì¿Õ¶þ²æÊ÷¡£ + */ +Status InitBiTree(BiTree* T) { + if(T == NULL) { + return ERROR; + } + + *T = NULL; + + return OK; +} + +/* + * ¨€¨€¨€¨€¨€¨€¨€¨€ Ëã·¨6.4 ¨€¨€¨€¨€¨€¨€¨€¨€ + * + * ´´½¨ + * + * °´ÕÕÔ¤ÉèµÄ¶¨ÒåÀ´´´½¨¶þ²æÊ÷¡£ + * ÕâÀïÔ¼¶¨Ê¹Óá¾ÏÈÐòÐòÁС¿À´´´½¨¶þ²æÊ÷¡£ + * + * + *¡¾±¸×¢¡¿ + * + * ½Ì²ÄÖÐĬÈÏ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý¡£ + * ÕâÀïΪÁË·½±ã²âÊÔ£¬±ÜÃâÿ´ÎÔËÐж¼ÊÖ¶¯ÊäÈëÊý¾Ý£¬ + * Òò¶øÔÊÐíÑ¡Ôñ´ÓÔ¤ÉèµÄÎļþpathÖжÁÈ¡²âÊÔÊý¾Ý¡£ + * + * Èç¹ûÐèÒª´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý£¬ÔòpathΪNULL»òÕßΪ¿Õ´®£¬ + * Èç¹ûÐèÒª´ÓÎļþÖжÁÈ¡Êý¾Ý£¬ÔòÐèÒªÔÚpathÖÐÌîдÎļþÃûÐÅÏ¢¡£ + */ +Status CreateBiTree(BiTree* T, char* path) { + FILE* fp; + int readFromConsole; // ÊÇ·ñ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý + + // Èç¹ûûÓÐÎļþ·¾¶ÐÅÏ¢£¬Ôò´Ó¿ØÖÆÌ¨¶ÁÈ¡ÊäÈë + readFromConsole = path == NULL || strcmp(path, "") == 0; + + if(readFromConsole) { + printf("ÇëÊäÈë¶þ²æÊ÷µÄÏÈÐòÐòÁУ¬Èç¹ûûÓÐ×Ó½áµã£¬Ê¹ÓÃ^´úÌæ£º"); + CreateTree(T, NULL); + } else { + // ´ò¿ªÎļþ£¬×¼±¸¶ÁÈ¡²âÊÔÊý¾Ý + fp = fopen(path, "r"); + if(fp == NULL) { + return ERROR; + } + CreateTree(T, fp); + fclose(fp); + } + + return OK; +} + +/* + * ÅÐ¿Õ + * + * Åж϶þ²æÊ÷ÊÇ·ñΪ¿ÕÊ÷¡£ + */ +Status BiTreeEmpty(BiTree T) { + return T == NULL ? TRUE : FALSE; +} + +/* + * Ê÷Éî + * + * ·µ»Ø¶þ²æÊ÷µÄÉî¶È£¨²ãÊý£©¡£ + */ +int BiTreeDepth(BiTree T) { + int LD, RD; + + if(T == NULL) { + return 0; // ¿ÕÊ÷Éî¶ÈΪ0 + } else { + LD = BiTreeDepth(T->lchild); // Çó×ó×ÓÊ÷Éî¶È + RD = BiTreeDepth(T->rchild); // ÇóÓÒ×ÓÊ÷Éî¶È + + return (LD >= RD ? LD : RD) + 1; + } +} + + +/*©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥ ½öÏÞÄÚ²¿Ê¹Óõĺ¯Êý ©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥*/ + +// ´´½¨¶þ²æÊ÷µÄÄÚ²¿º¯Êý +static void CreateTree(BiTree* T, FILE* fp) { + char ch; + + // ¶ÁÈ¡µ±Ç°½áµãµÄÖµ + if(fp == NULL) { + scanf("%c", &ch); + } else { + ReadData(fp, "%c", &ch); + } + + if(ch == '^') { + *T = NULL; + } else { + // Éú³É¸ù½áµã + *T = (BiTree) malloc(sizeof(BiTNode)); + if(!(*T)) { + exit(OVERFLOW); + } + (*T)->data = ch; + CreateTree(&((*T)->lchild), fp); // ´´½¨×ó×ÓÊ÷ + CreateTree(&((*T)->rchild), fp); // ´´½¨ÓÒ×ÓÊ÷ + } +} + + +/*©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥ ͼÐλ¯Êä³ö ©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥*/ + +// ÒÔͼÐλ¯ÐÎʽÊä³öµ±Ç°½á¹¹£¬½öÏÞÄÚ²¿²âÊÔʹÓà +void PrintTree(BiTree T) { + int level, width; + int i, j, k, w; + int begin; + int distance; + TElemType** tmp; + LinkQueue Q; + BiTree e; + + // Óöµ½¿ÕÊ÷ÔòÎÞÐè¼ÌÐø¼ÆËã + if(BiTreeEmpty(T)) { + printf("\n"); + return; + } + + level = BiTreeDepth(T); // £¨ÍêÈ«£©¶þ²æÊ÷½á¹¹¸ß¶È + width = (int)pow(2, level)-1; // £¨ÍêÈ«£©¶þ²æÊ÷½á¹¹¿í¶È + + // ¶¯Ì¬´´½¨ÐÐ + tmp = (TElemType**)malloc(level* sizeof(TElemType*)); + + // ¶¯Ì¬´´½¨ÁÐ + for(i = 0; i < level; i++) { + tmp[i] = (TElemType*)malloc(width* sizeof(TElemType)); + + // ³õʼ»¯ÄÚ´æÖµÎª¿Õ×Ö·û + memset(tmp[i], '\0', width); + } + + // ½èÖú¶ÓÁÐʵÏÖ²ãÐò±éÀú + InitQueue(&Q); + EnQueue(&Q, T); + + // ±éÀúÊ÷ÖÐËùÓÐÔªËØ£¬½«Æä°²Åŵ½¶þάÊý×étmpÖкÏÊʵÄλÖà + for(i = 0; i < level; i++) { + w = (int) pow(2, i); // ¶þ²æÊ÷µ±Ç°²ãµÄ¿í¶È + distance = width / w; // ¶þ²æÊ÷µ±Ç°²ãµÄÔªËØ¼ä¸ô + begin = width / (int) pow(2, i + 1); // ¶þ²æÊ÷µ±Ç°²ãÊ׸öÔªËØÖ®Ç°µÄ¿Õ¸ñÊý + + for(k = 0; k < w; k++) { + DeQueue(&Q, &e); + + if(e == NULL) { + EnQueue(&Q, NULL); + EnQueue(&Q, NULL); + } else { + j = begin + k * (1 + distance); + tmp[i][j] = e->data; + + // ×óº¢×ÓÈë¶Ó + EnQueue(&Q, e->lchild); + + // ÓÒº¢×ÓÈë¶Ó + EnQueue(&Q, e->rchild); + } + } + } + + for(i = 0; i < level; i++) { + for(j = 0; j < width; j++) { + if(tmp[i][j] != '\0') { + printf("%c", tmp[i][j]); + } else { + printf(" "); + } + } + printf("\n"); + } +} diff --git a/VisualC++/ExerciseBook/07.39/BiTree.h b/VisualC++/ExerciseBook/07.39/BiTree.h new file mode 100644 index 0000000..00f93ed --- /dev/null +++ b/VisualC++/ExerciseBook/07.39/BiTree.h @@ -0,0 +1,83 @@ +/*============================= + * ¶þ²æÊ÷µÄ¶þ²æÁ´±í´æ´¢½á¹¹ + * + * °üº¬Ëã·¨: 6.1¡¢6.2¡¢6.3¡¢6.4 + =============================*/ + +#ifndef BITREE_H +#define BITREE_H + +#include +#include // Ìṩ malloc¡¢free Ô­ÐÍ +#include // Ìṩ memset¡¢strcmp Ô­ÐÍ +#include // Ìṩ pow Ô­ÐÍ +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// + +/* ¶þ²æÊ÷ÔªËØÀàÐͶ¨Ò壬ÕâÀï¼ÙÉèÆäÔªËØÀàÐÍΪchar */ +typedef char TElemType; + +/* ¶þ²æÊ÷½áµã¶¨Òå */ +typedef struct BiTNode { + TElemType data; // ½áµãÔªËØ + struct BiTNode* lchild; // ×óº¢×ÓÖ¸Õë + struct BiTNode* rchild; // ÓÒº¢×ÓÖ¸Õë +} BiTNode; + +/* Ö¸Ïò¶þ²æÊ÷½áµãµÄÖ¸Õë */ +typedef BiTNode* BiTree; + + +/* + * ³õʼ»¯ + * + * ¹¹Ôì¿Õ¶þ²æÊ÷¡£ + */ +Status InitBiTree(BiTree* T); + +/* + * ¨€¨€¨€¨€¨€¨€¨€¨€ Ëã·¨6.4 ¨€¨€¨€¨€¨€¨€¨€¨€ + * + * ´´½¨ + * + * °´ÕÕÔ¤ÉèµÄ¶¨ÒåÀ´´´½¨¶þ²æÊ÷¡£ + * ÕâÀïÔ¼¶¨Ê¹Óá¾ÏÈÐòÐòÁС¿À´´´½¨¶þ²æÊ÷¡£ + * + * + *¡¾±¸×¢¡¿ + * + * ½Ì²ÄÖÐĬÈÏ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý¡£ + * ÕâÀïΪÁË·½±ã²âÊÔ£¬±ÜÃâÿ´ÎÔËÐж¼ÊÖ¶¯ÊäÈëÊý¾Ý£¬ + * Òò¶øÔÊÐíÑ¡Ôñ´ÓÔ¤ÉèµÄÎļþpathÖжÁÈ¡²âÊÔÊý¾Ý¡£ + * + * Èç¹ûÐèÒª´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý£¬ÔòpathΪNULL»òÕßΪ¿Õ´®£¬ + * Èç¹ûÐèÒª´ÓÎļþÖжÁÈ¡Êý¾Ý£¬ÔòÐèÒªÔÚpathÖÐÌîдÎļþÃûÐÅÏ¢¡£ + */ +Status CreateBiTree(BiTree* T, char* path); + +/* + * ÅÐ¿Õ + * + * Åж϶þ²æÊ÷ÊÇ·ñΪ¿ÕÊ÷¡£ + */ +Status BiTreeEmpty(BiTree T); + +/* + * Ê÷Éî + * + * ·µ»Ø¶þ²æÊ÷µÄÉî¶È£¨²ãÊý£©¡£ + */ +int BiTreeDepth(BiTree T); + + +/*©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥ ½öÏÞÄÚ²¿Ê¹Óõĺ¯Êý ©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥*/ + +// ´´½¨¶þ²æÊ÷µÄÄÚ²¿º¯Êý +static void CreateTree(BiTree* T, FILE* fp); + + +/*©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥ ͼÐλ¯Êä³ö ©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥*/ + +// ÒÔͼÐλ¯ÐÎʽÊä³öµ±Ç°½á¹¹£¬½öÏÞÄÚ²¿²âÊÔʹÓà +void PrintTree(BiTree T); + +#endif diff --git a/VisualC++/ExerciseBook/07.39/LinkQueue.c b/VisualC++/ExerciseBook/07.39/LinkQueue.c new file mode 100644 index 0000000..111c53e --- /dev/null +++ b/VisualC++/ExerciseBook/07.39/LinkQueue.c @@ -0,0 +1,102 @@ +/*========================= + * ¶ÓÁеÄÁ´Ê½´æ´¢½á¹¹£¨Á´¶Ó£© + ==========================*/ + +#ifndef LINKQUEUE_C +#define LINKQUEUE_C + +#include "LinkQueue.h" //**¡ø03 Õ»ºÍ¶ÓÁÐ**// + +/* + * ³õʼ»¯ + * + * ¹¹ÔìÒ»¸ö¿ÕµÄÁ´¶Ó¡£ + * ³õʼ»¯³É¹¦Ôò·µ»ØOK£¬·ñÔò·µ»ØERROR¡£ + * + *¡¾×¢¡¿ + * ÕâÀïµÄ¶ÓÁдøÓÐÍ·½áµã + */ +Status InitQueue(LinkQueue* Q) { + if(Q == NULL) { + return ERROR; + } + + (*Q).front = (*Q).rear = (QueuePtr) malloc(sizeof(QNode)); + if(!(*Q).front) { + exit(OVERFLOW); + } + + (*Q).front->next = NULL; + + return OK; +} + +/* + * ÅÐ¿Õ + * + * ÅжÏÁ´¶ÓÖÐÊÇ·ñ°üº¬ÓÐЧÊý¾Ý¡£ + * + * ·µ»ØÖµ£º + * TRUE : Á´¶ÓΪ¿Õ + * FALSE: Á´¶Ó²»Îª¿Õ + */ +Status QueueEmpty(LinkQueue Q) { + if(Q.front == Q.rear) { + return TRUE; + } else { + return FALSE; + } +} + +/* + * Èë¶Ó + * + * ½«ÔªËØeÌí¼Óµ½¶ÓÁÐβ²¿¡£ + */ +Status EnQueue(LinkQueue* Q, QElemType e) { + QueuePtr p; + + if(Q == NULL || (*Q).front == NULL) { + return ERROR; + } + + p = (QueuePtr) malloc(sizeof(QNode)); + if(!p) { + exit(OVERFLOW); + } + + p->data = e; + p->next = NULL; + + (*Q).rear->next = p; + (*Q).rear = p; + + return OK; +} + +/* + * ³ö¶Ó + * + * ÒÆ³ý¶ÓÁÐÍ·²¿µÄÔªËØ£¬½«Æä´æ´¢µ½eÖС£ + */ +Status DeQueue(LinkQueue* Q, QElemType* e) { + QueuePtr p; + + if(Q == NULL || (*Q).front == NULL || (*Q).front == (*Q).rear) { + return ERROR; + } + + p = (*Q).front->next; + *e = p->data; + + (*Q).front->next = p->next; + if((*Q).rear == p) { + (*Q).rear = (*Q).front; + } + + free(p); + + return OK; +} + +#endif diff --git a/VisualC++/ExerciseBook/07.39/LinkQueue.h b/VisualC++/ExerciseBook/07.39/LinkQueue.h new file mode 100644 index 0000000..cc52316 --- /dev/null +++ b/VisualC++/ExerciseBook/07.39/LinkQueue.h @@ -0,0 +1,65 @@ +/*========================= + * ¶ÓÁеÄÁ´Ê½´æ´¢½á¹¹£¨Á´¶Ó£© + ==========================*/ + +#ifndef LINKQUEUE_H +#define LINKQUEUE_H + +#include +#include // Ìṩmalloc¡¢realloc¡¢free¡¢exitÔ­ÐÍ +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// +#include "BiTree.h" //**¡ø06 Ê÷ºÍ¶þ²æÊ÷**// + +/* Á´¶ÓÔªËØÀàÐͶ¨Òå */ +typedef BiTree QElemType; + +// ¶ÓÁÐÔªËØ½á¹¹ +typedef struct QNode { + QElemType data; + struct QNode* next; +} QNode, * QueuePtr; + +// ¶ÓÁнṹ +typedef struct { + QueuePtr front; // ¶ÓÍ·Ö¸Õë + QueuePtr rear; // ¶ÓβָÕë +} LinkQueue; // ¶ÓÁеÄÁ´Ê½´æ´¢±íʾ + + +/* + * ³õʼ»¯ + * + * ¹¹ÔìÒ»¸ö¿ÕµÄÁ´¶Ó¡£ + * ³õʼ»¯³É¹¦Ôò·µ»ØOK£¬·ñÔò·µ»ØERROR¡£ + * + *¡¾×¢¡¿ + * ÕâÀïµÄ¶ÓÁдøÓÐÍ·½áµã + */ +Status InitQueue(LinkQueue* Q); + +/* + * ÅÐ¿Õ + * + * ÅжÏÁ´¶ÓÖÐÊÇ·ñ°üº¬ÓÐЧÊý¾Ý¡£ + * + * ·µ»ØÖµ£º + * TRUE : Á´¶ÓΪ¿Õ + * FALSE: Á´¶Ó²»Îª¿Õ + */ +Status QueueEmpty(LinkQueue Q); + +/* + * Èë¶Ó + * + * ½«ÔªËØeÌí¼Óµ½¶ÓÁÐβ²¿¡£ + */ +Status EnQueue(LinkQueue* Q, QElemType e); + +/* + * ³ö¶Ó + * + * ÒÆ³ý¶ÓÁÐÍ·²¿µÄÔªËØ£¬½«Æä´æ´¢µ½eÖС£ + */ +Status DeQueue(LinkQueue* Q, QElemType* e); + +#endif diff --git a/VisualC++/ExerciseBook/07.39/SqList.c b/VisualC++/ExerciseBook/07.39/SqList.c new file mode 100644 index 0000000..623d818 --- /dev/null +++ b/VisualC++/ExerciseBook/07.39/SqList.c @@ -0,0 +1,114 @@ +/*============================= + * ÏßÐÔ±íµÄ˳Ðò´æ´¢½á¹¹£¨Ë³Ðò±í£© + * + * °üº¬Ëã·¨: 2.3¡¢2.4¡¢2.5¡¢2.6 + =============================*/ + +#include "SqList.h" + +/* + * ¨€¨€¨€¨€¨€¨€¨€¨€ Ëã·¨2.3 ¨€¨€¨€¨€¨€¨€¨€¨€ + * + * ³õʼ»¯ + * + * ³õʼ»¯³É¹¦Ôò·µ»ØOK£¬·ñÔò·µ»ØERROR¡£ + */ +Status InitList(SqList* L) { + // ·ÖÅäÖ¸¶¨ÈÝÁ¿µÄÄڴ棬Èç¹û·ÖÅäʧ°Ü£¬Ôò·µ»ØNULL + (*L).elem = (ElemType*) malloc(LIST_INIT_SIZE * sizeof(ElemType)); + if((*L).elem == NULL) { + // ´æ´¢ÄÚ´æÊ§°Ü + exit(OVERFLOW); + } + + (*L).length = 0; // ³õʼ»¯Ë³Ðò±í³¤¶ÈΪ0 + (*L).listsize = LIST_INIT_SIZE; // ˳Ðò±í³õʼÄÚ´æ·ÖÅäÁ¿ + + return OK; // ³õʼ»¯³É¹¦ +} + +/* + * ¼ÆÊý + * + * ·µ»ØË³Ðò±í°üº¬µÄÓÐÐ§ÔªËØµÄÊýÁ¿¡£ + */ +int ListLength(SqList L) { + return L.length; +} + +/* + * ȡֵ + * + * »ñȡ˳Ðò±íÖеÚi¸öÔªËØ£¬½«Æä´æ´¢µ½eÖС£ + * Èç¹û¿ÉÒÔÕÒµ½£¬·µ»ØOK£¬·ñÔò£¬·µ»ØERROR¡£ + * + *¡¾±¸×¢¡¿ + * ½Ì²ÄÖÐiµÄº¬ÒåÊÇÔªËØÎ»Ö㬴Ó1¿ªÊ¼¼ÆÊý£¬µ«Õâ²»·ûºÏ±àÂëµÄͨÓÃÔ¼¶¨¡£ + * ͨ³££¬iµÄº¬ÒåÓ¦¸ÃÖ¸Ë÷Òý£¬¼´´Ó0¿ªÊ¼¼ÆÊý¡£ + */ +Status GetElem(SqList L, int i, ElemType* e) { + // ÒòΪiµÄº¬ÒåÊÇλÖã¬ËùÒÔÆäºÏ·¨·¶Î§ÊÇ£º[1, length] + if(i < 1 || i > L.length) { + return ERROR; //iÖµ²»ºÏ·¨ + } + + *e = L.elem[i - 1]; + + return OK; +} + +/* + * ¨€¨€¨€¨€¨€¨€¨€¨€ Ëã·¨2.4 ¨€¨€¨€¨€¨€¨€¨€¨€ + * + * ²åÈë + * + * Ïò˳Ðò±íµÚi¸öλÖÃÉϲåÈëe£¬²åÈë³É¹¦Ôò·µ»ØOK£¬·ñÔò·µ»ØERROR¡£ + * + *¡¾±¸×¢¡¿ + * ½Ì²ÄÖÐiµÄº¬ÒåÊÇÔªËØÎ»Ö㬴Ó1¿ªÊ¼¼ÆÊý + */ +Status ListInsert(SqList* L, int i, ElemType e) { + ElemType* newbase; + ElemType* p, * q; + + // È·±£Ë³Ðò±í½á¹¹´æÔÚ + if(L == NULL || (*L).elem == NULL) { + return ERROR; + } + + // iÖµÔ½½ç + if(i < 1 || i > (*L).length + 1) { + return ERROR; + } + + // Èô´æ´¢¿Õ¼äÒÑÂú£¬ÔòÔö¼Óпռä + if((*L).length >= (*L).listsize) { + // »ùÓÚÏÖÓпռäÀ©ÈÝ + newbase = (ElemType*) realloc((*L).elem, ((*L).listsize + LISTINCREMENT) * sizeof(ElemType)); + if(newbase == NULL) { + // ´æ´¢ÄÚ´æÊ§°Ü + exit(OVERFLOW); + } + + // лùÖ· + (*L).elem = newbase; + // ´æµÄ´æ´¢¿Õ¼ä + (*L).listsize += LISTINCREMENT; + } + + // qΪ²åÈëλÖà + q = &(*L).elem[i - 1]; + + // 1.ÓÒÒÆÔªËØ£¬ÌÚ³öλÖà + for(p = &(*L).elem[(*L).length - 1]; p >= q; --p) { + *(p + 1) = *p; + } + + // 2.²åÈëe + *q = e; + + // 3.±í³¤Ôö1 + (*L).length++; + + return OK; +} diff --git a/VisualC++/ExerciseBook/07.39/SqList.h b/VisualC++/ExerciseBook/07.39/SqList.h new file mode 100644 index 0000000..08db2a8 --- /dev/null +++ b/VisualC++/ExerciseBook/07.39/SqList.h @@ -0,0 +1,73 @@ +/*============================= + * ÏßÐÔ±íµÄ˳Ðò´æ´¢½á¹¹£¨Ë³Ðò±í£© + * + * °üº¬Ëã·¨: 2.3¡¢2.4¡¢2.5¡¢2.6 + =============================*/ + +#ifndef SQLIST_H +#define SQLIST_H + +#include +#include // Ìṩmalloc¡¢realloc¡¢free¡¢exitÔ­ÐÍ +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// + +/* ºê¶¨Òå */ +#define LIST_INIT_SIZE 100 // ˳Ðò±í´æ´¢¿Õ¼äµÄ³õʼ·ÖÅäÁ¿ +#define LISTINCREMENT 10 // ˳Ðò±í´æ´¢¿Õ¼äµÄ·ÖÅäÔöÁ¿ + +/* ˳Ðò±íÔªËØÀàÐͶ¨Òå */ +typedef int ElemType; + +/* + * ˳Ðò±í½á¹¹ + * + * ×¢£ºelemÔÚʹÓÃǰÐèÒªÏÈΪÆä·ÖÅäÄڴ棬ÇÒÔªËØ´Óelem[0]´¦¿ªÊ¼´æ´¢ + */ +typedef struct { + ElemType* elem; // ˳Ðò±í´æ´¢¿Õ¼äµÄ»ùÖ·£¨Ö¸Ïò˳Ðò±íËùÕ¼ÄÚ´æµÄÆðʼλÖã© + int length; // µ±Ç°Ë³Ðò±í³¤¶È£¨°üº¬¶àÉÙÔªËØ£© + int listsize; // µ±Ç°·ÖÅäµÄ´æ´¢ÈÝÁ¿£¨¿ÉÒÔ´æ´¢¶àÉÙÔªËØ£© +} SqList; + + +/* + * ¨€¨€¨€¨€¨€¨€¨€¨€ Ëã·¨2.3 ¨€¨€¨€¨€¨€¨€¨€¨€ + * + * ³õʼ»¯ + * + * ³õʼ»¯³É¹¦Ôò·µ»ØOK£¬·ñÔò·µ»ØERROR¡£ + */ +Status InitList(SqList* L); + +/* + * ¼ÆÊý + * + * ·µ»ØË³Ðò±í°üº¬µÄÓÐÐ§ÔªËØµÄÊýÁ¿¡£ + */ +int ListLength(SqList L); + +/* + * ȡֵ + * + * »ñȡ˳Ðò±íÖеÚi¸öÔªËØ£¬½«Æä´æ´¢µ½eÖС£ + * Èç¹û¿ÉÒÔÕÒµ½£¬·µ»ØOK£¬·ñÔò£¬·µ»ØERROR¡£ + * + *¡¾±¸×¢¡¿ + * ½Ì²ÄÖÐiµÄº¬ÒåÊÇÔªËØÎ»Ö㬴Ó1¿ªÊ¼¼ÆÊý£¬µ«Õâ²»·ûºÏ±àÂëµÄͨÓÃÔ¼¶¨¡£ + * ͨ³££¬iµÄº¬ÒåÓ¦¸ÃÖ¸Ë÷Òý£¬¼´´Ó0¿ªÊ¼¼ÆÊý¡£ + */ +Status GetElem(SqList L, int i, ElemType* e); + +/* + * ¨€¨€¨€¨€¨€¨€¨€¨€ Ëã·¨2.4 ¨€¨€¨€¨€¨€¨€¨€¨€ + * + * ²åÈë + * + * Ïò˳Ðò±íµÚi¸öλÖÃÉϲåÈëe£¬²åÈë³É¹¦Ôò·µ»ØOK£¬·ñÔò·µ»ØERROR¡£ + * + *¡¾±¸×¢¡¿ + * ½Ì²ÄÖÐiµÄº¬ÒåÊÇÔªËØÎ»Ö㬴Ó1¿ªÊ¼¼ÆÊý + */ +Status ListInsert(SqList* L, int i, ElemType e); + +#endif diff --git a/VisualC++/ExerciseBook/07.39/TestData_Pre.txt b/VisualC++/ExerciseBook/07.39/TestData_Pre.txt new file mode 100644 index 0000000..e988f9b --- /dev/null +++ b/VisualC++/ExerciseBook/07.39/TestData_Pre.txt @@ -0,0 +1 @@ +ÏÈÐòÐòÁУ¨³¯ÉϵÄÈý½Ç´ú±í¿Õ½áµã£©£º*+*+a^^b^^*b^^+c^^d^^*+c^^d^^e^^*+c^^d^^e^^ \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.40/07.40.c b/VisualC++/ExerciseBook/07.40/07.40.c new file mode 100644 index 0000000..cd16ce8 --- /dev/null +++ b/VisualC++/ExerciseBook/07.40/07.40.c @@ -0,0 +1,193 @@ +#include +#include +#include "SqList.h" +#include "ALGraph.h" + +/* + * »ñÈ¡´æ´¢ÔÚÓÐÏòÎÞ»·Í¼Öеıí´ïʽµÄÄæ²¨À¼Ê½ + * + * ×¢£º±í´ïʽ½á¹¹²Î¿¼½Ì²Ä²åͼ7.23 + */ +void Algo_7_40(ALGraph G, SqList* RPN); + +/* + * ´Ó¶¥µãv³ö·¢»ñÈ¡ÓÐÏòͼÖд洢µÄ±í´ïʽµÄÄæ²¨À¼Ê½¡£ + * ÇóÈ¡µÄÄæ²¨À¼Ê½»á´æ´¢ÔÚRPNÖС£ + */ +static void AntiPolandFormula_7_40(ALGraph G, int v, SqList* RPN); + +/* + * ¼ÆËãÄæ²¨À¼Ê½µÄÖµ + */ +int Evaluation_7_40(SqList RPN); + + +int main(int argc, char* argv[]) { + ALGraph G; + SqList RPN; // ´æ´¢Ä沨À¼±í´ïʽ + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ´´½¨²¢´òÓ¡ÓÐÏòÍø... \n"); + { + char* path[4]; + + path[0] = "TestData_DG.txt"; + path[1] = ""; + path[2] = ""; + path[3] = ""; + + CreateGraph(&G, path); + PrintGraph(G); + printf("\n"); + } + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ÇóÈ¡ÓÐÏòÍøÖд洢µÄ±í´ïʽµÄÄæ²¨À¼Ê½... \n"); + { + Algo_7_40(G, &RPN); + printf("\n"); + } + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ¼ÆËãÄæ²¨À¼Ê½µÄÖµ... \n"); + { + printf("¼ÆËãÉÏÊöÄæ²¨À¼Ê½µÄֵΪ£º%d\n", Evaluation_7_40(RPN)); + printf("\n"); + } + + return 0; +} + + +/* + * »ñÈ¡´æ´¢ÔÚÓÐÏòÎÞ»·Í¼Öеıí´ïʽµÄÄæ²¨À¼Ê½ + * + * ×¢£º±í´ïʽ½á¹¹²Î¿¼½Ì²Ä²åͼ7.23 + */ +void Algo_7_40(ALGraph G, SqList* RPN) { + int i, root; + int indegree[MAX_VERTEX_NUM]; // ËùÓж¥µãµÄÈë¶ÈÐÅÏ¢ + ArcNode* p; + ElemType e; + + // ³õʼ»¯ËùÓж¥µãµÄÈë¶ÈΪ0 + for(i = 0; i < G.vexnum; i++) { + indegree[i] = 0; + } + + // ±éÀúËùÓж¥µã + for(i = 0; i < G.vexnum; i++) { + // Ö¸Ïò¸Ã¶¥µãµÄÊ׸öÁÚ½Óµã + p = G.vertices[i].firstarc; + + // ±éÀú¸Ã¶¥µãµÄËùÓÐÁڽӵ㣬ͳ¼Æ¸÷¶¥µãµÄÈë¶È + while(p != NULL) { + indegree[p->adjvex]++; + p = p->nextarc; + } + } + + // ²éÕÒµ½¸ù½áµã + for(i = 0; i < G.vexnum; i++) { + if(indegree[i] == 0) { + root = i; + break; + } + } + + // ³õʼ»¯³¤¶ÈΪ0µÄÏßÐÔ±í + InitList(RPN); + + // ´ÓÓÐÏòÎÞ»·Í¼µÄ¸ù½áµã³ö·¢£¬Í¨¹ýβµÝ¹é»ñÈ¡µ½ÆäÖд洢µÄ±í´ïʽµÄÄæ²¨À¼Ê½ + AntiPolandFormula_7_40(G, root, RPN); + + // Êä³öÄæ²¨À¼Ê½ + for(i = 1; i <= ListLength(*RPN); i++) { + GetElem(*RPN, i, &e); + + if(e.type == Operand) { + printf("%d ", e.op); // ²Ù×÷Êý + } else { + printf("%c ", e.op); // ²Ù×÷·û + } + } + printf("\n"); +} + +/* + * ´Ó¶¥µãv³ö·¢»ñÈ¡ÓÐÏòͼÖд洢µÄ±í´ïʽµÄÄæ²¨À¼Ê½¡£ + * ÇóÈ¡µÄÄæ²¨À¼Ê½»á´æ´¢ÔÚRPNÖС£ + */ +void AntiPolandFormula_7_40(ALGraph G, int v, SqList* RPN) { + ArcNode* r; + Vertex vex; + + // ÏȱéÀúÁÚ½Óµã + for(r = G.vertices[v].firstarc; r != NULL; r = r->nextarc) { + AntiPolandFormula_7_40(G, r->adjvex, RPN); + } + + // »ñÈ¡²Ù×÷·û/²Ù×÷Êý + vex = G.vertices[v].context; + + // µ±Ã»ÓÐÁÚ½Óµã¿É±éÀúʱ£¬´æ´¢¸Ã¶¥µã + ListInsert(RPN, ListLength(*RPN) + 1, vex); +} + +/* + * ¼ÆËãÄæ²¨À¼Ê½µÄÖµ£¬Èç¹û·¢Éú´íÎ󣬷µ»ØINT_MIN¡£ + */ +int Evaluation_7_40(SqList RPN) { + int stack[MAX_VERTEX_NUM]; // Ä£ÄâÒ»¸öÕ»£¬ÓÃÀ´´æ´¢±í´ïʽµÄ¼ÆËã½á¹û + int top = 0; // Õ»¶¥Óαê + int a, b; + ElemType e; + int i; + Boolean hasError = FALSE; // ¼ÆËã¹ý³ÌÖгöÏÖÁË´íÎó + + for(i = 1; i <= ListLength(RPN) && !hasError; i++) { + GetElem(RPN, i, &e); + + // ²Ù×÷Êý + if(e.type == Operand) { + stack[top++] = e.op; + + // ²Ù×÷·û + } else { + if(top > 0) { + b = stack[--top]; + } else { + return INT_MIN; + } + + if(top > 0) { + a = stack[--top]; + } else { + return INT_MIN; + } + + switch(e.op) { + case '+': + stack[top++] = a + b; + break; + case '-': + stack[top++] = a - b; + break; + case '*': + stack[top++] = a * b; + break; + case '/': + stack[top++] = a / b; + break; + default: + printf("ÎÞ·¨Ê¶±ðµÄ²Ù×÷·û£º%c\n", e.op); + hasError = TRUE; + break; + } + } + } + + // Õ»ÖÐ×îºóÖ»Ó¦¸ÃÊ£Ò»¸öÖµ + if(hasError || top != 1) { + return INT_MIN; + } + + return stack[0]; +} diff --git a/VisualC++/ExerciseBook/07.40/07.40.png b/VisualC++/ExerciseBook/07.40/07.40.png new file mode 100644 index 0000000000000000000000000000000000000000..635f7db6052dc2e508bf9a201c23fb136629d8fe GIT binary patch literal 28101 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 + + + + Debug + Win32 + + + Release + Win32 + + + + {C3FC2734-BCD5-403A-BE50-7C874F93BDB3} + My0740 + + + + Application + true + MultiByte + + + Application + false + true + MultiByte + + + + + + + + + + + + + $(SolutionDir)\..\Status;$(IncludePath) + + + + Level3 + Disabled + + + true + $(SolutionDir)\..\Status\Status.lib;%(AdditionalDependencies) + Console + + + + + Level3 + MaxSpeed + true + true + + + true + true + true + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.40/07.40.vcxproj.filters b/VisualC++/ExerciseBook/07.40/07.40.vcxproj.filters new file mode 100644 index 0000000..987cacc --- /dev/null +++ b/VisualC++/ExerciseBook/07.40/07.40.vcxproj.filters @@ -0,0 +1,41 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + æºæ–‡ä»¶ + + + æºæ–‡ä»¶ + + + æºæ–‡ä»¶ + + + + + 头文件 + + + 头文件 + + + + + èµ„æºæ–‡ä»¶ + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.40/07.40.vcxproj.user b/VisualC++/ExerciseBook/07.40/07.40.vcxproj.user new file mode 100644 index 0000000..ace9a86 --- /dev/null +++ b/VisualC++/ExerciseBook/07.40/07.40.vcxproj.user @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.40/ALGraph.c b/VisualC++/ExerciseBook/07.40/ALGraph.c new file mode 100644 index 0000000..8957deb --- /dev/null +++ b/VisualC++/ExerciseBook/07.40/ALGraph.c @@ -0,0 +1,377 @@ +/*================== + * ͼµÄÁÚ½Ó±í´æ´¢±íʾ + ===================*/ + +#include "ALGraph.h" + +// ¼ÈëÊý¾ÝµÄÔ´Îļþ£»fpΪnullʱ£¬ËµÃ÷ÐèÒª´Ó¿ØÖÆÌ¨Â¼Èë +static FILE* fp = NULL; + +/* + * IncInfoָʾ¸Ãͼ/ÍøµÄ±ß/»¡ÉÏÊÇ·ñ´æÔÚ¸½¼ÓÐÅÏ¢¡£ + * Èç¹ûÆäÖµ²»Îª0£¬Ôò±íʾÎÞ¸½¼ÓÐÅÏ¢£¬·ñÔò£¬±íʾ´æÔÚ¸½¼ÓÐÅÏ¢¡£ + */ +Boolean IncInfo = FALSE; + +// ·ÃÎʱêÖ¾Êý×飬¼Ç¼·ÃÎʹýµÄ¶¥µã +static Boolean visited[MAX_VERTEX_NUM]; + +// º¯Êý±äÁ¿ +static Status (* VisitFunc)(VertexType e); + + +/* + * ´´½¨ + * + *¡¾±¸×¢¡¿ + * + * ½Ì²ÄÖÐĬÈÏ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý¡£ + * ÕâÀïΪÁË·½±ã²âÊÔ£¬±ÜÃâÿ´ÎÔËÐж¼ÊÖ¶¯ÊäÈëÊý¾Ý£¬ + * Òò¶øÔÊÐíÑ¡Ôñ´ÓÔ¤ÉèµÄÎļþpathÖжÁÈ¡²âÊÔÊý¾Ý¡£ + * + * Èç¹ûÐèÒª´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý£¬ÔòpathΪNULL£¬»òpath[kind]Ϊ""¡£ + * Èç¹ûÐèÒª´ÓÎļþÖжÁÈ¡Êý¾Ý£¬ÔòÐèÒªÔÚpathÖÐÌîдÎļþÃûÐÅÏ¢¡£ + */ +Status CreateGraph(ALGraph* G, char* path[]) { + int readFromConsole; // ÊÇ·ñ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý + int kind; + Status flag; + + // ¡ï¡ï¡ï´Ë´¦¹Ì¶¨ÎªÓÐÏòͼ + kind = 0; + + // Èç¹ûûÓÐÎļþ·¾¶ÐÅÏ¢£¬Ôò´Ó¿ØÖÆÌ¨¶ÁÈ¡ÊäÈë + readFromConsole = (path == NULL) || strcmp(path[kind], "") == 0; + + // ÐèÒª´ÓÎļþ¶ÁÈ¡ + if(readFromConsole) { + (*G).kind = kind; // ¼Ç¼ͼ/ÍøµÄÀàÐÍ + } else { + // ´ò¿ªÎļþ£¬×¼±¸¶ÁÈ¡²âÊÔÊý¾Ý + fp = fopen(path[kind], "r"); + if(fp == NULL) { + return ERROR; + } + + // ¼ÈëͼµÄÀàÐÍ + ReadData(fp, "%d", &((*G).kind)); + } + + // Ëæ»ú´´½¨ÓÐÏòͼ/Íø»òÎÞÏòͼ/ÍøµÄÒ»ÖÖ + switch((*G).kind) { + case DG: + flag = CreateDG(G); + break; + default: + flag = ERROR; + break; + } + + if(fp != NULL) { + fclose(fp); + fp = NULL; + } + + return flag; +} + +/* + * ¹¹ÔìÓÐÏòͼ + */ +static Status CreateDG(ALGraph* G) { + int i, k; + int vexnum, arcnum; + VertexType v1, v2; + InfoType* info = NULL; + int type; + char o; // ²Ù×÷·û + + (*G).vexnum = (*G).arcnum = 0; + + if(fp == NULL) { + printf("ÇëÊäÈëÓÐÏòͼµÄ¶¥µãÊý£º"); + scanf("%d", &vexnum); + printf("ÇëÊäÈëÓÐÏòͼµÄ»¡Êý£º"); + scanf("%d", &arcnum); + printf("¸ÃÓÐÏòͼµÄ»¡ÉÏÊÇ·ñ°üº¬ÆäËû¸½¼ÓÐÅÏ¢(0-²»°üº¬©¦1-°üº¬)£º"); + scanf("%d", &IncInfo); + + // ¼Èë¶¥µã¼¯ + printf("Çë¼Èë %d ¸ö¶¥µã£¬²»Í¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º", vexnum); + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(stdin); + scanf("%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } else { + ReadData(fp, "%d", &vexnum); // ¼Èë¶¥µãÊý + ReadData(fp, "%d", &arcnum); // ¼È뻡Êý + ReadData(fp, "%d", &IncInfo); // Åжϻ¡ÉÏÊÇ·ñ°üº¬¸½¼ÓÐÅÏ¢ + + // ¼Èë¶¥µã¼¯ + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(fp); + ReadData(fp, "%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } + + // ½öÔÚ¿ØÖÆÌ¨Â¼ÈëÐÅϢʱÊä³ö´ËÌáʾ + if(fp == NULL && arcnum != 0) { + printf("ÇëΪÓÐÏòͼÒÀ´Î¼Èë %d Ìõ»¡µÄÐÅÏ¢£¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º\n", arcnum); + } + + // ¼È뻡µÄÐÅÏ¢ + for(k = 0; k < arcnum; k++) { + if(fp == NULL) { + printf("µÚ %2d Ìõ»¡£º", k + 1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v2); + } else { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + skipBlank(fp); + ReadData(fp, "%c%c", &v1, &v2); + } + + // Èç¹ûÐèҪ¼È뻡µÄÆäËû¸½¼ÓÐÅÏ¢ + if(IncInfo) { + // ×îºó¼È븽¼ÓÐÅÏ¢ + Input(*G, &info); + } + + // ²åÈ뻡 + InsertArc(G, v1, v2, info); + } + + + + /* Ìí¼ÓÏÂÃæ´úÂ룬ÒÔÓ¦¶ÔÐ޸ĺóµÄ½á¹¹ */ + + // ¼Èë¶¥µã¶ÔÓ¦µÄ²Ù×÷·û/²Ù×÷Êý + if(fp == NULL) { + printf("ÇëΪ¸÷¶¥µã¼Èë²Ù×÷·û/²Ù×÷ÊýÐÅÏ¢£º\n"); + printf(" Èç¹û¶¥µãÊDzÙ×÷·û£¬Ê¾·¶ÊäÈëΪ£º0 +\n"); + printf(" Èç¹û¶¥µãÊDzÙ×÷Êý£¬Ê¾·¶ÊäÈëΪ£º1 12\n"); + for(i = 0; i < vexnum; i++) { + printf("ÇëÊäÈë¶¥µã %c ¶ÔÓ¦µÄÊý¾ÝÐÅÏ¢£º", G->vertices[i].data); + + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(stdin); + scanf("%d", &type); + + // ²Ù×÷·û + if(type == 0) { + (*G).vertices[i].context.type = Operator; + scanf("%c", &o); + (*G).vertices[i].context.op = o; + } else if(type == 1) { + (*G).vertices[i].context.type = Operand; + scanf("%d", &((*G).vertices[i].context.op)); + } else { + printf("ÎÞ·¨Ê¶±ðµÄ¶¥µãÊý¾Ý...\n"); + return ERROR; + } + } + } else { + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(fp); + ReadData(fp, "%d", &type); + + // ²Ù×÷·û + if(type == 0) { + (*G).vertices[i].context.type = Operator; + ReadData(fp, "%c", &o); + (*G).vertices[i].context.op = o; + } else if(type == 1) { + (*G).vertices[i].context.type = Operand; + ReadData(fp, "%d", &((*G).vertices[i].context.op)); + } else { + printf("ÎÞ·¨Ê¶±ðµÄ¶¥µãÊý¾Ý...\n"); + return ERROR; + } + } + } + + // ´ÓÎļþÖжÁÈ¡Êý¾Ýʱ£¬×îºóÆäʵӦµ±ÅжÏÒ»ÏÂÊÇ·ñ¶Áµ½ÁË×ã¹»µÄÐÅÏ¢ + return OK; +} + +/* + * ¼Èë±ß/»¡µÄÏà¹Ø¸½¼ÓÐÅÏ¢ + */ +static void Input(ALGraph G, InfoType** info) { + int weight; + + // ÔÚ"Íø"µÄÇéÐÎÏÂÐèҪ¼ÈëȨֵÐÅÏ¢ + if(G.kind == DN || G.kind == UDN) { + *info = (InfoType*) malloc(sizeof(InfoType)); + + if(fp == NULL) { + scanf("%d", &weight); + } else { + ReadData(fp, "%d", &weight); + } + + (*info)->weight = weight; + } +} + +/* + * ²éÕÒ + * + * ·µ»Ø¶¥µãuÔÚͼ/ÍøÖеÄλÖà + */ +int LocateVex(ALGraph G, VertexType u) { + int i; + + for(i = 0; i < G.vexnum; i++) { + if(G.vertices[i].data == u) { + return i; + } + } + + return -1; +} + +/* + * ¹¹ÔìÒ»¸ö±ß/»¡½áµã(½öÏÞÄÚ²¿Ê¹ÓÃ) + */ +static ArcNode* newArcNodePtr(int adjvex, ArcNode* nextarc, InfoType* info) { + ArcNode* p = (ArcNode*) malloc(sizeof(ArcNode)); + if(!p) { + exit(OVERFLOW); + } + + p->adjvex = adjvex; + + p->nextarc = nextarc; + + p->info = info; + + return p; +} + +/* + * ²åÈë±ß/»¡ + * + * Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬Ôò²åÈëÒ»Ìõ»¡ÐèÒªÔö¼ÓÁ½¸ö¶¥µã¹ØÏµ£¬µ«»¡µÄÊýÁ¿Ö»ÔöÒ»¡£ + * ¶ÔÓÚͼ/ÍøÀ´Ëµ£¬¿ÉÒÔÔڿɱä²ÎÊýÖÐÁгö±ß/»¡µÄ¸½¼ÓÐÅÏ¢¡£ + * + * ×¢£º´Ë´¦½ÓÊյIJÎÊýÓëMGraphÓÐЩ²»Ò»Ñù£ºÍøµÄ¸½¼ÓÐÅÏ¢Öаüº¬Á˸÷Ìõ±ß/»¡µÄȨֵ¡£ + */ +Status InsertArc(ALGraph* G, VertexType v, VertexType w, ...) { + int tail, head, k, count; + ArcNode* r; + ArcNode* pre; + Boolean overlay = FALSE; // ÊÇ·ñΪ¸²¸ÇÌí¼Ó + InfoType* info = NULL; // ±ß/»¡µÄ¸½¼ÓÐÅÏ¢ + va_list ap; + + tail = LocateVex(*G, v); // »ñÈ¡¶¥µãvÔÚ¶¥µã¼¯ÖеÄλÖà + if(tail == -1) { + return ERROR; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + head = LocateVex(*G, w); // »ñÈ¡¶¥µãwÔÚ¶¥µã¼¯ÖеÄλÖà + if(head == -1) { + return ERROR; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + // ¾Ü¾ø»· + if(tail == head) { + return ERROR; + } + + // Èç¹û±ß/»¡ÉÏ´æÔÚ¸½¼ÓÐÅÏ¢ + if(IncInfo) { + va_start(ap, w); // ÔÚwºó²éѯÊ׸ö¿É±ä²ÎÊý + info = va_arg(ap, InfoType*); // »ñÈ¡¸½¼ÓÐÅÏ¢ + va_end(ap); + } + + /* ½ÓÏÂÀ´£¬ÐèÒª²éÕÒºÏÊʵIJåÈëλÖà */ + + for(count = 0; count < 2; count++) { + pre = NULL; + // Ö¸ÏòÒÔtailΪβµÄÊ×Ìõ±ß/»¡ + r = G->vertices[tail].firstarc; + while(r != NULL && r->adjvex < head) { + pre = r; + r = r->nextarc; + } + + // Óöµ½ÁËÏàͬλÖõĽáµã + if(r != NULL && r->adjvex == head) { + r->info = info; // ¸´Óøýáµã + overlay = TRUE; // ·¢ÉúÁ˸²¸Ç + } else { + if(pre == NULL) { + G->vertices[tail].firstarc = newArcNodePtr(head, r, info); + } else { + pre->nextarc = newArcNodePtr(head, r, info); + } + } + + // Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬ÐèÒª¿¼ÂǶԳÆÐÔ + if((G->kind == UDG || G->kind == UDN) && tail != head) { + // µßµ¹iºÍj + k = tail; + tail = head; + head = k; + } else { + break; // Èç¹ûÊÇÓÐÏòµÄ£¬¿ÉÒÔ½áÊøÁË + } + } + + // ÔڷǸ²¸ÇµÄÇéÐÎÏ£¬²Å¿¼ÂǸüбß/»¡µÄÊýÁ¿ + if(!overlay) { + (*G).arcnum++; // ²»ÂÛÓÐÏòÎÞÏò£¬±ß/»¡ÊýÖ»ÔöÒ» + } + + return OK; +} + +/* + * ÒÔͼÐλ¯ÐÎʽÊä³öµ±Ç°½á¹¹ + */ +void PrintGraph(ALGraph G) { + int i; + ArcNode* p; + + if(G.vexnum == 0) { + printf("¿Õͼ£¬ÎÞÐè´òÓ¡£¡\n"); + return; + } + + printf("µ±Ç°Í¼/Íø°üº¬ %2d ¸ö¶¥µã£¬ %2d Ìõ±ß/»¡...\n", G.vexnum, G.arcnum); + + for(i = 0; i < G.vexnum; i++) { + printf("%c ===> ", G.vertices[i].data); + + p = G.vertices[i].firstarc; + while(p != NULL) { + if(IncInfo == 0) { + printf("%c ", G.vertices[p->adjvex].data); + + // ¶ÔÓÚÍø£¬»á´ÓÆä¸½¼ÓÐÅÏ¢ÖлñÈ¡µ½È¨Öµ + } else { + printf("%c[%2d] ", G.vertices[p->adjvex].data, p->info->weight); + } + + p = p->nextarc; + + if(p != NULL) { + printf("- "); + } + } + + printf("\n"); + } +} diff --git a/VisualC++/ExerciseBook/07.40/ALGraph.h b/VisualC++/ExerciseBook/07.40/ALGraph.h new file mode 100644 index 0000000..f53e2d0 --- /dev/null +++ b/VisualC++/ExerciseBook/07.40/ALGraph.h @@ -0,0 +1,141 @@ +/*================== + * ͼµÄÁÚ½Ó±í´æ´¢±íʾ + ===================*/ + +#ifndef ALGRAPH_H +#define ALGRAPH_H + +#include +#include // Ìṩmemset¡¢strcmp Ô­ÐÍ +#include // Ìṩºêva_list¡¢va_start¡¢va_arg¡¢va_end +#include // Ìṩmalloc¡¢realloc¡¢free¡¢exitÔ­ÐÍ +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// + +/* + * ×¢£º + * + * ͨ³£À´½²£¬ÎÞȨͼ±»¼ò³ÆÎª¡¾Í¼¡¿£¬ÓÐȨͼ±»¼ò³ÆÎª¡¾Íø¡¿¡£ + * ÎÞÏòͼ/ÍøÖеĶ¥µã¹ØÏµ±»³ÆÎª¡¾±ß¡¿£¬ÓÐÏòͼ/ÍøÖеĶ¥µã¹ØÏµ±»³ÆÎª¡¾»¡¡¿£¬²¢Çø·Ö»¡Í·Ó뻡β¡£ + * ʵ¼Ê±íÊöÖУ¬Î´±Ø»áÑϸñ×ñÊØÒÔÉÏÃüÃû¡£ + * + * µ±Ç°½á¹¹Êʺϴ洢±ß/»¡±È½ÏÏ¡ÊèµÄͼ/Íø¡£ + * + * ¡ï ²åÈë±ß/»¡µÄÐÅϢʱ£¬ÕâÀïµÄʵÏÖÊǰ´"ÉýÐò"²åÈëµÄ£¬ÕâʹµÃ²åÈëµÄ»¡Êǰ´"ÉýÐò"ÅÅÁеġ£ + */ + + +/* ºê¶¨Òå */ +#define MAX_VERTEX_NUM 26 // ×î´ó¶¥µã¸öÊý + + +// ͼµÄÀàÐÍ +typedef enum { + DG, // 0-ÓÐÏòͼ + DN, // 1-ÓÐÏòÍø(´øÈ¨Öµ) + UDG, // 2-ÎÞÏòͼ + UDN // 3-ÎÞÏòÍø(´øÈ¨Öµ) +} GraphKind; + +// ¶¥µãµÄÊý¾ÝÀàÐÍ +typedef enum { + Operator, // ²Ù×÷·û£¬ÓÃ×Ö·û±íʾ£¬µ«¿ÉÒÔ´æ´¢µ½ÕûÐÍÖÐ + Operand // ²Ù×÷Êý£¬ÓÃÕûÊý±íʾ£¬Èç¹û½«À´À©³äµ½¸¡µãÊý£¬¿ÉÒÔͳһʹÓø¡µãÐÍ´æ´¢ +} Type; + +// ¶¥µã±àºÅÀàÐÍ +typedef char VertexType; + +// ¶¥µã´æ´¢µÄÊý¾Ý +typedef struct Vertex { + Type type; // ָʾµ±Ç°¶¥µãÊDzÙ×÷·û»¹ÊDzÙ×÷Êý + int op; // ´æ´¢µ±Ç°¶¥µã¶ÔÓ¦µÄ²Ù×÷·û/²Ù×÷Êý +} Vertex; + +// ±ß/»¡µÄÏà¹Ø¸½¼ÓÐÅÏ¢ +typedef struct { + /* + * ×¢£º + * ½Ì²ÄÖиø³öµÄ½á¹¹Ö»¿¼ÂÇÁËÎÞȨͼ£¬¶øÃ»¿¼ÂÇÓÐȨͼ(Íø)¡£ + * ÕâÀïΪÁ˰ѡ°Íø¡±µÄÇéÐÎÒ²¿¼ÂǽøÈ¥£¬ÌØÔÚ¸½¼ÓÐÅÏ¢ÖÐÔö¼ÓÁË"È¨ÖØ"ÊôÐÔ¡£ + */ + int weight; +} InfoType; + +/* ±ß/»¡½áµã */ +typedef struct ArcNode { + int adjvex; // ¸Ã»¡ËùÖ¸ÏòµÄ¶¥µãµÄλÖà + struct ArcNode* nextarc; // Ö¸ÏòÏÂÒ»Ìõ»¡µÄÖ¸Õë + InfoType* info; // »¡µÄ¸½¼ÓÐÅÏ¢£¬Í¨³£ºöÂÔ +} ArcNode; + +// ÿ¸öÁ´±íµÄÍ·½áµã +typedef struct VNode { + VertexType data; // ¶¥µãÐÅÏ¢ + Vertex context; // Óë¸Ã¶¥µã¶ÔÓ¦µÄ²Ù×÷·û/²Ù×÷Êý + ArcNode* firstarc; // Ö¸ÏòµÚÒ»ÌõÒÀ¸½¸Ã¶¥µãµÄ»¡µÄÖ¸Õë +} VNode; + +/* ͼµÄÁÚ½Ó±í´æ´¢±íʾÀàÐͶ¨Òå */ +typedef struct { + VNode vertices[MAX_VERTEX_NUM]; // ÁÚ½Ó±í + int vexnum, arcnum; // ͼ/ÍøµÄ¶¥µãÊýºÍ»¡Êý + GraphKind kind; // ͼµÄÀàÐͱêÖ¾ +} ALGraph; + + +// ±ß/»¡ÉÏÊÇ·ñ´æÔÚ¸½¼ÓÐÅÏ¢ +extern Boolean IncInfo; + + +/* + * ´´½¨ + * + *¡¾±¸×¢¡¿ + * + * ½Ì²ÄÖÐĬÈÏ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý¡£ + * ÕâÀïΪÁË·½±ã²âÊÔ£¬±ÜÃâÿ´ÎÔËÐж¼ÊÖ¶¯ÊäÈëÊý¾Ý£¬ + * Òò¶øÔÊÐíÑ¡Ôñ´ÓÔ¤ÉèµÄÎļþpathÖжÁÈ¡²âÊÔÊý¾Ý¡£ + * + * Èç¹ûÐèÒª´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý£¬ÔòpathΪNULL£¬»òpath[kind]Ϊ""¡£ + * Èç¹ûÐèÒª´ÓÎļþÖжÁÈ¡Êý¾Ý£¬ÔòÐèÒªÔÚpathÖÐÌîдÎļþÃûÐÅÏ¢¡£ + */ +Status CreateGraph(ALGraph* G, char* path[]); + +/* + * ¹¹ÔìÓÐÏòͼ + */ +static Status CreateDG(ALGraph* G); + +/* + * ¼Èë±ß/»¡µÄÏà¹Ø¸½¼ÓÐÅÏ¢ + */ +static void Input(ALGraph G, InfoType** info); + +/* + * ²éÕÒ + * + * ·µ»Ø¶¥µãuÔÚͼ/ÍøÖеÄλÖà + */ +int LocateVex(ALGraph G, VertexType u); + +/* + * ¹¹ÔìÒ»¸ö±ß/»¡½áµã(½öÏÞÄÚ²¿Ê¹ÓÃ) + */ +static ArcNode* newArcNodePtr(int adjvex, ArcNode* nextarc, InfoType* info); + +/* + * ²åÈë±ß/»¡ + * + * Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬Ôò²åÈëÒ»Ìõ»¡ÐèÒªÔö¼ÓÁ½¸ö¶¥µã¹ØÏµ£¬µ«»¡µÄÊýÁ¿Ö»ÔöÒ»¡£ + * ¶ÔÓÚͼ/ÍøÀ´Ëµ£¬¿ÉÒÔÔڿɱä²ÎÊýÖÐÁгö±ß/»¡µÄ¸½¼ÓÐÅÏ¢¡£ + * + * ×¢£º´Ë´¦½ÓÊյIJÎÊýÓëMGraphÓÐЩ²»Ò»Ñù£ºÍøµÄ¸½¼ÓÐÅÏ¢Öаüº¬Á˸÷Ìõ±ß/»¡µÄȨֵ¡£ + */ +Status InsertArc(ALGraph* G, VertexType v, VertexType w, ...); + +/* + * ÒÔͼÐλ¯ÐÎʽÊä³öµ±Ç°½á¹¹ + */ +void PrintGraph(ALGraph G); + +#endif diff --git a/VisualC++/ExerciseBook/07.40/SqList.c b/VisualC++/ExerciseBook/07.40/SqList.c new file mode 100644 index 0000000..623d818 --- /dev/null +++ b/VisualC++/ExerciseBook/07.40/SqList.c @@ -0,0 +1,114 @@ +/*============================= + * ÏßÐÔ±íµÄ˳Ðò´æ´¢½á¹¹£¨Ë³Ðò±í£© + * + * °üº¬Ëã·¨: 2.3¡¢2.4¡¢2.5¡¢2.6 + =============================*/ + +#include "SqList.h" + +/* + * ¨€¨€¨€¨€¨€¨€¨€¨€ Ëã·¨2.3 ¨€¨€¨€¨€¨€¨€¨€¨€ + * + * ³õʼ»¯ + * + * ³õʼ»¯³É¹¦Ôò·µ»ØOK£¬·ñÔò·µ»ØERROR¡£ + */ +Status InitList(SqList* L) { + // ·ÖÅäÖ¸¶¨ÈÝÁ¿µÄÄڴ棬Èç¹û·ÖÅäʧ°Ü£¬Ôò·µ»ØNULL + (*L).elem = (ElemType*) malloc(LIST_INIT_SIZE * sizeof(ElemType)); + if((*L).elem == NULL) { + // ´æ´¢ÄÚ´æÊ§°Ü + exit(OVERFLOW); + } + + (*L).length = 0; // ³õʼ»¯Ë³Ðò±í³¤¶ÈΪ0 + (*L).listsize = LIST_INIT_SIZE; // ˳Ðò±í³õʼÄÚ´æ·ÖÅäÁ¿ + + return OK; // ³õʼ»¯³É¹¦ +} + +/* + * ¼ÆÊý + * + * ·µ»ØË³Ðò±í°üº¬µÄÓÐÐ§ÔªËØµÄÊýÁ¿¡£ + */ +int ListLength(SqList L) { + return L.length; +} + +/* + * ȡֵ + * + * »ñȡ˳Ðò±íÖеÚi¸öÔªËØ£¬½«Æä´æ´¢µ½eÖС£ + * Èç¹û¿ÉÒÔÕÒµ½£¬·µ»ØOK£¬·ñÔò£¬·µ»ØERROR¡£ + * + *¡¾±¸×¢¡¿ + * ½Ì²ÄÖÐiµÄº¬ÒåÊÇÔªËØÎ»Ö㬴Ó1¿ªÊ¼¼ÆÊý£¬µ«Õâ²»·ûºÏ±àÂëµÄͨÓÃÔ¼¶¨¡£ + * ͨ³££¬iµÄº¬ÒåÓ¦¸ÃÖ¸Ë÷Òý£¬¼´´Ó0¿ªÊ¼¼ÆÊý¡£ + */ +Status GetElem(SqList L, int i, ElemType* e) { + // ÒòΪiµÄº¬ÒåÊÇλÖã¬ËùÒÔÆäºÏ·¨·¶Î§ÊÇ£º[1, length] + if(i < 1 || i > L.length) { + return ERROR; //iÖµ²»ºÏ·¨ + } + + *e = L.elem[i - 1]; + + return OK; +} + +/* + * ¨€¨€¨€¨€¨€¨€¨€¨€ Ëã·¨2.4 ¨€¨€¨€¨€¨€¨€¨€¨€ + * + * ²åÈë + * + * Ïò˳Ðò±íµÚi¸öλÖÃÉϲåÈëe£¬²åÈë³É¹¦Ôò·µ»ØOK£¬·ñÔò·µ»ØERROR¡£ + * + *¡¾±¸×¢¡¿ + * ½Ì²ÄÖÐiµÄº¬ÒåÊÇÔªËØÎ»Ö㬴Ó1¿ªÊ¼¼ÆÊý + */ +Status ListInsert(SqList* L, int i, ElemType e) { + ElemType* newbase; + ElemType* p, * q; + + // È·±£Ë³Ðò±í½á¹¹´æÔÚ + if(L == NULL || (*L).elem == NULL) { + return ERROR; + } + + // iÖµÔ½½ç + if(i < 1 || i > (*L).length + 1) { + return ERROR; + } + + // Èô´æ´¢¿Õ¼äÒÑÂú£¬ÔòÔö¼Óпռä + if((*L).length >= (*L).listsize) { + // »ùÓÚÏÖÓпռäÀ©ÈÝ + newbase = (ElemType*) realloc((*L).elem, ((*L).listsize + LISTINCREMENT) * sizeof(ElemType)); + if(newbase == NULL) { + // ´æ´¢ÄÚ´æÊ§°Ü + exit(OVERFLOW); + } + + // лùÖ· + (*L).elem = newbase; + // ´æµÄ´æ´¢¿Õ¼ä + (*L).listsize += LISTINCREMENT; + } + + // qΪ²åÈëλÖà + q = &(*L).elem[i - 1]; + + // 1.ÓÒÒÆÔªËØ£¬ÌÚ³öλÖà + for(p = &(*L).elem[(*L).length - 1]; p >= q; --p) { + *(p + 1) = *p; + } + + // 2.²åÈëe + *q = e; + + // 3.±í³¤Ôö1 + (*L).length++; + + return OK; +} diff --git a/VisualC++/ExerciseBook/07.40/SqList.h b/VisualC++/ExerciseBook/07.40/SqList.h new file mode 100644 index 0000000..8788fdb --- /dev/null +++ b/VisualC++/ExerciseBook/07.40/SqList.h @@ -0,0 +1,74 @@ +/*============================= + * ÏßÐÔ±íµÄ˳Ðò´æ´¢½á¹¹£¨Ë³Ðò±í£© + * + * °üº¬Ëã·¨: 2.3¡¢2.4¡¢2.5¡¢2.6 + =============================*/ + +#ifndef SQLIST_H +#define SQLIST_H + +#include +#include // Ìṩmalloc¡¢realloc¡¢free¡¢exitÔ­ÐÍ +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// +#include "ALGraph.h" //**¡ø07 ͼ**// + +/* ºê¶¨Òå */ +#define LIST_INIT_SIZE 100 // ˳Ðò±í´æ´¢¿Õ¼äµÄ³õʼ·ÖÅäÁ¿ +#define LISTINCREMENT 10 // ˳Ðò±í´æ´¢¿Õ¼äµÄ·ÖÅäÔöÁ¿ + +/* ˳Ðò±íÔªËØÀàÐͶ¨Òå */ +typedef Vertex ElemType; + +/* + * ˳Ðò±í½á¹¹ + * + * ×¢£ºelemÔÚʹÓÃǰÐèÒªÏÈΪÆä·ÖÅäÄڴ棬ÇÒÔªËØ´Óelem[0]´¦¿ªÊ¼´æ´¢ + */ +typedef struct { + ElemType* elem; // ˳Ðò±í´æ´¢¿Õ¼äµÄ»ùÖ·£¨Ö¸Ïò˳Ðò±íËùÕ¼ÄÚ´æµÄÆðʼλÖã© + int length; // µ±Ç°Ë³Ðò±í³¤¶È£¨°üº¬¶àÉÙÔªËØ£© + int listsize; // µ±Ç°·ÖÅäµÄ´æ´¢ÈÝÁ¿£¨¿ÉÒÔ´æ´¢¶àÉÙÔªËØ£© +} SqList; + + +/* + * ¨€¨€¨€¨€¨€¨€¨€¨€ Ëã·¨2.3 ¨€¨€¨€¨€¨€¨€¨€¨€ + * + * ³õʼ»¯ + * + * ³õʼ»¯³É¹¦Ôò·µ»ØOK£¬·ñÔò·µ»ØERROR¡£ + */ +Status InitList(SqList* L); + +/* + * ¼ÆÊý + * + * ·µ»ØË³Ðò±í°üº¬µÄÓÐÐ§ÔªËØµÄÊýÁ¿¡£ + */ +int ListLength(SqList L); + +/* + * ȡֵ + * + * »ñȡ˳Ðò±íÖеÚi¸öÔªËØ£¬½«Æä´æ´¢µ½eÖС£ + * Èç¹û¿ÉÒÔÕÒµ½£¬·µ»ØOK£¬·ñÔò£¬·µ»ØERROR¡£ + * + *¡¾±¸×¢¡¿ + * ½Ì²ÄÖÐiµÄº¬ÒåÊÇÔªËØÎ»Ö㬴Ó1¿ªÊ¼¼ÆÊý£¬µ«Õâ²»·ûºÏ±àÂëµÄͨÓÃÔ¼¶¨¡£ + * ͨ³££¬iµÄº¬ÒåÓ¦¸ÃÖ¸Ë÷Òý£¬¼´´Ó0¿ªÊ¼¼ÆÊý¡£ + */ +Status GetElem(SqList L, int i, ElemType* e); + +/* + * ¨€¨€¨€¨€¨€¨€¨€¨€ Ëã·¨2.4 ¨€¨€¨€¨€¨€¨€¨€¨€ + * + * ²åÈë + * + * Ïò˳Ðò±íµÚi¸öλÖÃÉϲåÈëe£¬²åÈë³É¹¦Ôò·µ»ØOK£¬·ñÔò·µ»ØERROR¡£ + * + *¡¾±¸×¢¡¿ + * ½Ì²ÄÖÐiµÄº¬ÒåÊÇÔªËØÎ»Ö㬴Ó1¿ªÊ¼¼ÆÊý + */ +Status ListInsert(SqList* L, int i, ElemType e); + +#endif diff --git a/VisualC++/ExerciseBook/07.40/TestData_DG.txt b/VisualC++/ExerciseBook/07.40/TestData_DG.txt new file mode 100644 index 0000000..87b0ea5 --- /dev/null +++ b/VisualC++/ExerciseBook/07.40/TestData_DG.txt @@ -0,0 +1,8 @@ +ͼÀàÐÍ¡ú0£¨ÓÐÏòͼ£© +¶¥µãÊý¡ú12 +»¡Êý¡ú14 +»¡ÊÇ·ñ´øÓÐÆäËûÐÅÏ¢¡ú0 +¶¥µã¼¯¡ú¡¾A£¬B£¬C£¬D£¬E£¬F£¬G£¬H£¬I£¬J£¬K£¬L¡¿ +»¡µÄ¼¯ºÏ¡ú¡¾A£¬B¡¿¡¾A£¬D¡¿¡¾B£¬C¡¿¡¾B£¬D¡¿¡¾C£¬E¡¿¡¾C£¬F¡¿¡¾F£¬G¡¿¡¾D£¬G¡¿¡¾D£¬H¡¿¡¾E£¬I¡¿¡¾E£¬J¡¿¡¾F£¬J¡¿¡¾G£¬K¡¿¡¾G£¬L¡¿ + +Óë¶¥µã¶ÔÓ¦µÄ²Ù×÷ÊýÓë²Ù×÷·û¡ú¡¾0£¬*¡¿¡¾0£¬+¡¿¡¾0£¬*¡¿¡¾0£¬*¡¿¡¾0£¬+¡¿¡¾0£¬*¡¿¡¾0£¬+¡¿¡¾1£¬12¡¿¡¾1£¬3¡¿¡¾1£¬4¡¿¡¾1£¬5¡¿¡¾1£¬6¡¿ \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.41/07.41.c b/VisualC++/ExerciseBook/07.41/07.41.c new file mode 100644 index 0000000..8a776be --- /dev/null +++ b/VisualC++/ExerciseBook/07.41/07.41.c @@ -0,0 +1,160 @@ +#include +#include "SqStack.h" +#include "ALGraph.h" + +// »º´æÒÑÕÒµ½µÄȨֵºÍ×î´óµÄ·¾¶µÄȨֵºÍ +static int MAX = -1; + + +/* + * ÇóÈ¡ÓÐÏòÍøÖеĹؼü·¾¶(CPM) + * + * ´Ë´¦ÀûÓÃÉî¶ÈÓÅÏȱéÀúµÄ˼ÏëÀ´ÇóÈ¡¹Ø¼ü·¾¶£¬Æä»ù±¾Ô­ÀíÊÇ£º¹Ø¼ü·¾¶ = ȨֵºÍ×î´óµÄ·¾¶ + * + * ×¢£º½Ì²ÄÖÐÓ¦¸ÃÊDZÊÎ󣬲»ÊÇÇóÓÐÏòͼµÄ¹Ø¼ü·¾¶£¬¶øÊÇÇóÓÐÏòÍøµÄ×·¾¶ + */ +void Algo_7_41(ALGraph G); + +/* + * ²éÕҹؼü·¾¶ÉϵÄÔ´µã + * + * ´Ë´¦Ê¹ÓÃÁíÍâÒ»ÖÖ·½Ê½ÇóÔ´µã£¬¶ø²»ÊÇÏñ֮ǰһÑùͨ¹ýÈë¶ÈÐÅÏ¢ÇóÔ´µã£¬ + * ²»¹ýÕâÁ½ÖÖ·½·¨ÊÇÊâ;ͬ¹éµÄ¡£ + */ +static int FindBegin_7_41(ALGraph G); + +/* + * ͨ¹ýÉî¶ÈÓÅÏȱéÀú²éÕÒͼÖдӶ¥µãv³ö·¢µÄȨֵ×µÄ·¾¶(¹Ø¼ü·¾¶)¡£ + * + * sumºÍSÓÃÀ´»º´æÂ·¾¶È¨ÖµºÍÓëÒѾ­ÕÒµ½µÄ·¾¶£¬ + * pathÓÃÀ´¼Ç¼µ±Ç°ÕÒµ½µÄȨֵºÍ×î´óµÄ·¾¶£¬path[0]ÉÏ´æ´¢¶¥µãÊýÁ¿¡£ + */ +static void FindPath_7_41(ALGraph G, int v, int sum, SqStack* S, int path[MAX_VERTEX_NUM + 1]); + + +int main(int argc, char* argv[]) { + ALGraph G; + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ´´½¨²¢´òÓ¡ÓÐÏòÍø... \n"); + { + char* path[4]; + + path[0] = ""; + path[1] = "TestData_DN.txt"; + path[2] = ""; + path[3] = ""; + + CreateGraph(&G, path); + PrintGraph(G); + } + PressEnterToContinue(debug); + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ÇóÈ¡ÓÐÏòÍøµÄ¹Ø¼ü·¾¶... \n"); + { + Algo_7_41(G); + } + PressEnterToContinue(debug); + + return 0; +} + + +/* + * ÇóÈ¡ÓÐÏòÍøÖеĹؼü·¾¶(CPM) + * + * ´Ë´¦ÀûÓÃÉî¶ÈÓÅÏȱéÀúµÄ˼ÏëÀ´ÇóÈ¡¹Ø¼ü·¾¶£¬Æä»ù±¾Ô­ÀíÊÇ£º¹Ø¼ü·¾¶ = ȨֵºÍ×î´óµÄ·¾¶ + * + * ×¢£º½Ì²ÄÖÐÓ¦¸ÃÊDZÊÎ󣬲»ÊÇÇóÓÐÏòͼµÄ¹Ø¼ü·¾¶£¬¶øÊÇÇóÓÐÏòÍøµÄ×·¾¶ + */ +void Algo_7_41(ALGraph G) { + int i; + int begin; // ¹Ø¼ü·¾¶ÉϵÄÔ´µã + int path[MAX_VERTEX_NUM + 1] = {-1}; // ´æ´¢È¨ÖµºÍ×î´óµÄ·¾¶£¬0ºÃµ¥Ôª´æ´¢È¨ÖµºÍ + SqStack S; + + // ²éÕҹؼü·¾¶ÉϵÄÔ´µã + begin = FindBegin_7_41(G); + + InitStack(&S); + + FindPath_7_41(G, begin, 0, &S, path); + + printf("ÒÑÕÒµ½µÄȨֵºÍ×î´óµÄ·¾¶(¹Ø¼ü·¾¶)Ϊ£º"); + for(i = 1; i <= path[0]; i++) { + printf("%c ", G.vertices[path[i]].data); + } + printf("\n"); +} + +/* + * ²éÕҹؼü·¾¶ÉϵÄÔ´µã + * + * ´Ë´¦Ê¹ÓÃÁíÍâÒ»ÖÖ·½Ê½ÇóÔ´µã£¬¶ø²»ÊÇÏñ֮ǰһÑùͨ¹ýÈë¶ÈÐÅÏ¢ÇóÔ´µã£¬ + * ²»¹ýÕâÁ½ÖÖ·½·¨ÊÇÊâ;ͬ¹éµÄ¡£ + */ +static int FindBegin_7_41(ALGraph G) { + int k; + ArcNode* p; + Boolean isAdj[MAX_VERTEX_NUM] = {FALSE}; // ¼Ç¼ÄÄЩ¶¥µã×öÁËÁÚ½Óµã + + // ÕÒµ½ËùÓÐÁÚ½Óµã + for(k = 0; k < G.vexnum; k++) { + for(p = G.vertices[k].firstarc; p != NULL; p = p->nextarc) { + isAdj[p->adjvex] = TRUE; + } + } + + // ¹Ø¼ü·¾¶ÉϵÄÔ´µãûÓÐÈ뻡£¬ËùÒÔÒ²²»»á³ÉΪ±ðµÄ¶¥µãµÄÁÚ½Óµã + for(k = 0; k < G.vexnum; k++) { + if(isAdj[k] == FALSE) { + return k; + } + } + + return -1; +} + +/* + * ͨ¹ýÉî¶ÈÓÅÏȱéÀú²éÕÒͼÖдӶ¥µãv³ö·¢µÄȨֵ×µÄ·¾¶(¹Ø¼ü·¾¶)¡£ + * + * sumºÍSÓÃÀ´»º´æÂ·¾¶È¨ÖµºÍÓëÒѾ­ÕÒµ½µÄ·¾¶£¬ + * pathÓÃÀ´¼Ç¼µ±Ç°ÕÒµ½µÄȨֵºÍ×î´óµÄ·¾¶£¬path[0]ÉÏ´æ´¢¶¥µãÊýÁ¿¡£ + */ +static void FindPath_7_41(ALGraph G, int v, int sum, SqStack* S, int path[MAX_VERTEX_NUM + 1]) { + int i; + ArcNode* p; + SElemType e; + + // ½«Óöµ½µÄ¶¥µãÔݴ浽·¾¶Õ» + Push(S, v); + + // Éî¶ÈÓÅÏȱéÀú + for(p = G.vertices[v].firstarc; p != NULL; p = p->nextarc) { + sum += p->info->weight; + FindPath_7_41(G, p->adjvex, sum, S, path); + sum -= p->info->weight; + } + + /* + * ÖÁ´Ë£¬´Ë·¾¶ÒѱéÀúµ½Á˾¡Í·£¬ + * Èç¹û¸Ã·¾¶µÄȨֵºÍ±È֮ǰÕÒµ½µÄ·¾¶È¨ÖµºÍ¸ü´ó£¬ÔòÐèÒª°Ñ¸Ã·¾¶ÍêÕûµØ±£´æµ½pathÖУ¬ + * ±£´æÍê³Éºó£¬½«µ±Ç°¶¥µãvÍËÕ» + */ + + // Èç¹û¸Ã¶¥µãÊÇÖÕµã(±íÏÖΪûÓÐÁÚ½Óµã) + if(G.vertices[v].firstarc == NULL) { + // ·¢ÏÖÁËȨֵºÍ¸ü´óµÄ·¾¶ + if(sum > MAX) { + MAX = sum; + + path[0] = StackLength(*S); + + // ½«Õ»Öб£´æµÄ·¾¶¸´ÖƵ½pathÖÐ + for(i = 0; i < StackLength(*S); i++) { + path[i + 1] = S->base[i]; + } + } + } + + Pop(S, &e); +} diff --git a/VisualC++/ExerciseBook/07.41/07.41.png b/VisualC++/ExerciseBook/07.41/07.41.png new file mode 100644 index 0000000000000000000000000000000000000000..3ed9f7963757766a92efdbd61a2ad0480732600d GIT binary patch literal 36952 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 + + + + Debug + Win32 + + + Release + Win32 + + + + {CCF3A00A-FFE1-4941-8A57-5F71EDDFC3D9} + My0741 + + + + Application + true + MultiByte + + + Application + false + true + MultiByte + + + + + + + + + + + + + $(SolutionDir)\..\Status;$(IncludePath) + + + + Level3 + Disabled + + + true + $(SolutionDir)\..\Status\Status.lib;%(AdditionalDependencies) + Console + + + + + Level3 + MaxSpeed + true + true + + + true + true + true + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.41/07.41.vcxproj.filters b/VisualC++/ExerciseBook/07.41/07.41.vcxproj.filters new file mode 100644 index 0000000..9a3abaa --- /dev/null +++ b/VisualC++/ExerciseBook/07.41/07.41.vcxproj.filters @@ -0,0 +1,41 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + æºæ–‡ä»¶ + + + æºæ–‡ä»¶ + + + æºæ–‡ä»¶ + + + + + 头文件 + + + 头文件 + + + + + èµ„æºæ–‡ä»¶ + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.41/07.41.vcxproj.user b/VisualC++/ExerciseBook/07.41/07.41.vcxproj.user new file mode 100644 index 0000000..ace9a86 --- /dev/null +++ b/VisualC++/ExerciseBook/07.41/07.41.vcxproj.user @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.41/ALGraph.c b/VisualC++/ExerciseBook/07.41/ALGraph.c new file mode 100644 index 0000000..fc32f22 --- /dev/null +++ b/VisualC++/ExerciseBook/07.41/ALGraph.c @@ -0,0 +1,326 @@ +/*================== + * ͼµÄÁÚ½Ó±í´æ´¢±íʾ + ===================*/ + +#include "ALGraph.h" + +// ¼ÈëÊý¾ÝµÄÔ´Îļþ£»fpΪnullʱ£¬ËµÃ÷ÐèÒª´Ó¿ØÖÆÌ¨Â¼Èë +static FILE* fp = NULL; + +/* + * IncInfoָʾ¸Ãͼ/ÍøµÄ±ß/»¡ÉÏÊÇ·ñ´æÔÚ¸½¼ÓÐÅÏ¢¡£ + * Èç¹ûÆäÖµ²»Îª0£¬Ôò±íʾÎÞ¸½¼ÓÐÅÏ¢£¬·ñÔò£¬±íʾ´æÔÚ¸½¼ÓÐÅÏ¢¡£ + */ +Boolean IncInfo = FALSE; + +// ·ÃÎʱêÖ¾Êý×飬¼Ç¼·ÃÎʹýµÄ¶¥µã +static Boolean visited[MAX_VERTEX_NUM]; + +// º¯Êý±äÁ¿ +static Status (* VisitFunc)(VertexType e); + + +/* + * ´´½¨ + * + *¡¾±¸×¢¡¿ + * + * ½Ì²ÄÖÐĬÈÏ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý¡£ + * ÕâÀïΪÁË·½±ã²âÊÔ£¬±ÜÃâÿ´ÎÔËÐж¼ÊÖ¶¯ÊäÈëÊý¾Ý£¬ + * Òò¶øÔÊÐíÑ¡Ôñ´ÓÔ¤ÉèµÄÎļþpathÖжÁÈ¡²âÊÔÊý¾Ý¡£ + * + * Èç¹ûÐèÒª´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý£¬ÔòpathΪNULL£¬»òpath[kind]Ϊ""¡£ + * Èç¹ûÐèÒª´ÓÎļþÖжÁÈ¡Êý¾Ý£¬ÔòÐèÒªÔÚpathÖÐÌîдÎļþÃûÐÅÏ¢¡£ + */ +Status CreateGraph(ALGraph* G, char* path[]) { + int readFromConsole; // ÊÇ·ñ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý + int kind; + Status flag; + + // ¡ï¡ï¡ï´Ë´¦¹Ì¶¨ÎªÓÐÏòÍø + kind = 1; + + // Èç¹ûûÓÐÎļþ·¾¶ÐÅÏ¢£¬Ôò´Ó¿ØÖÆÌ¨¶ÁÈ¡ÊäÈë + readFromConsole = (path == NULL) || strcmp(path[kind], "") == 0; + + // ÐèÒª´ÓÎļþ¶ÁÈ¡ + if(readFromConsole) { + (*G).kind = kind; // ¼Ç¼ͼ/ÍøµÄÀàÐÍ + } else { + // ´ò¿ªÎļþ£¬×¼±¸¶ÁÈ¡²âÊÔÊý¾Ý + fp = fopen(path[kind], "r"); + if(fp == NULL) { + return ERROR; + } + + // ¼ÈëͼµÄÀàÐÍ + ReadData(fp, "%d", &((*G).kind)); + } + + // Ëæ»ú´´½¨ÓÐÏòͼ/Íø»òÎÞÏòͼ/ÍøµÄÒ»ÖÖ + switch((*G).kind) { + case DN: + flag = CreateDN(G); + break; + default: + flag = ERROR; + break; + } + + if(fp != NULL) { + fclose(fp); + fp = NULL; + } + + return flag; +} + +/* + * ¹¹ÔìÓÐÏòÍø + */ +static Status CreateDN(ALGraph* G) { + int i, k; + int vexnum, arcnum; + VertexType v1, v2; + InfoType* info = NULL; + + (*G).vexnum = (*G).arcnum = 0; + + if(fp == NULL) { + printf("ÇëÊäÈëÓÐÏòÍøµÄ¶¥µãÊý£º"); + scanf("%d", &vexnum); + printf("ÇëÊäÈëÓÐÏòÍøµÄ»¡Êý£º"); + scanf("%d", &arcnum); + printf("¸ÃÓÐÏòÍøµÄ»¡ÉϱØÐë°üº¬ÆäËû¸½¼ÓÐÅÏ¢£¬ÒòΪ´Ë´¦µÄȨֵÐèÒª´æ´¢µ½¸½¼ÓÐÅÏ¢ÖÐ...\n"); + IncInfo = 1; + + // ¼Èë¶¥µã¼¯ + printf("Çë¼Èë %d ¸ö¶¥µã£¬²»Í¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º", vexnum); + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(stdin); + scanf("%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } else { + ReadData(fp, "%d", &vexnum); // ¼Èë¶¥µãÊý + ReadData(fp, "%d", &arcnum); // ¼È뻡Êý + ReadData(fp, "%d", &IncInfo);// Åжϻ¡ÉÏÊÇ·ñ°üº¬¸½¼ÓÐÅÏ¢(´Ë´¦Ó¦µ±°üº¬) + IncInfo = 1; // Ç¿ÖÆ½«È¨ÖµÂ¼Èëµ½¸½¼ÓÐÅÏ¢ÖÐ + + // ¼Èë¶¥µã¼¯ + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(fp); + ReadData(fp, "%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } + + // ½öÔÚ¿ØÖÆÌ¨Â¼ÈëÐÅϢʱÊä³ö´ËÌáʾ + if(fp == NULL && arcnum != 0) { + printf("ÇëΪÓÐÏòÍøÒÀ´Î¼Èë %d Ìõ»¡(´øÈ¨Öµ)µÄÐÅÏ¢£¬¶¥µã¼°È¨ÖµÖ®¼äÓÿոñ¸ô¿ª£º\n", arcnum); + } + + // ¼È뻡µÄÐÅÏ¢ + for(k = 0; k < arcnum; k++) { + if(fp == NULL) { + printf("µÚ %2d Ìõ»¡¼°ÆäȨֵ£º", k + 1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v2); + } else { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + skipBlank(fp); + ReadData(fp, "%c%c", &v1, &v2); + } + + // Èç¹ûÐèҪ¼È뻡µÄÆäËû¸½¼ÓÐÅÏ¢ + if(IncInfo) { + // ×îºó¼È븽¼ÓÐÅÏ¢(´Ë´¦ÐèҪ¼ÈëÍøµÄȨֵ) + Input(*G, &info); + } + + // ²åÈ뻡 + InsertArc(G, v1, v2, info); + } + + // ´ÓÎļþÖжÁÈ¡Êý¾Ýʱ£¬×îºóÆäʵӦµ±ÅжÏÒ»ÏÂÊÇ·ñ¶Áµ½ÁË×ã¹»µÄÐÅÏ¢ + return OK; +} + +/* + * ¼Èë±ß/»¡µÄÏà¹Ø¸½¼ÓÐÅÏ¢ + */ +static void Input(ALGraph G, InfoType** info) { + int weight; + + // ÔÚ"Íø"µÄÇéÐÎÏÂÐèҪ¼ÈëȨֵÐÅÏ¢ + if(G.kind == DN || G.kind == UDN) { + *info = (InfoType*) malloc(sizeof(InfoType)); + + if(fp == NULL) { + scanf("%d", &weight); + } else { + ReadData(fp, "%d", &weight); + } + + (*info)->weight = weight; + } +} + +/* + * ²éÕÒ + * + * ·µ»Ø¶¥µãuÔÚͼ/ÍøÖеÄλÖà + */ +int LocateVex(ALGraph G, VertexType u) { + int i; + + for(i = 0; i < G.vexnum; i++) { + if(G.vertices[i].data == u) { + return i; + } + } + + return -1; +} + +/* + * ¹¹ÔìÒ»¸ö±ß/»¡½áµã(½öÏÞÄÚ²¿Ê¹ÓÃ) + */ +static ArcNode* newArcNodePtr(int adjvex, ArcNode* nextarc, InfoType* info) { + ArcNode* p = (ArcNode*) malloc(sizeof(ArcNode)); + if(!p) { + exit(OVERFLOW); + } + + p->adjvex = adjvex; + + p->nextarc = nextarc; + + p->info = info; + + return p; +} + +/* + * ²åÈë±ß/»¡ + * + * Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬Ôò²åÈëÒ»Ìõ»¡ÐèÒªÔö¼ÓÁ½¸ö¶¥µã¹ØÏµ£¬µ«»¡µÄÊýÁ¿Ö»ÔöÒ»¡£ + * ¶ÔÓÚͼ/ÍøÀ´Ëµ£¬¿ÉÒÔÔڿɱä²ÎÊýÖÐÁгö±ß/»¡µÄ¸½¼ÓÐÅÏ¢¡£ + * + * ×¢£º´Ë´¦½ÓÊյIJÎÊýÓëMGraphÓÐЩ²»Ò»Ñù£ºÍøµÄ¸½¼ÓÐÅÏ¢Öаüº¬Á˸÷Ìõ±ß/»¡µÄȨֵ¡£ + */ +Status InsertArc(ALGraph* G, VertexType v, VertexType w, ...) { + int tail, head, k, count; + ArcNode* r; + ArcNode* pre; + Boolean overlay = FALSE; // ÊÇ·ñΪ¸²¸ÇÌí¼Ó + InfoType* info = NULL; // ±ß/»¡µÄ¸½¼ÓÐÅÏ¢ + va_list ap; + + tail = LocateVex(*G, v); // »ñÈ¡¶¥µãvÔÚ¶¥µã¼¯ÖеÄλÖà + if(tail == -1) { + return ERROR; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + head = LocateVex(*G, w); // »ñÈ¡¶¥µãwÔÚ¶¥µã¼¯ÖеÄλÖà + if(head == -1) { + return ERROR; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + // ¾Ü¾ø»· + if(tail == head) { + return ERROR; + } + + // Èç¹û±ß/»¡ÉÏ´æÔÚ¸½¼ÓÐÅÏ¢ + if(IncInfo) { + va_start(ap, w); // ÔÚwºó²éѯÊ׸ö¿É±ä²ÎÊý + info = va_arg(ap, InfoType*); // »ñÈ¡¸½¼ÓÐÅÏ¢ + va_end(ap); + } + + /* ½ÓÏÂÀ´£¬ÐèÒª²éÕÒºÏÊʵIJåÈëλÖà */ + + for(count = 0; count < 2; count++) { + pre = NULL; + // Ö¸ÏòÒÔtailΪβµÄÊ×Ìõ±ß/»¡ + r = G->vertices[tail].firstarc; + while(r != NULL && r->adjvex < head) { + pre = r; + r = r->nextarc; + } + + // Óöµ½ÁËÏàͬλÖõĽáµã + if(r != NULL && r->adjvex == head) { + r->info = info; // ¸´Óøýáµã + overlay = TRUE; // ·¢ÉúÁ˸²¸Ç + } else { + if(pre == NULL) { + G->vertices[tail].firstarc = newArcNodePtr(head, r, info); + } else { + pre->nextarc = newArcNodePtr(head, r, info); + } + } + + // Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬ÐèÒª¿¼ÂǶԳÆÐÔ + if((G->kind == UDG || G->kind == UDN) && tail != head) { + // µßµ¹iºÍj + k = tail; + tail = head; + head = k; + } else { + break; // Èç¹ûÊÇÓÐÏòµÄ£¬¿ÉÒÔ½áÊøÁË + } + } + + // ÔڷǸ²¸ÇµÄÇéÐÎÏ£¬²Å¿¼ÂǸüбß/»¡µÄÊýÁ¿ + if(!overlay) { + (*G).arcnum++; // ²»ÂÛÓÐÏòÎÞÏò£¬±ß/»¡ÊýÖ»ÔöÒ» + } + + return OK; +} + +/* + * ÒÔͼÐλ¯ÐÎʽÊä³öµ±Ç°½á¹¹ + */ +void PrintGraph(ALGraph G) { + int i; + ArcNode* p; + + if(G.vexnum == 0) { + printf("¿Õͼ£¬ÎÞÐè´òÓ¡£¡\n"); + return; + } + + printf("µ±Ç°Í¼/Íø°üº¬ %2d ¸ö¶¥µã£¬ %2d Ìõ±ß/»¡...\n", G.vexnum, G.arcnum); + + for(i = 0; i < G.vexnum; i++) { + printf("%c ===> ", G.vertices[i].data); + + p = G.vertices[i].firstarc; + while(p != NULL) { + if(IncInfo == 0) { + printf("%c ", G.vertices[p->adjvex].data); + + // ¶ÔÓÚÍø£¬»á´ÓÆä¸½¼ÓÐÅÏ¢ÖлñÈ¡µ½È¨Öµ + } else { + printf("%c[%2d] ", G.vertices[p->adjvex].data, p->info->weight); + } + + p = p->nextarc; + + if(p != NULL) { + printf("- "); + } + } + + printf("\n"); + } +} diff --git a/VisualC++/ExerciseBook/07.41/ALGraph.h b/VisualC++/ExerciseBook/07.41/ALGraph.h new file mode 100644 index 0000000..db081e5 --- /dev/null +++ b/VisualC++/ExerciseBook/07.41/ALGraph.h @@ -0,0 +1,128 @@ +/*================== + * ͼµÄÁÚ½Ó±í´æ´¢±íʾ + ===================*/ + +#ifndef ALGRAPH_H +#define ALGRAPH_H + +#include +#include // Ìṩmemset¡¢strcmp Ô­ÐÍ +#include // Ìṩºêva_list¡¢va_start¡¢va_arg¡¢va_end +#include // Ìṩmalloc¡¢realloc¡¢free¡¢exitÔ­ÐÍ +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// + +/* + * ×¢£º + * + * ͨ³£À´½²£¬ÎÞȨͼ±»¼ò³ÆÎª¡¾Í¼¡¿£¬ÓÐȨͼ±»¼ò³ÆÎª¡¾Íø¡¿¡£ + * ÎÞÏòͼ/ÍøÖеĶ¥µã¹ØÏµ±»³ÆÎª¡¾±ß¡¿£¬ÓÐÏòͼ/ÍøÖеĶ¥µã¹ØÏµ±»³ÆÎª¡¾»¡¡¿£¬²¢Çø·Ö»¡Í·Ó뻡β¡£ + * ʵ¼Ê±íÊöÖУ¬Î´±Ø»áÑϸñ×ñÊØÒÔÉÏÃüÃû¡£ + * + * µ±Ç°½á¹¹Êʺϴ洢±ß/»¡±È½ÏÏ¡ÊèµÄͼ/Íø¡£ + * + * ¡ï ²åÈë±ß/»¡µÄÐÅϢʱ£¬ÕâÀïµÄʵÏÖÊǰ´"ÉýÐò"²åÈëµÄ£¬ÕâʹµÃ²åÈëµÄ»¡Êǰ´"ÉýÐò"ÅÅÁеġ£ + */ + + +/* ºê¶¨Òå */ +#define MAX_VERTEX_NUM 26 // ×î´ó¶¥µã¸öÊý + + +// ͼµÄÀàÐÍ +typedef enum { + DG, // 0-ÓÐÏòͼ + DN, // 1-ÓÐÏòÍø(´øÈ¨Öµ) + UDG, // 2-ÎÞÏòͼ + UDN // 3-ÎÞÏòÍø(´øÈ¨Öµ) +} GraphKind; + +// ¶¥µãÀàÐÍ +typedef char VertexType; + +// ±ß/»¡µÄÏà¹Ø¸½¼ÓÐÅÏ¢ +typedef struct { + /* + * ×¢£º + * ½Ì²ÄÖиø³öµÄ½á¹¹Ö»¿¼ÂÇÁËÎÞȨͼ£¬¶øÃ»¿¼ÂÇÓÐȨͼ(Íø)¡£ + * ÕâÀïΪÁ˰ѡ°Íø¡±µÄÇéÐÎÒ²¿¼ÂǽøÈ¥£¬ÌØÔÚ¸½¼ÓÐÅÏ¢ÖÐÔö¼ÓÁË"È¨ÖØ"ÊôÐÔ¡£ + */ + int weight; +} InfoType; + +/* ±ß/»¡½áµã */ +typedef struct ArcNode { + int adjvex; // ¸Ã»¡ËùÖ¸ÏòµÄ¶¥µãµÄλÖà + struct ArcNode* nextarc; // Ö¸ÏòÏÂÒ»Ìõ»¡µÄÖ¸Õë + InfoType* info; // »¡µÄ¸½¼ÓÐÅÏ¢£¬Í¨³£ºöÂÔ +} ArcNode; + +// ÿ¸öÁ´±íµÄÍ·½áµã +typedef struct VNode { + VertexType data; // ¶¥µãÐÅÏ¢ + ArcNode* firstarc; // Ö¸ÏòµÚÒ»ÌõÒÀ¸½¸Ã¶¥µãµÄ»¡µÄÖ¸Õë +} VNode; + +/* ͼµÄÁÚ½Ó±í´æ´¢±íʾÀàÐͶ¨Òå */ +typedef struct { + VNode vertices[MAX_VERTEX_NUM]; // ÁÚ½Ó±í + int vexnum, arcnum; // ͼ/ÍøµÄ¶¥µãÊýºÍ»¡Êý + GraphKind kind; // ͼµÄÀàÐͱêÖ¾ +} ALGraph; + + +// ±ß/»¡ÉÏÊÇ·ñ´æÔÚ¸½¼ÓÐÅÏ¢ +extern Boolean IncInfo; + + +/* + * ´´½¨ + * + *¡¾±¸×¢¡¿ + * + * ½Ì²ÄÖÐĬÈÏ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý¡£ + * ÕâÀïΪÁË·½±ã²âÊÔ£¬±ÜÃâÿ´ÎÔËÐж¼ÊÖ¶¯ÊäÈëÊý¾Ý£¬ + * Òò¶øÔÊÐíÑ¡Ôñ´ÓÔ¤ÉèµÄÎļþpathÖжÁÈ¡²âÊÔÊý¾Ý¡£ + * + * Èç¹ûÐèÒª´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý£¬ÔòpathΪNULL£¬»òpath[kind]Ϊ""¡£ + * Èç¹ûÐèÒª´ÓÎļþÖжÁÈ¡Êý¾Ý£¬ÔòÐèÒªÔÚpathÖÐÌîдÎļþÃûÐÅÏ¢¡£ + */ +Status CreateGraph(ALGraph* G, char* path[]); + +/* + * ¹¹ÔìÓÐÏòÍø + */ +static Status CreateDN(ALGraph* G); + +/* + * ¼Èë±ß/»¡µÄÏà¹Ø¸½¼ÓÐÅÏ¢ + */ +static void Input(ALGraph G, InfoType** info); + +/* + * ²éÕÒ + * + * ·µ»Ø¶¥µãuÔÚͼ/ÍøÖеÄλÖà + */ +int LocateVex(ALGraph G, VertexType u); + +/* + * ¹¹ÔìÒ»¸ö±ß/»¡½áµã(½öÏÞÄÚ²¿Ê¹ÓÃ) + */ +static ArcNode* newArcNodePtr(int adjvex, ArcNode* nextarc, InfoType* info); + +/* + * ²åÈë±ß/»¡ + * + * Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬Ôò²åÈëÒ»Ìõ»¡ÐèÒªÔö¼ÓÁ½¸ö¶¥µã¹ØÏµ£¬µ«»¡µÄÊýÁ¿Ö»ÔöÒ»¡£ + * ¶ÔÓÚͼ/ÍøÀ´Ëµ£¬¿ÉÒÔÔڿɱä²ÎÊýÖÐÁгö±ß/»¡µÄ¸½¼ÓÐÅÏ¢¡£ + * + * ×¢£º´Ë´¦½ÓÊյIJÎÊýÓëMGraphÓÐЩ²»Ò»Ñù£ºÍøµÄ¸½¼ÓÐÅÏ¢Öаüº¬Á˸÷Ìõ±ß/»¡µÄȨֵ¡£ + */ +Status InsertArc(ALGraph* G, VertexType v, VertexType w, ...); + +/* + * ÒÔͼÐλ¯ÐÎʽÊä³öµ±Ç°½á¹¹ + */ +void PrintGraph(ALGraph G); + +#endif diff --git a/VisualC++/ExerciseBook/07.41/SqStack.c b/VisualC++/ExerciseBook/07.41/SqStack.c new file mode 100644 index 0000000..db1b22c --- /dev/null +++ b/VisualC++/ExerciseBook/07.41/SqStack.c @@ -0,0 +1,103 @@ +/*========================= + * Õ»µÄ˳Ðò´æ´¢½á¹¹£¨Ë³ÐòÕ»£© + ==========================*/ + +#include "SqStack.h" //**¡ø03 Õ»ºÍ¶ÓÁÐ**// + +/* + * ³õʼ»¯ + * + * ¹¹ÔìÒ»¸ö¿ÕÕ»¡£³õʼ»¯³É¹¦Ôò·µ»ØOK£¬·ñÔò·µ»ØERROR¡£ + */ +Status InitStack(SqStack* S) { + if(S == NULL) { + return ERROR; + } + + (*S).base = (SElemType*) malloc(STACK_INIT_SIZE * sizeof(SElemType)); + if((*S).base == NULL) { + exit(OVERFLOW); + } + + (*S).top = (*S).base; + (*S).stacksize = STACK_INIT_SIZE; + + return OK; +} + +/* + * ÅÐ¿Õ + * + * ÅжÏ˳ÐòÕ»ÖÐÊÇ·ñ°üº¬ÓÐЧÊý¾Ý¡£ + * + * ·µ»ØÖµ£º + * TRUE : ˳ÐòջΪ¿Õ + * FALSE: ˳ÐòÕ»²»Îª¿Õ + */ +Status StackEmpty(SqStack S) { + if(S.top == S.base) { + return TRUE; + } else { + return FALSE; + } +} + +/* + * ¼ÆÊý + * + * ·µ»ØË³ÐòÕ»°üº¬µÄÓÐÐ§ÔªËØµÄÊýÁ¿¡£ + */ +int StackLength(SqStack S) { + if(S.base == NULL) { + return 0; + } + + return (int) (S.top - S.base); +} + +/* + * ÈëÕ» + * + * ½«ÔªËØeѹÈëµ½Õ»¶¥¡£ + */ +Status Push(SqStack* S, SElemType e) { + if(S == NULL || (*S).base == NULL) { + return ERROR; + } + + // Õ»Âúʱ£¬×·¼Ó´æ´¢¿Õ¼ä + if((*S).top - (*S).base >= (*S).stacksize) { + (*S).base = (SElemType*) realloc((*S).base, ((*S).stacksize + STACKINCREMENT) * sizeof(SElemType)); + if((*S).base == NULL) { + exit(OVERFLOW); // ´æ´¢·ÖÅäʧ°Ü + } + + (*S).top = (*S).base + (*S).stacksize; + (*S).stacksize += STACKINCREMENT; + } + + // ½øÕ»Ïȸ³Öµ£¬Õ»¶¥Ö¸ÕëÔÙ×ÔÔö + *(S->top++) = e; + + return OK; +} + +/* + * ³öÕ» + * + * ½«Õ»¶¥ÔªËص¯³ö£¬²¢ÓÃe½ÓÊÕ¡£ + */ +Status Pop(SqStack* S, SElemType* e) { + if(S == NULL || (*S).base == NULL) { + return ERROR; + } + + if((*S).top == (*S).base) { + return ERROR; + } + + // ³öÕ»Õ»¶¥Ö¸ÕëÏȵݼõ£¬ÔÙ¸³Öµ + *e = *(--(*S).top); + + return OK; +} diff --git a/VisualC++/ExerciseBook/07.41/SqStack.h b/VisualC++/ExerciseBook/07.41/SqStack.h new file mode 100644 index 0000000..0c87d76 --- /dev/null +++ b/VisualC++/ExerciseBook/07.41/SqStack.h @@ -0,0 +1,66 @@ +/*========================= + * Õ»µÄ˳Ðò´æ´¢½á¹¹£¨Ë³ÐòÕ»£© + ==========================*/ + +#ifndef SQSTACK_H +#define SQSTACK_H + +#include +#include // Ìṩmalloc¡¢realloc¡¢free¡¢exitÔ­ÐÍ +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// + +/* ºê¶¨Òå */ +#define STACK_INIT_SIZE 100 // ˳ÐòÕ»´æ´¢¿Õ¼äµÄ³õʼ·ÖÅäÁ¿ +#define STACKINCREMENT 10 // ˳ÐòÕ»´æ´¢¿Õ¼äµÄ·ÖÅäÔöÁ¿ + +/* ˳ÐòÕ»ÔªËØÀàÐͶ¨Òå */ +typedef int SElemType; + +// ˳ÐòÕ»ÔªËØ½á¹¹ +typedef struct { + SElemType* base; // Õ»µ×Ö¸Õë + SElemType* top; // Õ»¶¥Ö¸Õë + int stacksize; // µ±Ç°ÒÑ·ÖÅäµÄ´æ´¢¿Õ¼ä£¬ÒÔÔªËØÎªµ¥Î» +} SqStack; + + +/* + * ³õʼ»¯ + * + * ¹¹ÔìÒ»¸ö¿ÕÕ»¡£³õʼ»¯³É¹¦Ôò·µ»ØOK£¬·ñÔò·µ»ØERROR¡£ + */ +Status InitStack(SqStack* S); + +/* + * ÅÐ¿Õ + * + * ÅжÏ˳ÐòÕ»ÖÐÊÇ·ñ°üº¬ÓÐЧÊý¾Ý¡£ + * + * ·µ»ØÖµ£º + * TRUE : ˳ÐòջΪ¿Õ + * FALSE: ˳ÐòÕ»²»Îª¿Õ + */ +Status StackEmpty(SqStack S); + +/* + * ¼ÆÊý + * + * ·µ»ØË³ÐòÕ»°üº¬µÄÓÐÐ§ÔªËØµÄÊýÁ¿¡£ + */ +int StackLength(SqStack S); + +/* + * ÈëÕ» + * + * ½«ÔªËØeѹÈëµ½Õ»¶¥¡£ + */ +Status Push(SqStack* S, SElemType e); + +/* + * ³öÕ» + * + * ½«Õ»¶¥ÔªËص¯³ö£¬²¢ÓÃe½ÓÊÕ¡£ + */ +Status Pop(SqStack* S, SElemType* e); + +#endif diff --git a/VisualC++/ExerciseBook/07.41/TestData_DN.txt b/VisualC++/ExerciseBook/07.41/TestData_DN.txt new file mode 100644 index 0000000..189ba76 --- /dev/null +++ b/VisualC++/ExerciseBook/07.41/TestData_DN.txt @@ -0,0 +1,6 @@ +ͼÀàÐÍ¡ú1£¨ÓÐÏòÍø£© +¶¥µãÊý¡ú13 +»¡Êý¡ú24 +»¡ÊÇ·ñ´øÓÐÆäËûÐÅÏ¢¡ú1 +¶¥µã¼¯¡ú¡¾M£¬A£¬B£¬C£¬D£¬E£¬F£¬G£¬H£¬I£¬J£¬K£¬N¡¿ +»¡µÄ¼¯ºÏ¡ú¡¾M£¬A£¬1¡¿¡¾M£¬B£¬6¡¿¡¾M£¬D£¬3¡¿¡¾M£¬F£¬4¡¿¡¾M£¬G£¬3¡¿¡¾M£¬I£¬1¡¿¡¾A£¬C£¬6¡¿¡¾B£¬C£¬2¡¿¡¾D£¬C£¬7¡¿¡¾D£¬E£¬8¡¿¡¾D£¬J£¬6¡¿¡¾F£¬E£¬11¡¿¡¾F£¬H£¬5¡¿¡¾G£¬N£¬21¡¿¡¾G£¬H£¬10¡¿¡¾I£¬H£¬6¡¿¡¾H£¬J£¬4¡¿¡¾H£¬K£¬9¡¿¡¾K£¬J£¬9¡¿¡¾J£¬N£¬12¡¿¡¾J£¬E£¬3¡¿¡¾E£¬N£¬10¡¿¡¾H£¬C£¬4¡¿¡¾C£¬E£¬8¡¿ \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.42/07.42.c b/VisualC++/ExerciseBook/07.42/07.42.c new file mode 100644 index 0000000..bfbc6c4 --- /dev/null +++ b/VisualC++/ExerciseBook/07.42/07.42.c @@ -0,0 +1,54 @@ +#include +#include "ALGraph.h" +#include "ShortestPaths.h" + +/* + * ʹÓÃDijkstraËã·¨¼ÆËã´Óµ¥Ô´¶¥µã³ö·¢µÄ×î¶Ì·¾¶ + */ +void Algo_7_42(ALGraph G, int v0, PathMatrix_DIJ P, ShortPathTable_DIJ D); + + +int main(int argc, char* argv[]) { + ALGraph G; + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ ´´½¨²¢´òÓ¡ÎÞÏòͼ/Íø... \n"); + { + char* path[4]; + + path[0] = "TestData_DG.txt"; + path[1] = "TestData_DN.txt"; + path[2] = "TestData_UDG.txt"; + path[3] = "TestData_UDN.txt"; + + CreateGraph(&G, path); + PrintGraph(G); + printf("\n"); + } + + printf("¨€¨€¨€¨€¨€¨€¨€¨€ µÏ½ÜË¹ÌØÀ­Ëã·¨Çóµ¥Ô´×î¶Ì·¾¶... \n"); + { + VertexType v0 = 'A'; + PathMatrix_DIJ P; + ShortPathTable_DIJ D; + + printf("Êä³ö´Ó¶¥µã %c µ½ÆäÓà¶¥µãµÄ×î¶Ì·¾¶£º\n", v0); + Algo_7_42(G, LocateVex(G, v0), P, D); + printf("\n"); + } +} + + +/* + * ʹÓÃDijkstraËã·¨¼ÆËã´Óµ¥Ô´¶¥µã³ö·¢µÄ×î¶Ì·¾¶ + */ +void Algo_7_42(ALGraph G, int v0, PathMatrix_DIJ P, ShortPathTable_DIJ D) { + + // ¡ï¡ï±ØÐëÊ×Ïȵ÷Óô˺¯Êý¼ÆËã¸÷¶¥µãÖ®¼äµÄ¹ØÏµ + GetAdjs(G); + + // ×î¶Ì·¾¶Ëã·¨ + ShortestPath_DIJ(G, v0, P, D); + + // ´òÓ¡¼ÆËã³öµÄ½á¹û£¨´Ë²½Öè¿ÉÑ¡£© + PrintPath_DIJ(G, v0, P, D); +} diff --git a/VisualC++/ExerciseBook/07.42/07.42.png b/VisualC++/ExerciseBook/07.42/07.42.png new file mode 100644 index 0000000000000000000000000000000000000000..537bcefcbb165e4fd77199b0c048b35d0f38e339 GIT binary patch literal 55687 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 literal 0 HcmV?d00001 diff --git a/VisualC++/ExerciseBook/07.42/07.42.vcxproj b/VisualC++/ExerciseBook/07.42/07.42.vcxproj new file mode 100644 index 0000000..48e5209 --- /dev/null +++ b/VisualC++/ExerciseBook/07.42/07.42.vcxproj @@ -0,0 +1,84 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {80E94E2F-B06C-4B8B-9B6C-88F9FE66B09B} + My0742 + + + + Application + true + MultiByte + + + Application + false + true + MultiByte + + + + + + + + + + + + + $(SolutionDir)\..\Status;$(IncludePath) + + + + Level3 + Disabled + + + true + $(SolutionDir)\..\Status\Status.lib;%(AdditionalDependencies) + Console + + + + + Level3 + MaxSpeed + true + true + + + true + true + true + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.42/07.42.vcxproj.filters b/VisualC++/ExerciseBook/07.42/07.42.vcxproj.filters new file mode 100644 index 0000000..9e302b6 --- /dev/null +++ b/VisualC++/ExerciseBook/07.42/07.42.vcxproj.filters @@ -0,0 +1,50 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + æºæ–‡ä»¶ + + + æºæ–‡ä»¶ + + + æºæ–‡ä»¶ + + + + + 头文件 + + + 头文件 + + + + + èµ„æºæ–‡ä»¶ + + + èµ„æºæ–‡ä»¶ + + + èµ„æºæ–‡ä»¶ + + + èµ„æºæ–‡ä»¶ + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.42/07.42.vcxproj.user b/VisualC++/ExerciseBook/07.42/07.42.vcxproj.user new file mode 100644 index 0000000..ace9a86 --- /dev/null +++ b/VisualC++/ExerciseBook/07.42/07.42.vcxproj.user @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.42/ALGraph.c b/VisualC++/ExerciseBook/07.42/ALGraph.c new file mode 100644 index 0000000..87ddb63 --- /dev/null +++ b/VisualC++/ExerciseBook/07.42/ALGraph.c @@ -0,0 +1,583 @@ +/*================== + * ͼµÄÁÚ½Ó±í´æ´¢±íʾ + ===================*/ + +#include "ALGraph.h" + +// ¼ÈëÊý¾ÝµÄÔ´Îļþ£»fpΪnullʱ£¬ËµÃ÷ÐèÒª´Ó¿ØÖÆÌ¨Â¼Èë +static FILE* fp = NULL; + +/* + * IncInfoָʾ¸Ãͼ/ÍøµÄ±ß/»¡ÉÏÊÇ·ñ´æÔÚ¸½¼ÓÐÅÏ¢¡£ + * Èç¹ûÆäÖµ²»Îª0£¬Ôò±íʾÎÞ¸½¼ÓÐÅÏ¢£¬·ñÔò£¬±íʾ´æÔÚ¸½¼ÓÐÅÏ¢¡£ + */ +Boolean IncInfo = FALSE; + +// ·ÃÎʱêÖ¾Êý×飬¼Ç¼·ÃÎʹýµÄ¶¥µã +static Boolean visited[MAX_VERTEX_NUM]; + +// º¯Êý±äÁ¿ +static Status (* VisitFunc)(VertexType e); + + +/* + * ´´½¨ + * + *¡¾±¸×¢¡¿ + * + * ½Ì²ÄÖÐĬÈÏ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý¡£ + * ÕâÀïΪÁË·½±ã²âÊÔ£¬±ÜÃâÿ´ÎÔËÐж¼ÊÖ¶¯ÊäÈëÊý¾Ý£¬ + * Òò¶øÔÊÐíÑ¡Ôñ´ÓÔ¤ÉèµÄÎļþpathÖжÁÈ¡²âÊÔÊý¾Ý¡£ + * + * Èç¹ûÐèÒª´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý£¬ÔòpathΪNULL£¬»òpath[kind]Ϊ""¡£ + * Èç¹ûÐèÒª´ÓÎļþÖжÁÈ¡Êý¾Ý£¬ÔòÐèÒªÔÚpathÖÐÌîдÎļþÃûÐÅÏ¢¡£ + */ +Status CreateGraph(ALGraph* G, char* path[]) { + int readFromConsole; // ÊÇ·ñ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý + int kind; + Status flag; + + printf("ÇëÊäÈëͼµÄÀàÐÍ(0-ÓÐÏòͼ ©¦ 1-ÓÐÏòÍø ©¦ 2-ÎÞÏòͼ ©¦ 3-ÎÞÏòÍø)£º"); + scanf("%d", &kind); + + // ÀàÐͲ»ºÏ¹æ + if(kind < 0 || kind > 3) { + return ERROR; + } + + // Èç¹ûûÓÐÎļþ·¾¶ÐÅÏ¢£¬Ôò´Ó¿ØÖÆÌ¨¶ÁÈ¡ÊäÈë + readFromConsole = (path == NULL) || strcmp(path[kind], "") == 0; + + // ÐèÒª´ÓÎļþ¶ÁÈ¡ + if(readFromConsole) { + (*G).kind = kind; // ¼Ç¼ͼ/ÍøµÄÀàÐÍ + } else { + // ´ò¿ªÎļþ£¬×¼±¸¶ÁÈ¡²âÊÔÊý¾Ý + fp = fopen(path[kind], "r"); + if(fp == NULL) { + return ERROR; + } + + // ¼ÈëͼµÄÀàÐÍ + ReadData(fp, "%d", &((*G).kind)); + } + + // Ëæ»ú´´½¨ÓÐÏòͼ/Íø»òÎÞÏòͼ/ÍøµÄÒ»ÖÖ + switch((*G).kind) { + case DG: + flag = CreateDG(G); + break; + case DN: + flag = CreateDN(G); + break; + case UDG: + flag = CreateUDG(G); + break; + case UDN: + flag = CreateUDN(G); + break; + default: + flag = ERROR; + break; + } + + if(fp != NULL) { + fclose(fp); + fp = NULL; + } + + return flag; +} + +/* + * ¹¹ÔìÓÐÏòͼ + */ +static Status CreateDG(ALGraph* G) { + int i, k; + int vexnum, arcnum; + VertexType v1, v2; + InfoType* info = NULL; + + (*G).vexnum = (*G).arcnum = 0; + + if(fp == NULL) { + printf("ÇëÊäÈëÓÐÏòͼµÄ¶¥µãÊý£º"); + scanf("%d", &vexnum); + printf("ÇëÊäÈëÓÐÏòͼµÄ»¡Êý£º"); + scanf("%d", &arcnum); + printf("¸ÃÓÐÏòͼµÄ»¡ÉÏÊÇ·ñ°üº¬ÆäËû¸½¼ÓÐÅÏ¢(0-²»°üº¬©¦1-°üº¬)£º"); + scanf("%d", &IncInfo); + + // ¼Èë¶¥µã¼¯ + printf("Çë¼Èë %d ¸ö¶¥µã£¬²»Í¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º", vexnum); + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(stdin); + scanf("%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } else { + ReadData(fp, "%d", &vexnum); // ¼Èë¶¥µãÊý + ReadData(fp, "%d", &arcnum); // ¼È뻡Êý + ReadData(fp, "%d", &IncInfo); // Åжϻ¡ÉÏÊÇ·ñ°üº¬¸½¼ÓÐÅÏ¢ + + // ¼Èë¶¥µã¼¯ + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(fp); + ReadData(fp, "%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } + + // ½öÔÚ¿ØÖÆÌ¨Â¼ÈëÐÅϢʱÊä³ö´ËÌáʾ + if(fp == NULL && arcnum != 0) { + printf("ÇëΪÓÐÏòͼÒÀ´Î¼Èë %d Ìõ»¡µÄÐÅÏ¢£¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º\n", arcnum); + } + + // ¼È뻡µÄÐÅÏ¢ + for(k = 0; k < arcnum; k++) { + if(fp == NULL) { + printf("µÚ %2d Ìõ»¡£º", k + 1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v2); + } else { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + skipBlank(fp); + ReadData(fp, "%c%c", &v1, &v2); + } + + // Èç¹ûÐèҪ¼È뻡µÄÆäËû¸½¼ÓÐÅÏ¢ + if(IncInfo) { + // ×îºó¼È븽¼ÓÐÅÏ¢ + Input(*G, &info); + } + + // ²åÈ뻡 + InsertArc(G, v1, v2, info); + } + + // ´ÓÎļþÖжÁÈ¡Êý¾Ýʱ£¬×îºóÆäʵӦµ±ÅжÏÒ»ÏÂÊÇ·ñ¶Áµ½ÁË×ã¹»µÄÐÅÏ¢ + return OK; +} + +/* + * ¹¹ÔìÓÐÏòÍø + */ +static Status CreateDN(ALGraph* G) { + int i, k; + int vexnum, arcnum; + VertexType v1, v2; + InfoType* info = NULL; + + (*G).vexnum = (*G).arcnum = 0; + + if(fp == NULL) { + printf("ÇëÊäÈëÓÐÏòÍøµÄ¶¥µãÊý£º"); + scanf("%d", &vexnum); + printf("ÇëÊäÈëÓÐÏòÍøµÄ»¡Êý£º"); + scanf("%d", &arcnum); + printf("¸ÃÓÐÏòÍøµÄ»¡ÉϱØÐë°üº¬ÆäËû¸½¼ÓÐÅÏ¢£¬ÒòΪ´Ë´¦µÄȨֵÐèÒª´æ´¢µ½¸½¼ÓÐÅÏ¢ÖÐ...\n"); + IncInfo = 1; + + // ¼Èë¶¥µã¼¯ + printf("Çë¼Èë %d ¸ö¶¥µã£¬²»Í¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º", vexnum); + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(stdin); + scanf("%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } else { + ReadData(fp, "%d", &vexnum); // ¼Èë¶¥µãÊý + ReadData(fp, "%d", &arcnum); // ¼È뻡Êý + ReadData(fp, "%d", &IncInfo);// Åжϻ¡ÉÏÊÇ·ñ°üº¬¸½¼ÓÐÅÏ¢(´Ë´¦Ó¦µ±°üº¬) + IncInfo = 1; // Ç¿ÖÆ½«È¨ÖµÂ¼Èëµ½¸½¼ÓÐÅÏ¢ÖÐ + + // ¼Èë¶¥µã¼¯ + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(fp); + ReadData(fp, "%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } + + // ½öÔÚ¿ØÖÆÌ¨Â¼ÈëÐÅϢʱÊä³ö´ËÌáʾ + if(fp == NULL && arcnum != 0) { + printf("ÇëΪÓÐÏòÍøÒÀ´Î¼Èë %d Ìõ»¡(´øÈ¨Öµ)µÄÐÅÏ¢£¬¶¥µã¼°È¨ÖµÖ®¼äÓÿոñ¸ô¿ª£º\n", arcnum); + } + + // ¼È뻡µÄÐÅÏ¢ + for(k = 0; k < arcnum; k++) { + if(fp == NULL) { + printf("µÚ %2d Ìõ»¡¼°ÆäȨֵ£º", k + 1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v2); + } else { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + skipBlank(fp); + ReadData(fp, "%c%c", &v1, &v2); + } + + // Èç¹ûÐèҪ¼È뻡µÄÆäËû¸½¼ÓÐÅÏ¢ + if(IncInfo) { + // ×îºó¼È븽¼ÓÐÅÏ¢(´Ë´¦ÐèҪ¼ÈëÍøµÄȨֵ) + Input(*G, &info); + } + + // ²åÈ뻡 + InsertArc(G, v1, v2, info); + } + + // ´ÓÎļþÖжÁÈ¡Êý¾Ýʱ£¬×îºóÆäʵӦµ±ÅжÏÒ»ÏÂÊÇ·ñ¶Áµ½ÁË×ã¹»µÄÐÅÏ¢ + return OK; +} + +/* + * ¹¹ÔìÎÞÏòͼ + */ +static Status CreateUDG(ALGraph* G) { + int i, k; + int vexnum, arcnum; + VertexType v1, v2; + InfoType* info = NULL; + + (*G).vexnum = (*G).arcnum = 0; + + if(fp == NULL) { + printf("ÇëÊäÈëÎÞÏòͼµÄ¶¥µãÊý£º"); + scanf("%d", &vexnum); + printf("ÇëÊäÈëÎÞÏòͼµÄ±ßÊý£º"); + scanf("%d", &arcnum); + printf("¸ÃÎÞÏòͼµÄ±ßÉÏÊÇ·ñ°üº¬ÆäËû¸½¼ÓÐÅÏ¢(0-²»°üº¬©¦1-°üº¬)£º"); + scanf("%d", &IncInfo); + + // ¼Èë¶¥µã¼¯ + printf("Çë¼Èë %d ¸ö¶¥µã£¬²»Í¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º", vexnum); + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(stdin); + scanf("%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } else { + ReadData(fp, "%d", &vexnum); // ¼Èë¶¥µãÊý + ReadData(fp, "%d", &arcnum); // ¼Èë±ßÊý + ReadData(fp, "%d", &IncInfo);// ÅжϱßÉÏÊÇ·ñ°üº¬¸½¼ÓÐÅÏ¢ + + // ¼Èë¶¥µã¼¯ + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(fp); + ReadData(fp, "%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } + + // ½öÔÚ¿ØÖÆÌ¨Â¼ÈëÐÅϢʱÊä³ö´ËÌáʾ + if(fp == NULL && arcnum != 0) { + printf("ÇëΪÎÞÏòͼÒÀ´Î¼Èë %d Ìõ±ßµÄÐÅÏ¢£¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º\n", arcnum); + } + + // ¼Èë±ßµÄÐÅÏ¢ + for(k = 0; k < arcnum; k++) { + if(fp == NULL) { + printf("µÚ %2d Ìõ±ß£º", k + 1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v2); + } else { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + skipBlank(fp); + ReadData(fp, "%c%c", &v1, &v2); + } + + // Èç¹ûÐèҪ¼Èë±ßµÄÆäËû¸½¼ÓÐÅÏ¢ + if(IncInfo) { + // ×îºó¼È븽¼ÓÐÅÏ¢ + Input(*G, &info); + + } + + // ²åÈë±ß + InsertArc(G, v1, v2, info); + } + + // ´ÓÎļþÖжÁÈ¡Êý¾Ýʱ£¬×îºóÆäʵӦµ±ÅжÏÒ»ÏÂÊÇ·ñ¶Áµ½ÁË×ã¹»µÄÐÅÏ¢ + return OK; +} + +/* + * ¹¹ÔìÎÞÏòÍø + */ +static Status CreateUDN(ALGraph* G) { + int i, k; + int vexnum, arcnum; + VertexType v1, v2; + InfoType* info = NULL; + + (*G).vexnum = (*G).arcnum = 0; + + if(fp == NULL) { + printf("ÇëÊäÈëÎÞÏòÍøµÄ¶¥µãÊý£º"); + scanf("%d", &vexnum); + printf("ÇëÊäÈëÎÞÏòÍøµÄ±ßÊý£º"); + scanf("%d", &arcnum); + printf("¸ÃÎÞÏòÍøµÄ±ßÉϱØÐë°üº¬ÆäËû¸½¼ÓÐÅÏ¢£¬ÒòΪ´Ë´¦µÄȨֵÐèÒª´æ´¢µ½¸½¼ÓÐÅÏ¢ÖÐ...\n"); + IncInfo = 1; + + // ¼Èë¶¥µã¼¯ + printf("Çë¼Èë %d ¸ö¶¥µã£¬²»Í¬¶¥µãÖ®¼äÓÿոñ¸ô¿ª£º", vexnum); + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(stdin); + scanf("%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } else { + ReadData(fp, "%d", &vexnum); // ¼Èë¶¥µãÊý + ReadData(fp, "%d", &arcnum); // ¼Èë±ßÊý + ReadData(fp, "%d", &IncInfo);// ÅжϱßÉÏÊÇ·ñ°üº¬¸½¼ÓÐÅÏ¢ + IncInfo = 1; // Ç¿ÖÆ½«È¨ÖµÂ¼Èëµ½¸½¼ÓÐÅÏ¢ÖÐ + + // ¼Èë¶¥µã¼¯ + for(i = 0; i < vexnum; i++) { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö"¿É¶Á"·ûºÅ + skipBlank(fp); + ReadData(fp, "%c", &((*G).vertices[i].data)); + (*G).vertices[i].firstarc = NULL; + (*G).vexnum++; + } + } + + // ½öÔÚ¿ØÖÆÌ¨Â¼ÈëÐÅϢʱÊä³ö´ËÌáʾ + if(fp == NULL && arcnum != 0) { + printf("ÇëΪÎÞÏòÍøÒÀ´Î¼Èë %d Ìõ±ß(´øÈ¨Öµ)µÄÐÅÏ¢£¬¶¥µã¼°È¨ÖµÖ®¼äÓÿոñ¸ô¿ª£º\n", arcnum); + } + + // ¼Èë±ßµÄÐÅÏ¢ + for(k = 0; k < arcnum; k++) { + if(fp == NULL) { + printf("µÚ %2d Ìõ±ß¼°ÆäȨֵ£º", k + 1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v1); + skipBlank(stdin); // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + scanf("%c", &v2); + } else { + // Ìø¹ý¿Õ°×£¬Ñ°ÕÒÏÂÒ»¸ö¿É¶Á·ûºÅ + skipBlank(fp); + ReadData(fp, "%c%c", &v1, &v2); + } + + // Èç¹ûÐèҪ¼Èë±ßµÄÆäËû¸½¼ÓÐÅÏ¢ + if(IncInfo) { + // ×îºó¼È븽¼ÓÐÅÏ¢(´Ë´¦ÐèҪ¼ÈëÍøµÄȨֵ) + Input(*G, &info); + } + + // ²åÈë±ß + InsertArc(G, v1, v2, info); + } + + // ´ÓÎļþÖжÁÈ¡Êý¾Ýʱ£¬×îºóÆäʵӦµ±ÅжÏÒ»ÏÂÊÇ·ñ¶Áµ½ÁË×ã¹»µÄÐÅÏ¢ + return OK; +} + +/* + * ¼Èë±ß/»¡µÄÏà¹Ø¸½¼ÓÐÅÏ¢ + */ +static void Input(ALGraph G, InfoType** info) { + int weight; + + // ÔÚ"Íø"µÄÇéÐÎÏÂÐèҪ¼ÈëȨֵÐÅÏ¢ + if(G.kind == DN || G.kind == UDN) { + *info = (InfoType*) malloc(sizeof(InfoType)); + + if(fp == NULL) { + scanf("%d", &weight); + } else { + ReadData(fp, "%d", &weight); + } + + (*info)->weight = weight; + } +} + +/* + * ²éÕÒ + * + * ·µ»Ø¶¥µãuÔÚͼ/ÍøÖеÄλÖà + */ +int LocateVex(ALGraph G, VertexType u) { + int i; + + for(i = 0; i < G.vexnum; i++) { + if(G.vertices[i].data == u) { + return i; + } + } + + return -1; +} + +/* + * ȡֵ + * + * ·µ»ØË÷Òýv´¦µÄ¶¥µãÖµ + */ +VertexType GetVex(ALGraph G, int v) { + if(v < 0 || v >= G.vexnum) { + return '\0'; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + return G.vertices[v].data; +} + +/* + * ¹¹ÔìÒ»¸ö±ß/»¡½áµã(½öÏÞÄÚ²¿Ê¹ÓÃ) + */ +static ArcNode* newArcNodePtr(int adjvex, ArcNode* nextarc, InfoType* info) { + ArcNode* p = (ArcNode*) malloc(sizeof(ArcNode)); + if(!p) { + exit(OVERFLOW); + } + + p->adjvex = adjvex; + + p->nextarc = nextarc; + + p->info = info; + + return p; +} + +/* + * ²åÈë±ß/»¡ + * + * Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬Ôò²åÈëÒ»Ìõ»¡ÐèÒªÔö¼ÓÁ½¸ö¶¥µã¹ØÏµ£¬µ«»¡µÄÊýÁ¿Ö»ÔöÒ»¡£ + * ¶ÔÓÚͼ/ÍøÀ´Ëµ£¬¿ÉÒÔÔڿɱä²ÎÊýÖÐÁгö±ß/»¡µÄ¸½¼ÓÐÅÏ¢¡£ + * + * ×¢£º´Ë´¦½ÓÊյIJÎÊýÓëMGraphÓÐЩ²»Ò»Ñù£ºÍøµÄ¸½¼ÓÐÅÏ¢Öаüº¬Á˸÷Ìõ±ß/»¡µÄȨֵ¡£ + */ +Status InsertArc(ALGraph* G, VertexType v, VertexType w, ...) { + int tail, head, k, count; + ArcNode* r; + ArcNode* pre; + Boolean overlay = FALSE; // ÊÇ·ñΪ¸²¸ÇÌí¼Ó + InfoType* info = NULL; // ±ß/»¡µÄ¸½¼ÓÐÅÏ¢ + va_list ap; + + tail = LocateVex(*G, v); // »ñÈ¡¶¥µãvÔÚ¶¥µã¼¯ÖеÄλÖà + if(tail == -1) { + return ERROR; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + head = LocateVex(*G, w); // »ñÈ¡¶¥µãwÔÚ¶¥µã¼¯ÖеÄλÖà + if(head == -1) { + return ERROR; // Ö¸¶¨µÄ¶¥µã²»´æÔÚ + } + + // ¾Ü¾ø»· + if(tail == head) { + return ERROR; + } + + // Èç¹û±ß/»¡ÉÏ´æÔÚ¸½¼ÓÐÅÏ¢ + if(IncInfo) { + va_start(ap, w); // ÔÚwºó²éѯÊ׸ö¿É±ä²ÎÊý + info = va_arg(ap, InfoType*); // »ñÈ¡¸½¼ÓÐÅÏ¢ + va_end(ap); + } + + /* ½ÓÏÂÀ´£¬ÐèÒª²éÕÒºÏÊʵIJåÈëλÖà */ + + for(count = 0; count < 2; count++) { + pre = NULL; + // Ö¸ÏòÒÔtailΪβµÄÊ×Ìõ±ß/»¡ + r = G->vertices[tail].firstarc; + while(r != NULL && r->adjvex < head) { + pre = r; + r = r->nextarc; + } + + // Óöµ½ÁËÏàͬλÖõĽáµã + if(r != NULL && r->adjvex == head) { + r->info = info; // ¸´Óøýáµã + overlay = TRUE; // ·¢ÉúÁ˸²¸Ç + } else { + if(pre == NULL) { + G->vertices[tail].firstarc = newArcNodePtr(head, r, info); + } else { + pre->nextarc = newArcNodePtr(head, r, info); + } + } + + // Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬ÐèÒª¿¼ÂǶԳÆÐÔ + if((G->kind == UDG || G->kind == UDN) && tail != head) { + // µßµ¹iºÍj + k = tail; + tail = head; + head = k; + } else { + break; // Èç¹ûÊÇÓÐÏòµÄ£¬¿ÉÒÔ½áÊøÁË + } + } + + // ÔڷǸ²¸ÇµÄÇéÐÎÏ£¬²Å¿¼ÂǸüбß/»¡µÄÊýÁ¿ + if(!overlay) { + (*G).arcnum++; // ²»ÂÛÓÐÏòÎÞÏò£¬±ß/»¡ÊýÖ»ÔöÒ» + } + + return OK; +} + +/* + * ÒÔͼÐλ¯ÐÎʽÊä³öµ±Ç°½á¹¹ + */ +void PrintGraph(ALGraph G) { + int i; + ArcNode* p; + + if(G.vexnum == 0) { + printf("¿Õͼ£¬ÎÞÐè´òÓ¡£¡\n"); + return; + } + + printf("µ±Ç°Í¼/Íø°üº¬ %2d ¸ö¶¥µã£¬ %2d Ìõ±ß/»¡...\n", G.vexnum, G.arcnum); + + for(i = 0; i < G.vexnum; i++) { + printf("%c ===> ", G.vertices[i].data); + + p = G.vertices[i].firstarc; + while(p != NULL) { + if(IncInfo == 0) { + printf("%c ", G.vertices[p->adjvex].data); + + // ¶ÔÓÚÍø£¬»á´ÓÆä¸½¼ÓÐÅÏ¢ÖлñÈ¡µ½È¨Öµ + } else { + printf("%c[%2d] ", G.vertices[p->adjvex].data, p->info->weight); + } + + p = p->nextarc; + + if(p != NULL) { + printf("- "); + } + } + + printf("\n"); + } +} diff --git a/VisualC++/ExerciseBook/07.42/ALGraph.h b/VisualC++/ExerciseBook/07.42/ALGraph.h new file mode 100644 index 0000000..385d058 --- /dev/null +++ b/VisualC++/ExerciseBook/07.42/ALGraph.h @@ -0,0 +1,150 @@ +/*================== + * ͼµÄÁÚ½Ó±í´æ´¢±íʾ + ===================*/ + +#ifndef ALGRAPH_H +#define ALGRAPH_H + +#include +#include // Ìṩmemset¡¢strcmp Ô­ÐÍ +#include // Ìṩºêva_list¡¢va_start¡¢va_arg¡¢va_end +#include // Ìṩmalloc¡¢realloc¡¢free¡¢exitÔ­ÐÍ +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// + +/* + * ×¢£º + * + * ͨ³£À´½²£¬ÎÞȨͼ±»¼ò³ÆÎª¡¾Í¼¡¿£¬ÓÐȨͼ±»¼ò³ÆÎª¡¾Íø¡¿¡£ + * ÎÞÏòͼ/ÍøÖеĶ¥µã¹ØÏµ±»³ÆÎª¡¾±ß¡¿£¬ÓÐÏòͼ/ÍøÖеĶ¥µã¹ØÏµ±»³ÆÎª¡¾»¡¡¿£¬²¢Çø·Ö»¡Í·Ó뻡β¡£ + * ʵ¼Ê±íÊöÖУ¬Î´±Ø»áÑϸñ×ñÊØÒÔÉÏÃüÃû¡£ + * + * µ±Ç°½á¹¹Êʺϴ洢±ß/»¡±È½ÏÏ¡ÊèµÄͼ/Íø¡£ + * + * ¡ï ²åÈë±ß/»¡µÄÐÅϢʱ£¬ÕâÀïµÄʵÏÖÊǰ´"ÉýÐò"²åÈëµÄ£¬ÕâʹµÃ²åÈëµÄ»¡Êǰ´"ÉýÐò"ÅÅÁеġ£ + */ + + +/* ºê¶¨Òå */ +#define MAX_VERTEX_NUM 26 // ×î´ó¶¥µã¸öÊý + + +// ͼµÄÀàÐÍ +typedef enum { + DG, // 0-ÓÐÏòͼ + DN, // 1-ÓÐÏòÍø(´øÈ¨Öµ) + UDG, // 2-ÎÞÏòͼ + UDN // 3-ÎÞÏòÍø(´øÈ¨Öµ) +} GraphKind; + +// ¶¥µãÀàÐÍ +typedef char VertexType; + +// ±ß/»¡µÄÏà¹Ø¸½¼ÓÐÅÏ¢ +typedef struct { + /* + * ×¢£º + * ½Ì²ÄÖиø³öµÄ½á¹¹Ö»¿¼ÂÇÁËÎÞȨͼ£¬¶øÃ»¿¼ÂÇÓÐȨͼ(Íø)¡£ + * ÕâÀïΪÁ˰ѡ°Íø¡±µÄÇéÐÎÒ²¿¼ÂǽøÈ¥£¬ÌØÔÚ¸½¼ÓÐÅÏ¢ÖÐÔö¼ÓÁË"È¨ÖØ"ÊôÐÔ¡£ + */ + int weight; +} InfoType; + +/* ±ß/»¡½áµã */ +typedef struct ArcNode { + int adjvex; // ¸Ã»¡ËùÖ¸ÏòµÄ¶¥µãµÄλÖà + struct ArcNode* nextarc; // Ö¸ÏòÏÂÒ»Ìõ»¡µÄÖ¸Õë + InfoType* info; // »¡µÄ¸½¼ÓÐÅÏ¢£¬Í¨³£ºöÂÔ +} ArcNode; + +// ÿ¸öÁ´±íµÄÍ·½áµã +typedef struct VNode { + VertexType data; // ¶¥µãÐÅÏ¢ + ArcNode* firstarc; // Ö¸ÏòµÚÒ»ÌõÒÀ¸½¸Ã¶¥µãµÄ»¡µÄÖ¸Õë +} VNode; + +/* ͼµÄÁÚ½Ó±í´æ´¢±íʾÀàÐͶ¨Òå */ +typedef struct { + VNode vertices[MAX_VERTEX_NUM]; // ÁÚ½Ó±í + int vexnum, arcnum; // ͼ/ÍøµÄ¶¥µãÊýºÍ»¡Êý + GraphKind kind; // ͼµÄÀàÐͱêÖ¾ +} ALGraph; + + +// ±ß/»¡ÉÏÊÇ·ñ´æÔÚ¸½¼ÓÐÅÏ¢ +extern Boolean IncInfo; + + +/* + * ´´½¨ + * + *¡¾±¸×¢¡¿ + * + * ½Ì²ÄÖÐĬÈÏ´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý¡£ + * ÕâÀïΪÁË·½±ã²âÊÔ£¬±ÜÃâÿ´ÎÔËÐж¼ÊÖ¶¯ÊäÈëÊý¾Ý£¬ + * Òò¶øÔÊÐíÑ¡Ôñ´ÓÔ¤ÉèµÄÎļþpathÖжÁÈ¡²âÊÔÊý¾Ý¡£ + * + * Èç¹ûÐèÒª´Ó¿ØÖÆÌ¨¶ÁÈ¡Êý¾Ý£¬ÔòpathΪNULL£¬»òpath[kind]Ϊ""¡£ + * Èç¹ûÐèÒª´ÓÎļþÖжÁÈ¡Êý¾Ý£¬ÔòÐèÒªÔÚpathÖÐÌîдÎļþÃûÐÅÏ¢¡£ + */ +Status CreateGraph(ALGraph* G, char* path[]); + +/* + * ¹¹ÔìÓÐÏòͼ + */ +static Status CreateDG(ALGraph* G); + +/* + * ¹¹ÔìÓÐÏòÍø + */ +static Status CreateDN(ALGraph* G); + +/* + * ¹¹ÔìÎÞÏòͼ + */ +static Status CreateUDG(ALGraph* G); + +/* + * ¹¹ÔìÎÞÏòÍø + */ +static Status CreateUDN(ALGraph* G); + +/* + * ¼Èë±ß/»¡µÄÏà¹Ø¸½¼ÓÐÅÏ¢ + */ +static void Input(ALGraph G, InfoType** info); + +/* + * ²éÕÒ + * + * ·µ»Ø¶¥µãuÔÚͼ/ÍøÖеÄλÖà + */ +int LocateVex(ALGraph G, VertexType u); + +/* + * ȡֵ + * + * ·µ»ØË÷Òýv´¦µÄ¶¥µãÖµ + */ +VertexType GetVex(ALGraph G, int v); + +/* + * ¹¹ÔìÒ»¸ö±ß/»¡½áµã(½öÏÞÄÚ²¿Ê¹ÓÃ) + */ +static ArcNode* newArcNodePtr(int adjvex, ArcNode* nextarc, InfoType* info); + +/* + * ²åÈë±ß/»¡ + * + * Èç¹ûµ±Ç°Í¼/ÍøÊÇÎÞÏòµÄ£¬Ôò²åÈëÒ»Ìõ»¡ÐèÒªÔö¼ÓÁ½¸ö¶¥µã¹ØÏµ£¬µ«»¡µÄÊýÁ¿Ö»ÔöÒ»¡£ + * ¶ÔÓÚͼ/ÍøÀ´Ëµ£¬¿ÉÒÔÔڿɱä²ÎÊýÖÐÁгö±ß/»¡µÄ¸½¼ÓÐÅÏ¢¡£ + * + * ×¢£º´Ë´¦½ÓÊյIJÎÊýÓëMGraphÓÐЩ²»Ò»Ñù£ºÍøµÄ¸½¼ÓÐÅÏ¢Öаüº¬Á˸÷Ìõ±ß/»¡µÄȨֵ¡£ + */ +Status InsertArc(ALGraph* G, VertexType v, VertexType w, ...); + +/* + * ÒÔͼÐλ¯ÐÎʽÊä³öµ±Ç°½á¹¹ + */ +void PrintGraph(ALGraph G); + +#endif diff --git a/VisualC++/ExerciseBook/07.42/ShortestPaths.c b/VisualC++/ExerciseBook/07.42/ShortestPaths.c new file mode 100644 index 0000000..cfc6dc4 --- /dev/null +++ b/VisualC++/ExerciseBook/07.42/ShortestPaths.c @@ -0,0 +1,334 @@ +/*==================== + * ×î¶Ì·¾¶Ëã·¨ + * + * °üº¬Ëã·¨: 7.15¡¢7.16 + =====================*/ + +#include "ShortestPaths.h" + +/* + * ´æ´¢¸÷¶Ô¶¥µãÖ®¼äµÄ¹ØÏµ¡£ + * + * ¶ÔÓÚͼÀ´Ëµ£¬´æ´¢0±íʾÁ½¶¥µã²»Ö±½ÓÁ¬Í¨£¬´æ´¢1±íʾÁ½¶¥µãÖ±½ÓÁ¬Í¨£» + * ¶ÔÓÚÍøÀ´Ëµ£¬´æ´¢µÄÊǶ¥µãÖ®¼äµÄȨֵ£¬È¨ÖµÎªINFINITE±íʾÁ½¶¥µã²»Ö±½ÓÁ¬Í¨¡£ + */ +static int adjs[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; + + +/* + * Ó¦µ±ÔÚÖ´ÐеϽÜË¹ÌØÀ­Ë㷨֮ǰ±»µ÷Óã¬ÓÃÀ´¼ÆËã¸÷¶¥µãÖ®¼äµÄ¹ØÏµ¡£ + */ +void GetAdjs(ALGraph G) { + int i, j; + ArcNode* p; + + for(i = 0; i < G.vexnum; i++) { + // ³õʼ»¯¶¥µã¹ØÏµ + for(j = 0; j < G.vexnum; j++) { + // Èç¹ûÊÇÍø£¬Ö»×ß´Ë·ÖÖ§ + if(G.kind == DN || G.kind == UDN) { + adjs[i][j] = INFINITE; + } + + // Èç¹ûÊÇͼ£¬Ö»×ß´Ë·ÖÖ§ + if(G.kind == DG || G.kind == UDG) { + adjs[i][j] = 0; + } + } + + // ´¦ÀíÖ±½ÓÁ¬½ÓµÄ¶¥µã + for(p = G.vertices[i].firstarc; p != NULL; p = p->nextarc) { + // Èç¹ûÊÇÍø£¬Ö»×ß´Ë·ÖÖ§ + if(G.kind == DN || G.kind == UDN) { + adjs[i][p->adjvex] = p->info->weight; + } + + // Èç¹ûÊÇͼ£¬Ö»×ß´Ë·ÖÖ§ + if(G.kind == DG || G.kind == UDG) { + adjs[i][p->adjvex] = 1; + } + } + } +} + +/* + * ¨€¨€¨€¨€¨€¨€¨€¨€ Ëã·¨7.15 ¨€¨€¨€¨€¨€¨€¨€¨€ + * + * µÏ½ÜË¹ÌØÀ­(Dijkstra)Ëã·¨Çóµ¥Ô´×î¶Ì·¾¶ + * + * @param G ´ý±éÀúµÄͼ¡£ + * @param v0 µ¥Ô´×î¶Ì·¾¶µÄÆðµã¡£ + * @param P ´æ´¢´Óv0µ½ÆäÓà¸÷¶¥µãµÄ×î¶Ì·¾¶ÐÅÏ¢¡£ + * P[j][k]==TRUE´ú±í´Óv0->jµÄ×î¶Ì·¾¶»á¾­¹ý¶¥µãk£»·ñÔò£¬´ú±í²»¾­¹ý¡£ + * ×¢£º + * 1.¸ÃÊý×éÖ»·´Ó³Á˶¥µãµÄ´æÔÚÐÔ£¬¶øÎ´·´Ó³¶¥µãÔÚ·¾¶ÉϵĴÎÐò¡£ + * 2.Èç¹ûÁ½¶¥µãÖ®¼äÓжàÌõ×î¶Ì·¾¶£¬Ö»»áѡȡһÌõ + * @param D ´æ´¢´Óv0µ½ÆäÓà¸÷¶¥µãµÄ×î¶Ì·¾¶´ú¼Û£¬ÔÚͼÖУ¬¸Ã´ú¼ÛÊDz½³¤ºÍ£¬ÔÚÍøÖУ¬¸Ã´ú¼ÛÊÇȨֵºÍ¡£ + */ +void ShortestPath_DIJ(ALGraph G, int v0, PathMatrix_DIJ P, ShortPathTable_DIJ D) { + int v, w, i, j, min; + Status final[MAX_VERTEX_NUM]; // ÓÃÀ´±ê¼Çµ±Ç°½áµãÊÇ·ñÒѾ­·ÃÎʹý£¬¼´ÊÇ·ñÒѼÓÈë×î¶Ì·¾¶ + + /* + * Ô¤ÉèÒÑ·ÃÎʹýµÄ¶¥µã¼¯ÎªS£¬Î´·ÃÎʹýµÄ¶¥µã¼¯ÎªV-S + * ³õʼʱ£¬¶¥µã¼¯SΪ¿Õ£¬¶ø¶¥µã¼¯V-SΪËùÓж¥µãµÄ¼¯ºÏV + */ + for(v = 0; v < G.vexnum; v++) { + // ³õʼʱ£¬ËùÓж¥µã¾ùδ·ÃÎʹý + final[v] = FALSE; + + // ³õʼ»¯v0->vµÄ·¾¶´ú¼Û + D[v] = adjs[v0][v]; + + // Ô¤Éè´Óv0->v²»ÐèÒª¾­¹ý¶¥µãw£¬¼´Éè¿Õ·¾¶ + for(w = 0; w < G.vexnum; w++) { + P[v][w] = FALSE; + } + + // Èç¹ûÊÇÍø£¬Ö»×ß´Ë·ÖÖ§(½Ì²ÄÖ»´¦ÀíÁË´ËÖÖÇéÐÎ) + if(G.kind == DN || G.kind == UDN) { + // Èç¹ûv0->vÖ±½ÓÁ¬Í¨ + if(D[v] < INFINITE) { + P[v][v0] = TRUE; // ָʾv0->v±Ø½«¾­¹ý¶¥µãv0(¶ËµãÒ») + P[v][v] = TRUE; // ָʾv0->v±Ø½«¾­¹ý¶¥µãv(¶Ëµã¶þ) + } + } + + // Èç¹ûÊÇͼ£¬Ö»×ß´Ë·ÖÖ§ + if(G.kind == DG || G.kind == UDG) { + // Èç¹ûv0µ½vÖ±½ÓÁ¬Í¨ + if(D[v] != 0) { + P[v][v0] = TRUE; // ָʾv0->v±Ø½«¾­¹ý¶¥µãv0(¶ËµãÒ») + P[v][v] = TRUE; // ָʾv0->v±Ø½«¾­¹ý¶¥µãv(¶Ëµã¶þ) + } + } + } + + // ³õʼ»¯£¬v0½øÈë¶¥µã¼¯S + D[v0] = 0; + final[v0] = TRUE; + + /* + * ¿ªÊ¼Ö÷Ñ­»·£¬±éÀúÆäÓàG1.vexnum-1¸ö¶¥µã¡£ + * ÿ´ÎÇóµÃv0µ½Ä³¸ö¶¥µãµÄ×î¶Ì·¾¶£¬Ôò½«¸Ã¶¥µã´Ó¶¥µã¼¯V-SÖÐŲµ½¶¥µã¼¯SÖÐ + */ + for(i = 1; i < G.vexnum; i++) { + /* + * ÿ´Î½øÈëѡȡ×î½ü¶¥µã֮ǰ£¬¶¼Ó¦µ±½«vÖØÖÃΪһ¸öÕý³£¶¥µãÐòºÅÖ®ÍâµÄÖµ + * (½Ì²ÄÖÐÎ޴˲½Ö裬ÐèÒª²¹ÉÏ£¬·ñÔò»á½øÐкܶà´ÎÎÞЧµÄÑ­»·) + */ + v = -1; + + // ¼Ç¼¸÷¶¥µãÓë¶¥µãv0µÄ×î¶Ì¾àÀë + min = INFINITE; + + // ±éÀú¶¥µã¼¯V-S(ËùÓÐδ¼ÓÈë·¾¶µÄ¶¥µã)£¬´ÓÖÐÑ¡³ö¾àÀëv0¸ü½üµÄ¶¥µã + for(w = 0; w < G.vexnum; w++) { + // Èç¹ûw¶¥µãÔÚV-SÖÐ(δ¼ÓÈë×î¶Ì·¾¶) + if(!final[w]) { + // ¶ÔÓÚͼÀ´Ëµ£¬¾àÀëΪ0Òâζ×ÅÁ½¶¥µã²»Á¬Í¨ + if((G.kind == DG || G.kind == UDG) && D[w] == 0) { + continue; + } + + // Èç¹ûv0µ½wµÄ¾àÀëD[w]СÓÚµ±Ç°Ô¤ÉèµÄ×îС¾àÀ룬ÔòÐèÒª¸üж¥µãºÍ¾àÀëÐÅÏ¢ + if(D[w] < min) { + v = w; // ¼ÇÏÂδ·ÃÎʵĶ¥µãÖоàÀëv0¸ü½üµÄ¶¥µã£¬»òÕß¿ÉÒÔÀí½âΪ¼Ç϶¥µã¼¯V-SÖоàÀë¶¥µã¼¯S¸ü½üµÄ¶¥µã + min = D[w]; // ¼Çϸü½üµÄ¾àÀë + } + } + } + + // ÕÒµ½Á˸ü½üµÄ¶¥µã + if(v != -1) { + // ½«¶¥µã¼¯V-SÖе±Ç°¾àÀëv0¶¥µã×î½üµÄv¼ÓÈëS¼¯ + final[v] = TRUE; + } else { + // Èç¹ûûÕÒµ½¸ü½üµÄ¶¥µã£¬ËµÃ÷¶¥µãv0ÓëV-SÖеÄÊ£Óà¶¥µãûÓÐÁ¬½Ó£¬´Ëʱ¿ÉÒÔÖ±½Ó½áÊø³ÌÐòÁË + return; + } + + // ÒÔÉÏÊöµÄ¶¥µãv×öÌø°å£¬¸üж¥µãv0µ½V-S¼¯ÖÐÆäÓàµã¶¥µãµÄ×î¶Ì·¾¶ + for(w = 0; w < G.vexnum; w++) { + // Èç¹ûÊÇÍø£¬Ö»×ß´Ë·ÖÖ§(½Ì²ÄÖ»´¦ÀíÁË´ËÖÖÇéÐÎ) + if(G.kind == DN || G.kind == UDN) { + /* + * ΪÁ˱ÜÃâÒç³ö£¬ÐèҪȷ±£adjs[v][w]²»ÎªINFINITE¡£ + * ´Ë´¦Æäʵû±ØÒªÅжÏmin!=INFINITE£¬ÒòΪÈç¹ûûÕÒµ½¸ü½üµÄ¶¥µãʱ£¬ÉÏÃæ¾ÍÌáǰ·µ»ØÁË¡£ + * (½Ì²ÄµÄαÂëÖÐδ´¦ÀíÒç³ö£¬¹ÊÐèÒª×ÔÐÐÌí¼Ó) + */ + if(min != INFINITE && adjs[v][w] != INFINITE) { + // ¸üж¥µã¼¯Sµ½¶¥µã¼¯V-SµÄ×î½ü¾àÀë + if(!final[w] && (min + adjs[v][w] < D[w])) { + // ¸üоàÀ룺ÓÉÓÚ¶¥µãv0->w¾­ÓÉvºó»á»ñµÃ¸ü¶ÌµÄ¾àÀ룬¹Ê´Ë´¦ÐèÒª¼ÇϸþàÀë + D[w] = min + adjs[v][w]; + + /* ¸üз¾¶£ºP[w] = P[v] + [w] */ + + // ÏȽ«v0->wµÄ·¾¶¸üÐÂΪv0->jµÄ·¾¶ + for(j = 0; j < G.vexnum; j++) { + P[w][j] = P[v][j]; + } + + // ÔÙ½«wÌí¼Óµ½v0->wµÄ·¾¶ÖÐ + P[w][w] = TRUE; + } + } + } + + // Èç¹ûÊÇͼ£¬Ö»×ß´Ë·ÖÖ§ + if(G.kind == DG || G.kind == UDG) { + // ¸üж¥µã¼¯Sµ½¶¥µã¼¯V-SµÄ×î½ü¾àÀë + if(!final[w] && adjs[v][w] != 0 && D[w] == 0) { + // ¸üоàÀ룺ÓÉÓÚ¶¥µãv0->w¾­ÓÉvºó»á»ñµÃ¸ü¶ÌµÄ¾àÀ룬¹Ê´Ë´¦ÐèÒª¼ÇϸþàÀë + D[w] = D[v] + 1; // ͼÖÐÏàÁÚ¶¥µã²½³¤Îª1 + + /* ¸üз¾¶£ºP[w] = P[v] + [w] */ + + // ÏȽ«v0->wµÄ·¾¶¸üÐÂΪv0->jµÄ·¾¶ + for(j = 0; j < G.vexnum; j++) { + P[w][j] = P[v][j]; + } + + // ÔÙ½«wÌí¼Óµ½v0->wµÄ·¾¶ÖÐ + P[w][w] = TRUE; + } + } + } + } +} + +/* + * ´òӡʹÓõϽÜË¹ÌØÀ­(Dijkstra)Ëã·¨ÇóÈ¡µÄµ¥Ô´×î¶Ì·¾¶ + */ +void PrintPath_DIJ(ALGraph G, int v0, PathMatrix_DIJ P, ShortPathTable_DIJ D) { + int j; + + // ±éÀúËùÓз¾¶ + for(j = 0; j < G.vexnum; j++) { + if(P[j][v0] == FALSE) { + printf("%c µ½ %c Ö®¼äûÓÐͨ·\n", GetVex(G, v0), GetVex(G, j)); + continue; + } + + printf("%c µ½ %c Ö®¼äµÄ×î¶Ì¾àÀëΪ%2d£¬Æä×î¶Ì·¾¶Îª£º", GetVex(G, v0), GetVex(G, j), D[j]); + + /* + * ½«v0->jÖ®¼äµÄÎÞÐò¶¥µãÅÅÁгÉÒ»ÌõÓÐÐò·¾¶ºó´òÓ¡ + * P[i]ָʾv0->jÕâÌõ·¾¶ÉϾ­¹ýµÄ¶¥µã + */ + PrintPath(G, v0, j, P[j]); + } +} + +/* + * ´òÓ¡´Óaµ½bµÄ·¾¶£¬¸Ã·¾¶µÄ¶¥µãÐÅϢλÓÚPÖÐ + */ +static void PrintPath(ALGraph G, int a, int b, Boolean P[MAX_VERTEX_NUM]) { + int i; + int vexs[MAX_VERTEX_NUM + 1]; + int path[MAX_VERTEX_NUM + 1]; + + vexs[0] = 0; + + // »ñÈ¡v0->iÕâÌõ;¾¶ÉϵÄËùÓж¥µã£¬¿ÉÄÜÊÇÎÞÐòµÄ + for(i = 0; i < G.vexnum; i++) { + if(P[i] == TRUE) { + vexs[0]++; + vexs[vexs[0]] = i; + } + } + + // Ö»ÓÐÁ½¸ö¶¥µãµÄÇéÐÎÏ¿ìËÙ´¦Àí + if(vexs[0] == 2) { + path[0] = 2; + path[1] = a; + path[2] = b; + goto print; + } + + // Ö»ÓÐÈý¸ö¶¥µãµÄÇéÐÎÏ¿ìËÙ´¦Àí + if(vexs[0] == 3) { + path[0] = 3; + path[1] = a; + for(i = 1; i <= vexs[0]; i++) { + if(vexs[i] != a && vexs[i] != b) { + path[2] = vexs[i]; + break; + } + } + path[3] = b; + goto print; + } + + path[0] = 1; + path[1] = a; + + for(i = 1; i <= vexs[0]; i++) { + if(vexs[i] == a) { + vexs[i] = -1; + break; + } + } + + Find(G, a, b, vexs, path); + +print: + // ´òÓ¡ÅÅÁкõÄ·¾¶ + for(i = 1; i <= path[0]; i++) { + printf("%c ", GetVex(G, path[i])); + } + + printf("\n"); +} + +/* + * ÀûÓùã¶ÈÔ¤ÏÈËÑË÷ÕÒµ½Ò»Ìõ´Ópreµ½bµÄ·¾¶£¬¸Ã·¾¶ÉÏ·¹ýµÄËùÓж¥µãλÓÚvexsÖУ¬ÕÒ³öµÄ·¾¶´æ´¢µ½pathÖÐ + */ +static Status Find(ALGraph G, int pre, int b, int vexs[MAX_VERTEX_NUM + 1], int path[MAX_VERTEX_NUM + 1]) { + int i; + int tmp; + Status s; + + for(i = 1; i <= vexs[0]; i++) { + // ÒѼÓÈ뵽·¾¶ + if(vexs[i] == -1) { + continue; + } + + // ²»Á¬Í¨ + if(((G.kind == DN || G.kind == UDN) && adjs[pre][vexs[i]] == INFINITE) + || ((G.kind == DG || G.kind == UDG) && adjs[pre][vexs[i]] == 0)) { + continue; + } + + path[0]++; + path[path[0]] = vexs[i]; + + // Óöµ½ÖÕµã + if(vexs[i] == b) { + // ÕÒµ½ÁË×î¶Ì·¾¶ + if(path[0] == vexs[0]) { + return OK; + } else { + path[0]--; + continue; + } + } + + tmp = vexs[i]; + vexs[i] = -1; + + s = Find(G, tmp, b, vexs, path); + + if(s == OK) { + return OK; + } else { + // »Ö¸´¸Ã¶¥µã£¬ÒÔ±ãºóÐøÖØÐÂËÑË÷ + vexs[i] = tmp; + path[0]--; + } + } + + return ERROR; +} diff --git a/VisualC++/ExerciseBook/07.42/ShortestPaths.h b/VisualC++/ExerciseBook/07.42/ShortestPaths.h new file mode 100644 index 0000000..d28d204 --- /dev/null +++ b/VisualC++/ExerciseBook/07.42/ShortestPaths.h @@ -0,0 +1,59 @@ +/*==================== + * ×î¶Ì·¾¶Ëã·¨ + * + * °üº¬Ëã·¨: 7.15¡¢7.16 + =====================*/ + +#ifndef SHORTESTPATHS_H +#define SHORTESTPATHS_H + +#include +#include +#include "Status.h" //**¡ø01 Ð÷ÂÛ**// +#include "ALGraph.h" //**¡ø07 ͼ**// + +// ȨֵµÄ×î´óÖµ£¬ÓÃÔÚÍøÖУ¬±íʾÁ½¶¥µã²»Ö±½ÓÁ¬Í¨ +#define INFINITE INT_MAX + + +// DijkstraËã·¨ÖеÄ×î¶Ì·¾¶¾ØÕó£¬ÊÇÒ»¸ö¶þάÊý×é +typedef Boolean PathMatrix_DIJ[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; +// DijkstraËã·¨ÖеÄ×î¶Ì·¾¶´ú¼Û£¬¸Ã´ú¼Û¿ÉÄÜÊDz½³¤ºÍ£¬Ò²¿ÉÄÜÊÇȨֵºÍ +typedef int ShortPathTable_DIJ[MAX_VERTEX_NUM]; + + +/* + * Ó¦µ±ÔÚÖ´ÐеϽÜË¹ÌØÀ­Ë㷨֮ǰ±»µ÷Óã¬ÓÃÀ´¼ÆËã¸÷¶¥µãÖ®¼äµÄ¹ØÏµ¡£ + */ +void GetAdjs(ALGraph G); + +/* + * ¨€¨€¨€¨€¨€¨€¨€¨€ Ëã·¨7.15 ¨€¨€¨€¨€¨€¨€¨€¨€ + * + * µÏ½ÜË¹ÌØÀ­(Dijkstra)Ëã·¨Çóµ¥Ô´×î¶Ì·¾¶ + * + * @param G ´ý±éÀúµÄͼ¡£ + * @param v0 µ¥Ô´×î¶Ì·¾¶µÄÆðµã¡£ + * @param P ´æ´¢´Óv0µ½ÆäÓà¸÷¶¥µãµÄ×î¶Ì·¾¶ÐÅÏ¢¡£ + * P[j][k]==TRUE´ú±í´Óv0->jµÄ×î¶Ì·¾¶»á¾­¹ý¶¥µãk£»·ñÔò£¬´ú±í²»¾­¹ý¡£ + * ×¢£º¸ÃÊý×éÖ»·´Ó³Á˶¥µãµÄ´æÔÚÐÔ£¬¶øÎ´·´Ó³¶¥µãÔÚ·¾¶ÉϵĴÎÐò¡£ + * @param D ´æ´¢´Óv0µ½ÆäÓà¸÷¶¥µãµÄ×î¶Ì·¾¶´ú¼Û£¬ÔÚͼÖУ¬¸Ã´ú¼ÛÊDz½³¤ºÍ£¬ÔÚÍøÖУ¬¸Ã´ú¼ÛÊÇȨֵºÍ¡£ + */ +void ShortestPath_DIJ(ALGraph G, int v0, PathMatrix_DIJ P, ShortPathTable_DIJ D); + +/* + * ´òӡʹÓõϽÜË¹ÌØÀ­(Dijkstra)Ëã·¨ÇóÈ¡µÄµ¥Ô´×î¶Ì·¾¶ + */ +void PrintPath_DIJ(ALGraph G, int v0, PathMatrix_DIJ P, ShortPathTable_DIJ D); + +/* + * ´òÓ¡´Óaµ½bµÄ·¾¶£¬¸Ã·¾¶µÄ¶¥µãÐÅϢλÓÚPÖÐ + */ +static void PrintPath(ALGraph G, int a, int b, Boolean P[MAX_VERTEX_NUM]) ; + +/* + * ÀûÓùã¶ÈÔ¤ÏÈËÑË÷ÕÒµ½Ò»Ìõ´Ópreµ½bµÄ·¾¶£¬¸Ã·¾¶ÉÏ·¹ýµÄËùÓж¥µãλÓÚvexsÖУ¬ÕÒ³öµÄ·¾¶´æ´¢µ½pathÖÐ + */ +static Status Find(ALGraph G, int pre, int b, int vexs[MAX_VERTEX_NUM], int path[MAX_VERTEX_NUM]); + +#endif diff --git a/VisualC++/ExerciseBook/07.42/TestData_DG.txt b/VisualC++/ExerciseBook/07.42/TestData_DG.txt new file mode 100644 index 0000000..8bd9909 --- /dev/null +++ b/VisualC++/ExerciseBook/07.42/TestData_DG.txt @@ -0,0 +1,6 @@ +ͼÀàÐÍ¡ú0£¨ÓÐÏòͼ£© +¶¥µãÊý¡ú14 +»¡Êý¡ú20 +»¡ÊÇ·ñ´øÓÐÆäËûÐÅÏ¢¡ú0 +¶¥µã¼¯¡ú¡¾A£¬B£¬C£¬D£¬E£¬F£¬G£¬H£¬I£¬J£¬K£¬L£¬M£¬N¡¿ +»¡µÄ¼¯ºÏ¡ú¡¾A£¬C¡¿¡¾A£¬F¡¿¡¾B£¬A¡¿¡¾B£¬H¡¿¡¾C£¬B¡¿¡¾D£¬G¡¿¡¾E£¬H¡¿¡¾E£¬C¡¿¡¾F£¬I¡¿¡¾F£¬G¡¿¡¾H£¬E¡¿¡¾H£¬J¡¿¡¾I£¬E¡¿¡¾I£¬D¡¿¡¾I£¬G¡¿¡¾J£¬D¡¿¡¾L£¬N¡¿¡¾N£¬M¡¿¡¾M£¬L¡¿¡¾M£¬K¡¿ \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.42/TestData_DN.txt b/VisualC++/ExerciseBook/07.42/TestData_DN.txt new file mode 100644 index 0000000..20d59bd --- /dev/null +++ b/VisualC++/ExerciseBook/07.42/TestData_DN.txt @@ -0,0 +1,6 @@ +ͼÀàÐÍ¡ú1£¨ÓÐÏòÍø£© +¶¥µãÊý¡ú14 +»¡Êý¡ú20 +»¡ÊÇ·ñ´øÓÐÆäËûÐÅÏ¢¡ú1 +¶¥µã¼¯¡ú¡¾A£¬B£¬C£¬D£¬E£¬F£¬G£¬H£¬I£¬J£¬K£¬L£¬M£¬N¡¿ +»¡µÄ¼¯ºÏ¡ú¡¾A£¬C£¬15¡¿¡¾A£¬F£¬1¡¿¡¾B£¬A£¬5¡¿¡¾B£¬H£¬4¡¿¡¾C£¬B£¬5¡¿¡¾D£¬G£¬2¡¿¡¾E£¬H£¬20¡¿¡¾E£¬C£¬4¡¿¡¾F£¬I£¬5¡¿¡¾F£¬G£¬15¡¿¡¾H£¬E£¬2¡¿¡¾H£¬J£¬1¡¿¡¾I£¬E£¬3¡¿¡¾I£¬D£¬3¡¿¡¾I£¬G£¬8¡¿¡¾J£¬D£¬2¡¿¡¾L£¬N£¬2¡¿¡¾N£¬M£¬3¡¿¡¾M£¬L£¬1¡¿¡¾M£¬K£¬4¡¿ \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.42/TestData_UDG.txt b/VisualC++/ExerciseBook/07.42/TestData_UDG.txt new file mode 100644 index 0000000..ecdc733 --- /dev/null +++ b/VisualC++/ExerciseBook/07.42/TestData_UDG.txt @@ -0,0 +1,6 @@ +ͼÀàÐÍ¡ú2£¨ÎÞÏòͼ£© +¶¥µãÊý¡ú14 +±ßÊý¡ú18 +±ßÊÇ·ñ´øÓÐÆäËûÐÅÏ¢¡ú0 +¶¥µã¼¯¡ú¡¾A£¬B£¬C£¬D£¬E£¬F£¬G£¬H£¬I£¬J£¬K£¬L£¬M£¬N¡¿ +±ßµÄ¼¯ºÏ¡ú¡¾A£¬C¡¿¡¾C£¬E¡¿¡¾E£¬I¡¿¡¾I£¬G¡¿¡¾G£¬D¡¿¡¾A£¬B¡¿¡¾C£¬B¡¿¡¾E£¬B¡¿¡¾E£¬H¡¿¡¾H£¬J¡¿¡¾J£¬D¡¿¡¾A£¬F¡¿¡¾F£¬I¡¿¡¾F£¬G¡¿¡¾L£¬M¡¿¡¾L£¬N¡¿¡¾M£¬N¡¿¡¾M£¬K¡¿ \ No newline at end of file diff --git a/VisualC++/ExerciseBook/07.42/TestData_UDN.txt b/VisualC++/ExerciseBook/07.42/TestData_UDN.txt new file mode 100644 index 0000000..9cce592 --- /dev/null +++ b/VisualC++/ExerciseBook/07.42/TestData_UDN.txt @@ -0,0 +1,6 @@ +ͼÀàÐÍ¡ú3£¨ÎÞÏòÍø£© +¶¥µãÊý¡ú14 +±ßÊý¡ú18 +±ßÊÇ·ñ´øÓÐÆäËûÐÅÏ¢¡ú1 +¶¥µã¼¯¡ú¡¾A£¬B£¬C£¬D£¬E£¬F£¬G£¬H£¬I£¬J£¬K£¬L£¬M£¬N¡¿ +±ßµÄ¼¯ºÏ¡ú¡¾A£¬C£¬2¡¿¡¾C£¬E£¬8¡¿¡¾E£¬I£¬4¡¿¡¾I£¬G£¬5¡¿¡¾G£¬D£¬2¡¿¡¾A£¬B£¬10¡¿¡¾C£¬B£¬5¡¿¡¾E£¬B£¬3¡¿¡¾E£¬H£¬3¡¿¡¾H£¬J£¬1¡¿¡¾J£¬D£¬2¡¿¡¾A£¬F£¬15¡¿¡¾F£¬I£¬3¡¿¡¾F£¬G£¬4¡¿¡¾L£¬M£¬10¡¿¡¾L£¬N£¬3¡¿¡¾M£¬N£¬2¡¿¡¾M£¬K£¬1¡¿ \ No newline at end of file diff --git a/VisualC++/ExerciseBook/ExerciseBook.sdf b/VisualC++/ExerciseBook/ExerciseBook.sdf index b416fe932cd07053cc50f6235f5fb698c4795450..d2b90af83ed8bc7cc717f56d4cff070c79ea7e7f 100644 GIT binary patch delta 742798 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 z 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�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 delta 140965 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 diff --git a/VisualC++/ExerciseBook/ExerciseBook.sln b/VisualC++/ExerciseBook/ExerciseBook.sln index 0999a8f..42272f7 100644 --- a/VisualC++/ExerciseBook/ExerciseBook.sln +++ b/VisualC++/ExerciseBook/ExerciseBook.sln @@ -239,6 +239,56 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "06.73-06.74", "06.73-06.74\ EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "06.75-06.76", "06.75-06.76\06.75-06.76.vcxproj", "{70DFF7ED-7543-4F3A-BE38-FCC77CD6D1E5}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "07.14+07.16", "07.14+07.16\07.14+07.16.vcxproj", "{B272A428-EFD7-4970-BBE1-A5F31E0C8911}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "07.15", "07.15\07.15.vcxproj", "{F2C7C449-A4B9-46D2-ACB6-D5A1C52F7814}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "07.17", "07.17\07.17.vcxproj", "{D1637FE7-8B48-4B0B-81A2-66984FE46CA4}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "07.18-07.19", "07.18-07.19\07.18-07.19.vcxproj", "{3FF8A41C-0672-4B72-8677-E8F0438B848F}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "07.20", "07.20\07.20.vcxproj", "{6B15728F-E00B-46B5-8961-E407695ABF7C}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "07.21", "07.21\07.21.vcxproj", "{F65B5E57-8A19-4D71-BCB7-C80BC575A47D}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "07.22-07.23", "07.22-07.23\07.22-07.23.vcxproj", "{B144CAC0-81E4-4F92-9E6D-252CC12F3FD4}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "07.24", "07.24\07.24.vcxproj", "{D2C4BE28-73F2-49EE-B61C-3668CE1D790D}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "07.25", "07.25\07.25.vcxproj", "{299C3272-DB66-4B45-9444-7BFFE0B67E0E}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "07.26", "07.26\07.26.vcxproj", "{CFBDCCF8-D245-46A4-9840-485429938441}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "07.27", "07.27\07.27.vcxproj", "{1C7805E6-3FDA-414E-89AD-081A1F15898A}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "07.28", "07.28\07.28.vcxproj", "{924160F4-B4AF-44AF-B599-09F1713B1270}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "07.29", "07.29\07.29.vcxproj", "{1053D204-9B69-40BF-92CC-860752E200D0}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "07.30", "07.30\07.30.vcxproj", "{4C169B2E-6DE8-4BFA-AAE1-45F64C042136}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "07.31", "07.31\07.31.vcxproj", "{13AD1B48-1644-461F-9C16-B64FE5B12D79}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "07.32", "07.32\07.32.vcxproj", "{529A9C3D-E429-4128-911B-3D68F7FC0FDB}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "07.33", "07.33\07.33.vcxproj", "{82288C1F-279B-4FE6-AC8A-18B4FDAB7BE1}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "07.34", "07.34\07.34.vcxproj", "{B09BB515-33BE-468C-8290-81FC322805E0}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "07.35", "07.35\07.35.vcxproj", "{A1E2C405-8E90-4B6D-AC8F-FF259A7629AC}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "07.36-07.37", "07.36-07.37\07.36-07.37.vcxproj", "{707A6B90-9FB4-4CF4-9ACA-6222CFA18D9A}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "07.38", "07.38\07.38.vcxproj", "{D5D2D36F-358D-43FA-B296-7192867B7224}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "07.39", "07.39\07.39.vcxproj", "{82014D93-91CF-49B8-A063-648FF219A996}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "07.40", "07.40\07.40.vcxproj", "{C3FC2734-BCD5-403A-BE50-7C874F93BDB3}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "07.41", "07.41\07.41.vcxproj", "{CCF3A00A-FFE1-4941-8A57-5F71EDDFC3D9}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "07.42", "07.42\07.42.vcxproj", "{80E94E2F-B06C-4B8B-9B6C-88F9FE66B09B}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 @@ -721,6 +771,106 @@ Global {70DFF7ED-7543-4F3A-BE38-FCC77CD6D1E5}.Debug|Win32.Build.0 = Debug|Win32 {70DFF7ED-7543-4F3A-BE38-FCC77CD6D1E5}.Release|Win32.ActiveCfg = Release|Win32 {70DFF7ED-7543-4F3A-BE38-FCC77CD6D1E5}.Release|Win32.Build.0 = Release|Win32 + {B272A428-EFD7-4970-BBE1-A5F31E0C8911}.Debug|Win32.ActiveCfg = Debug|Win32 + {B272A428-EFD7-4970-BBE1-A5F31E0C8911}.Debug|Win32.Build.0 = Debug|Win32 + {B272A428-EFD7-4970-BBE1-A5F31E0C8911}.Release|Win32.ActiveCfg = Release|Win32 + {B272A428-EFD7-4970-BBE1-A5F31E0C8911}.Release|Win32.Build.0 = Release|Win32 + {F2C7C449-A4B9-46D2-ACB6-D5A1C52F7814}.Debug|Win32.ActiveCfg = Debug|Win32 + {F2C7C449-A4B9-46D2-ACB6-D5A1C52F7814}.Debug|Win32.Build.0 = Debug|Win32 + {F2C7C449-A4B9-46D2-ACB6-D5A1C52F7814}.Release|Win32.ActiveCfg = Release|Win32 + {F2C7C449-A4B9-46D2-ACB6-D5A1C52F7814}.Release|Win32.Build.0 = Release|Win32 + {D1637FE7-8B48-4B0B-81A2-66984FE46CA4}.Debug|Win32.ActiveCfg = Debug|Win32 + {D1637FE7-8B48-4B0B-81A2-66984FE46CA4}.Debug|Win32.Build.0 = Debug|Win32 + {D1637FE7-8B48-4B0B-81A2-66984FE46CA4}.Release|Win32.ActiveCfg = Release|Win32 + {D1637FE7-8B48-4B0B-81A2-66984FE46CA4}.Release|Win32.Build.0 = Release|Win32 + {3FF8A41C-0672-4B72-8677-E8F0438B848F}.Debug|Win32.ActiveCfg = Debug|Win32 + {3FF8A41C-0672-4B72-8677-E8F0438B848F}.Debug|Win32.Build.0 = Debug|Win32 + {3FF8A41C-0672-4B72-8677-E8F0438B848F}.Release|Win32.ActiveCfg = Release|Win32 + {3FF8A41C-0672-4B72-8677-E8F0438B848F}.Release|Win32.Build.0 = Release|Win32 + {6B15728F-E00B-46B5-8961-E407695ABF7C}.Debug|Win32.ActiveCfg = Debug|Win32 + {6B15728F-E00B-46B5-8961-E407695ABF7C}.Debug|Win32.Build.0 = Debug|Win32 + {6B15728F-E00B-46B5-8961-E407695ABF7C}.Release|Win32.ActiveCfg = Release|Win32 + {6B15728F-E00B-46B5-8961-E407695ABF7C}.Release|Win32.Build.0 = Release|Win32 + {F65B5E57-8A19-4D71-BCB7-C80BC575A47D}.Debug|Win32.ActiveCfg = Debug|Win32 + {F65B5E57-8A19-4D71-BCB7-C80BC575A47D}.Debug|Win32.Build.0 = Debug|Win32 + {F65B5E57-8A19-4D71-BCB7-C80BC575A47D}.Release|Win32.ActiveCfg = Release|Win32 + {F65B5E57-8A19-4D71-BCB7-C80BC575A47D}.Release|Win32.Build.0 = Release|Win32 + {B144CAC0-81E4-4F92-9E6D-252CC12F3FD4}.Debug|Win32.ActiveCfg = Debug|Win32 + {B144CAC0-81E4-4F92-9E6D-252CC12F3FD4}.Debug|Win32.Build.0 = Debug|Win32 + {B144CAC0-81E4-4F92-9E6D-252CC12F3FD4}.Release|Win32.ActiveCfg = Release|Win32 + {B144CAC0-81E4-4F92-9E6D-252CC12F3FD4}.Release|Win32.Build.0 = Release|Win32 + {D2C4BE28-73F2-49EE-B61C-3668CE1D790D}.Debug|Win32.ActiveCfg = Debug|Win32 + {D2C4BE28-73F2-49EE-B61C-3668CE1D790D}.Debug|Win32.Build.0 = Debug|Win32 + {D2C4BE28-73F2-49EE-B61C-3668CE1D790D}.Release|Win32.ActiveCfg = Release|Win32 + {D2C4BE28-73F2-49EE-B61C-3668CE1D790D}.Release|Win32.Build.0 = Release|Win32 + {299C3272-DB66-4B45-9444-7BFFE0B67E0E}.Debug|Win32.ActiveCfg = Debug|Win32 + {299C3272-DB66-4B45-9444-7BFFE0B67E0E}.Debug|Win32.Build.0 = Debug|Win32 + {299C3272-DB66-4B45-9444-7BFFE0B67E0E}.Release|Win32.ActiveCfg = Release|Win32 + {299C3272-DB66-4B45-9444-7BFFE0B67E0E}.Release|Win32.Build.0 = Release|Win32 + {CFBDCCF8-D245-46A4-9840-485429938441}.Debug|Win32.ActiveCfg = Debug|Win32 + {CFBDCCF8-D245-46A4-9840-485429938441}.Debug|Win32.Build.0 = Debug|Win32 + {CFBDCCF8-D245-46A4-9840-485429938441}.Release|Win32.ActiveCfg = Release|Win32 + {CFBDCCF8-D245-46A4-9840-485429938441}.Release|Win32.Build.0 = Release|Win32 + {1C7805E6-3FDA-414E-89AD-081A1F15898A}.Debug|Win32.ActiveCfg = Debug|Win32 + {1C7805E6-3FDA-414E-89AD-081A1F15898A}.Debug|Win32.Build.0 = Debug|Win32 + {1C7805E6-3FDA-414E-89AD-081A1F15898A}.Release|Win32.ActiveCfg = Release|Win32 + {1C7805E6-3FDA-414E-89AD-081A1F15898A}.Release|Win32.Build.0 = Release|Win32 + {924160F4-B4AF-44AF-B599-09F1713B1270}.Debug|Win32.ActiveCfg = Debug|Win32 + {924160F4-B4AF-44AF-B599-09F1713B1270}.Debug|Win32.Build.0 = Debug|Win32 + {924160F4-B4AF-44AF-B599-09F1713B1270}.Release|Win32.ActiveCfg = Release|Win32 + {924160F4-B4AF-44AF-B599-09F1713B1270}.Release|Win32.Build.0 = Release|Win32 + {1053D204-9B69-40BF-92CC-860752E200D0}.Debug|Win32.ActiveCfg = Debug|Win32 + {1053D204-9B69-40BF-92CC-860752E200D0}.Debug|Win32.Build.0 = Debug|Win32 + {1053D204-9B69-40BF-92CC-860752E200D0}.Release|Win32.ActiveCfg = Release|Win32 + {1053D204-9B69-40BF-92CC-860752E200D0}.Release|Win32.Build.0 = Release|Win32 + {4C169B2E-6DE8-4BFA-AAE1-45F64C042136}.Debug|Win32.ActiveCfg = Debug|Win32 + {4C169B2E-6DE8-4BFA-AAE1-45F64C042136}.Debug|Win32.Build.0 = Debug|Win32 + {4C169B2E-6DE8-4BFA-AAE1-45F64C042136}.Release|Win32.ActiveCfg = Release|Win32 + {4C169B2E-6DE8-4BFA-AAE1-45F64C042136}.Release|Win32.Build.0 = Release|Win32 + {13AD1B48-1644-461F-9C16-B64FE5B12D79}.Debug|Win32.ActiveCfg = Debug|Win32 + {13AD1B48-1644-461F-9C16-B64FE5B12D79}.Debug|Win32.Build.0 = Debug|Win32 + {13AD1B48-1644-461F-9C16-B64FE5B12D79}.Release|Win32.ActiveCfg = Release|Win32 + {13AD1B48-1644-461F-9C16-B64FE5B12D79}.Release|Win32.Build.0 = Release|Win32 + {529A9C3D-E429-4128-911B-3D68F7FC0FDB}.Debug|Win32.ActiveCfg = Debug|Win32 + {529A9C3D-E429-4128-911B-3D68F7FC0FDB}.Debug|Win32.Build.0 = Debug|Win32 + {529A9C3D-E429-4128-911B-3D68F7FC0FDB}.Release|Win32.ActiveCfg = Release|Win32 + {529A9C3D-E429-4128-911B-3D68F7FC0FDB}.Release|Win32.Build.0 = Release|Win32 + {82288C1F-279B-4FE6-AC8A-18B4FDAB7BE1}.Debug|Win32.ActiveCfg = Debug|Win32 + {82288C1F-279B-4FE6-AC8A-18B4FDAB7BE1}.Debug|Win32.Build.0 = Debug|Win32 + {82288C1F-279B-4FE6-AC8A-18B4FDAB7BE1}.Release|Win32.ActiveCfg = Release|Win32 + {82288C1F-279B-4FE6-AC8A-18B4FDAB7BE1}.Release|Win32.Build.0 = Release|Win32 + {B09BB515-33BE-468C-8290-81FC322805E0}.Debug|Win32.ActiveCfg = Debug|Win32 + {B09BB515-33BE-468C-8290-81FC322805E0}.Debug|Win32.Build.0 = Debug|Win32 + {B09BB515-33BE-468C-8290-81FC322805E0}.Release|Win32.ActiveCfg = Release|Win32 + {B09BB515-33BE-468C-8290-81FC322805E0}.Release|Win32.Build.0 = Release|Win32 + {A1E2C405-8E90-4B6D-AC8F-FF259A7629AC}.Debug|Win32.ActiveCfg = Debug|Win32 + {A1E2C405-8E90-4B6D-AC8F-FF259A7629AC}.Debug|Win32.Build.0 = Debug|Win32 + {A1E2C405-8E90-4B6D-AC8F-FF259A7629AC}.Release|Win32.ActiveCfg = Release|Win32 + {A1E2C405-8E90-4B6D-AC8F-FF259A7629AC}.Release|Win32.Build.0 = Release|Win32 + {707A6B90-9FB4-4CF4-9ACA-6222CFA18D9A}.Debug|Win32.ActiveCfg = Debug|Win32 + {707A6B90-9FB4-4CF4-9ACA-6222CFA18D9A}.Debug|Win32.Build.0 = Debug|Win32 + {707A6B90-9FB4-4CF4-9ACA-6222CFA18D9A}.Release|Win32.ActiveCfg = Release|Win32 + {707A6B90-9FB4-4CF4-9ACA-6222CFA18D9A}.Release|Win32.Build.0 = Release|Win32 + {D5D2D36F-358D-43FA-B296-7192867B7224}.Debug|Win32.ActiveCfg = Debug|Win32 + {D5D2D36F-358D-43FA-B296-7192867B7224}.Debug|Win32.Build.0 = Debug|Win32 + {D5D2D36F-358D-43FA-B296-7192867B7224}.Release|Win32.ActiveCfg = Release|Win32 + {D5D2D36F-358D-43FA-B296-7192867B7224}.Release|Win32.Build.0 = Release|Win32 + {82014D93-91CF-49B8-A063-648FF219A996}.Debug|Win32.ActiveCfg = Debug|Win32 + {82014D93-91CF-49B8-A063-648FF219A996}.Debug|Win32.Build.0 = Debug|Win32 + {82014D93-91CF-49B8-A063-648FF219A996}.Release|Win32.ActiveCfg = Release|Win32 + {82014D93-91CF-49B8-A063-648FF219A996}.Release|Win32.Build.0 = Release|Win32 + {C3FC2734-BCD5-403A-BE50-7C874F93BDB3}.Debug|Win32.ActiveCfg = Debug|Win32 + {C3FC2734-BCD5-403A-BE50-7C874F93BDB3}.Debug|Win32.Build.0 = Debug|Win32 + {C3FC2734-BCD5-403A-BE50-7C874F93BDB3}.Release|Win32.ActiveCfg = Release|Win32 + {C3FC2734-BCD5-403A-BE50-7C874F93BDB3}.Release|Win32.Build.0 = Release|Win32 + {CCF3A00A-FFE1-4941-8A57-5F71EDDFC3D9}.Debug|Win32.ActiveCfg = Debug|Win32 + {CCF3A00A-FFE1-4941-8A57-5F71EDDFC3D9}.Debug|Win32.Build.0 = Debug|Win32 + {CCF3A00A-FFE1-4941-8A57-5F71EDDFC3D9}.Release|Win32.ActiveCfg = Release|Win32 + {CCF3A00A-FFE1-4941-8A57-5F71EDDFC3D9}.Release|Win32.Build.0 = Release|Win32 + {80E94E2F-B06C-4B8B-9B6C-88F9FE66B09B}.Debug|Win32.ActiveCfg = Debug|Win32 + {80E94E2F-B06C-4B8B-9B6C-88F9FE66B09B}.Debug|Win32.Build.0 = Debug|Win32 + {80E94E2F-B06C-4B8B-9B6C-88F9FE66B09B}.Release|Win32.ActiveCfg = Release|Win32 + {80E94E2F-B06C-4B8B-9B6C-88F9FE66B09B}.Release|Win32.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/VisualC++/ExerciseBook/ExerciseBook.suo b/VisualC++/ExerciseBook/ExerciseBook.suo index 52478040633361ca9478c6c1b6c5010b0a530142..4d00d8f631dddc25ac979aeb5e6a281fcaa780ae 100644 GIT binary patch delta 14779 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 G5%?cuK%+ze delta 1965 zcmX|Ce@t7~6@KU5^InXxh)W#T1&12q21X1q#{5V~fe?c-geYN2#x~D$P{yXpqAsFo zL|NuWQ9=^}hD$gNOQ}Ve8%^uPcw25&r3iIV)KzIlP!{!%tjkhqo1$rpBCU!dN_I`M zzNaIdd*0E}ec$=ccM=yJi7UBDALwIcmA^f79>x+l&h}(&(ljlmY@^uAp4ZnauRy%U z8nSAXxBB?;W54)_8jP4q&TcNr9$it1~V9ig4?W5ef(WG zEXF2&AsTm}x$t!pQuIyMNuDqwt?mUor92Gf%Lu>2Nd`WBMge?=Dj0l6Z&L0BdW%7^ z@ek!*)#ws~yT+*U{Xo+ky6M;y_+@(*%rlBQ`4)=rM?2-628T$!h_by6mN0DtW1U~C z)XKFAI=Bl?%0w>o!T5i?((8cRK%FiK%XTNs^0XU}mI}b2dvUZ&XA#_kv^=G8uiDjBX<31f;is>%9jJV37}=gB(U3`EYiEd!d@qoip4i+xNjd7xrznv}l1Ry_Ovjm;{OD0c&i>JE)vlPp<*Om2%itd+W*9cq$3cLZ0wBlk8n)@l@r3n>V`{O9w zE*5>~e6nB&ZmL@sGpAfQ3->t9w1P)^l5mHMNZ3n8jCo|}DqIG-cn-QK6@nIpjY<#a zur@tC1s-AzaDtL=qm_CiXpis@?q{G1`6_5sve56oob+U++j(gPzWJpbOc9ug+ zH5}!Kg)FJl&2!)*f0DP7KZ=&gLT;5|8&`lGI`(u9XlXOgmDTI{JQDjBbJ7P0s0A8?0KE0#VaIz3SQVMvXtz(o)kLDyyjqR+a@@DtDDNHCNV_wd~$q zQ?ol%9ja)q`q`kry1b^U%wH`VqHOzly0XIjV+n`6yuxCJJ0n#$RJqTTU03!eWlPF3 zaT(&g#3KG^uMvLC5}x-R@P)Xsxq-UF*hB3OMdzDa`Ego`BFYmR`PHp!s*s%L0om2W z@4}NoZ?q{)E5d3?Yq!VI(RSCf{C{nB79a21cWle-dymAo6>CIpA*Xa7BQi$+2 ztGs!R4`k8BD7eIu-T#gG6{Qn@Q|hfQVa;S0$cb5w5nHBjCG1K6XqMrGo{6lEz4`}A z=vXbQ5pzq?rs%V_b7X%x{*#R*W<}!knt&U0{VXq$Qvv*q1!olzo~G5|HK&L@Z=+x9 z=rZlW^C0IVcxpWzvhhAy`wAXer}jr59UVp2nzViLIz~{=4Px3Zf@jwz!zpnTSL~u= zr-hP-mAu;S;t(l%DD1`+jKMGQ8v90cyieDY`YdeQpA