From ac49fde6bd477c27bf26245850a8a8bcc5e017b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BA=B7=E5=BB=BA=E4=BC=9F?= Date: Fri, 15 Nov 2019 13:27:08 +0800 Subject: [PATCH] =?UTF-8?q?:bulb:=20<05=20=E6=95=B0=E6=8D=AE=E5=92=8C?= =?UTF-8?q?=E5=B9=BF=E4=B9=89=E8=A1=A8>=E4=B9=A0=E9=A2=98=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CLion/ExerciseBook/05.17/05.17.c | 137 +++ CLion/ExerciseBook/05.17/CMakeLists.txt | 7 + CLion/ExerciseBook/05.17/SqList.c | 337 +++++++ CLion/ExerciseBook/05.17/SqList.h | 149 +++ CLion/ExerciseBook/05.18/05.18.c | 91 ++ CLion/ExerciseBook/05.18/Array.c | 195 ++++ CLion/ExerciseBook/05.18/Array.h | 70 ++ CLion/ExerciseBook/05.18/CMakeLists.txt | 7 + CLion/ExerciseBook/05.19/05.19.c | 114 +++ CLion/ExerciseBook/05.19/Array.c | 178 ++++ CLion/ExerciseBook/05.19/Array.h | 62 ++ CLion/ExerciseBook/05.19/CMakeLists.txt | 7 + CLion/ExerciseBook/05.20/05.20.c | 112 +++ CLion/ExerciseBook/05.20/Array.c | 178 ++++ CLion/ExerciseBook/05.20/Array.h | 62 ++ CLion/ExerciseBook/05.20/CMakeLists.txt | 7 + CLion/ExerciseBook/05.21/05.21.c | 43 + CLion/ExerciseBook/05.21/CMakeLists.txt | 13 + CLion/ExerciseBook/05.21/TSMatrix.c | 433 +++++++++ CLion/ExerciseBook/05.21/TSMatrix.h | 104 ++ CLion/ExerciseBook/05.21/TestData_A.txt | 4 + CLion/ExerciseBook/05.21/TestData_B.txt | 4 + CLion/ExerciseBook/05.22/05.22.c | 106 +++ CLion/ExerciseBook/05.22/CMakeLists.txt | 13 + CLion/ExerciseBook/05.22/TSMatrix.c | 433 +++++++++ CLion/ExerciseBook/05.22/TSMatrix.h | 104 ++ CLion/ExerciseBook/05.22/TestData_A.txt | 4 + CLion/ExerciseBook/05.22/TestData_B.txt | 4 + CLion/ExerciseBook/05.23/05.23.c | 52 + CLion/ExerciseBook/05.23/CMakeLists.txt | 13 + CLion/ExerciseBook/05.23/RLSMatrix.c | 515 ++++++++++ CLion/ExerciseBook/05.23/RLSMatrix.h | 107 +++ CLion/ExerciseBook/05.23/TestData_M.txt | 4 + CLion/ExerciseBook/05.24/05.24.c | 49 + CLion/ExerciseBook/05.24/CMakeLists.txt | 13 + CLion/ExerciseBook/05.24/SMatrix.c | 44 + CLion/ExerciseBook/05.24/SMatrix.h | 32 + CLion/ExerciseBook/05.24/TestData_M.txt | 4 + CLion/ExerciseBook/05.25/05.25.c | 79 ++ CLion/ExerciseBook/05.25/CMakeLists.txt | 13 + CLion/ExerciseBook/05.25/SMatrix.c | 48 + CLion/ExerciseBook/05.25/SMatrix.h | 32 + CLion/ExerciseBook/05.25/TestData_M.txt | 4 + CLion/ExerciseBook/05.25/TestData_N.txt | 4 + CLion/ExerciseBook/05.26/05.26.c | 49 + CLion/ExerciseBook/05.26/CMakeLists.txt | 13 + CLion/ExerciseBook/05.26/CrossList.c | 885 ++++++++++++++++++ CLion/ExerciseBook/05.26/CrossList.h | 94 ++ CLion/ExerciseBook/05.26/TestData_M.txt | 4 + CLion/ExerciseBook/05.27/05.27.c | 41 + CLion/ExerciseBook/05.27/CMakeLists.txt | 13 + CLion/ExerciseBook/05.27/CrossList.c | 885 ++++++++++++++++++ CLion/ExerciseBook/05.27/CrossList.h | 94 ++ CLion/ExerciseBook/05.27/TestData_M.txt | 4 + CLion/ExerciseBook/05.27/TestData_N.txt | 4 + CLion/ExerciseBook/05.28-05.29/05.28-05.29.c | 336 +++++++ CLion/ExerciseBook/05.28-05.29/CMakeLists.txt | 7 + CLion/ExerciseBook/05.28-05.29/MPList.c | 233 +++++ CLion/ExerciseBook/05.28-05.29/MPList.h | 97 ++ CLion/ExerciseBook/05.28-05.29/StringUtil.c | 160 ++++ CLion/ExerciseBook/05.28-05.29/StringUtil.h | 58 ++ CLion/ExerciseBook/05.30.1/05.30.1.c | 42 + CLion/ExerciseBook/05.30.1/CMakeLists.txt | 7 + CLion/ExerciseBook/05.30.1/GList-HT.c | 418 +++++++++ CLion/ExerciseBook/05.30.1/GList-HT.h | 164 ++++ CLion/ExerciseBook/05.30.1/SString.c | 195 ++++ CLion/ExerciseBook/05.30.1/SString.h | 117 +++ CLion/ExerciseBook/05.30.2/05.30.2.c | 42 + CLion/ExerciseBook/05.30.2/CMakeLists.txt | 7 + CLion/ExerciseBook/05.30.2/GList-E.c | 449 +++++++++ CLion/ExerciseBook/05.30.2/GList-E.h | 146 +++ CLion/ExerciseBook/05.30.2/SString.c | 195 ++++ CLion/ExerciseBook/05.30.2/SString.h | 117 +++ CLion/ExerciseBook/05.31/05.31.c | 43 + CLion/ExerciseBook/05.31/CMakeLists.txt | 7 + CLion/ExerciseBook/05.31/GList-E.c | 449 +++++++++ CLion/ExerciseBook/05.31/GList-E.h | 146 +++ CLion/ExerciseBook/05.31/SString.c | 195 ++++ CLion/ExerciseBook/05.31/SString.h | 117 +++ CLion/ExerciseBook/05.32.1/05.32.1.c | 64 ++ CLion/ExerciseBook/05.32.1/CMakeLists.txt | 7 + CLion/ExerciseBook/05.32.1/GList-HT.c | 418 +++++++++ CLion/ExerciseBook/05.32.1/GList-HT.h | 164 ++++ CLion/ExerciseBook/05.32.1/SString.c | 195 ++++ CLion/ExerciseBook/05.32.1/SString.h | 117 +++ CLion/ExerciseBook/05.32.2/05.32.2.c | 66 ++ CLion/ExerciseBook/05.32.2/CMakeLists.txt | 7 + CLion/ExerciseBook/05.32.2/GList-E.c | 449 +++++++++ CLion/ExerciseBook/05.32.2/GList-E.h | 146 +++ CLion/ExerciseBook/05.32.2/SString.c | 195 ++++ CLion/ExerciseBook/05.32.2/SString.h | 117 +++ CLion/ExerciseBook/05.33.1/05.33.1.c | 47 + CLion/ExerciseBook/05.33.1/CMakeLists.txt | 7 + CLion/ExerciseBook/05.33.1/GList-HT.c | 418 +++++++++ CLion/ExerciseBook/05.33.1/GList-HT.h | 164 ++++ CLion/ExerciseBook/05.33.1/SString.c | 195 ++++ CLion/ExerciseBook/05.33.1/SString.h | 117 +++ CLion/ExerciseBook/05.33.2/05.33.2.c | 48 + CLion/ExerciseBook/05.33.2/CMakeLists.txt | 7 + CLion/ExerciseBook/05.33.2/GList-E.c | 449 +++++++++ CLion/ExerciseBook/05.33.2/GList-E.h | 146 +++ CLion/ExerciseBook/05.33.2/SString.c | 195 ++++ CLion/ExerciseBook/05.33.2/SString.h | 117 +++ CLion/ExerciseBook/05.34.1/05.34.1.c | 62 ++ CLion/ExerciseBook/05.34.1/CMakeLists.txt | 7 + CLion/ExerciseBook/05.34.1/GList-HT.c | 418 +++++++++ CLion/ExerciseBook/05.34.1/GList-HT.h | 164 ++++ CLion/ExerciseBook/05.34.1/SString.c | 195 ++++ CLion/ExerciseBook/05.34.1/SString.h | 117 +++ CLion/ExerciseBook/05.34.2/05.34.2.c | 61 ++ CLion/ExerciseBook/05.34.2/CMakeLists.txt | 7 + CLion/ExerciseBook/05.34.2/GList-E.c | 449 +++++++++ CLion/ExerciseBook/05.34.2/GList-E.h | 146 +++ CLion/ExerciseBook/05.34.2/SString.c | 195 ++++ CLion/ExerciseBook/05.34.2/SString.h | 117 +++ CLion/ExerciseBook/05.35-05.36/05.35-05.36.c | 45 + CLion/ExerciseBook/05.35-05.36/CMakeLists.txt | 7 + CLion/ExerciseBook/05.35-05.36/GList.c | 179 ++++ CLion/ExerciseBook/05.35-05.36/GList.h | 82 ++ CLion/ExerciseBook/05.35-05.36/SString.c | 195 ++++ CLion/ExerciseBook/05.35-05.36/SString.h | 117 +++ CLion/ExerciseBook/05.37.1/05.37.1.c | 63 ++ CLion/ExerciseBook/05.37.1/CMakeLists.txt | 7 + CLion/ExerciseBook/05.37.1/GList-HT.c | 418 +++++++++ CLion/ExerciseBook/05.37.1/GList-HT.h | 164 ++++ CLion/ExerciseBook/05.37.1/SString.c | 195 ++++ CLion/ExerciseBook/05.37.1/SString.h | 117 +++ CLion/ExerciseBook/05.37.2/05.37.2.c | 56 ++ CLion/ExerciseBook/05.37.2/CMakeLists.txt | 7 + CLion/ExerciseBook/05.37.2/GList-E.c | 449 +++++++++ CLion/ExerciseBook/05.37.2/GList-E.h | 146 +++ CLion/ExerciseBook/05.37.2/SString.c | 195 ++++ CLion/ExerciseBook/05.37.2/SString.h | 117 +++ CLion/ExerciseBook/05.38.1/05.38.1.c | 47 + CLion/ExerciseBook/05.38.1/CMakeLists.txt | 7 + CLion/ExerciseBook/05.38.1/GList-HT.c | 418 +++++++++ CLion/ExerciseBook/05.38.1/GList-HT.h | 164 ++++ CLion/ExerciseBook/05.38.1/SString.c | 195 ++++ CLion/ExerciseBook/05.38.1/SString.h | 117 +++ CLion/ExerciseBook/05.38.2/05.38.2.c | 48 + CLion/ExerciseBook/05.38.2/CMakeLists.txt | 7 + CLion/ExerciseBook/05.38.2/GList-E.c | 449 +++++++++ CLion/ExerciseBook/05.38.2/GList-E.h | 146 +++ CLion/ExerciseBook/05.38.2/SString.c | 195 ++++ CLion/ExerciseBook/05.38.2/SString.h | 117 +++ CLion/ExerciseBook/CMakeLists.txt | 27 + Dev-C++/ExerciseBook/05.17/05.17.cpp | 137 +++ Dev-C++/ExerciseBook/05.17/05.17.dev | 82 ++ Dev-C++/ExerciseBook/05.17/SqList.cpp | 337 +++++++ Dev-C++/ExerciseBook/05.17/SqList.h | 149 +++ Dev-C++/ExerciseBook/05.18/05.18.cpp | 91 ++ Dev-C++/ExerciseBook/05.18/05.18.dev | 82 ++ Dev-C++/ExerciseBook/05.18/Array.cpp | 195 ++++ Dev-C++/ExerciseBook/05.18/Array.h | 70 ++ Dev-C++/ExerciseBook/05.19/05.19.cpp | 114 +++ Dev-C++/ExerciseBook/05.19/05.19.dev | 82 ++ Dev-C++/ExerciseBook/05.19/Array.cpp | 178 ++++ Dev-C++/ExerciseBook/05.19/Array.h | 62 ++ Dev-C++/ExerciseBook/05.20/05.20.cpp | 112 +++ Dev-C++/ExerciseBook/05.20/05.20.dev | 82 ++ Dev-C++/ExerciseBook/05.20/Array.cpp | 178 ++++ Dev-C++/ExerciseBook/05.20/Array.h | 62 ++ Dev-C++/ExerciseBook/05.21/05.21.cpp | 43 + Dev-C++/ExerciseBook/05.21/05.21.dev | 100 ++ Dev-C++/ExerciseBook/05.21/TSMatrix.cpp | 433 +++++++++ Dev-C++/ExerciseBook/05.21/TSMatrix.h | 107 +++ Dev-C++/ExerciseBook/05.21/TestData_A.txt | 4 + Dev-C++/ExerciseBook/05.21/TestData_B.txt | 4 + Dev-C++/ExerciseBook/05.22/05.22.cpp | 106 +++ Dev-C++/ExerciseBook/05.22/05.22.dev | 100 ++ Dev-C++/ExerciseBook/05.22/TSMatrix.cpp | 433 +++++++++ Dev-C++/ExerciseBook/05.22/TSMatrix.h | 107 +++ Dev-C++/ExerciseBook/05.22/TestData_A.txt | 4 + Dev-C++/ExerciseBook/05.22/TestData_B.txt | 4 + Dev-C++/ExerciseBook/05.23/05.23.cpp | 52 + Dev-C++/ExerciseBook/05.23/05.23.dev | 91 ++ Dev-C++/ExerciseBook/05.23/RLSMatrix.cpp | 515 ++++++++++ Dev-C++/ExerciseBook/05.23/RLSMatrix.h | 107 +++ Dev-C++/ExerciseBook/05.23/TestData_M.txt | 4 + Dev-C++/ExerciseBook/05.24/05.24.cpp | 49 + Dev-C++/ExerciseBook/05.24/05.24.dev | 91 ++ Dev-C++/ExerciseBook/05.24/SMatrix.cpp | 44 + Dev-C++/ExerciseBook/05.24/SMatrix.h | 32 + Dev-C++/ExerciseBook/05.24/TestData_M.txt | 4 + Dev-C++/ExerciseBook/05.25/05.25.cpp | 79 ++ Dev-C++/ExerciseBook/05.25/05.25.dev | 100 ++ Dev-C++/ExerciseBook/05.25/SMatrix.cpp | 48 + Dev-C++/ExerciseBook/05.25/SMatrix.h | 32 + Dev-C++/ExerciseBook/05.25/TestData_M.txt | 4 + Dev-C++/ExerciseBook/05.25/TestData_N.txt | 4 + Dev-C++/ExerciseBook/05.26/05.26.cpp | 49 + Dev-C++/ExerciseBook/05.26/05.26.dev | 91 ++ Dev-C++/ExerciseBook/05.26/CrossList.cpp | 885 ++++++++++++++++++ Dev-C++/ExerciseBook/05.26/CrossList.h | 94 ++ Dev-C++/ExerciseBook/05.26/TestData_M.txt | 4 + Dev-C++/ExerciseBook/05.27/05.27.cpp | 41 + Dev-C++/ExerciseBook/05.27/05.27.dev | 100 ++ Dev-C++/ExerciseBook/05.27/CrossList.cpp | 885 ++++++++++++++++++ Dev-C++/ExerciseBook/05.27/CrossList.h | 94 ++ Dev-C++/ExerciseBook/05.27/TestData_M.txt | 4 + Dev-C++/ExerciseBook/05.27/TestData_N.txt | 4 + .../ExerciseBook/05.28-05.29/05.28-05.29.cpp | 336 +++++++ .../ExerciseBook/05.28-05.29/05.28-05.29.dev | 102 ++ Dev-C++/ExerciseBook/05.28-05.29/MPList.cpp | 233 +++++ Dev-C++/ExerciseBook/05.28-05.29/MPList.h | 97 ++ .../ExerciseBook/05.28-05.29/StringUtil.cpp | 160 ++++ Dev-C++/ExerciseBook/05.28-05.29/StringUtil.h | 58 ++ Dev-C++/ExerciseBook/05.30.1/05.30.1.cpp | 42 + Dev-C++/ExerciseBook/05.30.1/05.30.1.dev | 102 ++ Dev-C++/ExerciseBook/05.30.1/GList-HT.cpp | 418 +++++++++ Dev-C++/ExerciseBook/05.30.1/GList-HT.h | 164 ++++ Dev-C++/ExerciseBook/05.30.1/SString.cpp | 195 ++++ Dev-C++/ExerciseBook/05.30.1/SString.h | 117 +++ Dev-C++/ExerciseBook/05.30.2/05.30.2.cpp | 42 + Dev-C++/ExerciseBook/05.30.2/05.30.2.dev | 102 ++ Dev-C++/ExerciseBook/05.30.2/GList-E.cpp | 449 +++++++++ Dev-C++/ExerciseBook/05.30.2/GList-E.h | 146 +++ Dev-C++/ExerciseBook/05.30.2/SString.cpp | 195 ++++ Dev-C++/ExerciseBook/05.30.2/SString.h | 117 +++ Dev-C++/ExerciseBook/05.31/05.31.cpp | 43 + Dev-C++/ExerciseBook/05.31/05.31.dev | 102 ++ Dev-C++/ExerciseBook/05.31/GList-E.cpp | 449 +++++++++ Dev-C++/ExerciseBook/05.31/GList-E.h | 146 +++ Dev-C++/ExerciseBook/05.31/SString.cpp | 195 ++++ Dev-C++/ExerciseBook/05.31/SString.h | 117 +++ Dev-C++/ExerciseBook/05.32.1/05.32.1.cpp | 64 ++ Dev-C++/ExerciseBook/05.32.1/05.32.1.dev | 102 ++ Dev-C++/ExerciseBook/05.32.1/GList-HT.cpp | 418 +++++++++ Dev-C++/ExerciseBook/05.32.1/GList-HT.h | 164 ++++ Dev-C++/ExerciseBook/05.32.1/SString.cpp | 195 ++++ Dev-C++/ExerciseBook/05.32.1/SString.h | 117 +++ Dev-C++/ExerciseBook/05.32.2/05.32.2.cpp | 66 ++ Dev-C++/ExerciseBook/05.32.2/05.32.2.dev | 102 ++ Dev-C++/ExerciseBook/05.32.2/GList-E.cpp | 449 +++++++++ Dev-C++/ExerciseBook/05.32.2/GList-E.h | 146 +++ Dev-C++/ExerciseBook/05.32.2/SString.cpp | 195 ++++ Dev-C++/ExerciseBook/05.32.2/SString.h | 117 +++ Dev-C++/ExerciseBook/05.33.1/05.33.1.cpp | 47 + Dev-C++/ExerciseBook/05.33.1/05.33.1.dev | 102 ++ Dev-C++/ExerciseBook/05.33.1/GList-HT.cpp | 418 +++++++++ Dev-C++/ExerciseBook/05.33.1/GList-HT.h | 164 ++++ Dev-C++/ExerciseBook/05.33.1/SString.cpp | 195 ++++ Dev-C++/ExerciseBook/05.33.1/SString.h | 117 +++ Dev-C++/ExerciseBook/05.33.2/05.33.2.cpp | 48 + Dev-C++/ExerciseBook/05.33.2/05.33.2.dev | 102 ++ Dev-C++/ExerciseBook/05.33.2/GList-E.cpp | 449 +++++++++ Dev-C++/ExerciseBook/05.33.2/GList-E.h | 146 +++ Dev-C++/ExerciseBook/05.33.2/SString.cpp | 195 ++++ Dev-C++/ExerciseBook/05.33.2/SString.h | 117 +++ Dev-C++/ExerciseBook/05.34.1/05.34.1.cpp | 62 ++ Dev-C++/ExerciseBook/05.34.1/05.34.1.dev | 102 ++ Dev-C++/ExerciseBook/05.34.1/GList-HT.cpp | 418 +++++++++ Dev-C++/ExerciseBook/05.34.1/GList-HT.h | 164 ++++ Dev-C++/ExerciseBook/05.34.1/SString.cpp | 195 ++++ Dev-C++/ExerciseBook/05.34.1/SString.h | 117 +++ Dev-C++/ExerciseBook/05.34.2/05.34.2.cpp | 61 ++ Dev-C++/ExerciseBook/05.34.2/05.34.2.dev | 102 ++ Dev-C++/ExerciseBook/05.34.2/GList-E.cpp | 449 +++++++++ Dev-C++/ExerciseBook/05.34.2/GList-E.h | 146 +++ Dev-C++/ExerciseBook/05.34.2/SString.cpp | 195 ++++ Dev-C++/ExerciseBook/05.34.2/SString.h | 117 +++ .../ExerciseBook/05.35-05.36/05.35-05.36.cpp | 45 + .../ExerciseBook/05.35-05.36/05.35-05.36.dev | 102 ++ Dev-C++/ExerciseBook/05.35-05.36/GList.cpp | 179 ++++ Dev-C++/ExerciseBook/05.35-05.36/GList.h | 82 ++ Dev-C++/ExerciseBook/05.35-05.36/SString.cpp | 195 ++++ Dev-C++/ExerciseBook/05.35-05.36/SString.h | 117 +++ Dev-C++/ExerciseBook/05.37.1/05.37.1.cpp | 63 ++ Dev-C++/ExerciseBook/05.37.1/05.37.1.dev | 102 ++ Dev-C++/ExerciseBook/05.37.1/GList-HT.cpp | 418 +++++++++ Dev-C++/ExerciseBook/05.37.1/GList-HT.h | 164 ++++ Dev-C++/ExerciseBook/05.37.1/SString.cpp | 195 ++++ Dev-C++/ExerciseBook/05.37.1/SString.h | 117 +++ Dev-C++/ExerciseBook/05.37.2/05.37.2.cpp | 56 ++ Dev-C++/ExerciseBook/05.37.2/05.37.2.dev | 102 ++ Dev-C++/ExerciseBook/05.37.2/GList-E.cpp | 449 +++++++++ Dev-C++/ExerciseBook/05.37.2/GList-E.h | 146 +++ Dev-C++/ExerciseBook/05.37.2/SString.cpp | 195 ++++ Dev-C++/ExerciseBook/05.37.2/SString.h | 117 +++ Dev-C++/ExerciseBook/05.38.1/05.38.1.cpp | 47 + Dev-C++/ExerciseBook/05.38.1/05.38.1.dev | 102 ++ Dev-C++/ExerciseBook/05.38.1/GList-HT.cpp | 418 +++++++++ Dev-C++/ExerciseBook/05.38.1/GList-HT.h | 164 ++++ Dev-C++/ExerciseBook/05.38.1/SString.cpp | 195 ++++ Dev-C++/ExerciseBook/05.38.1/SString.h | 117 +++ Dev-C++/ExerciseBook/05.38.2/05.38.2.cpp | 48 + Dev-C++/ExerciseBook/05.38.2/05.38.2.dev | 102 ++ Dev-C++/ExerciseBook/05.38.2/GList-E.cpp | 449 +++++++++ Dev-C++/ExerciseBook/05.38.2/GList-E.h | 146 +++ Dev-C++/ExerciseBook/05.38.2/SString.cpp | 195 ++++ Dev-C++/ExerciseBook/05.38.2/SString.h | 117 +++ VisualC++/ExerciseBook/05.17/05.17.c | 137 +++ VisualC++/ExerciseBook/05.17/05.17.vcxproj | 76 ++ .../ExerciseBook/05.17/05.17.vcxproj.filters | 30 + .../ExerciseBook/05.17/05.17.vcxproj.user | 3 + VisualC++/ExerciseBook/05.17/SqList.c | 337 +++++++ VisualC++/ExerciseBook/05.17/SqList.h | 149 +++ VisualC++/ExerciseBook/05.18/05.18.c | 91 ++ VisualC++/ExerciseBook/05.18/05.18.vcxproj | 76 ++ .../ExerciseBook/05.18/05.18.vcxproj.filters | 30 + .../ExerciseBook/05.18/05.18.vcxproj.user | 3 + VisualC++/ExerciseBook/05.18/Array.c | 195 ++++ VisualC++/ExerciseBook/05.18/Array.h | 70 ++ VisualC++/ExerciseBook/05.19/05.19.c | 114 +++ VisualC++/ExerciseBook/05.19/05.19.vcxproj | 76 ++ .../ExerciseBook/05.19/05.19.vcxproj.filters | 30 + .../ExerciseBook/05.19/05.19.vcxproj.user | 3 + VisualC++/ExerciseBook/05.19/Array.c | 178 ++++ VisualC++/ExerciseBook/05.19/Array.h | 62 ++ VisualC++/ExerciseBook/05.20/05.20.c | 112 +++ VisualC++/ExerciseBook/05.20/05.20.vcxproj | 76 ++ .../ExerciseBook/05.20/05.20.vcxproj.filters | 30 + .../ExerciseBook/05.20/05.20.vcxproj.user | 3 + VisualC++/ExerciseBook/05.20/Array.c | 178 ++++ VisualC++/ExerciseBook/05.20/Array.h | 62 ++ VisualC++/ExerciseBook/05.21/05.21.c | 43 + VisualC++/ExerciseBook/05.21/05.21.vcxproj | 80 ++ .../ExerciseBook/05.21/05.21.vcxproj.filters | 38 + .../ExerciseBook/05.21/05.21.vcxproj.user | 3 + VisualC++/ExerciseBook/05.21/TSMatrix.c | 433 +++++++++ VisualC++/ExerciseBook/05.21/TSMatrix.h | 107 +++ VisualC++/ExerciseBook/05.21/TestData_A.txt | 4 + VisualC++/ExerciseBook/05.21/TestData_B.txt | 4 + VisualC++/ExerciseBook/05.22/05.22.c | 106 +++ VisualC++/ExerciseBook/05.22/05.22.vcxproj | 80 ++ .../ExerciseBook/05.22/05.22.vcxproj.filters | 38 + .../ExerciseBook/05.22/05.22.vcxproj.user | 3 + VisualC++/ExerciseBook/05.22/TSMatrix.c | 433 +++++++++ VisualC++/ExerciseBook/05.22/TSMatrix.h | 107 +++ VisualC++/ExerciseBook/05.22/TestData_A.txt | 4 + VisualC++/ExerciseBook/05.22/TestData_B.txt | 4 + VisualC++/ExerciseBook/05.23/05.23.c | 52 + VisualC++/ExerciseBook/05.23/05.23.vcxproj | 79 ++ .../ExerciseBook/05.23/05.23.vcxproj.filters | 35 + .../ExerciseBook/05.23/05.23.vcxproj.user | 3 + VisualC++/ExerciseBook/05.23/RLSMatrix.c | 515 ++++++++++ VisualC++/ExerciseBook/05.23/RLSMatrix.h | 107 +++ VisualC++/ExerciseBook/05.23/TestData_M.txt | 4 + VisualC++/ExerciseBook/05.24/05.24.c | 49 + VisualC++/ExerciseBook/05.24/05.24.vcxproj | 79 ++ .../ExerciseBook/05.24/05.24.vcxproj.filters | 35 + .../ExerciseBook/05.24/05.24.vcxproj.user | 3 + VisualC++/ExerciseBook/05.24/SMatrix.c | 44 + VisualC++/ExerciseBook/05.24/SMatrix.h | 32 + VisualC++/ExerciseBook/05.24/TestData_M.txt | 4 + VisualC++/ExerciseBook/05.25/05.25.c | 79 ++ VisualC++/ExerciseBook/05.25/05.25.vcxproj | 80 ++ .../ExerciseBook/05.25/05.25.vcxproj.filters | 38 + .../ExerciseBook/05.25/05.25.vcxproj.user | 3 + VisualC++/ExerciseBook/05.25/SMatrix.c | 48 + VisualC++/ExerciseBook/05.25/SMatrix.h | 32 + VisualC++/ExerciseBook/05.25/TestData_M.txt | 4 + VisualC++/ExerciseBook/05.25/TestData_N.txt | 4 + VisualC++/ExerciseBook/05.26/05.26.c | 49 + VisualC++/ExerciseBook/05.26/05.26.vcxproj | 79 ++ .../ExerciseBook/05.26/05.26.vcxproj.filters | 35 + .../ExerciseBook/05.26/05.26.vcxproj.user | 3 + VisualC++/ExerciseBook/05.26/CrossList.c | 885 ++++++++++++++++++ VisualC++/ExerciseBook/05.26/CrossList.h | 94 ++ VisualC++/ExerciseBook/05.26/TestData_M.txt | 4 + VisualC++/ExerciseBook/05.27/05.27.c | 41 + VisualC++/ExerciseBook/05.27/05.27.vcxproj | 80 ++ .../ExerciseBook/05.27/05.27.vcxproj.filters | 38 + .../ExerciseBook/05.27/05.27.vcxproj.user | 3 + VisualC++/ExerciseBook/05.27/CrossList.c | 885 ++++++++++++++++++ VisualC++/ExerciseBook/05.27/CrossList.h | 94 ++ VisualC++/ExerciseBook/05.27/TestData_M.txt | 4 + VisualC++/ExerciseBook/05.27/TestData_N.txt | 4 + .../ExerciseBook/05.28-05.29/05.28-05.29.c | 336 +++++++ .../05.28-05.29/05.28-05.29.vcxproj | 78 ++ .../05.28-05.29/05.28-05.29.vcxproj.filters | 36 + .../05.28-05.29/05.28-05.29.vcxproj.user | 3 + VisualC++/ExerciseBook/05.28-05.29/MPList.c | 233 +++++ VisualC++/ExerciseBook/05.28-05.29/MPList.h | 97 ++ .../ExerciseBook/05.28-05.29/StringUtil.c | 160 ++++ .../ExerciseBook/05.28-05.29/StringUtil.h | 58 ++ VisualC++/ExerciseBook/05.30.1/05.30.1.c | 42 + .../ExerciseBook/05.30.1/05.30.1.vcxproj | 78 ++ .../05.30.1/05.30.1.vcxproj.filters | 36 + .../ExerciseBook/05.30.1/05.30.1.vcxproj.user | 3 + VisualC++/ExerciseBook/05.30.1/GList-HT.c | 418 +++++++++ VisualC++/ExerciseBook/05.30.1/GList-HT.h | 164 ++++ VisualC++/ExerciseBook/05.30.1/SString.c | 195 ++++ VisualC++/ExerciseBook/05.30.1/SString.h | 117 +++ VisualC++/ExerciseBook/05.30.2/05.30.2.c | 42 + .../ExerciseBook/05.30.2/05.30.2.vcxproj | 78 ++ .../05.30.2/05.30.2.vcxproj.filters | 36 + .../ExerciseBook/05.30.2/05.30.2.vcxproj.user | 3 + VisualC++/ExerciseBook/05.30.2/GList-E.c | 449 +++++++++ VisualC++/ExerciseBook/05.30.2/GList-E.h | 146 +++ VisualC++/ExerciseBook/05.30.2/SString.c | 195 ++++ VisualC++/ExerciseBook/05.30.2/SString.h | 117 +++ VisualC++/ExerciseBook/05.31/05.31.c | 43 + VisualC++/ExerciseBook/05.31/05.31.vcxproj | 78 ++ .../ExerciseBook/05.31/05.31.vcxproj.filters | 36 + .../ExerciseBook/05.31/05.31.vcxproj.user | 3 + VisualC++/ExerciseBook/05.31/GList-E.c | 449 +++++++++ VisualC++/ExerciseBook/05.31/GList-E.h | 146 +++ VisualC++/ExerciseBook/05.31/SString.c | 195 ++++ VisualC++/ExerciseBook/05.31/SString.h | 117 +++ VisualC++/ExerciseBook/05.32.1/05.32.1.c | 64 ++ .../ExerciseBook/05.32.1/05.32.1.vcxproj | 78 ++ .../05.32.1/05.32.1.vcxproj.filters | 36 + .../ExerciseBook/05.32.1/05.32.1.vcxproj.user | 3 + VisualC++/ExerciseBook/05.32.1/GList-HT.c | 418 +++++++++ VisualC++/ExerciseBook/05.32.1/GList-HT.h | 164 ++++ VisualC++/ExerciseBook/05.32.1/SString.c | 195 ++++ VisualC++/ExerciseBook/05.32.1/SString.h | 117 +++ VisualC++/ExerciseBook/05.32.2/05.32.2.c | 66 ++ .../ExerciseBook/05.32.2/05.32.2.vcxproj | 78 ++ .../05.32.2/05.32.2.vcxproj.filters | 36 + .../ExerciseBook/05.32.2/05.32.2.vcxproj.user | 3 + VisualC++/ExerciseBook/05.32.2/GList-E.c | 449 +++++++++ VisualC++/ExerciseBook/05.32.2/GList-E.h | 146 +++ VisualC++/ExerciseBook/05.32.2/SString.c | 195 ++++ VisualC++/ExerciseBook/05.32.2/SString.h | 117 +++ VisualC++/ExerciseBook/05.33.1/05.33.1.c | 47 + .../ExerciseBook/05.33.1/05.33.1.vcxproj | 78 ++ .../05.33.1/05.33.1.vcxproj.filters | 36 + .../ExerciseBook/05.33.1/05.33.1.vcxproj.user | 3 + VisualC++/ExerciseBook/05.33.1/GList-HT.c | 418 +++++++++ VisualC++/ExerciseBook/05.33.1/GList-HT.h | 164 ++++ VisualC++/ExerciseBook/05.33.1/SString.c | 195 ++++ VisualC++/ExerciseBook/05.33.1/SString.h | 117 +++ VisualC++/ExerciseBook/05.33.2/05.33.2.c | 48 + .../ExerciseBook/05.33.2/05.33.2.vcxproj | 78 ++ .../05.33.2/05.33.2.vcxproj.filters | 36 + .../ExerciseBook/05.33.2/05.33.2.vcxproj.user | 3 + VisualC++/ExerciseBook/05.33.2/GList-E.c | 449 +++++++++ VisualC++/ExerciseBook/05.33.2/GList-E.h | 146 +++ VisualC++/ExerciseBook/05.33.2/SString.c | 195 ++++ VisualC++/ExerciseBook/05.33.2/SString.h | 117 +++ VisualC++/ExerciseBook/05.34.1/05.34.1.c | 62 ++ .../ExerciseBook/05.34.1/05.34.1.vcxproj | 78 ++ .../05.34.1/05.34.1.vcxproj.filters | 36 + .../ExerciseBook/05.34.1/05.34.1.vcxproj.user | 3 + VisualC++/ExerciseBook/05.34.1/GList-HT.c | 418 +++++++++ VisualC++/ExerciseBook/05.34.1/GList-HT.h | 164 ++++ VisualC++/ExerciseBook/05.34.1/SString.c | 195 ++++ VisualC++/ExerciseBook/05.34.1/SString.h | 117 +++ VisualC++/ExerciseBook/05.34.2/05.34.2.c | 61 ++ .../ExerciseBook/05.34.2/05.34.2.vcxproj | 78 ++ .../05.34.2/05.34.2.vcxproj.filters | 36 + .../ExerciseBook/05.34.2/05.34.2.vcxproj.user | 3 + VisualC++/ExerciseBook/05.34.2/GList-E.c | 449 +++++++++ VisualC++/ExerciseBook/05.34.2/GList-E.h | 146 +++ VisualC++/ExerciseBook/05.34.2/SString.c | 195 ++++ VisualC++/ExerciseBook/05.34.2/SString.h | 117 +++ .../ExerciseBook/05.35-05.36/05.35-05.36.c | 45 + .../05.35-05.36/05.35-05.36.vcxproj | 78 ++ .../05.35-05.36/05.35-05.36.vcxproj.filters | 36 + .../05.35-05.36/05.35-05.36.vcxproj.user | 3 + VisualC++/ExerciseBook/05.35-05.36/GList.c | 179 ++++ VisualC++/ExerciseBook/05.35-05.36/GList.h | 82 ++ VisualC++/ExerciseBook/05.35-05.36/SString.c | 195 ++++ VisualC++/ExerciseBook/05.35-05.36/SString.h | 117 +++ VisualC++/ExerciseBook/05.37.1/05.37.1.c | 63 ++ .../ExerciseBook/05.37.1/05.37.1.vcxproj | 78 ++ .../05.37.1/05.37.1.vcxproj.filters | 36 + .../ExerciseBook/05.37.1/05.37.1.vcxproj.user | 3 + VisualC++/ExerciseBook/05.37.1/GList-HT.c | 418 +++++++++ VisualC++/ExerciseBook/05.37.1/GList-HT.h | 164 ++++ VisualC++/ExerciseBook/05.37.1/SString.c | 195 ++++ VisualC++/ExerciseBook/05.37.1/SString.h | 117 +++ VisualC++/ExerciseBook/05.37.2/05.37.2.c | 56 ++ .../ExerciseBook/05.37.2/05.37.2.vcxproj | 78 ++ .../05.37.2/05.37.2.vcxproj.filters | 36 + .../ExerciseBook/05.37.2/05.37.2.vcxproj.user | 3 + VisualC++/ExerciseBook/05.37.2/GList-E.c | 449 +++++++++ VisualC++/ExerciseBook/05.37.2/GList-E.h | 146 +++ VisualC++/ExerciseBook/05.37.2/SString.c | 195 ++++ VisualC++/ExerciseBook/05.37.2/SString.h | 117 +++ VisualC++/ExerciseBook/05.38.1/05.38.1.c | 47 + .../ExerciseBook/05.38.1/05.38.1.vcxproj | 78 ++ .../05.38.1/05.38.1.vcxproj.filters | 36 + .../ExerciseBook/05.38.1/05.38.1.vcxproj.user | 3 + VisualC++/ExerciseBook/05.38.1/GList-HT.c | 418 +++++++++ VisualC++/ExerciseBook/05.38.1/GList-HT.h | 164 ++++ VisualC++/ExerciseBook/05.38.1/SString.c | 195 ++++ VisualC++/ExerciseBook/05.38.1/SString.h | 117 +++ VisualC++/ExerciseBook/05.38.2/05.38.2.c | 48 + .../ExerciseBook/05.38.2/05.38.2.vcxproj | 78 ++ .../05.38.2/05.38.2.vcxproj.filters | 36 + .../ExerciseBook/05.38.2/05.38.2.vcxproj.user | 3 + VisualC++/ExerciseBook/05.38.2/GList-E.c | 449 +++++++++ VisualC++/ExerciseBook/05.38.2/GList-E.h | 146 +++ VisualC++/ExerciseBook/05.38.2/SString.c | 195 ++++ VisualC++/ExerciseBook/05.38.2/SString.h | 117 +++ VisualC++/ExerciseBook/ExerciseBook.sdf | Bin 4739072 -> 6049792 bytes VisualC++/ExerciseBook/ExerciseBook.sln | 156 +++ VisualC++/ExerciseBook/ExerciseBook.suo | Bin 141312 -> 217600 bytes .../_v_images/20181128024131486_26584.png | Bin 0 -> 4844 bytes .../_v_images/20181128024617431_31991.png | Bin 0 -> 2210 bytes .../_v_images/20181128024818024_1955.png | Bin 0 -> 2368 bytes .../_v_images/20181128024844354_32694.png | Bin 0 -> 2110 bytes .../_v_images/20181128024901661_11428.png | Bin 0 -> 1285 bytes .../_v_images/20181128024915115_3609.png | Bin 0 -> 1485 bytes .../_v_images/20181128025105462_31218.png | Bin 0 -> 13834 bytes .../_v_images/20181128025241824_32225.png | Bin 0 -> 8536 bytes .../_v_images/20181128025435346_25694.png | Bin 0 -> 1289 bytes .../_v_images/20181128025526044_25756.png | Bin 0 -> 6168 bytes .../_v_images/20181128025550464_16430.png | Bin 0 -> 6127 bytes .../_v_images/20181128025752290_16510.png | Bin 0 -> 48703 bytes .../_v_images/20181128025833026_20359.png | Bin 0 -> 14092 bytes .../_v_images/20181128025848038_32716.png | Bin 0 -> 12727 bytes .../_v_images/20181128025918606_14220.png | Bin 0 -> 12217 bytes .../_v_images/20181128025944030_21649.png | Bin 0 -> 13329 bytes .../_v_images/20181128030006944_5864.png | Bin 0 -> 5895 bytes .../_v_images/20181128030200899_4388.png | Bin 0 -> 1667 bytes .../_v_images/20181128032123139_30296.png | Bin 0 -> 7422 bytes .../_v_images/20181128032203810_17392.png | Bin 0 -> 5492 bytes .../_v_images/20181128102525149_11720.png | Bin 0 -> 4452 bytes .../_v_images/20181128102751394_22422.png | Bin 0 -> 2279 bytes .../_v_images/20181128102824060_18222.png | Bin 0 -> 1692 bytes .../05 数组和广义表/第05章 数组与广义表.md | 311 ++++++ 515 files changed, 65873 insertions(+) create mode 100644 CLion/ExerciseBook/05.17/05.17.c create mode 100644 CLion/ExerciseBook/05.17/CMakeLists.txt create mode 100644 CLion/ExerciseBook/05.17/SqList.c create mode 100644 CLion/ExerciseBook/05.17/SqList.h create mode 100644 CLion/ExerciseBook/05.18/05.18.c create mode 100644 CLion/ExerciseBook/05.18/Array.c create mode 100644 CLion/ExerciseBook/05.18/Array.h create mode 100644 CLion/ExerciseBook/05.18/CMakeLists.txt create mode 100644 CLion/ExerciseBook/05.19/05.19.c create mode 100644 CLion/ExerciseBook/05.19/Array.c create mode 100644 CLion/ExerciseBook/05.19/Array.h create mode 100644 CLion/ExerciseBook/05.19/CMakeLists.txt create mode 100644 CLion/ExerciseBook/05.20/05.20.c create mode 100644 CLion/ExerciseBook/05.20/Array.c create mode 100644 CLion/ExerciseBook/05.20/Array.h create mode 100644 CLion/ExerciseBook/05.20/CMakeLists.txt create mode 100644 CLion/ExerciseBook/05.21/05.21.c create mode 100644 CLion/ExerciseBook/05.21/CMakeLists.txt create mode 100644 CLion/ExerciseBook/05.21/TSMatrix.c create mode 100644 CLion/ExerciseBook/05.21/TSMatrix.h create mode 100644 CLion/ExerciseBook/05.21/TestData_A.txt create mode 100644 CLion/ExerciseBook/05.21/TestData_B.txt create mode 100644 CLion/ExerciseBook/05.22/05.22.c create mode 100644 CLion/ExerciseBook/05.22/CMakeLists.txt create mode 100644 CLion/ExerciseBook/05.22/TSMatrix.c create mode 100644 CLion/ExerciseBook/05.22/TSMatrix.h create mode 100644 CLion/ExerciseBook/05.22/TestData_A.txt create mode 100644 CLion/ExerciseBook/05.22/TestData_B.txt create mode 100644 CLion/ExerciseBook/05.23/05.23.c create mode 100644 CLion/ExerciseBook/05.23/CMakeLists.txt create mode 100644 CLion/ExerciseBook/05.23/RLSMatrix.c create mode 100644 CLion/ExerciseBook/05.23/RLSMatrix.h create mode 100644 CLion/ExerciseBook/05.23/TestData_M.txt create mode 100644 CLion/ExerciseBook/05.24/05.24.c create mode 100644 CLion/ExerciseBook/05.24/CMakeLists.txt create mode 100644 CLion/ExerciseBook/05.24/SMatrix.c create mode 100644 CLion/ExerciseBook/05.24/SMatrix.h create mode 100644 CLion/ExerciseBook/05.24/TestData_M.txt create mode 100644 CLion/ExerciseBook/05.25/05.25.c create mode 100644 CLion/ExerciseBook/05.25/CMakeLists.txt create mode 100644 CLion/ExerciseBook/05.25/SMatrix.c create mode 100644 CLion/ExerciseBook/05.25/SMatrix.h create mode 100644 CLion/ExerciseBook/05.25/TestData_M.txt create mode 100644 CLion/ExerciseBook/05.25/TestData_N.txt create mode 100644 CLion/ExerciseBook/05.26/05.26.c create mode 100644 CLion/ExerciseBook/05.26/CMakeLists.txt create mode 100644 CLion/ExerciseBook/05.26/CrossList.c create mode 100644 CLion/ExerciseBook/05.26/CrossList.h create mode 100644 CLion/ExerciseBook/05.26/TestData_M.txt create mode 100644 CLion/ExerciseBook/05.27/05.27.c create mode 100644 CLion/ExerciseBook/05.27/CMakeLists.txt create mode 100644 CLion/ExerciseBook/05.27/CrossList.c create mode 100644 CLion/ExerciseBook/05.27/CrossList.h create mode 100644 CLion/ExerciseBook/05.27/TestData_M.txt create mode 100644 CLion/ExerciseBook/05.27/TestData_N.txt create mode 100644 CLion/ExerciseBook/05.28-05.29/05.28-05.29.c create mode 100644 CLion/ExerciseBook/05.28-05.29/CMakeLists.txt create mode 100644 CLion/ExerciseBook/05.28-05.29/MPList.c create mode 100644 CLion/ExerciseBook/05.28-05.29/MPList.h create mode 100644 CLion/ExerciseBook/05.28-05.29/StringUtil.c create mode 100644 CLion/ExerciseBook/05.28-05.29/StringUtil.h create mode 100644 CLion/ExerciseBook/05.30.1/05.30.1.c create mode 100644 CLion/ExerciseBook/05.30.1/CMakeLists.txt create mode 100644 CLion/ExerciseBook/05.30.1/GList-HT.c create mode 100644 CLion/ExerciseBook/05.30.1/GList-HT.h create mode 100644 CLion/ExerciseBook/05.30.1/SString.c create mode 100644 CLion/ExerciseBook/05.30.1/SString.h create mode 100644 CLion/ExerciseBook/05.30.2/05.30.2.c create mode 100644 CLion/ExerciseBook/05.30.2/CMakeLists.txt create mode 100644 CLion/ExerciseBook/05.30.2/GList-E.c create mode 100644 CLion/ExerciseBook/05.30.2/GList-E.h create mode 100644 CLion/ExerciseBook/05.30.2/SString.c create mode 100644 CLion/ExerciseBook/05.30.2/SString.h create mode 100644 CLion/ExerciseBook/05.31/05.31.c create mode 100644 CLion/ExerciseBook/05.31/CMakeLists.txt create mode 100644 CLion/ExerciseBook/05.31/GList-E.c create mode 100644 CLion/ExerciseBook/05.31/GList-E.h create mode 100644 CLion/ExerciseBook/05.31/SString.c create mode 100644 CLion/ExerciseBook/05.31/SString.h create mode 100644 CLion/ExerciseBook/05.32.1/05.32.1.c create mode 100644 CLion/ExerciseBook/05.32.1/CMakeLists.txt create mode 100644 CLion/ExerciseBook/05.32.1/GList-HT.c create mode 100644 CLion/ExerciseBook/05.32.1/GList-HT.h create mode 100644 CLion/ExerciseBook/05.32.1/SString.c create mode 100644 CLion/ExerciseBook/05.32.1/SString.h create mode 100644 CLion/ExerciseBook/05.32.2/05.32.2.c create mode 100644 CLion/ExerciseBook/05.32.2/CMakeLists.txt create mode 100644 CLion/ExerciseBook/05.32.2/GList-E.c create mode 100644 CLion/ExerciseBook/05.32.2/GList-E.h create mode 100644 CLion/ExerciseBook/05.32.2/SString.c create mode 100644 CLion/ExerciseBook/05.32.2/SString.h create mode 100644 CLion/ExerciseBook/05.33.1/05.33.1.c create mode 100644 CLion/ExerciseBook/05.33.1/CMakeLists.txt create mode 100644 CLion/ExerciseBook/05.33.1/GList-HT.c create mode 100644 CLion/ExerciseBook/05.33.1/GList-HT.h create mode 100644 CLion/ExerciseBook/05.33.1/SString.c create mode 100644 CLion/ExerciseBook/05.33.1/SString.h create mode 100644 CLion/ExerciseBook/05.33.2/05.33.2.c create mode 100644 CLion/ExerciseBook/05.33.2/CMakeLists.txt create mode 100644 CLion/ExerciseBook/05.33.2/GList-E.c create mode 100644 CLion/ExerciseBook/05.33.2/GList-E.h create mode 100644 CLion/ExerciseBook/05.33.2/SString.c create mode 100644 CLion/ExerciseBook/05.33.2/SString.h create mode 100644 CLion/ExerciseBook/05.34.1/05.34.1.c create mode 100644 CLion/ExerciseBook/05.34.1/CMakeLists.txt create mode 100644 CLion/ExerciseBook/05.34.1/GList-HT.c create mode 100644 CLion/ExerciseBook/05.34.1/GList-HT.h create mode 100644 CLion/ExerciseBook/05.34.1/SString.c create mode 100644 CLion/ExerciseBook/05.34.1/SString.h create mode 100644 CLion/ExerciseBook/05.34.2/05.34.2.c create mode 100644 CLion/ExerciseBook/05.34.2/CMakeLists.txt create mode 100644 CLion/ExerciseBook/05.34.2/GList-E.c create mode 100644 CLion/ExerciseBook/05.34.2/GList-E.h create mode 100644 CLion/ExerciseBook/05.34.2/SString.c create mode 100644 CLion/ExerciseBook/05.34.2/SString.h create mode 100644 CLion/ExerciseBook/05.35-05.36/05.35-05.36.c create mode 100644 CLion/ExerciseBook/05.35-05.36/CMakeLists.txt create mode 100644 CLion/ExerciseBook/05.35-05.36/GList.c create mode 100644 CLion/ExerciseBook/05.35-05.36/GList.h create mode 100644 CLion/ExerciseBook/05.35-05.36/SString.c create mode 100644 CLion/ExerciseBook/05.35-05.36/SString.h create mode 100644 CLion/ExerciseBook/05.37.1/05.37.1.c create mode 100644 CLion/ExerciseBook/05.37.1/CMakeLists.txt create mode 100644 CLion/ExerciseBook/05.37.1/GList-HT.c create mode 100644 CLion/ExerciseBook/05.37.1/GList-HT.h create mode 100644 CLion/ExerciseBook/05.37.1/SString.c create mode 100644 CLion/ExerciseBook/05.37.1/SString.h create mode 100644 CLion/ExerciseBook/05.37.2/05.37.2.c create mode 100644 CLion/ExerciseBook/05.37.2/CMakeLists.txt create mode 100644 CLion/ExerciseBook/05.37.2/GList-E.c create mode 100644 CLion/ExerciseBook/05.37.2/GList-E.h create mode 100644 CLion/ExerciseBook/05.37.2/SString.c create mode 100644 CLion/ExerciseBook/05.37.2/SString.h create mode 100644 CLion/ExerciseBook/05.38.1/05.38.1.c create mode 100644 CLion/ExerciseBook/05.38.1/CMakeLists.txt create mode 100644 CLion/ExerciseBook/05.38.1/GList-HT.c create mode 100644 CLion/ExerciseBook/05.38.1/GList-HT.h create mode 100644 CLion/ExerciseBook/05.38.1/SString.c create mode 100644 CLion/ExerciseBook/05.38.1/SString.h create mode 100644 CLion/ExerciseBook/05.38.2/05.38.2.c create mode 100644 CLion/ExerciseBook/05.38.2/CMakeLists.txt create mode 100644 CLion/ExerciseBook/05.38.2/GList-E.c create mode 100644 CLion/ExerciseBook/05.38.2/GList-E.h create mode 100644 CLion/ExerciseBook/05.38.2/SString.c create mode 100644 CLion/ExerciseBook/05.38.2/SString.h create mode 100644 Dev-C++/ExerciseBook/05.17/05.17.cpp create mode 100644 Dev-C++/ExerciseBook/05.17/05.17.dev create mode 100644 Dev-C++/ExerciseBook/05.17/SqList.cpp create mode 100644 Dev-C++/ExerciseBook/05.17/SqList.h create mode 100644 Dev-C++/ExerciseBook/05.18/05.18.cpp create mode 100644 Dev-C++/ExerciseBook/05.18/05.18.dev create mode 100644 Dev-C++/ExerciseBook/05.18/Array.cpp create mode 100644 Dev-C++/ExerciseBook/05.18/Array.h create mode 100644 Dev-C++/ExerciseBook/05.19/05.19.cpp create mode 100644 Dev-C++/ExerciseBook/05.19/05.19.dev create mode 100644 Dev-C++/ExerciseBook/05.19/Array.cpp create mode 100644 Dev-C++/ExerciseBook/05.19/Array.h create mode 100644 Dev-C++/ExerciseBook/05.20/05.20.cpp create mode 100644 Dev-C++/ExerciseBook/05.20/05.20.dev create mode 100644 Dev-C++/ExerciseBook/05.20/Array.cpp create mode 100644 Dev-C++/ExerciseBook/05.20/Array.h create mode 100644 Dev-C++/ExerciseBook/05.21/05.21.cpp create mode 100644 Dev-C++/ExerciseBook/05.21/05.21.dev create mode 100644 Dev-C++/ExerciseBook/05.21/TSMatrix.cpp create mode 100644 Dev-C++/ExerciseBook/05.21/TSMatrix.h create mode 100644 Dev-C++/ExerciseBook/05.21/TestData_A.txt create mode 100644 Dev-C++/ExerciseBook/05.21/TestData_B.txt create mode 100644 Dev-C++/ExerciseBook/05.22/05.22.cpp create mode 100644 Dev-C++/ExerciseBook/05.22/05.22.dev create mode 100644 Dev-C++/ExerciseBook/05.22/TSMatrix.cpp create mode 100644 Dev-C++/ExerciseBook/05.22/TSMatrix.h create mode 100644 Dev-C++/ExerciseBook/05.22/TestData_A.txt create mode 100644 Dev-C++/ExerciseBook/05.22/TestData_B.txt create mode 100644 Dev-C++/ExerciseBook/05.23/05.23.cpp create mode 100644 Dev-C++/ExerciseBook/05.23/05.23.dev create mode 100644 Dev-C++/ExerciseBook/05.23/RLSMatrix.cpp create mode 100644 Dev-C++/ExerciseBook/05.23/RLSMatrix.h create mode 100644 Dev-C++/ExerciseBook/05.23/TestData_M.txt create mode 100644 Dev-C++/ExerciseBook/05.24/05.24.cpp create mode 100644 Dev-C++/ExerciseBook/05.24/05.24.dev create mode 100644 Dev-C++/ExerciseBook/05.24/SMatrix.cpp create mode 100644 Dev-C++/ExerciseBook/05.24/SMatrix.h create mode 100644 Dev-C++/ExerciseBook/05.24/TestData_M.txt create mode 100644 Dev-C++/ExerciseBook/05.25/05.25.cpp create mode 100644 Dev-C++/ExerciseBook/05.25/05.25.dev create mode 100644 Dev-C++/ExerciseBook/05.25/SMatrix.cpp create mode 100644 Dev-C++/ExerciseBook/05.25/SMatrix.h create mode 100644 Dev-C++/ExerciseBook/05.25/TestData_M.txt create mode 100644 Dev-C++/ExerciseBook/05.25/TestData_N.txt create mode 100644 Dev-C++/ExerciseBook/05.26/05.26.cpp create mode 100644 Dev-C++/ExerciseBook/05.26/05.26.dev create mode 100644 Dev-C++/ExerciseBook/05.26/CrossList.cpp create mode 100644 Dev-C++/ExerciseBook/05.26/CrossList.h create mode 100644 Dev-C++/ExerciseBook/05.26/TestData_M.txt create mode 100644 Dev-C++/ExerciseBook/05.27/05.27.cpp create mode 100644 Dev-C++/ExerciseBook/05.27/05.27.dev create mode 100644 Dev-C++/ExerciseBook/05.27/CrossList.cpp create mode 100644 Dev-C++/ExerciseBook/05.27/CrossList.h create mode 100644 Dev-C++/ExerciseBook/05.27/TestData_M.txt create mode 100644 Dev-C++/ExerciseBook/05.27/TestData_N.txt create mode 100644 Dev-C++/ExerciseBook/05.28-05.29/05.28-05.29.cpp create mode 100644 Dev-C++/ExerciseBook/05.28-05.29/05.28-05.29.dev create mode 100644 Dev-C++/ExerciseBook/05.28-05.29/MPList.cpp create mode 100644 Dev-C++/ExerciseBook/05.28-05.29/MPList.h create mode 100644 Dev-C++/ExerciseBook/05.28-05.29/StringUtil.cpp create mode 100644 Dev-C++/ExerciseBook/05.28-05.29/StringUtil.h create mode 100644 Dev-C++/ExerciseBook/05.30.1/05.30.1.cpp create mode 100644 Dev-C++/ExerciseBook/05.30.1/05.30.1.dev create mode 100644 Dev-C++/ExerciseBook/05.30.1/GList-HT.cpp create mode 100644 Dev-C++/ExerciseBook/05.30.1/GList-HT.h create mode 100644 Dev-C++/ExerciseBook/05.30.1/SString.cpp create mode 100644 Dev-C++/ExerciseBook/05.30.1/SString.h create mode 100644 Dev-C++/ExerciseBook/05.30.2/05.30.2.cpp create mode 100644 Dev-C++/ExerciseBook/05.30.2/05.30.2.dev create mode 100644 Dev-C++/ExerciseBook/05.30.2/GList-E.cpp create mode 100644 Dev-C++/ExerciseBook/05.30.2/GList-E.h create mode 100644 Dev-C++/ExerciseBook/05.30.2/SString.cpp create mode 100644 Dev-C++/ExerciseBook/05.30.2/SString.h create mode 100644 Dev-C++/ExerciseBook/05.31/05.31.cpp create mode 100644 Dev-C++/ExerciseBook/05.31/05.31.dev create mode 100644 Dev-C++/ExerciseBook/05.31/GList-E.cpp create mode 100644 Dev-C++/ExerciseBook/05.31/GList-E.h create mode 100644 Dev-C++/ExerciseBook/05.31/SString.cpp create mode 100644 Dev-C++/ExerciseBook/05.31/SString.h create mode 100644 Dev-C++/ExerciseBook/05.32.1/05.32.1.cpp create mode 100644 Dev-C++/ExerciseBook/05.32.1/05.32.1.dev create mode 100644 Dev-C++/ExerciseBook/05.32.1/GList-HT.cpp create mode 100644 Dev-C++/ExerciseBook/05.32.1/GList-HT.h create mode 100644 Dev-C++/ExerciseBook/05.32.1/SString.cpp create mode 100644 Dev-C++/ExerciseBook/05.32.1/SString.h create mode 100644 Dev-C++/ExerciseBook/05.32.2/05.32.2.cpp create mode 100644 Dev-C++/ExerciseBook/05.32.2/05.32.2.dev create mode 100644 Dev-C++/ExerciseBook/05.32.2/GList-E.cpp create mode 100644 Dev-C++/ExerciseBook/05.32.2/GList-E.h create mode 100644 Dev-C++/ExerciseBook/05.32.2/SString.cpp create mode 100644 Dev-C++/ExerciseBook/05.32.2/SString.h create mode 100644 Dev-C++/ExerciseBook/05.33.1/05.33.1.cpp create mode 100644 Dev-C++/ExerciseBook/05.33.1/05.33.1.dev create mode 100644 Dev-C++/ExerciseBook/05.33.1/GList-HT.cpp create mode 100644 Dev-C++/ExerciseBook/05.33.1/GList-HT.h create mode 100644 Dev-C++/ExerciseBook/05.33.1/SString.cpp create mode 100644 Dev-C++/ExerciseBook/05.33.1/SString.h create mode 100644 Dev-C++/ExerciseBook/05.33.2/05.33.2.cpp create mode 100644 Dev-C++/ExerciseBook/05.33.2/05.33.2.dev create mode 100644 Dev-C++/ExerciseBook/05.33.2/GList-E.cpp create mode 100644 Dev-C++/ExerciseBook/05.33.2/GList-E.h create mode 100644 Dev-C++/ExerciseBook/05.33.2/SString.cpp create mode 100644 Dev-C++/ExerciseBook/05.33.2/SString.h create mode 100644 Dev-C++/ExerciseBook/05.34.1/05.34.1.cpp create mode 100644 Dev-C++/ExerciseBook/05.34.1/05.34.1.dev create mode 100644 Dev-C++/ExerciseBook/05.34.1/GList-HT.cpp create mode 100644 Dev-C++/ExerciseBook/05.34.1/GList-HT.h create mode 100644 Dev-C++/ExerciseBook/05.34.1/SString.cpp create mode 100644 Dev-C++/ExerciseBook/05.34.1/SString.h create mode 100644 Dev-C++/ExerciseBook/05.34.2/05.34.2.cpp create mode 100644 Dev-C++/ExerciseBook/05.34.2/05.34.2.dev create mode 100644 Dev-C++/ExerciseBook/05.34.2/GList-E.cpp create mode 100644 Dev-C++/ExerciseBook/05.34.2/GList-E.h create mode 100644 Dev-C++/ExerciseBook/05.34.2/SString.cpp create mode 100644 Dev-C++/ExerciseBook/05.34.2/SString.h create mode 100644 Dev-C++/ExerciseBook/05.35-05.36/05.35-05.36.cpp create mode 100644 Dev-C++/ExerciseBook/05.35-05.36/05.35-05.36.dev create mode 100644 Dev-C++/ExerciseBook/05.35-05.36/GList.cpp create mode 100644 Dev-C++/ExerciseBook/05.35-05.36/GList.h create mode 100644 Dev-C++/ExerciseBook/05.35-05.36/SString.cpp create mode 100644 Dev-C++/ExerciseBook/05.35-05.36/SString.h create mode 100644 Dev-C++/ExerciseBook/05.37.1/05.37.1.cpp create mode 100644 Dev-C++/ExerciseBook/05.37.1/05.37.1.dev create mode 100644 Dev-C++/ExerciseBook/05.37.1/GList-HT.cpp create mode 100644 Dev-C++/ExerciseBook/05.37.1/GList-HT.h create mode 100644 Dev-C++/ExerciseBook/05.37.1/SString.cpp create mode 100644 Dev-C++/ExerciseBook/05.37.1/SString.h create mode 100644 Dev-C++/ExerciseBook/05.37.2/05.37.2.cpp create mode 100644 Dev-C++/ExerciseBook/05.37.2/05.37.2.dev create mode 100644 Dev-C++/ExerciseBook/05.37.2/GList-E.cpp create mode 100644 Dev-C++/ExerciseBook/05.37.2/GList-E.h create mode 100644 Dev-C++/ExerciseBook/05.37.2/SString.cpp create mode 100644 Dev-C++/ExerciseBook/05.37.2/SString.h create mode 100644 Dev-C++/ExerciseBook/05.38.1/05.38.1.cpp create mode 100644 Dev-C++/ExerciseBook/05.38.1/05.38.1.dev create mode 100644 Dev-C++/ExerciseBook/05.38.1/GList-HT.cpp create mode 100644 Dev-C++/ExerciseBook/05.38.1/GList-HT.h create mode 100644 Dev-C++/ExerciseBook/05.38.1/SString.cpp create mode 100644 Dev-C++/ExerciseBook/05.38.1/SString.h create mode 100644 Dev-C++/ExerciseBook/05.38.2/05.38.2.cpp create mode 100644 Dev-C++/ExerciseBook/05.38.2/05.38.2.dev create mode 100644 Dev-C++/ExerciseBook/05.38.2/GList-E.cpp create mode 100644 Dev-C++/ExerciseBook/05.38.2/GList-E.h create mode 100644 Dev-C++/ExerciseBook/05.38.2/SString.cpp create mode 100644 Dev-C++/ExerciseBook/05.38.2/SString.h create mode 100644 VisualC++/ExerciseBook/05.17/05.17.c create mode 100644 VisualC++/ExerciseBook/05.17/05.17.vcxproj create mode 100644 VisualC++/ExerciseBook/05.17/05.17.vcxproj.filters create mode 100644 VisualC++/ExerciseBook/05.17/05.17.vcxproj.user create mode 100644 VisualC++/ExerciseBook/05.17/SqList.c create mode 100644 VisualC++/ExerciseBook/05.17/SqList.h create mode 100644 VisualC++/ExerciseBook/05.18/05.18.c create mode 100644 VisualC++/ExerciseBook/05.18/05.18.vcxproj create mode 100644 VisualC++/ExerciseBook/05.18/05.18.vcxproj.filters create mode 100644 VisualC++/ExerciseBook/05.18/05.18.vcxproj.user create mode 100644 VisualC++/ExerciseBook/05.18/Array.c create mode 100644 VisualC++/ExerciseBook/05.18/Array.h create mode 100644 VisualC++/ExerciseBook/05.19/05.19.c create mode 100644 VisualC++/ExerciseBook/05.19/05.19.vcxproj create mode 100644 VisualC++/ExerciseBook/05.19/05.19.vcxproj.filters create mode 100644 VisualC++/ExerciseBook/05.19/05.19.vcxproj.user create mode 100644 VisualC++/ExerciseBook/05.19/Array.c create mode 100644 VisualC++/ExerciseBook/05.19/Array.h create mode 100644 VisualC++/ExerciseBook/05.20/05.20.c create mode 100644 VisualC++/ExerciseBook/05.20/05.20.vcxproj create mode 100644 VisualC++/ExerciseBook/05.20/05.20.vcxproj.filters create mode 100644 VisualC++/ExerciseBook/05.20/05.20.vcxproj.user create mode 100644 VisualC++/ExerciseBook/05.20/Array.c create mode 100644 VisualC++/ExerciseBook/05.20/Array.h create mode 100644 VisualC++/ExerciseBook/05.21/05.21.c create mode 100644 VisualC++/ExerciseBook/05.21/05.21.vcxproj create mode 100644 VisualC++/ExerciseBook/05.21/05.21.vcxproj.filters create mode 100644 VisualC++/ExerciseBook/05.21/05.21.vcxproj.user create mode 100644 VisualC++/ExerciseBook/05.21/TSMatrix.c create mode 100644 VisualC++/ExerciseBook/05.21/TSMatrix.h create mode 100644 VisualC++/ExerciseBook/05.21/TestData_A.txt create mode 100644 VisualC++/ExerciseBook/05.21/TestData_B.txt create mode 100644 VisualC++/ExerciseBook/05.22/05.22.c create mode 100644 VisualC++/ExerciseBook/05.22/05.22.vcxproj create mode 100644 VisualC++/ExerciseBook/05.22/05.22.vcxproj.filters create mode 100644 VisualC++/ExerciseBook/05.22/05.22.vcxproj.user create mode 100644 VisualC++/ExerciseBook/05.22/TSMatrix.c create mode 100644 VisualC++/ExerciseBook/05.22/TSMatrix.h create mode 100644 VisualC++/ExerciseBook/05.22/TestData_A.txt create mode 100644 VisualC++/ExerciseBook/05.22/TestData_B.txt create mode 100644 VisualC++/ExerciseBook/05.23/05.23.c create mode 100644 VisualC++/ExerciseBook/05.23/05.23.vcxproj create mode 100644 VisualC++/ExerciseBook/05.23/05.23.vcxproj.filters create mode 100644 VisualC++/ExerciseBook/05.23/05.23.vcxproj.user create mode 100644 VisualC++/ExerciseBook/05.23/RLSMatrix.c create mode 100644 VisualC++/ExerciseBook/05.23/RLSMatrix.h create mode 100644 VisualC++/ExerciseBook/05.23/TestData_M.txt create mode 100644 VisualC++/ExerciseBook/05.24/05.24.c create mode 100644 VisualC++/ExerciseBook/05.24/05.24.vcxproj create mode 100644 VisualC++/ExerciseBook/05.24/05.24.vcxproj.filters create mode 100644 VisualC++/ExerciseBook/05.24/05.24.vcxproj.user create mode 100644 VisualC++/ExerciseBook/05.24/SMatrix.c create mode 100644 VisualC++/ExerciseBook/05.24/SMatrix.h create mode 100644 VisualC++/ExerciseBook/05.24/TestData_M.txt create mode 100644 VisualC++/ExerciseBook/05.25/05.25.c create mode 100644 VisualC++/ExerciseBook/05.25/05.25.vcxproj create mode 100644 VisualC++/ExerciseBook/05.25/05.25.vcxproj.filters create mode 100644 VisualC++/ExerciseBook/05.25/05.25.vcxproj.user create mode 100644 VisualC++/ExerciseBook/05.25/SMatrix.c create mode 100644 VisualC++/ExerciseBook/05.25/SMatrix.h create mode 100644 VisualC++/ExerciseBook/05.25/TestData_M.txt create mode 100644 VisualC++/ExerciseBook/05.25/TestData_N.txt create mode 100644 VisualC++/ExerciseBook/05.26/05.26.c create mode 100644 VisualC++/ExerciseBook/05.26/05.26.vcxproj create mode 100644 VisualC++/ExerciseBook/05.26/05.26.vcxproj.filters create mode 100644 VisualC++/ExerciseBook/05.26/05.26.vcxproj.user create mode 100644 VisualC++/ExerciseBook/05.26/CrossList.c create mode 100644 VisualC++/ExerciseBook/05.26/CrossList.h create mode 100644 VisualC++/ExerciseBook/05.26/TestData_M.txt create mode 100644 VisualC++/ExerciseBook/05.27/05.27.c create mode 100644 VisualC++/ExerciseBook/05.27/05.27.vcxproj create mode 100644 VisualC++/ExerciseBook/05.27/05.27.vcxproj.filters create mode 100644 VisualC++/ExerciseBook/05.27/05.27.vcxproj.user create mode 100644 VisualC++/ExerciseBook/05.27/CrossList.c create mode 100644 VisualC++/ExerciseBook/05.27/CrossList.h create mode 100644 VisualC++/ExerciseBook/05.27/TestData_M.txt create mode 100644 VisualC++/ExerciseBook/05.27/TestData_N.txt create mode 100644 VisualC++/ExerciseBook/05.28-05.29/05.28-05.29.c create mode 100644 VisualC++/ExerciseBook/05.28-05.29/05.28-05.29.vcxproj create mode 100644 VisualC++/ExerciseBook/05.28-05.29/05.28-05.29.vcxproj.filters create mode 100644 VisualC++/ExerciseBook/05.28-05.29/05.28-05.29.vcxproj.user create mode 100644 VisualC++/ExerciseBook/05.28-05.29/MPList.c create mode 100644 VisualC++/ExerciseBook/05.28-05.29/MPList.h create mode 100644 VisualC++/ExerciseBook/05.28-05.29/StringUtil.c create mode 100644 VisualC++/ExerciseBook/05.28-05.29/StringUtil.h create mode 100644 VisualC++/ExerciseBook/05.30.1/05.30.1.c create mode 100644 VisualC++/ExerciseBook/05.30.1/05.30.1.vcxproj create mode 100644 VisualC++/ExerciseBook/05.30.1/05.30.1.vcxproj.filters create mode 100644 VisualC++/ExerciseBook/05.30.1/05.30.1.vcxproj.user create mode 100644 VisualC++/ExerciseBook/05.30.1/GList-HT.c create mode 100644 VisualC++/ExerciseBook/05.30.1/GList-HT.h create mode 100644 VisualC++/ExerciseBook/05.30.1/SString.c create mode 100644 VisualC++/ExerciseBook/05.30.1/SString.h create mode 100644 VisualC++/ExerciseBook/05.30.2/05.30.2.c create mode 100644 VisualC++/ExerciseBook/05.30.2/05.30.2.vcxproj create mode 100644 VisualC++/ExerciseBook/05.30.2/05.30.2.vcxproj.filters create mode 100644 VisualC++/ExerciseBook/05.30.2/05.30.2.vcxproj.user create mode 100644 VisualC++/ExerciseBook/05.30.2/GList-E.c create mode 100644 VisualC++/ExerciseBook/05.30.2/GList-E.h create mode 100644 VisualC++/ExerciseBook/05.30.2/SString.c create mode 100644 VisualC++/ExerciseBook/05.30.2/SString.h create mode 100644 VisualC++/ExerciseBook/05.31/05.31.c create mode 100644 VisualC++/ExerciseBook/05.31/05.31.vcxproj create mode 100644 VisualC++/ExerciseBook/05.31/05.31.vcxproj.filters create mode 100644 VisualC++/ExerciseBook/05.31/05.31.vcxproj.user create mode 100644 VisualC++/ExerciseBook/05.31/GList-E.c create mode 100644 VisualC++/ExerciseBook/05.31/GList-E.h create mode 100644 VisualC++/ExerciseBook/05.31/SString.c create mode 100644 VisualC++/ExerciseBook/05.31/SString.h create mode 100644 VisualC++/ExerciseBook/05.32.1/05.32.1.c create mode 100644 VisualC++/ExerciseBook/05.32.1/05.32.1.vcxproj create mode 100644 VisualC++/ExerciseBook/05.32.1/05.32.1.vcxproj.filters create mode 100644 VisualC++/ExerciseBook/05.32.1/05.32.1.vcxproj.user create mode 100644 VisualC++/ExerciseBook/05.32.1/GList-HT.c create mode 100644 VisualC++/ExerciseBook/05.32.1/GList-HT.h create mode 100644 VisualC++/ExerciseBook/05.32.1/SString.c create mode 100644 VisualC++/ExerciseBook/05.32.1/SString.h create mode 100644 VisualC++/ExerciseBook/05.32.2/05.32.2.c create mode 100644 VisualC++/ExerciseBook/05.32.2/05.32.2.vcxproj create mode 100644 VisualC++/ExerciseBook/05.32.2/05.32.2.vcxproj.filters create mode 100644 VisualC++/ExerciseBook/05.32.2/05.32.2.vcxproj.user create mode 100644 VisualC++/ExerciseBook/05.32.2/GList-E.c create mode 100644 VisualC++/ExerciseBook/05.32.2/GList-E.h create mode 100644 VisualC++/ExerciseBook/05.32.2/SString.c create mode 100644 VisualC++/ExerciseBook/05.32.2/SString.h create mode 100644 VisualC++/ExerciseBook/05.33.1/05.33.1.c create mode 100644 VisualC++/ExerciseBook/05.33.1/05.33.1.vcxproj create mode 100644 VisualC++/ExerciseBook/05.33.1/05.33.1.vcxproj.filters create mode 100644 VisualC++/ExerciseBook/05.33.1/05.33.1.vcxproj.user create mode 100644 VisualC++/ExerciseBook/05.33.1/GList-HT.c create mode 100644 VisualC++/ExerciseBook/05.33.1/GList-HT.h create mode 100644 VisualC++/ExerciseBook/05.33.1/SString.c create mode 100644 VisualC++/ExerciseBook/05.33.1/SString.h create mode 100644 VisualC++/ExerciseBook/05.33.2/05.33.2.c create mode 100644 VisualC++/ExerciseBook/05.33.2/05.33.2.vcxproj create mode 100644 VisualC++/ExerciseBook/05.33.2/05.33.2.vcxproj.filters create mode 100644 VisualC++/ExerciseBook/05.33.2/05.33.2.vcxproj.user create mode 100644 VisualC++/ExerciseBook/05.33.2/GList-E.c create mode 100644 VisualC++/ExerciseBook/05.33.2/GList-E.h create mode 100644 VisualC++/ExerciseBook/05.33.2/SString.c create mode 100644 VisualC++/ExerciseBook/05.33.2/SString.h create mode 100644 VisualC++/ExerciseBook/05.34.1/05.34.1.c create mode 100644 VisualC++/ExerciseBook/05.34.1/05.34.1.vcxproj create mode 100644 VisualC++/ExerciseBook/05.34.1/05.34.1.vcxproj.filters create mode 100644 VisualC++/ExerciseBook/05.34.1/05.34.1.vcxproj.user create mode 100644 VisualC++/ExerciseBook/05.34.1/GList-HT.c create mode 100644 VisualC++/ExerciseBook/05.34.1/GList-HT.h create mode 100644 VisualC++/ExerciseBook/05.34.1/SString.c create mode 100644 VisualC++/ExerciseBook/05.34.1/SString.h create mode 100644 VisualC++/ExerciseBook/05.34.2/05.34.2.c create mode 100644 VisualC++/ExerciseBook/05.34.2/05.34.2.vcxproj create mode 100644 VisualC++/ExerciseBook/05.34.2/05.34.2.vcxproj.filters create mode 100644 VisualC++/ExerciseBook/05.34.2/05.34.2.vcxproj.user create mode 100644 VisualC++/ExerciseBook/05.34.2/GList-E.c create mode 100644 VisualC++/ExerciseBook/05.34.2/GList-E.h create mode 100644 VisualC++/ExerciseBook/05.34.2/SString.c create mode 100644 VisualC++/ExerciseBook/05.34.2/SString.h create mode 100644 VisualC++/ExerciseBook/05.35-05.36/05.35-05.36.c create mode 100644 VisualC++/ExerciseBook/05.35-05.36/05.35-05.36.vcxproj create mode 100644 VisualC++/ExerciseBook/05.35-05.36/05.35-05.36.vcxproj.filters create mode 100644 VisualC++/ExerciseBook/05.35-05.36/05.35-05.36.vcxproj.user create mode 100644 VisualC++/ExerciseBook/05.35-05.36/GList.c create mode 100644 VisualC++/ExerciseBook/05.35-05.36/GList.h create mode 100644 VisualC++/ExerciseBook/05.35-05.36/SString.c create mode 100644 VisualC++/ExerciseBook/05.35-05.36/SString.h create mode 100644 VisualC++/ExerciseBook/05.37.1/05.37.1.c create mode 100644 VisualC++/ExerciseBook/05.37.1/05.37.1.vcxproj create mode 100644 VisualC++/ExerciseBook/05.37.1/05.37.1.vcxproj.filters create mode 100644 VisualC++/ExerciseBook/05.37.1/05.37.1.vcxproj.user create mode 100644 VisualC++/ExerciseBook/05.37.1/GList-HT.c create mode 100644 VisualC++/ExerciseBook/05.37.1/GList-HT.h create mode 100644 VisualC++/ExerciseBook/05.37.1/SString.c create mode 100644 VisualC++/ExerciseBook/05.37.1/SString.h create mode 100644 VisualC++/ExerciseBook/05.37.2/05.37.2.c create mode 100644 VisualC++/ExerciseBook/05.37.2/05.37.2.vcxproj create mode 100644 VisualC++/ExerciseBook/05.37.2/05.37.2.vcxproj.filters create mode 100644 VisualC++/ExerciseBook/05.37.2/05.37.2.vcxproj.user create mode 100644 VisualC++/ExerciseBook/05.37.2/GList-E.c create mode 100644 VisualC++/ExerciseBook/05.37.2/GList-E.h create mode 100644 VisualC++/ExerciseBook/05.37.2/SString.c create mode 100644 VisualC++/ExerciseBook/05.37.2/SString.h create mode 100644 VisualC++/ExerciseBook/05.38.1/05.38.1.c create mode 100644 VisualC++/ExerciseBook/05.38.1/05.38.1.vcxproj create mode 100644 VisualC++/ExerciseBook/05.38.1/05.38.1.vcxproj.filters create mode 100644 VisualC++/ExerciseBook/05.38.1/05.38.1.vcxproj.user create mode 100644 VisualC++/ExerciseBook/05.38.1/GList-HT.c create mode 100644 VisualC++/ExerciseBook/05.38.1/GList-HT.h create mode 100644 VisualC++/ExerciseBook/05.38.1/SString.c create mode 100644 VisualC++/ExerciseBook/05.38.1/SString.h create mode 100644 VisualC++/ExerciseBook/05.38.2/05.38.2.c create mode 100644 VisualC++/ExerciseBook/05.38.2/05.38.2.vcxproj create mode 100644 VisualC++/ExerciseBook/05.38.2/05.38.2.vcxproj.filters create mode 100644 VisualC++/ExerciseBook/05.38.2/05.38.2.vcxproj.user create mode 100644 VisualC++/ExerciseBook/05.38.2/GList-E.c create mode 100644 VisualC++/ExerciseBook/05.38.2/GList-E.h create mode 100644 VisualC++/ExerciseBook/05.38.2/SString.c create mode 100644 VisualC++/ExerciseBook/05.38.2/SString.h create mode 100644 习题解析/05 数组和广义表/_v_images/20181128024131486_26584.png create mode 100644 习题解析/05 数组和广义表/_v_images/20181128024617431_31991.png create mode 100644 习题解析/05 数组和广义表/_v_images/20181128024818024_1955.png create mode 100644 习题解析/05 数组和广义表/_v_images/20181128024844354_32694.png create mode 100644 习题解析/05 数组和广义表/_v_images/20181128024901661_11428.png create mode 100644 习题解析/05 数组和广义表/_v_images/20181128024915115_3609.png create mode 100644 习题解析/05 数组和广义表/_v_images/20181128025105462_31218.png create mode 100644 习题解析/05 数组和广义表/_v_images/20181128025241824_32225.png create mode 100644 习题解析/05 数组和广义表/_v_images/20181128025435346_25694.png create mode 100644 习题解析/05 数组和广义表/_v_images/20181128025526044_25756.png create mode 100644 习题解析/05 数组和广义表/_v_images/20181128025550464_16430.png create mode 100644 习题解析/05 数组和广义表/_v_images/20181128025752290_16510.png create mode 100644 习题解析/05 数组和广义表/_v_images/20181128025833026_20359.png create mode 100644 习题解析/05 数组和广义表/_v_images/20181128025848038_32716.png create mode 100644 习题解析/05 数组和广义表/_v_images/20181128025918606_14220.png create mode 100644 习题解析/05 数组和广义表/_v_images/20181128025944030_21649.png create mode 100644 习题解析/05 数组和广义表/_v_images/20181128030006944_5864.png create mode 100644 习题解析/05 数组和广义表/_v_images/20181128030200899_4388.png create mode 100644 习题解析/05 数组和广义表/_v_images/20181128032123139_30296.png create mode 100644 习题解析/05 数组和广义表/_v_images/20181128032203810_17392.png create mode 100644 习题解析/05 数组和广义表/_v_images/20181128102525149_11720.png create mode 100644 习题解析/05 数组和广义表/_v_images/20181128102751394_22422.png create mode 100644 习题解析/05 数组和广义表/_v_images/20181128102824060_18222.png create mode 100644 习题解析/05 数组和广义表/第05章 数组与广义表.md diff --git a/CLion/ExerciseBook/05.17/05.17.c b/CLion/ExerciseBook/05.17/05.17.c new file mode 100644 index 0000000..88f75ca --- /dev/null +++ b/CLion/ExerciseBook/05.17/05.17.c @@ -0,0 +1,137 @@ +#include +#include // 提供 system、rand、srand 原型 +#include // 提供 time 原型 +#include "SqList.h" //**▲02 线性表**// + +// 递归求最大值 +int Algo_5_17_1(SqList L, int len); + +// 递归求最小值 +int Algo_5_17_2(SqList L, int len); + +// 递归求和 +int Algo_5_17_3(SqList L, int len); + +// 递归求积 +double Algo_5_17_4(SqList L, int len); + +// 递归求平均数 +double Algo_5_17_5(SqList L, int len); + + +int main(int argc, char* argv[]) { + SqList L; + int i; + + InitList(&L); + + srand((unsigned) time(NULL)); // 用系统时间做随机数种子 + + for(i = 1; i <= 10; i++) { + ListInsert(&L, i, rand() % 100); + } + + printf("顺序表中的数字序列为:"); + for(i = 0; i < L.length; i++) { + printf("%d ", L.elem[i]); + } + printf("\n"); + + printf("顺序表中的最大值为: %d \n", Algo_5_17_1(L, L.length)); + printf("顺序表中的最小值为: %d \n", Algo_5_17_2(L, L.length)); + printf("顺序表中的和为: %d \n", Algo_5_17_3(L, L.length)); + printf("顺序表中的积为: %.2f \n", Algo_5_17_4(L, L.length)); + printf("顺序表中的平均值为: %.2f \n", Algo_5_17_5(L, L.length)); + + return 0; +} + + +// 递归求最大值 +int Algo_5_17_1(SqList L, int len) { + int value, max; + + // 获取当前位置的值 + GetElem(L, len, &value); + + if(len == 1) { + return value; + } + + // 获取先前序列的最大值 + max = Algo_5_17_1(L, --len); + + return max > value ? max : value; +} + +// 递归求最小值 +int Algo_5_17_2(SqList L, int len) { + int value, min; + + // 获取当前位置的值 + GetElem(L, len, &value); + + if(len == 1) { + return value; + } + + // 获取先前序列的最小值 + min = Algo_5_17_2(L, --len); + + return min < value ? min : value; +} + +// 递归求和 +int Algo_5_17_3(SqList L, int len) { + int sum; + + // 获取当前位置的值 + GetElem(L, len, &sum); + + if(len == 1) { + return sum; + } + + // 获取先前序列的和 + sum += Algo_5_17_3(L, --len); + + return sum; +} + +// 递归求积 +double Algo_5_17_4(SqList L, int len) { + int value; + double mul; + + // 获取当前位置的值 + GetElem(L, len, &value); + mul = value; + + if(len == 1) { + return mul; + } + + // 获取先前序列的积 + mul *= Algo_5_17_4(L, --len); + + return mul; +} + +// 递归求平均数 +double Algo_5_17_5(SqList L, int len) { + int value; + double avg; + + // 获取当前位置的值 + GetElem(L, len, &value); + avg = value; + + if(len == 1) { + return avg; + } + + // 获取先前序列的平均数 + avg = (Algo_5_17_5(L, len - 1) * (len - 1) + value) / len; + + return avg; +} diff --git a/CLion/ExerciseBook/05.17/CMakeLists.txt b/CLion/ExerciseBook/05.17/CMakeLists.txt new file mode 100644 index 0000000..b86f006 --- /dev/null +++ b/CLion/ExerciseBook/05.17/CMakeLists.txt @@ -0,0 +1,7 @@ +# 包含公共库 +include_directories(${CMAKE_SOURCE_DIR}/Status) + +# 生成可执行文件 +add_executable(05.17 SqList.h SqList.c 05.17.c) +# 链接公共库 +target_link_libraries(05.17 Scanf_lib) \ No newline at end of file diff --git a/CLion/ExerciseBook/05.17/SqList.c b/CLion/ExerciseBook/05.17/SqList.c new file mode 100644 index 0000000..df834a4 --- /dev/null +++ b/CLion/ExerciseBook/05.17/SqList.c @@ -0,0 +1,337 @@ +/*============================= + * 线性表的顺序存储结构(顺序表) + * + * 包含算法: 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; // 初始化成功 +} + +/* + * 销毁(结构) + * + * 释放顺序表所占内存。 + */ +Status DestroyList(SqList* L) { + // 确保顺序表结构存在 + if(L == NULL || (*L).elem == NULL) { + return ERROR; + } + + // 释放顺序表内存 + free((*L).elem); + + // 释放内存后置空指针 + (*L).elem = NULL; + + // 顺序表长度跟容量都归零 + (*L).length = 0; + (*L).listsize = 0; + + return OK; +} + +/* + * 置空(内容) + * + * 只是清理顺序表中存储的数据,不释放顺序表所占内存。 + */ +Status ClearList(SqList* L) { + // 确保顺序表结构存在 + if(L == NULL || (*L).elem == NULL) { + return ERROR; + } + + (*L).length = 0; + + return OK; +} + +/* + * 判空 + * + * 判断顺序表中是否包含有效数据。 + * + * 返回值: + * TRUE : 顺序表为空 + * FALSE: 顺序表不为空 + */ +Status ListEmpty(SqList L) { + return L.length == 0 ? TRUE : FALSE; +} + +/* + * 计数 + * + * 返回顺序表包含的有效元素的数量。 + */ +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.6 ████████ + * + * 查找 + * + * 返回顺序表中首个与e满足Compare关系的元素位序。 + * 如果不存在这样的元素,则返回0。 + * + *【备注】 + * 元素e是Compare函数第二个形参 + */ +int LocateElem(SqList L, ElemType e, Status(Compare)(ElemType, ElemType)) { + int i; + ElemType* p; + + // 确保顺序表结构存在 + if(L.elem == NULL) { + return ERROR; + } + + /* + * i的初值为第1个元素的位序 + * + * 其实,更自然的写法是将i初始化为第1个元素的索引 + * 但由于教材中是按位序计数的,所以这里仍写作位序 + */ + i = 1; + + // p的初值为第1个元素的存储位置 + p = L.elem; + + // 遍历顺序表 + while(i <= L.length && !Compare(*p++, e)) { + ++i; + } + + if(i <= L.length) { + return i; + } else { + return 0; + } +} + +/* + * 前驱 + * + * 获取元素cur_e的前驱, + * 如果存在,将其存储到pre_e中,返回OK, + * 如果不存在,则返回ERROR。 + */ +Status PriorElem(SqList L, ElemType cur_e, ElemType* pre_e) { + int i; + + // 确保顺序表结构存在,且最少包含两个元素 + if(L.elem == NULL || L.length < 2) { + return ERROR; + } + + // 这里的i初始化为第1个元素的【索引】 + i = 0; + + // 从第1个元素开始,查找cur_e的位置 + while(i < L.length && L.elem[i] != cur_e) { + ++i; + } + + // 如果cur_e是首个元素(没有前驱),或者没找到元素cur_e,返回ERROR + if(i==0 || i >= L.length) { + return ERROR; + } + + // 存储cur_e的前驱 + *pre_e = L.elem[i - 1]; + + return OK; +} + +/* + * 后继 + * + * 获取元素cur_e的后继, + * 如果存在,将其存储到next_e中,返回OK, + * 如果不存在,则返回ERROR。 + */ +Status NextElem(SqList L, ElemType cur_e, ElemType* next_e) { + int i; + + // 确保顺序表结构存在,且最少包含两个元素 + if(L.elem == NULL || L.length < 2) { + return ERROR; + } + + // 这里的i初始化为第1个元素的【索引】 + i = 0; + + // 从第1个元素开始,查找cur_e的位置 + while(i < L.length-1 && L.elem[i] != cur_e) { + ++i; + } + + // 如果cur_e是最后1个元素(没有前驱),或者没找到元素cur_e,返回ERROR + if(i >= L.length-1) { + return ERROR; + } + + // 存储cur_e的前驱 + *next_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; +} + +/* + * ████████ 算法2.5 ████████ + * + * 删除 + * + * 删除顺序表第i个位置上的元素,并将被删除元素存储到e中。 + * 删除成功则返回OK,否则返回ERROR。 + * + *【备注】 + * 教材中i的含义是元素位置,从1开始计数 + */ +Status ListDelete(SqList* L, int i, ElemType* e) { + ElemType* p, * q; + + // 确保顺序表结构存在 + if(L == NULL || (*L).elem == NULL) { + return ERROR; + } + + // i值越界 + if(i < 1 || i > (*L).length) { + return ERROR; + } + + // p为被删除元素的位置 + p = &(*L).elem[i - 1]; + + // 1.获取被删除元素 + *e = *p; + + // 表尾元素位置 + q = (*L).elem + (*L).length - 1; + + // 2.左移元素,被删除元素的位置上会有新元素进来 + for(++p; p <= q; ++p) { + *(p - 1) = *p; + } + + // 3.表长减1 + (*L).length--; + + return OK; +} + +/* + * 遍历 + * + * 用visit函数访问顺序表L + */ +void ListTraverse(SqList L, void(Visit)(ElemType)) { + int i; + + for(i = 0; i < L.length; i++) { + Visit(L.elem[i]); + } + + printf("\n"); +} diff --git a/CLion/ExerciseBook/05.17/SqList.h b/CLion/ExerciseBook/05.17/SqList.h new file mode 100644 index 0000000..51e9e93 --- /dev/null +++ b/CLion/ExerciseBook/05.17/SqList.h @@ -0,0 +1,149 @@ +/*============================= + * 线性表的顺序存储结构(顺序表) + * + * 包含算法: 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); + +/* + * 销毁(结构) + * + * 释放顺序表所占内存。 + */ +Status DestroyList(SqList* L); + +/* + * 置空(内容) + * + * 只是清理顺序表中存储的数据,不释放顺序表所占内存。 + */ +Status ClearList(SqList* L); + +/* + * 判空 + * + * 判断顺序表中是否包含有效数据。 + * + * 返回值: + * TRUE : 顺序表为空 + * FALSE: 顺序表不为空 + */ +Status ListEmpty(SqList L); + +/* + * 计数 + * + * 返回顺序表包含的有效元素的数量。 + */ +int ListLength(SqList L); + +/* + * 取值 + * + * 获取顺序表中第i个元素,将其存储到e中。 + * 如果可以找到,返回OK,否则,返回ERROR。 + * + *【备注】 + * 教材中i的含义是元素位置,从1开始计数,但这不符合编码的通用约定。 + * 通常,i的含义应该指索引,即从0开始计数。 + */ +Status GetElem(SqList L, int i, ElemType* e); + +/* + * ████████ 算法2.6 ████████ + * + * 查找 + * + * 返回顺序表中首个与e满足Compare关系的元素位序。 + * 如果不存在这样的元素,则返回0。 + * + *【备注】 + * 元素e是Compare函数第二个形参 + */ +int LocateElem(SqList L, ElemType e, Status(Compare)(ElemType, ElemType)); + +/* + * 前驱 + * + * 获取元素cur_e的前驱, + * 如果存在,将其存储到pre_e中,返回OK, + * 如果不存在,则返回ERROR。 + */ +Status PriorElem(SqList L, ElemType cur_e, ElemType* pre_e); + +/* + * 后继 + * + * 获取元素cur_e的后继, + * 如果存在,将其存储到next_e中,返回OK, + * 如果不存在,则返回ERROR。 + */ +Status NextElem(SqList L, ElemType cur_e, ElemType* next_e); + +/* + * ████████ 算法2.4 ████████ + * + * 插入 + * + * 向顺序表第i个位置上插入e,插入成功则返回OK,否则返回ERROR。 + * + *【备注】 + * 教材中i的含义是元素位置,从1开始计数 + */ +Status ListInsert(SqList* L, int i, ElemType e); + +/* + * ████████ 算法2.5 ████████ + * + * 删除 + * + * 删除顺序表第i个位置上的元素,并将被删除元素存储到e中。 + * 删除成功则返回OK,否则返回ERROR。 + * + *【备注】 + * 教材中i的含义是元素位置,从1开始计数 + */ +Status ListDelete(SqList* L, int i, ElemType* e); + +/* + * 遍历 + * + * 用visit函数访问顺序表L + */ +void ListTraverse(SqList L, void (Visit)(ElemType)); + +#endif diff --git a/CLion/ExerciseBook/05.18/05.18.c b/CLion/ExerciseBook/05.18/05.18.c new file mode 100644 index 0000000..10f91a3 --- /dev/null +++ b/CLion/ExerciseBook/05.18/05.18.c @@ -0,0 +1,91 @@ +#include +#include // 提供 system、rand、srand 原型 +#include // 提供 time 原型 +#include "Status.h" //**▲01 绪论**// +#include "Array.h" //**▲05 数组和广义表**// + +/* + * 将数组A中的元素循环右移k个位置 + */ +Status Algo_5_18(Array A, int k); + +// 逆置[begin, end]范围内的元素 +static Status Reversal_5_18(Array A, int begin, int end); + + +int main(int argc, char* argv[]) { + Array A; + ElemType e; + int i; + int k = 7; // 右移位数 + + // 初始化长度为10的一维数组 + InitArray(&A, 1, 10); + + srand((unsigned) time(NULL)); // 用系统时间做随机数种子 + + for(i = 0; i < Length(A); i++) { + e = rand() % 100; + Assign(&A, e, i); + } + + printf("数组A包含的元素为:\n"); + for(i = 0; i < Length(A); i++) { + Value(A, &e, i); + printf("%2d ", e); + } + printf("\n"); + + printf("将数组A循环右移 %d 位后:\n", k); + Algo_5_18(A, k); + for(i = 0; i < Length(A); i++) { + Value(A, &e, i); + printf("%2d ", e); + } + printf("\n"); + + return 0; +} + + +/* + * 将数组A中的元素循环右移k个位置 + */ +Status Algo_5_18(Array A, int k) { + int n, p; + + n = Length(A); + + p = k % n; // 计算实际需要循环右移的位数 + if(p <= 0) { + return ERROR; + } + + Reversal_5_18(A, 0, n-1); // 逆置[0, n-1]范围内的元素 + Reversal_5_18(A, 0, p-1); // 逆置[0, p-1]范围内的元素 + Reversal_5_18(A, p, n-1); // 逆置[p, n-1]范围内的元素 + + return OK; +} + +// 逆置[begin, end]范围内的元素 +static Status Reversal_5_18(Array A, int begin, int end) { + int i; + ElemType e1, e2; + + if(begin < 0 || end > Length(A)-1 || begin >= end) { + return ERROR; + } + + // 用"交换法"逆置 + for(i = 0; i < (end - begin + 1) / 2; i++) { + Value(A, &e1, begin + i); // 获取中点前的元素 + Value(A, &e2, end - i); // 获取中点后的元素 + + // 两元素完成交换 + Assign(&A, e2, begin + i); + Assign(&A, e1, end - i); + } + + return OK; +} diff --git a/CLion/ExerciseBook/05.18/Array.c b/CLion/ExerciseBook/05.18/Array.c new file mode 100644 index 0000000..db277ac --- /dev/null +++ b/CLion/ExerciseBook/05.18/Array.c @@ -0,0 +1,195 @@ +/*======== + * 多维数组 + =========*/ + +#include "Array.h" //**▲05 数组和广义表**// + +/* + * 初始化。 + * + * 初始化维数为dim的数组,可变参数指示各维度的大小。 + */ +Status InitArray(Array* A, int dim, ...) { + int elemtotal; // 统计数组中总元素个数 + va_list ap; // ap存放可变参数表信息,指示各维度的大小 + int i; + + if(A == NULL) { + return ERROR; + } + + if(dim < 1 || dim > MAX_ARRAY_DIM) { // 数组维数有限制 + return ERROR; + } + + (*A).dim = dim; // 初始化数组维度 + + // 初始化数组维度信息表 + (*A).bounds = (int*) malloc(dim * sizeof(int)); + if((*A).bounds == NULL) { + exit(OVERFLOW); + } + + // 若维度长度合法,则存入bounds,并求出A的元素总数elemtotal + elemtotal = 1; + + // 使ap指向第一个可变参数,dim相当于起始标识 + va_start(ap, dim); + + for(i = 0; i < dim; i++) { + // 记录当前维度的宽度 + (*A).bounds[i] = va_arg(ap, int); + if((*A).bounds[i] <= 0) { + return ERROR; + } + + elemtotal *= A->bounds[i]; + } + + // 置空ap + va_end(ap); + + // 初始化数组空间,以存放元素 + (*A).base = (ElemType*) malloc(elemtotal * sizeof(ElemType)); + if((*A).base == NULL) { + exit(OVERFLOW); + } + + // 初始化数组映像函数常量信息表 + (*A).constants = (int*) malloc(dim * sizeof(int)); + if((*A).constants == NULL) { + exit(OVERFLOW); + } + + // 遍历最后一个维度,每次总是需要跨越一个元素 + (*A).constants[dim - 1] = 1; + for(i = dim - 2; i >= 0; i--) { + (*A).constants[i] = (*A).bounds[i + 1] * (*A).constants[i + 1]; + } + + /* + * 举例: + * 对于三维数组[2,3,4]来说,bounds的值为<2,3,4>,constants的值为<12,4,1> + * 分析bounds,第一维中包含2个元素,第二维中包含3个元素,第三维中包含4个元素 + * 分析constants,遍历第一维,每次需要跨过12个元素,遍历第二维,每次需要跨越4个元素,遍历第三维,每次需要跨越1个元素 + */ + + return OK; +} + +/* + * 销毁(结构)。 + * + * 销毁数组占用的空间。 + */ +Status DestroyArray(Array* A) { + if(A == NULL || (*A).base == NULL || (*A).bounds == NULL || (*A).constants == NULL) { + return ERROR; + } + + free((*A).base); + (*A).base = NULL; + + free((*A).bounds); + (*A).bounds = NULL; + + free((*A).constants); + (*A).constants = NULL; + + (*A).dim = 0; + + return OK; +} + +/* + * 取值。 + * + * 获取指定下标处的元素值,可变参数为dim个下标值,指示待获取元素所在下标。 + */ +Status Value(Array A, ElemType* e, ...) { + va_list ap; + Status result; + int off; + + va_start(ap, e); + + // 计算从起点元素到目标元素需要跨越的元素数量 + result = Locate(A, ap, &off); + + va_end(ap); + + if(result == OVERFLOW) { + return result; + } + + *e = *(A.base + off); + + return OK; +} + +/* + * 赋值。 + * + * 为指定下标处的元素赋值,可变参数为dim个下标值,指示待赋值元素所在下标。 + */ +Status Assign(Array* A, ElemType e, ...) { + va_list ap; + Status result; + int off; + + va_start(ap, e); + + // 计算从起点元素到目标元素需要跨越的元素数量 + result = Locate(*A, ap, &off); + + va_end(ap); + + if(result == OVERFLOW) { + return result; + } + + *(A->base + off) = e; + + return OK; +} + +/* + * 求出ap指示的值在数组A中的相对位置, + * 即计算从起点元素到目标元素需要跨越的元素数量。 + */ +static Status Locate(Array A, va_list ap, int* off) { + int i, ind; + + *off = 0; + + for(i = 0; i < A.dim; i++) { + ind = va_arg(ap, int); + + // 保证下标不越界 + if(ind < 0 || ind >= A.bounds[i]) { + return OVERFLOW; + } + + // 某个维度的单位元素个数*需要跨过的单位 + *off += A.constants[i] * ind; + } + + return OK; +} + +/* + * 计算数组中元素的个数 + * + *【注】 + * 此为新增的函数 + */ +int Length(Array A) { + int i; + int elemtotal = 1; + + for(i = 0; i < A.dim; i++) { + elemtotal *= A.bounds[i]; + } + + return elemtotal; +} diff --git a/CLion/ExerciseBook/05.18/Array.h b/CLion/ExerciseBook/05.18/Array.h new file mode 100644 index 0000000..d97e1e8 --- /dev/null +++ b/CLion/ExerciseBook/05.18/Array.h @@ -0,0 +1,70 @@ +/*======== + * 多维数组 + =========*/ + +#ifndef ARRAY_H +#define ARRAY_H + +#include +#include // 提供malloc、realloc、free、exit原型 +#include // 提供宏va_start、va_arg、va_end +#include "Status.h" //**▲01 绪论**// + +/* 宏定义 */ +#define MAX_ARRAY_DIM 8 // 这里假设数组的最大维度为8 + +/* 数组元素类型 */ +typedef int ElemType; + +/* 数组的顺序存储表示 */ +typedef struct { + ElemType* base; // 数组元素基址(存放数组元素) + int dim; // 数组维数 + int* bounds; // 数组维界基址(存放数组行、列信息) + int* constants; // 数组映像函数常量基址(存储遍历某个维度时,每次需要越过的元素个数) +} Array; + + +/* + * 初始化。 + * + * 初始化维数为dim的数组,可变参数指示各维度的大小。 + */ +Status InitArray(Array* A, int dim, ...); + +/* + * 销毁(结构)。 + * + * 销毁数组占用的空间。 + */ +Status DestroyArray(Array* A); + +/* + * 取值。 + * + * 获取指定下标处的元素值,可变参数为dim个下标值,指示待获取元素所在下标。 + */ +Status Value(Array A, ElemType* e, ...); + +/* + * 赋值。 + * + * 为指定下标处的元素赋值,可变参数为dim个下标值,指示待赋值元素所在下标。 + */ +Status Assign(Array* A, ElemType e, ...); + +/* + * 求出ap指示的值在数组A中的相对位置, + * 即计算从起点元素到目标元素需要跨越的元素数量。 + */ +static Status Locate(Array A, va_list ap, int *off); + +/* + * 计算数组中元素的个数 + * + *【注】 + * 此为新增的函数 + */ +int Length(Array A); + +#endif diff --git a/CLion/ExerciseBook/05.18/CMakeLists.txt b/CLion/ExerciseBook/05.18/CMakeLists.txt new file mode 100644 index 0000000..6902b25 --- /dev/null +++ b/CLion/ExerciseBook/05.18/CMakeLists.txt @@ -0,0 +1,7 @@ +# 包含公共库 +include_directories(${CMAKE_SOURCE_DIR}/Status) + +# 生成可执行文件 +add_executable(05.18 Array.h Array.c 05.18.c) +# 链接公共库 +target_link_libraries(05.18 Scanf_lib) \ No newline at end of file diff --git a/CLion/ExerciseBook/05.19/05.19.c b/CLion/ExerciseBook/05.19/05.19.c new file mode 100644 index 0000000..67d9b0e --- /dev/null +++ b/CLion/ExerciseBook/05.19/05.19.c @@ -0,0 +1,114 @@ +#include +#include +#include +#include "Array.h" //**▲05 数组和广义表**// + +/* 数组元素坐标 */ +typedef struct { + int x; + int y; + ElemType value; +} Elem; + +/* + * 寻找二维数组A中的马鞍点 + * + *【注】 + * 数组每行每列的元素不唯一 + */ +void Algo_5_19(Array A); + + +int main(int argc, char* argv[]) { + int a[3][4] = { + {10, 16, 13, 14}, + {15, 18, 15, 20}, + { 5, 8, 12, 32} + }; + int i, j; + Array A; + + // 准备测试数据 + InitArray(&A, 2, 3, 4); + for(i = 0; i < 3; i++) { + for(j = 0; j < 4; j++) { + Assign(&A, a[i][j], i, j); + } + } + + // 寻找马鞍点 + Algo_5_19(A); + + return 0; +} + + +/* + * 寻找二维数组A中的马鞍点 + * + *【注】 + * 数组每行每列的元素不唯一 + */ +void Algo_5_19(Array A) { + int row, col; // 行数与列数 + Elem* Min; // 存储数组A中每行的最小值信息 + ElemType* Max; // 存储数组A中每列的最大值(只存储值) + int total, k; // total记录Min中存储的元素数量 + int i, j; + ElemType e; + int count; + int min; + + row = A.bounds[0]; + col = A.bounds[1]; + + Min = (Elem*) malloc(row * col * sizeof(Elem)); + + Max = (ElemType*) malloc(col * sizeof(ElemType)); + // 初始化最大值数组 + for(j = 0; j < col; j++) { + Max[j] = INT_MIN; + } + + total = 0; + + for(i = 0; i < row; i++) { + min = INT_MAX; // 当前行最小值 + + for(j = 0; j < col; j++) { + // 获取元素A[i][j] + Value(A, &e, i, j); + + // 记录最大值 + if(e > Max[j]) { + Max[j] = e; + } + + // 记录最小值信息 + if(e <= min) { + // 每次发现更小的,k都需要重置 + if(e < min) { + k = total; // 重新统计当前行的最小值元素数量 + min = e; + } + + Min[k].x = i; + Min[k].y = j; + Min[k].value = e; + + k++; + } + } + + // 累加本次新增的元素数量 + total += (k - total); + } + + count = 0; + for(k = 0; k < total; k++) { + // 如果当前最小值所在列的最大值与当前最小值一致,则遇到了马鞍点 + if(Max[Min[k].y] == Min[k].value) { + printf("第 %2d 个马鞍点是位于 (%2d, %2d) 处的 %d\n", ++count, Min[k].x, Min[k].y, Min[k].value); + } + } +} diff --git a/CLion/ExerciseBook/05.19/Array.c b/CLion/ExerciseBook/05.19/Array.c new file mode 100644 index 0000000..db6347e --- /dev/null +++ b/CLion/ExerciseBook/05.19/Array.c @@ -0,0 +1,178 @@ +/*======== + * 多维数组 + =========*/ + +#include "Array.h" //**▲05 数组和广义表**// + +/* + * 初始化。 + * + * 初始化维数为dim的数组,可变参数指示各维度的大小。 + */ +Status InitArray(Array* A, int dim, ...) { + int elemtotal; // 统计数组中总元素个数 + va_list ap; // ap存放可变参数表信息,指示各维度的大小 + int i; + + if(A == NULL) { + return ERROR; + } + + if(dim < 1 || dim > MAX_ARRAY_DIM) { // 数组维数有限制 + return ERROR; + } + + (*A).dim = dim; // 初始化数组维度 + + // 初始化数组维度信息表 + (*A).bounds = (int*) malloc(dim * sizeof(int)); + if((*A).bounds == NULL) { + exit(OVERFLOW); + } + + // 若维度长度合法,则存入bounds,并求出A的元素总数elemtotal + elemtotal = 1; + + // 使ap指向第一个可变参数,dim相当于起始标识 + va_start(ap, dim); + + for(i = 0; i < dim; i++) { + // 记录当前维度的宽度 + (*A).bounds[i] = va_arg(ap, int); + if((*A).bounds[i] <= 0) { + return ERROR; + } + + elemtotal *= A->bounds[i]; + } + + // 置空ap + va_end(ap); + + // 初始化数组空间,以存放元素 + (*A).base = (ElemType*) malloc(elemtotal * sizeof(ElemType)); + if((*A).base == NULL) { + exit(OVERFLOW); + } + + // 初始化数组映像函数常量信息表 + (*A).constants = (int*) malloc(dim * sizeof(int)); + if((*A).constants == NULL) { + exit(OVERFLOW); + } + + // 遍历最后一个维度,每次总是需要跨越一个元素 + (*A).constants[dim - 1] = 1; + for(i = dim - 2; i >= 0; i--) { + (*A).constants[i] = (*A).bounds[i + 1] * (*A).constants[i + 1]; + } + + /* + * 举例: + * 对于三维数组[2,3,4]来说,bounds的值为<2,3,4>,constants的值为<12,4,1> + * 分析bounds,第一维中包含2个元素,第二维中包含3个元素,第三维中包含4个元素 + * 分析constants,遍历第一维,每次需要跨过12个元素,遍历第二维,每次需要跨越4个元素,遍历第三维,每次需要跨越1个元素 + */ + + return OK; +} + +/* + * 销毁(结构)。 + * + * 销毁数组占用的空间。 + */ +Status DestroyArray(Array* A) { + if(A == NULL || (*A).base == NULL || (*A).bounds == NULL || (*A).constants == NULL) { + return ERROR; + } + + free((*A).base); + (*A).base = NULL; + + free((*A).bounds); + (*A).bounds = NULL; + + free((*A).constants); + (*A).constants = NULL; + + (*A).dim = 0; + + return OK; +} + +/* + * 取值。 + * + * 获取指定下标处的元素值,可变参数为dim个下标值,指示待获取元素所在下标。 + */ +Status Value(Array A, ElemType* e, ...) { + va_list ap; + Status result; + int off; + + va_start(ap, e); + + // 计算从起点元素到目标元素需要跨越的元素数量 + result = Locate(A, ap, &off); + + va_end(ap); + + if(result == OVERFLOW) { + return result; + } + + *e = *(A.base + off); + + return OK; +} + +/* + * 赋值。 + * + * 为指定下标处的元素赋值,可变参数为dim个下标值,指示待赋值元素所在下标。 + */ +Status Assign(Array* A, ElemType e, ...) { + va_list ap; + Status result; + int off; + + va_start(ap, e); + + // 计算从起点元素到目标元素需要跨越的元素数量 + result = Locate(*A, ap, &off); + + va_end(ap); + + if(result == OVERFLOW) { + return result; + } + + *(A->base + off) = e; + + return OK; +} + +/* + * 求出ap指示的值在数组A中的相对位置, + * 即计算从起点元素到目标元素需要跨越的元素数量。 + */ +static Status Locate(Array A, va_list ap, int* off) { + int i, ind; + + *off = 0; + + for(i = 0; i < A.dim; i++) { + ind = va_arg(ap, int); + + // 保证下标不越界 + if(ind < 0 || ind >= A.bounds[i]) { + return OVERFLOW; + } + + // 某个维度的单位元素个数*需要跨过的单位 + *off += A.constants[i] * ind; + } + + return OK; +} diff --git a/CLion/ExerciseBook/05.19/Array.h b/CLion/ExerciseBook/05.19/Array.h new file mode 100644 index 0000000..fe63aed --- /dev/null +++ b/CLion/ExerciseBook/05.19/Array.h @@ -0,0 +1,62 @@ +/*======== + * 多维数组 + =========*/ + +#ifndef ARRAY_H +#define ARRAY_H + +#include +#include // 提供malloc、realloc、free、exit原型 +#include // 提供宏va_start、va_arg、va_end +#include "Status.h" //**▲01 绪论**// + +/* 宏定义 */ +#define MAX_ARRAY_DIM 8 // 这里假设数组的最大维度为8 + +/* 数组元素类型 */ +typedef int ElemType; + +/* 数组的顺序存储表示 */ +typedef struct { + ElemType* base; // 数组元素基址(存放数组元素) + int dim; // 数组维数 + int* bounds; // 数组维界基址(存放数组行、列信息) + int* constants; // 数组映像函数常量基址(存储遍历某个维度时,每次需要越过的元素个数) +} Array; + + +/* + * 初始化。 + * + * 初始化维数为dim的数组,可变参数指示各维度的大小。 + */ +Status InitArray(Array* A, int dim, ...); + +/* + * 销毁(结构)。 + * + * 销毁数组占用的空间。 + */ +Status DestroyArray(Array* A); + +/* + * 取值。 + * + * 获取指定下标处的元素值,可变参数为dim个下标值,指示待获取元素所在下标。 + */ +Status Value(Array A, ElemType* e, ...); + +/* + * 赋值。 + * + * 为指定下标处的元素赋值,可变参数为dim个下标值,指示待赋值元素所在下标。 + */ +Status Assign(Array* A, ElemType e, ...); + +/* + * 求出ap指示的值在数组A中的相对位置, + * 即计算从起点元素到目标元素需要跨越的元素数量。 + */ +static Status Locate(Array A, va_list ap, int *off); + +#endif diff --git a/CLion/ExerciseBook/05.19/CMakeLists.txt b/CLion/ExerciseBook/05.19/CMakeLists.txt new file mode 100644 index 0000000..47f532c --- /dev/null +++ b/CLion/ExerciseBook/05.19/CMakeLists.txt @@ -0,0 +1,7 @@ +# 包含公共库 +include_directories(${CMAKE_SOURCE_DIR}/Status) + +# 生成可执行文件 +add_executable(05.19 Array.h Array.c 05.19.c) +# 链接公共库 +target_link_libraries(05.19 Scanf_lib) \ No newline at end of file diff --git a/CLion/ExerciseBook/05.20/05.20.c b/CLion/ExerciseBook/05.20/05.20.c new file mode 100644 index 0000000..096516e --- /dev/null +++ b/CLion/ExerciseBook/05.20/05.20.c @@ -0,0 +1,112 @@ +#include +#include // 提供 system、rand、srand 原型 +#include // 提供 time 原型 +#include "Array.h" //**▲05 数组和广义表**// + +// 根据多项式系数表,输出多项式 +void Algo_5_20(Array A); + +// 数组输出函数的内部实现 +static void Print(Array A, int dim, int index[]); + + +int main(int argc, char* argv[]) { + Array A; + int i, j, k; + ElemType e = 0; + + // 初始化一个维度为<2,3,4>的三维数组 + InitArray(&A, 3, 2, 3, 4); + + srand((unsigned) time(NULL)); // 用系统时间做随机数种子 + + // 准备测试数据 + for(i = 0; i < A.bounds[0]; i++) { + for(j = 0; j < A.bounds[1]; j++) { + for(k = 0; k < A.bounds[2]; k++) { + e = rand() % 50 - 25; // 用随机数填充数组 + Assign(&A, e, i, j, k); + } + } + } + + // 输出多项式 + Algo_5_20(A); + + return 0; +} + + +// 根据多项式系数表,输出多项式 +void Algo_5_20(Array A) { + int i; + int* index; + + // 在遍历数组元素时,记录每个元素的索引(只记录前dim-1维) + index = (int*) malloc((A.dim - 1) * sizeof(int)); + for(i = 0; i < A.dim - 1; i++) { + index[i] = -1; + } + + Print(A, 1, index); + + printf("\n"); +} + +// 数组输出函数的内部实现 +static void Print(Array A, int dim, int index[]) { + int i, j; + int start; + ElemType coef; + + if(dim == A.dim) { + start = 0; + + // 计算本次遍历的起始元素位置 + for(i = 0; i < dim - 1; i++) { + start += index[i] * A.constants[i]; + } + + // 遍历最后一个维度内的元素 + for(i = 0; i < A.bounds[dim - 1]; i++) { + // 获取系数 + coef = A.base[start + i]; + + // 系数为0的项不必输出 + if(coef == 0) { + continue; + } + + if(coef < 0) { + printf(" - "); + } else { + printf(" + "); + } + + // 系数的绝对值为1时,无需输出系数 + if(abs(coef) != 1) { + // 输出系数(不带符号,前面已经输出过符号),第一项也会带着符号 + printf("%d", abs(coef)); + } + + /* + * 输出多项式的每一项,未知数依次用a、b、c...命名 + * + *【注】 + * 对于指数位0或者指数位1的情形,这里依然将其打印出来了 + * 可以选择不打印这些标记 + */ + for(j = 0; j < dim - 1; j++) { + printf("%c^%d", 'a' + j, index[j]); + } + printf("%c^%d", 'a' + j, i); + } + } else { + for(i = 0; i < A.bounds[dim - 1]; i++) { + // 索引轮转 + index[dim - 1] = (index[dim - 1] + 1 + A.bounds[dim - 1]) % A.bounds[dim - 1]; + + Print(A, dim + 1, index); + } + } +} diff --git a/CLion/ExerciseBook/05.20/Array.c b/CLion/ExerciseBook/05.20/Array.c new file mode 100644 index 0000000..db6347e --- /dev/null +++ b/CLion/ExerciseBook/05.20/Array.c @@ -0,0 +1,178 @@ +/*======== + * 多维数组 + =========*/ + +#include "Array.h" //**▲05 数组和广义表**// + +/* + * 初始化。 + * + * 初始化维数为dim的数组,可变参数指示各维度的大小。 + */ +Status InitArray(Array* A, int dim, ...) { + int elemtotal; // 统计数组中总元素个数 + va_list ap; // ap存放可变参数表信息,指示各维度的大小 + int i; + + if(A == NULL) { + return ERROR; + } + + if(dim < 1 || dim > MAX_ARRAY_DIM) { // 数组维数有限制 + return ERROR; + } + + (*A).dim = dim; // 初始化数组维度 + + // 初始化数组维度信息表 + (*A).bounds = (int*) malloc(dim * sizeof(int)); + if((*A).bounds == NULL) { + exit(OVERFLOW); + } + + // 若维度长度合法,则存入bounds,并求出A的元素总数elemtotal + elemtotal = 1; + + // 使ap指向第一个可变参数,dim相当于起始标识 + va_start(ap, dim); + + for(i = 0; i < dim; i++) { + // 记录当前维度的宽度 + (*A).bounds[i] = va_arg(ap, int); + if((*A).bounds[i] <= 0) { + return ERROR; + } + + elemtotal *= A->bounds[i]; + } + + // 置空ap + va_end(ap); + + // 初始化数组空间,以存放元素 + (*A).base = (ElemType*) malloc(elemtotal * sizeof(ElemType)); + if((*A).base == NULL) { + exit(OVERFLOW); + } + + // 初始化数组映像函数常量信息表 + (*A).constants = (int*) malloc(dim * sizeof(int)); + if((*A).constants == NULL) { + exit(OVERFLOW); + } + + // 遍历最后一个维度,每次总是需要跨越一个元素 + (*A).constants[dim - 1] = 1; + for(i = dim - 2; i >= 0; i--) { + (*A).constants[i] = (*A).bounds[i + 1] * (*A).constants[i + 1]; + } + + /* + * 举例: + * 对于三维数组[2,3,4]来说,bounds的值为<2,3,4>,constants的值为<12,4,1> + * 分析bounds,第一维中包含2个元素,第二维中包含3个元素,第三维中包含4个元素 + * 分析constants,遍历第一维,每次需要跨过12个元素,遍历第二维,每次需要跨越4个元素,遍历第三维,每次需要跨越1个元素 + */ + + return OK; +} + +/* + * 销毁(结构)。 + * + * 销毁数组占用的空间。 + */ +Status DestroyArray(Array* A) { + if(A == NULL || (*A).base == NULL || (*A).bounds == NULL || (*A).constants == NULL) { + return ERROR; + } + + free((*A).base); + (*A).base = NULL; + + free((*A).bounds); + (*A).bounds = NULL; + + free((*A).constants); + (*A).constants = NULL; + + (*A).dim = 0; + + return OK; +} + +/* + * 取值。 + * + * 获取指定下标处的元素值,可变参数为dim个下标值,指示待获取元素所在下标。 + */ +Status Value(Array A, ElemType* e, ...) { + va_list ap; + Status result; + int off; + + va_start(ap, e); + + // 计算从起点元素到目标元素需要跨越的元素数量 + result = Locate(A, ap, &off); + + va_end(ap); + + if(result == OVERFLOW) { + return result; + } + + *e = *(A.base + off); + + return OK; +} + +/* + * 赋值。 + * + * 为指定下标处的元素赋值,可变参数为dim个下标值,指示待赋值元素所在下标。 + */ +Status Assign(Array* A, ElemType e, ...) { + va_list ap; + Status result; + int off; + + va_start(ap, e); + + // 计算从起点元素到目标元素需要跨越的元素数量 + result = Locate(*A, ap, &off); + + va_end(ap); + + if(result == OVERFLOW) { + return result; + } + + *(A->base + off) = e; + + return OK; +} + +/* + * 求出ap指示的值在数组A中的相对位置, + * 即计算从起点元素到目标元素需要跨越的元素数量。 + */ +static Status Locate(Array A, va_list ap, int* off) { + int i, ind; + + *off = 0; + + for(i = 0; i < A.dim; i++) { + ind = va_arg(ap, int); + + // 保证下标不越界 + if(ind < 0 || ind >= A.bounds[i]) { + return OVERFLOW; + } + + // 某个维度的单位元素个数*需要跨过的单位 + *off += A.constants[i] * ind; + } + + return OK; +} diff --git a/CLion/ExerciseBook/05.20/Array.h b/CLion/ExerciseBook/05.20/Array.h new file mode 100644 index 0000000..fe63aed --- /dev/null +++ b/CLion/ExerciseBook/05.20/Array.h @@ -0,0 +1,62 @@ +/*======== + * 多维数组 + =========*/ + +#ifndef ARRAY_H +#define ARRAY_H + +#include +#include // 提供malloc、realloc、free、exit原型 +#include // 提供宏va_start、va_arg、va_end +#include "Status.h" //**▲01 绪论**// + +/* 宏定义 */ +#define MAX_ARRAY_DIM 8 // 这里假设数组的最大维度为8 + +/* 数组元素类型 */ +typedef int ElemType; + +/* 数组的顺序存储表示 */ +typedef struct { + ElemType* base; // 数组元素基址(存放数组元素) + int dim; // 数组维数 + int* bounds; // 数组维界基址(存放数组行、列信息) + int* constants; // 数组映像函数常量基址(存储遍历某个维度时,每次需要越过的元素个数) +} Array; + + +/* + * 初始化。 + * + * 初始化维数为dim的数组,可变参数指示各维度的大小。 + */ +Status InitArray(Array* A, int dim, ...); + +/* + * 销毁(结构)。 + * + * 销毁数组占用的空间。 + */ +Status DestroyArray(Array* A); + +/* + * 取值。 + * + * 获取指定下标处的元素值,可变参数为dim个下标值,指示待获取元素所在下标。 + */ +Status Value(Array A, ElemType* e, ...); + +/* + * 赋值。 + * + * 为指定下标处的元素赋值,可变参数为dim个下标值,指示待赋值元素所在下标。 + */ +Status Assign(Array* A, ElemType e, ...); + +/* + * 求出ap指示的值在数组A中的相对位置, + * 即计算从起点元素到目标元素需要跨越的元素数量。 + */ +static Status Locate(Array A, va_list ap, int *off); + +#endif diff --git a/CLion/ExerciseBook/05.20/CMakeLists.txt b/CLion/ExerciseBook/05.20/CMakeLists.txt new file mode 100644 index 0000000..f671f08 --- /dev/null +++ b/CLion/ExerciseBook/05.20/CMakeLists.txt @@ -0,0 +1,7 @@ +# 包含公共库 +include_directories(${CMAKE_SOURCE_DIR}/Status) + +# 生成可执行文件 +add_executable(05.20 Array.h Array.c 05.20.c) +# 链接公共库 +target_link_libraries(05.20 Scanf_lib) \ No newline at end of file diff --git a/CLion/ExerciseBook/05.21/05.21.c b/CLion/ExerciseBook/05.21/05.21.c new file mode 100644 index 0000000..6c147a6 --- /dev/null +++ b/CLion/ExerciseBook/05.21/05.21.c @@ -0,0 +1,43 @@ +#include +#include "Status.h" //**▲01 绪论**// +#include "TSMatrix.h" //**▲05 数组和广义表**// + +/* + * 稀疏矩阵加法:AddSMatrix + * + *【注】 + * 该函数已在TSMatrix相关文件中定义 + */ +Status Algo_5_21(TSMatrix A, TSMatrix B, TSMatrix* C); + + +int main(int argc, char* argv[]) { + TSMatrix A, B, C; + + printf("█ 创建两个稀疏矩阵 A、B ...\n"); + CreateSMatrix(&A, "TestData_A.txt"); + CreateSMatrix(&B, "TestData_B.txt"); + printf("█ A = \n"); + PrintSMatrix(A); + printf("█ B = \n"); + PrintSMatrix(B); + + // 矩阵相加 + Algo_5_21(A, B, &C); + + printf("█ C = A + B = \n"); + PrintSMatrix(C); + + return 0; +} + + +/* + * 稀疏矩阵加法:AddSMatrix + * + *【注】 + * 该函数已在TSMatrix相关文件中定义 + */ +Status Algo_5_21(TSMatrix A, TSMatrix B, TSMatrix* C) { + return AddSMatrix(A, B, C); +} diff --git a/CLion/ExerciseBook/05.21/CMakeLists.txt b/CLion/ExerciseBook/05.21/CMakeLists.txt new file mode 100644 index 0000000..ff970ec --- /dev/null +++ b/CLion/ExerciseBook/05.21/CMakeLists.txt @@ -0,0 +1,13 @@ +# 包含公共库 +include_directories(${CMAKE_SOURCE_DIR}/Status) + +# 生成可执行文件 +add_executable(05.21 TSMatrix.h TSMatrix.c 05.21.c) +# 链接公共库 +target_link_libraries(05.21 Scanf_lib) + + +# 记录要拷贝到*.exe目录下的资源文件 +file(GLOB TestData TestData*.txt) +# 将资源文件拷贝到*.exe目录下,不然无法加载 +file(COPY ${TestData} DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) diff --git a/CLion/ExerciseBook/05.21/TSMatrix.c b/CLion/ExerciseBook/05.21/TSMatrix.c new file mode 100644 index 0000000..7bbf239 --- /dev/null +++ b/CLion/ExerciseBook/05.21/TSMatrix.c @@ -0,0 +1,433 @@ +/*======================= + * 三元组顺序表(稀疏矩阵) + * + * 包含算法: 5.1、5.2 + ========================*/ + +#include "TSMatrix.h" //**▲05 数组和广义表**// + +/* + * 创建稀疏矩阵M + * + * + *【备注】 + * + * 教材中默认从控制台读取数据。 + * 这里为了方便测试,避免每次运行都手动输入数据, + * 因而允许选择从预设的文件path中读取测试数据。 + * + * 如果需要从控制台读取数据,则path为NULL或者为空串, + * 如果需要从文件中读取数据,则需要在path中填写文件名信息。 + */ +Status CreateSMatrix(TSMatrix* M, char* path) { + int k; + FILE* fp; + int readFromConsole; // 是否从控制台读取数据 + + // 如果没有文件路径信息,则从控制台读取输入 + readFromConsole = path == NULL || strcmp(path, "") == 0; + + // 如果没有文件路径信息,则从控制台读取输入 + if(readFromConsole) { + printf("请输入行数:"); + scanf("%d", &((*M).mu)); + printf("请输入列数:"); + scanf("%d", &((*M).nu)); + printf("请输入非零元素个数:"); + scanf("%d", &((*M).tu)); + printf("请输入%d个三元组信息\n", (*M).tu); + for(k = 1; k <= (*M).tu; k++) { + printf("第%2d组:", k); + scanf("%d%d%d", &((*M).data[k].i), &((*M).data[k].j), &((*M).data[k].e)); + } + } else { + fp = fopen(path, "r"); + + ReadData(fp, "%d%d%d", &((*M).mu), &((*M).nu), &((*M).tu)); + + for(k = 1; k <= (*M).tu; k++) { + ReadData(fp, "%d%d%d", &((*M).data[k].i), &((*M).data[k].j), &((*M).data[k].e)); + } + + fclose(fp); + } + + return OK; +} + +/* + * 销毁稀疏矩阵 + * + *【注】 + * 三元组顺序表的结构无法销毁。 + */ +Status DestroySMatrix(TSMatrix* M) { + if(M == NULL) { + return ERROR; + } + + (*M).mu = 0; + (*M).nu = 0; + (*M).tu = 0; + + return OK; +} + +/* + * 矩阵复制 + * + * 创建一个新矩阵T,该矩阵包含了从矩阵M中包含的数据。 + */ +Status CopySMatrix(TSMatrix M, TSMatrix* T) { + (*T) = M; // 结构体之间可以直接复制,即使内部包含数组也可以 + + return OK; +} + +/* + * 矩阵加法 + * + * Q = M + N。 + */ +Status AddSMatrix(TSMatrix M, TSMatrix N, TSMatrix* Q) { + int m, n, k; + + if(M.mu != N.mu || M.nu != N.nu) { + printf("两矩阵的行数、列数不满足相加条件!!\n"); + return ERROR; + } + + // 初始化Q + (*Q).mu = M.mu; + (*Q).nu = M.nu; + (*Q).tu = 0; + + m = n = k = 1; + + // 依次遍历M与N的三元组 + while(m <= M.tu && n <= N.tu) { + // M中的三元组行下标较小 + if(M.data[m].i < N.data[n].i) { + (*Q).data[k] = M.data[m]; + m++; + + // N中的三元组行下标较小 + } else if(M.data[m].i > N.data[n].i) { + (*Q).data[k] = N.data[n]; + n++; + + // M与N中的三元组行下标一致,需要进一步比较列坐标 + } else { + // M中的三元组列下标较小 + if(M.data[m].j < N.data[n].j) { + (*Q).data[k] = M.data[m]; + m++; + + // N中的三元组列下标较小 + } else if(M.data[m].j > N.data[n].j) { + (*Q).data[k] = N.data[n]; + n++; + + // M与N中的三元组列下标一致,需要进行加法运算 + } else { + // 值已经加为0的话,不需要存储该元素 + if((M.data[m].e + N.data[n].e) == 0) { + m++; + n++; + continue; + } else { + (*Q).data[k].i = M.data[m].i; + (*Q).data[k].j = M.data[m].j; + (*Q).data[k].e = M.data[m].e + N.data[n].e; + m++; + n++; + } + } + } + + k++; + (*Q).tu++; + } + + // 遍历M中剩余的三元组 + while(m <= M.tu) { + (*Q).data[k] = M.data[m]; + m++; + k++; + (*Q).tu++; + } + + // 遍历N中剩余的三元组 + while(n <= N.tu) { + (*Q).data[k] = N.data[n]; + n++; + k++; + (*Q).tu++; + } + + return OK; +} + +/* + * 矩阵减法 + * + * Q = M - N。 + */ +Status SubSMatrix(TSMatrix M, TSMatrix N, TSMatrix* Q) { + int m, n, k; + + if(M.mu != N.mu || M.nu != N.nu) { + printf("两矩阵的行数、列数不满足相减条件!!\n"); + return ERROR; + } + + // 初始化Q + (*Q).mu = M.mu; + (*Q).nu = M.nu; + (*Q).tu = 0; + + m = n = k = 1; + + // 依次遍历M与N的三元组 + while(m <= M.tu && n <= N.tu) { + // M中的三元组行下标较小 + if(M.data[m].i < N.data[n].i) { + (*Q).data[k] = M.data[m]; + m++; + + // N中的三元组行下标较小 + } else if(M.data[m].i > N.data[n].i) { + (*Q).data[k].i = N.data[n].i; + (*Q).data[k].j = N.data[n].j; + (*Q).data[k].e = -N.data[n].e; // 由于是相减,所以要对元素值取相反数 + n++; + + // M与N中的三元组行下标一致,需要进一步比较列坐标 + } else { + // M中的三元组列下标较小 + if(M.data[m].j < N.data[n].j) { + (*Q).data[k] = M.data[m]; + m++; + + // N中的三元组列下标较小 + } else if(M.data[m].j > N.data[n].j) { + (*Q).data[k].i = N.data[n].i; + (*Q).data[k].j = N.data[n].j; + (*Q).data[k].e = -N.data[n].e; // 由于是相减,所以要对元素值取相反数 + n++; + + // M与N中的三元组列下标一致,需要进行减法运算 + } else { + // 值已经减为0的话,不需要存储该元素 + if((M.data[m].e - N.data[n].e) == 0) { + m++; + n++; + continue; + } else { + (*Q).data[k].i = M.data[m].i; + (*Q).data[k].j = M.data[m].j; + (*Q).data[k].e = M.data[m].e - N.data[n].e; + m++; + n++; + } + } + } + + k++; + (*Q).tu++; + } + + // 遍历M中剩余的三元组 + while(m <= M.tu) { + (*Q).data[k] = M.data[m]; + m++; + k++; + (*Q).tu++; + } + + // 遍历N中剩余的三元组 + while(n <= N.tu) { + (*Q).data[k].i = N.data[n].i; + (*Q).data[k].j = N.data[n].j; + (*Q).data[k].e = -N.data[n].e; + n++; + k++; + (*Q).tu++; + } + + return OK; +} + +/* + * 矩阵乘法 + * + * Q = M * N,这里实现的是传统矩阵乘法。 + */ +Status MultSMatrix(TSMatrix M, TSMatrix N, TSMatrix* Q) { + int m, n, i, j, k; + ElemType c, c1, c2; + + // M的列数需要等于N的行数 + if(M.nu != N.mu) { + printf("两矩阵的行数、列数不满足相乘条件!!\n"); + return ERROR; + } + + // 初始化Q + (*Q).mu = M.mu; + (*Q).nu = N.nu; + (*Q).tu = 0; + + // 如果存在零矩阵 + if(M.tu * N.tu == 0) { + return OK; + } + + // 遍历矩阵M的行 + for(i = 1; i <= M.mu; i++) { + // 遍历矩阵N的列 + for(j = 1; j <= N.nu; j++) { + c = 0; + for(k = 1; k <= M.nu; k++) { + // 记录M[i][k]的值 + c1 = 0; + // 依次寻找位于指定位置的M三元组 + for(m = 1; m <= M.tu; m++) { + if(M.data[m].i == i && M.data[m].j == k) { + c1 = M.data[m].e; + break; + } + } + + // 记录N[k][j]的值 + c2 = 0; + //依次寻找位于指定位置的N三元组 + for(n = 1; n <= N.tu; n++) { + if(N.data[n].i == k && N.data[n].j == j) { + c2 = N.data[n].e; + break; + } + } + + // 计算Q[i][j]的值 + if(c1 && c2) { + c += c1 * c2; + } + } + + // 如果计算结果不为0,则进行存储 + if(c != 0) { + (*Q).tu++; + (*Q).data[(*Q).tu].i = i; + (*Q).data[(*Q).tu].j = j; + (*Q).data[(*Q).tu].e = c; + } + } + } + + return OK; +} + +/* + * ████████ 算法5.1 ████████ + * + * 矩阵转置 + */ +Status TransposeSMatrix(TSMatrix M, TSMatrix* T) { + int p, q, col; + + (*T).mu = M.nu; + (*T).nu = M.mu; + (*T).tu = M.tu; + + if((*T).tu != 0) { + q = 1; // q用于T中非零元的计数 + + // col代表M的列,T的行 + for(col = 1; col <= M.nu; ++col) { + // 在M中查找第j列的元素,依次将其转置到T中 + for(p = 1; p <= M.tu; ++p) { + if(M.data[p].j == col) { + (*T).data[q].i = M.data[p].j; // M的列变为T的行 + (*T).data[q].j = M.data[p].i; // M的行变为T的列 + (*T).data[q].e = M.data[p].e; // 每个三元组值不变 + ++q; + } + } + } + } + + return OK; +} + +/* + * ████████ 算法5.2 ████████ + * + * 矩阵快速转置 + */ +Status FastTransposeSMatrix(TSMatrix M, TSMatrix* T) { + int col, t, p, q; + int* num; // num[col] 表示M第col列中非零元的个数 + int* copt; // copt[col]表示M第col列第一个非零元在转置后矩阵中的位置 + + (*T).mu = M.nu; + (*T).nu = M.mu; + (*T).tu = M.tu; + + // 提前返回 + if((*T).tu == 0) { + return ERROR; + } + + num = (int*) malloc(M.nu * sizeof(int)); + copt = (int*) malloc(M.nu * sizeof(int)); + + // 初始化数组num + for(col = 1; col <= M.nu; ++col) { + num[col] = 0; + } + + // 统计M中的非零元,统计每列非零元的个数 + for(t = 1; t <= M.tu; ++t) { + num[M.data[t].j]++; + } + + // 第1列第1个非零元总是位于转置后矩阵中的首位 + copt[1] = 1; + // 计算各列第1个非零元在转置矩阵中的位置 + for(col = 2; col <= M.nu; ++col) { + copt[col] = copt[col - 1] + num[col - 1]; + } + + // 依次扫描M中的三元组 + for(p = 1; p <= M.tu; ++p) { + col = M.data[p].j; // 计算当前非零元所处的列 + q = copt[col]; // 计算当前非零元在转置矩阵中的位置 + (*T).data[q].i = M.data[p].j; + (*T).data[q].j = M.data[p].i; + (*T).data[q].e = M.data[p].e; + ++copt[col]; // 再遇到此列元素时,其在转置矩阵中的位置应当增一(该步骤很重要) + } + + return OK; +} + +/* + * 输出矩阵 + */ +void PrintSMatrix(TSMatrix M) { + int r, c; + int k = 1; + + for(r = 1; r <= M.mu; r++) { + for(c = 1; c <= M.nu; c++) { + if(r == M.data[k].i && c == M.data[k].j) { + printf("%3d ", M.data[k].e); + k++; + } else { + printf("%3d ", 0); + } + } + printf("\n"); + } +} diff --git a/CLion/ExerciseBook/05.21/TSMatrix.h b/CLion/ExerciseBook/05.21/TSMatrix.h new file mode 100644 index 0000000..81cbd8f --- /dev/null +++ b/CLion/ExerciseBook/05.21/TSMatrix.h @@ -0,0 +1,104 @@ +/*======================= + * 三元组顺序表(稀疏矩阵) + * + * 包含算法: 5.1、5.2 + ========================*/ + +#ifndef TSMATRIX_H +#define TSMATRIX_H + +#include +#include // 提供 malloc 原型 +#include // 提供 strstr 原型 +#include "Status.h" //**▲01 绪论**// + +/* 宏定义 */ +#define MAXSIZE 12500 // 非零元数量的最大值 + +/* 三元组稀疏矩阵元素类型 */ +typedef int ElemType; + +/* 三元组类型定义,主要用来存储非零元 */ +typedef struct { + int i, j; // 该三元组非零元的行下标和列下标 + ElemType e; +} Triple; + +/* 三元组稀疏矩阵类型定义 */ +typedef struct { + Triple data[MAXSIZE + 1]; // 非零元三元组表,data[0]未用 + int mu, nu, tu; // 矩阵的行数、列数和非零元个数 +} TSMatrix; + + +/* + * 创建稀疏矩阵M + * + * + *【备注】 + * + * 教材中默认从控制台读取数据。 + * 这里为了方便测试,避免每次运行都手动输入数据, + * 因而允许选择从预设的文件path中读取测试数据。 + * + * 如果需要从控制台读取数据,则path为NULL或者为空串, + * 如果需要从文件中读取数据,则需要在path中填写文件名信息。 + */ +Status CreateSMatrix(TSMatrix* M, char* path); + +/* + * 销毁稀疏矩阵 + * + *【注】 + * 三元组顺序表的结构无法销毁。 + */ +Status DestroySMatrix(TSMatrix* M); + +/* + * 矩阵复制 + * + * 创建一个新矩阵T,该矩阵包含了从矩阵M中包含的数据。 + */ +Status CopySMatrix(TSMatrix M, TSMatrix* T); + +/* + * 矩阵加法 + * + * Q = M + N。 + */ +Status AddSMatrix(TSMatrix M, TSMatrix N, TSMatrix* Q); + +/* + * 矩阵减法 + * + * Q = M - N。 + */ +Status SubSMatrix(TSMatrix M, TSMatrix N, TSMatrix* Q); + +/* + * 矩阵乘法 + * + * Q = M * N,这里实现的是传统矩阵乘法。 + */ +Status MultSMatrix(TSMatrix M, TSMatrix N, TSMatrix* Q); + +/* + * ████████ 算法5.1 ████████ + * + * 矩阵转置 + */ +Status TransposeSMatrix(TSMatrix M, TSMatrix* T); + +/* + * ████████ 算法5.2 ████████ + * + * 矩阵快速转置 + */ +Status FastTransposeSMatrix(TSMatrix M, TSMatrix* T); + +/* + * 输出矩阵 + */ +void PrintSMatrix(TSMatrix M); + +#endif diff --git a/CLion/ExerciseBook/05.21/TestData_A.txt b/CLion/ExerciseBook/05.21/TestData_A.txt new file mode 100644 index 0000000..5d3cb45 --- /dev/null +++ b/CLion/ExerciseBook/05.21/TestData_A.txt @@ -0,0 +1,4 @@ +行数:5 +列数:5 +非零元个数:10 +三元组:(1,2,1),(1,4,5),(2,3,-3),(2,5,2),(3,1,2),(3,2,3),(3,3,4),(4,4,2),(5,1,3),(5,2,-1) \ No newline at end of file diff --git a/CLion/ExerciseBook/05.21/TestData_B.txt b/CLion/ExerciseBook/05.21/TestData_B.txt new file mode 100644 index 0000000..d567717 --- /dev/null +++ b/CLion/ExerciseBook/05.21/TestData_B.txt @@ -0,0 +1,4 @@ +行数:5 +列数:5 +非零元个数:8 +三元组:(1,1,-3)(1,3,2)(2,4,-1)(3,2,4)(4,1,6)(4,5,5)(5,1,3)(5,3,2) \ No newline at end of file diff --git a/CLion/ExerciseBook/05.22/05.22.c b/CLion/ExerciseBook/05.22/05.22.c new file mode 100644 index 0000000..a21ec49 --- /dev/null +++ b/CLion/ExerciseBook/05.22/05.22.c @@ -0,0 +1,106 @@ +#include +#include "Status.h" //**▲01 绪论**// +#include "TSMatrix.h" //**▲05 数组和广义表**// + +/* + * 稀疏矩阵加法:AddSMatrix + * + *【注】 + * 计算结果需要保存到原矩阵A中 + */ +Status Algo_5_22(TSMatrix* A, TSMatrix B); + + +int main(int argc, char* argv[]) { + TSMatrix A, B; + + printf("█ 创建两个稀疏矩阵 A、B ...\n"); + CreateSMatrix(&A, "TestData_A.txt"); + CreateSMatrix(&B, "TestData_B.txt"); + printf("█ A = \n"); + PrintSMatrix(A); + printf("█ B = \n"); + PrintSMatrix(B); + + // 矩阵相加 + Algo_5_22(&A, B); + + printf("█ A = A + B = \n"); + PrintSMatrix(A); + + return 0; +} + + +/* + * 稀疏矩阵加法:AddSMatrix + * + *【注】 + * 计算结果需要保存到原矩阵A中 + */ +Status Algo_5_22(TSMatrix* A, TSMatrix B) { + int m, n, k; + + if((*A).mu != B.mu || (*A).nu != B.nu) { + printf("两矩阵的行数、列数不满足相加条件!!\n"); + return ERROR; + } + + // A中元素向后移动,移动长度为B的元素个数 + for(k = (*A).tu; k > 0; k--) { + (*A).data[k + B.tu] = (*A).data[k]; + } + + m = B.tu + 1; // 遍历A的起点 + n = 1; // 遍历B的起点 + k = 0; // 指向计算结果的游标 + + // 依次遍历A与B的三元组 + while(m <= (*A).tu + B.tu && n <= B.tu) { + // A中的三元组行下标较小 + if((*A).data[m].i < B.data[n].i) { + (*A).data[++k] = (*A).data[m++]; + + // B中的三元组行下标较小 + } else if((*A).data[m].i > B.data[n].i) { + (*A).data[++k] = B.data[n++]; + + // A与B中的三元组行下标一致,需要进一步比较列坐标 + } else { + // A中的三元组列下标较小 + if((*A).data[m].j < B.data[n].j) { + (*A).data[++k] = (*A).data[m++]; + + // B中的三元组列下标较小 + } else if((*A).data[m].j > B.data[n].j) { + (*A).data[++k] = B.data[n++]; + + // A与B中的三元组列下标一致,需要进行加法运算 + } else { + // 值不为0时,需要存储该元素 + if(((*A).data[m].e + B.data[n].e) != 0) { + k++; + (*A).data[k].i = (*A).data[m].i; + (*A).data[k].j = (*A).data[m].j; + (*A).data[k].e = (*A).data[m].e + B.data[n].e; + } + m++; + n++; + } + } + } + + // 遍历A中剩余的三元组 + while(m <= (*A).tu + B.tu) { + (*A).data[++k] = (*A).data[m++]; + } + + // 遍历B中剩余的三元组 + while(n <= B.tu) { + (*A).data[++k] = B.data[n++]; + } + + (*A).tu = k; + + return OK; +} diff --git a/CLion/ExerciseBook/05.22/CMakeLists.txt b/CLion/ExerciseBook/05.22/CMakeLists.txt new file mode 100644 index 0000000..4ea7f1d --- /dev/null +++ b/CLion/ExerciseBook/05.22/CMakeLists.txt @@ -0,0 +1,13 @@ +# 包含公共库 +include_directories(${CMAKE_SOURCE_DIR}/Status) + +# 生成可执行文件 +add_executable(05.22 TSMatrix.h TSMatrix.c 05.22.c) +# 链接公共库 +target_link_libraries(05.22 Scanf_lib) + + +# 记录要拷贝到*.exe目录下的资源文件 +file(GLOB TestData TestData*.txt) +# 将资源文件拷贝到*.exe目录下,不然无法加载 +file(COPY ${TestData} DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) diff --git a/CLion/ExerciseBook/05.22/TSMatrix.c b/CLion/ExerciseBook/05.22/TSMatrix.c new file mode 100644 index 0000000..7bbf239 --- /dev/null +++ b/CLion/ExerciseBook/05.22/TSMatrix.c @@ -0,0 +1,433 @@ +/*======================= + * 三元组顺序表(稀疏矩阵) + * + * 包含算法: 5.1、5.2 + ========================*/ + +#include "TSMatrix.h" //**▲05 数组和广义表**// + +/* + * 创建稀疏矩阵M + * + * + *【备注】 + * + * 教材中默认从控制台读取数据。 + * 这里为了方便测试,避免每次运行都手动输入数据, + * 因而允许选择从预设的文件path中读取测试数据。 + * + * 如果需要从控制台读取数据,则path为NULL或者为空串, + * 如果需要从文件中读取数据,则需要在path中填写文件名信息。 + */ +Status CreateSMatrix(TSMatrix* M, char* path) { + int k; + FILE* fp; + int readFromConsole; // 是否从控制台读取数据 + + // 如果没有文件路径信息,则从控制台读取输入 + readFromConsole = path == NULL || strcmp(path, "") == 0; + + // 如果没有文件路径信息,则从控制台读取输入 + if(readFromConsole) { + printf("请输入行数:"); + scanf("%d", &((*M).mu)); + printf("请输入列数:"); + scanf("%d", &((*M).nu)); + printf("请输入非零元素个数:"); + scanf("%d", &((*M).tu)); + printf("请输入%d个三元组信息\n", (*M).tu); + for(k = 1; k <= (*M).tu; k++) { + printf("第%2d组:", k); + scanf("%d%d%d", &((*M).data[k].i), &((*M).data[k].j), &((*M).data[k].e)); + } + } else { + fp = fopen(path, "r"); + + ReadData(fp, "%d%d%d", &((*M).mu), &((*M).nu), &((*M).tu)); + + for(k = 1; k <= (*M).tu; k++) { + ReadData(fp, "%d%d%d", &((*M).data[k].i), &((*M).data[k].j), &((*M).data[k].e)); + } + + fclose(fp); + } + + return OK; +} + +/* + * 销毁稀疏矩阵 + * + *【注】 + * 三元组顺序表的结构无法销毁。 + */ +Status DestroySMatrix(TSMatrix* M) { + if(M == NULL) { + return ERROR; + } + + (*M).mu = 0; + (*M).nu = 0; + (*M).tu = 0; + + return OK; +} + +/* + * 矩阵复制 + * + * 创建一个新矩阵T,该矩阵包含了从矩阵M中包含的数据。 + */ +Status CopySMatrix(TSMatrix M, TSMatrix* T) { + (*T) = M; // 结构体之间可以直接复制,即使内部包含数组也可以 + + return OK; +} + +/* + * 矩阵加法 + * + * Q = M + N。 + */ +Status AddSMatrix(TSMatrix M, TSMatrix N, TSMatrix* Q) { + int m, n, k; + + if(M.mu != N.mu || M.nu != N.nu) { + printf("两矩阵的行数、列数不满足相加条件!!\n"); + return ERROR; + } + + // 初始化Q + (*Q).mu = M.mu; + (*Q).nu = M.nu; + (*Q).tu = 0; + + m = n = k = 1; + + // 依次遍历M与N的三元组 + while(m <= M.tu && n <= N.tu) { + // M中的三元组行下标较小 + if(M.data[m].i < N.data[n].i) { + (*Q).data[k] = M.data[m]; + m++; + + // N中的三元组行下标较小 + } else if(M.data[m].i > N.data[n].i) { + (*Q).data[k] = N.data[n]; + n++; + + // M与N中的三元组行下标一致,需要进一步比较列坐标 + } else { + // M中的三元组列下标较小 + if(M.data[m].j < N.data[n].j) { + (*Q).data[k] = M.data[m]; + m++; + + // N中的三元组列下标较小 + } else if(M.data[m].j > N.data[n].j) { + (*Q).data[k] = N.data[n]; + n++; + + // M与N中的三元组列下标一致,需要进行加法运算 + } else { + // 值已经加为0的话,不需要存储该元素 + if((M.data[m].e + N.data[n].e) == 0) { + m++; + n++; + continue; + } else { + (*Q).data[k].i = M.data[m].i; + (*Q).data[k].j = M.data[m].j; + (*Q).data[k].e = M.data[m].e + N.data[n].e; + m++; + n++; + } + } + } + + k++; + (*Q).tu++; + } + + // 遍历M中剩余的三元组 + while(m <= M.tu) { + (*Q).data[k] = M.data[m]; + m++; + k++; + (*Q).tu++; + } + + // 遍历N中剩余的三元组 + while(n <= N.tu) { + (*Q).data[k] = N.data[n]; + n++; + k++; + (*Q).tu++; + } + + return OK; +} + +/* + * 矩阵减法 + * + * Q = M - N。 + */ +Status SubSMatrix(TSMatrix M, TSMatrix N, TSMatrix* Q) { + int m, n, k; + + if(M.mu != N.mu || M.nu != N.nu) { + printf("两矩阵的行数、列数不满足相减条件!!\n"); + return ERROR; + } + + // 初始化Q + (*Q).mu = M.mu; + (*Q).nu = M.nu; + (*Q).tu = 0; + + m = n = k = 1; + + // 依次遍历M与N的三元组 + while(m <= M.tu && n <= N.tu) { + // M中的三元组行下标较小 + if(M.data[m].i < N.data[n].i) { + (*Q).data[k] = M.data[m]; + m++; + + // N中的三元组行下标较小 + } else if(M.data[m].i > N.data[n].i) { + (*Q).data[k].i = N.data[n].i; + (*Q).data[k].j = N.data[n].j; + (*Q).data[k].e = -N.data[n].e; // 由于是相减,所以要对元素值取相反数 + n++; + + // M与N中的三元组行下标一致,需要进一步比较列坐标 + } else { + // M中的三元组列下标较小 + if(M.data[m].j < N.data[n].j) { + (*Q).data[k] = M.data[m]; + m++; + + // N中的三元组列下标较小 + } else if(M.data[m].j > N.data[n].j) { + (*Q).data[k].i = N.data[n].i; + (*Q).data[k].j = N.data[n].j; + (*Q).data[k].e = -N.data[n].e; // 由于是相减,所以要对元素值取相反数 + n++; + + // M与N中的三元组列下标一致,需要进行减法运算 + } else { + // 值已经减为0的话,不需要存储该元素 + if((M.data[m].e - N.data[n].e) == 0) { + m++; + n++; + continue; + } else { + (*Q).data[k].i = M.data[m].i; + (*Q).data[k].j = M.data[m].j; + (*Q).data[k].e = M.data[m].e - N.data[n].e; + m++; + n++; + } + } + } + + k++; + (*Q).tu++; + } + + // 遍历M中剩余的三元组 + while(m <= M.tu) { + (*Q).data[k] = M.data[m]; + m++; + k++; + (*Q).tu++; + } + + // 遍历N中剩余的三元组 + while(n <= N.tu) { + (*Q).data[k].i = N.data[n].i; + (*Q).data[k].j = N.data[n].j; + (*Q).data[k].e = -N.data[n].e; + n++; + k++; + (*Q).tu++; + } + + return OK; +} + +/* + * 矩阵乘法 + * + * Q = M * N,这里实现的是传统矩阵乘法。 + */ +Status MultSMatrix(TSMatrix M, TSMatrix N, TSMatrix* Q) { + int m, n, i, j, k; + ElemType c, c1, c2; + + // M的列数需要等于N的行数 + if(M.nu != N.mu) { + printf("两矩阵的行数、列数不满足相乘条件!!\n"); + return ERROR; + } + + // 初始化Q + (*Q).mu = M.mu; + (*Q).nu = N.nu; + (*Q).tu = 0; + + // 如果存在零矩阵 + if(M.tu * N.tu == 0) { + return OK; + } + + // 遍历矩阵M的行 + for(i = 1; i <= M.mu; i++) { + // 遍历矩阵N的列 + for(j = 1; j <= N.nu; j++) { + c = 0; + for(k = 1; k <= M.nu; k++) { + // 记录M[i][k]的值 + c1 = 0; + // 依次寻找位于指定位置的M三元组 + for(m = 1; m <= M.tu; m++) { + if(M.data[m].i == i && M.data[m].j == k) { + c1 = M.data[m].e; + break; + } + } + + // 记录N[k][j]的值 + c2 = 0; + //依次寻找位于指定位置的N三元组 + for(n = 1; n <= N.tu; n++) { + if(N.data[n].i == k && N.data[n].j == j) { + c2 = N.data[n].e; + break; + } + } + + // 计算Q[i][j]的值 + if(c1 && c2) { + c += c1 * c2; + } + } + + // 如果计算结果不为0,则进行存储 + if(c != 0) { + (*Q).tu++; + (*Q).data[(*Q).tu].i = i; + (*Q).data[(*Q).tu].j = j; + (*Q).data[(*Q).tu].e = c; + } + } + } + + return OK; +} + +/* + * ████████ 算法5.1 ████████ + * + * 矩阵转置 + */ +Status TransposeSMatrix(TSMatrix M, TSMatrix* T) { + int p, q, col; + + (*T).mu = M.nu; + (*T).nu = M.mu; + (*T).tu = M.tu; + + if((*T).tu != 0) { + q = 1; // q用于T中非零元的计数 + + // col代表M的列,T的行 + for(col = 1; col <= M.nu; ++col) { + // 在M中查找第j列的元素,依次将其转置到T中 + for(p = 1; p <= M.tu; ++p) { + if(M.data[p].j == col) { + (*T).data[q].i = M.data[p].j; // M的列变为T的行 + (*T).data[q].j = M.data[p].i; // M的行变为T的列 + (*T).data[q].e = M.data[p].e; // 每个三元组值不变 + ++q; + } + } + } + } + + return OK; +} + +/* + * ████████ 算法5.2 ████████ + * + * 矩阵快速转置 + */ +Status FastTransposeSMatrix(TSMatrix M, TSMatrix* T) { + int col, t, p, q; + int* num; // num[col] 表示M第col列中非零元的个数 + int* copt; // copt[col]表示M第col列第一个非零元在转置后矩阵中的位置 + + (*T).mu = M.nu; + (*T).nu = M.mu; + (*T).tu = M.tu; + + // 提前返回 + if((*T).tu == 0) { + return ERROR; + } + + num = (int*) malloc(M.nu * sizeof(int)); + copt = (int*) malloc(M.nu * sizeof(int)); + + // 初始化数组num + for(col = 1; col <= M.nu; ++col) { + num[col] = 0; + } + + // 统计M中的非零元,统计每列非零元的个数 + for(t = 1; t <= M.tu; ++t) { + num[M.data[t].j]++; + } + + // 第1列第1个非零元总是位于转置后矩阵中的首位 + copt[1] = 1; + // 计算各列第1个非零元在转置矩阵中的位置 + for(col = 2; col <= M.nu; ++col) { + copt[col] = copt[col - 1] + num[col - 1]; + } + + // 依次扫描M中的三元组 + for(p = 1; p <= M.tu; ++p) { + col = M.data[p].j; // 计算当前非零元所处的列 + q = copt[col]; // 计算当前非零元在转置矩阵中的位置 + (*T).data[q].i = M.data[p].j; + (*T).data[q].j = M.data[p].i; + (*T).data[q].e = M.data[p].e; + ++copt[col]; // 再遇到此列元素时,其在转置矩阵中的位置应当增一(该步骤很重要) + } + + return OK; +} + +/* + * 输出矩阵 + */ +void PrintSMatrix(TSMatrix M) { + int r, c; + int k = 1; + + for(r = 1; r <= M.mu; r++) { + for(c = 1; c <= M.nu; c++) { + if(r == M.data[k].i && c == M.data[k].j) { + printf("%3d ", M.data[k].e); + k++; + } else { + printf("%3d ", 0); + } + } + printf("\n"); + } +} diff --git a/CLion/ExerciseBook/05.22/TSMatrix.h b/CLion/ExerciseBook/05.22/TSMatrix.h new file mode 100644 index 0000000..81cbd8f --- /dev/null +++ b/CLion/ExerciseBook/05.22/TSMatrix.h @@ -0,0 +1,104 @@ +/*======================= + * 三元组顺序表(稀疏矩阵) + * + * 包含算法: 5.1、5.2 + ========================*/ + +#ifndef TSMATRIX_H +#define TSMATRIX_H + +#include +#include // 提供 malloc 原型 +#include // 提供 strstr 原型 +#include "Status.h" //**▲01 绪论**// + +/* 宏定义 */ +#define MAXSIZE 12500 // 非零元数量的最大值 + +/* 三元组稀疏矩阵元素类型 */ +typedef int ElemType; + +/* 三元组类型定义,主要用来存储非零元 */ +typedef struct { + int i, j; // 该三元组非零元的行下标和列下标 + ElemType e; +} Triple; + +/* 三元组稀疏矩阵类型定义 */ +typedef struct { + Triple data[MAXSIZE + 1]; // 非零元三元组表,data[0]未用 + int mu, nu, tu; // 矩阵的行数、列数和非零元个数 +} TSMatrix; + + +/* + * 创建稀疏矩阵M + * + * + *【备注】 + * + * 教材中默认从控制台读取数据。 + * 这里为了方便测试,避免每次运行都手动输入数据, + * 因而允许选择从预设的文件path中读取测试数据。 + * + * 如果需要从控制台读取数据,则path为NULL或者为空串, + * 如果需要从文件中读取数据,则需要在path中填写文件名信息。 + */ +Status CreateSMatrix(TSMatrix* M, char* path); + +/* + * 销毁稀疏矩阵 + * + *【注】 + * 三元组顺序表的结构无法销毁。 + */ +Status DestroySMatrix(TSMatrix* M); + +/* + * 矩阵复制 + * + * 创建一个新矩阵T,该矩阵包含了从矩阵M中包含的数据。 + */ +Status CopySMatrix(TSMatrix M, TSMatrix* T); + +/* + * 矩阵加法 + * + * Q = M + N。 + */ +Status AddSMatrix(TSMatrix M, TSMatrix N, TSMatrix* Q); + +/* + * 矩阵减法 + * + * Q = M - N。 + */ +Status SubSMatrix(TSMatrix M, TSMatrix N, TSMatrix* Q); + +/* + * 矩阵乘法 + * + * Q = M * N,这里实现的是传统矩阵乘法。 + */ +Status MultSMatrix(TSMatrix M, TSMatrix N, TSMatrix* Q); + +/* + * ████████ 算法5.1 ████████ + * + * 矩阵转置 + */ +Status TransposeSMatrix(TSMatrix M, TSMatrix* T); + +/* + * ████████ 算法5.2 ████████ + * + * 矩阵快速转置 + */ +Status FastTransposeSMatrix(TSMatrix M, TSMatrix* T); + +/* + * 输出矩阵 + */ +void PrintSMatrix(TSMatrix M); + +#endif diff --git a/CLion/ExerciseBook/05.22/TestData_A.txt b/CLion/ExerciseBook/05.22/TestData_A.txt new file mode 100644 index 0000000..5d3cb45 --- /dev/null +++ b/CLion/ExerciseBook/05.22/TestData_A.txt @@ -0,0 +1,4 @@ +行数:5 +列数:5 +非零元个数:10 +三元组:(1,2,1),(1,4,5),(2,3,-3),(2,5,2),(3,1,2),(3,2,3),(3,3,4),(4,4,2),(5,1,3),(5,2,-1) \ No newline at end of file diff --git a/CLion/ExerciseBook/05.22/TestData_B.txt b/CLion/ExerciseBook/05.22/TestData_B.txt new file mode 100644 index 0000000..d567717 --- /dev/null +++ b/CLion/ExerciseBook/05.22/TestData_B.txt @@ -0,0 +1,4 @@ +行数:5 +列数:5 +非零元个数:8 +三元组:(1,1,-3)(1,3,2)(2,4,-1)(3,2,4)(4,1,6)(4,5,5)(5,1,3)(5,3,2) \ No newline at end of file diff --git a/CLion/ExerciseBook/05.23/05.23.c b/CLion/ExerciseBook/05.23/05.23.c new file mode 100644 index 0000000..93b0b15 --- /dev/null +++ b/CLion/ExerciseBook/05.23/05.23.c @@ -0,0 +1,52 @@ +#include +#include "Status.h" //**▲01 绪论**// +#include "RLSMatrix.h" //**▲05 数组和广义表**// + +/* + * 获取矩阵中第i行第j列的元素,并将其存储到e中 + */ +Status Algo_5_23(RLSMatrix M, int i, int j, int* e); + + +int main(int argc, char* argv[]) { + RLSMatrix M; + int e; + + printf("█ 创建个稀疏矩阵 M ...\n"); + CreateSMatrix(&M, "TestData_M.txt"); + printf("M = \n"); + PrintSMatrix(M); + + Algo_5_23(M, 2, 3, &e); + printf("█ 第 %d 行 %d 列的元素为 %d\n", 2, 3, e); + + return 0; +} + + +/* + * 获取矩阵中第i行第j列的元素,并将其存储到e中 + */ +Status Algo_5_23(RLSMatrix M, int i, int j, int* e) { + int begin, end, k; + + if(i < 1 || i > M.mu || j < 1 || j > M.nu) { + return ERROR; + } + + // 获取第i行中首个非零元在三元组表中的位置 + begin = M.rpos[i]; + end = (i == M.mu ? M.tu : M.rpos[i + 1] - 1); + + *e = 0; // 默认为0 + + for(k = begin; k <= end; k++) { + // 找到对应列下标的元素 + if(M.data[k].j == j) { + *e = M.data[k].e; + break; + } + } + + return OK; +} diff --git a/CLion/ExerciseBook/05.23/CMakeLists.txt b/CLion/ExerciseBook/05.23/CMakeLists.txt new file mode 100644 index 0000000..fc406d4 --- /dev/null +++ b/CLion/ExerciseBook/05.23/CMakeLists.txt @@ -0,0 +1,13 @@ +# 包含公共库 +include_directories(${CMAKE_SOURCE_DIR}/Status) + +# 生成可执行文件 +add_executable(05.23 RLSMatrix.h RLSMatrix.c 05.23.c) +# 链接公共库 +target_link_libraries(05.23 Scanf_lib) + + +# 记录要拷贝到*.exe目录下的资源文件 +file(GLOB TestData TestData*.txt) +# 将资源文件拷贝到*.exe目录下,不然无法加载 +file(COPY ${TestData} DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) diff --git a/CLion/ExerciseBook/05.23/RLSMatrix.c b/CLion/ExerciseBook/05.23/RLSMatrix.c new file mode 100644 index 0000000..9a9870e --- /dev/null +++ b/CLion/ExerciseBook/05.23/RLSMatrix.c @@ -0,0 +1,515 @@ +/*============================= + * 行逻辑链接的顺序表(稀疏矩阵) + * + * 包含算法: 5.3 + ==============================*/ + +#include "RLSMatrix.h" //**▲05 数组和广义表**// + +/* + * 创建稀疏矩阵M + * + * + *【备注】 + * + * 教材中默认从控制台读取数据。 + * 这里为了方便测试,避免每次运行都手动输入数据, + * 因而允许选择从预设的文件path中读取测试数据。 + * + * 如果需要从控制台读取数据,则path为NULL或者为空串, + * 如果需要从文件中读取数据,则需要在path中填写文件名信息。 + */ +Status CreateSMatrix(RLSMatrix* M, char* path) { + int k; + FILE* fp; + int readFromConsole; // 是否从控制台读取数据 + + // 如果没有文件路径信息,则从控制台读取输入 + readFromConsole = path == NULL || strcmp(path, "") == 0; + + // 如果没有文件路径信息,则从控制台读取输入 + if(readFromConsole) { + printf("请输入行数:"); + scanf("%d", &((*M).mu)); + printf("请输入列数:"); + scanf("%d", &((*M).nu)); + printf("请输入非零元素个数:"); + scanf("%d", &((*M).tu)); + printf("请输入%d个三元组信息\n", (*M).tu); + for(k = 1; k <= (*M).tu; k++) { + printf("第%2d组:", k); + scanf("%d%d%d", &((*M).data[k].i), &((*M).data[k].j), &((*M).data[k].e)); + } + } else { + fp = fopen(path, "r"); + + ReadData(fp, "%d%d%d", &((*M).mu), &((*M).nu), &((*M).tu)); + + for(k = 1; k <= (*M).tu; k++) { + ReadData(fp, "%d%d%d", &((*M).data[k].i), &((*M).data[k].j), &((*M).data[k].e)); + } + + fclose(fp); + } + + // 为rpos数组赋值 + AssignRpos(M); + + return OK; +} + +/* + * 销毁稀疏矩阵 + * + *【注】 + * 行逻辑链接的顺序表结构无法销毁。 + */ +Status DestroySMatrix(RLSMatrix* M) { + int i; + + if(M == NULL) { + return ERROR; + } + + M->mu = 0; + M->nu = 0; + M->tu = 0; + + for(i = 0; i <= MAXRC; ++i) { + M->rpos[i] = 0; + } + + return OK; +} + +/* + * 矩阵复制 + * + * 创建一个新矩阵T,该矩阵包含了从矩阵M中包含的数据。 + */ +Status CopySMatrix(RLSMatrix M, RLSMatrix* T) { + (*T) = M; // 结构体之间可以直接复制,即使内部包含数组也可以 + + return OK; +} + +/* + * 矩阵加法 + * + * Q = M + N。 + */ +Status AddSMatrix(RLSMatrix M, RLSMatrix N, RLSMatrix* Q) { + int m, n, k; + + if(M.mu != N.mu || M.nu != N.nu) { + printf("两矩阵的行数、列数不满足相加条件!!\n"); + return ERROR; + } + + // 初始化Q的行列信息 + (*Q).mu = M.mu; + (*Q).nu = M.nu; + (*Q).tu = 0; + + m = n = k = 1; + + // 依次遍历M与N的三元组 + while(m <= M.tu && n <= N.tu) { + // M中的三元组行下标较小 + if(M.data[m].i < N.data[n].i) { + (*Q).data[k] = M.data[m]; + m++; + + // N中的三元组行下标较小 + } else if(M.data[m].i > N.data[n].i) { + (*Q).data[k] = N.data[n]; + n++; + + // M与N中的三元组行下标一致,需要进一步比较列坐标 + } else { + // M中的三元组列下标较小 + if(M.data[m].j < N.data[n].j) { + (*Q).data[k] = M.data[m]; + m++; + + // N中的三元组列下标较小 + } else if(M.data[m].j > N.data[n].j) { + (*Q).data[k] = N.data[n]; + n++; + + // M与N中的三元组列下标一致,需要进行加法运算 + } else { + // 值已经加为0的话,不需要存储该元素 + if((M.data[m].e + N.data[n].e) == 0) { + m++; + n++; + continue; + } else { + (*Q).data[k].i = M.data[m].i; + (*Q).data[k].j = M.data[m].j; + (*Q).data[k].e = M.data[m].e + N.data[n].e; + m++; + n++; + } + } + } + + k++; + (*Q).tu++; + } + + // 遍历M中剩余的三元组 + while(m <= M.tu) { + (*Q).data[k] = M.data[m]; + m++; + k++; + (*Q).tu++; + } + + // 遍历N中剩余的三元组 + while(n <= N.tu) { + (*Q).data[k] = N.data[n]; + n++; + k++; + (*Q).tu++; + } + + // 为rpos数组赋值 + AssignRpos(Q); + + return OK; +} + +/* + * 矩阵减法 + * + * Q = M - N。 + */ +Status SubSMatrix(RLSMatrix M, RLSMatrix N, RLSMatrix* Q) { + int m, n, k; + + if(M.mu != N.mu || M.nu != N.nu) { + printf("两矩阵的行数、列数不满足相减条件!!\n"); + return ERROR; + } + + // 初始化Q的行列信息 + (*Q).mu = M.mu; + (*Q).nu = M.nu; + (*Q).tu = 0; + + m = n = k = 1; + + // 依次遍历M与N的三元组 + while(m <= M.tu && n <= N.tu) { + // M中的三元组行下标较小 + if(M.data[m].i < N.data[n].i) { + (*Q).data[k] = M.data[m]; + m++; + + // N中的三元组行下标较小 + } else if(M.data[m].i > N.data[n].i) { + (*Q).data[k].i = N.data[n].i; + (*Q).data[k].j = N.data[n].j; + (*Q).data[k].e = -N.data[n].e; // 由于是相减,所以要对元素值取相反数 + n++; + + // M与N中的三元组行下标一致,需要进一步比较列坐标 + } else { + // M中的三元组列下标较小 + if(M.data[m].j < N.data[n].j) { + (*Q).data[k] = M.data[m]; + m++; + + // N中的三元组列下标较小 + } else if(M.data[m].j > N.data[n].j) { + (*Q).data[k].i = N.data[n].i; + (*Q).data[k].j = N.data[n].j; + (*Q).data[k].e = -N.data[n].e; // 由于是相减,所以要对元素值取相反数 + n++; + + // M与N中的三元组列下标一致,需要进行减法运算 + } else { + // 值已经减为0的话,不需要存储该元素 + if((M.data[m].e - N.data[n].e) == 0) { + m++; + n++; + continue; + } else { + (*Q).data[k].i = M.data[m].i; + (*Q).data[k].j = M.data[m].j; + (*Q).data[k].e = M.data[m].e - N.data[n].e; + m++; + n++; + } + } + } + + k++; + (*Q).tu++; + } + + // 遍历M中剩余的三元组 + while(m <= M.tu) { + (*Q).data[k] = M.data[m]; + m++; + k++; + (*Q).tu++; + } + + // 遍历N中剩余的三元组 + while(n <= N.tu) { + (*Q).data[k].i = N.data[n].i; + (*Q).data[k].j = N.data[n].j; + (*Q).data[k].e = -N.data[n].e; + n++; + k++; + (*Q).tu++; + } + + // 为rpos数组赋值 + AssignRpos(Q); + + return OK; +} + +/* + * ████████ 算法5.3 ████████ + * + * 矩阵乘法 + * + * Q = M * N。 + */ +Status MultSMatrix(RLSMatrix M, RLSMatrix N, RLSMatrix* Q) { + int arow, p, tp; + int brow, q, tq; + int ccol; + int* ctemp; // Q中各行元素值累加器,ctemp[0]单元弃用 + int i; + + // M的列数需要等于N的行数 + if(M.nu != N.mu) { + printf("两矩阵的行数、列数不满足相乘条件!!\n"); + return ERROR; + } + + // 初始化Q的行列信息 + (*Q).mu = M.mu; + (*Q).nu = N.nu; + (*Q).tu = 0; + + // 如果存在零矩阵 + if(M.tu * N.tu == 0) { + return OK; + } + + ctemp = (int*) malloc((N.nu + 1) * sizeof(int)); + + // 处理M的每一行 + for(arow = 1; arow <= M.mu; ++arow) { + // 初始化Q中行元素值计数器 + for(i = 0; i <= N.nu; ++i) { + ctemp[i] = 0; + } + + // tp指向M当前行的下一行第一个非零元位置 + if(arow < M.mu) { + tp = M.rpos[arow + 1]; + } else { + tp = M.tu + 1; + } + + // 遍历M中arow行的所有非零元 + for(p = M.rpos[arow]; p < tp; ++p) { + // 获取该非零元在N中的行号 + brow = M.data[p].j; + + // tq指向N当前行的下一行第一个非零元位置 + if(brow < N.mu) { + tq = N.rpos[brow + 1]; + } else { + tq = N.tu + 1; + } + + // 遍历N中brow行的所有非零元 + for(q = N.rpos[brow]; q < tq; ++q) { + // 乘积元素在Q中的列号 + ccol = N.data[q].j; + + // 累加乘积 + ctemp[ccol] += M.data[p].e * N.data[q].e; + } + } + + /* + * 至此,Q中第arow行元素已求出 + */ + + // 遍历计算后的乘积,选取非零元存入Q中 + for(ccol = 1; ccol <= (*Q).nu; ++ccol) { + // 若Q中第arow行ccol列元素不为0 + if(ctemp[ccol]) { + ++(*Q).tu; + + // 非零元个数超出限制 + if((*Q).tu > MAXSIZE) { + return ERROR; + } + + (*Q).data[(*Q).tu].i = arow; + (*Q).data[(*Q).tu].j = ccol; + (*Q).data[(*Q).tu].e = ctemp[ccol]; + } + } + } + + // 为rpos数组赋值 + AssignRpos(Q); + + return OK; +} + +/* + * 矩阵转置 + */ +Status TransposeSMatrix(RLSMatrix M, RLSMatrix* T) { + int p, q, col; + + (*T).mu = M.nu; + (*T).nu = M.mu; + (*T).tu = M.tu; + + if((*T).tu) { + q = 1; // q用于T中非零元的计数 + + // col代表M的列,T的行 + for(col = 1; col <= M.nu; ++col) { + // 在M中查找第j列的元素,依次将其转置到T中 + for(p = 1; p <= M.tu; ++p) { + if(M.data[p].j == col) { + (*T).data[q].i = M.data[p].j; // M的列变为T的行 + (*T).data[q].j = M.data[p].i; // M的行变为T的列 + (*T).data[q].e = M.data[p].e; // 每个三元组值不变 + + ++q; + } + } + } + } + + // 为rpos数组赋值 + AssignRpos(T); + + return OK; +} + +/* + * 矩阵快速转置 + */ +Status FastTransposeSMatrix(RLSMatrix M, RLSMatrix* T) { + int col, t, p, q; + int* num; // num[col] 表示M第col列中非零元的个数 + int* copt; // copt[col]表示M第col列第一个非零元在转置后矩阵中的位置 + + (*T).mu = M.nu; + (*T).nu = M.mu; + (*T).tu = M.tu; + + // 提前返回 + if((*T).tu == 0) { + return ERROR; + } + + num = (int*) malloc(M.nu * sizeof(int)); + copt = (int*) malloc(M.nu * sizeof(int)); + + // 初始化数组num + for(col = 1; col <= M.nu; ++col) { + num[col] = 0; + } + + // 统计M中的非零元,统计每列非零元的个数 + for(t = 1; t <= M.tu; ++t) { + num[M.data[t].j]++; + } + + // 第1列第1个非零元总是位于转置后矩阵中的首位 + copt[1] = 1; + // 计算各列第1个非零元在转置矩阵中的位置 + for(col = 2; col <= M.nu; ++col) { + copt[col] = copt[col - 1] + num[col - 1]; + } + + // 依次扫描M中的三元组 + for(p = 1; p <= M.tu; ++p) { + col = M.data[p].j; // 计算当前非零元所处的列 + q = copt[col]; // 计算当前非零元在转置矩阵中的位置 + (*T).data[q].i = M.data[p].j; + (*T).data[q].j = M.data[p].i; + (*T).data[q].e = M.data[p].e; + ++copt[col]; // 再遇到此列元素时,其在转置矩阵中的位置应当增一(该步骤很重要) + } + + // 为rpos数组赋值 + AssignRpos(T); + + return OK; +} + +/* + * 输出矩阵 + */ +void PrintSMatrix(RLSMatrix M) { + int r, c; + int k = 1; + + for(r = 1; r <= M.mu; ++r) { + for(c = 1; c <= M.nu; ++c) { + if(r == M.data[k].i && c == M.data[k].j) { + printf("%3d ", M.data[k].e); + k++; + } else { + printf("%3d ", 0); + } + } + printf("\n"); + } + + printf("rpos = "); + for(k = 1; k <= M.mu; ++k) { + printf("%d ", M.rpos[k]); + } + printf("\n"); +} + +// 为rpos数组赋值 +static void AssignRpos(RLSMatrix* M) { + int k, m; + + // 初始化数组rpos + for(k = 0; k <= MAXRC; ++k) { + (*M).rpos[k] = 0; + } + + for(k = 1; k <= (*M).tu; k++) { + m = (*M).data[k].i; // 当前三元组元素在矩阵中的行位置 + + // 记录每行第一个非零元的在三元组表中的位置 + if((*M).rpos[m] == 0) { + (*M).rpos[m] = k; // 只会在当前行有非零元的情况下记录 + } + } + + // 处理那些没有非零元的行 + for(k = (*M).mu; k >= 1; k--) { + // 如果当前行没有非零元,则此处会直接取用下一行的参数 + if((*M).rpos[k] == 0) { + // 如果是最后一行无非零元,因为已经不存在下一行了,所以需特殊处理 + if(k == (*M).mu) { + (*M).rpos[k] = (*M).tu + 1; + } else { + (*M).rpos[k] = (*M).rpos[k + 1]; + } + } + } +} diff --git a/CLion/ExerciseBook/05.23/RLSMatrix.h b/CLion/ExerciseBook/05.23/RLSMatrix.h new file mode 100644 index 0000000..bb1c595 --- /dev/null +++ b/CLion/ExerciseBook/05.23/RLSMatrix.h @@ -0,0 +1,107 @@ +/*============================= + * 行逻辑链接的顺序表(稀疏矩阵) + * + * 包含算法: 5.3 + ==============================*/ + +#ifndef RLSMATRIX_H +#define RLSMATRIX_H + +#include +#include // 提供 malloc 原型 +#include // 提供 strstr 原型 +#include "Status.h" //**▲01 绪论**// + +/* 宏定义 */ +#define MAXSIZE 12500 // 非零元数量的最大值 +#define MAXRC 20 // 各行元素个数的最大值 + +/* 行逻辑链接的稀疏矩阵元素类型 */ +typedef int ElemType; + +/* 三元组类型定义,主要用来存储非零元 */ +typedef struct { + int i, j; // 该非零元的行下标和列下标 + ElemType e; +} Triple; + +/* 行逻辑链接的稀疏矩阵类型定义 */ +typedef struct { + Triple data[MAXSIZE + 1]; // 非零元三元组表,data[0]未用 + int rpos[MAXRC + 1]; // 各行第一个非零元在三元组表中的位置表,rpos[0]未用 + int mu, nu, tu; // 矩阵的行数、列数和非零元个数 +} RLSMatrix; + + +/* + * 创建稀疏矩阵M + * + * + *【备注】 + * + * 教材中默认从控制台读取数据。 + * 这里为了方便测试,避免每次运行都手动输入数据, + * 因而允许选择从预设的文件path中读取测试数据。 + * + * 如果需要从控制台读取数据,则path为NULL或者为空串, + * 如果需要从文件中读取数据,则需要在path中填写文件名信息。 + */ +Status CreateSMatrix(RLSMatrix* M, char* path); + +/* + * 销毁稀疏矩阵 + * + *【注】 + * 行逻辑链接的顺序表结构无法销毁。 + */ +Status DestroySMatrix(RLSMatrix* M); + +/* + * 矩阵复制 + * + * 创建一个新矩阵T,该矩阵包含了从矩阵M中包含的数据。 + */ +Status CopySMatrix(RLSMatrix M, RLSMatrix* T); + +/* + * 矩阵加法 + * + * Q = M + N。 + */ +Status AddSMatrix(RLSMatrix M, RLSMatrix N, RLSMatrix* Q); + +/* + * 矩阵减法 + * + * Q = M - N。 + */ +Status SubSMatrix(RLSMatrix M, RLSMatrix N, RLSMatrix* Q); + +/* + * ████████ 算法5.3 ████████ + * + * 矩阵乘法 + * + * Q = M * N。 + */ +Status MultSMatrix(RLSMatrix M, RLSMatrix N, RLSMatrix* Q); + +/* + * 矩阵转置 + */ +Status TransposeSMatrix(RLSMatrix M, RLSMatrix* T); + +/* + * 矩阵快速转置 + */ +Status FastTransposeSMatrix(RLSMatrix M, RLSMatrix* T); + +/* + * 输出矩阵 + */ +void PrintSMatrix(RLSMatrix M); + +// 为rpos数组赋值 +static void AssignRpos(RLSMatrix* M); + +#endif diff --git a/CLion/ExerciseBook/05.23/TestData_M.txt b/CLion/ExerciseBook/05.23/TestData_M.txt new file mode 100644 index 0000000..5d3cb45 --- /dev/null +++ b/CLion/ExerciseBook/05.23/TestData_M.txt @@ -0,0 +1,4 @@ +行数:5 +列数:5 +非零元个数:10 +三元组:(1,2,1),(1,4,5),(2,3,-3),(2,5,2),(3,1,2),(3,2,3),(3,3,4),(4,4,2),(5,1,3),(5,2,-1) \ No newline at end of file diff --git a/CLion/ExerciseBook/05.24/05.24.c b/CLion/ExerciseBook/05.24/05.24.c new file mode 100644 index 0000000..c21de6c --- /dev/null +++ b/CLion/ExerciseBook/05.24/05.24.c @@ -0,0 +1,49 @@ +#include +#include "Status.h" //**▲01 绪论**// +#include "SMatrix.h" //**稀疏矩阵**// + +/* + * 获取矩阵中第i行第j列的元素,并将其存储到e中 + */ +Status Algo_5_24(SMatrix M, int i, int j, int* e); + + +int main(int argc, char* argv[]) { + SMatrix M; + int e; + + printf("█ 创建个稀疏矩阵 M ...\n"); + CreateSMatrix(&M, "TestData_M.txt"); + printf("M = \n"); + PrintSMatrix(M); + + Algo_5_24(M, 2, 3, &e); + printf("第 %d 行 %d 列的元素为 %d\n", 2, 3, e); + + return 0; +} + + +/* + * 获取矩阵中第i行第j列的元素,并将其存储到e中 + */ +Status Algo_5_24(SMatrix M, int i, int j, int* e) { + int s, p; + + if(i < 1 || i > M.mu || j < 1 || j > M.nu) { + return ERROR; + } + + for(p = 1, s = (i - 1) * M.nu + j; M.data[p].seq < s; p++) { + // 寻找指定的元素 + } + + *e = 0; // 默认为0 + + // 找到对应列下标的元素 + if(M.data[p].seq == s) { + *e = M.data[p].e; + } + + return OK; +} diff --git a/CLion/ExerciseBook/05.24/CMakeLists.txt b/CLion/ExerciseBook/05.24/CMakeLists.txt new file mode 100644 index 0000000..1c29d0b --- /dev/null +++ b/CLion/ExerciseBook/05.24/CMakeLists.txt @@ -0,0 +1,13 @@ +# 包含公共库 +include_directories(${CMAKE_SOURCE_DIR}/Status) + +# 生成可执行文件 +add_executable(05.24 SMatrix.h SMatrix.c 05.24.c) +# 链接公共库 +target_link_libraries(05.24 Scanf_lib) + + +# 记录要拷贝到*.exe目录下的资源文件 +file(GLOB TestData TestData*.txt) +# 将资源文件拷贝到*.exe目录下,不然无法加载 +file(COPY ${TestData} DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) diff --git a/CLion/ExerciseBook/05.24/SMatrix.c b/CLion/ExerciseBook/05.24/SMatrix.c new file mode 100644 index 0000000..23b1c67 --- /dev/null +++ b/CLion/ExerciseBook/05.24/SMatrix.c @@ -0,0 +1,44 @@ +/*====================== + * 稀疏矩阵,用于习题5.24 + =======================*/ + +#include "SMatrix.h" //**稀疏矩阵**// + +// 创建稀疏矩阵M +Status CreateSMatrix(SMatrix* M, char* path) { + FILE* fp; + int k, i, j; + + fp = fopen(path, "r"); + + ReadData(fp, "%d%d%d", &((*M).mu), &((*M).nu), &((*M).tu)); + + // 读取元素 + for(k = 1; k <= (*M).tu; k++) { + ReadData(fp, "%d%d%d", &i, &j, &((*M).data[k].e)); + (*M).data[k].seq = (i - 1) * (*M).nu + j; + } + + fclose(fp); + + return OK; +} + +// 输出稀疏矩阵M +void PrintSMatrix(SMatrix M) { + int r, c; + int k = 1; + + for(r = 1; r <= M.mu; r++) { + for(c = 1; c <= M.nu; c++) { + if(r == (M.data[k].seq - 1) / M.nu + 1 && c == (M.data[k].seq - 1) % M.nu + 1) { + + printf("%3d ", M.data[k].e); + k++; + } else { + printf(" 0 "); + } + } + printf("\n"); + } +} diff --git a/CLion/ExerciseBook/05.24/SMatrix.h b/CLion/ExerciseBook/05.24/SMatrix.h new file mode 100644 index 0000000..be19445 --- /dev/null +++ b/CLion/ExerciseBook/05.24/SMatrix.h @@ -0,0 +1,32 @@ +/*====================== + * 稀疏矩阵,用于习题5.24 + =======================*/ + +#ifndef SMATRIX_H +#define SMATRIX_H + +#include +#include "Status.h" //**▲01 绪论**// + +#define MAXSIZE 100 // 假设非零元个数的最大值为400 + +/* 非零元类型 */ +typedef struct { + int seq; // 该非零元在矩阵中的序号(以行序为主序) + int e; +} SElem; + +/* 稀疏矩阵 */ +typedef struct { + SElem data[MAXSIZE + 1]; // 存储各非零元素,data[0]未用 + int mu, nu, tu; // 矩阵的行数、列数和非零元个数 +} SMatrix; + + +// 创建稀疏矩阵M +Status CreateSMatrix(SMatrix* M, char* path); + +// 输出稀疏矩阵M +void PrintSMatrix(SMatrix M); + +#endif diff --git a/CLion/ExerciseBook/05.24/TestData_M.txt b/CLion/ExerciseBook/05.24/TestData_M.txt new file mode 100644 index 0000000..5d3cb45 --- /dev/null +++ b/CLion/ExerciseBook/05.24/TestData_M.txt @@ -0,0 +1,4 @@ +行数:5 +列数:5 +非零元个数:10 +三元组:(1,2,1),(1,4,5),(2,3,-3),(2,5,2),(3,1,2),(3,2,3),(3,3,4),(4,4,2),(5,1,3),(5,2,-1) \ No newline at end of file diff --git a/CLion/ExerciseBook/05.25/05.25.c b/CLion/ExerciseBook/05.25/05.25.c new file mode 100644 index 0000000..bb5b99b --- /dev/null +++ b/CLion/ExerciseBook/05.25/05.25.c @@ -0,0 +1,79 @@ +#include +#include "Status.h" //**▲01 绪论**// +#include "SMatrix.h" //**稀疏矩阵**// + +/* + * 稀疏矩阵加法:AddSMatrix + */ +Status Algo_5_25(SMatrix P, SMatrix Q, SMatrix* R); + + +int main(int argc, char* argv[]) { + SMatrix M, N, Q; + + printf("█ 创建两个稀疏矩阵 M、N ...\n"); + CreateSMatrix(&M, "TestData_M.txt"); + CreateSMatrix(&N, "TestData_N.txt"); + printf("█ M = \n"); + PrintSMatrix(M); + printf("█ N = \n"); + PrintSMatrix(N); + + Algo_5_25(M, N, &Q); + printf("Q = M + N = \n"); + PrintSMatrix(Q); + + return 0; +} + + +/* + * 稀疏矩阵加法:AddSMatrix + */ +Status Algo_5_25(SMatrix P, SMatrix Q, SMatrix* R) { + int i, j; + int p, q, r; + + if(P.mu != Q.mu || P.nu != Q.nu) { + printf("两矩阵的行数、列数不满足相加条件!!\n"); + return ERROR; + } + + // 初始化R的信息 + (*R).mu = P.mu; + (*R).nu = P.nu; + (*R).tu = 0; + memset((*R).V, 0, sizeof((*R).V)); + memset((*R).B, 0, sizeof((*R).B)); + + // 指向P、Q、R中的数组V + p = q = r = 0; + + for(i = 0; i < P.mu; ++i) { + for(j = 0; j < P.nu; ++j) { + if(P.B[i][j] == 0 && Q.B[i][j] == 0) { + continue; + } else if(P.B[i][j] == 0 && Q.B[i][j] == 1) { + (*R).V[r++] = Q.V[q++]; + (*R).B[i][j] = 1; + } else if(P.B[i][j] == 1 && Q.B[i][j] == 0) { + (*R).V[r++] = P.V[p++]; + (*R).B[i][j] = 1; + + // 如果P、Q两处均有非零元,则尝试相加 + } else { + if((P.V[p] + Q.V[q])!=0) { + (*R).V[r++] = P.V[p] + Q.V[q]; + (*R).B[i][j] = 1; + } + + p++; + q++; + } + } + } + + (*R).tu = r; + + return OK; +} diff --git a/CLion/ExerciseBook/05.25/CMakeLists.txt b/CLion/ExerciseBook/05.25/CMakeLists.txt new file mode 100644 index 0000000..dd27f45 --- /dev/null +++ b/CLion/ExerciseBook/05.25/CMakeLists.txt @@ -0,0 +1,13 @@ +# 包含公共库 +include_directories(${CMAKE_SOURCE_DIR}/Status) + +# 生成可执行文件 +add_executable(05.25 SMatrix.h SMatrix.c 05.25.c) +# 链接公共库 +target_link_libraries(05.25 Scanf_lib) + + +# 记录要拷贝到*.exe目录下的资源文件 +file(GLOB TestData TestData*.txt) +# 将资源文件拷贝到*.exe目录下,不然无法加载 +file(COPY ${TestData} DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) diff --git a/CLion/ExerciseBook/05.25/SMatrix.c b/CLion/ExerciseBook/05.25/SMatrix.c new file mode 100644 index 0000000..1775e2d --- /dev/null +++ b/CLion/ExerciseBook/05.25/SMatrix.c @@ -0,0 +1,48 @@ +/*====================== + * 稀疏矩阵,用于习题5.25 + =======================*/ + +#include "SMatrix.h" //**稀疏矩阵**// + +// 创建稀疏矩阵M +Status CreateSMatrix(SMatrix* M, char* path) { + FILE* fp; + int v, i, j; + + fp = fopen(path, "r"); + + ReadData(fp, "%d%d%d", &((*M).mu), &((*M).nu), &((*M).tu)); + + memset((*M).V, 0, sizeof((*M).V)); + memset((*M).B, 0, sizeof((*M).B)); + + for(v=0; v < (*M).tu; v++) { + // 读取非零元信息,将元素存入数组V中 + ReadData(fp, "%d%d%d", &i, &j, &((*M).V[v])); + + (*M).B[i-1][j-1] = 1; + } + + fclose(fp); + + return OK; +} + +// 输出稀疏矩阵M +void PrintSMatrix(SMatrix M) { + int v, i, j; + + v = 0; // 遍历V的游标 + + for(i = 1; i <= M.mu; i++) { + for(j = 1; j <= M.nu; j++) { + if(M.B[i-1][j-1] == 1) { + printf("%3d ", M.V[v++]); + } else { + printf("%3d ", M.B[i-1][j-1]); + } + } + + printf("\n"); + } +} diff --git a/CLion/ExerciseBook/05.25/SMatrix.h b/CLion/ExerciseBook/05.25/SMatrix.h new file mode 100644 index 0000000..6f8eb91 --- /dev/null +++ b/CLion/ExerciseBook/05.25/SMatrix.h @@ -0,0 +1,32 @@ +/*====================== + * 稀疏矩阵,用于习题5.25 + =======================*/ + +#ifndef SMATRIX_H +#define SMATRIX_H + +#include +#include +#include +#include "Status.h" //**▲01 绪论**// + +/* 宏定义 */ +#define Mu 20 // 假设矩阵行数最大值为20 +#define Nu 20 // 假设矩阵列数最大值为20 +#define MAXSIZE 400 // 假设非零元个数的最大值为400 + +/* 稀疏矩阵类型定义 */ +typedef struct { + int V[MAXSIZE]; // 存储矩阵的元素 + int B[Mu][Nu]; // 标记矩阵中各位置元素是否为非零元 + int mu, nu, tu; // 矩阵行数,列数,非零元个数 +} SMatrix; + + +// 创建稀疏矩阵M +Status CreateSMatrix(SMatrix* M, char* path); + +// 输出稀疏矩阵M +void PrintSMatrix(SMatrix M); + +#endif diff --git a/CLion/ExerciseBook/05.25/TestData_M.txt b/CLion/ExerciseBook/05.25/TestData_M.txt new file mode 100644 index 0000000..5d3cb45 --- /dev/null +++ b/CLion/ExerciseBook/05.25/TestData_M.txt @@ -0,0 +1,4 @@ +行数:5 +列数:5 +非零元个数:10 +三元组:(1,2,1),(1,4,5),(2,3,-3),(2,5,2),(3,1,2),(3,2,3),(3,3,4),(4,4,2),(5,1,3),(5,2,-1) \ No newline at end of file diff --git a/CLion/ExerciseBook/05.25/TestData_N.txt b/CLion/ExerciseBook/05.25/TestData_N.txt new file mode 100644 index 0000000..d567717 --- /dev/null +++ b/CLion/ExerciseBook/05.25/TestData_N.txt @@ -0,0 +1,4 @@ +行数:5 +列数:5 +非零元个数:8 +三元组:(1,1,-3)(1,3,2)(2,4,-1)(3,2,4)(4,1,6)(4,5,5)(5,1,3)(5,3,2) \ No newline at end of file diff --git a/CLion/ExerciseBook/05.26/05.26.c b/CLion/ExerciseBook/05.26/05.26.c new file mode 100644 index 0000000..17fffe5 --- /dev/null +++ b/CLion/ExerciseBook/05.26/05.26.c @@ -0,0 +1,49 @@ +#include +#include "Status.h" //**▲01 绪论**// +#include "CrossList.h" //**▲05 数组和广义表**// + +/* + * 以三元组形式输出十字链表 + */ +Status Algo_5_26(CrossList M); + + +int main(int argc, char* argv[]) { + CrossList M; + + printf("创建十字链表 M...\n"); + CreateSMatrix(&M, "TestData_M.txt"); + printf("M = \n"); + PrintSMatrix(M); + + printf("按三元组形式输出 M...\n"); + printf(" 行 列 值\n"); + Algo_5_26(M); + + return 0; +} + + +/* + * 以三元组形式输出十字链表 + */ +Status Algo_5_26(CrossList M) { + int i, j; + OLNode* p; + + if(M.tu==0) { + return ERROR; + } + + for(i = 1; i <= M.mu; ++i) { + p = M.rhead[i]; + for(j = 1; j <= M.nu; ++j) { + if(p && p->j == j) { + printf("(%2d %2d %3d)\n", i, j, p->e); + p = p->right; + } + } + } + + return OK; +} diff --git a/CLion/ExerciseBook/05.26/CMakeLists.txt b/CLion/ExerciseBook/05.26/CMakeLists.txt new file mode 100644 index 0000000..b669009 --- /dev/null +++ b/CLion/ExerciseBook/05.26/CMakeLists.txt @@ -0,0 +1,13 @@ +# 包含公共库 +include_directories(${CMAKE_SOURCE_DIR}/Status) + +# 生成可执行文件 +add_executable(05.26 CrossList.h CrossList.c 05.26.c) +# 链接公共库 +target_link_libraries(05.26 Scanf_lib) + + +# 记录要拷贝到*.exe目录下的资源文件 +file(GLOB TestData TestData*.txt) +# 将资源文件拷贝到*.exe目录下,不然无法加载 +file(COPY ${TestData} DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) diff --git a/CLion/ExerciseBook/05.26/CrossList.c b/CLion/ExerciseBook/05.26/CrossList.c new file mode 100644 index 0000000..2a29342 --- /dev/null +++ b/CLion/ExerciseBook/05.26/CrossList.c @@ -0,0 +1,885 @@ +/*=================== + * 十字链表(稀疏矩阵) + * + * 包含算法: 5.4 + ====================*/ + +#include "CrossList.h" //**▲05 数组和广义表**// + +/* + * ████████ 算法5.4 ████████ + * + * 创建稀疏矩阵M + * + * + *【备注】 + * + * 教材中默认从控制台读取数据。 + * 这里为了方便测试,避免每次运行都手动输入数据, + * 因而允许选择从预设的文件path中读取测试数据。 + * + * 如果需要从控制台读取数据,则path为NULL或者为空串, + * 如果需要从文件中读取数据,则需要在path中填写文件名信息。 + */ +Status CreateSMatrix(CrossList* M, char* path) { + int i, j, k; + OLNode* p, * q; + FILE* fp; + int readFromConsole; // 是否从控制台读取数据 + + // 如果没有文件路径信息,则从控制台读取输入 + readFromConsole = path == NULL || strcmp(path, "") == 0; + + if(readFromConsole) { + printf("请输入行数:"); + scanf("%d", &((*M).mu)); + printf("请输入列数:"); + scanf("%d", &((*M).nu)); + printf("请输入非零元素个数:"); + scanf("%d", &((*M).tu)); + printf("请输入%d个三元组信息\n", (*M).tu); + } else { + fp = fopen(path, "r"); + ReadData(fp, "%d%d%d", &((*M).mu), &((*M).nu), &((*M).tu)); + } + + // 创建行链(类似行索引,0号单元弃用) + (*M).rhead = (OLink*) malloc(((*M).mu + 1) * sizeof(OLink)); + if((*M).rhead == NULL) { + exit(OVERFLOW); + } + + // 创建列链(类似列索引,0号单元弃用) + (*M).chead = (OLink*) malloc(((*M).nu + 1) * sizeof(OLink)); + if((*M).chead == NULL) { + exit(OVERFLOW); + } + + // 初始化行链索引为NULL + for(k = 0; k <= (*M).mu; ++k) { + (*M).rhead[k] = NULL; + } + + // 初始化列链索引为NULL + for(k = 0; k <= (*M).nu; ++k) { + (*M).chead[k] = NULL; + } + + // 依次录入非零元 + for(k = 1; k <= (*M).tu; ++k) { + // 创建三元组结点 + p = (OLNode*) malloc(sizeof(OLNode)); + if(p == NULL) { + exit(OVERFLOW); + } + + if(readFromConsole) { + printf("第%2d组:", k); + scanf("%d%d%d", &i, &j, &(p->e)); + } else { + ReadData(fp, "%d%d%d", &i, &j, &(p->e)); + } + + p->i = i; // 行号 + p->j = j; // 列号 + p->right = p->down = NULL; + + /* + * 开始行的插入 + */ + + // 如果该行还没有元素,或已有元素均位于该元素右侧,则可以直接插入 + if((*M).rhead[i] == NULL || (*M).rhead[i]->j > j) { + // 定位行表中的插入位置 + p->right = (*M).rhead[i]; + (*M).rhead[i] = p; + } else { + // 寻找插入位置的前一个位置 + for(q = (*M).rhead[i]; (q->right) && (q->right->j < j); q = q->right) { + } + + if(q->j == p->j || ((q->right) && q->right->j == p->j)) { + printf("此位置已被占用!!\n"); + exit(ERROR); + } + + p->right = q->right; + q->right = p; + } + + /* + * 开始列的插入 + */ + + // 如果该列还没有元素,或已有元素均位于该元素下侧,则可以直接插入 + if((*M).chead[j] == NULL || (*M).chead[j]->i > i) { + // 定位列表中的插入位置 + p->down = (*M).chead[j]; + (*M).chead[j] = p; + } else { + // 寻找插入位置的前一个位置 + for(q = (*M).chead[j]; (q->down) && (q->down->i < i); q = q->down) { + } + + if(q->i == p->i || ((q->down) && q->down->i == p->i)) { + printf("此位置已被占用!!\n"); + exit(ERROR); + } + + p->down = q->down; + q->down = p; + } + } + + if(!readFromConsole) { + fclose(fp); + } + + return OK; +} + +/* + * 销毁稀疏矩阵 + */ +Status DestroySMatrix(CrossList* M) { + int i; + OLNode* p, * q; + + // 无论从按行还是按列,只需要朝着一个方向去遍历销毁就可以了 + for(i = 1; i <= (*M).mu; ++i) { + p = (*M).rhead[i]; + while(p != NULL) { + q = p; + p = p->right; + free(q); + } + } + + free((*M).rhead); + free((*M).chead); + + (*M).rhead = (*M).chead = NULL; + (*M).mu = (*M).nu = (*M).tu = 0; + + return OK; +} + +/* + * 矩阵复制 + * + * 创建一个新矩阵T,该矩阵包含了从矩阵M中包含的数据。 + */ +Status CopySMatrix(CrossList M, CrossList* T) { + int k; + OLNode* p, * q, * r, * l; + + if(T == NULL) { + return ERROR; + } + + // 复制行列信息 + (*T).mu = M.mu; + (*T).nu = M.nu; + (*T).tu = M.tu; + + // 创建行链(类似行索引,0号单元弃用) + (*T).rhead = (OLink*) malloc(((*T).mu + 1) * sizeof(OLink)); + if((*T).rhead == NULL) { + exit(OVERFLOW); + } + + // 创建列链(类似列索引,0号单元弃用) + (*T).chead = (OLink*) malloc(((*T).nu + 1) * sizeof(OLink)); + if((*T).chead == NULL) { + exit(OVERFLOW); + } + + // 初始化行链索引为NULL + for(k = 0; k <= (*T).mu; ++k) { //初始化行列头指针向量为空 + (*T).rhead[k] = NULL; + } + + // 初始化列链索引为NULL + for(k = 0; k <= (*T).nu; ++k) { + (*T).chead[k] = NULL; + } + + // 按行扫描,依次复制非零元 + for(k = 1; k <= M.mu; ++k) { + q = M.rhead[k]; + + // 如果当前行没有元素,直接跳过 + if(q == NULL) { + continue; + } + + r = NULL; + + while(q != NULL) { + // 创建三元组结点 + p = (OLNode*) malloc(sizeof(OLNode)); + if(p == NULL) { + exit(OVERFLOW); + } + + // 为结点赋值 + p->i = q->i; + p->j = q->j; + p->e = q->e; + p->right = p->down = NULL; + + /* + * 开始行的插入 + */ + + if(r == NULL) { + (*T).rhead[q->i] = p; + } else { + r->right = p; + } + + // r指向当前行新插入的结点 + r = p; + + /* + * 开始列的插入 + */ + + // 在列链中寻找插入位置 + if((*T).chead[q->j] == NULL || (*T).chead[q->j]->i > q->i) { + r->down = (*T).chead[q->j]; + (*T).chead[q->j] = r; + } else { + // 寻找插入位置的前一个位置 + for(l = (*T).chead[q->j]; (l->down) && (l->down->i < q->i); l = l->down) { + } + r->down = l->down; + l->down = r; + } + + q = q->right; + } + } + + return OK; +} + +/* + * 矩阵加法 + * + * Q = M + N。 + */ +Status AddSMatrix(CrossList M, CrossList N, CrossList* Q) { + int i; + OLNode* pm, * pn, * p, * r, * l; + + if(M.mu != N.mu || M.nu != N.nu) { + printf("两矩阵的行数、列数不满足相加条件!!\n"); + return ERROR; + } + + // 初始化Q的行列信息 + Q->mu = M.mu; + Q->nu = M.nu; + Q->tu = 0; + + // 创建行链(类似行索引,0号单元弃用) + Q->rhead = (OLink*) malloc((Q->mu + 1) * sizeof(OLink)); + if(!Q->rhead) { + exit(OVERFLOW); + } + + // 创建列链(类似列索引,0号单元弃用) + Q->chead = (OLink*) malloc((Q->nu + 1) * sizeof(OLink)); + if(!Q->chead) { + exit(OVERFLOW); + } + + // 初始化行链索引为NULL + for(i = 0; i <= Q->mu; ++i) { + Q->rhead[i] = NULL; + } + + // 初始化列链索引为NULL + for(i = 0; i <= Q->nu; ++i) { + Q->chead[i] = NULL; + } + + // 从第一行往下遍历 + for(i = 1; i <= M.mu; ++i) { + pm = M.rhead[i]; + pn = N.rhead[i]; + + // 如果M与N的当前行中均有未处理的非零元 + while(pm != NULL && pn != NULL) { + // 处理特殊情形 + if(pm->j == pn->j && pm->e + pn->e == 0) { + pm = pm->right; + pn = pn->right; + continue; + } + + // 创建结点 + p = (OLNode*) malloc(sizeof(OLNode)); + if(!p) { + exit(OVERFLOW); + } + + // M中的三元组列下标较小 + if(pm->j < pn->j) { + p->i = pm->i; + p->j = pm->j; + p->e = pm->e; + pm = pm->right; + + // N中的三元组列下标较小 + } else if(pm->j > pn->j) { + p->i = pn->i; + p->j = pn->j; + p->e = pn->e; + pn = pn->right; + + // M与N中的三元组列下标一致,需要进行加法运算 + } else { + p->i = pm->i; + p->j = pm->j; + p->e = pm->e + pn->e; + pm = pm->right; + pn = pn->right; + } + + p->right = p->down = NULL; + + Q->tu++; // Q中非零元个数增一 + + /* + * 开始行的插入 + */ + + if(Q->rhead[p->i] == NULL) { + Q->rhead[p->i] = p; + } else { + r->right = p; + } + + // r指向当前行新插入的结点 + r = p; + + /* + * 开始列的插入 + */ + + // 在列链中寻找插入位置 + if(Q->chead[p->j] == NULL || Q->chead[p->j]->i > p->i) { + r->down = Q->chead[p->j]; + Q->chead[p->j] = r; + } else { + // 寻找插入位置的前一个位置 + for(l = Q->chead[p->j]; (l->down) && (l->down->i < p->i); l = l->down) { + } + r->down = l->down; + l->down = r; + } + } + + // 如果M的当前行中仍有未处理的非零元 + while(pm != NULL) { + p = (OLNode*) malloc(sizeof(OLNode)); + if(p == NULL) { + exit(OVERFLOW); + } + p->i = pm->i; + p->j = pm->j; + p->e = pm->e; + p->right = p->down = NULL; + + Q->tu++; // Q中非零元个数增一 + + if(Q->rhead[p->i] == NULL) { + Q->rhead[p->i] = p; + } else { + r->right = p; + } + + // r指向当前行新插入的结点 + r = p; + + // 在列链中寻找插入位置 + if(Q->chead[p->j] == NULL || Q->chead[p->j]->i > p->i) { + r->down = Q->chead[p->j]; + Q->chead[p->j] = r; + } else { + // 寻找插入位置的前一个位置 + for(l = Q->chead[p->j]; (l->down) && (l->down->i < p->i); l = l->down) { + } + r->down = l->down; + l->down = r; + } + + pm = pm->right; + } + + // 如果N的当前行中仍有未处理的非零元 + while(pn != NULL) { + p = (OLNode*) malloc(sizeof(OLNode)); + if(p == NULL) { + exit(OVERFLOW); + } + p->i = pn->i; + p->j = pn->j; + p->e = pn->e; + p->right = p->down = NULL; + + Q->tu++; // Q中非零元个数增一 + + if(Q->rhead[p->i] == NULL) { + Q->rhead[p->i] = p; + } else { + r->right = p; + } + + // r指向当前行新插入的结点 + r = p; + + // 在列链中寻找插入位置 + if(Q->chead[p->j] == NULL || Q->chead[p->j]->i > p->i) { + r->down = Q->chead[p->j]; + Q->chead[p->j] = r; + } else { + // 寻找插入位置的前一个位置 + for(l = Q->chead[p->j]; (l->down) && (l->down->i < p->i); l = l->down) { + } + r->down = l->down; + l->down = r; + } + + pn = pn->right; + } + } + + return OK; +} + +/* + * 矩阵减法 + * + * Q = M - N。 + */ +Status SubSMatrix(CrossList M, CrossList N, CrossList* Q) { + int i; + OLNode* pm, * pn, * p, * r, * l; + + if(M.mu != N.mu || M.nu != N.nu) { + printf("两矩阵的行数、列数不满足相减条件!!\n"); + return ERROR; + } + + // 初始化Q的行列信息 + Q->mu = M.mu; + Q->nu = M.nu; + Q->tu = 0; + + // 创建行链(类似行索引,0号单元弃用) + Q->rhead = (OLink*) malloc((Q->mu + 1) * sizeof(OLink)); + if(!Q->rhead) { + exit(OVERFLOW); + } + + // 创建列链(类似列索引,0号单元弃用) + Q->chead = (OLink*) malloc((Q->nu + 1) * sizeof(OLink)); + if(!Q->chead) { + exit(OVERFLOW); + } + + // 初始化行链索引为NULL + for(i = 0; i <= Q->mu; ++i) { + Q->rhead[i] = NULL; + } + + // 初始化列链索引为NULL + for(i = 0; i <= Q->nu; ++i) { + Q->chead[i] = NULL; + } + + // 从第一行往下遍历 + for(i = 1; i <= M.mu; ++i) { + pm = M.rhead[i]; + pn = N.rhead[i]; + + // 如果M与N的当前行中均有未处理的非零元 + while(pm != NULL && pn != NULL) { + // 处理特殊情形 + if(pm->j == pn->j && pm->e - pn->e == 0) { + pm = pm->right; + pn = pn->right; + continue; + } + + // 创建结点 + p = (OLNode*) malloc(sizeof(OLNode)); + if(!p) { + exit(OVERFLOW); + } + + // M中的三元组列下标较小 + if(pm->j < pn->j) { + p->i = pm->i; + p->j = pm->j; + p->e = pm->e; + pm = pm->right; + + // N中的三元组列下标较小 + } else if(pm->j > pn->j) { + p->i = pn->i; + p->j = pn->j; + p->e = -pn->e; // 加负号 + pn = pn->right; + + // M与N中的三元组列下标一致,需要进行减法运算 + } else { + p->i = pm->i; + p->j = pm->j; + p->e = pm->e - pn->e; + pm = pm->right; + pn = pn->right; + } + + p->right = p->down = NULL; + + Q->tu++; // Q中非零元个数增一 + + /* + * 开始行的插入 + */ + + if(Q->rhead[p->i] == NULL) { + Q->rhead[p->i] = p; + } else { + r->right = p; + } + + // r指向当前行新插入的结点 + r = p; + + /* + * 开始列的插入 + */ + + // 在列链中寻找插入位置 + if(Q->chead[p->j] == NULL || Q->chead[p->j]->i > p->i) { + r->down = Q->chead[p->j]; + Q->chead[p->j] = r; + } else { + //寻找插入位置的前一个位置 + for(l = Q->chead[p->j]; (l->down) && (l->down->i < p->i); l = l->down) { + } + r->down = l->down; + l->down = r; + } + } + + // 如果M的当前行中仍有未处理的非零元 + while(pm != NULL) { + p = (OLNode*) malloc(sizeof(OLNode)); + if(!p) { + exit(OVERFLOW); + } + p->i = pm->i; + p->j = pm->j; + p->e = pm->e; + p->right = p->down = NULL; + + Q->tu++; // Q中非零元个数增一 + + if(Q->rhead[p->i] == NULL) { + Q->rhead[p->i] = p; + } else { + r->right = p; + } + + // r指向当前行新插入的结点 + r = p; + + // 在列链中寻找插入位置 + if(Q->chead[p->j] == NULL || Q->chead[p->j]->i > p->i) { + r->down = Q->chead[p->j]; + Q->chead[p->j] = r; + } else { + // 寻找插入位置的前一个位置 + for(l = Q->chead[p->j]; (l->down) && (l->down->i < p->i); l = l->down) { + } + r->down = l->down; + l->down = r; + } + + pm = pm->right; + } + + // 如果N的当前行中仍有未处理的非零元 + while(pn != NULL) { + p = (OLNode*) malloc(sizeof(OLNode)); + if(!p) { + exit(OVERFLOW); + } + p->i = pn->i; + p->j = pn->j; + p->e = -pn->e; // 加负号 + p->right = p->down = NULL; + + Q->tu++; // Q中非零元个数增一 + + if(Q->rhead[p->i] == NULL) { + Q->rhead[p->i] = p; + } else { + r->right = p; + } + + // r指向当前行新插入的结点 + r = p; + + // 在列链中寻找插入位置 + if(Q->chead[p->j] == NULL || Q->chead[p->j]->i > p->i) { + r->down = Q->chead[p->j]; + Q->chead[p->j] = r; + } else { + // 寻找插入位置的前一个位置 + for(l = Q->chead[p->j]; (l->down) && (l->down->i < p->i); l = l->down) { + } + r->down = l->down; + l->down = r; + } + + pn = pn->right; + } + } + + return OK; +} + +/* + * 矩阵乘法 + * + * Q = M * N。 + */ +Status MultSMatrix(CrossList M, CrossList N, CrossList* Q) { + int m_row, n_col, i; + ElemType e; + OLNode* pm, * pn, * p, * r, * l; + + // M的列数需要等于N的行数 + if(M.nu != N.mu) { + printf("两矩阵的行数、列数不满足相乘条件!!\n"); + return ERROR; + } + + // 初始化Q的行列信息 + Q->mu = M.mu; + Q->nu = N.nu; + Q->tu = 0; + + // 创建行链(类似行索引,0号单元弃用) + Q->rhead = (OLink*) malloc((Q->mu + 1) * sizeof(OLink)); + if(!Q->rhead) { + exit(OVERFLOW); + } + + // 创建列链(类似列索引,0号单元弃用) + Q->chead = (OLink*) malloc((Q->nu + 1) * sizeof(OLink)); + if(!Q->chead) { + exit(OVERFLOW); + } + + // 初始化行链索引为NULL + for(i = 0; i <= Q->mu; ++i) { + Q->rhead[i] = NULL; + } + + // 初始化列链索引为NULL + for(i = 0; i <= Q->nu; ++i) { + Q->chead[i] = NULL; + } + + // Q是非零矩阵 + if(M.tu * N.tu) { + for(m_row = 1; m_row <= M.mu; ++m_row) { + for(n_col = 1; n_col <= N.nu; ++n_col) { + pm = M.rhead[m_row]; + pn = N.chead[n_col]; + + e = 0; + + // M的行与N的列相乘 + while(pm && pn) { + if(pm->j < pn->i) { + pm = pm->right; + } else if(pm->j > pn->i) { + pn = pn->down; + } else { + e += pm->e * pn->e; + pm = pm->right; + pn = pn->down; + } + } + + if(e == 0) { + continue; + } + + p = (OLNode*) malloc(sizeof(OLNode)); + if(!p) { + exit(OVERFLOW); + } + + // 为结点赋值 + p->i = M.rhead[m_row]->i; + p->j = N.chead[n_col]->j; + p->e = e; + p->right = p->down = NULL; + + Q->tu++; // Q中非零元个数增一 + + if(Q->rhead[p->i] == NULL) { + Q->rhead[p->i] = p; + } else { + r->right = p; + } + + // r指向当前行新插入的结点 + r = p; + + // 在列链中寻找插入位置 + if(Q->chead[p->j] == NULL || Q->chead[p->j]->i > p->i) { + r->down = Q->chead[p->j]; + Q->chead[p->j] = r; + } else { + // 寻找插入位置的前一个位置 + for(l = Q->chead[p->j]; (l->down) && (l->down->i < p->i); l = l->down) { + } + + r->down = l->down; + l->down = r; + } + } + } + } + + return OK; +} + +/* + * 矩阵转置 + */ +Status TransposeSMatrix(CrossList M, CrossList* T) { + int i; + OLNode* p, * q, * r, * l; + + // 初始化Q的行列信息 + (*T).mu = M.nu; + (*T).nu = M.mu; + (*T).tu = M.tu; + + // 创建行链(类似行索引,0号单元弃用) + (*T).rhead = (OLink*) malloc(((*T).mu + 1) * sizeof(OLink)); + if(!(*T).rhead) { + exit(OVERFLOW); + } + + // 创建列链(类似列索引,0号单元弃用) + (*T).chead = (OLink*) malloc(((*T).nu + 1) * sizeof(OLink)); + if(!(*T).chead) { + exit(OVERFLOW); + } + + // 初始化行链索引为NULL + for(i = 0; i <= (*T).mu; ++i) { + (*T).rhead[i] = NULL; + } + + // 初始化列链索引为NULL + for(i = 0; i <= (*T).nu; ++i) { + (*T).chead[i] = NULL; + } + + // 零矩阵 + if(!(*T).tu) { + return OK; + } + + // 按列扫描 + for(i = 1; i <= M.nu; ++i) { + q = M.chead[i]; + + // 如果当前行没有元素,直接跳过 + if(q == NULL) { + continue; + } + + while(q != NULL) { + // 创建三元组结点 + p = (OLNode*) malloc(sizeof(OLNode)); + if(!p) { + exit(OVERFLOW); + } + + // 为结点赋值,行变列,列变行 + p->i = q->j; + p->j = q->i; + p->e = q->e; + p->right = p->down = NULL; + + /* + * 开始行的插入 + */ + + if((*T).rhead[p->i] == NULL) { + (*T).rhead[p->i] = p; + } else { + r->right = p; + } + + // r指向当前行新插入的结点 + r = p; + + /* + * 开始列的插入 + */ + + // 在列链中寻找插入位置 + if((*T).chead[p->j] == NULL || (*T).chead[p->j]->i > p->i) { + r->down = (*T).chead[p->j]; + (*T).chead[p->j] = r; + } else { + // 寻找插入位置的前一个位置 + for(l = (*T).chead[p->j]; (l->down) && (l->down->i < p->i); l = l->down) { + } + r->down = l->down; + l->down = r; + } + + q = q->down; + } + } + + return OK; +} + +/* + * 输出矩阵 + */ +void PrintSMatrix(CrossList M) { + int i, j; + OLNode* p; + + for(i = 1; i <= M.mu; ++i) { + p = M.rhead[i]; + for(j = 1; j <= M.nu; ++j) { + if(p && p->j == j) { + printf("%3d ", p->e); + p = p->right; + } else { + printf("%3d ", 0); + } + } + printf("\n"); + } +} diff --git a/CLion/ExerciseBook/05.26/CrossList.h b/CLion/ExerciseBook/05.26/CrossList.h new file mode 100644 index 0000000..deb950e --- /dev/null +++ b/CLion/ExerciseBook/05.26/CrossList.h @@ -0,0 +1,94 @@ +/*=================== + * 十字链表(稀疏矩阵) + * + * 包含算法: 5.4 + ====================*/ + +#ifndef CROSSLIST_H +#define CROSSLIST_H + +#include +#include // 提供malloc、realloc、free、exit原型 +#include // 提供 strstr 原型 +#include "Status.h" //**▲01 绪论**// + +/* 十字链表元素类型 */ +typedef int ElemType; + +/* 非零元类型定义 */ +typedef struct OLNode { + int i, j; // 该非零元的行下标和列下标 + ElemType e; + struct OLNode* right; // 该非零元所在的行表的后继链域 + struct OLNode* down; // 该非零元所在的列表的后继链域 +} OLNode, * OLink; + +/* 十字链表类型定义 */ +typedef struct { + OLink* rhead; // 行链表头指针 + OLink* chead; // 列链表头指针 + int mu, nu, tu; // 矩阵的行数、列数和非零元个数 +} CrossList; + + +/* + * ████████ 算法5.4 ████████ + * + * 创建稀疏矩阵M + * + * + *【备注】 + * + * 教材中默认从控制台读取数据。 + * 这里为了方便测试,避免每次运行都手动输入数据, + * 因而允许选择从预设的文件path中读取测试数据。 + * + * 如果需要从控制台读取数据,则path为NULL或者为空串, + * 如果需要从文件中读取数据,则需要在path中填写文件名信息。 + */ +Status CreateSMatrix(CrossList* M, char* path); + +/* + * 销毁稀疏矩阵 + */ +Status DestroySMatrix(CrossList* M); + +/* + * 矩阵复制 + * + * 创建一个新矩阵T,该矩阵包含了从矩阵M中包含的数据。 + */ +Status CopySMatrix(CrossList M, CrossList* T); + +/* + * 矩阵加法 + * + * Q = M + N。 + */ +Status AddSMatrix(CrossList M, CrossList N, CrossList* Q); + +/* + * 矩阵减法 + * + * Q = M - N。 + */ +Status SubSMatrix(CrossList M, CrossList N, CrossList* Q); + +/* + * 矩阵乘法 + * + * Q = M * N。 + */ +Status MultSMatrix(CrossList M, CrossList N, CrossList* Q); + +/* + * 矩阵转置 + */ +Status TransposeSMatrix(CrossList M, CrossList* T); + +/* + * 输出矩阵 + */ +void PrintSMatrix(CrossList M); + +#endif diff --git a/CLion/ExerciseBook/05.26/TestData_M.txt b/CLion/ExerciseBook/05.26/TestData_M.txt new file mode 100644 index 0000000..5d3cb45 --- /dev/null +++ b/CLion/ExerciseBook/05.26/TestData_M.txt @@ -0,0 +1,4 @@ +行数:5 +列数:5 +非零元个数:10 +三元组:(1,2,1),(1,4,5),(2,3,-3),(2,5,2),(3,1,2),(3,2,3),(3,3,4),(4,4,2),(5,1,3),(5,2,-1) \ No newline at end of file diff --git a/CLion/ExerciseBook/05.27/05.27.c b/CLion/ExerciseBook/05.27/05.27.c new file mode 100644 index 0000000..9590be8 --- /dev/null +++ b/CLion/ExerciseBook/05.27/05.27.c @@ -0,0 +1,41 @@ +#include +#include "Status.h" //**▲01 绪论**// +#include "CrossList.h" //**▲05 数组和广义表**// + +/* + * 稀疏矩阵加法:AddSMatrix + * + *【注】 + * 该函数已在CrossList相关文件中定义 + */ +Status Algo_5_27(CrossList M, CrossList N, CrossList* Q); + + +int main(int argc, char* argv[]) { + CrossList M, N, Q; + + printf("█ 创建两个稀疏矩阵 M、N ...\n"); + CreateSMatrix(&M, "TestData_M.txt"); + CreateSMatrix(&N, "TestData_N.txt"); + printf("█ M = \n"); + PrintSMatrix(M); + printf("█ N = \n"); + PrintSMatrix(N); + + Algo_5_27(M, N, &Q); + printf("█ Q = M + N = \n"); + PrintSMatrix(Q); + + return 0; +} + + +/* + * 稀疏矩阵加法:AddSMatrix + * + *【注】 + * 该函数已在CrossList相关文件中定义 + */ +Status Algo_5_27(CrossList M, CrossList N, CrossList* Q) { + return AddSMatrix(M, N, Q); +} diff --git a/CLion/ExerciseBook/05.27/CMakeLists.txt b/CLion/ExerciseBook/05.27/CMakeLists.txt new file mode 100644 index 0000000..5a3ea5a --- /dev/null +++ b/CLion/ExerciseBook/05.27/CMakeLists.txt @@ -0,0 +1,13 @@ +# 包含公共库 +include_directories(${CMAKE_SOURCE_DIR}/Status) + +# 生成可执行文件 +add_executable(05.27 CrossList.h CrossList.c 05.27.c) +# 链接公共库 +target_link_libraries(05.27 Scanf_lib) + + +# 记录要拷贝到*.exe目录下的资源文件 +file(GLOB TestData TestData*.txt) +# 将资源文件拷贝到*.exe目录下,不然无法加载 +file(COPY ${TestData} DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) diff --git a/CLion/ExerciseBook/05.27/CrossList.c b/CLion/ExerciseBook/05.27/CrossList.c new file mode 100644 index 0000000..2a29342 --- /dev/null +++ b/CLion/ExerciseBook/05.27/CrossList.c @@ -0,0 +1,885 @@ +/*=================== + * 十字链表(稀疏矩阵) + * + * 包含算法: 5.4 + ====================*/ + +#include "CrossList.h" //**▲05 数组和广义表**// + +/* + * ████████ 算法5.4 ████████ + * + * 创建稀疏矩阵M + * + * + *【备注】 + * + * 教材中默认从控制台读取数据。 + * 这里为了方便测试,避免每次运行都手动输入数据, + * 因而允许选择从预设的文件path中读取测试数据。 + * + * 如果需要从控制台读取数据,则path为NULL或者为空串, + * 如果需要从文件中读取数据,则需要在path中填写文件名信息。 + */ +Status CreateSMatrix(CrossList* M, char* path) { + int i, j, k; + OLNode* p, * q; + FILE* fp; + int readFromConsole; // 是否从控制台读取数据 + + // 如果没有文件路径信息,则从控制台读取输入 + readFromConsole = path == NULL || strcmp(path, "") == 0; + + if(readFromConsole) { + printf("请输入行数:"); + scanf("%d", &((*M).mu)); + printf("请输入列数:"); + scanf("%d", &((*M).nu)); + printf("请输入非零元素个数:"); + scanf("%d", &((*M).tu)); + printf("请输入%d个三元组信息\n", (*M).tu); + } else { + fp = fopen(path, "r"); + ReadData(fp, "%d%d%d", &((*M).mu), &((*M).nu), &((*M).tu)); + } + + // 创建行链(类似行索引,0号单元弃用) + (*M).rhead = (OLink*) malloc(((*M).mu + 1) * sizeof(OLink)); + if((*M).rhead == NULL) { + exit(OVERFLOW); + } + + // 创建列链(类似列索引,0号单元弃用) + (*M).chead = (OLink*) malloc(((*M).nu + 1) * sizeof(OLink)); + if((*M).chead == NULL) { + exit(OVERFLOW); + } + + // 初始化行链索引为NULL + for(k = 0; k <= (*M).mu; ++k) { + (*M).rhead[k] = NULL; + } + + // 初始化列链索引为NULL + for(k = 0; k <= (*M).nu; ++k) { + (*M).chead[k] = NULL; + } + + // 依次录入非零元 + for(k = 1; k <= (*M).tu; ++k) { + // 创建三元组结点 + p = (OLNode*) malloc(sizeof(OLNode)); + if(p == NULL) { + exit(OVERFLOW); + } + + if(readFromConsole) { + printf("第%2d组:", k); + scanf("%d%d%d", &i, &j, &(p->e)); + } else { + ReadData(fp, "%d%d%d", &i, &j, &(p->e)); + } + + p->i = i; // 行号 + p->j = j; // 列号 + p->right = p->down = NULL; + + /* + * 开始行的插入 + */ + + // 如果该行还没有元素,或已有元素均位于该元素右侧,则可以直接插入 + if((*M).rhead[i] == NULL || (*M).rhead[i]->j > j) { + // 定位行表中的插入位置 + p->right = (*M).rhead[i]; + (*M).rhead[i] = p; + } else { + // 寻找插入位置的前一个位置 + for(q = (*M).rhead[i]; (q->right) && (q->right->j < j); q = q->right) { + } + + if(q->j == p->j || ((q->right) && q->right->j == p->j)) { + printf("此位置已被占用!!\n"); + exit(ERROR); + } + + p->right = q->right; + q->right = p; + } + + /* + * 开始列的插入 + */ + + // 如果该列还没有元素,或已有元素均位于该元素下侧,则可以直接插入 + if((*M).chead[j] == NULL || (*M).chead[j]->i > i) { + // 定位列表中的插入位置 + p->down = (*M).chead[j]; + (*M).chead[j] = p; + } else { + // 寻找插入位置的前一个位置 + for(q = (*M).chead[j]; (q->down) && (q->down->i < i); q = q->down) { + } + + if(q->i == p->i || ((q->down) && q->down->i == p->i)) { + printf("此位置已被占用!!\n"); + exit(ERROR); + } + + p->down = q->down; + q->down = p; + } + } + + if(!readFromConsole) { + fclose(fp); + } + + return OK; +} + +/* + * 销毁稀疏矩阵 + */ +Status DestroySMatrix(CrossList* M) { + int i; + OLNode* p, * q; + + // 无论从按行还是按列,只需要朝着一个方向去遍历销毁就可以了 + for(i = 1; i <= (*M).mu; ++i) { + p = (*M).rhead[i]; + while(p != NULL) { + q = p; + p = p->right; + free(q); + } + } + + free((*M).rhead); + free((*M).chead); + + (*M).rhead = (*M).chead = NULL; + (*M).mu = (*M).nu = (*M).tu = 0; + + return OK; +} + +/* + * 矩阵复制 + * + * 创建一个新矩阵T,该矩阵包含了从矩阵M中包含的数据。 + */ +Status CopySMatrix(CrossList M, CrossList* T) { + int k; + OLNode* p, * q, * r, * l; + + if(T == NULL) { + return ERROR; + } + + // 复制行列信息 + (*T).mu = M.mu; + (*T).nu = M.nu; + (*T).tu = M.tu; + + // 创建行链(类似行索引,0号单元弃用) + (*T).rhead = (OLink*) malloc(((*T).mu + 1) * sizeof(OLink)); + if((*T).rhead == NULL) { + exit(OVERFLOW); + } + + // 创建列链(类似列索引,0号单元弃用) + (*T).chead = (OLink*) malloc(((*T).nu + 1) * sizeof(OLink)); + if((*T).chead == NULL) { + exit(OVERFLOW); + } + + // 初始化行链索引为NULL + for(k = 0; k <= (*T).mu; ++k) { //初始化行列头指针向量为空 + (*T).rhead[k] = NULL; + } + + // 初始化列链索引为NULL + for(k = 0; k <= (*T).nu; ++k) { + (*T).chead[k] = NULL; + } + + // 按行扫描,依次复制非零元 + for(k = 1; k <= M.mu; ++k) { + q = M.rhead[k]; + + // 如果当前行没有元素,直接跳过 + if(q == NULL) { + continue; + } + + r = NULL; + + while(q != NULL) { + // 创建三元组结点 + p = (OLNode*) malloc(sizeof(OLNode)); + if(p == NULL) { + exit(OVERFLOW); + } + + // 为结点赋值 + p->i = q->i; + p->j = q->j; + p->e = q->e; + p->right = p->down = NULL; + + /* + * 开始行的插入 + */ + + if(r == NULL) { + (*T).rhead[q->i] = p; + } else { + r->right = p; + } + + // r指向当前行新插入的结点 + r = p; + + /* + * 开始列的插入 + */ + + // 在列链中寻找插入位置 + if((*T).chead[q->j] == NULL || (*T).chead[q->j]->i > q->i) { + r->down = (*T).chead[q->j]; + (*T).chead[q->j] = r; + } else { + // 寻找插入位置的前一个位置 + for(l = (*T).chead[q->j]; (l->down) && (l->down->i < q->i); l = l->down) { + } + r->down = l->down; + l->down = r; + } + + q = q->right; + } + } + + return OK; +} + +/* + * 矩阵加法 + * + * Q = M + N。 + */ +Status AddSMatrix(CrossList M, CrossList N, CrossList* Q) { + int i; + OLNode* pm, * pn, * p, * r, * l; + + if(M.mu != N.mu || M.nu != N.nu) { + printf("两矩阵的行数、列数不满足相加条件!!\n"); + return ERROR; + } + + // 初始化Q的行列信息 + Q->mu = M.mu; + Q->nu = M.nu; + Q->tu = 0; + + // 创建行链(类似行索引,0号单元弃用) + Q->rhead = (OLink*) malloc((Q->mu + 1) * sizeof(OLink)); + if(!Q->rhead) { + exit(OVERFLOW); + } + + // 创建列链(类似列索引,0号单元弃用) + Q->chead = (OLink*) malloc((Q->nu + 1) * sizeof(OLink)); + if(!Q->chead) { + exit(OVERFLOW); + } + + // 初始化行链索引为NULL + for(i = 0; i <= Q->mu; ++i) { + Q->rhead[i] = NULL; + } + + // 初始化列链索引为NULL + for(i = 0; i <= Q->nu; ++i) { + Q->chead[i] = NULL; + } + + // 从第一行往下遍历 + for(i = 1; i <= M.mu; ++i) { + pm = M.rhead[i]; + pn = N.rhead[i]; + + // 如果M与N的当前行中均有未处理的非零元 + while(pm != NULL && pn != NULL) { + // 处理特殊情形 + if(pm->j == pn->j && pm->e + pn->e == 0) { + pm = pm->right; + pn = pn->right; + continue; + } + + // 创建结点 + p = (OLNode*) malloc(sizeof(OLNode)); + if(!p) { + exit(OVERFLOW); + } + + // M中的三元组列下标较小 + if(pm->j < pn->j) { + p->i = pm->i; + p->j = pm->j; + p->e = pm->e; + pm = pm->right; + + // N中的三元组列下标较小 + } else if(pm->j > pn->j) { + p->i = pn->i; + p->j = pn->j; + p->e = pn->e; + pn = pn->right; + + // M与N中的三元组列下标一致,需要进行加法运算 + } else { + p->i = pm->i; + p->j = pm->j; + p->e = pm->e + pn->e; + pm = pm->right; + pn = pn->right; + } + + p->right = p->down = NULL; + + Q->tu++; // Q中非零元个数增一 + + /* + * 开始行的插入 + */ + + if(Q->rhead[p->i] == NULL) { + Q->rhead[p->i] = p; + } else { + r->right = p; + } + + // r指向当前行新插入的结点 + r = p; + + /* + * 开始列的插入 + */ + + // 在列链中寻找插入位置 + if(Q->chead[p->j] == NULL || Q->chead[p->j]->i > p->i) { + r->down = Q->chead[p->j]; + Q->chead[p->j] = r; + } else { + // 寻找插入位置的前一个位置 + for(l = Q->chead[p->j]; (l->down) && (l->down->i < p->i); l = l->down) { + } + r->down = l->down; + l->down = r; + } + } + + // 如果M的当前行中仍有未处理的非零元 + while(pm != NULL) { + p = (OLNode*) malloc(sizeof(OLNode)); + if(p == NULL) { + exit(OVERFLOW); + } + p->i = pm->i; + p->j = pm->j; + p->e = pm->e; + p->right = p->down = NULL; + + Q->tu++; // Q中非零元个数增一 + + if(Q->rhead[p->i] == NULL) { + Q->rhead[p->i] = p; + } else { + r->right = p; + } + + // r指向当前行新插入的结点 + r = p; + + // 在列链中寻找插入位置 + if(Q->chead[p->j] == NULL || Q->chead[p->j]->i > p->i) { + r->down = Q->chead[p->j]; + Q->chead[p->j] = r; + } else { + // 寻找插入位置的前一个位置 + for(l = Q->chead[p->j]; (l->down) && (l->down->i < p->i); l = l->down) { + } + r->down = l->down; + l->down = r; + } + + pm = pm->right; + } + + // 如果N的当前行中仍有未处理的非零元 + while(pn != NULL) { + p = (OLNode*) malloc(sizeof(OLNode)); + if(p == NULL) { + exit(OVERFLOW); + } + p->i = pn->i; + p->j = pn->j; + p->e = pn->e; + p->right = p->down = NULL; + + Q->tu++; // Q中非零元个数增一 + + if(Q->rhead[p->i] == NULL) { + Q->rhead[p->i] = p; + } else { + r->right = p; + } + + // r指向当前行新插入的结点 + r = p; + + // 在列链中寻找插入位置 + if(Q->chead[p->j] == NULL || Q->chead[p->j]->i > p->i) { + r->down = Q->chead[p->j]; + Q->chead[p->j] = r; + } else { + // 寻找插入位置的前一个位置 + for(l = Q->chead[p->j]; (l->down) && (l->down->i < p->i); l = l->down) { + } + r->down = l->down; + l->down = r; + } + + pn = pn->right; + } + } + + return OK; +} + +/* + * 矩阵减法 + * + * Q = M - N。 + */ +Status SubSMatrix(CrossList M, CrossList N, CrossList* Q) { + int i; + OLNode* pm, * pn, * p, * r, * l; + + if(M.mu != N.mu || M.nu != N.nu) { + printf("两矩阵的行数、列数不满足相减条件!!\n"); + return ERROR; + } + + // 初始化Q的行列信息 + Q->mu = M.mu; + Q->nu = M.nu; + Q->tu = 0; + + // 创建行链(类似行索引,0号单元弃用) + Q->rhead = (OLink*) malloc((Q->mu + 1) * sizeof(OLink)); + if(!Q->rhead) { + exit(OVERFLOW); + } + + // 创建列链(类似列索引,0号单元弃用) + Q->chead = (OLink*) malloc((Q->nu + 1) * sizeof(OLink)); + if(!Q->chead) { + exit(OVERFLOW); + } + + // 初始化行链索引为NULL + for(i = 0; i <= Q->mu; ++i) { + Q->rhead[i] = NULL; + } + + // 初始化列链索引为NULL + for(i = 0; i <= Q->nu; ++i) { + Q->chead[i] = NULL; + } + + // 从第一行往下遍历 + for(i = 1; i <= M.mu; ++i) { + pm = M.rhead[i]; + pn = N.rhead[i]; + + // 如果M与N的当前行中均有未处理的非零元 + while(pm != NULL && pn != NULL) { + // 处理特殊情形 + if(pm->j == pn->j && pm->e - pn->e == 0) { + pm = pm->right; + pn = pn->right; + continue; + } + + // 创建结点 + p = (OLNode*) malloc(sizeof(OLNode)); + if(!p) { + exit(OVERFLOW); + } + + // M中的三元组列下标较小 + if(pm->j < pn->j) { + p->i = pm->i; + p->j = pm->j; + p->e = pm->e; + pm = pm->right; + + // N中的三元组列下标较小 + } else if(pm->j > pn->j) { + p->i = pn->i; + p->j = pn->j; + p->e = -pn->e; // 加负号 + pn = pn->right; + + // M与N中的三元组列下标一致,需要进行减法运算 + } else { + p->i = pm->i; + p->j = pm->j; + p->e = pm->e - pn->e; + pm = pm->right; + pn = pn->right; + } + + p->right = p->down = NULL; + + Q->tu++; // Q中非零元个数增一 + + /* + * 开始行的插入 + */ + + if(Q->rhead[p->i] == NULL) { + Q->rhead[p->i] = p; + } else { + r->right = p; + } + + // r指向当前行新插入的结点 + r = p; + + /* + * 开始列的插入 + */ + + // 在列链中寻找插入位置 + if(Q->chead[p->j] == NULL || Q->chead[p->j]->i > p->i) { + r->down = Q->chead[p->j]; + Q->chead[p->j] = r; + } else { + //寻找插入位置的前一个位置 + for(l = Q->chead[p->j]; (l->down) && (l->down->i < p->i); l = l->down) { + } + r->down = l->down; + l->down = r; + } + } + + // 如果M的当前行中仍有未处理的非零元 + while(pm != NULL) { + p = (OLNode*) malloc(sizeof(OLNode)); + if(!p) { + exit(OVERFLOW); + } + p->i = pm->i; + p->j = pm->j; + p->e = pm->e; + p->right = p->down = NULL; + + Q->tu++; // Q中非零元个数增一 + + if(Q->rhead[p->i] == NULL) { + Q->rhead[p->i] = p; + } else { + r->right = p; + } + + // r指向当前行新插入的结点 + r = p; + + // 在列链中寻找插入位置 + if(Q->chead[p->j] == NULL || Q->chead[p->j]->i > p->i) { + r->down = Q->chead[p->j]; + Q->chead[p->j] = r; + } else { + // 寻找插入位置的前一个位置 + for(l = Q->chead[p->j]; (l->down) && (l->down->i < p->i); l = l->down) { + } + r->down = l->down; + l->down = r; + } + + pm = pm->right; + } + + // 如果N的当前行中仍有未处理的非零元 + while(pn != NULL) { + p = (OLNode*) malloc(sizeof(OLNode)); + if(!p) { + exit(OVERFLOW); + } + p->i = pn->i; + p->j = pn->j; + p->e = -pn->e; // 加负号 + p->right = p->down = NULL; + + Q->tu++; // Q中非零元个数增一 + + if(Q->rhead[p->i] == NULL) { + Q->rhead[p->i] = p; + } else { + r->right = p; + } + + // r指向当前行新插入的结点 + r = p; + + // 在列链中寻找插入位置 + if(Q->chead[p->j] == NULL || Q->chead[p->j]->i > p->i) { + r->down = Q->chead[p->j]; + Q->chead[p->j] = r; + } else { + // 寻找插入位置的前一个位置 + for(l = Q->chead[p->j]; (l->down) && (l->down->i < p->i); l = l->down) { + } + r->down = l->down; + l->down = r; + } + + pn = pn->right; + } + } + + return OK; +} + +/* + * 矩阵乘法 + * + * Q = M * N。 + */ +Status MultSMatrix(CrossList M, CrossList N, CrossList* Q) { + int m_row, n_col, i; + ElemType e; + OLNode* pm, * pn, * p, * r, * l; + + // M的列数需要等于N的行数 + if(M.nu != N.mu) { + printf("两矩阵的行数、列数不满足相乘条件!!\n"); + return ERROR; + } + + // 初始化Q的行列信息 + Q->mu = M.mu; + Q->nu = N.nu; + Q->tu = 0; + + // 创建行链(类似行索引,0号单元弃用) + Q->rhead = (OLink*) malloc((Q->mu + 1) * sizeof(OLink)); + if(!Q->rhead) { + exit(OVERFLOW); + } + + // 创建列链(类似列索引,0号单元弃用) + Q->chead = (OLink*) malloc((Q->nu + 1) * sizeof(OLink)); + if(!Q->chead) { + exit(OVERFLOW); + } + + // 初始化行链索引为NULL + for(i = 0; i <= Q->mu; ++i) { + Q->rhead[i] = NULL; + } + + // 初始化列链索引为NULL + for(i = 0; i <= Q->nu; ++i) { + Q->chead[i] = NULL; + } + + // Q是非零矩阵 + if(M.tu * N.tu) { + for(m_row = 1; m_row <= M.mu; ++m_row) { + for(n_col = 1; n_col <= N.nu; ++n_col) { + pm = M.rhead[m_row]; + pn = N.chead[n_col]; + + e = 0; + + // M的行与N的列相乘 + while(pm && pn) { + if(pm->j < pn->i) { + pm = pm->right; + } else if(pm->j > pn->i) { + pn = pn->down; + } else { + e += pm->e * pn->e; + pm = pm->right; + pn = pn->down; + } + } + + if(e == 0) { + continue; + } + + p = (OLNode*) malloc(sizeof(OLNode)); + if(!p) { + exit(OVERFLOW); + } + + // 为结点赋值 + p->i = M.rhead[m_row]->i; + p->j = N.chead[n_col]->j; + p->e = e; + p->right = p->down = NULL; + + Q->tu++; // Q中非零元个数增一 + + if(Q->rhead[p->i] == NULL) { + Q->rhead[p->i] = p; + } else { + r->right = p; + } + + // r指向当前行新插入的结点 + r = p; + + // 在列链中寻找插入位置 + if(Q->chead[p->j] == NULL || Q->chead[p->j]->i > p->i) { + r->down = Q->chead[p->j]; + Q->chead[p->j] = r; + } else { + // 寻找插入位置的前一个位置 + for(l = Q->chead[p->j]; (l->down) && (l->down->i < p->i); l = l->down) { + } + + r->down = l->down; + l->down = r; + } + } + } + } + + return OK; +} + +/* + * 矩阵转置 + */ +Status TransposeSMatrix(CrossList M, CrossList* T) { + int i; + OLNode* p, * q, * r, * l; + + // 初始化Q的行列信息 + (*T).mu = M.nu; + (*T).nu = M.mu; + (*T).tu = M.tu; + + // 创建行链(类似行索引,0号单元弃用) + (*T).rhead = (OLink*) malloc(((*T).mu + 1) * sizeof(OLink)); + if(!(*T).rhead) { + exit(OVERFLOW); + } + + // 创建列链(类似列索引,0号单元弃用) + (*T).chead = (OLink*) malloc(((*T).nu + 1) * sizeof(OLink)); + if(!(*T).chead) { + exit(OVERFLOW); + } + + // 初始化行链索引为NULL + for(i = 0; i <= (*T).mu; ++i) { + (*T).rhead[i] = NULL; + } + + // 初始化列链索引为NULL + for(i = 0; i <= (*T).nu; ++i) { + (*T).chead[i] = NULL; + } + + // 零矩阵 + if(!(*T).tu) { + return OK; + } + + // 按列扫描 + for(i = 1; i <= M.nu; ++i) { + q = M.chead[i]; + + // 如果当前行没有元素,直接跳过 + if(q == NULL) { + continue; + } + + while(q != NULL) { + // 创建三元组结点 + p = (OLNode*) malloc(sizeof(OLNode)); + if(!p) { + exit(OVERFLOW); + } + + // 为结点赋值,行变列,列变行 + p->i = q->j; + p->j = q->i; + p->e = q->e; + p->right = p->down = NULL; + + /* + * 开始行的插入 + */ + + if((*T).rhead[p->i] == NULL) { + (*T).rhead[p->i] = p; + } else { + r->right = p; + } + + // r指向当前行新插入的结点 + r = p; + + /* + * 开始列的插入 + */ + + // 在列链中寻找插入位置 + if((*T).chead[p->j] == NULL || (*T).chead[p->j]->i > p->i) { + r->down = (*T).chead[p->j]; + (*T).chead[p->j] = r; + } else { + // 寻找插入位置的前一个位置 + for(l = (*T).chead[p->j]; (l->down) && (l->down->i < p->i); l = l->down) { + } + r->down = l->down; + l->down = r; + } + + q = q->down; + } + } + + return OK; +} + +/* + * 输出矩阵 + */ +void PrintSMatrix(CrossList M) { + int i, j; + OLNode* p; + + for(i = 1; i <= M.mu; ++i) { + p = M.rhead[i]; + for(j = 1; j <= M.nu; ++j) { + if(p && p->j == j) { + printf("%3d ", p->e); + p = p->right; + } else { + printf("%3d ", 0); + } + } + printf("\n"); + } +} diff --git a/CLion/ExerciseBook/05.27/CrossList.h b/CLion/ExerciseBook/05.27/CrossList.h new file mode 100644 index 0000000..deb950e --- /dev/null +++ b/CLion/ExerciseBook/05.27/CrossList.h @@ -0,0 +1,94 @@ +/*=================== + * 十字链表(稀疏矩阵) + * + * 包含算法: 5.4 + ====================*/ + +#ifndef CROSSLIST_H +#define CROSSLIST_H + +#include +#include // 提供malloc、realloc、free、exit原型 +#include // 提供 strstr 原型 +#include "Status.h" //**▲01 绪论**// + +/* 十字链表元素类型 */ +typedef int ElemType; + +/* 非零元类型定义 */ +typedef struct OLNode { + int i, j; // 该非零元的行下标和列下标 + ElemType e; + struct OLNode* right; // 该非零元所在的行表的后继链域 + struct OLNode* down; // 该非零元所在的列表的后继链域 +} OLNode, * OLink; + +/* 十字链表类型定义 */ +typedef struct { + OLink* rhead; // 行链表头指针 + OLink* chead; // 列链表头指针 + int mu, nu, tu; // 矩阵的行数、列数和非零元个数 +} CrossList; + + +/* + * ████████ 算法5.4 ████████ + * + * 创建稀疏矩阵M + * + * + *【备注】 + * + * 教材中默认从控制台读取数据。 + * 这里为了方便测试,避免每次运行都手动输入数据, + * 因而允许选择从预设的文件path中读取测试数据。 + * + * 如果需要从控制台读取数据,则path为NULL或者为空串, + * 如果需要从文件中读取数据,则需要在path中填写文件名信息。 + */ +Status CreateSMatrix(CrossList* M, char* path); + +/* + * 销毁稀疏矩阵 + */ +Status DestroySMatrix(CrossList* M); + +/* + * 矩阵复制 + * + * 创建一个新矩阵T,该矩阵包含了从矩阵M中包含的数据。 + */ +Status CopySMatrix(CrossList M, CrossList* T); + +/* + * 矩阵加法 + * + * Q = M + N。 + */ +Status AddSMatrix(CrossList M, CrossList N, CrossList* Q); + +/* + * 矩阵减法 + * + * Q = M - N。 + */ +Status SubSMatrix(CrossList M, CrossList N, CrossList* Q); + +/* + * 矩阵乘法 + * + * Q = M * N。 + */ +Status MultSMatrix(CrossList M, CrossList N, CrossList* Q); + +/* + * 矩阵转置 + */ +Status TransposeSMatrix(CrossList M, CrossList* T); + +/* + * 输出矩阵 + */ +void PrintSMatrix(CrossList M); + +#endif diff --git a/CLion/ExerciseBook/05.27/TestData_M.txt b/CLion/ExerciseBook/05.27/TestData_M.txt new file mode 100644 index 0000000..5d3cb45 --- /dev/null +++ b/CLion/ExerciseBook/05.27/TestData_M.txt @@ -0,0 +1,4 @@ +行数:5 +列数:5 +非零元个数:10 +三元组:(1,2,1),(1,4,5),(2,3,-3),(2,5,2),(3,1,2),(3,2,3),(3,3,4),(4,4,2),(5,1,3),(5,2,-1) \ No newline at end of file diff --git a/CLion/ExerciseBook/05.27/TestData_N.txt b/CLion/ExerciseBook/05.27/TestData_N.txt new file mode 100644 index 0000000..d567717 --- /dev/null +++ b/CLion/ExerciseBook/05.27/TestData_N.txt @@ -0,0 +1,4 @@ +行数:5 +列数:5 +非零元个数:8 +三元组:(1,1,-3)(1,3,2)(2,4,-1)(3,2,4)(4,1,6)(4,5,5)(5,1,3)(5,3,2) \ No newline at end of file diff --git a/CLion/ExerciseBook/05.28-05.29/05.28-05.29.c b/CLion/ExerciseBook/05.28-05.29/05.28-05.29.c new file mode 100644 index 0000000..7a00901 --- /dev/null +++ b/CLion/ExerciseBook/05.28-05.29/05.28-05.29.c @@ -0,0 +1,336 @@ +#include +#include "MPList.h" //**▲05 数组和广义表**// + +/* + * 求m元多项式P中第一变元的偏导函数PD。 + * + * 这里预设第一元为最外部的项 + */ +Status Algo_5_28(MPList P, MPList* PD); + +/* + * 将指数exp乘到多项式P的原子结点的系数上 + */ +static void HandleExp(MPList P, int exp); + +/* + * 多项式加法:R = P + Q + */ +Status Algo_5_29(MPList P, MPList Q, MPList* R); + +/* + * 对非空的对多项式P和Q相加,P和Q指向的是各元列表的头结点。 + */ +static void AddMpList(MPList P, MPList Q, MPList* R); + +/* + * 视需求创建一个新结点。 + * 如果tp不为NULL,为原子结点添加一个头结点,否则,为子表结点添加头结点。 + * 变量v作为所创建的头结点的元标记 + */ +static MPList VirtualNode(int v, MPList tp, MPList hp); + + +int main(int argc, char* argv[]) { + MPList P, Q; + MPList PD, QD; + MPList R; + char *p = "z((3,y((1,x((3, 1))))),(2,y((2,1))),(0,3))"; + char *q = "z((4,1),(3,y((1,x((3,-1))))),(2,x((1,1))),(0,y((1,1),(0,4))))"; + + printf("创建三元多项式...\n"); + CreateMPList(&P, p, "zyx"); + printf("P = "); + PrintGraph(P); + CreateMPList(&Q, q, "zyx"); + printf("Q = "); + PrintGraph(Q); + + // 求第一元的偏导数 + printf("P' = "); + Algo_5_28(P, &PD); + PrintGraph(PD); + printf("Q' = "); + Algo_5_28(Q, &QD); + PrintGraph(QD); + + // 多项式加法 + printf("R = "); + Algo_5_29(P, Q, &R); + PrintGraph(R); +} + + +/* + * 求m元多项式P中第一变元的偏导函数PD。 + * + * 这里预设第一元为最外部的项 + */ +Status Algo_5_28(MPList P, MPList* PD) { + MPList r, rd, s; + int count; + + if(P == NULL || PD == NULL) { + return ERROR; + } + + // 创建多项式 + *PD = (MPList) malloc(sizeof(MPNode)); + (*PD)->tag = List; + (*PD)->exp = P->exp; + (*PD)->tp = NULL; + + // 创建头结点 + (*PD)->Node.hp = (MPList) malloc(sizeof(MPNode)); + (*PD)->Node.hp->tag = P->Node.hp->tag; + (*PD)->Node.hp->exp = P->Node.hp->exp; + (*PD)->Node.hp->Node.hp = P->Node.hp->Node.hp; + + r = P->Node.hp; // 指向P的头结点 + rd = (*PD)->Node.hp; // 指向PD的头结点 + count = 0; + + // 遍历第一元的列表 + while(r->tp != NULL) { + r = r->tp; + + // 如果没有遇到"常数"结点,或者,多项式P仅有一个"常数"结点 + if(r->exp!=0 || count==0) { + rd->tp = (MPList) malloc(sizeof(MPNode)); + rd = rd->tp; + } + + /* + * 遇到"常数"结点,则求导后变为0 + * 注:"常数"结点指数为0,其排在最后 + */ + if(r->exp == 0) { + // 如果多项式P仅有一个"常数"结点 + if(count==0) { + rd->tag = Atom; + rd->exp = 0; + rd->Node.coef = 0; + } + + break; + } + + rd->tag = r->tag; + rd->exp = r->exp - 1; + + // 如果是原子结点,直接计算新系数 + if(r->tag==Atom) { + rd->Node.coef = r->Node.coef * r->exp; // 指数域系数相乘 + + // 如果是子表结点,需要将指数乘到合适的位置 + } else { + Copy(r->Node.hp, &(rd->Node.hp)); + + // 指数为1时,是没必要乘的 + if(r->exp!=1) { + // 将指数exp乘到多项式P的原子结点的系数上 + HandleExp(rd->Node.hp, r->exp); + } + } + + count++; + } + + rd->tp = NULL; + + return OK; +} + +/* + * 将指数exp乘到多项式P的原子结点的系数上 + */ +static void HandleExp(MPList P, int exp) { + MPList r; + + if(P == NULL) { + return; + } + + for(r = P->tp; r != NULL; r = r->tp) { + if(r->tag == Atom) { + r->Node.coef *= exp; + } else { + HandleExp(r->Node.hp, exp); + } + } +} + +/* + * 多项式加法:R = P + Q + */ +Status Algo_5_29(MPList P, MPList Q, MPList* R) { + MPList r; + + // 要求两个多项式的元相等 + if(P == NULL || Q == NULL || R==NULL || P->exp != Q->exp) { + return ERROR; + } + + // 创建多项式 + *R = (MPList) malloc(sizeof(MPNode)); + if(*R == NULL) { + exit(OVERFLOW); + } + (*R)->tag = List; + (*R)->exp = P->exp; // 多项式的元数量不变 + (*R)->tp = NULL; + + AddMpList(P->Node.hp, Q->Node.hp, &r); + + if(r->tp == NULL) { + r->tp = (MPList) malloc(sizeof(MPNode)); + r->tp->tag = Atom; + r->tp->exp = 0; + r->tp->Node.coef = 0.0f; + r->tp->tp = NULL; + } + + (*R)->Node.hp = r; + + return OK; +} + +/* + * 对非空的对多项式P和Q相加,P和Q指向的是各元列表的头结点。 + */ +static void AddMpList(MPList P, MPList Q, MPList* R) { + MPList p, q, h, r; + MPList t; + MPList tp; + float sum; + int a, b; + int v; + + // 如果不是同一个元 + if(P->exp!=Q->exp) { + + a = (int)(strchr(Var, P->exp)-Var); + b = (int)(strchr(Var, Q->exp)-Var); + + if(aexp, NULL, Q); + v = P->exp; + } + + if(a>b) { + P = VirtualNode(Q->exp, NULL, P); + v = Q->exp; + } + } else { + v = P->exp; + } + + // 创建头结点 + *R = (MPList) malloc(sizeof(MPNode)); + (*R)->tag = List; + (*R)->exp = v; + (*R)->Node.hp =NULL; + + h = *R; + + p = P->tp; + q = Q->tp; + + while(p!=NULL && q!=NULL){ + if(p->exp>q->exp) { + tp = p->tp; + p->tp = NULL; + Copy(p, &(h->tp)); + p->tp = tp; + p = p->tp; + h = h->tp; + } else if(p->expexp) { + tp = q->tp; + q->tp = NULL; + Copy(q, &(h->tp)); + q->tp = tp; + q = q->tp; + h = h->tp; + + // 指数相同 + } else { + sum = 0.0f; // 初始化系数和,不一定用得上 + r = NULL; + + if(p->tag==Atom && q->tag==List) { + t = VirtualNode(q->Node.hp->exp, p, NULL); + tp = p->tp; + p->tp = NULL; + AddMpList(t, q->Node.hp, &r); + p->tp = tp; + } else if(p->tag==List && q->tag==Atom) { + t = VirtualNode(p->Node.hp->exp, q, NULL); + tp = q->tp; + q->tp = NULL; + AddMpList(p->Node.hp, t, &r); + q->tp = tp; + + // 都是子表 + } else if(p->tag==List && q->tag==List) { + AddMpList(p->Node.hp, q->Node.hp, &r); + + // 都是原子的话,可以直接相加 + } else if(p->tag==Atom && q->tag==Atom) { + sum = p->Node.coef + q->Node.coef; + } + + if(sum!=0.0f || (r!=NULL && r->tp!=NULL)) { + h->tp = (MPList) malloc(sizeof(MPNode)); + h = h->tp; + h->exp = p->exp; + + if(sum!=0.0f) { + h->tag = Atom; + h->Node.coef = sum; + } else { + h->tag = List; + h->Node.hp = r; + } + } + + p = p->tp; + q = q->tp; + } + } + + h->tp = NULL; + + if(p!=NULL){ + Copy(p, &(h->tp)); + } + + if(q!=NULL){ + Copy(q, &(h->tp)); + } +} + +/* + * 视需求创建一个新结点。 + * 如果tp不为NULL,为原子结点添加一个头结点,否则,为子表结点添加头结点。 + * 变量v作为所创建的头结点的元标记 + */ +static MPList VirtualNode(int v, MPList tp, MPList hp){ + MPList P; + + P = (MPList) malloc(sizeof(MPNode)); + P->tag = List; + P->exp = v; + P->Node.hp = NULL; + + if(tp!=NULL) { + P->tp = tp; + } else { + P->tp = (MPList) malloc(sizeof(MPNode)); + P->tp->exp = 0; + P->tp->tag = List; + P->tp->Node.hp = hp; + P->tp->tp = NULL; + } + + return P; +} diff --git a/CLion/ExerciseBook/05.28-05.29/CMakeLists.txt b/CLion/ExerciseBook/05.28-05.29/CMakeLists.txt new file mode 100644 index 0000000..20db9a4 --- /dev/null +++ b/CLion/ExerciseBook/05.28-05.29/CMakeLists.txt @@ -0,0 +1,7 @@ +# 包含公共库 +include_directories(${CMAKE_SOURCE_DIR}/Status) + +# 生成可执行文件 +add_executable(05.28-05.29 StringUtil.h StringUtil.c MPList.h MPList.c 05.28-05.29.c) +# 链接公共库 +target_link_libraries(05.28-05.29 Scanf_lib) \ No newline at end of file diff --git a/CLion/ExerciseBook/05.28-05.29/MPList.c b/CLion/ExerciseBook/05.28-05.29/MPList.c new file mode 100644 index 0000000..bccdc6b --- /dev/null +++ b/CLion/ExerciseBook/05.28-05.29/MPList.c @@ -0,0 +1,233 @@ +/*========== + * m元多项式 + ===========*/ + +#include "MPList.h" + +// 参见头文件中的声明 +char Var[27]; + +/* + * 创建 + * + * 由字符串S创建m元多项P。 + * 不会校验S是否书写正确。 + * + * P : 待建的多项式 + * S : 多项式字符串 + * vars: 变量列表,从第一元开始排列,比如xyz代表三元多项式中的未知数标记 + */ +Status CreateMPList(MPList* P, char* S, char* vars) { + if(P == NULL) { + return ERROR; + } + + // 清理字符串S中的空白,包括清理不可打印字符和清理空格 + ClearBlank(&S); + + if(strlen(S) == 0) { + *P = NULL; + return ERROR; + } + + // 初始化元信息 + strcpy(Var, vars); + + *P = (MPList) malloc(sizeof(MPNode)); + if(*P == NULL) { + exit(OVERFLOW); + } + + (*P)->tag = List; + (*P)->exp = (int) strlen(vars); + (*P)->tp = NULL; + + Create(&(*P)->Node.hp, S); + + return OK; +} + +/* + * m元多项式创建函数 + */ +static Status Create(MPList* P, char* S) { + char* Sc; + char* hhstr, * hstr, * str; + char* sub; + MPList r; + float f; + + // 获取S的一个副本 + SubString(&Sc, S, 1, (int) strlen(S)); + + *P = (MPList) malloc(sizeof(MPNode)); + if(*P == NULL) { + exit(OVERFLOW); + } + + (*P)->tag = List; + (*P)->exp = (int) Sc[0]; // 记下未知数标记,例如x、y、z + (*P)->Node.hp = NULL; + (*P)->tp = NULL; + + StrDelete(&Sc, 1, 1); // 删掉未知数标记 + SubString(&str, Sc, 2, (int) strlen(Sc) - 2); // 脱去最外层括号 + + r = *P; + + while(!StrEmpty(str)) { + // 拆分 + sever(&hstr, &str); + + SubString(&sub, hstr, 2, (int) strlen(hstr) - 2); // 脱去最外层括号 + sever(&hhstr, &sub); + + // 建立子结点 + r->tp = (MPList) malloc(sizeof(MPNode)); + if(r->tp == NULL) { + exit(OVERFLOW); + } + GetElem(hhstr, 1, &f); + r->tp->exp = (int) f; // 获取指数 + r->tp->tp = NULL; + + if(ElemCount(sub) == 1) { + r->tp->tag = Atom; + GetElem(sub, 1, &f); + r->tp->Node.coef = f; + } else { + r->tp->tag = List; + Create(&(r->tp->Node.hp), sub); + } + + r = r->tp; + } + + return OK; +} + +/* + * 图形化输出 + * + * 带括号输出m元多项P。 + */ +void PrintGraph(MPList P) { + if(P == NULL) { + printf("\n"); + return; + } + Print(P->Node.hp); + printf("\n"); +} + +/* + * 图形化输出的内部实现 + */ +static void Print(MPList head) { + MPList p; + + if(head == NULL) { + return; + } + + printf("%c(", head->exp); + + p = head->tp; + + while(p != NULL) { + printf("(%d,", p->exp); + + if(p->tag == List) { + Print(p->Node.hp); + } else { + printf("%.2f", p->Node.coef); + } + + printf(")"); + + p = p->tp; + + if(p != NULL) { + printf(","); + } + } + + printf(")"); +} + +/* + * 将非空串str分割成两部分:hsub为第一个','之前的子串,str为第一个','之后的子串。 + * + *【注】 + * 1.这里假设字符串str输入正确,其中无空白符号,且str【已经脱去最外层括号】。 + * 2.分离完成后,str也会发生变化 + */ +static void sever(char** hstr, char** str) { + int i, k, n; + + char* head, * tail; + + // str为空时,hstr也为空 + if(strlen(*str) == 0) { + *hstr = NULL; + return; + } + + n = (int) strlen(*str); + + i = 0; // 遍历字符串时的游标 + k = 0; // 标记遇到的未配对括号数量 + + do { + if((*str)[i] == '(') { + ++k; + } + + if((*str)[i] == ')') { + --k; + } + + i++; + } while(i < n && ((*str)[i] != ',' || k != 0)); + + if(i < n) { + head = (char*) malloc((i + 1) * sizeof(char)); + tail = (char*) malloc((n - i - 1 + 1) * sizeof(char)); + + strncpy(head, *str, i); + head[i] = '\0'; + + strncpy(tail, (*str + i + 1), n - i - 1); + tail[n - i - 1] = '\0'; + } else { + head = *str; + tail = (char*) malloc(sizeof(char)); + tail[0] = '\0'; + } + + *hstr = head; + *str = tail; +} + + +/* + * 复制多项式,从P复制到Q + */ +void Copy(MPList P, MPList* Q) { + if(P == NULL) { + *Q = NULL; + return; + } + + *Q = (MPList) malloc(sizeof(MPNode)); + (*Q)->tag = P->tag; + (*Q)->exp = P->exp; + + if(P->tag == List) { + Copy(P->Node.hp, &((*Q)->Node.hp)); + } else { + (*Q)->Node.coef = P->Node.coef; + } + + Copy(P->tp, &((*Q)->tp)); +} diff --git a/CLion/ExerciseBook/05.28-05.29/MPList.h b/CLion/ExerciseBook/05.28-05.29/MPList.h new file mode 100644 index 0000000..1ca2056 --- /dev/null +++ b/CLion/ExerciseBook/05.28-05.29/MPList.h @@ -0,0 +1,97 @@ +/*========== + * m元多项式 + ===========*/ + +#ifndef MPLIST_H +#define MPLIST_H + +#include +#include // 提供 malloc、realloc、free、exit 原型 +#include // 提供 strlen 原型 +#include "Status.h" //**▲01 绪论**// +#include "StringUtil.h" //**字符串工具类**// + +/* + * ████ 提示 ████ + * + * 1.对于多元函数,约定第一元位于最外层。 + * 2.未知数标记默认为a~z或A~Z这26个字母 + * 3.约定多项式的每个元其指数是【递减】的,如3、2、1 + */ + + +/* + * 储存当前多项式的遍历信息,如x、y、z等 + * 约定var中的字符顺序即位各元的次序,如: + * "zyx"指示z为第一元,y为第二元,x为第三元 + */ +extern char Var[27]; + +/* + * m元多项式结点标记 + * + * Atom-0:原子结点 + * List-1:表结点 + */ +typedef enum { Atom, List } ElemTag; + +/* m元多项式元素结点 */ +typedef struct MPNode { + ElemTag tag; // 区分原子结点和表结点 + int exp; // 指数域,对于头结点,存储未知数标记,如x、y、z等 + union { + float coef; // 系数域 + struct MPNode* hp; // 表结点的表头指针 + } Node; + struct MPNode* tp; // 相当于线性链表的next,指向下一个元素结点 +} MPNode; + +/* m元多项式广义表类型 */ +typedef MPNode* MPList; + + +/* + * 创建 + * + * 由字符串S创建m元多项P。 + * 不会校验S是否书写正确。 + * + * P : 待建的多项式 + * S : 多项式字符串 + * vars: 变量列表,从第一元开始排列,比如xyz代表三元多项式中的未知数标记 + */ +Status CreateMPList(MPList* P, char* S, char* vars); + +/* + * m元多项式创建函数 + */ +static Status Create(MPList* P, char* S); + +/* + * 图形化输出 + * + * 带括号输出m元多项P。 + */ +void PrintGraph(MPList P); + +/* + * 图形化输出的内部实现 + */ +static void Print(MPList P); + +/* + * 将非空串str分割成两部分:hsub为第一个','之前的子串,str为第一个','之后的子串。 + * + *【注】 + * 1.这里假设字符串str输入正确,其中无空白符号,且str【已经脱去最外层括号】。 + * 2.分离完成后,str也会发生变化 + */ +static void sever(char** hstr, char** str); + + +/* + * 复制多项式 + */ +void Copy(MPList P, MPList* Q); + +#endif diff --git a/CLion/ExerciseBook/05.28-05.29/StringUtil.c b/CLion/ExerciseBook/05.28-05.29/StringUtil.c new file mode 100644 index 0000000..d0981b8 --- /dev/null +++ b/CLion/ExerciseBook/05.28-05.29/StringUtil.c @@ -0,0 +1,160 @@ +/*================ + * 字符串操作工具类 + =================*/ + +#include "StringUtil.h" + +/* + * 删除 + * + * 删除s[pos, pos+len-1],pos从1开始计数。 + */ +Status StrDelete(char** s, int pos, int n) { + int len; + char* ss; + + len = (int) strlen(*s); + + if(pos < 1 || pos + n - 1 > len || n < 0) { + return ERROR; + } + + // 如果待删除的长度为0,则提前返回 + if(n == 0) { + return ERROR; + } + + ss = (char*) malloc((len - n + 1) * sizeof(char)); + + strncpy(ss, *s, pos - 1); + strncpy(ss, *s + pos + n - 1, len - pos - n + 1); + + ss[len - n] = '\0'; + + *s = ss; + + return OK; +} + +/* + * 求子串 + * + * 用sub返回s[pos, pos+len-1],pos从1开始计数。 + */ +Status SubString(char** sub, char* s, int pos, int n) { + int len, i; + + len = (int) strlen(s); + + if(pos < 1 || pos > len || n < 0 || pos + n - 1 > len) { + *sub = NULL; + return ERROR; + } + + *sub = (char*) malloc((n + 1) * sizeof(char)); + + for(i = 0; i < n; i++) { + (*sub)[i] = s[pos + i - 1]; + } + + // 确定新长度 + (*sub)[n] = '\0'; + + return OK; +} + +/* + * 判空 + * + * 判断串s中是否包含有效数据。 + */ +Status StrEmpty(char* s) { + return strlen(s) == 0 ? TRUE : FALSE; +} + +/* + * 整理 + * + * 清理字符串s中的空白,包括清理不可打印字符和清理空格。 + */ +Status ClearBlank(char** s) { + int len; + int i, j; + char* ss; + + len = (int) strlen(*s); + if(len == 0) { + return ERROR; + } + + ss = (char*) malloc((len + 1) * sizeof(char)); + + for(i = 0, j = 0; i < len; i++) { + // 如果遇到空白,则略过 + if((*s)[i] == ' ' || !isprint((*s)[i])) { + continue; + } + + ss[j++] = (*s)[i]; + } + + ss[j] = '\0'; + + *s = ss; + + return OK; +} + +/* + * 计数 + * + * 统计字符串s中的元素个数。 + * 这里的特殊之处在于:对于数字,会将其当成一个元素。 + */ +int ElemCount(const char* s) { + int count; + float f; + char c; + char* sub; + + if(s==NULL || strlen(s) == 0) { + return 0; + } + + sub = (char*) malloc((strlen(s) + 1) * sizeof(char)); + sub[0] = '\0'; + + // 如果遇到了数字 + if(sscanf(s, "%f", &f) == 1) { + sscanf(s, "%f%s", &f, sub); + } else { + sscanf(s, "%c%s", &c, sub); + } + + count = ElemCount(sub); + + return 1 + count; +} + +/* + * 取值 + * + * 获取字符串s中第pos个元素(pos从1开始计数),并用f接收。 + * 这里的特殊之处在于:对于数字,会将其当成一个元素。 + */ +Status GetElem(char* s, int pos, float* f) { + int len; + + len = (int) strlen(s); + + if(pos < 1 || pos > len) { + return ERROR; + } + + // 先尝试读数字,读取失败的话,再尝试读字符 + if(sscanf(s + pos - 1, "%f", f) < 1) { + *f = s[pos - 1]; + } + + return OK; +} diff --git a/CLion/ExerciseBook/05.28-05.29/StringUtil.h b/CLion/ExerciseBook/05.28-05.29/StringUtil.h new file mode 100644 index 0000000..4d3cc7c --- /dev/null +++ b/CLion/ExerciseBook/05.28-05.29/StringUtil.h @@ -0,0 +1,58 @@ +/*================ + * 字符串操作工具类 + =================*/ + +#ifndef STRINGUTIL_H +#define STRINGUTIL_H + +#include +#include // 提供 malloc 原型 +#include // 提供 strlen、strncpy 原型 +#include // 提供 isprint 原型 +#include "Status.h" //**▲01 绪论**// + +/* + * 删除 + * + * 删除s[pos, pos+len-1],pos从1开始计数。 + */ +Status StrDelete(char** S, int pos, int n); + +/* + * 求子串 + * + * 用sub返回s[pos, pos+len-1],pos从1开始计数。 + */ +Status SubString(char** sub, char* s, int pos, int len); + +/* + * 判空 + * + * 判断串s中是否包含有效数据。 + */ +Status StrEmpty(char* s); + +/* + * 整理 + * + * 清理字符串s中的空白,包括清理不可打印字符和清理空格。 + */ +Status ClearBlank(char** s); + +/* + * 计数 + * + * 统计字符串s中的元素个数。 + * 这里的特殊之处在于:对于数字,会将其当成一个元素。 + */ +int ElemCount(const char* s); + +/* + * 取值 + * + * 获取字符串s中第pos个元素(pos从1开始计数),并用f接收。 + * 这里的特殊之处在于:对于数字,会将其当成一个元素。 + */ +Status GetElem(char* s, int pos, float *f); + +#endif diff --git a/CLion/ExerciseBook/05.30.1/05.30.1.c b/CLion/ExerciseBook/05.30.1/05.30.1.c new file mode 100644 index 0000000..527fc7b --- /dev/null +++ b/CLion/ExerciseBook/05.30.1/05.30.1.c @@ -0,0 +1,42 @@ +#include +#include "SString.h" //**▲04 串**// +#include "GList-HT.h" //**▲05 数组和广义表**// + +// 求广义表深度(头尾链表存储表示) +int Algo_5_30_1(GList L); + + +int main(int argc, char* argv[]) { + GList L; + char* s = "((),(e),(a,(b,c,d)))"; + SString S; + + printf("创建广义表 L ...\n"); + StrAssign(S, s); + CreateGList(&L, S); + printf("L = "); + PrintGraph(L); + + printf("广义表深度为: %d\n", Algo_5_30_1(L)); + + return 0; +} + + +// 求广义表深度(头尾链表存储表示) +int Algo_5_30_1(GList L) { + int m, n; + + if(L==NULL) { + return 1; // 空表深度为1 + } + + if(L->tag == Atom) { + return 0; // 原子深度为0 + } + + m = Algo_5_30_1(L->Node.ptr.hp) + 1; + n = Algo_5_30_1(L->Node.ptr.tp); + + return m > n ? m : n; +} diff --git a/CLion/ExerciseBook/05.30.1/CMakeLists.txt b/CLion/ExerciseBook/05.30.1/CMakeLists.txt new file mode 100644 index 0000000..0a489b4 --- /dev/null +++ b/CLion/ExerciseBook/05.30.1/CMakeLists.txt @@ -0,0 +1,7 @@ +# 包含公共库 +include_directories(${CMAKE_SOURCE_DIR}/Status) + +# 生成可执行文件 +add_executable(05.30.1 SString.h SString.c GList-HT.h GList-HT.c 05.30.1.c) +# 链接公共库 +target_link_libraries(05.30.1 Scanf_lib) \ No newline at end of file diff --git a/CLion/ExerciseBook/05.30.1/GList-HT.c b/CLion/ExerciseBook/05.30.1/GList-HT.c new file mode 100644 index 0000000..ddf2766 --- /dev/null +++ b/CLion/ExerciseBook/05.30.1/GList-HT.c @@ -0,0 +1,418 @@ +/*============================ + * 广义表的头尾链表存储表示 + * + * 包含算法: 5.5、5.6、5.7、5.8 + =============================*/ + +#include "GList-HT.h" //**▲05 数组和广义表**// + +/* + * 初始化 + * + * 初始化空的广义表,长度为0,深度为1。 + * + *【注】 + * 需要对每一层去掉括号考察 + */ +Status InitGList(GList* L) { + if(L == NULL) { + return ERROR; + } + + *L = NULL; + + return OK; +} + +/* + * ████████ 算法5.7 ████████ + * + * 创建 + * + * 由字符串S创建广义表L。 + */ +Status CreateGList(GList* L, SString S) { + SString emp; // 代表空广义表的字符串 + SString hsub, sub; + GList p, q; + + if(L == NULL) { + return ERROR; + } + + // 清理字符串S中的空白,包括清理不可打印字符和清理空格 + ClearBlank(S); + + if(StrEmpty(S)) { + return ERROR; + } + + StrAssign(emp, "()"); + + /* + * 如果输入串为(),则代表需要创建空的广义表 + * + *【注】 + * 教材这里的代码是有问题的。 + * StrCompare的返回值指示的是两个字符串的大小,而不是指示两个字符串是否相等。 + * 如果给定的S与()相等,返回值应当是0。 + */ + if(!StrCompare(S, emp)) { + *L = NULL; + } else { + *L = (GList) malloc(sizeof(GLNode)); + if(*L == NULL) { + exit(OVERFLOW); + } + + // 创建原子 + if(StrLength(S) == 1) { + (*L)->tag = Atom; + (*L)->Node.atom = S[1]; + } else { + (*L)->tag = List; + + p = *L; + + // 去掉最外层括号 + SubString(sub, S, 2, StrLength(S) - 2); + + // 重复建n个子表 + do { + // 从sub中分离出表头串hsub,分离完成后,sub也会发生变化 + sever(hsub, sub); + + // 递归创建广义表 + CreateGList(&(p->Node.ptr.hp), hsub); + + q = p; + + // 如果表尾不为空,需要继续处理表尾 + if(!StrEmpty(sub)) { + p = (GList) malloc(sizeof(GLNode)); + if(p == NULL) { + exit(OVERFLOW); + } + + p->tag = List; + + q->Node.ptr.tp = p; + } + } while(!StrEmpty(sub)); + + q->Node.ptr.tp = NULL; + } + } + + return OK; +} + +/* + * 销毁 + * + * 释放广义表所占内存。 + */ +Status DestroyGList(GList* L) { + GList head, tail; + + if(L == NULL || *L == NULL) { + return ERROR; + } + + // 删除原子结点 + if((*L)->tag == Atom) { + free(*L); + *L = NULL; + + // 删除子表结点 + } else { + head = (*L)->Node.ptr.hp; + tail = (*L)->Node.ptr.tp; + free(*L); + *L = NULL; + DestroyGList(&head); + DestroyGList(&tail); + } + + return OK; +} + +/* + * ████████ 算法5.6 ████████ + * + * 复制 + * + * 由广义表L复制得到广义表T。 + */ +Status CopyGList(GList* T, GList L) { + if(T == NULL) { + return ERROR; + } + + if(L == NULL) { + *T = NULL; + } else { + // 新建广义表结点 + *T = (GList) malloc(sizeof(GLNode)); + if(*T == NULL) { + exit(OVERFLOW); + } + + (*T)->tag = L->tag; + + // 复制单原子 + if(L->tag == Atom) { + (*T)->Node.atom = L->Node.atom; + + // 复制表头和表尾 + } else { + CopyGList(&((*T)->Node.ptr.hp), L->Node.ptr.hp); + CopyGList(&((*T)->Node.ptr.tp), L->Node.ptr.tp); + } + } + + return OK; +} + +/* + * 计数 + * + * 返回广义表的长度。 + */ +int GListLength(GList L) { + int count; + + for(count = 0; L != NULL; count++, L = L->Node.ptr.tp) { + } + + return count; +} + +/* + * ████████ 算法5.5 ████████ + * + * 深度 + * + * 返回广义表的深度 + */ +int GListDepth(GList L) { + int max, deep; + GList p; + + // 空表深度为1 + if(L == NULL) { + return 1; + } + + // 原子深度为0 + if(L->tag == Atom) { + return 0; + } + + // 递归求子表深度 + for(max = 0, p = L; p != NULL; p = p->Node.ptr.tp) { + deep = GListDepth(p->Node.ptr.hp); + if(deep > max) { + max = deep; + } + } + + // 非空表的深度是各子元素最大深度加一 + return max + 1; +} + +/* + * 判空 + * + * 判断广义表是否为空。 + */ +Status GListEmpty(GList L) { + return L == NULL ? TRUE : FALSE; +} + +/* + * 表头 + */ +GList GetHead(GList L) { + GList p; + + // 空表无表头,这里不能返回NULL,不然分不清是失败了还是返回了空表 + if(L == NULL) { + exit(ERROR); + } + + CopyGList(&p, L->Node.ptr.hp); + + return p; +} + +/* + * 表尾 + */ +GList GetTail(GList L) { + GList p; + + // 空表无表尾,这里不能返回NULL,不然分不清是失败了还是返回了空表 + if(L == NULL) { + exit(ERROR); + } + + CopyGList(&p, L->Node.ptr.tp); + + return p; +} + +/* + * 插入 + * + * 将元素e插入为广义表L的第一个元素。 + */ +Status InsertFirst(GList* L, GList e) { + GList g; + + if(L == NULL) { + return ERROR; + } + + g = (GList) malloc(sizeof(GLNode)); + if(g == NULL) { + exit(OVERFLOW); + } + + g->tag = List; + g->Node.ptr.hp = e; + g->Node.ptr.tp = *L; + *L = g; + + return OK; +} + +/* + * 删除 + * + * 将广义表L的第一个元素删除,并用e返回。 + */ +Status DeleteFirst(GList* L, GList* e) { + GList p; + + // 空表无法删除 + if(L == NULL || *L == NULL) { + return ERROR; + } + + p = *L; + *L = (*L)->Node.ptr.tp; + + CopyGList(e, p->Node.ptr.hp); + + free(p); + + return OK; +} + +/* + * 遍历 + * + * 用visit函数访问广义表L。 + */ +void Traverse(GList L, void(Visit)(AtomType)) { + + if(L == NULL) { + return; + } + + if(L->tag == Atom) { + Visit(L->Node.atom); + } else { + Traverse(L->Node.ptr.hp, Visit); + Traverse(L->Node.ptr.tp, Visit); + } + +} + +/* + * 图形化输出 + * + * 带括号输出广义表L。 + */ +void PrintGraph(GList L) { + Print(L, Head); + printf("\n"); +} + +/* + * 图形化输出的内部实现,mark是图形化输出标记。 + */ +static void Print(GList L, Mark mark) { + // L为空 + if(L == NULL) { + if(mark == Head) { + printf("("); + } + + printf(")"); + + // L不为空时 + } else { + // 对于原子结点,输出原子 + if(L->tag == Atom) { + printf("%c", L->Node.atom); + + // 对于子表结点,要对表头、表尾分别讨论 + } else { + if(mark == Head) { + printf("("); + } else { + printf(","); + } + + Print(L->Node.ptr.hp, Head); + Print(L->Node.ptr.tp, Tail); + } + } +} + +/* + * ████████ 算法5.8 ████████ + * + * 将非空串str分割成两部分:hsub为第一个','之前的子串,str为第一个','之后的子串。 + * + *【注】 + * 1.这里假设字符串str输入正确,其中无空白符号,且str【已经脱去最外层括号】。 + * 2.分离完成后,str也会发生变化 + */ +static void sever(SString hstr, SString str) { + int i, k, n; + SString ch; + + n = StrLength(str); + + i = 0; // 遍历字符串时的游标 + k = 0; // 标记遇到的未配对括号数量 + + do { + ++i; + + // 截取str第一个字符 + SubString(ch, str, i, 1); + + if(ch[1] == '(') { + ++k; + } + + if(ch[1] == ')') { + --k; + } + } while(i < n && (ch[1] != ',' || k != 0)); + + // 如果存在多个广义表结点 + if(i < n) { + SubString(hstr, str, 1, i - 1); + SubString(str, str, i + 1, n - i); + + // 只有一个广义表结点 + } else { + StrCopy(hstr, str); + ClearString(str); + } +} diff --git a/CLion/ExerciseBook/05.30.1/GList-HT.h b/CLion/ExerciseBook/05.30.1/GList-HT.h new file mode 100644 index 0000000..07c0df2 --- /dev/null +++ b/CLion/ExerciseBook/05.30.1/GList-HT.h @@ -0,0 +1,164 @@ +/*============================ + * 广义表的头尾链表存储表示 + * + * 包含算法: 5.5、5.6、5.7、5.8 + =============================*/ + +#ifndef GLIST_HT_H +#define GLIST_HT_H + +#include +#include // 提供 malloc、realloc、free、exit 原型 +#include "Status.h" //**▲01 绪论**// +#include "SString.h" //**▲04 串**// + +/* 原子元素类型 */ +typedef char AtomType; + +/* + * 广义表结点标记 + * + * Atom-0:原子结点 + * List-1:表结点 + */ +typedef enum { Atom, List } ElemTag; + +/* 广义表(头尾链表存储表示)类型定义 */ +typedef struct GLNode { + ElemTag tag; // 公共标记,用于区分原子结点和表结点 + + // 原子结点和表结点的联合部分 + union { + AtomType atom; // atom是原子结点的值域,AtomType由用户定义 + struct { + struct GLNode* hp; // 指向表头 + struct GLNode* tp; // 指向表尾 + } ptr; // 表结点的指针域 + } Node; +} GLNode; + +/* 广义表类型 */ +typedef GLNode* GList; + +/* + * 图形化输出标记 + * + * Head代表广义表指针来自表头 + * Tail代表广义表指针来自表尾 + */ +typedef enum { Head, Tail } Mark; + + +/* + * 初始化 + * + * 初始化空的广义表,长度为0,深度为1。 + * + *【注】 + * 需要对每一层去掉括号考察 + */ +Status InitGList(GList* L); + +/* + * ████████ 算法5.7 ████████ + * + * 创建 + * + * 由字符串S创建广义表L。 + */ +Status CreateGList(GList* L, SString S); + +/* + * 销毁 + * + * 释放广义表所占内存。 + */ +Status DestroyGList(GList* L); + +/* + * ████████ 算法5.6 ████████ + * + * 复制 + * + * 由广义表L复制得到广义表T。 + */ +Status CopyGList(GList* T, GList L); + +/* + * 计数 + * + * 返回广义表的长度。 + */ +int GListLength(GList L); + +/* + * ████████ 算法5.5 ████████ + * + * 深度 + * + * 返回广义表的深度 + */ +int GListDepth(GList L); + +/* + * 判空 + * + * 判断广义表是否为空。 + */ +Status GListEmpty(GList L); + +/* + * 表头 + */ +GList GetHead(GList L); + +/* + * 表尾 + */ +GList GetTail(GList L); + +/* + * 插入 + * + * 将元素e插入为广义表L的第一个元素。 + */ +Status InsertFirst(GList* L, GList e); + +/* + * 删除 + * + * 将广义表L的第一个元素删除,并用e返回。 + */ +Status DeleteFirst(GList* L, GList* e); + +/* + * 遍历 + * + * 用visit函数访问广义表L。 + */ +void Traverse(GList L, void (Visit)(AtomType)); + +/* + * 图形化输出 + * + * 带括号输出广义表L。 + */ +void PrintGraph(GList L); + +/* + * 图形化输出的内部实现,mark是图形化输出标记。 + */ +static void Print(GList L, Mark mark); + +/* + * ████████ 算法5.8 ████████ + * + * 将非空串str分割成两部分:hsub为第一个','之前的子串,str为第一个','之后的子串。 + * + *【注】 + * 1.这里假设字符串str输入正确,其中无空白符号,且str【已经脱去最外层括号】。 + * 2.分离完成后,str也会发生变化 + */ +static void sever(SString hstr, SString str); + +#endif diff --git a/CLion/ExerciseBook/05.30.1/SString.c b/CLion/ExerciseBook/05.30.1/SString.c new file mode 100644 index 0000000..41d9e15 --- /dev/null +++ b/CLion/ExerciseBook/05.30.1/SString.c @@ -0,0 +1,195 @@ +/*============================= + * 串的定长顺序存储表示(顺序串) + * + * 包含算法: 4.1、4.2、4.3、4.5 + ==============================*/ + +#include "SString.h" //**▲04 串**// + +/* + * 初始化 + * + * 构造一个值为chars的串T。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status StrAssign(SString T, const char* chars) { + int i, len; + + len = (int) strlen(chars); + + // chars过长 + if(len > MAXSTRLEN) { + return ERROR; + } + + T[0] = len; + for(i = 1; i <= len; i++) { + T[i] = chars[i - 1]; + } + + return OK; +} + +/* + * 清空 + * + * 将串S清空。 + */ +Status ClearString(SString S) { + // 只需要将长度置为0就可以 + S[0] = 0; + return OK; +} + +/* + * 判空 + * + * 判断串S中是否包含有效数据。 + * + * 返回值: + * TRUE : 串S为空 + * FALSE: 串S不为空 + */ +Status StrEmpty(SString S) { + return S[0] == 0 ? TRUE : FALSE; +} + +/* + * 计数 + * + * 返回串S中元素的个数。 + * + *【注】 + * 该操作属于最小操作子集 + */ +int StrLength(SString S) { + return S[0]; +} + +/* + * ████████ 算法4.3 ████████ + * + * 求子串 + * + * 用Sub返回S[pos, pos+len-1]。 + * 返回值指示是否截取成功。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status SubString(SString Sub, SString S, int pos, int len) { + int i; + + if(pos < 1 || pos > S[0] || len < 0 || pos + len - 1 > S[0]) { + return ERROR; + } + + // 复制元素 + for(i = 1; i <= len; i++) { + Sub[i] = S[pos + i - 1]; + } + + // 确定新长度 + Sub[0] = len; + + return OK; +} + +/* + * 删除 + * + * 删除S[pos, pos+len-1]。 + */ +Status StrDelete(SString S, int pos, int len) { + int i; + + if(pos < 1 || pos + len - 1 > S[0] || len < 0) { + return ERROR; + } + + // 如果待删除的长度为0,则提前返回 + if(len == 0) { + return OK; + } + + // 把后面的元素挪到前面,覆盖掉被删除的元素 + for(i = pos + len; i <= S[0]; i++) { + S[i - len] = S[i]; + } + + // 长度减少 + S[0] -= len; + + return OK; +} + +/* + * 比较 + * + * 比较串S和串T,返回比较结果。 + * + *【注】 + * 该操作属于最小操作子集 + */ +int StrCompare(SString S, SString T) { + int i = 1; + + while(i <= S[0] && i <= T[0]) { + // 遇到不同的字符时,比较其大小 + if(S[i] != T[i]) { + return S[i] - T[i]; + } + + i++; + } + + return S[0] - T[0]; +} + +/* + * 复制 + * + * 将串S复制到串T。 + */ +Status StrCopy(SString T, SString S) { + int i; + + // 连同长度信息一起复制 + for(i = 0; i <= S[0]; i++) { + T[i] = S[i]; + } + + return OK; +} + +/* + * 清理字符串S中的空白,包括清理不可打印字符和清理空格。 + * + *【注】 + * 该函数是在本章中新增的。 + */ +Status ClearBlank(SString S) { + int i, j; + + // 如果是空串 + if(S[0] == 0) { + return ERROR; + } + + for(i = 1, j = 0; i <= S[0]; i++) { + // 如果遇到空白,则略过 + if(S[i] == ' ' || !isprint(S[i])) { + continue; + } + + j++; + + S[j] = S[i]; + } + + S[0] = j; + + return OK; +} diff --git a/CLion/ExerciseBook/05.30.1/SString.h b/CLion/ExerciseBook/05.30.1/SString.h new file mode 100644 index 0000000..e81ca79 --- /dev/null +++ b/CLion/ExerciseBook/05.30.1/SString.h @@ -0,0 +1,117 @@ +/*============================= + * 串的定长顺序存储表示(顺序串) + * + * 包含算法: 4.1、4.2、4.3、4.5 + ==============================*/ + +#ifndef SSTRING_H +#define SSTRING_H + +#include +#include // 提供 strlen 原型 +#include // 提供 isprint 原型 +#include "Status.h" //**▲01 绪论**// + +/* 宏定义 */ +#define MAXSTRLEN 255 // 顺序串的最大串长 + +/* + * 串的顺序存储类型定义 + * + * 注:有效元素从SString的1号单元开始存储 + * SString的0号单元用来存储其长度 + */ +typedef unsigned char SString[MAXSTRLEN + 1]; // 0号单元存放串的长度 + + +/* + * ████ 提示 ████ + * + * 遵循教材的书写习惯,pos指示字符的位序(不是索引),从1开始计数 + */ + + +/* + * 初始化 + * + * 构造一个值为chars的串T。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status StrAssign(SString T, const char* chars); + +/* + * 清空 + * + * 将串S清空。 + */ +Status ClearString(SString S); + +/* + * 判空 + * + * 判断串S中是否包含有效数据。 + * + * 返回值: + * TRUE : 串S为空 + * FALSE: 串S不为空 + */ +Status StrEmpty(SString S); + +/* + * 计数 + * + * 返回串S中元素的个数。 + * + *【注】 + * 该操作属于最小操作子集 + */ +int StrLength(SString S); + +/* + * ████████ 算法4.3 ████████ + * + * 求子串 + * + * 用Sub返回S[pos, pos+len-1]。 + * 返回值指示是否截取成功。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status SubString(SString Sub, SString S, int pos, int len); + +/* + * 删除 + * + * 删除S[pos, pos+len-1]。 + */ +Status StrDelete(SString S, int pos, int len); + +/* + * 比较 + * + * 比较串S和串T,返回比较结果。 + * + *【注】 + * 该操作属于最小操作子集 + */ +int StrCompare(SString S, SString T); + +/* + * 复制 + * + * 将串S复制到串T。 + */ +Status StrCopy(SString T, SString S); + +/* + * 清理字符串S中的空白,包括清理不可打印字符和清理空格。 + * + *【注】 + * 该函数是在本章中新增的。 + */ +Status ClearBlank(SString S); + +#endif diff --git a/CLion/ExerciseBook/05.30.2/05.30.2.c b/CLion/ExerciseBook/05.30.2/05.30.2.c new file mode 100644 index 0000000..8ad12c9 --- /dev/null +++ b/CLion/ExerciseBook/05.30.2/05.30.2.c @@ -0,0 +1,42 @@ +#include +#include "SString.h" //**▲04 串**// +#include "GList-E.h" //**▲05 数组和广义表**// + +// 求广义表深度(扩展线性链表存储表示) +int Algo_5_30_2(GList L); + + +int main(int argc, char* argv[]) { + GList L; + char* s = "((),(e),(a,(b,c,d)))"; + SString S; + + printf("创建广义表 L ...\n"); + StrAssign(S, s); + CreateGList(&L, S); + printf("L = "); + PrintGraph(L); + + printf("广义表深度为: %d\n", Algo_5_30_2(L)); + + return 0; +} + + +// 求广义表深度(扩展线性链表存储表示) +int Algo_5_30_2(GList L) { + int m, n; + + if(L==NULL) { + return 1; // 空表深度为1 + } + + if(L->tag == Atom) { + return 0; // 原子深度为0 + } + + m = Algo_5_30_2(L->Node.hp) + 1; + n = Algo_5_30_2(L->tp); + + return m > n ? m : n; +} diff --git a/CLion/ExerciseBook/05.30.2/CMakeLists.txt b/CLion/ExerciseBook/05.30.2/CMakeLists.txt new file mode 100644 index 0000000..34b6516 --- /dev/null +++ b/CLion/ExerciseBook/05.30.2/CMakeLists.txt @@ -0,0 +1,7 @@ +# 包含公共库 +include_directories(${CMAKE_SOURCE_DIR}/Status) + +# 生成可执行文件 +add_executable(05.30.2 SString.h SString.c GList-E.h GList-E.c 05.30.2.c) +# 链接公共库 +target_link_libraries(05.30.2 Scanf_lib) \ No newline at end of file diff --git a/CLion/ExerciseBook/05.30.2/GList-E.c b/CLion/ExerciseBook/05.30.2/GList-E.c new file mode 100644 index 0000000..d994024 --- /dev/null +++ b/CLion/ExerciseBook/05.30.2/GList-E.c @@ -0,0 +1,449 @@ +/*=========================== + * 广义表的扩展线性链表存储表示 + ============================*/ + +#include "GList-E.h" //**▲05 数组和广义表**// + +/* + * 初始化 + * + * 初始化空的广义表,长度为0,深度为1。 + * + *【注】 + * 需要对每一层带上括号考察 + */ +Status InitGList(GList* L) { + if(L == NULL) { + return ERROR; + } + + *L = (GList) malloc(sizeof(GLNode)); + if(!*L) { + exit(OVERFLOW); + } + + (*L)->tag = List; + (*L)->Node.hp = NULL; + (*L)->tp = NULL; + + return OK; +} + +/* + * 创建 + * + * 由字符串S创建广义表L。 + */ +Status CreateGList(GList* L, SString S) { + SString emp, hsub, sub, tmp; + + if(L == NULL) { + return ERROR; + } + + // 清理字符串S中的空白,包括清理不可打印字符和清理空格 + ClearBlank(S); + + if(StrEmpty(S)) { + return ERROR; + } + + // 复制是为了不破坏S + StrCopy(sub, S); + + /* + * 初次执行到此时,带着最外层的括号 + * 再次执行到此时,已经脱去了外层括号 + */ + sever(hsub, sub); + + *L = (GList) malloc(sizeof(GLNode)); + if(*L == NULL) { + exit(OVERFLOW); + } + + StrAssign(emp, "()"); + + if(!StrCompare(hsub, emp)) { + (*L)->tag = List; + (*L)->Node.hp = NULL; + } else { + if(StrLength(hsub) == 1) { + (*L)->tag = Atom; + (*L)->Node.atom = hsub[1]; + } else { + (*L)->tag = List; + + SubString(tmp, hsub, 2, StrLength(hsub) - 2); + + CreateGList(&((*L)->Node.hp), tmp); + } + } + + // 如果不存在队尾,则退出本层递归 + if(StrEmpty(sub)) { + (*L)->tp = NULL; + } else { + // 继续递归求表尾 + CreateGList(&((*L)->tp), sub); + } + + return OK; +} + +/* + * 销毁 + * + * 释放广义表所占内存。 + */ +Status DestroyGList(GList* L) { + GList head, tail; + + if(L == NULL || *L == NULL) { + return ERROR; + } + + // 处理子表结点 + if((*L)->tag == List) { + head = (*L)->Node.hp; // 表头 + tail = (*L)->tp; // 表尾 + + free(*L); + *L = NULL; + + // 递归处理表头 + if(head != NULL) { + DestroyGList(&head); + } + + // 递归处理表尾 + if(tail != NULL) { + DestroyGList(&tail); + } + + // 处理原子结点 + } else { + tail = (*L)->tp; // 表尾 + + free(*L); + *L = NULL; + + if(tail != NULL) { + DestroyGList(&tail); + } + } + + return OK; +} + +/* + * 复制 + * + * 由广义表L复制得到广义表T。 + */ +Status CopyGList(GList* T, GList L) { + + if(L == NULL) { + return ERROR; + } + + *T = (GList) malloc(sizeof(GLNode)); + if(*T == NULL) { + exit(OVERFLOW); + } + + // 复制原子 + if(L->tag == Atom) { + (*T)->tag = Atom; + (*T)->Node.atom = L->Node.atom; + + // 复制子表 + } else { + (*T)->tag = List; + + // 复制表头 + if(L->Node.hp != NULL) { + CopyGList(&((*T)->Node.hp), L->Node.hp); + } else { + (*T)->Node.hp = NULL; + } + } + + // 复制表尾 + if(L->tp != NULL) { + CopyGList(&((*T)->tp), L->tp); + } else { + (*T)->tp = NULL; + } + + return OK; +} + +/* + * 计数 + * + * 返回广义表的长度。 + */ +int GListLength(GList L) { + int count = 0; + GList p; + + // 广义表不存在 + if(L == NULL) { + return -1; + } + + p = L->Node.hp; + + while(p != NULL) { + ++count; + p = p->tp; + } + + return count; +} + +/* + * 深度 + * + * 返回广义表的深度 + */ +int GListDepth(GList L) { + int max, deep; + GList p; + + max = 0; + + // 广义表不存在 + if(L == NULL) { + return -1; + } + + // 空表深度为1 + if(L->tag == List && !L->Node.hp) { + return 1; + } + + // 原子深度为0 + if(L->tag == Atom) { + return 0; + } + + // 递归求子表深度 + for(p = L->Node.hp; p != NULL; p = p->tp) { + // 求以p为头指针的子表深度 + deep = GListDepth(p); + if(deep > max) { + max = deep; + } + } + + return max + 1; +} + +/* + * 判空 + * + * 判断广义表是否为空。 + */ +Status GListEmpty(GList L) { + // 广义表不存在 + if(L == NULL) { + return ERROR; + } + + if(L->tag == List && L->Node.hp == NULL && L->tp == NULL) { + return TRUE; + } else { + return ERROR; + } +} + +/* + * 表头 + */ +GList GetHead(GList L) { + GList p, q; + + // 广义表不存在或广义表为空表,无法获取表头 + if(L == NULL || L->Node.hp == NULL) { + return NULL; + } + + q = L->Node.hp->tp; // 临时保存L的表尾信息 + L->Node.hp->tp = NULL; // 截去L的表尾部分 + + CopyGList(&p, L->Node.hp); // 复制表头信息(已屏蔽表尾) + + L->Node.hp->tp = q; // 恢复L的表尾信息 + + return p; +} + +/* + * 表尾 + */ +GList GetTail(GList L) { + GList p, q; + + // 广义表不存在或广义表为空表,无法获取表尾 + if(L == NULL || L->Node.hp == NULL) { + return NULL; + } + + q = L->Node.hp; // 临时保存L的表头信息 + L->Node.hp = q->tp; // 摘下L的表头部分 + + CopyGList(&p, L); // 复制表尾信息(已屏蔽表头) + + q->tp = L->Node.hp; // 恢复L的表头信息 + L->Node.hp = q; + + return p; +} + +/* + * 插入 + * + * 将元素e插入为广义表L的第一个元素。 + */ +Status InsertFirst(GList* L, GList e) { + + // 广义表不存在 + if(L == NULL || *L == NULL) { + return ERROR; + } + + if(e == NULL) { + return ERROR; + } + + e->tp = (*L)->Node.hp; + (*L)->Node.hp = e; + + return OK; +} + +/* + * 删除 + * + * 将广义表L的第一个元素删除,并用e返回。 + */ +Status DeleteFirst(GList* L, GList* e) { + GList p; + + // 广义表不存在或广义表为空表,则无法删除表头 + if(*L == NULL || (*L)->Node.hp == NULL) { + return ERROR; + } + + p = (*L)->Node.hp; + (*L)->Node.hp = p->tp; + p->tp = NULL; + + *e = p; + + return OK; +} + +/* + * 遍历 + * + * 用visit函数访问广义表L。 + */ +void Traverse(GList L, void(Visit)(AtomType)) { + if(L == NULL) { + return; + } + + if(L->tag == List) { + Traverse(L->Node.hp, Visit); + } else { + Visit(L->Node.atom); + } + + Traverse(L->tp, Visit); +} + +/* + * 图形化输出 + * + * 带括号输出广义表L。 + */ +void PrintGraph(GList L) { + Print(L); + printf("\n"); +} + +/* + * 图形化输出的内部实现。 + */ +static void Print(GList L) { + if(L == NULL) { + return; + } + + // 处理表结点 + if(L->tag == List) { + printf("("); + + if(L->Node.hp) { + Print(L->Node.hp); + } + + if(L->tp) { + printf("),"); + Print(L->tp); + } else { + printf(")"); + } + + // 处理原子结点 + } else { + printf("%c", L->Node.atom); + if(L->tp) { + printf(","); + Print(L->tp); + } + } +} + +/* + * 将非空串str分割成两部分:hsub为第一个','之前的子串,str为第一个','之后的子串。 + * + *【注】 + * 1.这里假设字符串str输入正确,其中无空白符号, + * 但str外层的括号可能脱去,也可能未脱去。 + * 2.分离完成后,str也会发生变化 + */ +static void sever(SString hstr, SString str) { + int i, k, n; + SString ch; + + n = StrLength(str); + + i = 0; // 遍历字符串时的游标 + k = 0; // 标记遇到的未配对括号数量 + + do { + ++i; + + // 截取str第一个字符 + SubString(ch, str, i, 1); + + if(ch[1] == '(') { + ++k; + } + if(ch[1] == ')') { + --k; + } + } while(i < n && (ch[1] != ',' || k != 0)); + + if(i < n) { + SubString(hstr, str, 1, i - 1); + SubString(str, str, i + 1, n - i); + } else { + StrCopy(hstr, str); + ClearString(str); + } +} diff --git a/CLion/ExerciseBook/05.30.2/GList-E.h b/CLion/ExerciseBook/05.30.2/GList-E.h new file mode 100644 index 0000000..5e5b625 --- /dev/null +++ b/CLion/ExerciseBook/05.30.2/GList-E.h @@ -0,0 +1,146 @@ +/*=========================== + * 广义表的扩展线性链表存储表示 + ============================*/ + +#ifndef GLIST_E_H +#define GLIST_E_H + +#include +#include // 提供 malloc、realloc、free、exit 原型 +#include "Status.h" //**▲01 绪论**// +#include "SString.h" //**▲04 串**// + +/* 原子元素类型 */ +typedef char AtomType; //原子类型 + +/* + * 广义表结点标记 + * + * Atom-0:原子结点 + * List-1:表结点 + */ +typedef enum { Atom, List } ElemTag; + +/* 广义表(扩展线性链表存储表示)类型定义 */ +typedef struct GLNode { + ElemTag tag; // 公共标记,用于区分原子结点和表结点 + + // 原子结点和表结点的联合部分 + union + { + AtomType atom; // atom是原子结点的值域,AtomType由用户定义 + struct GLNode* hp; // 指向表头 + } Node; + struct GLNode* tp; // 指向表尾 +} GLNode; + +/* 广义表类型 */ +typedef GLNode* GList; + + +/* + * 初始化 + * + * 初始化空的广义表,长度为0,深度为1。 + * + *【注】 + * 需要对每一层带上括号考察 + */ +Status InitGList(GList* L); + +/* + * 创建 + * + * 由字符串S创建广义表L。 + */ +Status CreateGList(GList* L, SString S); + +/* + * 销毁 + * + * 释放广义表所占内存。 + */ +Status DestroyGList(GList* L); + +/* + * 复制 + * + * 由广义表L复制得到广义表T。 + */ +Status CopyGList(GList* T, GList L); + +/* + * 计数 + * + * 返回广义表的长度。 + */ +int GListLength(GList L); + +/* + * 深度 + * + * 返回广义表的深度 + */ +int GListDepth(GList L); + +/* + * 判空 + * + * 判断广义表是否为空。 + */ +Status GListEmpty(GList L); + +/* + * 表头 + */ +GList GetHead(GList L); + +/* + * 表尾 + */ +GList GetTail(GList L); + +/* + * 插入 + * + * 将元素e插入为广义表L的第一个元素。 + */ +Status InsertFirst(GList* L, GList e); + +/* + * 删除 + * + * 将广义表L的第一个元素删除,并用e返回。 + */ +Status DeleteFirst(GList* L, GList* e); + +/* + * 遍历 + * + * 用visit函数访问广义表L。 + */ +void Traverse(GList L, void(Visit)(AtomType)); + +/* + * 图形化输出 + * + * 带括号输出广义表L。 + */ +void PrintGraph(GList L); + +/* + * 图形化输出的内部实现。 + */ +static void Print(GList L); + +/* + * 将非空串str分割成两部分:hsub为第一个','之前的子串,str为第一个','之后的子串。 + * + *【注】 + * 1.这里假设字符串str输入正确,其中无空白符号, + * 但str外层的括号可能脱去,也可能未脱去。 + * 2.分离完成后,str也会发生变化 + */ +static void sever(SString hstr, SString str); + +#endif diff --git a/CLion/ExerciseBook/05.30.2/SString.c b/CLion/ExerciseBook/05.30.2/SString.c new file mode 100644 index 0000000..41d9e15 --- /dev/null +++ b/CLion/ExerciseBook/05.30.2/SString.c @@ -0,0 +1,195 @@ +/*============================= + * 串的定长顺序存储表示(顺序串) + * + * 包含算法: 4.1、4.2、4.3、4.5 + ==============================*/ + +#include "SString.h" //**▲04 串**// + +/* + * 初始化 + * + * 构造一个值为chars的串T。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status StrAssign(SString T, const char* chars) { + int i, len; + + len = (int) strlen(chars); + + // chars过长 + if(len > MAXSTRLEN) { + return ERROR; + } + + T[0] = len; + for(i = 1; i <= len; i++) { + T[i] = chars[i - 1]; + } + + return OK; +} + +/* + * 清空 + * + * 将串S清空。 + */ +Status ClearString(SString S) { + // 只需要将长度置为0就可以 + S[0] = 0; + return OK; +} + +/* + * 判空 + * + * 判断串S中是否包含有效数据。 + * + * 返回值: + * TRUE : 串S为空 + * FALSE: 串S不为空 + */ +Status StrEmpty(SString S) { + return S[0] == 0 ? TRUE : FALSE; +} + +/* + * 计数 + * + * 返回串S中元素的个数。 + * + *【注】 + * 该操作属于最小操作子集 + */ +int StrLength(SString S) { + return S[0]; +} + +/* + * ████████ 算法4.3 ████████ + * + * 求子串 + * + * 用Sub返回S[pos, pos+len-1]。 + * 返回值指示是否截取成功。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status SubString(SString Sub, SString S, int pos, int len) { + int i; + + if(pos < 1 || pos > S[0] || len < 0 || pos + len - 1 > S[0]) { + return ERROR; + } + + // 复制元素 + for(i = 1; i <= len; i++) { + Sub[i] = S[pos + i - 1]; + } + + // 确定新长度 + Sub[0] = len; + + return OK; +} + +/* + * 删除 + * + * 删除S[pos, pos+len-1]。 + */ +Status StrDelete(SString S, int pos, int len) { + int i; + + if(pos < 1 || pos + len - 1 > S[0] || len < 0) { + return ERROR; + } + + // 如果待删除的长度为0,则提前返回 + if(len == 0) { + return OK; + } + + // 把后面的元素挪到前面,覆盖掉被删除的元素 + for(i = pos + len; i <= S[0]; i++) { + S[i - len] = S[i]; + } + + // 长度减少 + S[0] -= len; + + return OK; +} + +/* + * 比较 + * + * 比较串S和串T,返回比较结果。 + * + *【注】 + * 该操作属于最小操作子集 + */ +int StrCompare(SString S, SString T) { + int i = 1; + + while(i <= S[0] && i <= T[0]) { + // 遇到不同的字符时,比较其大小 + if(S[i] != T[i]) { + return S[i] - T[i]; + } + + i++; + } + + return S[0] - T[0]; +} + +/* + * 复制 + * + * 将串S复制到串T。 + */ +Status StrCopy(SString T, SString S) { + int i; + + // 连同长度信息一起复制 + for(i = 0; i <= S[0]; i++) { + T[i] = S[i]; + } + + return OK; +} + +/* + * 清理字符串S中的空白,包括清理不可打印字符和清理空格。 + * + *【注】 + * 该函数是在本章中新增的。 + */ +Status ClearBlank(SString S) { + int i, j; + + // 如果是空串 + if(S[0] == 0) { + return ERROR; + } + + for(i = 1, j = 0; i <= S[0]; i++) { + // 如果遇到空白,则略过 + if(S[i] == ' ' || !isprint(S[i])) { + continue; + } + + j++; + + S[j] = S[i]; + } + + S[0] = j; + + return OK; +} diff --git a/CLion/ExerciseBook/05.30.2/SString.h b/CLion/ExerciseBook/05.30.2/SString.h new file mode 100644 index 0000000..e81ca79 --- /dev/null +++ b/CLion/ExerciseBook/05.30.2/SString.h @@ -0,0 +1,117 @@ +/*============================= + * 串的定长顺序存储表示(顺序串) + * + * 包含算法: 4.1、4.2、4.3、4.5 + ==============================*/ + +#ifndef SSTRING_H +#define SSTRING_H + +#include +#include // 提供 strlen 原型 +#include // 提供 isprint 原型 +#include "Status.h" //**▲01 绪论**// + +/* 宏定义 */ +#define MAXSTRLEN 255 // 顺序串的最大串长 + +/* + * 串的顺序存储类型定义 + * + * 注:有效元素从SString的1号单元开始存储 + * SString的0号单元用来存储其长度 + */ +typedef unsigned char SString[MAXSTRLEN + 1]; // 0号单元存放串的长度 + + +/* + * ████ 提示 ████ + * + * 遵循教材的书写习惯,pos指示字符的位序(不是索引),从1开始计数 + */ + + +/* + * 初始化 + * + * 构造一个值为chars的串T。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status StrAssign(SString T, const char* chars); + +/* + * 清空 + * + * 将串S清空。 + */ +Status ClearString(SString S); + +/* + * 判空 + * + * 判断串S中是否包含有效数据。 + * + * 返回值: + * TRUE : 串S为空 + * FALSE: 串S不为空 + */ +Status StrEmpty(SString S); + +/* + * 计数 + * + * 返回串S中元素的个数。 + * + *【注】 + * 该操作属于最小操作子集 + */ +int StrLength(SString S); + +/* + * ████████ 算法4.3 ████████ + * + * 求子串 + * + * 用Sub返回S[pos, pos+len-1]。 + * 返回值指示是否截取成功。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status SubString(SString Sub, SString S, int pos, int len); + +/* + * 删除 + * + * 删除S[pos, pos+len-1]。 + */ +Status StrDelete(SString S, int pos, int len); + +/* + * 比较 + * + * 比较串S和串T,返回比较结果。 + * + *【注】 + * 该操作属于最小操作子集 + */ +int StrCompare(SString S, SString T); + +/* + * 复制 + * + * 将串S复制到串T。 + */ +Status StrCopy(SString T, SString S); + +/* + * 清理字符串S中的空白,包括清理不可打印字符和清理空格。 + * + *【注】 + * 该函数是在本章中新增的。 + */ +Status ClearBlank(SString S); + +#endif diff --git a/CLion/ExerciseBook/05.31/05.31.c b/CLion/ExerciseBook/05.31/05.31.c new file mode 100644 index 0000000..c9ece2d --- /dev/null +++ b/CLion/ExerciseBook/05.31/05.31.c @@ -0,0 +1,43 @@ +#include +#include "Status.h" //**▲01 绪论**// +#include "SString.h" //**▲04 串**// +#include "GList-E.h" //**▲05 数组和广义表**// + +/* + * 广义表复制(扩展线性链表存储表示) + * + *【注】 + * 该函数已在GList-E相关文件中定义 + */ +Status Algo_5_31(GList* T, GList L); + + +int main(int argc, char* argv[]) { + GList L, T; + char* s = "((),(e),(a,(b,c,d)))"; + SString S; + + printf("创建广义表 L ...\n"); + StrAssign(S, s); + CreateGList(&L, S); + printf("L = "); + PrintGraph(L); + + printf("复制广义表到 L 到 T...\n"); + Algo_5_31(&T, L); + printf("T = "); + PrintGraph(T); + + return 0; +} + + +/* + * 广义表复制(扩展线性链表存储表示) + * + *【注】 + * 该函数已在GList-E相关文件中定义 + */ +Status Algo_5_31(GList* T, GList L) { + return CopyGList(T, L); +} diff --git a/CLion/ExerciseBook/05.31/CMakeLists.txt b/CLion/ExerciseBook/05.31/CMakeLists.txt new file mode 100644 index 0000000..141eb2a --- /dev/null +++ b/CLion/ExerciseBook/05.31/CMakeLists.txt @@ -0,0 +1,7 @@ +# 包含公共库 +include_directories(${CMAKE_SOURCE_DIR}/Status) + +# 生成可执行文件 +add_executable(05.31 SString.h SString.c GList-E.h GList-E.c 05.31.c) +# 链接公共库 +target_link_libraries(05.31 Scanf_lib) \ No newline at end of file diff --git a/CLion/ExerciseBook/05.31/GList-E.c b/CLion/ExerciseBook/05.31/GList-E.c new file mode 100644 index 0000000..d994024 --- /dev/null +++ b/CLion/ExerciseBook/05.31/GList-E.c @@ -0,0 +1,449 @@ +/*=========================== + * 广义表的扩展线性链表存储表示 + ============================*/ + +#include "GList-E.h" //**▲05 数组和广义表**// + +/* + * 初始化 + * + * 初始化空的广义表,长度为0,深度为1。 + * + *【注】 + * 需要对每一层带上括号考察 + */ +Status InitGList(GList* L) { + if(L == NULL) { + return ERROR; + } + + *L = (GList) malloc(sizeof(GLNode)); + if(!*L) { + exit(OVERFLOW); + } + + (*L)->tag = List; + (*L)->Node.hp = NULL; + (*L)->tp = NULL; + + return OK; +} + +/* + * 创建 + * + * 由字符串S创建广义表L。 + */ +Status CreateGList(GList* L, SString S) { + SString emp, hsub, sub, tmp; + + if(L == NULL) { + return ERROR; + } + + // 清理字符串S中的空白,包括清理不可打印字符和清理空格 + ClearBlank(S); + + if(StrEmpty(S)) { + return ERROR; + } + + // 复制是为了不破坏S + StrCopy(sub, S); + + /* + * 初次执行到此时,带着最外层的括号 + * 再次执行到此时,已经脱去了外层括号 + */ + sever(hsub, sub); + + *L = (GList) malloc(sizeof(GLNode)); + if(*L == NULL) { + exit(OVERFLOW); + } + + StrAssign(emp, "()"); + + if(!StrCompare(hsub, emp)) { + (*L)->tag = List; + (*L)->Node.hp = NULL; + } else { + if(StrLength(hsub) == 1) { + (*L)->tag = Atom; + (*L)->Node.atom = hsub[1]; + } else { + (*L)->tag = List; + + SubString(tmp, hsub, 2, StrLength(hsub) - 2); + + CreateGList(&((*L)->Node.hp), tmp); + } + } + + // 如果不存在队尾,则退出本层递归 + if(StrEmpty(sub)) { + (*L)->tp = NULL; + } else { + // 继续递归求表尾 + CreateGList(&((*L)->tp), sub); + } + + return OK; +} + +/* + * 销毁 + * + * 释放广义表所占内存。 + */ +Status DestroyGList(GList* L) { + GList head, tail; + + if(L == NULL || *L == NULL) { + return ERROR; + } + + // 处理子表结点 + if((*L)->tag == List) { + head = (*L)->Node.hp; // 表头 + tail = (*L)->tp; // 表尾 + + free(*L); + *L = NULL; + + // 递归处理表头 + if(head != NULL) { + DestroyGList(&head); + } + + // 递归处理表尾 + if(tail != NULL) { + DestroyGList(&tail); + } + + // 处理原子结点 + } else { + tail = (*L)->tp; // 表尾 + + free(*L); + *L = NULL; + + if(tail != NULL) { + DestroyGList(&tail); + } + } + + return OK; +} + +/* + * 复制 + * + * 由广义表L复制得到广义表T。 + */ +Status CopyGList(GList* T, GList L) { + + if(L == NULL) { + return ERROR; + } + + *T = (GList) malloc(sizeof(GLNode)); + if(*T == NULL) { + exit(OVERFLOW); + } + + // 复制原子 + if(L->tag == Atom) { + (*T)->tag = Atom; + (*T)->Node.atom = L->Node.atom; + + // 复制子表 + } else { + (*T)->tag = List; + + // 复制表头 + if(L->Node.hp != NULL) { + CopyGList(&((*T)->Node.hp), L->Node.hp); + } else { + (*T)->Node.hp = NULL; + } + } + + // 复制表尾 + if(L->tp != NULL) { + CopyGList(&((*T)->tp), L->tp); + } else { + (*T)->tp = NULL; + } + + return OK; +} + +/* + * 计数 + * + * 返回广义表的长度。 + */ +int GListLength(GList L) { + int count = 0; + GList p; + + // 广义表不存在 + if(L == NULL) { + return -1; + } + + p = L->Node.hp; + + while(p != NULL) { + ++count; + p = p->tp; + } + + return count; +} + +/* + * 深度 + * + * 返回广义表的深度 + */ +int GListDepth(GList L) { + int max, deep; + GList p; + + max = 0; + + // 广义表不存在 + if(L == NULL) { + return -1; + } + + // 空表深度为1 + if(L->tag == List && !L->Node.hp) { + return 1; + } + + // 原子深度为0 + if(L->tag == Atom) { + return 0; + } + + // 递归求子表深度 + for(p = L->Node.hp; p != NULL; p = p->tp) { + // 求以p为头指针的子表深度 + deep = GListDepth(p); + if(deep > max) { + max = deep; + } + } + + return max + 1; +} + +/* + * 判空 + * + * 判断广义表是否为空。 + */ +Status GListEmpty(GList L) { + // 广义表不存在 + if(L == NULL) { + return ERROR; + } + + if(L->tag == List && L->Node.hp == NULL && L->tp == NULL) { + return TRUE; + } else { + return ERROR; + } +} + +/* + * 表头 + */ +GList GetHead(GList L) { + GList p, q; + + // 广义表不存在或广义表为空表,无法获取表头 + if(L == NULL || L->Node.hp == NULL) { + return NULL; + } + + q = L->Node.hp->tp; // 临时保存L的表尾信息 + L->Node.hp->tp = NULL; // 截去L的表尾部分 + + CopyGList(&p, L->Node.hp); // 复制表头信息(已屏蔽表尾) + + L->Node.hp->tp = q; // 恢复L的表尾信息 + + return p; +} + +/* + * 表尾 + */ +GList GetTail(GList L) { + GList p, q; + + // 广义表不存在或广义表为空表,无法获取表尾 + if(L == NULL || L->Node.hp == NULL) { + return NULL; + } + + q = L->Node.hp; // 临时保存L的表头信息 + L->Node.hp = q->tp; // 摘下L的表头部分 + + CopyGList(&p, L); // 复制表尾信息(已屏蔽表头) + + q->tp = L->Node.hp; // 恢复L的表头信息 + L->Node.hp = q; + + return p; +} + +/* + * 插入 + * + * 将元素e插入为广义表L的第一个元素。 + */ +Status InsertFirst(GList* L, GList e) { + + // 广义表不存在 + if(L == NULL || *L == NULL) { + return ERROR; + } + + if(e == NULL) { + return ERROR; + } + + e->tp = (*L)->Node.hp; + (*L)->Node.hp = e; + + return OK; +} + +/* + * 删除 + * + * 将广义表L的第一个元素删除,并用e返回。 + */ +Status DeleteFirst(GList* L, GList* e) { + GList p; + + // 广义表不存在或广义表为空表,则无法删除表头 + if(*L == NULL || (*L)->Node.hp == NULL) { + return ERROR; + } + + p = (*L)->Node.hp; + (*L)->Node.hp = p->tp; + p->tp = NULL; + + *e = p; + + return OK; +} + +/* + * 遍历 + * + * 用visit函数访问广义表L。 + */ +void Traverse(GList L, void(Visit)(AtomType)) { + if(L == NULL) { + return; + } + + if(L->tag == List) { + Traverse(L->Node.hp, Visit); + } else { + Visit(L->Node.atom); + } + + Traverse(L->tp, Visit); +} + +/* + * 图形化输出 + * + * 带括号输出广义表L。 + */ +void PrintGraph(GList L) { + Print(L); + printf("\n"); +} + +/* + * 图形化输出的内部实现。 + */ +static void Print(GList L) { + if(L == NULL) { + return; + } + + // 处理表结点 + if(L->tag == List) { + printf("("); + + if(L->Node.hp) { + Print(L->Node.hp); + } + + if(L->tp) { + printf("),"); + Print(L->tp); + } else { + printf(")"); + } + + // 处理原子结点 + } else { + printf("%c", L->Node.atom); + if(L->tp) { + printf(","); + Print(L->tp); + } + } +} + +/* + * 将非空串str分割成两部分:hsub为第一个','之前的子串,str为第一个','之后的子串。 + * + *【注】 + * 1.这里假设字符串str输入正确,其中无空白符号, + * 但str外层的括号可能脱去,也可能未脱去。 + * 2.分离完成后,str也会发生变化 + */ +static void sever(SString hstr, SString str) { + int i, k, n; + SString ch; + + n = StrLength(str); + + i = 0; // 遍历字符串时的游标 + k = 0; // 标记遇到的未配对括号数量 + + do { + ++i; + + // 截取str第一个字符 + SubString(ch, str, i, 1); + + if(ch[1] == '(') { + ++k; + } + if(ch[1] == ')') { + --k; + } + } while(i < n && (ch[1] != ',' || k != 0)); + + if(i < n) { + SubString(hstr, str, 1, i - 1); + SubString(str, str, i + 1, n - i); + } else { + StrCopy(hstr, str); + ClearString(str); + } +} diff --git a/CLion/ExerciseBook/05.31/GList-E.h b/CLion/ExerciseBook/05.31/GList-E.h new file mode 100644 index 0000000..5e5b625 --- /dev/null +++ b/CLion/ExerciseBook/05.31/GList-E.h @@ -0,0 +1,146 @@ +/*=========================== + * 广义表的扩展线性链表存储表示 + ============================*/ + +#ifndef GLIST_E_H +#define GLIST_E_H + +#include +#include // 提供 malloc、realloc、free、exit 原型 +#include "Status.h" //**▲01 绪论**// +#include "SString.h" //**▲04 串**// + +/* 原子元素类型 */ +typedef char AtomType; //原子类型 + +/* + * 广义表结点标记 + * + * Atom-0:原子结点 + * List-1:表结点 + */ +typedef enum { Atom, List } ElemTag; + +/* 广义表(扩展线性链表存储表示)类型定义 */ +typedef struct GLNode { + ElemTag tag; // 公共标记,用于区分原子结点和表结点 + + // 原子结点和表结点的联合部分 + union + { + AtomType atom; // atom是原子结点的值域,AtomType由用户定义 + struct GLNode* hp; // 指向表头 + } Node; + struct GLNode* tp; // 指向表尾 +} GLNode; + +/* 广义表类型 */ +typedef GLNode* GList; + + +/* + * 初始化 + * + * 初始化空的广义表,长度为0,深度为1。 + * + *【注】 + * 需要对每一层带上括号考察 + */ +Status InitGList(GList* L); + +/* + * 创建 + * + * 由字符串S创建广义表L。 + */ +Status CreateGList(GList* L, SString S); + +/* + * 销毁 + * + * 释放广义表所占内存。 + */ +Status DestroyGList(GList* L); + +/* + * 复制 + * + * 由广义表L复制得到广义表T。 + */ +Status CopyGList(GList* T, GList L); + +/* + * 计数 + * + * 返回广义表的长度。 + */ +int GListLength(GList L); + +/* + * 深度 + * + * 返回广义表的深度 + */ +int GListDepth(GList L); + +/* + * 判空 + * + * 判断广义表是否为空。 + */ +Status GListEmpty(GList L); + +/* + * 表头 + */ +GList GetHead(GList L); + +/* + * 表尾 + */ +GList GetTail(GList L); + +/* + * 插入 + * + * 将元素e插入为广义表L的第一个元素。 + */ +Status InsertFirst(GList* L, GList e); + +/* + * 删除 + * + * 将广义表L的第一个元素删除,并用e返回。 + */ +Status DeleteFirst(GList* L, GList* e); + +/* + * 遍历 + * + * 用visit函数访问广义表L。 + */ +void Traverse(GList L, void(Visit)(AtomType)); + +/* + * 图形化输出 + * + * 带括号输出广义表L。 + */ +void PrintGraph(GList L); + +/* + * 图形化输出的内部实现。 + */ +static void Print(GList L); + +/* + * 将非空串str分割成两部分:hsub为第一个','之前的子串,str为第一个','之后的子串。 + * + *【注】 + * 1.这里假设字符串str输入正确,其中无空白符号, + * 但str外层的括号可能脱去,也可能未脱去。 + * 2.分离完成后,str也会发生变化 + */ +static void sever(SString hstr, SString str); + +#endif diff --git a/CLion/ExerciseBook/05.31/SString.c b/CLion/ExerciseBook/05.31/SString.c new file mode 100644 index 0000000..41d9e15 --- /dev/null +++ b/CLion/ExerciseBook/05.31/SString.c @@ -0,0 +1,195 @@ +/*============================= + * 串的定长顺序存储表示(顺序串) + * + * 包含算法: 4.1、4.2、4.3、4.5 + ==============================*/ + +#include "SString.h" //**▲04 串**// + +/* + * 初始化 + * + * 构造一个值为chars的串T。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status StrAssign(SString T, const char* chars) { + int i, len; + + len = (int) strlen(chars); + + // chars过长 + if(len > MAXSTRLEN) { + return ERROR; + } + + T[0] = len; + for(i = 1; i <= len; i++) { + T[i] = chars[i - 1]; + } + + return OK; +} + +/* + * 清空 + * + * 将串S清空。 + */ +Status ClearString(SString S) { + // 只需要将长度置为0就可以 + S[0] = 0; + return OK; +} + +/* + * 判空 + * + * 判断串S中是否包含有效数据。 + * + * 返回值: + * TRUE : 串S为空 + * FALSE: 串S不为空 + */ +Status StrEmpty(SString S) { + return S[0] == 0 ? TRUE : FALSE; +} + +/* + * 计数 + * + * 返回串S中元素的个数。 + * + *【注】 + * 该操作属于最小操作子集 + */ +int StrLength(SString S) { + return S[0]; +} + +/* + * ████████ 算法4.3 ████████ + * + * 求子串 + * + * 用Sub返回S[pos, pos+len-1]。 + * 返回值指示是否截取成功。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status SubString(SString Sub, SString S, int pos, int len) { + int i; + + if(pos < 1 || pos > S[0] || len < 0 || pos + len - 1 > S[0]) { + return ERROR; + } + + // 复制元素 + for(i = 1; i <= len; i++) { + Sub[i] = S[pos + i - 1]; + } + + // 确定新长度 + Sub[0] = len; + + return OK; +} + +/* + * 删除 + * + * 删除S[pos, pos+len-1]。 + */ +Status StrDelete(SString S, int pos, int len) { + int i; + + if(pos < 1 || pos + len - 1 > S[0] || len < 0) { + return ERROR; + } + + // 如果待删除的长度为0,则提前返回 + if(len == 0) { + return OK; + } + + // 把后面的元素挪到前面,覆盖掉被删除的元素 + for(i = pos + len; i <= S[0]; i++) { + S[i - len] = S[i]; + } + + // 长度减少 + S[0] -= len; + + return OK; +} + +/* + * 比较 + * + * 比较串S和串T,返回比较结果。 + * + *【注】 + * 该操作属于最小操作子集 + */ +int StrCompare(SString S, SString T) { + int i = 1; + + while(i <= S[0] && i <= T[0]) { + // 遇到不同的字符时,比较其大小 + if(S[i] != T[i]) { + return S[i] - T[i]; + } + + i++; + } + + return S[0] - T[0]; +} + +/* + * 复制 + * + * 将串S复制到串T。 + */ +Status StrCopy(SString T, SString S) { + int i; + + // 连同长度信息一起复制 + for(i = 0; i <= S[0]; i++) { + T[i] = S[i]; + } + + return OK; +} + +/* + * 清理字符串S中的空白,包括清理不可打印字符和清理空格。 + * + *【注】 + * 该函数是在本章中新增的。 + */ +Status ClearBlank(SString S) { + int i, j; + + // 如果是空串 + if(S[0] == 0) { + return ERROR; + } + + for(i = 1, j = 0; i <= S[0]; i++) { + // 如果遇到空白,则略过 + if(S[i] == ' ' || !isprint(S[i])) { + continue; + } + + j++; + + S[j] = S[i]; + } + + S[0] = j; + + return OK; +} diff --git a/CLion/ExerciseBook/05.31/SString.h b/CLion/ExerciseBook/05.31/SString.h new file mode 100644 index 0000000..e81ca79 --- /dev/null +++ b/CLion/ExerciseBook/05.31/SString.h @@ -0,0 +1,117 @@ +/*============================= + * 串的定长顺序存储表示(顺序串) + * + * 包含算法: 4.1、4.2、4.3、4.5 + ==============================*/ + +#ifndef SSTRING_H +#define SSTRING_H + +#include +#include // 提供 strlen 原型 +#include // 提供 isprint 原型 +#include "Status.h" //**▲01 绪论**// + +/* 宏定义 */ +#define MAXSTRLEN 255 // 顺序串的最大串长 + +/* + * 串的顺序存储类型定义 + * + * 注:有效元素从SString的1号单元开始存储 + * SString的0号单元用来存储其长度 + */ +typedef unsigned char SString[MAXSTRLEN + 1]; // 0号单元存放串的长度 + + +/* + * ████ 提示 ████ + * + * 遵循教材的书写习惯,pos指示字符的位序(不是索引),从1开始计数 + */ + + +/* + * 初始化 + * + * 构造一个值为chars的串T。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status StrAssign(SString T, const char* chars); + +/* + * 清空 + * + * 将串S清空。 + */ +Status ClearString(SString S); + +/* + * 判空 + * + * 判断串S中是否包含有效数据。 + * + * 返回值: + * TRUE : 串S为空 + * FALSE: 串S不为空 + */ +Status StrEmpty(SString S); + +/* + * 计数 + * + * 返回串S中元素的个数。 + * + *【注】 + * 该操作属于最小操作子集 + */ +int StrLength(SString S); + +/* + * ████████ 算法4.3 ████████ + * + * 求子串 + * + * 用Sub返回S[pos, pos+len-1]。 + * 返回值指示是否截取成功。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status SubString(SString Sub, SString S, int pos, int len); + +/* + * 删除 + * + * 删除S[pos, pos+len-1]。 + */ +Status StrDelete(SString S, int pos, int len); + +/* + * 比较 + * + * 比较串S和串T,返回比较结果。 + * + *【注】 + * 该操作属于最小操作子集 + */ +int StrCompare(SString S, SString T); + +/* + * 复制 + * + * 将串S复制到串T。 + */ +Status StrCopy(SString T, SString S); + +/* + * 清理字符串S中的空白,包括清理不可打印字符和清理空格。 + * + *【注】 + * 该函数是在本章中新增的。 + */ +Status ClearBlank(SString S); + +#endif diff --git a/CLion/ExerciseBook/05.32.1/05.32.1.c b/CLion/ExerciseBook/05.32.1/05.32.1.c new file mode 100644 index 0000000..4f3b192 --- /dev/null +++ b/CLion/ExerciseBook/05.32.1/05.32.1.c @@ -0,0 +1,64 @@ +#include +#include "Status.h" //**▲01 绪论**// +#include "SString.h" //**▲04 串**// +#include "GList-HT.h" //**▲05 数组和广义表**// + +/* + * 判断广义表是否相等(头尾链表存储表示) + */ +Status Algo_5_32_1(GList A, GList B); + + +int main(int argc, char* argv[]) { + GList A, B; + char* a = "((),(e),(a,(b,c,d)))"; + char* b = "((),(e),(a,(b,c,f)))"; + SString Sa, Sb; + + printf("创建广义表 A、B ...\n"); + StrAssign(Sa, a); + CreateGList(&A, Sa); + StrAssign(Sb, b); + CreateGList(&B, Sb); + printf("A = "); + PrintGraph(A); + printf("B = "); + PrintGraph(B); + + Algo_5_32_1(A, B) ? printf("两广义表相等!\n") : printf("两广义表不相等!!\n"); + + return 0; +} + + +/* + * 判断广义表是否相等(头尾链表存储表示) + */ +Status Algo_5_32_1(GList A, GList B) { + if(!A && !B) { + return TRUE; // 两个空表相等 + } + + // 两个表均不为空 + if(A && B) { + // 元素类型相同 + if(A->tag == B->tag) { + // 原子结点 + if(A->tag == Atom) { + if(A->Node.atom == B->Node.atom) { + return TRUE; + } + + // 表结点 + } else { + if(Algo_5_32_1(A->Node.ptr.hp, B->Node.ptr.hp) == TRUE) { + if(Algo_5_32_1(A->Node.ptr.tp, B->Node.ptr.tp) == TRUE) { + return TRUE; + } + } + } + } + } + + return FALSE; +} diff --git a/CLion/ExerciseBook/05.32.1/CMakeLists.txt b/CLion/ExerciseBook/05.32.1/CMakeLists.txt new file mode 100644 index 0000000..9291d98 --- /dev/null +++ b/CLion/ExerciseBook/05.32.1/CMakeLists.txt @@ -0,0 +1,7 @@ +# 包含公共库 +include_directories(${CMAKE_SOURCE_DIR}/Status) + +# 生成可执行文件 +add_executable(05.32.1 SString.h SString.c GList-HT.h GList-HT.c 05.32.1.c) +# 链接公共库 +target_link_libraries(05.32.1 Scanf_lib) \ No newline at end of file diff --git a/CLion/ExerciseBook/05.32.1/GList-HT.c b/CLion/ExerciseBook/05.32.1/GList-HT.c new file mode 100644 index 0000000..ddf2766 --- /dev/null +++ b/CLion/ExerciseBook/05.32.1/GList-HT.c @@ -0,0 +1,418 @@ +/*============================ + * 广义表的头尾链表存储表示 + * + * 包含算法: 5.5、5.6、5.7、5.8 + =============================*/ + +#include "GList-HT.h" //**▲05 数组和广义表**// + +/* + * 初始化 + * + * 初始化空的广义表,长度为0,深度为1。 + * + *【注】 + * 需要对每一层去掉括号考察 + */ +Status InitGList(GList* L) { + if(L == NULL) { + return ERROR; + } + + *L = NULL; + + return OK; +} + +/* + * ████████ 算法5.7 ████████ + * + * 创建 + * + * 由字符串S创建广义表L。 + */ +Status CreateGList(GList* L, SString S) { + SString emp; // 代表空广义表的字符串 + SString hsub, sub; + GList p, q; + + if(L == NULL) { + return ERROR; + } + + // 清理字符串S中的空白,包括清理不可打印字符和清理空格 + ClearBlank(S); + + if(StrEmpty(S)) { + return ERROR; + } + + StrAssign(emp, "()"); + + /* + * 如果输入串为(),则代表需要创建空的广义表 + * + *【注】 + * 教材这里的代码是有问题的。 + * StrCompare的返回值指示的是两个字符串的大小,而不是指示两个字符串是否相等。 + * 如果给定的S与()相等,返回值应当是0。 + */ + if(!StrCompare(S, emp)) { + *L = NULL; + } else { + *L = (GList) malloc(sizeof(GLNode)); + if(*L == NULL) { + exit(OVERFLOW); + } + + // 创建原子 + if(StrLength(S) == 1) { + (*L)->tag = Atom; + (*L)->Node.atom = S[1]; + } else { + (*L)->tag = List; + + p = *L; + + // 去掉最外层括号 + SubString(sub, S, 2, StrLength(S) - 2); + + // 重复建n个子表 + do { + // 从sub中分离出表头串hsub,分离完成后,sub也会发生变化 + sever(hsub, sub); + + // 递归创建广义表 + CreateGList(&(p->Node.ptr.hp), hsub); + + q = p; + + // 如果表尾不为空,需要继续处理表尾 + if(!StrEmpty(sub)) { + p = (GList) malloc(sizeof(GLNode)); + if(p == NULL) { + exit(OVERFLOW); + } + + p->tag = List; + + q->Node.ptr.tp = p; + } + } while(!StrEmpty(sub)); + + q->Node.ptr.tp = NULL; + } + } + + return OK; +} + +/* + * 销毁 + * + * 释放广义表所占内存。 + */ +Status DestroyGList(GList* L) { + GList head, tail; + + if(L == NULL || *L == NULL) { + return ERROR; + } + + // 删除原子结点 + if((*L)->tag == Atom) { + free(*L); + *L = NULL; + + // 删除子表结点 + } else { + head = (*L)->Node.ptr.hp; + tail = (*L)->Node.ptr.tp; + free(*L); + *L = NULL; + DestroyGList(&head); + DestroyGList(&tail); + } + + return OK; +} + +/* + * ████████ 算法5.6 ████████ + * + * 复制 + * + * 由广义表L复制得到广义表T。 + */ +Status CopyGList(GList* T, GList L) { + if(T == NULL) { + return ERROR; + } + + if(L == NULL) { + *T = NULL; + } else { + // 新建广义表结点 + *T = (GList) malloc(sizeof(GLNode)); + if(*T == NULL) { + exit(OVERFLOW); + } + + (*T)->tag = L->tag; + + // 复制单原子 + if(L->tag == Atom) { + (*T)->Node.atom = L->Node.atom; + + // 复制表头和表尾 + } else { + CopyGList(&((*T)->Node.ptr.hp), L->Node.ptr.hp); + CopyGList(&((*T)->Node.ptr.tp), L->Node.ptr.tp); + } + } + + return OK; +} + +/* + * 计数 + * + * 返回广义表的长度。 + */ +int GListLength(GList L) { + int count; + + for(count = 0; L != NULL; count++, L = L->Node.ptr.tp) { + } + + return count; +} + +/* + * ████████ 算法5.5 ████████ + * + * 深度 + * + * 返回广义表的深度 + */ +int GListDepth(GList L) { + int max, deep; + GList p; + + // 空表深度为1 + if(L == NULL) { + return 1; + } + + // 原子深度为0 + if(L->tag == Atom) { + return 0; + } + + // 递归求子表深度 + for(max = 0, p = L; p != NULL; p = p->Node.ptr.tp) { + deep = GListDepth(p->Node.ptr.hp); + if(deep > max) { + max = deep; + } + } + + // 非空表的深度是各子元素最大深度加一 + return max + 1; +} + +/* + * 判空 + * + * 判断广义表是否为空。 + */ +Status GListEmpty(GList L) { + return L == NULL ? TRUE : FALSE; +} + +/* + * 表头 + */ +GList GetHead(GList L) { + GList p; + + // 空表无表头,这里不能返回NULL,不然分不清是失败了还是返回了空表 + if(L == NULL) { + exit(ERROR); + } + + CopyGList(&p, L->Node.ptr.hp); + + return p; +} + +/* + * 表尾 + */ +GList GetTail(GList L) { + GList p; + + // 空表无表尾,这里不能返回NULL,不然分不清是失败了还是返回了空表 + if(L == NULL) { + exit(ERROR); + } + + CopyGList(&p, L->Node.ptr.tp); + + return p; +} + +/* + * 插入 + * + * 将元素e插入为广义表L的第一个元素。 + */ +Status InsertFirst(GList* L, GList e) { + GList g; + + if(L == NULL) { + return ERROR; + } + + g = (GList) malloc(sizeof(GLNode)); + if(g == NULL) { + exit(OVERFLOW); + } + + g->tag = List; + g->Node.ptr.hp = e; + g->Node.ptr.tp = *L; + *L = g; + + return OK; +} + +/* + * 删除 + * + * 将广义表L的第一个元素删除,并用e返回。 + */ +Status DeleteFirst(GList* L, GList* e) { + GList p; + + // 空表无法删除 + if(L == NULL || *L == NULL) { + return ERROR; + } + + p = *L; + *L = (*L)->Node.ptr.tp; + + CopyGList(e, p->Node.ptr.hp); + + free(p); + + return OK; +} + +/* + * 遍历 + * + * 用visit函数访问广义表L。 + */ +void Traverse(GList L, void(Visit)(AtomType)) { + + if(L == NULL) { + return; + } + + if(L->tag == Atom) { + Visit(L->Node.atom); + } else { + Traverse(L->Node.ptr.hp, Visit); + Traverse(L->Node.ptr.tp, Visit); + } + +} + +/* + * 图形化输出 + * + * 带括号输出广义表L。 + */ +void PrintGraph(GList L) { + Print(L, Head); + printf("\n"); +} + +/* + * 图形化输出的内部实现,mark是图形化输出标记。 + */ +static void Print(GList L, Mark mark) { + // L为空 + if(L == NULL) { + if(mark == Head) { + printf("("); + } + + printf(")"); + + // L不为空时 + } else { + // 对于原子结点,输出原子 + if(L->tag == Atom) { + printf("%c", L->Node.atom); + + // 对于子表结点,要对表头、表尾分别讨论 + } else { + if(mark == Head) { + printf("("); + } else { + printf(","); + } + + Print(L->Node.ptr.hp, Head); + Print(L->Node.ptr.tp, Tail); + } + } +} + +/* + * ████████ 算法5.8 ████████ + * + * 将非空串str分割成两部分:hsub为第一个','之前的子串,str为第一个','之后的子串。 + * + *【注】 + * 1.这里假设字符串str输入正确,其中无空白符号,且str【已经脱去最外层括号】。 + * 2.分离完成后,str也会发生变化 + */ +static void sever(SString hstr, SString str) { + int i, k, n; + SString ch; + + n = StrLength(str); + + i = 0; // 遍历字符串时的游标 + k = 0; // 标记遇到的未配对括号数量 + + do { + ++i; + + // 截取str第一个字符 + SubString(ch, str, i, 1); + + if(ch[1] == '(') { + ++k; + } + + if(ch[1] == ')') { + --k; + } + } while(i < n && (ch[1] != ',' || k != 0)); + + // 如果存在多个广义表结点 + if(i < n) { + SubString(hstr, str, 1, i - 1); + SubString(str, str, i + 1, n - i); + + // 只有一个广义表结点 + } else { + StrCopy(hstr, str); + ClearString(str); + } +} diff --git a/CLion/ExerciseBook/05.32.1/GList-HT.h b/CLion/ExerciseBook/05.32.1/GList-HT.h new file mode 100644 index 0000000..07c0df2 --- /dev/null +++ b/CLion/ExerciseBook/05.32.1/GList-HT.h @@ -0,0 +1,164 @@ +/*============================ + * 广义表的头尾链表存储表示 + * + * 包含算法: 5.5、5.6、5.7、5.8 + =============================*/ + +#ifndef GLIST_HT_H +#define GLIST_HT_H + +#include +#include // 提供 malloc、realloc、free、exit 原型 +#include "Status.h" //**▲01 绪论**// +#include "SString.h" //**▲04 串**// + +/* 原子元素类型 */ +typedef char AtomType; + +/* + * 广义表结点标记 + * + * Atom-0:原子结点 + * List-1:表结点 + */ +typedef enum { Atom, List } ElemTag; + +/* 广义表(头尾链表存储表示)类型定义 */ +typedef struct GLNode { + ElemTag tag; // 公共标记,用于区分原子结点和表结点 + + // 原子结点和表结点的联合部分 + union { + AtomType atom; // atom是原子结点的值域,AtomType由用户定义 + struct { + struct GLNode* hp; // 指向表头 + struct GLNode* tp; // 指向表尾 + } ptr; // 表结点的指针域 + } Node; +} GLNode; + +/* 广义表类型 */ +typedef GLNode* GList; + +/* + * 图形化输出标记 + * + * Head代表广义表指针来自表头 + * Tail代表广义表指针来自表尾 + */ +typedef enum { Head, Tail } Mark; + + +/* + * 初始化 + * + * 初始化空的广义表,长度为0,深度为1。 + * + *【注】 + * 需要对每一层去掉括号考察 + */ +Status InitGList(GList* L); + +/* + * ████████ 算法5.7 ████████ + * + * 创建 + * + * 由字符串S创建广义表L。 + */ +Status CreateGList(GList* L, SString S); + +/* + * 销毁 + * + * 释放广义表所占内存。 + */ +Status DestroyGList(GList* L); + +/* + * ████████ 算法5.6 ████████ + * + * 复制 + * + * 由广义表L复制得到广义表T。 + */ +Status CopyGList(GList* T, GList L); + +/* + * 计数 + * + * 返回广义表的长度。 + */ +int GListLength(GList L); + +/* + * ████████ 算法5.5 ████████ + * + * 深度 + * + * 返回广义表的深度 + */ +int GListDepth(GList L); + +/* + * 判空 + * + * 判断广义表是否为空。 + */ +Status GListEmpty(GList L); + +/* + * 表头 + */ +GList GetHead(GList L); + +/* + * 表尾 + */ +GList GetTail(GList L); + +/* + * 插入 + * + * 将元素e插入为广义表L的第一个元素。 + */ +Status InsertFirst(GList* L, GList e); + +/* + * 删除 + * + * 将广义表L的第一个元素删除,并用e返回。 + */ +Status DeleteFirst(GList* L, GList* e); + +/* + * 遍历 + * + * 用visit函数访问广义表L。 + */ +void Traverse(GList L, void (Visit)(AtomType)); + +/* + * 图形化输出 + * + * 带括号输出广义表L。 + */ +void PrintGraph(GList L); + +/* + * 图形化输出的内部实现,mark是图形化输出标记。 + */ +static void Print(GList L, Mark mark); + +/* + * ████████ 算法5.8 ████████ + * + * 将非空串str分割成两部分:hsub为第一个','之前的子串,str为第一个','之后的子串。 + * + *【注】 + * 1.这里假设字符串str输入正确,其中无空白符号,且str【已经脱去最外层括号】。 + * 2.分离完成后,str也会发生变化 + */ +static void sever(SString hstr, SString str); + +#endif diff --git a/CLion/ExerciseBook/05.32.1/SString.c b/CLion/ExerciseBook/05.32.1/SString.c new file mode 100644 index 0000000..41d9e15 --- /dev/null +++ b/CLion/ExerciseBook/05.32.1/SString.c @@ -0,0 +1,195 @@ +/*============================= + * 串的定长顺序存储表示(顺序串) + * + * 包含算法: 4.1、4.2、4.3、4.5 + ==============================*/ + +#include "SString.h" //**▲04 串**// + +/* + * 初始化 + * + * 构造一个值为chars的串T。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status StrAssign(SString T, const char* chars) { + int i, len; + + len = (int) strlen(chars); + + // chars过长 + if(len > MAXSTRLEN) { + return ERROR; + } + + T[0] = len; + for(i = 1; i <= len; i++) { + T[i] = chars[i - 1]; + } + + return OK; +} + +/* + * 清空 + * + * 将串S清空。 + */ +Status ClearString(SString S) { + // 只需要将长度置为0就可以 + S[0] = 0; + return OK; +} + +/* + * 判空 + * + * 判断串S中是否包含有效数据。 + * + * 返回值: + * TRUE : 串S为空 + * FALSE: 串S不为空 + */ +Status StrEmpty(SString S) { + return S[0] == 0 ? TRUE : FALSE; +} + +/* + * 计数 + * + * 返回串S中元素的个数。 + * + *【注】 + * 该操作属于最小操作子集 + */ +int StrLength(SString S) { + return S[0]; +} + +/* + * ████████ 算法4.3 ████████ + * + * 求子串 + * + * 用Sub返回S[pos, pos+len-1]。 + * 返回值指示是否截取成功。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status SubString(SString Sub, SString S, int pos, int len) { + int i; + + if(pos < 1 || pos > S[0] || len < 0 || pos + len - 1 > S[0]) { + return ERROR; + } + + // 复制元素 + for(i = 1; i <= len; i++) { + Sub[i] = S[pos + i - 1]; + } + + // 确定新长度 + Sub[0] = len; + + return OK; +} + +/* + * 删除 + * + * 删除S[pos, pos+len-1]。 + */ +Status StrDelete(SString S, int pos, int len) { + int i; + + if(pos < 1 || pos + len - 1 > S[0] || len < 0) { + return ERROR; + } + + // 如果待删除的长度为0,则提前返回 + if(len == 0) { + return OK; + } + + // 把后面的元素挪到前面,覆盖掉被删除的元素 + for(i = pos + len; i <= S[0]; i++) { + S[i - len] = S[i]; + } + + // 长度减少 + S[0] -= len; + + return OK; +} + +/* + * 比较 + * + * 比较串S和串T,返回比较结果。 + * + *【注】 + * 该操作属于最小操作子集 + */ +int StrCompare(SString S, SString T) { + int i = 1; + + while(i <= S[0] && i <= T[0]) { + // 遇到不同的字符时,比较其大小 + if(S[i] != T[i]) { + return S[i] - T[i]; + } + + i++; + } + + return S[0] - T[0]; +} + +/* + * 复制 + * + * 将串S复制到串T。 + */ +Status StrCopy(SString T, SString S) { + int i; + + // 连同长度信息一起复制 + for(i = 0; i <= S[0]; i++) { + T[i] = S[i]; + } + + return OK; +} + +/* + * 清理字符串S中的空白,包括清理不可打印字符和清理空格。 + * + *【注】 + * 该函数是在本章中新增的。 + */ +Status ClearBlank(SString S) { + int i, j; + + // 如果是空串 + if(S[0] == 0) { + return ERROR; + } + + for(i = 1, j = 0; i <= S[0]; i++) { + // 如果遇到空白,则略过 + if(S[i] == ' ' || !isprint(S[i])) { + continue; + } + + j++; + + S[j] = S[i]; + } + + S[0] = j; + + return OK; +} diff --git a/CLion/ExerciseBook/05.32.1/SString.h b/CLion/ExerciseBook/05.32.1/SString.h new file mode 100644 index 0000000..e81ca79 --- /dev/null +++ b/CLion/ExerciseBook/05.32.1/SString.h @@ -0,0 +1,117 @@ +/*============================= + * 串的定长顺序存储表示(顺序串) + * + * 包含算法: 4.1、4.2、4.3、4.5 + ==============================*/ + +#ifndef SSTRING_H +#define SSTRING_H + +#include +#include // 提供 strlen 原型 +#include // 提供 isprint 原型 +#include "Status.h" //**▲01 绪论**// + +/* 宏定义 */ +#define MAXSTRLEN 255 // 顺序串的最大串长 + +/* + * 串的顺序存储类型定义 + * + * 注:有效元素从SString的1号单元开始存储 + * SString的0号单元用来存储其长度 + */ +typedef unsigned char SString[MAXSTRLEN + 1]; // 0号单元存放串的长度 + + +/* + * ████ 提示 ████ + * + * 遵循教材的书写习惯,pos指示字符的位序(不是索引),从1开始计数 + */ + + +/* + * 初始化 + * + * 构造一个值为chars的串T。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status StrAssign(SString T, const char* chars); + +/* + * 清空 + * + * 将串S清空。 + */ +Status ClearString(SString S); + +/* + * 判空 + * + * 判断串S中是否包含有效数据。 + * + * 返回值: + * TRUE : 串S为空 + * FALSE: 串S不为空 + */ +Status StrEmpty(SString S); + +/* + * 计数 + * + * 返回串S中元素的个数。 + * + *【注】 + * 该操作属于最小操作子集 + */ +int StrLength(SString S); + +/* + * ████████ 算法4.3 ████████ + * + * 求子串 + * + * 用Sub返回S[pos, pos+len-1]。 + * 返回值指示是否截取成功。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status SubString(SString Sub, SString S, int pos, int len); + +/* + * 删除 + * + * 删除S[pos, pos+len-1]。 + */ +Status StrDelete(SString S, int pos, int len); + +/* + * 比较 + * + * 比较串S和串T,返回比较结果。 + * + *【注】 + * 该操作属于最小操作子集 + */ +int StrCompare(SString S, SString T); + +/* + * 复制 + * + * 将串S复制到串T。 + */ +Status StrCopy(SString T, SString S); + +/* + * 清理字符串S中的空白,包括清理不可打印字符和清理空格。 + * + *【注】 + * 该函数是在本章中新增的。 + */ +Status ClearBlank(SString S); + +#endif diff --git a/CLion/ExerciseBook/05.32.2/05.32.2.c b/CLion/ExerciseBook/05.32.2/05.32.2.c new file mode 100644 index 0000000..8b0377b --- /dev/null +++ b/CLion/ExerciseBook/05.32.2/05.32.2.c @@ -0,0 +1,66 @@ +#include +#include "Status.h" //**▲01 绪论**// +#include "SString.h" //**▲04 串**// +#include "GList-E.h" //**▲05 数组和广义表**// + +/* + * 判断广义表是否相等(扩展线性链表存储表示) + */ +Status Algo_5_32_2(GList A, GList B); + + +int main(int argc, char* argv[]) { + GList A, B; + char* a = "((),(e),(a,(b,c,d)))"; + char* b = "((),(e),(a,(b,c,f)))"; + SString Sa, Sb; + + printf("创建广义表 A、B ...\n"); + StrAssign(Sa, a); + CreateGList(&A, Sa); + StrAssign(Sb, b); + CreateGList(&B, Sb); + printf("A = "); + PrintGraph(A); + printf("B = "); + PrintGraph(B); + + Algo_5_32_2(A, B) ? printf("两广义表相等!\n") : printf("两广义表不相等!!\n"); + + return 0; +} + + +/* + * 判断广义表是否相等(扩展线性链表存储表示) + */ +Status Algo_5_32_2(GList A, GList B) { + if(!A && !B) { + return TRUE; // 两个空表相等 + } + + // 两个表均不为空 + if(A && B) { + // 元素类型相同 + if(A->tag == B->tag) { + // 原子结点 + if(A->tag == Atom) { + if(A->Node.atom == B->Node.atom) { + if(Algo_5_32_2(A->tp, B->tp) == TRUE) { + return TRUE; + } + } + + // 表结点 + } else { + if(Algo_5_32_2(A->Node.hp, B->Node.hp) == TRUE) { + if(Algo_5_32_2(A->tp, B->tp) == TRUE) { + return TRUE; + } + } + } + } + } + + return FALSE; +} diff --git a/CLion/ExerciseBook/05.32.2/CMakeLists.txt b/CLion/ExerciseBook/05.32.2/CMakeLists.txt new file mode 100644 index 0000000..019b9b9 --- /dev/null +++ b/CLion/ExerciseBook/05.32.2/CMakeLists.txt @@ -0,0 +1,7 @@ +# 包含公共库 +include_directories(${CMAKE_SOURCE_DIR}/Status) + +# 生成可执行文件 +add_executable(05.32.2 SString.h SString.c GList-E.h GList-E.c 05.32.2.c) +# 链接公共库 +target_link_libraries(05.32.2 Scanf_lib) \ No newline at end of file diff --git a/CLion/ExerciseBook/05.32.2/GList-E.c b/CLion/ExerciseBook/05.32.2/GList-E.c new file mode 100644 index 0000000..d994024 --- /dev/null +++ b/CLion/ExerciseBook/05.32.2/GList-E.c @@ -0,0 +1,449 @@ +/*=========================== + * 广义表的扩展线性链表存储表示 + ============================*/ + +#include "GList-E.h" //**▲05 数组和广义表**// + +/* + * 初始化 + * + * 初始化空的广义表,长度为0,深度为1。 + * + *【注】 + * 需要对每一层带上括号考察 + */ +Status InitGList(GList* L) { + if(L == NULL) { + return ERROR; + } + + *L = (GList) malloc(sizeof(GLNode)); + if(!*L) { + exit(OVERFLOW); + } + + (*L)->tag = List; + (*L)->Node.hp = NULL; + (*L)->tp = NULL; + + return OK; +} + +/* + * 创建 + * + * 由字符串S创建广义表L。 + */ +Status CreateGList(GList* L, SString S) { + SString emp, hsub, sub, tmp; + + if(L == NULL) { + return ERROR; + } + + // 清理字符串S中的空白,包括清理不可打印字符和清理空格 + ClearBlank(S); + + if(StrEmpty(S)) { + return ERROR; + } + + // 复制是为了不破坏S + StrCopy(sub, S); + + /* + * 初次执行到此时,带着最外层的括号 + * 再次执行到此时,已经脱去了外层括号 + */ + sever(hsub, sub); + + *L = (GList) malloc(sizeof(GLNode)); + if(*L == NULL) { + exit(OVERFLOW); + } + + StrAssign(emp, "()"); + + if(!StrCompare(hsub, emp)) { + (*L)->tag = List; + (*L)->Node.hp = NULL; + } else { + if(StrLength(hsub) == 1) { + (*L)->tag = Atom; + (*L)->Node.atom = hsub[1]; + } else { + (*L)->tag = List; + + SubString(tmp, hsub, 2, StrLength(hsub) - 2); + + CreateGList(&((*L)->Node.hp), tmp); + } + } + + // 如果不存在队尾,则退出本层递归 + if(StrEmpty(sub)) { + (*L)->tp = NULL; + } else { + // 继续递归求表尾 + CreateGList(&((*L)->tp), sub); + } + + return OK; +} + +/* + * 销毁 + * + * 释放广义表所占内存。 + */ +Status DestroyGList(GList* L) { + GList head, tail; + + if(L == NULL || *L == NULL) { + return ERROR; + } + + // 处理子表结点 + if((*L)->tag == List) { + head = (*L)->Node.hp; // 表头 + tail = (*L)->tp; // 表尾 + + free(*L); + *L = NULL; + + // 递归处理表头 + if(head != NULL) { + DestroyGList(&head); + } + + // 递归处理表尾 + if(tail != NULL) { + DestroyGList(&tail); + } + + // 处理原子结点 + } else { + tail = (*L)->tp; // 表尾 + + free(*L); + *L = NULL; + + if(tail != NULL) { + DestroyGList(&tail); + } + } + + return OK; +} + +/* + * 复制 + * + * 由广义表L复制得到广义表T。 + */ +Status CopyGList(GList* T, GList L) { + + if(L == NULL) { + return ERROR; + } + + *T = (GList) malloc(sizeof(GLNode)); + if(*T == NULL) { + exit(OVERFLOW); + } + + // 复制原子 + if(L->tag == Atom) { + (*T)->tag = Atom; + (*T)->Node.atom = L->Node.atom; + + // 复制子表 + } else { + (*T)->tag = List; + + // 复制表头 + if(L->Node.hp != NULL) { + CopyGList(&((*T)->Node.hp), L->Node.hp); + } else { + (*T)->Node.hp = NULL; + } + } + + // 复制表尾 + if(L->tp != NULL) { + CopyGList(&((*T)->tp), L->tp); + } else { + (*T)->tp = NULL; + } + + return OK; +} + +/* + * 计数 + * + * 返回广义表的长度。 + */ +int GListLength(GList L) { + int count = 0; + GList p; + + // 广义表不存在 + if(L == NULL) { + return -1; + } + + p = L->Node.hp; + + while(p != NULL) { + ++count; + p = p->tp; + } + + return count; +} + +/* + * 深度 + * + * 返回广义表的深度 + */ +int GListDepth(GList L) { + int max, deep; + GList p; + + max = 0; + + // 广义表不存在 + if(L == NULL) { + return -1; + } + + // 空表深度为1 + if(L->tag == List && !L->Node.hp) { + return 1; + } + + // 原子深度为0 + if(L->tag == Atom) { + return 0; + } + + // 递归求子表深度 + for(p = L->Node.hp; p != NULL; p = p->tp) { + // 求以p为头指针的子表深度 + deep = GListDepth(p); + if(deep > max) { + max = deep; + } + } + + return max + 1; +} + +/* + * 判空 + * + * 判断广义表是否为空。 + */ +Status GListEmpty(GList L) { + // 广义表不存在 + if(L == NULL) { + return ERROR; + } + + if(L->tag == List && L->Node.hp == NULL && L->tp == NULL) { + return TRUE; + } else { + return ERROR; + } +} + +/* + * 表头 + */ +GList GetHead(GList L) { + GList p, q; + + // 广义表不存在或广义表为空表,无法获取表头 + if(L == NULL || L->Node.hp == NULL) { + return NULL; + } + + q = L->Node.hp->tp; // 临时保存L的表尾信息 + L->Node.hp->tp = NULL; // 截去L的表尾部分 + + CopyGList(&p, L->Node.hp); // 复制表头信息(已屏蔽表尾) + + L->Node.hp->tp = q; // 恢复L的表尾信息 + + return p; +} + +/* + * 表尾 + */ +GList GetTail(GList L) { + GList p, q; + + // 广义表不存在或广义表为空表,无法获取表尾 + if(L == NULL || L->Node.hp == NULL) { + return NULL; + } + + q = L->Node.hp; // 临时保存L的表头信息 + L->Node.hp = q->tp; // 摘下L的表头部分 + + CopyGList(&p, L); // 复制表尾信息(已屏蔽表头) + + q->tp = L->Node.hp; // 恢复L的表头信息 + L->Node.hp = q; + + return p; +} + +/* + * 插入 + * + * 将元素e插入为广义表L的第一个元素。 + */ +Status InsertFirst(GList* L, GList e) { + + // 广义表不存在 + if(L == NULL || *L == NULL) { + return ERROR; + } + + if(e == NULL) { + return ERROR; + } + + e->tp = (*L)->Node.hp; + (*L)->Node.hp = e; + + return OK; +} + +/* + * 删除 + * + * 将广义表L的第一个元素删除,并用e返回。 + */ +Status DeleteFirst(GList* L, GList* e) { + GList p; + + // 广义表不存在或广义表为空表,则无法删除表头 + if(*L == NULL || (*L)->Node.hp == NULL) { + return ERROR; + } + + p = (*L)->Node.hp; + (*L)->Node.hp = p->tp; + p->tp = NULL; + + *e = p; + + return OK; +} + +/* + * 遍历 + * + * 用visit函数访问广义表L。 + */ +void Traverse(GList L, void(Visit)(AtomType)) { + if(L == NULL) { + return; + } + + if(L->tag == List) { + Traverse(L->Node.hp, Visit); + } else { + Visit(L->Node.atom); + } + + Traverse(L->tp, Visit); +} + +/* + * 图形化输出 + * + * 带括号输出广义表L。 + */ +void PrintGraph(GList L) { + Print(L); + printf("\n"); +} + +/* + * 图形化输出的内部实现。 + */ +static void Print(GList L) { + if(L == NULL) { + return; + } + + // 处理表结点 + if(L->tag == List) { + printf("("); + + if(L->Node.hp) { + Print(L->Node.hp); + } + + if(L->tp) { + printf("),"); + Print(L->tp); + } else { + printf(")"); + } + + // 处理原子结点 + } else { + printf("%c", L->Node.atom); + if(L->tp) { + printf(","); + Print(L->tp); + } + } +} + +/* + * 将非空串str分割成两部分:hsub为第一个','之前的子串,str为第一个','之后的子串。 + * + *【注】 + * 1.这里假设字符串str输入正确,其中无空白符号, + * 但str外层的括号可能脱去,也可能未脱去。 + * 2.分离完成后,str也会发生变化 + */ +static void sever(SString hstr, SString str) { + int i, k, n; + SString ch; + + n = StrLength(str); + + i = 0; // 遍历字符串时的游标 + k = 0; // 标记遇到的未配对括号数量 + + do { + ++i; + + // 截取str第一个字符 + SubString(ch, str, i, 1); + + if(ch[1] == '(') { + ++k; + } + if(ch[1] == ')') { + --k; + } + } while(i < n && (ch[1] != ',' || k != 0)); + + if(i < n) { + SubString(hstr, str, 1, i - 1); + SubString(str, str, i + 1, n - i); + } else { + StrCopy(hstr, str); + ClearString(str); + } +} diff --git a/CLion/ExerciseBook/05.32.2/GList-E.h b/CLion/ExerciseBook/05.32.2/GList-E.h new file mode 100644 index 0000000..5e5b625 --- /dev/null +++ b/CLion/ExerciseBook/05.32.2/GList-E.h @@ -0,0 +1,146 @@ +/*=========================== + * 广义表的扩展线性链表存储表示 + ============================*/ + +#ifndef GLIST_E_H +#define GLIST_E_H + +#include +#include // 提供 malloc、realloc、free、exit 原型 +#include "Status.h" //**▲01 绪论**// +#include "SString.h" //**▲04 串**// + +/* 原子元素类型 */ +typedef char AtomType; //原子类型 + +/* + * 广义表结点标记 + * + * Atom-0:原子结点 + * List-1:表结点 + */ +typedef enum { Atom, List } ElemTag; + +/* 广义表(扩展线性链表存储表示)类型定义 */ +typedef struct GLNode { + ElemTag tag; // 公共标记,用于区分原子结点和表结点 + + // 原子结点和表结点的联合部分 + union + { + AtomType atom; // atom是原子结点的值域,AtomType由用户定义 + struct GLNode* hp; // 指向表头 + } Node; + struct GLNode* tp; // 指向表尾 +} GLNode; + +/* 广义表类型 */ +typedef GLNode* GList; + + +/* + * 初始化 + * + * 初始化空的广义表,长度为0,深度为1。 + * + *【注】 + * 需要对每一层带上括号考察 + */ +Status InitGList(GList* L); + +/* + * 创建 + * + * 由字符串S创建广义表L。 + */ +Status CreateGList(GList* L, SString S); + +/* + * 销毁 + * + * 释放广义表所占内存。 + */ +Status DestroyGList(GList* L); + +/* + * 复制 + * + * 由广义表L复制得到广义表T。 + */ +Status CopyGList(GList* T, GList L); + +/* + * 计数 + * + * 返回广义表的长度。 + */ +int GListLength(GList L); + +/* + * 深度 + * + * 返回广义表的深度 + */ +int GListDepth(GList L); + +/* + * 判空 + * + * 判断广义表是否为空。 + */ +Status GListEmpty(GList L); + +/* + * 表头 + */ +GList GetHead(GList L); + +/* + * 表尾 + */ +GList GetTail(GList L); + +/* + * 插入 + * + * 将元素e插入为广义表L的第一个元素。 + */ +Status InsertFirst(GList* L, GList e); + +/* + * 删除 + * + * 将广义表L的第一个元素删除,并用e返回。 + */ +Status DeleteFirst(GList* L, GList* e); + +/* + * 遍历 + * + * 用visit函数访问广义表L。 + */ +void Traverse(GList L, void(Visit)(AtomType)); + +/* + * 图形化输出 + * + * 带括号输出广义表L。 + */ +void PrintGraph(GList L); + +/* + * 图形化输出的内部实现。 + */ +static void Print(GList L); + +/* + * 将非空串str分割成两部分:hsub为第一个','之前的子串,str为第一个','之后的子串。 + * + *【注】 + * 1.这里假设字符串str输入正确,其中无空白符号, + * 但str外层的括号可能脱去,也可能未脱去。 + * 2.分离完成后,str也会发生变化 + */ +static void sever(SString hstr, SString str); + +#endif diff --git a/CLion/ExerciseBook/05.32.2/SString.c b/CLion/ExerciseBook/05.32.2/SString.c new file mode 100644 index 0000000..41d9e15 --- /dev/null +++ b/CLion/ExerciseBook/05.32.2/SString.c @@ -0,0 +1,195 @@ +/*============================= + * 串的定长顺序存储表示(顺序串) + * + * 包含算法: 4.1、4.2、4.3、4.5 + ==============================*/ + +#include "SString.h" //**▲04 串**// + +/* + * 初始化 + * + * 构造一个值为chars的串T。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status StrAssign(SString T, const char* chars) { + int i, len; + + len = (int) strlen(chars); + + // chars过长 + if(len > MAXSTRLEN) { + return ERROR; + } + + T[0] = len; + for(i = 1; i <= len; i++) { + T[i] = chars[i - 1]; + } + + return OK; +} + +/* + * 清空 + * + * 将串S清空。 + */ +Status ClearString(SString S) { + // 只需要将长度置为0就可以 + S[0] = 0; + return OK; +} + +/* + * 判空 + * + * 判断串S中是否包含有效数据。 + * + * 返回值: + * TRUE : 串S为空 + * FALSE: 串S不为空 + */ +Status StrEmpty(SString S) { + return S[0] == 0 ? TRUE : FALSE; +} + +/* + * 计数 + * + * 返回串S中元素的个数。 + * + *【注】 + * 该操作属于最小操作子集 + */ +int StrLength(SString S) { + return S[0]; +} + +/* + * ████████ 算法4.3 ████████ + * + * 求子串 + * + * 用Sub返回S[pos, pos+len-1]。 + * 返回值指示是否截取成功。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status SubString(SString Sub, SString S, int pos, int len) { + int i; + + if(pos < 1 || pos > S[0] || len < 0 || pos + len - 1 > S[0]) { + return ERROR; + } + + // 复制元素 + for(i = 1; i <= len; i++) { + Sub[i] = S[pos + i - 1]; + } + + // 确定新长度 + Sub[0] = len; + + return OK; +} + +/* + * 删除 + * + * 删除S[pos, pos+len-1]。 + */ +Status StrDelete(SString S, int pos, int len) { + int i; + + if(pos < 1 || pos + len - 1 > S[0] || len < 0) { + return ERROR; + } + + // 如果待删除的长度为0,则提前返回 + if(len == 0) { + return OK; + } + + // 把后面的元素挪到前面,覆盖掉被删除的元素 + for(i = pos + len; i <= S[0]; i++) { + S[i - len] = S[i]; + } + + // 长度减少 + S[0] -= len; + + return OK; +} + +/* + * 比较 + * + * 比较串S和串T,返回比较结果。 + * + *【注】 + * 该操作属于最小操作子集 + */ +int StrCompare(SString S, SString T) { + int i = 1; + + while(i <= S[0] && i <= T[0]) { + // 遇到不同的字符时,比较其大小 + if(S[i] != T[i]) { + return S[i] - T[i]; + } + + i++; + } + + return S[0] - T[0]; +} + +/* + * 复制 + * + * 将串S复制到串T。 + */ +Status StrCopy(SString T, SString S) { + int i; + + // 连同长度信息一起复制 + for(i = 0; i <= S[0]; i++) { + T[i] = S[i]; + } + + return OK; +} + +/* + * 清理字符串S中的空白,包括清理不可打印字符和清理空格。 + * + *【注】 + * 该函数是在本章中新增的。 + */ +Status ClearBlank(SString S) { + int i, j; + + // 如果是空串 + if(S[0] == 0) { + return ERROR; + } + + for(i = 1, j = 0; i <= S[0]; i++) { + // 如果遇到空白,则略过 + if(S[i] == ' ' || !isprint(S[i])) { + continue; + } + + j++; + + S[j] = S[i]; + } + + S[0] = j; + + return OK; +} diff --git a/CLion/ExerciseBook/05.32.2/SString.h b/CLion/ExerciseBook/05.32.2/SString.h new file mode 100644 index 0000000..e81ca79 --- /dev/null +++ b/CLion/ExerciseBook/05.32.2/SString.h @@ -0,0 +1,117 @@ +/*============================= + * 串的定长顺序存储表示(顺序串) + * + * 包含算法: 4.1、4.2、4.3、4.5 + ==============================*/ + +#ifndef SSTRING_H +#define SSTRING_H + +#include +#include // 提供 strlen 原型 +#include // 提供 isprint 原型 +#include "Status.h" //**▲01 绪论**// + +/* 宏定义 */ +#define MAXSTRLEN 255 // 顺序串的最大串长 + +/* + * 串的顺序存储类型定义 + * + * 注:有效元素从SString的1号单元开始存储 + * SString的0号单元用来存储其长度 + */ +typedef unsigned char SString[MAXSTRLEN + 1]; // 0号单元存放串的长度 + + +/* + * ████ 提示 ████ + * + * 遵循教材的书写习惯,pos指示字符的位序(不是索引),从1开始计数 + */ + + +/* + * 初始化 + * + * 构造一个值为chars的串T。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status StrAssign(SString T, const char* chars); + +/* + * 清空 + * + * 将串S清空。 + */ +Status ClearString(SString S); + +/* + * 判空 + * + * 判断串S中是否包含有效数据。 + * + * 返回值: + * TRUE : 串S为空 + * FALSE: 串S不为空 + */ +Status StrEmpty(SString S); + +/* + * 计数 + * + * 返回串S中元素的个数。 + * + *【注】 + * 该操作属于最小操作子集 + */ +int StrLength(SString S); + +/* + * ████████ 算法4.3 ████████ + * + * 求子串 + * + * 用Sub返回S[pos, pos+len-1]。 + * 返回值指示是否截取成功。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status SubString(SString Sub, SString S, int pos, int len); + +/* + * 删除 + * + * 删除S[pos, pos+len-1]。 + */ +Status StrDelete(SString S, int pos, int len); + +/* + * 比较 + * + * 比较串S和串T,返回比较结果。 + * + *【注】 + * 该操作属于最小操作子集 + */ +int StrCompare(SString S, SString T); + +/* + * 复制 + * + * 将串S复制到串T。 + */ +Status StrCopy(SString T, SString S); + +/* + * 清理字符串S中的空白,包括清理不可打印字符和清理空格。 + * + *【注】 + * 该函数是在本章中新增的。 + */ +Status ClearBlank(SString S); + +#endif diff --git a/CLion/ExerciseBook/05.33.1/05.33.1.c b/CLion/ExerciseBook/05.33.1/05.33.1.c new file mode 100644 index 0000000..a35f1e4 --- /dev/null +++ b/CLion/ExerciseBook/05.33.1/05.33.1.c @@ -0,0 +1,47 @@ +#include +#include "SString.h" //**▲04 串**// +#include "GList-HT.h" //**▲05 数组和广义表**// + +/* + * 输出广义表中所有原子项及其所在层次(头尾链表存储表示) + */ +void Algo_5_33_1(GList L, int d); + + +int main(int argc, char* argv[]) { + GList L; + char* s = "((),(e),(a,(b,c,d)))"; + SString S; + + printf("创建广义表 L ...\n"); + StrAssign(S, s); + CreateGList(&L, S); + printf("L = "); + PrintGraph(L); + + Algo_5_33_1(L, 0); + + return 0; +} + + +/* + * 输出广义表中所有原子项及其所在层次(头尾链表存储表示) + */ +void Algo_5_33_1(GList L, int d) { + int i = d; // d的初值赋值为0 + + if(L == NULL) { + return; + } + + if(L->tag == Atom) { + printf("%c -> 第%d层\n", L->Node.atom, i); + } + + // 表头指针指向表的话层数增一 + if(L->tag == List) { + Algo_5_33_1(L->Node.ptr.hp, i + 1); + Algo_5_33_1(L->Node.ptr.tp, i); + } +} diff --git a/CLion/ExerciseBook/05.33.1/CMakeLists.txt b/CLion/ExerciseBook/05.33.1/CMakeLists.txt new file mode 100644 index 0000000..eac9fba --- /dev/null +++ b/CLion/ExerciseBook/05.33.1/CMakeLists.txt @@ -0,0 +1,7 @@ +# 包含公共库 +include_directories(${CMAKE_SOURCE_DIR}/Status) + +# 生成可执行文件 +add_executable(05.33.1 SString.h SString.c GList-HT.h GList-HT.c 05.33.1.c) +# 链接公共库 +target_link_libraries(05.33.1 Scanf_lib) \ No newline at end of file diff --git a/CLion/ExerciseBook/05.33.1/GList-HT.c b/CLion/ExerciseBook/05.33.1/GList-HT.c new file mode 100644 index 0000000..ddf2766 --- /dev/null +++ b/CLion/ExerciseBook/05.33.1/GList-HT.c @@ -0,0 +1,418 @@ +/*============================ + * 广义表的头尾链表存储表示 + * + * 包含算法: 5.5、5.6、5.7、5.8 + =============================*/ + +#include "GList-HT.h" //**▲05 数组和广义表**// + +/* + * 初始化 + * + * 初始化空的广义表,长度为0,深度为1。 + * + *【注】 + * 需要对每一层去掉括号考察 + */ +Status InitGList(GList* L) { + if(L == NULL) { + return ERROR; + } + + *L = NULL; + + return OK; +} + +/* + * ████████ 算法5.7 ████████ + * + * 创建 + * + * 由字符串S创建广义表L。 + */ +Status CreateGList(GList* L, SString S) { + SString emp; // 代表空广义表的字符串 + SString hsub, sub; + GList p, q; + + if(L == NULL) { + return ERROR; + } + + // 清理字符串S中的空白,包括清理不可打印字符和清理空格 + ClearBlank(S); + + if(StrEmpty(S)) { + return ERROR; + } + + StrAssign(emp, "()"); + + /* + * 如果输入串为(),则代表需要创建空的广义表 + * + *【注】 + * 教材这里的代码是有问题的。 + * StrCompare的返回值指示的是两个字符串的大小,而不是指示两个字符串是否相等。 + * 如果给定的S与()相等,返回值应当是0。 + */ + if(!StrCompare(S, emp)) { + *L = NULL; + } else { + *L = (GList) malloc(sizeof(GLNode)); + if(*L == NULL) { + exit(OVERFLOW); + } + + // 创建原子 + if(StrLength(S) == 1) { + (*L)->tag = Atom; + (*L)->Node.atom = S[1]; + } else { + (*L)->tag = List; + + p = *L; + + // 去掉最外层括号 + SubString(sub, S, 2, StrLength(S) - 2); + + // 重复建n个子表 + do { + // 从sub中分离出表头串hsub,分离完成后,sub也会发生变化 + sever(hsub, sub); + + // 递归创建广义表 + CreateGList(&(p->Node.ptr.hp), hsub); + + q = p; + + // 如果表尾不为空,需要继续处理表尾 + if(!StrEmpty(sub)) { + p = (GList) malloc(sizeof(GLNode)); + if(p == NULL) { + exit(OVERFLOW); + } + + p->tag = List; + + q->Node.ptr.tp = p; + } + } while(!StrEmpty(sub)); + + q->Node.ptr.tp = NULL; + } + } + + return OK; +} + +/* + * 销毁 + * + * 释放广义表所占内存。 + */ +Status DestroyGList(GList* L) { + GList head, tail; + + if(L == NULL || *L == NULL) { + return ERROR; + } + + // 删除原子结点 + if((*L)->tag == Atom) { + free(*L); + *L = NULL; + + // 删除子表结点 + } else { + head = (*L)->Node.ptr.hp; + tail = (*L)->Node.ptr.tp; + free(*L); + *L = NULL; + DestroyGList(&head); + DestroyGList(&tail); + } + + return OK; +} + +/* + * ████████ 算法5.6 ████████ + * + * 复制 + * + * 由广义表L复制得到广义表T。 + */ +Status CopyGList(GList* T, GList L) { + if(T == NULL) { + return ERROR; + } + + if(L == NULL) { + *T = NULL; + } else { + // 新建广义表结点 + *T = (GList) malloc(sizeof(GLNode)); + if(*T == NULL) { + exit(OVERFLOW); + } + + (*T)->tag = L->tag; + + // 复制单原子 + if(L->tag == Atom) { + (*T)->Node.atom = L->Node.atom; + + // 复制表头和表尾 + } else { + CopyGList(&((*T)->Node.ptr.hp), L->Node.ptr.hp); + CopyGList(&((*T)->Node.ptr.tp), L->Node.ptr.tp); + } + } + + return OK; +} + +/* + * 计数 + * + * 返回广义表的长度。 + */ +int GListLength(GList L) { + int count; + + for(count = 0; L != NULL; count++, L = L->Node.ptr.tp) { + } + + return count; +} + +/* + * ████████ 算法5.5 ████████ + * + * 深度 + * + * 返回广义表的深度 + */ +int GListDepth(GList L) { + int max, deep; + GList p; + + // 空表深度为1 + if(L == NULL) { + return 1; + } + + // 原子深度为0 + if(L->tag == Atom) { + return 0; + } + + // 递归求子表深度 + for(max = 0, p = L; p != NULL; p = p->Node.ptr.tp) { + deep = GListDepth(p->Node.ptr.hp); + if(deep > max) { + max = deep; + } + } + + // 非空表的深度是各子元素最大深度加一 + return max + 1; +} + +/* + * 判空 + * + * 判断广义表是否为空。 + */ +Status GListEmpty(GList L) { + return L == NULL ? TRUE : FALSE; +} + +/* + * 表头 + */ +GList GetHead(GList L) { + GList p; + + // 空表无表头,这里不能返回NULL,不然分不清是失败了还是返回了空表 + if(L == NULL) { + exit(ERROR); + } + + CopyGList(&p, L->Node.ptr.hp); + + return p; +} + +/* + * 表尾 + */ +GList GetTail(GList L) { + GList p; + + // 空表无表尾,这里不能返回NULL,不然分不清是失败了还是返回了空表 + if(L == NULL) { + exit(ERROR); + } + + CopyGList(&p, L->Node.ptr.tp); + + return p; +} + +/* + * 插入 + * + * 将元素e插入为广义表L的第一个元素。 + */ +Status InsertFirst(GList* L, GList e) { + GList g; + + if(L == NULL) { + return ERROR; + } + + g = (GList) malloc(sizeof(GLNode)); + if(g == NULL) { + exit(OVERFLOW); + } + + g->tag = List; + g->Node.ptr.hp = e; + g->Node.ptr.tp = *L; + *L = g; + + return OK; +} + +/* + * 删除 + * + * 将广义表L的第一个元素删除,并用e返回。 + */ +Status DeleteFirst(GList* L, GList* e) { + GList p; + + // 空表无法删除 + if(L == NULL || *L == NULL) { + return ERROR; + } + + p = *L; + *L = (*L)->Node.ptr.tp; + + CopyGList(e, p->Node.ptr.hp); + + free(p); + + return OK; +} + +/* + * 遍历 + * + * 用visit函数访问广义表L。 + */ +void Traverse(GList L, void(Visit)(AtomType)) { + + if(L == NULL) { + return; + } + + if(L->tag == Atom) { + Visit(L->Node.atom); + } else { + Traverse(L->Node.ptr.hp, Visit); + Traverse(L->Node.ptr.tp, Visit); + } + +} + +/* + * 图形化输出 + * + * 带括号输出广义表L。 + */ +void PrintGraph(GList L) { + Print(L, Head); + printf("\n"); +} + +/* + * 图形化输出的内部实现,mark是图形化输出标记。 + */ +static void Print(GList L, Mark mark) { + // L为空 + if(L == NULL) { + if(mark == Head) { + printf("("); + } + + printf(")"); + + // L不为空时 + } else { + // 对于原子结点,输出原子 + if(L->tag == Atom) { + printf("%c", L->Node.atom); + + // 对于子表结点,要对表头、表尾分别讨论 + } else { + if(mark == Head) { + printf("("); + } else { + printf(","); + } + + Print(L->Node.ptr.hp, Head); + Print(L->Node.ptr.tp, Tail); + } + } +} + +/* + * ████████ 算法5.8 ████████ + * + * 将非空串str分割成两部分:hsub为第一个','之前的子串,str为第一个','之后的子串。 + * + *【注】 + * 1.这里假设字符串str输入正确,其中无空白符号,且str【已经脱去最外层括号】。 + * 2.分离完成后,str也会发生变化 + */ +static void sever(SString hstr, SString str) { + int i, k, n; + SString ch; + + n = StrLength(str); + + i = 0; // 遍历字符串时的游标 + k = 0; // 标记遇到的未配对括号数量 + + do { + ++i; + + // 截取str第一个字符 + SubString(ch, str, i, 1); + + if(ch[1] == '(') { + ++k; + } + + if(ch[1] == ')') { + --k; + } + } while(i < n && (ch[1] != ',' || k != 0)); + + // 如果存在多个广义表结点 + if(i < n) { + SubString(hstr, str, 1, i - 1); + SubString(str, str, i + 1, n - i); + + // 只有一个广义表结点 + } else { + StrCopy(hstr, str); + ClearString(str); + } +} diff --git a/CLion/ExerciseBook/05.33.1/GList-HT.h b/CLion/ExerciseBook/05.33.1/GList-HT.h new file mode 100644 index 0000000..07c0df2 --- /dev/null +++ b/CLion/ExerciseBook/05.33.1/GList-HT.h @@ -0,0 +1,164 @@ +/*============================ + * 广义表的头尾链表存储表示 + * + * 包含算法: 5.5、5.6、5.7、5.8 + =============================*/ + +#ifndef GLIST_HT_H +#define GLIST_HT_H + +#include +#include // 提供 malloc、realloc、free、exit 原型 +#include "Status.h" //**▲01 绪论**// +#include "SString.h" //**▲04 串**// + +/* 原子元素类型 */ +typedef char AtomType; + +/* + * 广义表结点标记 + * + * Atom-0:原子结点 + * List-1:表结点 + */ +typedef enum { Atom, List } ElemTag; + +/* 广义表(头尾链表存储表示)类型定义 */ +typedef struct GLNode { + ElemTag tag; // 公共标记,用于区分原子结点和表结点 + + // 原子结点和表结点的联合部分 + union { + AtomType atom; // atom是原子结点的值域,AtomType由用户定义 + struct { + struct GLNode* hp; // 指向表头 + struct GLNode* tp; // 指向表尾 + } ptr; // 表结点的指针域 + } Node; +} GLNode; + +/* 广义表类型 */ +typedef GLNode* GList; + +/* + * 图形化输出标记 + * + * Head代表广义表指针来自表头 + * Tail代表广义表指针来自表尾 + */ +typedef enum { Head, Tail } Mark; + + +/* + * 初始化 + * + * 初始化空的广义表,长度为0,深度为1。 + * + *【注】 + * 需要对每一层去掉括号考察 + */ +Status InitGList(GList* L); + +/* + * ████████ 算法5.7 ████████ + * + * 创建 + * + * 由字符串S创建广义表L。 + */ +Status CreateGList(GList* L, SString S); + +/* + * 销毁 + * + * 释放广义表所占内存。 + */ +Status DestroyGList(GList* L); + +/* + * ████████ 算法5.6 ████████ + * + * 复制 + * + * 由广义表L复制得到广义表T。 + */ +Status CopyGList(GList* T, GList L); + +/* + * 计数 + * + * 返回广义表的长度。 + */ +int GListLength(GList L); + +/* + * ████████ 算法5.5 ████████ + * + * 深度 + * + * 返回广义表的深度 + */ +int GListDepth(GList L); + +/* + * 判空 + * + * 判断广义表是否为空。 + */ +Status GListEmpty(GList L); + +/* + * 表头 + */ +GList GetHead(GList L); + +/* + * 表尾 + */ +GList GetTail(GList L); + +/* + * 插入 + * + * 将元素e插入为广义表L的第一个元素。 + */ +Status InsertFirst(GList* L, GList e); + +/* + * 删除 + * + * 将广义表L的第一个元素删除,并用e返回。 + */ +Status DeleteFirst(GList* L, GList* e); + +/* + * 遍历 + * + * 用visit函数访问广义表L。 + */ +void Traverse(GList L, void (Visit)(AtomType)); + +/* + * 图形化输出 + * + * 带括号输出广义表L。 + */ +void PrintGraph(GList L); + +/* + * 图形化输出的内部实现,mark是图形化输出标记。 + */ +static void Print(GList L, Mark mark); + +/* + * ████████ 算法5.8 ████████ + * + * 将非空串str分割成两部分:hsub为第一个','之前的子串,str为第一个','之后的子串。 + * + *【注】 + * 1.这里假设字符串str输入正确,其中无空白符号,且str【已经脱去最外层括号】。 + * 2.分离完成后,str也会发生变化 + */ +static void sever(SString hstr, SString str); + +#endif diff --git a/CLion/ExerciseBook/05.33.1/SString.c b/CLion/ExerciseBook/05.33.1/SString.c new file mode 100644 index 0000000..41d9e15 --- /dev/null +++ b/CLion/ExerciseBook/05.33.1/SString.c @@ -0,0 +1,195 @@ +/*============================= + * 串的定长顺序存储表示(顺序串) + * + * 包含算法: 4.1、4.2、4.3、4.5 + ==============================*/ + +#include "SString.h" //**▲04 串**// + +/* + * 初始化 + * + * 构造一个值为chars的串T。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status StrAssign(SString T, const char* chars) { + int i, len; + + len = (int) strlen(chars); + + // chars过长 + if(len > MAXSTRLEN) { + return ERROR; + } + + T[0] = len; + for(i = 1; i <= len; i++) { + T[i] = chars[i - 1]; + } + + return OK; +} + +/* + * 清空 + * + * 将串S清空。 + */ +Status ClearString(SString S) { + // 只需要将长度置为0就可以 + S[0] = 0; + return OK; +} + +/* + * 判空 + * + * 判断串S中是否包含有效数据。 + * + * 返回值: + * TRUE : 串S为空 + * FALSE: 串S不为空 + */ +Status StrEmpty(SString S) { + return S[0] == 0 ? TRUE : FALSE; +} + +/* + * 计数 + * + * 返回串S中元素的个数。 + * + *【注】 + * 该操作属于最小操作子集 + */ +int StrLength(SString S) { + return S[0]; +} + +/* + * ████████ 算法4.3 ████████ + * + * 求子串 + * + * 用Sub返回S[pos, pos+len-1]。 + * 返回值指示是否截取成功。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status SubString(SString Sub, SString S, int pos, int len) { + int i; + + if(pos < 1 || pos > S[0] || len < 0 || pos + len - 1 > S[0]) { + return ERROR; + } + + // 复制元素 + for(i = 1; i <= len; i++) { + Sub[i] = S[pos + i - 1]; + } + + // 确定新长度 + Sub[0] = len; + + return OK; +} + +/* + * 删除 + * + * 删除S[pos, pos+len-1]。 + */ +Status StrDelete(SString S, int pos, int len) { + int i; + + if(pos < 1 || pos + len - 1 > S[0] || len < 0) { + return ERROR; + } + + // 如果待删除的长度为0,则提前返回 + if(len == 0) { + return OK; + } + + // 把后面的元素挪到前面,覆盖掉被删除的元素 + for(i = pos + len; i <= S[0]; i++) { + S[i - len] = S[i]; + } + + // 长度减少 + S[0] -= len; + + return OK; +} + +/* + * 比较 + * + * 比较串S和串T,返回比较结果。 + * + *【注】 + * 该操作属于最小操作子集 + */ +int StrCompare(SString S, SString T) { + int i = 1; + + while(i <= S[0] && i <= T[0]) { + // 遇到不同的字符时,比较其大小 + if(S[i] != T[i]) { + return S[i] - T[i]; + } + + i++; + } + + return S[0] - T[0]; +} + +/* + * 复制 + * + * 将串S复制到串T。 + */ +Status StrCopy(SString T, SString S) { + int i; + + // 连同长度信息一起复制 + for(i = 0; i <= S[0]; i++) { + T[i] = S[i]; + } + + return OK; +} + +/* + * 清理字符串S中的空白,包括清理不可打印字符和清理空格。 + * + *【注】 + * 该函数是在本章中新增的。 + */ +Status ClearBlank(SString S) { + int i, j; + + // 如果是空串 + if(S[0] == 0) { + return ERROR; + } + + for(i = 1, j = 0; i <= S[0]; i++) { + // 如果遇到空白,则略过 + if(S[i] == ' ' || !isprint(S[i])) { + continue; + } + + j++; + + S[j] = S[i]; + } + + S[0] = j; + + return OK; +} diff --git a/CLion/ExerciseBook/05.33.1/SString.h b/CLion/ExerciseBook/05.33.1/SString.h new file mode 100644 index 0000000..e81ca79 --- /dev/null +++ b/CLion/ExerciseBook/05.33.1/SString.h @@ -0,0 +1,117 @@ +/*============================= + * 串的定长顺序存储表示(顺序串) + * + * 包含算法: 4.1、4.2、4.3、4.5 + ==============================*/ + +#ifndef SSTRING_H +#define SSTRING_H + +#include +#include // 提供 strlen 原型 +#include // 提供 isprint 原型 +#include "Status.h" //**▲01 绪论**// + +/* 宏定义 */ +#define MAXSTRLEN 255 // 顺序串的最大串长 + +/* + * 串的顺序存储类型定义 + * + * 注:有效元素从SString的1号单元开始存储 + * SString的0号单元用来存储其长度 + */ +typedef unsigned char SString[MAXSTRLEN + 1]; // 0号单元存放串的长度 + + +/* + * ████ 提示 ████ + * + * 遵循教材的书写习惯,pos指示字符的位序(不是索引),从1开始计数 + */ + + +/* + * 初始化 + * + * 构造一个值为chars的串T。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status StrAssign(SString T, const char* chars); + +/* + * 清空 + * + * 将串S清空。 + */ +Status ClearString(SString S); + +/* + * 判空 + * + * 判断串S中是否包含有效数据。 + * + * 返回值: + * TRUE : 串S为空 + * FALSE: 串S不为空 + */ +Status StrEmpty(SString S); + +/* + * 计数 + * + * 返回串S中元素的个数。 + * + *【注】 + * 该操作属于最小操作子集 + */ +int StrLength(SString S); + +/* + * ████████ 算法4.3 ████████ + * + * 求子串 + * + * 用Sub返回S[pos, pos+len-1]。 + * 返回值指示是否截取成功。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status SubString(SString Sub, SString S, int pos, int len); + +/* + * 删除 + * + * 删除S[pos, pos+len-1]。 + */ +Status StrDelete(SString S, int pos, int len); + +/* + * 比较 + * + * 比较串S和串T,返回比较结果。 + * + *【注】 + * 该操作属于最小操作子集 + */ +int StrCompare(SString S, SString T); + +/* + * 复制 + * + * 将串S复制到串T。 + */ +Status StrCopy(SString T, SString S); + +/* + * 清理字符串S中的空白,包括清理不可打印字符和清理空格。 + * + *【注】 + * 该函数是在本章中新增的。 + */ +Status ClearBlank(SString S); + +#endif diff --git a/CLion/ExerciseBook/05.33.2/05.33.2.c b/CLion/ExerciseBook/05.33.2/05.33.2.c new file mode 100644 index 0000000..68ceea4 --- /dev/null +++ b/CLion/ExerciseBook/05.33.2/05.33.2.c @@ -0,0 +1,48 @@ +#include +#include "SString.h" //**▲04 串**// +#include "GList-E.h" //**▲05 数组和广义表**// + +/* + * 输出广义表中所有原子项及其所在层次(扩展线性链表存储表示) + */ +void Algo_5_33_2(GList L, int d); + + +int main(int argc, char* argv[]) { + GList L; + char* s = "((),(e),(a,(b,c,d)))"; + SString S; + + printf("创建广义表 L ...\n"); + StrAssign(S, s); + CreateGList(&L, S); + printf("L = "); + PrintGraph(L); + + Algo_5_33_2(L, 0); + + return 0; +} + + +/* + * 输出广义表中所有原子项及其所在层次(扩展线性链表存储表示) + */ +void Algo_5_33_2(GList L, int d) { + int i = d; // d初值赋为0 + + if(L == NULL) { + return; + } + + if(L->tag == Atom) { + printf("%c -> 第%d层\n", L->Node.atom, i); + } + + + if(L->tag == List) { + Algo_5_33_2(L->Node.hp, i + 1); // 表头指针指向表的话层数增一 + } + + Algo_5_33_2(L->tp, i); +} diff --git a/CLion/ExerciseBook/05.33.2/CMakeLists.txt b/CLion/ExerciseBook/05.33.2/CMakeLists.txt new file mode 100644 index 0000000..36503c0 --- /dev/null +++ b/CLion/ExerciseBook/05.33.2/CMakeLists.txt @@ -0,0 +1,7 @@ +# 包含公共库 +include_directories(${CMAKE_SOURCE_DIR}/Status) + +# 生成可执行文件 +add_executable(05.33.2 SString.h SString.c GList-E.h GList-E.c 05.33.2.c) +# 链接公共库 +target_link_libraries(05.33.2 Scanf_lib) \ No newline at end of file diff --git a/CLion/ExerciseBook/05.33.2/GList-E.c b/CLion/ExerciseBook/05.33.2/GList-E.c new file mode 100644 index 0000000..d994024 --- /dev/null +++ b/CLion/ExerciseBook/05.33.2/GList-E.c @@ -0,0 +1,449 @@ +/*=========================== + * 广义表的扩展线性链表存储表示 + ============================*/ + +#include "GList-E.h" //**▲05 数组和广义表**// + +/* + * 初始化 + * + * 初始化空的广义表,长度为0,深度为1。 + * + *【注】 + * 需要对每一层带上括号考察 + */ +Status InitGList(GList* L) { + if(L == NULL) { + return ERROR; + } + + *L = (GList) malloc(sizeof(GLNode)); + if(!*L) { + exit(OVERFLOW); + } + + (*L)->tag = List; + (*L)->Node.hp = NULL; + (*L)->tp = NULL; + + return OK; +} + +/* + * 创建 + * + * 由字符串S创建广义表L。 + */ +Status CreateGList(GList* L, SString S) { + SString emp, hsub, sub, tmp; + + if(L == NULL) { + return ERROR; + } + + // 清理字符串S中的空白,包括清理不可打印字符和清理空格 + ClearBlank(S); + + if(StrEmpty(S)) { + return ERROR; + } + + // 复制是为了不破坏S + StrCopy(sub, S); + + /* + * 初次执行到此时,带着最外层的括号 + * 再次执行到此时,已经脱去了外层括号 + */ + sever(hsub, sub); + + *L = (GList) malloc(sizeof(GLNode)); + if(*L == NULL) { + exit(OVERFLOW); + } + + StrAssign(emp, "()"); + + if(!StrCompare(hsub, emp)) { + (*L)->tag = List; + (*L)->Node.hp = NULL; + } else { + if(StrLength(hsub) == 1) { + (*L)->tag = Atom; + (*L)->Node.atom = hsub[1]; + } else { + (*L)->tag = List; + + SubString(tmp, hsub, 2, StrLength(hsub) - 2); + + CreateGList(&((*L)->Node.hp), tmp); + } + } + + // 如果不存在队尾,则退出本层递归 + if(StrEmpty(sub)) { + (*L)->tp = NULL; + } else { + // 继续递归求表尾 + CreateGList(&((*L)->tp), sub); + } + + return OK; +} + +/* + * 销毁 + * + * 释放广义表所占内存。 + */ +Status DestroyGList(GList* L) { + GList head, tail; + + if(L == NULL || *L == NULL) { + return ERROR; + } + + // 处理子表结点 + if((*L)->tag == List) { + head = (*L)->Node.hp; // 表头 + tail = (*L)->tp; // 表尾 + + free(*L); + *L = NULL; + + // 递归处理表头 + if(head != NULL) { + DestroyGList(&head); + } + + // 递归处理表尾 + if(tail != NULL) { + DestroyGList(&tail); + } + + // 处理原子结点 + } else { + tail = (*L)->tp; // 表尾 + + free(*L); + *L = NULL; + + if(tail != NULL) { + DestroyGList(&tail); + } + } + + return OK; +} + +/* + * 复制 + * + * 由广义表L复制得到广义表T。 + */ +Status CopyGList(GList* T, GList L) { + + if(L == NULL) { + return ERROR; + } + + *T = (GList) malloc(sizeof(GLNode)); + if(*T == NULL) { + exit(OVERFLOW); + } + + // 复制原子 + if(L->tag == Atom) { + (*T)->tag = Atom; + (*T)->Node.atom = L->Node.atom; + + // 复制子表 + } else { + (*T)->tag = List; + + // 复制表头 + if(L->Node.hp != NULL) { + CopyGList(&((*T)->Node.hp), L->Node.hp); + } else { + (*T)->Node.hp = NULL; + } + } + + // 复制表尾 + if(L->tp != NULL) { + CopyGList(&((*T)->tp), L->tp); + } else { + (*T)->tp = NULL; + } + + return OK; +} + +/* + * 计数 + * + * 返回广义表的长度。 + */ +int GListLength(GList L) { + int count = 0; + GList p; + + // 广义表不存在 + if(L == NULL) { + return -1; + } + + p = L->Node.hp; + + while(p != NULL) { + ++count; + p = p->tp; + } + + return count; +} + +/* + * 深度 + * + * 返回广义表的深度 + */ +int GListDepth(GList L) { + int max, deep; + GList p; + + max = 0; + + // 广义表不存在 + if(L == NULL) { + return -1; + } + + // 空表深度为1 + if(L->tag == List && !L->Node.hp) { + return 1; + } + + // 原子深度为0 + if(L->tag == Atom) { + return 0; + } + + // 递归求子表深度 + for(p = L->Node.hp; p != NULL; p = p->tp) { + // 求以p为头指针的子表深度 + deep = GListDepth(p); + if(deep > max) { + max = deep; + } + } + + return max + 1; +} + +/* + * 判空 + * + * 判断广义表是否为空。 + */ +Status GListEmpty(GList L) { + // 广义表不存在 + if(L == NULL) { + return ERROR; + } + + if(L->tag == List && L->Node.hp == NULL && L->tp == NULL) { + return TRUE; + } else { + return ERROR; + } +} + +/* + * 表头 + */ +GList GetHead(GList L) { + GList p, q; + + // 广义表不存在或广义表为空表,无法获取表头 + if(L == NULL || L->Node.hp == NULL) { + return NULL; + } + + q = L->Node.hp->tp; // 临时保存L的表尾信息 + L->Node.hp->tp = NULL; // 截去L的表尾部分 + + CopyGList(&p, L->Node.hp); // 复制表头信息(已屏蔽表尾) + + L->Node.hp->tp = q; // 恢复L的表尾信息 + + return p; +} + +/* + * 表尾 + */ +GList GetTail(GList L) { + GList p, q; + + // 广义表不存在或广义表为空表,无法获取表尾 + if(L == NULL || L->Node.hp == NULL) { + return NULL; + } + + q = L->Node.hp; // 临时保存L的表头信息 + L->Node.hp = q->tp; // 摘下L的表头部分 + + CopyGList(&p, L); // 复制表尾信息(已屏蔽表头) + + q->tp = L->Node.hp; // 恢复L的表头信息 + L->Node.hp = q; + + return p; +} + +/* + * 插入 + * + * 将元素e插入为广义表L的第一个元素。 + */ +Status InsertFirst(GList* L, GList e) { + + // 广义表不存在 + if(L == NULL || *L == NULL) { + return ERROR; + } + + if(e == NULL) { + return ERROR; + } + + e->tp = (*L)->Node.hp; + (*L)->Node.hp = e; + + return OK; +} + +/* + * 删除 + * + * 将广义表L的第一个元素删除,并用e返回。 + */ +Status DeleteFirst(GList* L, GList* e) { + GList p; + + // 广义表不存在或广义表为空表,则无法删除表头 + if(*L == NULL || (*L)->Node.hp == NULL) { + return ERROR; + } + + p = (*L)->Node.hp; + (*L)->Node.hp = p->tp; + p->tp = NULL; + + *e = p; + + return OK; +} + +/* + * 遍历 + * + * 用visit函数访问广义表L。 + */ +void Traverse(GList L, void(Visit)(AtomType)) { + if(L == NULL) { + return; + } + + if(L->tag == List) { + Traverse(L->Node.hp, Visit); + } else { + Visit(L->Node.atom); + } + + Traverse(L->tp, Visit); +} + +/* + * 图形化输出 + * + * 带括号输出广义表L。 + */ +void PrintGraph(GList L) { + Print(L); + printf("\n"); +} + +/* + * 图形化输出的内部实现。 + */ +static void Print(GList L) { + if(L == NULL) { + return; + } + + // 处理表结点 + if(L->tag == List) { + printf("("); + + if(L->Node.hp) { + Print(L->Node.hp); + } + + if(L->tp) { + printf("),"); + Print(L->tp); + } else { + printf(")"); + } + + // 处理原子结点 + } else { + printf("%c", L->Node.atom); + if(L->tp) { + printf(","); + Print(L->tp); + } + } +} + +/* + * 将非空串str分割成两部分:hsub为第一个','之前的子串,str为第一个','之后的子串。 + * + *【注】 + * 1.这里假设字符串str输入正确,其中无空白符号, + * 但str外层的括号可能脱去,也可能未脱去。 + * 2.分离完成后,str也会发生变化 + */ +static void sever(SString hstr, SString str) { + int i, k, n; + SString ch; + + n = StrLength(str); + + i = 0; // 遍历字符串时的游标 + k = 0; // 标记遇到的未配对括号数量 + + do { + ++i; + + // 截取str第一个字符 + SubString(ch, str, i, 1); + + if(ch[1] == '(') { + ++k; + } + if(ch[1] == ')') { + --k; + } + } while(i < n && (ch[1] != ',' || k != 0)); + + if(i < n) { + SubString(hstr, str, 1, i - 1); + SubString(str, str, i + 1, n - i); + } else { + StrCopy(hstr, str); + ClearString(str); + } +} diff --git a/CLion/ExerciseBook/05.33.2/GList-E.h b/CLion/ExerciseBook/05.33.2/GList-E.h new file mode 100644 index 0000000..5e5b625 --- /dev/null +++ b/CLion/ExerciseBook/05.33.2/GList-E.h @@ -0,0 +1,146 @@ +/*=========================== + * 广义表的扩展线性链表存储表示 + ============================*/ + +#ifndef GLIST_E_H +#define GLIST_E_H + +#include +#include // 提供 malloc、realloc、free、exit 原型 +#include "Status.h" //**▲01 绪论**// +#include "SString.h" //**▲04 串**// + +/* 原子元素类型 */ +typedef char AtomType; //原子类型 + +/* + * 广义表结点标记 + * + * Atom-0:原子结点 + * List-1:表结点 + */ +typedef enum { Atom, List } ElemTag; + +/* 广义表(扩展线性链表存储表示)类型定义 */ +typedef struct GLNode { + ElemTag tag; // 公共标记,用于区分原子结点和表结点 + + // 原子结点和表结点的联合部分 + union + { + AtomType atom; // atom是原子结点的值域,AtomType由用户定义 + struct GLNode* hp; // 指向表头 + } Node; + struct GLNode* tp; // 指向表尾 +} GLNode; + +/* 广义表类型 */ +typedef GLNode* GList; + + +/* + * 初始化 + * + * 初始化空的广义表,长度为0,深度为1。 + * + *【注】 + * 需要对每一层带上括号考察 + */ +Status InitGList(GList* L); + +/* + * 创建 + * + * 由字符串S创建广义表L。 + */ +Status CreateGList(GList* L, SString S); + +/* + * 销毁 + * + * 释放广义表所占内存。 + */ +Status DestroyGList(GList* L); + +/* + * 复制 + * + * 由广义表L复制得到广义表T。 + */ +Status CopyGList(GList* T, GList L); + +/* + * 计数 + * + * 返回广义表的长度。 + */ +int GListLength(GList L); + +/* + * 深度 + * + * 返回广义表的深度 + */ +int GListDepth(GList L); + +/* + * 判空 + * + * 判断广义表是否为空。 + */ +Status GListEmpty(GList L); + +/* + * 表头 + */ +GList GetHead(GList L); + +/* + * 表尾 + */ +GList GetTail(GList L); + +/* + * 插入 + * + * 将元素e插入为广义表L的第一个元素。 + */ +Status InsertFirst(GList* L, GList e); + +/* + * 删除 + * + * 将广义表L的第一个元素删除,并用e返回。 + */ +Status DeleteFirst(GList* L, GList* e); + +/* + * 遍历 + * + * 用visit函数访问广义表L。 + */ +void Traverse(GList L, void(Visit)(AtomType)); + +/* + * 图形化输出 + * + * 带括号输出广义表L。 + */ +void PrintGraph(GList L); + +/* + * 图形化输出的内部实现。 + */ +static void Print(GList L); + +/* + * 将非空串str分割成两部分:hsub为第一个','之前的子串,str为第一个','之后的子串。 + * + *【注】 + * 1.这里假设字符串str输入正确,其中无空白符号, + * 但str外层的括号可能脱去,也可能未脱去。 + * 2.分离完成后,str也会发生变化 + */ +static void sever(SString hstr, SString str); + +#endif diff --git a/CLion/ExerciseBook/05.33.2/SString.c b/CLion/ExerciseBook/05.33.2/SString.c new file mode 100644 index 0000000..41d9e15 --- /dev/null +++ b/CLion/ExerciseBook/05.33.2/SString.c @@ -0,0 +1,195 @@ +/*============================= + * 串的定长顺序存储表示(顺序串) + * + * 包含算法: 4.1、4.2、4.3、4.5 + ==============================*/ + +#include "SString.h" //**▲04 串**// + +/* + * 初始化 + * + * 构造一个值为chars的串T。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status StrAssign(SString T, const char* chars) { + int i, len; + + len = (int) strlen(chars); + + // chars过长 + if(len > MAXSTRLEN) { + return ERROR; + } + + T[0] = len; + for(i = 1; i <= len; i++) { + T[i] = chars[i - 1]; + } + + return OK; +} + +/* + * 清空 + * + * 将串S清空。 + */ +Status ClearString(SString S) { + // 只需要将长度置为0就可以 + S[0] = 0; + return OK; +} + +/* + * 判空 + * + * 判断串S中是否包含有效数据。 + * + * 返回值: + * TRUE : 串S为空 + * FALSE: 串S不为空 + */ +Status StrEmpty(SString S) { + return S[0] == 0 ? TRUE : FALSE; +} + +/* + * 计数 + * + * 返回串S中元素的个数。 + * + *【注】 + * 该操作属于最小操作子集 + */ +int StrLength(SString S) { + return S[0]; +} + +/* + * ████████ 算法4.3 ████████ + * + * 求子串 + * + * 用Sub返回S[pos, pos+len-1]。 + * 返回值指示是否截取成功。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status SubString(SString Sub, SString S, int pos, int len) { + int i; + + if(pos < 1 || pos > S[0] || len < 0 || pos + len - 1 > S[0]) { + return ERROR; + } + + // 复制元素 + for(i = 1; i <= len; i++) { + Sub[i] = S[pos + i - 1]; + } + + // 确定新长度 + Sub[0] = len; + + return OK; +} + +/* + * 删除 + * + * 删除S[pos, pos+len-1]。 + */ +Status StrDelete(SString S, int pos, int len) { + int i; + + if(pos < 1 || pos + len - 1 > S[0] || len < 0) { + return ERROR; + } + + // 如果待删除的长度为0,则提前返回 + if(len == 0) { + return OK; + } + + // 把后面的元素挪到前面,覆盖掉被删除的元素 + for(i = pos + len; i <= S[0]; i++) { + S[i - len] = S[i]; + } + + // 长度减少 + S[0] -= len; + + return OK; +} + +/* + * 比较 + * + * 比较串S和串T,返回比较结果。 + * + *【注】 + * 该操作属于最小操作子集 + */ +int StrCompare(SString S, SString T) { + int i = 1; + + while(i <= S[0] && i <= T[0]) { + // 遇到不同的字符时,比较其大小 + if(S[i] != T[i]) { + return S[i] - T[i]; + } + + i++; + } + + return S[0] - T[0]; +} + +/* + * 复制 + * + * 将串S复制到串T。 + */ +Status StrCopy(SString T, SString S) { + int i; + + // 连同长度信息一起复制 + for(i = 0; i <= S[0]; i++) { + T[i] = S[i]; + } + + return OK; +} + +/* + * 清理字符串S中的空白,包括清理不可打印字符和清理空格。 + * + *【注】 + * 该函数是在本章中新增的。 + */ +Status ClearBlank(SString S) { + int i, j; + + // 如果是空串 + if(S[0] == 0) { + return ERROR; + } + + for(i = 1, j = 0; i <= S[0]; i++) { + // 如果遇到空白,则略过 + if(S[i] == ' ' || !isprint(S[i])) { + continue; + } + + j++; + + S[j] = S[i]; + } + + S[0] = j; + + return OK; +} diff --git a/CLion/ExerciseBook/05.33.2/SString.h b/CLion/ExerciseBook/05.33.2/SString.h new file mode 100644 index 0000000..e81ca79 --- /dev/null +++ b/CLion/ExerciseBook/05.33.2/SString.h @@ -0,0 +1,117 @@ +/*============================= + * 串的定长顺序存储表示(顺序串) + * + * 包含算法: 4.1、4.2、4.3、4.5 + ==============================*/ + +#ifndef SSTRING_H +#define SSTRING_H + +#include +#include // 提供 strlen 原型 +#include // 提供 isprint 原型 +#include "Status.h" //**▲01 绪论**// + +/* 宏定义 */ +#define MAXSTRLEN 255 // 顺序串的最大串长 + +/* + * 串的顺序存储类型定义 + * + * 注:有效元素从SString的1号单元开始存储 + * SString的0号单元用来存储其长度 + */ +typedef unsigned char SString[MAXSTRLEN + 1]; // 0号单元存放串的长度 + + +/* + * ████ 提示 ████ + * + * 遵循教材的书写习惯,pos指示字符的位序(不是索引),从1开始计数 + */ + + +/* + * 初始化 + * + * 构造一个值为chars的串T。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status StrAssign(SString T, const char* chars); + +/* + * 清空 + * + * 将串S清空。 + */ +Status ClearString(SString S); + +/* + * 判空 + * + * 判断串S中是否包含有效数据。 + * + * 返回值: + * TRUE : 串S为空 + * FALSE: 串S不为空 + */ +Status StrEmpty(SString S); + +/* + * 计数 + * + * 返回串S中元素的个数。 + * + *【注】 + * 该操作属于最小操作子集 + */ +int StrLength(SString S); + +/* + * ████████ 算法4.3 ████████ + * + * 求子串 + * + * 用Sub返回S[pos, pos+len-1]。 + * 返回值指示是否截取成功。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status SubString(SString Sub, SString S, int pos, int len); + +/* + * 删除 + * + * 删除S[pos, pos+len-1]。 + */ +Status StrDelete(SString S, int pos, int len); + +/* + * 比较 + * + * 比较串S和串T,返回比较结果。 + * + *【注】 + * 该操作属于最小操作子集 + */ +int StrCompare(SString S, SString T); + +/* + * 复制 + * + * 将串S复制到串T。 + */ +Status StrCopy(SString T, SString S); + +/* + * 清理字符串S中的空白,包括清理不可打印字符和清理空格。 + * + *【注】 + * 该函数是在本章中新增的。 + */ +Status ClearBlank(SString S); + +#endif diff --git a/CLion/ExerciseBook/05.34.1/05.34.1.c b/CLion/ExerciseBook/05.34.1/05.34.1.c new file mode 100644 index 0000000..af342c8 --- /dev/null +++ b/CLion/ExerciseBook/05.34.1/05.34.1.c @@ -0,0 +1,62 @@ +#include +#include "Status.h" //**▲01 绪论**// +#include "SString.h" //**▲04 串**// +#include "GList-HT.h" //**▲05 数组和广义表**// + +/* + * 逆置广义表(头尾链表存储表示) + */ +Status Algo_5_34_1(GList* L); + + +int main(int argc, char* argv[]) { + GList L; + char* s = "(a,((b,c),()),(((d),e),f))"; + SString S; + + printf("创建广义表 L ...\n"); + StrAssign(S, s); + CreateGList(&L, S); + printf("L = "); + PrintGraph(L); + + printf("逆置广义表...\n"); + Algo_5_34_1(&L); + printf("L = "); + PrintGraph(L); + + return 0; +} + + +/* + * 逆置广义表(头尾链表存储表示) + */ +Status Algo_5_34_1(GList* L) { + GList head, tail; + + if(L == NULL || *L == NULL) { + return ERROR; + } + + // 从后向前,从里到外逆置 + head = *L; + tail = (*L)->Node.ptr.tp; + + // 对表头进行逆置 + if(head->Node.ptr.hp != NULL && head->Node.ptr.hp->tag == List) { + Algo_5_34_1(&(head->Node.ptr.hp)); + } + + // 对表尾进行逆置 + if(tail != NULL) { + Algo_5_34_1(&((*L)->Node.ptr.tp)); + + // 头尾交换 + *L = (*L)->Node.ptr.tp; + tail->Node.ptr.tp = head; + head->Node.ptr.tp = NULL; + } + + return OK; +} diff --git a/CLion/ExerciseBook/05.34.1/CMakeLists.txt b/CLion/ExerciseBook/05.34.1/CMakeLists.txt new file mode 100644 index 0000000..d4ae017 --- /dev/null +++ b/CLion/ExerciseBook/05.34.1/CMakeLists.txt @@ -0,0 +1,7 @@ +# 包含公共库 +include_directories(${CMAKE_SOURCE_DIR}/Status) + +# 生成可执行文件 +add_executable(05.34.1 SString.h SString.c GList-HT.h GList-HT.c 05.34.1.c) +# 链接公共库 +target_link_libraries(05.34.1 Scanf_lib) \ No newline at end of file diff --git a/CLion/ExerciseBook/05.34.1/GList-HT.c b/CLion/ExerciseBook/05.34.1/GList-HT.c new file mode 100644 index 0000000..ddf2766 --- /dev/null +++ b/CLion/ExerciseBook/05.34.1/GList-HT.c @@ -0,0 +1,418 @@ +/*============================ + * 广义表的头尾链表存储表示 + * + * 包含算法: 5.5、5.6、5.7、5.8 + =============================*/ + +#include "GList-HT.h" //**▲05 数组和广义表**// + +/* + * 初始化 + * + * 初始化空的广义表,长度为0,深度为1。 + * + *【注】 + * 需要对每一层去掉括号考察 + */ +Status InitGList(GList* L) { + if(L == NULL) { + return ERROR; + } + + *L = NULL; + + return OK; +} + +/* + * ████████ 算法5.7 ████████ + * + * 创建 + * + * 由字符串S创建广义表L。 + */ +Status CreateGList(GList* L, SString S) { + SString emp; // 代表空广义表的字符串 + SString hsub, sub; + GList p, q; + + if(L == NULL) { + return ERROR; + } + + // 清理字符串S中的空白,包括清理不可打印字符和清理空格 + ClearBlank(S); + + if(StrEmpty(S)) { + return ERROR; + } + + StrAssign(emp, "()"); + + /* + * 如果输入串为(),则代表需要创建空的广义表 + * + *【注】 + * 教材这里的代码是有问题的。 + * StrCompare的返回值指示的是两个字符串的大小,而不是指示两个字符串是否相等。 + * 如果给定的S与()相等,返回值应当是0。 + */ + if(!StrCompare(S, emp)) { + *L = NULL; + } else { + *L = (GList) malloc(sizeof(GLNode)); + if(*L == NULL) { + exit(OVERFLOW); + } + + // 创建原子 + if(StrLength(S) == 1) { + (*L)->tag = Atom; + (*L)->Node.atom = S[1]; + } else { + (*L)->tag = List; + + p = *L; + + // 去掉最外层括号 + SubString(sub, S, 2, StrLength(S) - 2); + + // 重复建n个子表 + do { + // 从sub中分离出表头串hsub,分离完成后,sub也会发生变化 + sever(hsub, sub); + + // 递归创建广义表 + CreateGList(&(p->Node.ptr.hp), hsub); + + q = p; + + // 如果表尾不为空,需要继续处理表尾 + if(!StrEmpty(sub)) { + p = (GList) malloc(sizeof(GLNode)); + if(p == NULL) { + exit(OVERFLOW); + } + + p->tag = List; + + q->Node.ptr.tp = p; + } + } while(!StrEmpty(sub)); + + q->Node.ptr.tp = NULL; + } + } + + return OK; +} + +/* + * 销毁 + * + * 释放广义表所占内存。 + */ +Status DestroyGList(GList* L) { + GList head, tail; + + if(L == NULL || *L == NULL) { + return ERROR; + } + + // 删除原子结点 + if((*L)->tag == Atom) { + free(*L); + *L = NULL; + + // 删除子表结点 + } else { + head = (*L)->Node.ptr.hp; + tail = (*L)->Node.ptr.tp; + free(*L); + *L = NULL; + DestroyGList(&head); + DestroyGList(&tail); + } + + return OK; +} + +/* + * ████████ 算法5.6 ████████ + * + * 复制 + * + * 由广义表L复制得到广义表T。 + */ +Status CopyGList(GList* T, GList L) { + if(T == NULL) { + return ERROR; + } + + if(L == NULL) { + *T = NULL; + } else { + // 新建广义表结点 + *T = (GList) malloc(sizeof(GLNode)); + if(*T == NULL) { + exit(OVERFLOW); + } + + (*T)->tag = L->tag; + + // 复制单原子 + if(L->tag == Atom) { + (*T)->Node.atom = L->Node.atom; + + // 复制表头和表尾 + } else { + CopyGList(&((*T)->Node.ptr.hp), L->Node.ptr.hp); + CopyGList(&((*T)->Node.ptr.tp), L->Node.ptr.tp); + } + } + + return OK; +} + +/* + * 计数 + * + * 返回广义表的长度。 + */ +int GListLength(GList L) { + int count; + + for(count = 0; L != NULL; count++, L = L->Node.ptr.tp) { + } + + return count; +} + +/* + * ████████ 算法5.5 ████████ + * + * 深度 + * + * 返回广义表的深度 + */ +int GListDepth(GList L) { + int max, deep; + GList p; + + // 空表深度为1 + if(L == NULL) { + return 1; + } + + // 原子深度为0 + if(L->tag == Atom) { + return 0; + } + + // 递归求子表深度 + for(max = 0, p = L; p != NULL; p = p->Node.ptr.tp) { + deep = GListDepth(p->Node.ptr.hp); + if(deep > max) { + max = deep; + } + } + + // 非空表的深度是各子元素最大深度加一 + return max + 1; +} + +/* + * 判空 + * + * 判断广义表是否为空。 + */ +Status GListEmpty(GList L) { + return L == NULL ? TRUE : FALSE; +} + +/* + * 表头 + */ +GList GetHead(GList L) { + GList p; + + // 空表无表头,这里不能返回NULL,不然分不清是失败了还是返回了空表 + if(L == NULL) { + exit(ERROR); + } + + CopyGList(&p, L->Node.ptr.hp); + + return p; +} + +/* + * 表尾 + */ +GList GetTail(GList L) { + GList p; + + // 空表无表尾,这里不能返回NULL,不然分不清是失败了还是返回了空表 + if(L == NULL) { + exit(ERROR); + } + + CopyGList(&p, L->Node.ptr.tp); + + return p; +} + +/* + * 插入 + * + * 将元素e插入为广义表L的第一个元素。 + */ +Status InsertFirst(GList* L, GList e) { + GList g; + + if(L == NULL) { + return ERROR; + } + + g = (GList) malloc(sizeof(GLNode)); + if(g == NULL) { + exit(OVERFLOW); + } + + g->tag = List; + g->Node.ptr.hp = e; + g->Node.ptr.tp = *L; + *L = g; + + return OK; +} + +/* + * 删除 + * + * 将广义表L的第一个元素删除,并用e返回。 + */ +Status DeleteFirst(GList* L, GList* e) { + GList p; + + // 空表无法删除 + if(L == NULL || *L == NULL) { + return ERROR; + } + + p = *L; + *L = (*L)->Node.ptr.tp; + + CopyGList(e, p->Node.ptr.hp); + + free(p); + + return OK; +} + +/* + * 遍历 + * + * 用visit函数访问广义表L。 + */ +void Traverse(GList L, void(Visit)(AtomType)) { + + if(L == NULL) { + return; + } + + if(L->tag == Atom) { + Visit(L->Node.atom); + } else { + Traverse(L->Node.ptr.hp, Visit); + Traverse(L->Node.ptr.tp, Visit); + } + +} + +/* + * 图形化输出 + * + * 带括号输出广义表L。 + */ +void PrintGraph(GList L) { + Print(L, Head); + printf("\n"); +} + +/* + * 图形化输出的内部实现,mark是图形化输出标记。 + */ +static void Print(GList L, Mark mark) { + // L为空 + if(L == NULL) { + if(mark == Head) { + printf("("); + } + + printf(")"); + + // L不为空时 + } else { + // 对于原子结点,输出原子 + if(L->tag == Atom) { + printf("%c", L->Node.atom); + + // 对于子表结点,要对表头、表尾分别讨论 + } else { + if(mark == Head) { + printf("("); + } else { + printf(","); + } + + Print(L->Node.ptr.hp, Head); + Print(L->Node.ptr.tp, Tail); + } + } +} + +/* + * ████████ 算法5.8 ████████ + * + * 将非空串str分割成两部分:hsub为第一个','之前的子串,str为第一个','之后的子串。 + * + *【注】 + * 1.这里假设字符串str输入正确,其中无空白符号,且str【已经脱去最外层括号】。 + * 2.分离完成后,str也会发生变化 + */ +static void sever(SString hstr, SString str) { + int i, k, n; + SString ch; + + n = StrLength(str); + + i = 0; // 遍历字符串时的游标 + k = 0; // 标记遇到的未配对括号数量 + + do { + ++i; + + // 截取str第一个字符 + SubString(ch, str, i, 1); + + if(ch[1] == '(') { + ++k; + } + + if(ch[1] == ')') { + --k; + } + } while(i < n && (ch[1] != ',' || k != 0)); + + // 如果存在多个广义表结点 + if(i < n) { + SubString(hstr, str, 1, i - 1); + SubString(str, str, i + 1, n - i); + + // 只有一个广义表结点 + } else { + StrCopy(hstr, str); + ClearString(str); + } +} diff --git a/CLion/ExerciseBook/05.34.1/GList-HT.h b/CLion/ExerciseBook/05.34.1/GList-HT.h new file mode 100644 index 0000000..07c0df2 --- /dev/null +++ b/CLion/ExerciseBook/05.34.1/GList-HT.h @@ -0,0 +1,164 @@ +/*============================ + * 广义表的头尾链表存储表示 + * + * 包含算法: 5.5、5.6、5.7、5.8 + =============================*/ + +#ifndef GLIST_HT_H +#define GLIST_HT_H + +#include +#include // 提供 malloc、realloc、free、exit 原型 +#include "Status.h" //**▲01 绪论**// +#include "SString.h" //**▲04 串**// + +/* 原子元素类型 */ +typedef char AtomType; + +/* + * 广义表结点标记 + * + * Atom-0:原子结点 + * List-1:表结点 + */ +typedef enum { Atom, List } ElemTag; + +/* 广义表(头尾链表存储表示)类型定义 */ +typedef struct GLNode { + ElemTag tag; // 公共标记,用于区分原子结点和表结点 + + // 原子结点和表结点的联合部分 + union { + AtomType atom; // atom是原子结点的值域,AtomType由用户定义 + struct { + struct GLNode* hp; // 指向表头 + struct GLNode* tp; // 指向表尾 + } ptr; // 表结点的指针域 + } Node; +} GLNode; + +/* 广义表类型 */ +typedef GLNode* GList; + +/* + * 图形化输出标记 + * + * Head代表广义表指针来自表头 + * Tail代表广义表指针来自表尾 + */ +typedef enum { Head, Tail } Mark; + + +/* + * 初始化 + * + * 初始化空的广义表,长度为0,深度为1。 + * + *【注】 + * 需要对每一层去掉括号考察 + */ +Status InitGList(GList* L); + +/* + * ████████ 算法5.7 ████████ + * + * 创建 + * + * 由字符串S创建广义表L。 + */ +Status CreateGList(GList* L, SString S); + +/* + * 销毁 + * + * 释放广义表所占内存。 + */ +Status DestroyGList(GList* L); + +/* + * ████████ 算法5.6 ████████ + * + * 复制 + * + * 由广义表L复制得到广义表T。 + */ +Status CopyGList(GList* T, GList L); + +/* + * 计数 + * + * 返回广义表的长度。 + */ +int GListLength(GList L); + +/* + * ████████ 算法5.5 ████████ + * + * 深度 + * + * 返回广义表的深度 + */ +int GListDepth(GList L); + +/* + * 判空 + * + * 判断广义表是否为空。 + */ +Status GListEmpty(GList L); + +/* + * 表头 + */ +GList GetHead(GList L); + +/* + * 表尾 + */ +GList GetTail(GList L); + +/* + * 插入 + * + * 将元素e插入为广义表L的第一个元素。 + */ +Status InsertFirst(GList* L, GList e); + +/* + * 删除 + * + * 将广义表L的第一个元素删除,并用e返回。 + */ +Status DeleteFirst(GList* L, GList* e); + +/* + * 遍历 + * + * 用visit函数访问广义表L。 + */ +void Traverse(GList L, void (Visit)(AtomType)); + +/* + * 图形化输出 + * + * 带括号输出广义表L。 + */ +void PrintGraph(GList L); + +/* + * 图形化输出的内部实现,mark是图形化输出标记。 + */ +static void Print(GList L, Mark mark); + +/* + * ████████ 算法5.8 ████████ + * + * 将非空串str分割成两部分:hsub为第一个','之前的子串,str为第一个','之后的子串。 + * + *【注】 + * 1.这里假设字符串str输入正确,其中无空白符号,且str【已经脱去最外层括号】。 + * 2.分离完成后,str也会发生变化 + */ +static void sever(SString hstr, SString str); + +#endif diff --git a/CLion/ExerciseBook/05.34.1/SString.c b/CLion/ExerciseBook/05.34.1/SString.c new file mode 100644 index 0000000..41d9e15 --- /dev/null +++ b/CLion/ExerciseBook/05.34.1/SString.c @@ -0,0 +1,195 @@ +/*============================= + * 串的定长顺序存储表示(顺序串) + * + * 包含算法: 4.1、4.2、4.3、4.5 + ==============================*/ + +#include "SString.h" //**▲04 串**// + +/* + * 初始化 + * + * 构造一个值为chars的串T。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status StrAssign(SString T, const char* chars) { + int i, len; + + len = (int) strlen(chars); + + // chars过长 + if(len > MAXSTRLEN) { + return ERROR; + } + + T[0] = len; + for(i = 1; i <= len; i++) { + T[i] = chars[i - 1]; + } + + return OK; +} + +/* + * 清空 + * + * 将串S清空。 + */ +Status ClearString(SString S) { + // 只需要将长度置为0就可以 + S[0] = 0; + return OK; +} + +/* + * 判空 + * + * 判断串S中是否包含有效数据。 + * + * 返回值: + * TRUE : 串S为空 + * FALSE: 串S不为空 + */ +Status StrEmpty(SString S) { + return S[0] == 0 ? TRUE : FALSE; +} + +/* + * 计数 + * + * 返回串S中元素的个数。 + * + *【注】 + * 该操作属于最小操作子集 + */ +int StrLength(SString S) { + return S[0]; +} + +/* + * ████████ 算法4.3 ████████ + * + * 求子串 + * + * 用Sub返回S[pos, pos+len-1]。 + * 返回值指示是否截取成功。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status SubString(SString Sub, SString S, int pos, int len) { + int i; + + if(pos < 1 || pos > S[0] || len < 0 || pos + len - 1 > S[0]) { + return ERROR; + } + + // 复制元素 + for(i = 1; i <= len; i++) { + Sub[i] = S[pos + i - 1]; + } + + // 确定新长度 + Sub[0] = len; + + return OK; +} + +/* + * 删除 + * + * 删除S[pos, pos+len-1]。 + */ +Status StrDelete(SString S, int pos, int len) { + int i; + + if(pos < 1 || pos + len - 1 > S[0] || len < 0) { + return ERROR; + } + + // 如果待删除的长度为0,则提前返回 + if(len == 0) { + return OK; + } + + // 把后面的元素挪到前面,覆盖掉被删除的元素 + for(i = pos + len; i <= S[0]; i++) { + S[i - len] = S[i]; + } + + // 长度减少 + S[0] -= len; + + return OK; +} + +/* + * 比较 + * + * 比较串S和串T,返回比较结果。 + * + *【注】 + * 该操作属于最小操作子集 + */ +int StrCompare(SString S, SString T) { + int i = 1; + + while(i <= S[0] && i <= T[0]) { + // 遇到不同的字符时,比较其大小 + if(S[i] != T[i]) { + return S[i] - T[i]; + } + + i++; + } + + return S[0] - T[0]; +} + +/* + * 复制 + * + * 将串S复制到串T。 + */ +Status StrCopy(SString T, SString S) { + int i; + + // 连同长度信息一起复制 + for(i = 0; i <= S[0]; i++) { + T[i] = S[i]; + } + + return OK; +} + +/* + * 清理字符串S中的空白,包括清理不可打印字符和清理空格。 + * + *【注】 + * 该函数是在本章中新增的。 + */ +Status ClearBlank(SString S) { + int i, j; + + // 如果是空串 + if(S[0] == 0) { + return ERROR; + } + + for(i = 1, j = 0; i <= S[0]; i++) { + // 如果遇到空白,则略过 + if(S[i] == ' ' || !isprint(S[i])) { + continue; + } + + j++; + + S[j] = S[i]; + } + + S[0] = j; + + return OK; +} diff --git a/CLion/ExerciseBook/05.34.1/SString.h b/CLion/ExerciseBook/05.34.1/SString.h new file mode 100644 index 0000000..e81ca79 --- /dev/null +++ b/CLion/ExerciseBook/05.34.1/SString.h @@ -0,0 +1,117 @@ +/*============================= + * 串的定长顺序存储表示(顺序串) + * + * 包含算法: 4.1、4.2、4.3、4.5 + ==============================*/ + +#ifndef SSTRING_H +#define SSTRING_H + +#include +#include // 提供 strlen 原型 +#include // 提供 isprint 原型 +#include "Status.h" //**▲01 绪论**// + +/* 宏定义 */ +#define MAXSTRLEN 255 // 顺序串的最大串长 + +/* + * 串的顺序存储类型定义 + * + * 注:有效元素从SString的1号单元开始存储 + * SString的0号单元用来存储其长度 + */ +typedef unsigned char SString[MAXSTRLEN + 1]; // 0号单元存放串的长度 + + +/* + * ████ 提示 ████ + * + * 遵循教材的书写习惯,pos指示字符的位序(不是索引),从1开始计数 + */ + + +/* + * 初始化 + * + * 构造一个值为chars的串T。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status StrAssign(SString T, const char* chars); + +/* + * 清空 + * + * 将串S清空。 + */ +Status ClearString(SString S); + +/* + * 判空 + * + * 判断串S中是否包含有效数据。 + * + * 返回值: + * TRUE : 串S为空 + * FALSE: 串S不为空 + */ +Status StrEmpty(SString S); + +/* + * 计数 + * + * 返回串S中元素的个数。 + * + *【注】 + * 该操作属于最小操作子集 + */ +int StrLength(SString S); + +/* + * ████████ 算法4.3 ████████ + * + * 求子串 + * + * 用Sub返回S[pos, pos+len-1]。 + * 返回值指示是否截取成功。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status SubString(SString Sub, SString S, int pos, int len); + +/* + * 删除 + * + * 删除S[pos, pos+len-1]。 + */ +Status StrDelete(SString S, int pos, int len); + +/* + * 比较 + * + * 比较串S和串T,返回比较结果。 + * + *【注】 + * 该操作属于最小操作子集 + */ +int StrCompare(SString S, SString T); + +/* + * 复制 + * + * 将串S复制到串T。 + */ +Status StrCopy(SString T, SString S); + +/* + * 清理字符串S中的空白,包括清理不可打印字符和清理空格。 + * + *【注】 + * 该函数是在本章中新增的。 + */ +Status ClearBlank(SString S); + +#endif diff --git a/CLion/ExerciseBook/05.34.2/05.34.2.c b/CLion/ExerciseBook/05.34.2/05.34.2.c new file mode 100644 index 0000000..0dfdf8e --- /dev/null +++ b/CLion/ExerciseBook/05.34.2/05.34.2.c @@ -0,0 +1,61 @@ +#include +#include "Status.h" //**▲01 绪论**// +#include "SString.h" //**▲04 串**// +#include "GList-E.h" //**▲05 数组和广义表**// + +/* + * 逆置广义表(扩展线性链表存储表示) + */ +Status Algo_5_34_2(GList* L); + + +int main(int argc, char* argv[]) { + GList L; + char* s = "(a,((b,c),()),(((d),e),f))"; + SString S; + + printf("创建广义表 L ...\n"); + StrAssign(S, s); + CreateGList(&L, S); + printf("L = "); + PrintGraph(L); + + printf("逆置广义表...\n"); + Algo_5_34_2(&L); + printf("L = "); + PrintGraph(L); + + return 0; +} + + +/* + * 逆置广义表(扩展线性链表存储表示) + */ +Status Algo_5_34_2(GList* L) { + GList head, tail; + + if(L == NULL || *L == NULL) { + return ERROR; + } + + // 从后向前,从里到外逆置 + head = *L; + tail = (*L)->tp; + + if(head->tag == List && head->Node.hp != NULL) { + Algo_5_34_2(&(head->Node.hp)); + } + + // 对表尾进行逆置 + if(tail != NULL) { + Algo_5_34_2(&((*L)->tp)); + + // 头尾交换 + *L = (*L)->tp; + tail->tp = head; + head->tp = NULL; + } + + return OK; +} diff --git a/CLion/ExerciseBook/05.34.2/CMakeLists.txt b/CLion/ExerciseBook/05.34.2/CMakeLists.txt new file mode 100644 index 0000000..0b78e90 --- /dev/null +++ b/CLion/ExerciseBook/05.34.2/CMakeLists.txt @@ -0,0 +1,7 @@ +# 包含公共库 +include_directories(${CMAKE_SOURCE_DIR}/Status) + +# 生成可执行文件 +add_executable(05.34.2 SString.h SString.c GList-E.h GList-E.c 05.34.2.c) +# 链接公共库 +target_link_libraries(05.34.2 Scanf_lib) \ No newline at end of file diff --git a/CLion/ExerciseBook/05.34.2/GList-E.c b/CLion/ExerciseBook/05.34.2/GList-E.c new file mode 100644 index 0000000..d994024 --- /dev/null +++ b/CLion/ExerciseBook/05.34.2/GList-E.c @@ -0,0 +1,449 @@ +/*=========================== + * 广义表的扩展线性链表存储表示 + ============================*/ + +#include "GList-E.h" //**▲05 数组和广义表**// + +/* + * 初始化 + * + * 初始化空的广义表,长度为0,深度为1。 + * + *【注】 + * 需要对每一层带上括号考察 + */ +Status InitGList(GList* L) { + if(L == NULL) { + return ERROR; + } + + *L = (GList) malloc(sizeof(GLNode)); + if(!*L) { + exit(OVERFLOW); + } + + (*L)->tag = List; + (*L)->Node.hp = NULL; + (*L)->tp = NULL; + + return OK; +} + +/* + * 创建 + * + * 由字符串S创建广义表L。 + */ +Status CreateGList(GList* L, SString S) { + SString emp, hsub, sub, tmp; + + if(L == NULL) { + return ERROR; + } + + // 清理字符串S中的空白,包括清理不可打印字符和清理空格 + ClearBlank(S); + + if(StrEmpty(S)) { + return ERROR; + } + + // 复制是为了不破坏S + StrCopy(sub, S); + + /* + * 初次执行到此时,带着最外层的括号 + * 再次执行到此时,已经脱去了外层括号 + */ + sever(hsub, sub); + + *L = (GList) malloc(sizeof(GLNode)); + if(*L == NULL) { + exit(OVERFLOW); + } + + StrAssign(emp, "()"); + + if(!StrCompare(hsub, emp)) { + (*L)->tag = List; + (*L)->Node.hp = NULL; + } else { + if(StrLength(hsub) == 1) { + (*L)->tag = Atom; + (*L)->Node.atom = hsub[1]; + } else { + (*L)->tag = List; + + SubString(tmp, hsub, 2, StrLength(hsub) - 2); + + CreateGList(&((*L)->Node.hp), tmp); + } + } + + // 如果不存在队尾,则退出本层递归 + if(StrEmpty(sub)) { + (*L)->tp = NULL; + } else { + // 继续递归求表尾 + CreateGList(&((*L)->tp), sub); + } + + return OK; +} + +/* + * 销毁 + * + * 释放广义表所占内存。 + */ +Status DestroyGList(GList* L) { + GList head, tail; + + if(L == NULL || *L == NULL) { + return ERROR; + } + + // 处理子表结点 + if((*L)->tag == List) { + head = (*L)->Node.hp; // 表头 + tail = (*L)->tp; // 表尾 + + free(*L); + *L = NULL; + + // 递归处理表头 + if(head != NULL) { + DestroyGList(&head); + } + + // 递归处理表尾 + if(tail != NULL) { + DestroyGList(&tail); + } + + // 处理原子结点 + } else { + tail = (*L)->tp; // 表尾 + + free(*L); + *L = NULL; + + if(tail != NULL) { + DestroyGList(&tail); + } + } + + return OK; +} + +/* + * 复制 + * + * 由广义表L复制得到广义表T。 + */ +Status CopyGList(GList* T, GList L) { + + if(L == NULL) { + return ERROR; + } + + *T = (GList) malloc(sizeof(GLNode)); + if(*T == NULL) { + exit(OVERFLOW); + } + + // 复制原子 + if(L->tag == Atom) { + (*T)->tag = Atom; + (*T)->Node.atom = L->Node.atom; + + // 复制子表 + } else { + (*T)->tag = List; + + // 复制表头 + if(L->Node.hp != NULL) { + CopyGList(&((*T)->Node.hp), L->Node.hp); + } else { + (*T)->Node.hp = NULL; + } + } + + // 复制表尾 + if(L->tp != NULL) { + CopyGList(&((*T)->tp), L->tp); + } else { + (*T)->tp = NULL; + } + + return OK; +} + +/* + * 计数 + * + * 返回广义表的长度。 + */ +int GListLength(GList L) { + int count = 0; + GList p; + + // 广义表不存在 + if(L == NULL) { + return -1; + } + + p = L->Node.hp; + + while(p != NULL) { + ++count; + p = p->tp; + } + + return count; +} + +/* + * 深度 + * + * 返回广义表的深度 + */ +int GListDepth(GList L) { + int max, deep; + GList p; + + max = 0; + + // 广义表不存在 + if(L == NULL) { + return -1; + } + + // 空表深度为1 + if(L->tag == List && !L->Node.hp) { + return 1; + } + + // 原子深度为0 + if(L->tag == Atom) { + return 0; + } + + // 递归求子表深度 + for(p = L->Node.hp; p != NULL; p = p->tp) { + // 求以p为头指针的子表深度 + deep = GListDepth(p); + if(deep > max) { + max = deep; + } + } + + return max + 1; +} + +/* + * 判空 + * + * 判断广义表是否为空。 + */ +Status GListEmpty(GList L) { + // 广义表不存在 + if(L == NULL) { + return ERROR; + } + + if(L->tag == List && L->Node.hp == NULL && L->tp == NULL) { + return TRUE; + } else { + return ERROR; + } +} + +/* + * 表头 + */ +GList GetHead(GList L) { + GList p, q; + + // 广义表不存在或广义表为空表,无法获取表头 + if(L == NULL || L->Node.hp == NULL) { + return NULL; + } + + q = L->Node.hp->tp; // 临时保存L的表尾信息 + L->Node.hp->tp = NULL; // 截去L的表尾部分 + + CopyGList(&p, L->Node.hp); // 复制表头信息(已屏蔽表尾) + + L->Node.hp->tp = q; // 恢复L的表尾信息 + + return p; +} + +/* + * 表尾 + */ +GList GetTail(GList L) { + GList p, q; + + // 广义表不存在或广义表为空表,无法获取表尾 + if(L == NULL || L->Node.hp == NULL) { + return NULL; + } + + q = L->Node.hp; // 临时保存L的表头信息 + L->Node.hp = q->tp; // 摘下L的表头部分 + + CopyGList(&p, L); // 复制表尾信息(已屏蔽表头) + + q->tp = L->Node.hp; // 恢复L的表头信息 + L->Node.hp = q; + + return p; +} + +/* + * 插入 + * + * 将元素e插入为广义表L的第一个元素。 + */ +Status InsertFirst(GList* L, GList e) { + + // 广义表不存在 + if(L == NULL || *L == NULL) { + return ERROR; + } + + if(e == NULL) { + return ERROR; + } + + e->tp = (*L)->Node.hp; + (*L)->Node.hp = e; + + return OK; +} + +/* + * 删除 + * + * 将广义表L的第一个元素删除,并用e返回。 + */ +Status DeleteFirst(GList* L, GList* e) { + GList p; + + // 广义表不存在或广义表为空表,则无法删除表头 + if(*L == NULL || (*L)->Node.hp == NULL) { + return ERROR; + } + + p = (*L)->Node.hp; + (*L)->Node.hp = p->tp; + p->tp = NULL; + + *e = p; + + return OK; +} + +/* + * 遍历 + * + * 用visit函数访问广义表L。 + */ +void Traverse(GList L, void(Visit)(AtomType)) { + if(L == NULL) { + return; + } + + if(L->tag == List) { + Traverse(L->Node.hp, Visit); + } else { + Visit(L->Node.atom); + } + + Traverse(L->tp, Visit); +} + +/* + * 图形化输出 + * + * 带括号输出广义表L。 + */ +void PrintGraph(GList L) { + Print(L); + printf("\n"); +} + +/* + * 图形化输出的内部实现。 + */ +static void Print(GList L) { + if(L == NULL) { + return; + } + + // 处理表结点 + if(L->tag == List) { + printf("("); + + if(L->Node.hp) { + Print(L->Node.hp); + } + + if(L->tp) { + printf("),"); + Print(L->tp); + } else { + printf(")"); + } + + // 处理原子结点 + } else { + printf("%c", L->Node.atom); + if(L->tp) { + printf(","); + Print(L->tp); + } + } +} + +/* + * 将非空串str分割成两部分:hsub为第一个','之前的子串,str为第一个','之后的子串。 + * + *【注】 + * 1.这里假设字符串str输入正确,其中无空白符号, + * 但str外层的括号可能脱去,也可能未脱去。 + * 2.分离完成后,str也会发生变化 + */ +static void sever(SString hstr, SString str) { + int i, k, n; + SString ch; + + n = StrLength(str); + + i = 0; // 遍历字符串时的游标 + k = 0; // 标记遇到的未配对括号数量 + + do { + ++i; + + // 截取str第一个字符 + SubString(ch, str, i, 1); + + if(ch[1] == '(') { + ++k; + } + if(ch[1] == ')') { + --k; + } + } while(i < n && (ch[1] != ',' || k != 0)); + + if(i < n) { + SubString(hstr, str, 1, i - 1); + SubString(str, str, i + 1, n - i); + } else { + StrCopy(hstr, str); + ClearString(str); + } +} diff --git a/CLion/ExerciseBook/05.34.2/GList-E.h b/CLion/ExerciseBook/05.34.2/GList-E.h new file mode 100644 index 0000000..5e5b625 --- /dev/null +++ b/CLion/ExerciseBook/05.34.2/GList-E.h @@ -0,0 +1,146 @@ +/*=========================== + * 广义表的扩展线性链表存储表示 + ============================*/ + +#ifndef GLIST_E_H +#define GLIST_E_H + +#include +#include // 提供 malloc、realloc、free、exit 原型 +#include "Status.h" //**▲01 绪论**// +#include "SString.h" //**▲04 串**// + +/* 原子元素类型 */ +typedef char AtomType; //原子类型 + +/* + * 广义表结点标记 + * + * Atom-0:原子结点 + * List-1:表结点 + */ +typedef enum { Atom, List } ElemTag; + +/* 广义表(扩展线性链表存储表示)类型定义 */ +typedef struct GLNode { + ElemTag tag; // 公共标记,用于区分原子结点和表结点 + + // 原子结点和表结点的联合部分 + union + { + AtomType atom; // atom是原子结点的值域,AtomType由用户定义 + struct GLNode* hp; // 指向表头 + } Node; + struct GLNode* tp; // 指向表尾 +} GLNode; + +/* 广义表类型 */ +typedef GLNode* GList; + + +/* + * 初始化 + * + * 初始化空的广义表,长度为0,深度为1。 + * + *【注】 + * 需要对每一层带上括号考察 + */ +Status InitGList(GList* L); + +/* + * 创建 + * + * 由字符串S创建广义表L。 + */ +Status CreateGList(GList* L, SString S); + +/* + * 销毁 + * + * 释放广义表所占内存。 + */ +Status DestroyGList(GList* L); + +/* + * 复制 + * + * 由广义表L复制得到广义表T。 + */ +Status CopyGList(GList* T, GList L); + +/* + * 计数 + * + * 返回广义表的长度。 + */ +int GListLength(GList L); + +/* + * 深度 + * + * 返回广义表的深度 + */ +int GListDepth(GList L); + +/* + * 判空 + * + * 判断广义表是否为空。 + */ +Status GListEmpty(GList L); + +/* + * 表头 + */ +GList GetHead(GList L); + +/* + * 表尾 + */ +GList GetTail(GList L); + +/* + * 插入 + * + * 将元素e插入为广义表L的第一个元素。 + */ +Status InsertFirst(GList* L, GList e); + +/* + * 删除 + * + * 将广义表L的第一个元素删除,并用e返回。 + */ +Status DeleteFirst(GList* L, GList* e); + +/* + * 遍历 + * + * 用visit函数访问广义表L。 + */ +void Traverse(GList L, void(Visit)(AtomType)); + +/* + * 图形化输出 + * + * 带括号输出广义表L。 + */ +void PrintGraph(GList L); + +/* + * 图形化输出的内部实现。 + */ +static void Print(GList L); + +/* + * 将非空串str分割成两部分:hsub为第一个','之前的子串,str为第一个','之后的子串。 + * + *【注】 + * 1.这里假设字符串str输入正确,其中无空白符号, + * 但str外层的括号可能脱去,也可能未脱去。 + * 2.分离完成后,str也会发生变化 + */ +static void sever(SString hstr, SString str); + +#endif diff --git a/CLion/ExerciseBook/05.34.2/SString.c b/CLion/ExerciseBook/05.34.2/SString.c new file mode 100644 index 0000000..41d9e15 --- /dev/null +++ b/CLion/ExerciseBook/05.34.2/SString.c @@ -0,0 +1,195 @@ +/*============================= + * 串的定长顺序存储表示(顺序串) + * + * 包含算法: 4.1、4.2、4.3、4.5 + ==============================*/ + +#include "SString.h" //**▲04 串**// + +/* + * 初始化 + * + * 构造一个值为chars的串T。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status StrAssign(SString T, const char* chars) { + int i, len; + + len = (int) strlen(chars); + + // chars过长 + if(len > MAXSTRLEN) { + return ERROR; + } + + T[0] = len; + for(i = 1; i <= len; i++) { + T[i] = chars[i - 1]; + } + + return OK; +} + +/* + * 清空 + * + * 将串S清空。 + */ +Status ClearString(SString S) { + // 只需要将长度置为0就可以 + S[0] = 0; + return OK; +} + +/* + * 判空 + * + * 判断串S中是否包含有效数据。 + * + * 返回值: + * TRUE : 串S为空 + * FALSE: 串S不为空 + */ +Status StrEmpty(SString S) { + return S[0] == 0 ? TRUE : FALSE; +} + +/* + * 计数 + * + * 返回串S中元素的个数。 + * + *【注】 + * 该操作属于最小操作子集 + */ +int StrLength(SString S) { + return S[0]; +} + +/* + * ████████ 算法4.3 ████████ + * + * 求子串 + * + * 用Sub返回S[pos, pos+len-1]。 + * 返回值指示是否截取成功。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status SubString(SString Sub, SString S, int pos, int len) { + int i; + + if(pos < 1 || pos > S[0] || len < 0 || pos + len - 1 > S[0]) { + return ERROR; + } + + // 复制元素 + for(i = 1; i <= len; i++) { + Sub[i] = S[pos + i - 1]; + } + + // 确定新长度 + Sub[0] = len; + + return OK; +} + +/* + * 删除 + * + * 删除S[pos, pos+len-1]。 + */ +Status StrDelete(SString S, int pos, int len) { + int i; + + if(pos < 1 || pos + len - 1 > S[0] || len < 0) { + return ERROR; + } + + // 如果待删除的长度为0,则提前返回 + if(len == 0) { + return OK; + } + + // 把后面的元素挪到前面,覆盖掉被删除的元素 + for(i = pos + len; i <= S[0]; i++) { + S[i - len] = S[i]; + } + + // 长度减少 + S[0] -= len; + + return OK; +} + +/* + * 比较 + * + * 比较串S和串T,返回比较结果。 + * + *【注】 + * 该操作属于最小操作子集 + */ +int StrCompare(SString S, SString T) { + int i = 1; + + while(i <= S[0] && i <= T[0]) { + // 遇到不同的字符时,比较其大小 + if(S[i] != T[i]) { + return S[i] - T[i]; + } + + i++; + } + + return S[0] - T[0]; +} + +/* + * 复制 + * + * 将串S复制到串T。 + */ +Status StrCopy(SString T, SString S) { + int i; + + // 连同长度信息一起复制 + for(i = 0; i <= S[0]; i++) { + T[i] = S[i]; + } + + return OK; +} + +/* + * 清理字符串S中的空白,包括清理不可打印字符和清理空格。 + * + *【注】 + * 该函数是在本章中新增的。 + */ +Status ClearBlank(SString S) { + int i, j; + + // 如果是空串 + if(S[0] == 0) { + return ERROR; + } + + for(i = 1, j = 0; i <= S[0]; i++) { + // 如果遇到空白,则略过 + if(S[i] == ' ' || !isprint(S[i])) { + continue; + } + + j++; + + S[j] = S[i]; + } + + S[0] = j; + + return OK; +} diff --git a/CLion/ExerciseBook/05.34.2/SString.h b/CLion/ExerciseBook/05.34.2/SString.h new file mode 100644 index 0000000..e81ca79 --- /dev/null +++ b/CLion/ExerciseBook/05.34.2/SString.h @@ -0,0 +1,117 @@ +/*============================= + * 串的定长顺序存储表示(顺序串) + * + * 包含算法: 4.1、4.2、4.3、4.5 + ==============================*/ + +#ifndef SSTRING_H +#define SSTRING_H + +#include +#include // 提供 strlen 原型 +#include // 提供 isprint 原型 +#include "Status.h" //**▲01 绪论**// + +/* 宏定义 */ +#define MAXSTRLEN 255 // 顺序串的最大串长 + +/* + * 串的顺序存储类型定义 + * + * 注:有效元素从SString的1号单元开始存储 + * SString的0号单元用来存储其长度 + */ +typedef unsigned char SString[MAXSTRLEN + 1]; // 0号单元存放串的长度 + + +/* + * ████ 提示 ████ + * + * 遵循教材的书写习惯,pos指示字符的位序(不是索引),从1开始计数 + */ + + +/* + * 初始化 + * + * 构造一个值为chars的串T。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status StrAssign(SString T, const char* chars); + +/* + * 清空 + * + * 将串S清空。 + */ +Status ClearString(SString S); + +/* + * 判空 + * + * 判断串S中是否包含有效数据。 + * + * 返回值: + * TRUE : 串S为空 + * FALSE: 串S不为空 + */ +Status StrEmpty(SString S); + +/* + * 计数 + * + * 返回串S中元素的个数。 + * + *【注】 + * 该操作属于最小操作子集 + */ +int StrLength(SString S); + +/* + * ████████ 算法4.3 ████████ + * + * 求子串 + * + * 用Sub返回S[pos, pos+len-1]。 + * 返回值指示是否截取成功。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status SubString(SString Sub, SString S, int pos, int len); + +/* + * 删除 + * + * 删除S[pos, pos+len-1]。 + */ +Status StrDelete(SString S, int pos, int len); + +/* + * 比较 + * + * 比较串S和串T,返回比较结果。 + * + *【注】 + * 该操作属于最小操作子集 + */ +int StrCompare(SString S, SString T); + +/* + * 复制 + * + * 将串S复制到串T。 + */ +Status StrCopy(SString T, SString S); + +/* + * 清理字符串S中的空白,包括清理不可打印字符和清理空格。 + * + *【注】 + * 该函数是在本章中新增的。 + */ +Status ClearBlank(SString S); + +#endif diff --git a/CLion/ExerciseBook/05.35-05.36/05.35-05.36.c b/CLion/ExerciseBook/05.35-05.36/05.35-05.36.c new file mode 100644 index 0000000..313ba72 --- /dev/null +++ b/CLion/ExerciseBook/05.35-05.36/05.35-05.36.c @@ -0,0 +1,45 @@ +#include +#include "Status.h" //**▲01 绪论**// +#include "SString.h" //**▲04 串**// +#include "GList.h" //**▲05 数组和广义表**// + +/* + * 创建广义表L,这里将"( )"定义为广义表为空的状态。 + */ +Status Algo_5_35(GList* L, SString S); + +/* + * 带括号输出广义表L,这里将"( )"定义为广义表为空的状态。 + */ +void Algo_5_36(GList L); + + +int main(int argc, char* argv[]) { + GList L; + char* s = "(( ),(e),(a,(b,c,d)))"; + SString S; + + printf("创建广义表 L ...\n"); + StrAssign(S, s); + Algo_5_35(&L, S); + + printf("L = "); + Algo_5_36(L); + + return 0; +} + + +/* + * 创建广义表L,这里将"( )"定义为广义表为空的状态。 + */ +Status Algo_5_35(GList* L, SString S) { + return CreateGList(L, S); +} + +/* + * 带括号输出广义表L,这里将"( )"定义为广义表为空的状态。 + */ +void Algo_5_36(GList L) { + PrintGraph(L); +} diff --git a/CLion/ExerciseBook/05.35-05.36/CMakeLists.txt b/CLion/ExerciseBook/05.35-05.36/CMakeLists.txt new file mode 100644 index 0000000..2667f03 --- /dev/null +++ b/CLion/ExerciseBook/05.35-05.36/CMakeLists.txt @@ -0,0 +1,7 @@ +# 包含公共库 +include_directories(${CMAKE_SOURCE_DIR}/Status) + +# 生成可执行文件 +add_executable(05.35-05.36 SString.h SString.c GList.h GList.c 05.35-05.36.c) +# 链接公共库 +target_link_libraries(05.35-05.36 Scanf_lib) \ No newline at end of file diff --git a/CLion/ExerciseBook/05.35-05.36/GList.c b/CLion/ExerciseBook/05.35-05.36/GList.c new file mode 100644 index 0000000..967762f --- /dev/null +++ b/CLion/ExerciseBook/05.35-05.36/GList.c @@ -0,0 +1,179 @@ +/*============================ + * 广义表的头尾链表存储表示 + =============================*/ + +#include "GList.h" + +/* + * 创建 + * + * 由字符串S创建广义表L。 + * + *【注】 + * 这里将"( )"定义为广义表为空的状态。 + */ +Status CreateGList(GList* L, SString S) { + SString emp; // 代表空广义表的字符串 + SString hsub, sub; + GList p, q; + + if(L == NULL) { + return ERROR; + } + + // 清理字符串S中的空白,包括清理不可打印字符和清理空格 + ClearBlank(S); + + if(StrEmpty(S)) { + return ERROR; + } + + StrAssign(emp, "( )"); + + /* + * 如果输入串为(),则代表需要创建空的广义表 + * + *【注】 + * 教材这里的代码是有问题的。 + * StrCompare的返回值指示的是两个字符串的大小,而不是指示两个字符串是否相等。 + * 如果给定的S与()相等,返回值应当是0。 + */ + if(!StrCompare(S, emp)) { + *L = NULL; + } else { + *L = (GList) malloc(sizeof(GLNode)); + if(*L == NULL) { + exit(OVERFLOW); + } + + // 创建原子 + if(StrLength(S) == 1) { + (*L)->tag = Atom; + (*L)->Node.atom = S[1]; + } else { + (*L)->tag = List; + + p = *L; + + // 去掉最外层括号 + SubString(sub, S, 2, StrLength(S) - 2); + + // 重复建n个子表 + do { + // 从sub中分离出表头串hsub,分离完成后,sub也会发生变化 + sever(hsub, sub); + + // 递归创建广义表 + CreateGList(&(p->Node.ptr.hp), hsub); + + q = p; + + // 如果表尾不为空,需要继续处理表尾 + if(!StrEmpty(sub)) { + p = (GList) malloc(sizeof(GLNode)); + if(p == NULL) { + exit(OVERFLOW); + } + + p->tag = List; + + q->Node.ptr.tp = p; + } + } while(!StrEmpty(sub)); + + q->Node.ptr.tp = NULL; + } + } + + return OK; +} + +/* + * 图形化输出 + * + * 带括号输出广义表L。 + * + *【注】 + * 这里将"( )"定义为广义表为空的状态。 + */ +void PrintGraph(GList L) { + Print(L, Head); + printf("\n"); +} + +/* + * 图形化输出的内部实现,mark是图形化输出标记。 + */ +static void Print(GList L, Mark mark) { + // L为空 + if(L == NULL) { + if(mark == Head) { + printf("( "); + } + + printf(")"); + + // L不为空时 + } else { + // 对于原子结点,输出原子 + if(L->tag == Atom) { + printf("%c", L->Node.atom); + + // 对于子表结点,要对表头、表尾分别讨论 + } else { + if(mark == Head) { + printf("("); + } else { + printf(","); + } + + Print(L->Node.ptr.hp, Head); + Print(L->Node.ptr.tp, Tail); + } + } +} + +/* + * ████████ 算法5.8 ████████ + * + * 将非空串str分割成两部分:hsub为第一个','之前的子串,str为第一个','之后的子串。 + * + *【注】 + * 1.这里假设字符串str输入正确,其中无空白符号,且str【已经脱去最外层括号】。 + * 2.分离完成后,str也会发生变化 + */ +static void sever(SString hstr, SString str) { + int i, k, n; + SString ch; + + n = StrLength(str); + + i = 0; // 遍历字符串时的游标 + k = 0; // 标记遇到的未配对括号数量 + + do { + ++i; + + // 截取str第一个字符 + SubString(ch, str, i, 1); + + if(ch[1] == '(') { + ++k; + } + + if(ch[1] == ')') { + --k; + } + } while(i < n && (ch[1] != ',' || k != 0)); + + // 如果存在多个广义表结点 + if(i < n) { + SubString(hstr, str, 1, i - 1); + SubString(str, str, i + 1, n - i); + + // 只有一个广义表结点 + } else { + StrCopy(hstr, str); + ClearString(str); + } +} diff --git a/CLion/ExerciseBook/05.35-05.36/GList.h b/CLion/ExerciseBook/05.35-05.36/GList.h new file mode 100644 index 0000000..68e960a --- /dev/null +++ b/CLion/ExerciseBook/05.35-05.36/GList.h @@ -0,0 +1,82 @@ +/*============================ + * 广义表的头尾链表存储表示 + =============================*/ + +#ifndef GLIST_H +#define GLIST_H + +#include +#include // 提供 malloc、realloc、free、exit 原型 +#include "Status.h" //**▲01 绪论**// +#include "SString.h" //**▲04 串**// + +/* 原子元素类型 */ +typedef char AtomType; + +/* + * 广义表结点标记 + * + * Atom-0:原子结点 + * List-1:表结点 + */ +typedef enum { Atom, List } ElemTag; + +/* 广义表(头尾链表存储表示)类型定义 */ +typedef struct GLNode { + ElemTag tag; // 公共标记,用于区分原子结点和表结点 + + // 原子结点和表结点的联合部分 + union { + AtomType atom; // atom是原子结点的值域,AtomType由用户定义 + struct { + struct GLNode* hp; // 指向表头 + struct GLNode* tp; // 指向表尾 + } ptr; // 表结点的指针域 + } Node; +} GLNode; + +/* 广义表类型 */ +typedef GLNode* GList; + +/* + * 图形化输出标记 + * + * Head代表广义表指针来自表头 + * Tail代表广义表指针来自表尾 + */ +typedef enum { Head, Tail } Mark; + + +/* + * ████████ 算法5.7 ████████ + * + * 创建 + * + * 由字符串S创建广义表L。 + */ +Status CreateGList(GList* L, SString S); + +/* + * 图形化输出 + * + * 带括号输出广义表L。 + */ +void PrintGraph(GList L); + +/* + * 图形化输出的内部实现,mark是图形化输出标记。 + */ +static void Print(GList L, Mark mark); + +/* + * ████████ 算法5.8 ████████ + * + * 将非空串str分割成两部分:hsub为第一个','之前的子串,str为第一个','之后的子串。 + * + *【注】 + * 1.这里假设字符串str输入正确,其中无空白符号,且str【已经脱去最外层括号】。 + * 2.分离完成后,str也会发生变化 + */ +static void sever(SString hstr, SString str); + +#endif diff --git a/CLion/ExerciseBook/05.35-05.36/SString.c b/CLion/ExerciseBook/05.35-05.36/SString.c new file mode 100644 index 0000000..35e5267 --- /dev/null +++ b/CLion/ExerciseBook/05.35-05.36/SString.c @@ -0,0 +1,195 @@ +/*============================= + * 串的定长顺序存储表示(顺序串) + * + * 包含算法: 4.1、4.2、4.3、4.5 + ==============================*/ + +#include "SString.h" //**▲04 串**// + +/* + * 初始化 + * + * 构造一个值为chars的串T。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status StrAssign(SString T, const char* chars) { + int i, len; + + len = (int) strlen(chars); + + // chars过长 + if(len > MAXSTRLEN) { + return ERROR; + } + + T[0] = len; + for(i = 1; i <= len; i++) { + T[i] = chars[i - 1]; + } + + return OK; +} + +/* + * 清空 + * + * 将串S清空。 + */ +Status ClearString(SString S) { + // 只需要将长度置为0就可以 + S[0] = 0; + return OK; +} + +/* + * 判空 + * + * 判断串S中是否包含有效数据。 + * + * 返回值: + * TRUE : 串S为空 + * FALSE: 串S不为空 + */ +Status StrEmpty(SString S) { + return S[0] == 0 ? TRUE : FALSE; +} + +/* + * 计数 + * + * 返回串S中元素的个数。 + * + *【注】 + * 该操作属于最小操作子集 + */ +int StrLength(SString S) { + return S[0]; +} + +/* + * ████████ 算法4.3 ████████ + * + * 求子串 + * + * 用Sub返回S[pos, pos+len-1]。 + * 返回值指示是否截取成功。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status SubString(SString Sub, SString S, int pos, int len) { + int i; + + if(pos < 1 || pos > S[0] || len < 0 || pos + len - 1 > S[0]) { + return ERROR; + } + + // 复制元素 + for(i = 1; i <= len; i++) { + Sub[i] = S[pos + i - 1]; + } + + // 确定新长度 + Sub[0] = len; + + return OK; +} + +/* + * 删除 + * + * 删除S[pos, pos+len-1]。 + */ +Status StrDelete(SString S, int pos, int len) { + int i; + + if(pos < 1 || pos + len - 1 > S[0] || len < 0) { + return ERROR; + } + + // 如果待删除的长度为0,则提前返回 + if(len == 0) { + return OK; + } + + // 把后面的元素挪到前面,覆盖掉被删除的元素 + for(i = pos + len; i <= S[0]; i++) { + S[i - len] = S[i]; + } + + // 长度减少 + S[0] -= len; + + return OK; +} + +/* + * 比较 + * + * 比较串S和串T,返回比较结果。 + * + *【注】 + * 该操作属于最小操作子集 + */ +int StrCompare(SString S, SString T) { + int i = 1; + + while(i <= S[0] && i <= T[0]) { + // 遇到不同的字符时,比较其大小 + if(S[i] != T[i]) { + return S[i] - T[i]; + } + + i++; + } + + return S[0] - T[0]; +} + +/* + * 复制 + * + * 将串S复制到串T。 + */ +Status StrCopy(SString T, SString S) { + int i; + + // 连同长度信息一起复制 + for(i = 0; i <= S[0]; i++) { + T[i] = S[i]; + } + + return OK; +} + +/* + * 清理字符串S中的不可打印字符,【不清理】空格 + * + *【注】 + * 该函数是在本章中新增的。 + */ +Status ClearBlank(SString S) { + int i, j; + + // 如果是空串 + if(S[0] == 0) { + return ERROR; + } + + for(i = 1, j = 0; i <= S[0]; i++) { + // 如果遇到空白,则略过 + if(!isprint(S[i])) { + continue; + } + + j++; + + S[j] = S[i]; + } + + S[0] = j; + + return OK; +} diff --git a/CLion/ExerciseBook/05.35-05.36/SString.h b/CLion/ExerciseBook/05.35-05.36/SString.h new file mode 100644 index 0000000..629be89 --- /dev/null +++ b/CLion/ExerciseBook/05.35-05.36/SString.h @@ -0,0 +1,117 @@ +/*============================= + * 串的定长顺序存储表示(顺序串) + * + * 包含算法: 4.1、4.2、4.3、4.5 + ==============================*/ + +#ifndef SSTRING_H +#define SSTRING_H + +#include +#include // 提供 strlen 原型 +#include // 提供 isprint 原型 +#include "Status.h" //**▲01 绪论**// + +/* 宏定义 */ +#define MAXSTRLEN 255 // 顺序串的最大串长 + +/* + * 串的顺序存储类型定义 + * + * 注:有效元素从SString的1号单元开始存储 + * SString的0号单元用来存储其长度 + */ +typedef unsigned char SString[MAXSTRLEN + 1]; // 0号单元存放串的长度 + + +/* + * ████ 提示 ████ + * + * 遵循教材的书写习惯,pos指示字符的位序(不是索引),从1开始计数 + */ + + +/* + * 初始化 + * + * 构造一个值为chars的串T。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status StrAssign(SString T, const char* chars); + +/* + * 清空 + * + * 将串S清空。 + */ +Status ClearString(SString S); + +/* + * 判空 + * + * 判断串S中是否包含有效数据。 + * + * 返回值: + * TRUE : 串S为空 + * FALSE: 串S不为空 + */ +Status StrEmpty(SString S); + +/* + * 计数 + * + * 返回串S中元素的个数。 + * + *【注】 + * 该操作属于最小操作子集 + */ +int StrLength(SString S); + +/* + * ████████ 算法4.3 ████████ + * + * 求子串 + * + * 用Sub返回S[pos, pos+len-1]。 + * 返回值指示是否截取成功。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status SubString(SString Sub, SString S, int pos, int len); + +/* + * 删除 + * + * 删除S[pos, pos+len-1]。 + */ +Status StrDelete(SString S, int pos, int len); + +/* + * 比较 + * + * 比较串S和串T,返回比较结果。 + * + *【注】 + * 该操作属于最小操作子集 + */ +int StrCompare(SString S, SString T); + +/* + * 复制 + * + * 将串S复制到串T。 + */ +Status StrCopy(SString T, SString S); + +/* + * 清理字符串S中的不可打印字符,【不清理】空格 + * + *【注】 + * 该函数是在本章中新增的。 + */ +Status ClearBlank(SString S); + +#endif diff --git a/CLion/ExerciseBook/05.37.1/05.37.1.c b/CLion/ExerciseBook/05.37.1/05.37.1.c new file mode 100644 index 0000000..e1a14d1 --- /dev/null +++ b/CLion/ExerciseBook/05.37.1/05.37.1.c @@ -0,0 +1,63 @@ +#include +#include "SString.h" //**▲04 串**// +#include "GList-HT.h" //**▲05 数组和广义表**// + +/* + * 删除广义表中值为x的原子项(头尾链表存储表示) + */ +void Algo_5_37_1(GList* L, AtomType x); + + +int main(int argc, char* argv[]) { + GList L; + char* s = "((b),(e),(a,(b,c,d)),(b,((b),b)),x,b,(y))"; + SString S; + + printf("创建广义表 L ...\n"); + StrAssign(S, s); + CreateGList(&L, S); + printf("L = "); + PrintGraph(L); + + printf("删除 L 中的元素 'b' ...\n"); + Algo_5_37_1(&L, 'b'); + printf("L = "); + PrintGraph(L); + + return 0; +} + + +/* + * 删除广义表中值为x的原子项(头尾链表存储表示) + */ +void Algo_5_37_1(GList* L, AtomType x) { + GList h, p; + + if(L == NULL || *L == NULL || (*L)->tag == Atom) { + return; + } + + h = (*L)->Node.ptr.hp; + + if(h != NULL) { + if(h->tag == List) { + Algo_5_37_1(&((*L)->Node.ptr.hp), x); + Algo_5_37_1(&((*L)->Node.ptr.tp), x); + } else { + if(h->Node.atom == x) { + p = *L; + *L = (*L)->Node.ptr.tp; + p->Node.ptr.tp = NULL; + DestroyGList(&p); + Algo_5_37_1(L, x); + } else { + Algo_5_37_1(&((*L)->Node.ptr.tp), x); + } + } + } else { + if((*L)->Node.ptr.tp != NULL) { + Algo_5_37_1(&((*L)->Node.ptr.tp), x); + } + } +} diff --git a/CLion/ExerciseBook/05.37.1/CMakeLists.txt b/CLion/ExerciseBook/05.37.1/CMakeLists.txt new file mode 100644 index 0000000..05647e0 --- /dev/null +++ b/CLion/ExerciseBook/05.37.1/CMakeLists.txt @@ -0,0 +1,7 @@ +# 包含公共库 +include_directories(${CMAKE_SOURCE_DIR}/Status) + +# 生成可执行文件 +add_executable(05.37.1 SString.h SString.c GList-HT.h GList-HT.c 05.37.1.c) +# 链接公共库 +target_link_libraries(05.37.1 Scanf_lib) \ No newline at end of file diff --git a/CLion/ExerciseBook/05.37.1/GList-HT.c b/CLion/ExerciseBook/05.37.1/GList-HT.c new file mode 100644 index 0000000..ddf2766 --- /dev/null +++ b/CLion/ExerciseBook/05.37.1/GList-HT.c @@ -0,0 +1,418 @@ +/*============================ + * 广义表的头尾链表存储表示 + * + * 包含算法: 5.5、5.6、5.7、5.8 + =============================*/ + +#include "GList-HT.h" //**▲05 数组和广义表**// + +/* + * 初始化 + * + * 初始化空的广义表,长度为0,深度为1。 + * + *【注】 + * 需要对每一层去掉括号考察 + */ +Status InitGList(GList* L) { + if(L == NULL) { + return ERROR; + } + + *L = NULL; + + return OK; +} + +/* + * ████████ 算法5.7 ████████ + * + * 创建 + * + * 由字符串S创建广义表L。 + */ +Status CreateGList(GList* L, SString S) { + SString emp; // 代表空广义表的字符串 + SString hsub, sub; + GList p, q; + + if(L == NULL) { + return ERROR; + } + + // 清理字符串S中的空白,包括清理不可打印字符和清理空格 + ClearBlank(S); + + if(StrEmpty(S)) { + return ERROR; + } + + StrAssign(emp, "()"); + + /* + * 如果输入串为(),则代表需要创建空的广义表 + * + *【注】 + * 教材这里的代码是有问题的。 + * StrCompare的返回值指示的是两个字符串的大小,而不是指示两个字符串是否相等。 + * 如果给定的S与()相等,返回值应当是0。 + */ + if(!StrCompare(S, emp)) { + *L = NULL; + } else { + *L = (GList) malloc(sizeof(GLNode)); + if(*L == NULL) { + exit(OVERFLOW); + } + + // 创建原子 + if(StrLength(S) == 1) { + (*L)->tag = Atom; + (*L)->Node.atom = S[1]; + } else { + (*L)->tag = List; + + p = *L; + + // 去掉最外层括号 + SubString(sub, S, 2, StrLength(S) - 2); + + // 重复建n个子表 + do { + // 从sub中分离出表头串hsub,分离完成后,sub也会发生变化 + sever(hsub, sub); + + // 递归创建广义表 + CreateGList(&(p->Node.ptr.hp), hsub); + + q = p; + + // 如果表尾不为空,需要继续处理表尾 + if(!StrEmpty(sub)) { + p = (GList) malloc(sizeof(GLNode)); + if(p == NULL) { + exit(OVERFLOW); + } + + p->tag = List; + + q->Node.ptr.tp = p; + } + } while(!StrEmpty(sub)); + + q->Node.ptr.tp = NULL; + } + } + + return OK; +} + +/* + * 销毁 + * + * 释放广义表所占内存。 + */ +Status DestroyGList(GList* L) { + GList head, tail; + + if(L == NULL || *L == NULL) { + return ERROR; + } + + // 删除原子结点 + if((*L)->tag == Atom) { + free(*L); + *L = NULL; + + // 删除子表结点 + } else { + head = (*L)->Node.ptr.hp; + tail = (*L)->Node.ptr.tp; + free(*L); + *L = NULL; + DestroyGList(&head); + DestroyGList(&tail); + } + + return OK; +} + +/* + * ████████ 算法5.6 ████████ + * + * 复制 + * + * 由广义表L复制得到广义表T。 + */ +Status CopyGList(GList* T, GList L) { + if(T == NULL) { + return ERROR; + } + + if(L == NULL) { + *T = NULL; + } else { + // 新建广义表结点 + *T = (GList) malloc(sizeof(GLNode)); + if(*T == NULL) { + exit(OVERFLOW); + } + + (*T)->tag = L->tag; + + // 复制单原子 + if(L->tag == Atom) { + (*T)->Node.atom = L->Node.atom; + + // 复制表头和表尾 + } else { + CopyGList(&((*T)->Node.ptr.hp), L->Node.ptr.hp); + CopyGList(&((*T)->Node.ptr.tp), L->Node.ptr.tp); + } + } + + return OK; +} + +/* + * 计数 + * + * 返回广义表的长度。 + */ +int GListLength(GList L) { + int count; + + for(count = 0; L != NULL; count++, L = L->Node.ptr.tp) { + } + + return count; +} + +/* + * ████████ 算法5.5 ████████ + * + * 深度 + * + * 返回广义表的深度 + */ +int GListDepth(GList L) { + int max, deep; + GList p; + + // 空表深度为1 + if(L == NULL) { + return 1; + } + + // 原子深度为0 + if(L->tag == Atom) { + return 0; + } + + // 递归求子表深度 + for(max = 0, p = L; p != NULL; p = p->Node.ptr.tp) { + deep = GListDepth(p->Node.ptr.hp); + if(deep > max) { + max = deep; + } + } + + // 非空表的深度是各子元素最大深度加一 + return max + 1; +} + +/* + * 判空 + * + * 判断广义表是否为空。 + */ +Status GListEmpty(GList L) { + return L == NULL ? TRUE : FALSE; +} + +/* + * 表头 + */ +GList GetHead(GList L) { + GList p; + + // 空表无表头,这里不能返回NULL,不然分不清是失败了还是返回了空表 + if(L == NULL) { + exit(ERROR); + } + + CopyGList(&p, L->Node.ptr.hp); + + return p; +} + +/* + * 表尾 + */ +GList GetTail(GList L) { + GList p; + + // 空表无表尾,这里不能返回NULL,不然分不清是失败了还是返回了空表 + if(L == NULL) { + exit(ERROR); + } + + CopyGList(&p, L->Node.ptr.tp); + + return p; +} + +/* + * 插入 + * + * 将元素e插入为广义表L的第一个元素。 + */ +Status InsertFirst(GList* L, GList e) { + GList g; + + if(L == NULL) { + return ERROR; + } + + g = (GList) malloc(sizeof(GLNode)); + if(g == NULL) { + exit(OVERFLOW); + } + + g->tag = List; + g->Node.ptr.hp = e; + g->Node.ptr.tp = *L; + *L = g; + + return OK; +} + +/* + * 删除 + * + * 将广义表L的第一个元素删除,并用e返回。 + */ +Status DeleteFirst(GList* L, GList* e) { + GList p; + + // 空表无法删除 + if(L == NULL || *L == NULL) { + return ERROR; + } + + p = *L; + *L = (*L)->Node.ptr.tp; + + CopyGList(e, p->Node.ptr.hp); + + free(p); + + return OK; +} + +/* + * 遍历 + * + * 用visit函数访问广义表L。 + */ +void Traverse(GList L, void(Visit)(AtomType)) { + + if(L == NULL) { + return; + } + + if(L->tag == Atom) { + Visit(L->Node.atom); + } else { + Traverse(L->Node.ptr.hp, Visit); + Traverse(L->Node.ptr.tp, Visit); + } + +} + +/* + * 图形化输出 + * + * 带括号输出广义表L。 + */ +void PrintGraph(GList L) { + Print(L, Head); + printf("\n"); +} + +/* + * 图形化输出的内部实现,mark是图形化输出标记。 + */ +static void Print(GList L, Mark mark) { + // L为空 + if(L == NULL) { + if(mark == Head) { + printf("("); + } + + printf(")"); + + // L不为空时 + } else { + // 对于原子结点,输出原子 + if(L->tag == Atom) { + printf("%c", L->Node.atom); + + // 对于子表结点,要对表头、表尾分别讨论 + } else { + if(mark == Head) { + printf("("); + } else { + printf(","); + } + + Print(L->Node.ptr.hp, Head); + Print(L->Node.ptr.tp, Tail); + } + } +} + +/* + * ████████ 算法5.8 ████████ + * + * 将非空串str分割成两部分:hsub为第一个','之前的子串,str为第一个','之后的子串。 + * + *【注】 + * 1.这里假设字符串str输入正确,其中无空白符号,且str【已经脱去最外层括号】。 + * 2.分离完成后,str也会发生变化 + */ +static void sever(SString hstr, SString str) { + int i, k, n; + SString ch; + + n = StrLength(str); + + i = 0; // 遍历字符串时的游标 + k = 0; // 标记遇到的未配对括号数量 + + do { + ++i; + + // 截取str第一个字符 + SubString(ch, str, i, 1); + + if(ch[1] == '(') { + ++k; + } + + if(ch[1] == ')') { + --k; + } + } while(i < n && (ch[1] != ',' || k != 0)); + + // 如果存在多个广义表结点 + if(i < n) { + SubString(hstr, str, 1, i - 1); + SubString(str, str, i + 1, n - i); + + // 只有一个广义表结点 + } else { + StrCopy(hstr, str); + ClearString(str); + } +} diff --git a/CLion/ExerciseBook/05.37.1/GList-HT.h b/CLion/ExerciseBook/05.37.1/GList-HT.h new file mode 100644 index 0000000..07c0df2 --- /dev/null +++ b/CLion/ExerciseBook/05.37.1/GList-HT.h @@ -0,0 +1,164 @@ +/*============================ + * 广义表的头尾链表存储表示 + * + * 包含算法: 5.5、5.6、5.7、5.8 + =============================*/ + +#ifndef GLIST_HT_H +#define GLIST_HT_H + +#include +#include // 提供 malloc、realloc、free、exit 原型 +#include "Status.h" //**▲01 绪论**// +#include "SString.h" //**▲04 串**// + +/* 原子元素类型 */ +typedef char AtomType; + +/* + * 广义表结点标记 + * + * Atom-0:原子结点 + * List-1:表结点 + */ +typedef enum { Atom, List } ElemTag; + +/* 广义表(头尾链表存储表示)类型定义 */ +typedef struct GLNode { + ElemTag tag; // 公共标记,用于区分原子结点和表结点 + + // 原子结点和表结点的联合部分 + union { + AtomType atom; // atom是原子结点的值域,AtomType由用户定义 + struct { + struct GLNode* hp; // 指向表头 + struct GLNode* tp; // 指向表尾 + } ptr; // 表结点的指针域 + } Node; +} GLNode; + +/* 广义表类型 */ +typedef GLNode* GList; + +/* + * 图形化输出标记 + * + * Head代表广义表指针来自表头 + * Tail代表广义表指针来自表尾 + */ +typedef enum { Head, Tail } Mark; + + +/* + * 初始化 + * + * 初始化空的广义表,长度为0,深度为1。 + * + *【注】 + * 需要对每一层去掉括号考察 + */ +Status InitGList(GList* L); + +/* + * ████████ 算法5.7 ████████ + * + * 创建 + * + * 由字符串S创建广义表L。 + */ +Status CreateGList(GList* L, SString S); + +/* + * 销毁 + * + * 释放广义表所占内存。 + */ +Status DestroyGList(GList* L); + +/* + * ████████ 算法5.6 ████████ + * + * 复制 + * + * 由广义表L复制得到广义表T。 + */ +Status CopyGList(GList* T, GList L); + +/* + * 计数 + * + * 返回广义表的长度。 + */ +int GListLength(GList L); + +/* + * ████████ 算法5.5 ████████ + * + * 深度 + * + * 返回广义表的深度 + */ +int GListDepth(GList L); + +/* + * 判空 + * + * 判断广义表是否为空。 + */ +Status GListEmpty(GList L); + +/* + * 表头 + */ +GList GetHead(GList L); + +/* + * 表尾 + */ +GList GetTail(GList L); + +/* + * 插入 + * + * 将元素e插入为广义表L的第一个元素。 + */ +Status InsertFirst(GList* L, GList e); + +/* + * 删除 + * + * 将广义表L的第一个元素删除,并用e返回。 + */ +Status DeleteFirst(GList* L, GList* e); + +/* + * 遍历 + * + * 用visit函数访问广义表L。 + */ +void Traverse(GList L, void (Visit)(AtomType)); + +/* + * 图形化输出 + * + * 带括号输出广义表L。 + */ +void PrintGraph(GList L); + +/* + * 图形化输出的内部实现,mark是图形化输出标记。 + */ +static void Print(GList L, Mark mark); + +/* + * ████████ 算法5.8 ████████ + * + * 将非空串str分割成两部分:hsub为第一个','之前的子串,str为第一个','之后的子串。 + * + *【注】 + * 1.这里假设字符串str输入正确,其中无空白符号,且str【已经脱去最外层括号】。 + * 2.分离完成后,str也会发生变化 + */ +static void sever(SString hstr, SString str); + +#endif diff --git a/CLion/ExerciseBook/05.37.1/SString.c b/CLion/ExerciseBook/05.37.1/SString.c new file mode 100644 index 0000000..41d9e15 --- /dev/null +++ b/CLion/ExerciseBook/05.37.1/SString.c @@ -0,0 +1,195 @@ +/*============================= + * 串的定长顺序存储表示(顺序串) + * + * 包含算法: 4.1、4.2、4.3、4.5 + ==============================*/ + +#include "SString.h" //**▲04 串**// + +/* + * 初始化 + * + * 构造一个值为chars的串T。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status StrAssign(SString T, const char* chars) { + int i, len; + + len = (int) strlen(chars); + + // chars过长 + if(len > MAXSTRLEN) { + return ERROR; + } + + T[0] = len; + for(i = 1; i <= len; i++) { + T[i] = chars[i - 1]; + } + + return OK; +} + +/* + * 清空 + * + * 将串S清空。 + */ +Status ClearString(SString S) { + // 只需要将长度置为0就可以 + S[0] = 0; + return OK; +} + +/* + * 判空 + * + * 判断串S中是否包含有效数据。 + * + * 返回值: + * TRUE : 串S为空 + * FALSE: 串S不为空 + */ +Status StrEmpty(SString S) { + return S[0] == 0 ? TRUE : FALSE; +} + +/* + * 计数 + * + * 返回串S中元素的个数。 + * + *【注】 + * 该操作属于最小操作子集 + */ +int StrLength(SString S) { + return S[0]; +} + +/* + * ████████ 算法4.3 ████████ + * + * 求子串 + * + * 用Sub返回S[pos, pos+len-1]。 + * 返回值指示是否截取成功。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status SubString(SString Sub, SString S, int pos, int len) { + int i; + + if(pos < 1 || pos > S[0] || len < 0 || pos + len - 1 > S[0]) { + return ERROR; + } + + // 复制元素 + for(i = 1; i <= len; i++) { + Sub[i] = S[pos + i - 1]; + } + + // 确定新长度 + Sub[0] = len; + + return OK; +} + +/* + * 删除 + * + * 删除S[pos, pos+len-1]。 + */ +Status StrDelete(SString S, int pos, int len) { + int i; + + if(pos < 1 || pos + len - 1 > S[0] || len < 0) { + return ERROR; + } + + // 如果待删除的长度为0,则提前返回 + if(len == 0) { + return OK; + } + + // 把后面的元素挪到前面,覆盖掉被删除的元素 + for(i = pos + len; i <= S[0]; i++) { + S[i - len] = S[i]; + } + + // 长度减少 + S[0] -= len; + + return OK; +} + +/* + * 比较 + * + * 比较串S和串T,返回比较结果。 + * + *【注】 + * 该操作属于最小操作子集 + */ +int StrCompare(SString S, SString T) { + int i = 1; + + while(i <= S[0] && i <= T[0]) { + // 遇到不同的字符时,比较其大小 + if(S[i] != T[i]) { + return S[i] - T[i]; + } + + i++; + } + + return S[0] - T[0]; +} + +/* + * 复制 + * + * 将串S复制到串T。 + */ +Status StrCopy(SString T, SString S) { + int i; + + // 连同长度信息一起复制 + for(i = 0; i <= S[0]; i++) { + T[i] = S[i]; + } + + return OK; +} + +/* + * 清理字符串S中的空白,包括清理不可打印字符和清理空格。 + * + *【注】 + * 该函数是在本章中新增的。 + */ +Status ClearBlank(SString S) { + int i, j; + + // 如果是空串 + if(S[0] == 0) { + return ERROR; + } + + for(i = 1, j = 0; i <= S[0]; i++) { + // 如果遇到空白,则略过 + if(S[i] == ' ' || !isprint(S[i])) { + continue; + } + + j++; + + S[j] = S[i]; + } + + S[0] = j; + + return OK; +} diff --git a/CLion/ExerciseBook/05.37.1/SString.h b/CLion/ExerciseBook/05.37.1/SString.h new file mode 100644 index 0000000..e81ca79 --- /dev/null +++ b/CLion/ExerciseBook/05.37.1/SString.h @@ -0,0 +1,117 @@ +/*============================= + * 串的定长顺序存储表示(顺序串) + * + * 包含算法: 4.1、4.2、4.3、4.5 + ==============================*/ + +#ifndef SSTRING_H +#define SSTRING_H + +#include +#include // 提供 strlen 原型 +#include // 提供 isprint 原型 +#include "Status.h" //**▲01 绪论**// + +/* 宏定义 */ +#define MAXSTRLEN 255 // 顺序串的最大串长 + +/* + * 串的顺序存储类型定义 + * + * 注:有效元素从SString的1号单元开始存储 + * SString的0号单元用来存储其长度 + */ +typedef unsigned char SString[MAXSTRLEN + 1]; // 0号单元存放串的长度 + + +/* + * ████ 提示 ████ + * + * 遵循教材的书写习惯,pos指示字符的位序(不是索引),从1开始计数 + */ + + +/* + * 初始化 + * + * 构造一个值为chars的串T。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status StrAssign(SString T, const char* chars); + +/* + * 清空 + * + * 将串S清空。 + */ +Status ClearString(SString S); + +/* + * 判空 + * + * 判断串S中是否包含有效数据。 + * + * 返回值: + * TRUE : 串S为空 + * FALSE: 串S不为空 + */ +Status StrEmpty(SString S); + +/* + * 计数 + * + * 返回串S中元素的个数。 + * + *【注】 + * 该操作属于最小操作子集 + */ +int StrLength(SString S); + +/* + * ████████ 算法4.3 ████████ + * + * 求子串 + * + * 用Sub返回S[pos, pos+len-1]。 + * 返回值指示是否截取成功。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status SubString(SString Sub, SString S, int pos, int len); + +/* + * 删除 + * + * 删除S[pos, pos+len-1]。 + */ +Status StrDelete(SString S, int pos, int len); + +/* + * 比较 + * + * 比较串S和串T,返回比较结果。 + * + *【注】 + * 该操作属于最小操作子集 + */ +int StrCompare(SString S, SString T); + +/* + * 复制 + * + * 将串S复制到串T。 + */ +Status StrCopy(SString T, SString S); + +/* + * 清理字符串S中的空白,包括清理不可打印字符和清理空格。 + * + *【注】 + * 该函数是在本章中新增的。 + */ +Status ClearBlank(SString S); + +#endif diff --git a/CLion/ExerciseBook/05.37.2/05.37.2.c b/CLion/ExerciseBook/05.37.2/05.37.2.c new file mode 100644 index 0000000..9fb53fd --- /dev/null +++ b/CLion/ExerciseBook/05.37.2/05.37.2.c @@ -0,0 +1,56 @@ +#include +#include // 提供malloc、realloc、free、exit原型 +#include "SString.h" //**▲04 串**// +#include "GList-E.h" //**▲05 数组和广义表**// + +/* + * 删除广义表中值为x的原子项(扩展线性链表存储表示) + */ +void Algo_5_37_2(GList* L, AtomType x); + + +int main(int argc, char* argv[]) { + GList L; + char* s = "((b),(e),(a,(b,c,d)),(b,((b),b)),x,b,(y))"; + SString S; + + printf("创建广义表 L ...\n"); + StrAssign(S, s); + CreateGList(&L, S); + printf("L = "); + PrintGraph(L); + + printf("删除 L 中的元素 'b' ...\n"); + Algo_5_37_2(&L, 'b'); + printf("L = "); + PrintGraph(L); + + return 0; +} + + +/* + * 删除广义表中值为x的原子项(扩展线性链表存储表示) + */ +void Algo_5_37_2(GList* L, AtomType x) { + GList p; + + if(L == NULL || *L == NULL) { + return; + } + + if((*L)->tag == List) { + Algo_5_37_2(&((*L)->Node.hp), x); + Algo_5_37_2(&((*L)->tp), x); + } else { + if((*L)->Node.atom == x) { + p = *L; + *L = (*L)->tp; + free(p); + + Algo_5_37_2(L, x); + } else { + Algo_5_37_2(&((*L)->tp), x); + } + } +} diff --git a/CLion/ExerciseBook/05.37.2/CMakeLists.txt b/CLion/ExerciseBook/05.37.2/CMakeLists.txt new file mode 100644 index 0000000..5408a99 --- /dev/null +++ b/CLion/ExerciseBook/05.37.2/CMakeLists.txt @@ -0,0 +1,7 @@ +# 包含公共库 +include_directories(${CMAKE_SOURCE_DIR}/Status) + +# 生成可执行文件 +add_executable(05.37.2 SString.h SString.c GList-E.h GList-E.c 05.37.2.c) +# 链接公共库 +target_link_libraries(05.37.2 Scanf_lib) \ No newline at end of file diff --git a/CLion/ExerciseBook/05.37.2/GList-E.c b/CLion/ExerciseBook/05.37.2/GList-E.c new file mode 100644 index 0000000..d994024 --- /dev/null +++ b/CLion/ExerciseBook/05.37.2/GList-E.c @@ -0,0 +1,449 @@ +/*=========================== + * 广义表的扩展线性链表存储表示 + ============================*/ + +#include "GList-E.h" //**▲05 数组和广义表**// + +/* + * 初始化 + * + * 初始化空的广义表,长度为0,深度为1。 + * + *【注】 + * 需要对每一层带上括号考察 + */ +Status InitGList(GList* L) { + if(L == NULL) { + return ERROR; + } + + *L = (GList) malloc(sizeof(GLNode)); + if(!*L) { + exit(OVERFLOW); + } + + (*L)->tag = List; + (*L)->Node.hp = NULL; + (*L)->tp = NULL; + + return OK; +} + +/* + * 创建 + * + * 由字符串S创建广义表L。 + */ +Status CreateGList(GList* L, SString S) { + SString emp, hsub, sub, tmp; + + if(L == NULL) { + return ERROR; + } + + // 清理字符串S中的空白,包括清理不可打印字符和清理空格 + ClearBlank(S); + + if(StrEmpty(S)) { + return ERROR; + } + + // 复制是为了不破坏S + StrCopy(sub, S); + + /* + * 初次执行到此时,带着最外层的括号 + * 再次执行到此时,已经脱去了外层括号 + */ + sever(hsub, sub); + + *L = (GList) malloc(sizeof(GLNode)); + if(*L == NULL) { + exit(OVERFLOW); + } + + StrAssign(emp, "()"); + + if(!StrCompare(hsub, emp)) { + (*L)->tag = List; + (*L)->Node.hp = NULL; + } else { + if(StrLength(hsub) == 1) { + (*L)->tag = Atom; + (*L)->Node.atom = hsub[1]; + } else { + (*L)->tag = List; + + SubString(tmp, hsub, 2, StrLength(hsub) - 2); + + CreateGList(&((*L)->Node.hp), tmp); + } + } + + // 如果不存在队尾,则退出本层递归 + if(StrEmpty(sub)) { + (*L)->tp = NULL; + } else { + // 继续递归求表尾 + CreateGList(&((*L)->tp), sub); + } + + return OK; +} + +/* + * 销毁 + * + * 释放广义表所占内存。 + */ +Status DestroyGList(GList* L) { + GList head, tail; + + if(L == NULL || *L == NULL) { + return ERROR; + } + + // 处理子表结点 + if((*L)->tag == List) { + head = (*L)->Node.hp; // 表头 + tail = (*L)->tp; // 表尾 + + free(*L); + *L = NULL; + + // 递归处理表头 + if(head != NULL) { + DestroyGList(&head); + } + + // 递归处理表尾 + if(tail != NULL) { + DestroyGList(&tail); + } + + // 处理原子结点 + } else { + tail = (*L)->tp; // 表尾 + + free(*L); + *L = NULL; + + if(tail != NULL) { + DestroyGList(&tail); + } + } + + return OK; +} + +/* + * 复制 + * + * 由广义表L复制得到广义表T。 + */ +Status CopyGList(GList* T, GList L) { + + if(L == NULL) { + return ERROR; + } + + *T = (GList) malloc(sizeof(GLNode)); + if(*T == NULL) { + exit(OVERFLOW); + } + + // 复制原子 + if(L->tag == Atom) { + (*T)->tag = Atom; + (*T)->Node.atom = L->Node.atom; + + // 复制子表 + } else { + (*T)->tag = List; + + // 复制表头 + if(L->Node.hp != NULL) { + CopyGList(&((*T)->Node.hp), L->Node.hp); + } else { + (*T)->Node.hp = NULL; + } + } + + // 复制表尾 + if(L->tp != NULL) { + CopyGList(&((*T)->tp), L->tp); + } else { + (*T)->tp = NULL; + } + + return OK; +} + +/* + * 计数 + * + * 返回广义表的长度。 + */ +int GListLength(GList L) { + int count = 0; + GList p; + + // 广义表不存在 + if(L == NULL) { + return -1; + } + + p = L->Node.hp; + + while(p != NULL) { + ++count; + p = p->tp; + } + + return count; +} + +/* + * 深度 + * + * 返回广义表的深度 + */ +int GListDepth(GList L) { + int max, deep; + GList p; + + max = 0; + + // 广义表不存在 + if(L == NULL) { + return -1; + } + + // 空表深度为1 + if(L->tag == List && !L->Node.hp) { + return 1; + } + + // 原子深度为0 + if(L->tag == Atom) { + return 0; + } + + // 递归求子表深度 + for(p = L->Node.hp; p != NULL; p = p->tp) { + // 求以p为头指针的子表深度 + deep = GListDepth(p); + if(deep > max) { + max = deep; + } + } + + return max + 1; +} + +/* + * 判空 + * + * 判断广义表是否为空。 + */ +Status GListEmpty(GList L) { + // 广义表不存在 + if(L == NULL) { + return ERROR; + } + + if(L->tag == List && L->Node.hp == NULL && L->tp == NULL) { + return TRUE; + } else { + return ERROR; + } +} + +/* + * 表头 + */ +GList GetHead(GList L) { + GList p, q; + + // 广义表不存在或广义表为空表,无法获取表头 + if(L == NULL || L->Node.hp == NULL) { + return NULL; + } + + q = L->Node.hp->tp; // 临时保存L的表尾信息 + L->Node.hp->tp = NULL; // 截去L的表尾部分 + + CopyGList(&p, L->Node.hp); // 复制表头信息(已屏蔽表尾) + + L->Node.hp->tp = q; // 恢复L的表尾信息 + + return p; +} + +/* + * 表尾 + */ +GList GetTail(GList L) { + GList p, q; + + // 广义表不存在或广义表为空表,无法获取表尾 + if(L == NULL || L->Node.hp == NULL) { + return NULL; + } + + q = L->Node.hp; // 临时保存L的表头信息 + L->Node.hp = q->tp; // 摘下L的表头部分 + + CopyGList(&p, L); // 复制表尾信息(已屏蔽表头) + + q->tp = L->Node.hp; // 恢复L的表头信息 + L->Node.hp = q; + + return p; +} + +/* + * 插入 + * + * 将元素e插入为广义表L的第一个元素。 + */ +Status InsertFirst(GList* L, GList e) { + + // 广义表不存在 + if(L == NULL || *L == NULL) { + return ERROR; + } + + if(e == NULL) { + return ERROR; + } + + e->tp = (*L)->Node.hp; + (*L)->Node.hp = e; + + return OK; +} + +/* + * 删除 + * + * 将广义表L的第一个元素删除,并用e返回。 + */ +Status DeleteFirst(GList* L, GList* e) { + GList p; + + // 广义表不存在或广义表为空表,则无法删除表头 + if(*L == NULL || (*L)->Node.hp == NULL) { + return ERROR; + } + + p = (*L)->Node.hp; + (*L)->Node.hp = p->tp; + p->tp = NULL; + + *e = p; + + return OK; +} + +/* + * 遍历 + * + * 用visit函数访问广义表L。 + */ +void Traverse(GList L, void(Visit)(AtomType)) { + if(L == NULL) { + return; + } + + if(L->tag == List) { + Traverse(L->Node.hp, Visit); + } else { + Visit(L->Node.atom); + } + + Traverse(L->tp, Visit); +} + +/* + * 图形化输出 + * + * 带括号输出广义表L。 + */ +void PrintGraph(GList L) { + Print(L); + printf("\n"); +} + +/* + * 图形化输出的内部实现。 + */ +static void Print(GList L) { + if(L == NULL) { + return; + } + + // 处理表结点 + if(L->tag == List) { + printf("("); + + if(L->Node.hp) { + Print(L->Node.hp); + } + + if(L->tp) { + printf("),"); + Print(L->tp); + } else { + printf(")"); + } + + // 处理原子结点 + } else { + printf("%c", L->Node.atom); + if(L->tp) { + printf(","); + Print(L->tp); + } + } +} + +/* + * 将非空串str分割成两部分:hsub为第一个','之前的子串,str为第一个','之后的子串。 + * + *【注】 + * 1.这里假设字符串str输入正确,其中无空白符号, + * 但str外层的括号可能脱去,也可能未脱去。 + * 2.分离完成后,str也会发生变化 + */ +static void sever(SString hstr, SString str) { + int i, k, n; + SString ch; + + n = StrLength(str); + + i = 0; // 遍历字符串时的游标 + k = 0; // 标记遇到的未配对括号数量 + + do { + ++i; + + // 截取str第一个字符 + SubString(ch, str, i, 1); + + if(ch[1] == '(') { + ++k; + } + if(ch[1] == ')') { + --k; + } + } while(i < n && (ch[1] != ',' || k != 0)); + + if(i < n) { + SubString(hstr, str, 1, i - 1); + SubString(str, str, i + 1, n - i); + } else { + StrCopy(hstr, str); + ClearString(str); + } +} diff --git a/CLion/ExerciseBook/05.37.2/GList-E.h b/CLion/ExerciseBook/05.37.2/GList-E.h new file mode 100644 index 0000000..5e5b625 --- /dev/null +++ b/CLion/ExerciseBook/05.37.2/GList-E.h @@ -0,0 +1,146 @@ +/*=========================== + * 广义表的扩展线性链表存储表示 + ============================*/ + +#ifndef GLIST_E_H +#define GLIST_E_H + +#include +#include // 提供 malloc、realloc、free、exit 原型 +#include "Status.h" //**▲01 绪论**// +#include "SString.h" //**▲04 串**// + +/* 原子元素类型 */ +typedef char AtomType; //原子类型 + +/* + * 广义表结点标记 + * + * Atom-0:原子结点 + * List-1:表结点 + */ +typedef enum { Atom, List } ElemTag; + +/* 广义表(扩展线性链表存储表示)类型定义 */ +typedef struct GLNode { + ElemTag tag; // 公共标记,用于区分原子结点和表结点 + + // 原子结点和表结点的联合部分 + union + { + AtomType atom; // atom是原子结点的值域,AtomType由用户定义 + struct GLNode* hp; // 指向表头 + } Node; + struct GLNode* tp; // 指向表尾 +} GLNode; + +/* 广义表类型 */ +typedef GLNode* GList; + + +/* + * 初始化 + * + * 初始化空的广义表,长度为0,深度为1。 + * + *【注】 + * 需要对每一层带上括号考察 + */ +Status InitGList(GList* L); + +/* + * 创建 + * + * 由字符串S创建广义表L。 + */ +Status CreateGList(GList* L, SString S); + +/* + * 销毁 + * + * 释放广义表所占内存。 + */ +Status DestroyGList(GList* L); + +/* + * 复制 + * + * 由广义表L复制得到广义表T。 + */ +Status CopyGList(GList* T, GList L); + +/* + * 计数 + * + * 返回广义表的长度。 + */ +int GListLength(GList L); + +/* + * 深度 + * + * 返回广义表的深度 + */ +int GListDepth(GList L); + +/* + * 判空 + * + * 判断广义表是否为空。 + */ +Status GListEmpty(GList L); + +/* + * 表头 + */ +GList GetHead(GList L); + +/* + * 表尾 + */ +GList GetTail(GList L); + +/* + * 插入 + * + * 将元素e插入为广义表L的第一个元素。 + */ +Status InsertFirst(GList* L, GList e); + +/* + * 删除 + * + * 将广义表L的第一个元素删除,并用e返回。 + */ +Status DeleteFirst(GList* L, GList* e); + +/* + * 遍历 + * + * 用visit函数访问广义表L。 + */ +void Traverse(GList L, void(Visit)(AtomType)); + +/* + * 图形化输出 + * + * 带括号输出广义表L。 + */ +void PrintGraph(GList L); + +/* + * 图形化输出的内部实现。 + */ +static void Print(GList L); + +/* + * 将非空串str分割成两部分:hsub为第一个','之前的子串,str为第一个','之后的子串。 + * + *【注】 + * 1.这里假设字符串str输入正确,其中无空白符号, + * 但str外层的括号可能脱去,也可能未脱去。 + * 2.分离完成后,str也会发生变化 + */ +static void sever(SString hstr, SString str); + +#endif diff --git a/CLion/ExerciseBook/05.37.2/SString.c b/CLion/ExerciseBook/05.37.2/SString.c new file mode 100644 index 0000000..41d9e15 --- /dev/null +++ b/CLion/ExerciseBook/05.37.2/SString.c @@ -0,0 +1,195 @@ +/*============================= + * 串的定长顺序存储表示(顺序串) + * + * 包含算法: 4.1、4.2、4.3、4.5 + ==============================*/ + +#include "SString.h" //**▲04 串**// + +/* + * 初始化 + * + * 构造一个值为chars的串T。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status StrAssign(SString T, const char* chars) { + int i, len; + + len = (int) strlen(chars); + + // chars过长 + if(len > MAXSTRLEN) { + return ERROR; + } + + T[0] = len; + for(i = 1; i <= len; i++) { + T[i] = chars[i - 1]; + } + + return OK; +} + +/* + * 清空 + * + * 将串S清空。 + */ +Status ClearString(SString S) { + // 只需要将长度置为0就可以 + S[0] = 0; + return OK; +} + +/* + * 判空 + * + * 判断串S中是否包含有效数据。 + * + * 返回值: + * TRUE : 串S为空 + * FALSE: 串S不为空 + */ +Status StrEmpty(SString S) { + return S[0] == 0 ? TRUE : FALSE; +} + +/* + * 计数 + * + * 返回串S中元素的个数。 + * + *【注】 + * 该操作属于最小操作子集 + */ +int StrLength(SString S) { + return S[0]; +} + +/* + * ████████ 算法4.3 ████████ + * + * 求子串 + * + * 用Sub返回S[pos, pos+len-1]。 + * 返回值指示是否截取成功。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status SubString(SString Sub, SString S, int pos, int len) { + int i; + + if(pos < 1 || pos > S[0] || len < 0 || pos + len - 1 > S[0]) { + return ERROR; + } + + // 复制元素 + for(i = 1; i <= len; i++) { + Sub[i] = S[pos + i - 1]; + } + + // 确定新长度 + Sub[0] = len; + + return OK; +} + +/* + * 删除 + * + * 删除S[pos, pos+len-1]。 + */ +Status StrDelete(SString S, int pos, int len) { + int i; + + if(pos < 1 || pos + len - 1 > S[0] || len < 0) { + return ERROR; + } + + // 如果待删除的长度为0,则提前返回 + if(len == 0) { + return OK; + } + + // 把后面的元素挪到前面,覆盖掉被删除的元素 + for(i = pos + len; i <= S[0]; i++) { + S[i - len] = S[i]; + } + + // 长度减少 + S[0] -= len; + + return OK; +} + +/* + * 比较 + * + * 比较串S和串T,返回比较结果。 + * + *【注】 + * 该操作属于最小操作子集 + */ +int StrCompare(SString S, SString T) { + int i = 1; + + while(i <= S[0] && i <= T[0]) { + // 遇到不同的字符时,比较其大小 + if(S[i] != T[i]) { + return S[i] - T[i]; + } + + i++; + } + + return S[0] - T[0]; +} + +/* + * 复制 + * + * 将串S复制到串T。 + */ +Status StrCopy(SString T, SString S) { + int i; + + // 连同长度信息一起复制 + for(i = 0; i <= S[0]; i++) { + T[i] = S[i]; + } + + return OK; +} + +/* + * 清理字符串S中的空白,包括清理不可打印字符和清理空格。 + * + *【注】 + * 该函数是在本章中新增的。 + */ +Status ClearBlank(SString S) { + int i, j; + + // 如果是空串 + if(S[0] == 0) { + return ERROR; + } + + for(i = 1, j = 0; i <= S[0]; i++) { + // 如果遇到空白,则略过 + if(S[i] == ' ' || !isprint(S[i])) { + continue; + } + + j++; + + S[j] = S[i]; + } + + S[0] = j; + + return OK; +} diff --git a/CLion/ExerciseBook/05.37.2/SString.h b/CLion/ExerciseBook/05.37.2/SString.h new file mode 100644 index 0000000..e81ca79 --- /dev/null +++ b/CLion/ExerciseBook/05.37.2/SString.h @@ -0,0 +1,117 @@ +/*============================= + * 串的定长顺序存储表示(顺序串) + * + * 包含算法: 4.1、4.2、4.3、4.5 + ==============================*/ + +#ifndef SSTRING_H +#define SSTRING_H + +#include +#include // 提供 strlen 原型 +#include // 提供 isprint 原型 +#include "Status.h" //**▲01 绪论**// + +/* 宏定义 */ +#define MAXSTRLEN 255 // 顺序串的最大串长 + +/* + * 串的顺序存储类型定义 + * + * 注:有效元素从SString的1号单元开始存储 + * SString的0号单元用来存储其长度 + */ +typedef unsigned char SString[MAXSTRLEN + 1]; // 0号单元存放串的长度 + + +/* + * ████ 提示 ████ + * + * 遵循教材的书写习惯,pos指示字符的位序(不是索引),从1开始计数 + */ + + +/* + * 初始化 + * + * 构造一个值为chars的串T。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status StrAssign(SString T, const char* chars); + +/* + * 清空 + * + * 将串S清空。 + */ +Status ClearString(SString S); + +/* + * 判空 + * + * 判断串S中是否包含有效数据。 + * + * 返回值: + * TRUE : 串S为空 + * FALSE: 串S不为空 + */ +Status StrEmpty(SString S); + +/* + * 计数 + * + * 返回串S中元素的个数。 + * + *【注】 + * 该操作属于最小操作子集 + */ +int StrLength(SString S); + +/* + * ████████ 算法4.3 ████████ + * + * 求子串 + * + * 用Sub返回S[pos, pos+len-1]。 + * 返回值指示是否截取成功。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status SubString(SString Sub, SString S, int pos, int len); + +/* + * 删除 + * + * 删除S[pos, pos+len-1]。 + */ +Status StrDelete(SString S, int pos, int len); + +/* + * 比较 + * + * 比较串S和串T,返回比较结果。 + * + *【注】 + * 该操作属于最小操作子集 + */ +int StrCompare(SString S, SString T); + +/* + * 复制 + * + * 将串S复制到串T。 + */ +Status StrCopy(SString T, SString S); + +/* + * 清理字符串S中的空白,包括清理不可打印字符和清理空格。 + * + *【注】 + * 该函数是在本章中新增的。 + */ +Status ClearBlank(SString S); + +#endif diff --git a/CLion/ExerciseBook/05.38.1/05.38.1.c b/CLion/ExerciseBook/05.38.1/05.38.1.c new file mode 100644 index 0000000..b6eb09e --- /dev/null +++ b/CLion/ExerciseBook/05.38.1/05.38.1.c @@ -0,0 +1,47 @@ +#include +#include "SString.h" //**▲04 串**// +#include "GList-HT.h" //**▲05 数组和广义表**// + +/* + * 输出广义表中第l层的原子项(头尾链表存储表示) + */ +void Algo_5_38_1(GList L, int d, int l); + + +int main(int argc, char* argv[]) { + GList L; + char* s = "((a),(b),(c,(d,e,f)),(g,((h),i)))"; + SString S; + + printf("创建广义表 L ...\n"); + StrAssign(S, s); + CreateGList(&L, S); + printf("L = "); + PrintGraph(L); + + printf("广义表第 2 层的原子项为:"); + Algo_5_38_1(L, 0, 2); + printf("\n"); + + return 0; +} + + +/* + * 输出广义表中第l层的原子项(头尾链表存储表示) + */ +void Algo_5_38_1(GList L, int d, int l) { + int i = d; // d的初值赋值为0 + + if(L && l >= i) { + if(L->tag == Atom) { + // 层数符合 + if(l == i) { + printf("%c ", L->Node.atom); + } + } else { + Algo_5_38_1(L->Node.ptr.hp, i + 1, l); // 表头指针指向表的话层数增一 + Algo_5_38_1(L->Node.ptr.tp, i, l); + } + } +} diff --git a/CLion/ExerciseBook/05.38.1/CMakeLists.txt b/CLion/ExerciseBook/05.38.1/CMakeLists.txt new file mode 100644 index 0000000..06ff49f --- /dev/null +++ b/CLion/ExerciseBook/05.38.1/CMakeLists.txt @@ -0,0 +1,7 @@ +# 包含公共库 +include_directories(${CMAKE_SOURCE_DIR}/Status) + +# 生成可执行文件 +add_executable(05.38.1 SString.h SString.c GList-HT.h GList-HT.c 05.38.1.c) +# 链接公共库 +target_link_libraries(05.38.1 Scanf_lib) \ No newline at end of file diff --git a/CLion/ExerciseBook/05.38.1/GList-HT.c b/CLion/ExerciseBook/05.38.1/GList-HT.c new file mode 100644 index 0000000..ddf2766 --- /dev/null +++ b/CLion/ExerciseBook/05.38.1/GList-HT.c @@ -0,0 +1,418 @@ +/*============================ + * 广义表的头尾链表存储表示 + * + * 包含算法: 5.5、5.6、5.7、5.8 + =============================*/ + +#include "GList-HT.h" //**▲05 数组和广义表**// + +/* + * 初始化 + * + * 初始化空的广义表,长度为0,深度为1。 + * + *【注】 + * 需要对每一层去掉括号考察 + */ +Status InitGList(GList* L) { + if(L == NULL) { + return ERROR; + } + + *L = NULL; + + return OK; +} + +/* + * ████████ 算法5.7 ████████ + * + * 创建 + * + * 由字符串S创建广义表L。 + */ +Status CreateGList(GList* L, SString S) { + SString emp; // 代表空广义表的字符串 + SString hsub, sub; + GList p, q; + + if(L == NULL) { + return ERROR; + } + + // 清理字符串S中的空白,包括清理不可打印字符和清理空格 + ClearBlank(S); + + if(StrEmpty(S)) { + return ERROR; + } + + StrAssign(emp, "()"); + + /* + * 如果输入串为(),则代表需要创建空的广义表 + * + *【注】 + * 教材这里的代码是有问题的。 + * StrCompare的返回值指示的是两个字符串的大小,而不是指示两个字符串是否相等。 + * 如果给定的S与()相等,返回值应当是0。 + */ + if(!StrCompare(S, emp)) { + *L = NULL; + } else { + *L = (GList) malloc(sizeof(GLNode)); + if(*L == NULL) { + exit(OVERFLOW); + } + + // 创建原子 + if(StrLength(S) == 1) { + (*L)->tag = Atom; + (*L)->Node.atom = S[1]; + } else { + (*L)->tag = List; + + p = *L; + + // 去掉最外层括号 + SubString(sub, S, 2, StrLength(S) - 2); + + // 重复建n个子表 + do { + // 从sub中分离出表头串hsub,分离完成后,sub也会发生变化 + sever(hsub, sub); + + // 递归创建广义表 + CreateGList(&(p->Node.ptr.hp), hsub); + + q = p; + + // 如果表尾不为空,需要继续处理表尾 + if(!StrEmpty(sub)) { + p = (GList) malloc(sizeof(GLNode)); + if(p == NULL) { + exit(OVERFLOW); + } + + p->tag = List; + + q->Node.ptr.tp = p; + } + } while(!StrEmpty(sub)); + + q->Node.ptr.tp = NULL; + } + } + + return OK; +} + +/* + * 销毁 + * + * 释放广义表所占内存。 + */ +Status DestroyGList(GList* L) { + GList head, tail; + + if(L == NULL || *L == NULL) { + return ERROR; + } + + // 删除原子结点 + if((*L)->tag == Atom) { + free(*L); + *L = NULL; + + // 删除子表结点 + } else { + head = (*L)->Node.ptr.hp; + tail = (*L)->Node.ptr.tp; + free(*L); + *L = NULL; + DestroyGList(&head); + DestroyGList(&tail); + } + + return OK; +} + +/* + * ████████ 算法5.6 ████████ + * + * 复制 + * + * 由广义表L复制得到广义表T。 + */ +Status CopyGList(GList* T, GList L) { + if(T == NULL) { + return ERROR; + } + + if(L == NULL) { + *T = NULL; + } else { + // 新建广义表结点 + *T = (GList) malloc(sizeof(GLNode)); + if(*T == NULL) { + exit(OVERFLOW); + } + + (*T)->tag = L->tag; + + // 复制单原子 + if(L->tag == Atom) { + (*T)->Node.atom = L->Node.atom; + + // 复制表头和表尾 + } else { + CopyGList(&((*T)->Node.ptr.hp), L->Node.ptr.hp); + CopyGList(&((*T)->Node.ptr.tp), L->Node.ptr.tp); + } + } + + return OK; +} + +/* + * 计数 + * + * 返回广义表的长度。 + */ +int GListLength(GList L) { + int count; + + for(count = 0; L != NULL; count++, L = L->Node.ptr.tp) { + } + + return count; +} + +/* + * ████████ 算法5.5 ████████ + * + * 深度 + * + * 返回广义表的深度 + */ +int GListDepth(GList L) { + int max, deep; + GList p; + + // 空表深度为1 + if(L == NULL) { + return 1; + } + + // 原子深度为0 + if(L->tag == Atom) { + return 0; + } + + // 递归求子表深度 + for(max = 0, p = L; p != NULL; p = p->Node.ptr.tp) { + deep = GListDepth(p->Node.ptr.hp); + if(deep > max) { + max = deep; + } + } + + // 非空表的深度是各子元素最大深度加一 + return max + 1; +} + +/* + * 判空 + * + * 判断广义表是否为空。 + */ +Status GListEmpty(GList L) { + return L == NULL ? TRUE : FALSE; +} + +/* + * 表头 + */ +GList GetHead(GList L) { + GList p; + + // 空表无表头,这里不能返回NULL,不然分不清是失败了还是返回了空表 + if(L == NULL) { + exit(ERROR); + } + + CopyGList(&p, L->Node.ptr.hp); + + return p; +} + +/* + * 表尾 + */ +GList GetTail(GList L) { + GList p; + + // 空表无表尾,这里不能返回NULL,不然分不清是失败了还是返回了空表 + if(L == NULL) { + exit(ERROR); + } + + CopyGList(&p, L->Node.ptr.tp); + + return p; +} + +/* + * 插入 + * + * 将元素e插入为广义表L的第一个元素。 + */ +Status InsertFirst(GList* L, GList e) { + GList g; + + if(L == NULL) { + return ERROR; + } + + g = (GList) malloc(sizeof(GLNode)); + if(g == NULL) { + exit(OVERFLOW); + } + + g->tag = List; + g->Node.ptr.hp = e; + g->Node.ptr.tp = *L; + *L = g; + + return OK; +} + +/* + * 删除 + * + * 将广义表L的第一个元素删除,并用e返回。 + */ +Status DeleteFirst(GList* L, GList* e) { + GList p; + + // 空表无法删除 + if(L == NULL || *L == NULL) { + return ERROR; + } + + p = *L; + *L = (*L)->Node.ptr.tp; + + CopyGList(e, p->Node.ptr.hp); + + free(p); + + return OK; +} + +/* + * 遍历 + * + * 用visit函数访问广义表L。 + */ +void Traverse(GList L, void(Visit)(AtomType)) { + + if(L == NULL) { + return; + } + + if(L->tag == Atom) { + Visit(L->Node.atom); + } else { + Traverse(L->Node.ptr.hp, Visit); + Traverse(L->Node.ptr.tp, Visit); + } + +} + +/* + * 图形化输出 + * + * 带括号输出广义表L。 + */ +void PrintGraph(GList L) { + Print(L, Head); + printf("\n"); +} + +/* + * 图形化输出的内部实现,mark是图形化输出标记。 + */ +static void Print(GList L, Mark mark) { + // L为空 + if(L == NULL) { + if(mark == Head) { + printf("("); + } + + printf(")"); + + // L不为空时 + } else { + // 对于原子结点,输出原子 + if(L->tag == Atom) { + printf("%c", L->Node.atom); + + // 对于子表结点,要对表头、表尾分别讨论 + } else { + if(mark == Head) { + printf("("); + } else { + printf(","); + } + + Print(L->Node.ptr.hp, Head); + Print(L->Node.ptr.tp, Tail); + } + } +} + +/* + * ████████ 算法5.8 ████████ + * + * 将非空串str分割成两部分:hsub为第一个','之前的子串,str为第一个','之后的子串。 + * + *【注】 + * 1.这里假设字符串str输入正确,其中无空白符号,且str【已经脱去最外层括号】。 + * 2.分离完成后,str也会发生变化 + */ +static void sever(SString hstr, SString str) { + int i, k, n; + SString ch; + + n = StrLength(str); + + i = 0; // 遍历字符串时的游标 + k = 0; // 标记遇到的未配对括号数量 + + do { + ++i; + + // 截取str第一个字符 + SubString(ch, str, i, 1); + + if(ch[1] == '(') { + ++k; + } + + if(ch[1] == ')') { + --k; + } + } while(i < n && (ch[1] != ',' || k != 0)); + + // 如果存在多个广义表结点 + if(i < n) { + SubString(hstr, str, 1, i - 1); + SubString(str, str, i + 1, n - i); + + // 只有一个广义表结点 + } else { + StrCopy(hstr, str); + ClearString(str); + } +} diff --git a/CLion/ExerciseBook/05.38.1/GList-HT.h b/CLion/ExerciseBook/05.38.1/GList-HT.h new file mode 100644 index 0000000..07c0df2 --- /dev/null +++ b/CLion/ExerciseBook/05.38.1/GList-HT.h @@ -0,0 +1,164 @@ +/*============================ + * 广义表的头尾链表存储表示 + * + * 包含算法: 5.5、5.6、5.7、5.8 + =============================*/ + +#ifndef GLIST_HT_H +#define GLIST_HT_H + +#include +#include // 提供 malloc、realloc、free、exit 原型 +#include "Status.h" //**▲01 绪论**// +#include "SString.h" //**▲04 串**// + +/* 原子元素类型 */ +typedef char AtomType; + +/* + * 广义表结点标记 + * + * Atom-0:原子结点 + * List-1:表结点 + */ +typedef enum { Atom, List } ElemTag; + +/* 广义表(头尾链表存储表示)类型定义 */ +typedef struct GLNode { + ElemTag tag; // 公共标记,用于区分原子结点和表结点 + + // 原子结点和表结点的联合部分 + union { + AtomType atom; // atom是原子结点的值域,AtomType由用户定义 + struct { + struct GLNode* hp; // 指向表头 + struct GLNode* tp; // 指向表尾 + } ptr; // 表结点的指针域 + } Node; +} GLNode; + +/* 广义表类型 */ +typedef GLNode* GList; + +/* + * 图形化输出标记 + * + * Head代表广义表指针来自表头 + * Tail代表广义表指针来自表尾 + */ +typedef enum { Head, Tail } Mark; + + +/* + * 初始化 + * + * 初始化空的广义表,长度为0,深度为1。 + * + *【注】 + * 需要对每一层去掉括号考察 + */ +Status InitGList(GList* L); + +/* + * ████████ 算法5.7 ████████ + * + * 创建 + * + * 由字符串S创建广义表L。 + */ +Status CreateGList(GList* L, SString S); + +/* + * 销毁 + * + * 释放广义表所占内存。 + */ +Status DestroyGList(GList* L); + +/* + * ████████ 算法5.6 ████████ + * + * 复制 + * + * 由广义表L复制得到广义表T。 + */ +Status CopyGList(GList* T, GList L); + +/* + * 计数 + * + * 返回广义表的长度。 + */ +int GListLength(GList L); + +/* + * ████████ 算法5.5 ████████ + * + * 深度 + * + * 返回广义表的深度 + */ +int GListDepth(GList L); + +/* + * 判空 + * + * 判断广义表是否为空。 + */ +Status GListEmpty(GList L); + +/* + * 表头 + */ +GList GetHead(GList L); + +/* + * 表尾 + */ +GList GetTail(GList L); + +/* + * 插入 + * + * 将元素e插入为广义表L的第一个元素。 + */ +Status InsertFirst(GList* L, GList e); + +/* + * 删除 + * + * 将广义表L的第一个元素删除,并用e返回。 + */ +Status DeleteFirst(GList* L, GList* e); + +/* + * 遍历 + * + * 用visit函数访问广义表L。 + */ +void Traverse(GList L, void (Visit)(AtomType)); + +/* + * 图形化输出 + * + * 带括号输出广义表L。 + */ +void PrintGraph(GList L); + +/* + * 图形化输出的内部实现,mark是图形化输出标记。 + */ +static void Print(GList L, Mark mark); + +/* + * ████████ 算法5.8 ████████ + * + * 将非空串str分割成两部分:hsub为第一个','之前的子串,str为第一个','之后的子串。 + * + *【注】 + * 1.这里假设字符串str输入正确,其中无空白符号,且str【已经脱去最外层括号】。 + * 2.分离完成后,str也会发生变化 + */ +static void sever(SString hstr, SString str); + +#endif diff --git a/CLion/ExerciseBook/05.38.1/SString.c b/CLion/ExerciseBook/05.38.1/SString.c new file mode 100644 index 0000000..41d9e15 --- /dev/null +++ b/CLion/ExerciseBook/05.38.1/SString.c @@ -0,0 +1,195 @@ +/*============================= + * 串的定长顺序存储表示(顺序串) + * + * 包含算法: 4.1、4.2、4.3、4.5 + ==============================*/ + +#include "SString.h" //**▲04 串**// + +/* + * 初始化 + * + * 构造一个值为chars的串T。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status StrAssign(SString T, const char* chars) { + int i, len; + + len = (int) strlen(chars); + + // chars过长 + if(len > MAXSTRLEN) { + return ERROR; + } + + T[0] = len; + for(i = 1; i <= len; i++) { + T[i] = chars[i - 1]; + } + + return OK; +} + +/* + * 清空 + * + * 将串S清空。 + */ +Status ClearString(SString S) { + // 只需要将长度置为0就可以 + S[0] = 0; + return OK; +} + +/* + * 判空 + * + * 判断串S中是否包含有效数据。 + * + * 返回值: + * TRUE : 串S为空 + * FALSE: 串S不为空 + */ +Status StrEmpty(SString S) { + return S[0] == 0 ? TRUE : FALSE; +} + +/* + * 计数 + * + * 返回串S中元素的个数。 + * + *【注】 + * 该操作属于最小操作子集 + */ +int StrLength(SString S) { + return S[0]; +} + +/* + * ████████ 算法4.3 ████████ + * + * 求子串 + * + * 用Sub返回S[pos, pos+len-1]。 + * 返回值指示是否截取成功。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status SubString(SString Sub, SString S, int pos, int len) { + int i; + + if(pos < 1 || pos > S[0] || len < 0 || pos + len - 1 > S[0]) { + return ERROR; + } + + // 复制元素 + for(i = 1; i <= len; i++) { + Sub[i] = S[pos + i - 1]; + } + + // 确定新长度 + Sub[0] = len; + + return OK; +} + +/* + * 删除 + * + * 删除S[pos, pos+len-1]。 + */ +Status StrDelete(SString S, int pos, int len) { + int i; + + if(pos < 1 || pos + len - 1 > S[0] || len < 0) { + return ERROR; + } + + // 如果待删除的长度为0,则提前返回 + if(len == 0) { + return OK; + } + + // 把后面的元素挪到前面,覆盖掉被删除的元素 + for(i = pos + len; i <= S[0]; i++) { + S[i - len] = S[i]; + } + + // 长度减少 + S[0] -= len; + + return OK; +} + +/* + * 比较 + * + * 比较串S和串T,返回比较结果。 + * + *【注】 + * 该操作属于最小操作子集 + */ +int StrCompare(SString S, SString T) { + int i = 1; + + while(i <= S[0] && i <= T[0]) { + // 遇到不同的字符时,比较其大小 + if(S[i] != T[i]) { + return S[i] - T[i]; + } + + i++; + } + + return S[0] - T[0]; +} + +/* + * 复制 + * + * 将串S复制到串T。 + */ +Status StrCopy(SString T, SString S) { + int i; + + // 连同长度信息一起复制 + for(i = 0; i <= S[0]; i++) { + T[i] = S[i]; + } + + return OK; +} + +/* + * 清理字符串S中的空白,包括清理不可打印字符和清理空格。 + * + *【注】 + * 该函数是在本章中新增的。 + */ +Status ClearBlank(SString S) { + int i, j; + + // 如果是空串 + if(S[0] == 0) { + return ERROR; + } + + for(i = 1, j = 0; i <= S[0]; i++) { + // 如果遇到空白,则略过 + if(S[i] == ' ' || !isprint(S[i])) { + continue; + } + + j++; + + S[j] = S[i]; + } + + S[0] = j; + + return OK; +} diff --git a/CLion/ExerciseBook/05.38.1/SString.h b/CLion/ExerciseBook/05.38.1/SString.h new file mode 100644 index 0000000..e81ca79 --- /dev/null +++ b/CLion/ExerciseBook/05.38.1/SString.h @@ -0,0 +1,117 @@ +/*============================= + * 串的定长顺序存储表示(顺序串) + * + * 包含算法: 4.1、4.2、4.3、4.5 + ==============================*/ + +#ifndef SSTRING_H +#define SSTRING_H + +#include +#include // 提供 strlen 原型 +#include // 提供 isprint 原型 +#include "Status.h" //**▲01 绪论**// + +/* 宏定义 */ +#define MAXSTRLEN 255 // 顺序串的最大串长 + +/* + * 串的顺序存储类型定义 + * + * 注:有效元素从SString的1号单元开始存储 + * SString的0号单元用来存储其长度 + */ +typedef unsigned char SString[MAXSTRLEN + 1]; // 0号单元存放串的长度 + + +/* + * ████ 提示 ████ + * + * 遵循教材的书写习惯,pos指示字符的位序(不是索引),从1开始计数 + */ + + +/* + * 初始化 + * + * 构造一个值为chars的串T。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status StrAssign(SString T, const char* chars); + +/* + * 清空 + * + * 将串S清空。 + */ +Status ClearString(SString S); + +/* + * 判空 + * + * 判断串S中是否包含有效数据。 + * + * 返回值: + * TRUE : 串S为空 + * FALSE: 串S不为空 + */ +Status StrEmpty(SString S); + +/* + * 计数 + * + * 返回串S中元素的个数。 + * + *【注】 + * 该操作属于最小操作子集 + */ +int StrLength(SString S); + +/* + * ████████ 算法4.3 ████████ + * + * 求子串 + * + * 用Sub返回S[pos, pos+len-1]。 + * 返回值指示是否截取成功。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status SubString(SString Sub, SString S, int pos, int len); + +/* + * 删除 + * + * 删除S[pos, pos+len-1]。 + */ +Status StrDelete(SString S, int pos, int len); + +/* + * 比较 + * + * 比较串S和串T,返回比较结果。 + * + *【注】 + * 该操作属于最小操作子集 + */ +int StrCompare(SString S, SString T); + +/* + * 复制 + * + * 将串S复制到串T。 + */ +Status StrCopy(SString T, SString S); + +/* + * 清理字符串S中的空白,包括清理不可打印字符和清理空格。 + * + *【注】 + * 该函数是在本章中新增的。 + */ +Status ClearBlank(SString S); + +#endif diff --git a/CLion/ExerciseBook/05.38.2/05.38.2.c b/CLion/ExerciseBook/05.38.2/05.38.2.c new file mode 100644 index 0000000..9e72692 --- /dev/null +++ b/CLion/ExerciseBook/05.38.2/05.38.2.c @@ -0,0 +1,48 @@ +#include +#include "SString.h" //**▲04 串**// +#include "GList-E.h" //**▲05 数组和广义表**// + +/* + * 输出广义表中第l层的原子项(扩展线性链表存储表示) + */ +void Algo_5_38_2(GList L, int d, int l); + + +int main(int argc, char* argv[]) { + GList L; + char* s = "((a),(b),(c,(d,e,f)),(g,((h),i)))"; + SString S; + + printf("创建广义表 L ...\n"); + StrAssign(S, s); + CreateGList(&L, S); + printf("L = "); + PrintGraph(L); + + printf("广义表第 2 层的原子项为:"); + Algo_5_38_2(L, 0, 2); + printf("\n"); + + return 0; +} + + +/* + * 输出广义表中第l层的原子项(扩展线性链表存储表示) + */ +void Algo_5_38_2(GList L, int d, int l) { + int i = d; // d的初值赋值为0 + + if(L && l >= i) { + if(L->tag == Atom) { + // 层数符合 + if(l == i) { + printf("%c ", L->Node.atom); + } + } else { + Algo_5_38_2(L->Node.hp, i + 1, l); // 表头指针指向表的话层数增一 + } + + Algo_5_38_2(L->tp, i, l); + } +} diff --git a/CLion/ExerciseBook/05.38.2/CMakeLists.txt b/CLion/ExerciseBook/05.38.2/CMakeLists.txt new file mode 100644 index 0000000..3f25d1c --- /dev/null +++ b/CLion/ExerciseBook/05.38.2/CMakeLists.txt @@ -0,0 +1,7 @@ +# 包含公共库 +include_directories(${CMAKE_SOURCE_DIR}/Status) + +# 生成可执行文件 +add_executable(05.38.2 SString.h SString.c GList-E.h GList-E.c 05.38.2.c) +# 链接公共库 +target_link_libraries(05.38.2 Scanf_lib) \ No newline at end of file diff --git a/CLion/ExerciseBook/05.38.2/GList-E.c b/CLion/ExerciseBook/05.38.2/GList-E.c new file mode 100644 index 0000000..d994024 --- /dev/null +++ b/CLion/ExerciseBook/05.38.2/GList-E.c @@ -0,0 +1,449 @@ +/*=========================== + * 广义表的扩展线性链表存储表示 + ============================*/ + +#include "GList-E.h" //**▲05 数组和广义表**// + +/* + * 初始化 + * + * 初始化空的广义表,长度为0,深度为1。 + * + *【注】 + * 需要对每一层带上括号考察 + */ +Status InitGList(GList* L) { + if(L == NULL) { + return ERROR; + } + + *L = (GList) malloc(sizeof(GLNode)); + if(!*L) { + exit(OVERFLOW); + } + + (*L)->tag = List; + (*L)->Node.hp = NULL; + (*L)->tp = NULL; + + return OK; +} + +/* + * 创建 + * + * 由字符串S创建广义表L。 + */ +Status CreateGList(GList* L, SString S) { + SString emp, hsub, sub, tmp; + + if(L == NULL) { + return ERROR; + } + + // 清理字符串S中的空白,包括清理不可打印字符和清理空格 + ClearBlank(S); + + if(StrEmpty(S)) { + return ERROR; + } + + // 复制是为了不破坏S + StrCopy(sub, S); + + /* + * 初次执行到此时,带着最外层的括号 + * 再次执行到此时,已经脱去了外层括号 + */ + sever(hsub, sub); + + *L = (GList) malloc(sizeof(GLNode)); + if(*L == NULL) { + exit(OVERFLOW); + } + + StrAssign(emp, "()"); + + if(!StrCompare(hsub, emp)) { + (*L)->tag = List; + (*L)->Node.hp = NULL; + } else { + if(StrLength(hsub) == 1) { + (*L)->tag = Atom; + (*L)->Node.atom = hsub[1]; + } else { + (*L)->tag = List; + + SubString(tmp, hsub, 2, StrLength(hsub) - 2); + + CreateGList(&((*L)->Node.hp), tmp); + } + } + + // 如果不存在队尾,则退出本层递归 + if(StrEmpty(sub)) { + (*L)->tp = NULL; + } else { + // 继续递归求表尾 + CreateGList(&((*L)->tp), sub); + } + + return OK; +} + +/* + * 销毁 + * + * 释放广义表所占内存。 + */ +Status DestroyGList(GList* L) { + GList head, tail; + + if(L == NULL || *L == NULL) { + return ERROR; + } + + // 处理子表结点 + if((*L)->tag == List) { + head = (*L)->Node.hp; // 表头 + tail = (*L)->tp; // 表尾 + + free(*L); + *L = NULL; + + // 递归处理表头 + if(head != NULL) { + DestroyGList(&head); + } + + // 递归处理表尾 + if(tail != NULL) { + DestroyGList(&tail); + } + + // 处理原子结点 + } else { + tail = (*L)->tp; // 表尾 + + free(*L); + *L = NULL; + + if(tail != NULL) { + DestroyGList(&tail); + } + } + + return OK; +} + +/* + * 复制 + * + * 由广义表L复制得到广义表T。 + */ +Status CopyGList(GList* T, GList L) { + + if(L == NULL) { + return ERROR; + } + + *T = (GList) malloc(sizeof(GLNode)); + if(*T == NULL) { + exit(OVERFLOW); + } + + // 复制原子 + if(L->tag == Atom) { + (*T)->tag = Atom; + (*T)->Node.atom = L->Node.atom; + + // 复制子表 + } else { + (*T)->tag = List; + + // 复制表头 + if(L->Node.hp != NULL) { + CopyGList(&((*T)->Node.hp), L->Node.hp); + } else { + (*T)->Node.hp = NULL; + } + } + + // 复制表尾 + if(L->tp != NULL) { + CopyGList(&((*T)->tp), L->tp); + } else { + (*T)->tp = NULL; + } + + return OK; +} + +/* + * 计数 + * + * 返回广义表的长度。 + */ +int GListLength(GList L) { + int count = 0; + GList p; + + // 广义表不存在 + if(L == NULL) { + return -1; + } + + p = L->Node.hp; + + while(p != NULL) { + ++count; + p = p->tp; + } + + return count; +} + +/* + * 深度 + * + * 返回广义表的深度 + */ +int GListDepth(GList L) { + int max, deep; + GList p; + + max = 0; + + // 广义表不存在 + if(L == NULL) { + return -1; + } + + // 空表深度为1 + if(L->tag == List && !L->Node.hp) { + return 1; + } + + // 原子深度为0 + if(L->tag == Atom) { + return 0; + } + + // 递归求子表深度 + for(p = L->Node.hp; p != NULL; p = p->tp) { + // 求以p为头指针的子表深度 + deep = GListDepth(p); + if(deep > max) { + max = deep; + } + } + + return max + 1; +} + +/* + * 判空 + * + * 判断广义表是否为空。 + */ +Status GListEmpty(GList L) { + // 广义表不存在 + if(L == NULL) { + return ERROR; + } + + if(L->tag == List && L->Node.hp == NULL && L->tp == NULL) { + return TRUE; + } else { + return ERROR; + } +} + +/* + * 表头 + */ +GList GetHead(GList L) { + GList p, q; + + // 广义表不存在或广义表为空表,无法获取表头 + if(L == NULL || L->Node.hp == NULL) { + return NULL; + } + + q = L->Node.hp->tp; // 临时保存L的表尾信息 + L->Node.hp->tp = NULL; // 截去L的表尾部分 + + CopyGList(&p, L->Node.hp); // 复制表头信息(已屏蔽表尾) + + L->Node.hp->tp = q; // 恢复L的表尾信息 + + return p; +} + +/* + * 表尾 + */ +GList GetTail(GList L) { + GList p, q; + + // 广义表不存在或广义表为空表,无法获取表尾 + if(L == NULL || L->Node.hp == NULL) { + return NULL; + } + + q = L->Node.hp; // 临时保存L的表头信息 + L->Node.hp = q->tp; // 摘下L的表头部分 + + CopyGList(&p, L); // 复制表尾信息(已屏蔽表头) + + q->tp = L->Node.hp; // 恢复L的表头信息 + L->Node.hp = q; + + return p; +} + +/* + * 插入 + * + * 将元素e插入为广义表L的第一个元素。 + */ +Status InsertFirst(GList* L, GList e) { + + // 广义表不存在 + if(L == NULL || *L == NULL) { + return ERROR; + } + + if(e == NULL) { + return ERROR; + } + + e->tp = (*L)->Node.hp; + (*L)->Node.hp = e; + + return OK; +} + +/* + * 删除 + * + * 将广义表L的第一个元素删除,并用e返回。 + */ +Status DeleteFirst(GList* L, GList* e) { + GList p; + + // 广义表不存在或广义表为空表,则无法删除表头 + if(*L == NULL || (*L)->Node.hp == NULL) { + return ERROR; + } + + p = (*L)->Node.hp; + (*L)->Node.hp = p->tp; + p->tp = NULL; + + *e = p; + + return OK; +} + +/* + * 遍历 + * + * 用visit函数访问广义表L。 + */ +void Traverse(GList L, void(Visit)(AtomType)) { + if(L == NULL) { + return; + } + + if(L->tag == List) { + Traverse(L->Node.hp, Visit); + } else { + Visit(L->Node.atom); + } + + Traverse(L->tp, Visit); +} + +/* + * 图形化输出 + * + * 带括号输出广义表L。 + */ +void PrintGraph(GList L) { + Print(L); + printf("\n"); +} + +/* + * 图形化输出的内部实现。 + */ +static void Print(GList L) { + if(L == NULL) { + return; + } + + // 处理表结点 + if(L->tag == List) { + printf("("); + + if(L->Node.hp) { + Print(L->Node.hp); + } + + if(L->tp) { + printf("),"); + Print(L->tp); + } else { + printf(")"); + } + + // 处理原子结点 + } else { + printf("%c", L->Node.atom); + if(L->tp) { + printf(","); + Print(L->tp); + } + } +} + +/* + * 将非空串str分割成两部分:hsub为第一个','之前的子串,str为第一个','之后的子串。 + * + *【注】 + * 1.这里假设字符串str输入正确,其中无空白符号, + * 但str外层的括号可能脱去,也可能未脱去。 + * 2.分离完成后,str也会发生变化 + */ +static void sever(SString hstr, SString str) { + int i, k, n; + SString ch; + + n = StrLength(str); + + i = 0; // 遍历字符串时的游标 + k = 0; // 标记遇到的未配对括号数量 + + do { + ++i; + + // 截取str第一个字符 + SubString(ch, str, i, 1); + + if(ch[1] == '(') { + ++k; + } + if(ch[1] == ')') { + --k; + } + } while(i < n && (ch[1] != ',' || k != 0)); + + if(i < n) { + SubString(hstr, str, 1, i - 1); + SubString(str, str, i + 1, n - i); + } else { + StrCopy(hstr, str); + ClearString(str); + } +} diff --git a/CLion/ExerciseBook/05.38.2/GList-E.h b/CLion/ExerciseBook/05.38.2/GList-E.h new file mode 100644 index 0000000..5e5b625 --- /dev/null +++ b/CLion/ExerciseBook/05.38.2/GList-E.h @@ -0,0 +1,146 @@ +/*=========================== + * 广义表的扩展线性链表存储表示 + ============================*/ + +#ifndef GLIST_E_H +#define GLIST_E_H + +#include +#include // 提供 malloc、realloc、free、exit 原型 +#include "Status.h" //**▲01 绪论**// +#include "SString.h" //**▲04 串**// + +/* 原子元素类型 */ +typedef char AtomType; //原子类型 + +/* + * 广义表结点标记 + * + * Atom-0:原子结点 + * List-1:表结点 + */ +typedef enum { Atom, List } ElemTag; + +/* 广义表(扩展线性链表存储表示)类型定义 */ +typedef struct GLNode { + ElemTag tag; // 公共标记,用于区分原子结点和表结点 + + // 原子结点和表结点的联合部分 + union + { + AtomType atom; // atom是原子结点的值域,AtomType由用户定义 + struct GLNode* hp; // 指向表头 + } Node; + struct GLNode* tp; // 指向表尾 +} GLNode; + +/* 广义表类型 */ +typedef GLNode* GList; + + +/* + * 初始化 + * + * 初始化空的广义表,长度为0,深度为1。 + * + *【注】 + * 需要对每一层带上括号考察 + */ +Status InitGList(GList* L); + +/* + * 创建 + * + * 由字符串S创建广义表L。 + */ +Status CreateGList(GList* L, SString S); + +/* + * 销毁 + * + * 释放广义表所占内存。 + */ +Status DestroyGList(GList* L); + +/* + * 复制 + * + * 由广义表L复制得到广义表T。 + */ +Status CopyGList(GList* T, GList L); + +/* + * 计数 + * + * 返回广义表的长度。 + */ +int GListLength(GList L); + +/* + * 深度 + * + * 返回广义表的深度 + */ +int GListDepth(GList L); + +/* + * 判空 + * + * 判断广义表是否为空。 + */ +Status GListEmpty(GList L); + +/* + * 表头 + */ +GList GetHead(GList L); + +/* + * 表尾 + */ +GList GetTail(GList L); + +/* + * 插入 + * + * 将元素e插入为广义表L的第一个元素。 + */ +Status InsertFirst(GList* L, GList e); + +/* + * 删除 + * + * 将广义表L的第一个元素删除,并用e返回。 + */ +Status DeleteFirst(GList* L, GList* e); + +/* + * 遍历 + * + * 用visit函数访问广义表L。 + */ +void Traverse(GList L, void(Visit)(AtomType)); + +/* + * 图形化输出 + * + * 带括号输出广义表L。 + */ +void PrintGraph(GList L); + +/* + * 图形化输出的内部实现。 + */ +static void Print(GList L); + +/* + * 将非空串str分割成两部分:hsub为第一个','之前的子串,str为第一个','之后的子串。 + * + *【注】 + * 1.这里假设字符串str输入正确,其中无空白符号, + * 但str外层的括号可能脱去,也可能未脱去。 + * 2.分离完成后,str也会发生变化 + */ +static void sever(SString hstr, SString str); + +#endif diff --git a/CLion/ExerciseBook/05.38.2/SString.c b/CLion/ExerciseBook/05.38.2/SString.c new file mode 100644 index 0000000..41d9e15 --- /dev/null +++ b/CLion/ExerciseBook/05.38.2/SString.c @@ -0,0 +1,195 @@ +/*============================= + * 串的定长顺序存储表示(顺序串) + * + * 包含算法: 4.1、4.2、4.3、4.5 + ==============================*/ + +#include "SString.h" //**▲04 串**// + +/* + * 初始化 + * + * 构造一个值为chars的串T。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status StrAssign(SString T, const char* chars) { + int i, len; + + len = (int) strlen(chars); + + // chars过长 + if(len > MAXSTRLEN) { + return ERROR; + } + + T[0] = len; + for(i = 1; i <= len; i++) { + T[i] = chars[i - 1]; + } + + return OK; +} + +/* + * 清空 + * + * 将串S清空。 + */ +Status ClearString(SString S) { + // 只需要将长度置为0就可以 + S[0] = 0; + return OK; +} + +/* + * 判空 + * + * 判断串S中是否包含有效数据。 + * + * 返回值: + * TRUE : 串S为空 + * FALSE: 串S不为空 + */ +Status StrEmpty(SString S) { + return S[0] == 0 ? TRUE : FALSE; +} + +/* + * 计数 + * + * 返回串S中元素的个数。 + * + *【注】 + * 该操作属于最小操作子集 + */ +int StrLength(SString S) { + return S[0]; +} + +/* + * ████████ 算法4.3 ████████ + * + * 求子串 + * + * 用Sub返回S[pos, pos+len-1]。 + * 返回值指示是否截取成功。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status SubString(SString Sub, SString S, int pos, int len) { + int i; + + if(pos < 1 || pos > S[0] || len < 0 || pos + len - 1 > S[0]) { + return ERROR; + } + + // 复制元素 + for(i = 1; i <= len; i++) { + Sub[i] = S[pos + i - 1]; + } + + // 确定新长度 + Sub[0] = len; + + return OK; +} + +/* + * 删除 + * + * 删除S[pos, pos+len-1]。 + */ +Status StrDelete(SString S, int pos, int len) { + int i; + + if(pos < 1 || pos + len - 1 > S[0] || len < 0) { + return ERROR; + } + + // 如果待删除的长度为0,则提前返回 + if(len == 0) { + return OK; + } + + // 把后面的元素挪到前面,覆盖掉被删除的元素 + for(i = pos + len; i <= S[0]; i++) { + S[i - len] = S[i]; + } + + // 长度减少 + S[0] -= len; + + return OK; +} + +/* + * 比较 + * + * 比较串S和串T,返回比较结果。 + * + *【注】 + * 该操作属于最小操作子集 + */ +int StrCompare(SString S, SString T) { + int i = 1; + + while(i <= S[0] && i <= T[0]) { + // 遇到不同的字符时,比较其大小 + if(S[i] != T[i]) { + return S[i] - T[i]; + } + + i++; + } + + return S[0] - T[0]; +} + +/* + * 复制 + * + * 将串S复制到串T。 + */ +Status StrCopy(SString T, SString S) { + int i; + + // 连同长度信息一起复制 + for(i = 0; i <= S[0]; i++) { + T[i] = S[i]; + } + + return OK; +} + +/* + * 清理字符串S中的空白,包括清理不可打印字符和清理空格。 + * + *【注】 + * 该函数是在本章中新增的。 + */ +Status ClearBlank(SString S) { + int i, j; + + // 如果是空串 + if(S[0] == 0) { + return ERROR; + } + + for(i = 1, j = 0; i <= S[0]; i++) { + // 如果遇到空白,则略过 + if(S[i] == ' ' || !isprint(S[i])) { + continue; + } + + j++; + + S[j] = S[i]; + } + + S[0] = j; + + return OK; +} diff --git a/CLion/ExerciseBook/05.38.2/SString.h b/CLion/ExerciseBook/05.38.2/SString.h new file mode 100644 index 0000000..e81ca79 --- /dev/null +++ b/CLion/ExerciseBook/05.38.2/SString.h @@ -0,0 +1,117 @@ +/*============================= + * 串的定长顺序存储表示(顺序串) + * + * 包含算法: 4.1、4.2、4.3、4.5 + ==============================*/ + +#ifndef SSTRING_H +#define SSTRING_H + +#include +#include // 提供 strlen 原型 +#include // 提供 isprint 原型 +#include "Status.h" //**▲01 绪论**// + +/* 宏定义 */ +#define MAXSTRLEN 255 // 顺序串的最大串长 + +/* + * 串的顺序存储类型定义 + * + * 注:有效元素从SString的1号单元开始存储 + * SString的0号单元用来存储其长度 + */ +typedef unsigned char SString[MAXSTRLEN + 1]; // 0号单元存放串的长度 + + +/* + * ████ 提示 ████ + * + * 遵循教材的书写习惯,pos指示字符的位序(不是索引),从1开始计数 + */ + + +/* + * 初始化 + * + * 构造一个值为chars的串T。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status StrAssign(SString T, const char* chars); + +/* + * 清空 + * + * 将串S清空。 + */ +Status ClearString(SString S); + +/* + * 判空 + * + * 判断串S中是否包含有效数据。 + * + * 返回值: + * TRUE : 串S为空 + * FALSE: 串S不为空 + */ +Status StrEmpty(SString S); + +/* + * 计数 + * + * 返回串S中元素的个数。 + * + *【注】 + * 该操作属于最小操作子集 + */ +int StrLength(SString S); + +/* + * ████████ 算法4.3 ████████ + * + * 求子串 + * + * 用Sub返回S[pos, pos+len-1]。 + * 返回值指示是否截取成功。 + * + *【注】 + * 该操作属于最小操作子集 + */ +Status SubString(SString Sub, SString S, int pos, int len); + +/* + * 删除 + * + * 删除S[pos, pos+len-1]。 + */ +Status StrDelete(SString S, int pos, int len); + +/* + * 比较 + * + * 比较串S和串T,返回比较结果。 + * + *【注】 + * 该操作属于最小操作子集 + */ +int StrCompare(SString S, SString T); + +/* + * 复制 + * + * 将串S复制到串T。 + */ +Status StrCopy(SString T, SString S); + +/* + * 清理字符串S中的空白,包括清理不可打印字符和清理空格。 + * + *【注】 + * 该函数是在本章中新增的。 + */ +Status ClearBlank(SString S); + +#endif diff --git a/CLion/ExerciseBook/CMakeLists.txt b/CLion/ExerciseBook/CMakeLists.txt index 0d77604..ffd1980 100644 --- a/CLion/ExerciseBook/CMakeLists.txt +++ b/CLion/ExerciseBook/CMakeLists.txt @@ -67,3 +67,30 @@ add_subdirectory(04.27) add_subdirectory(04.28-04.29) add_subdirectory(04.30) add_subdirectory(04.31) + +add_subdirectory(05.17) +add_subdirectory(05.18) +add_subdirectory(05.19) +add_subdirectory(05.20) +add_subdirectory(05.21) +add_subdirectory(05.22) +add_subdirectory(05.23) +add_subdirectory(05.24) +add_subdirectory(05.25) +add_subdirectory(05.26) +add_subdirectory(05.27) +add_subdirectory(05.28-05.29) +add_subdirectory(05.30.1) +add_subdirectory(05.30.2) +add_subdirectory(05.31) +add_subdirectory(05.32.1) +add_subdirectory(05.32.2) +add_subdirectory(05.33.1) +add_subdirectory(05.33.2) +add_subdirectory(05.34.1) +add_subdirectory(05.34.2) +add_subdirectory(05.35-05.36) +add_subdirectory(05.37.1) +add_subdirectory(05.37.2) +add_subdirectory(05.38.1) +add_subdirectory(05.38.2) diff --git a/Dev-C++/ExerciseBook/05.17/05.17.cpp b/Dev-C++/ExerciseBook/05.17/05.17.cpp new file mode 100644 index 0000000..17a0f00 --- /dev/null +++ b/Dev-C++/ExerciseBook/05.17/05.17.cpp @@ -0,0 +1,137 @@ +#include +#include // ṩ systemrandsrand ԭ +#include // ṩ time ԭ +#include "SqList.h" //**02 Ա**// + +// ݹֵ +int Algo_5_17_1(SqList L, int len); + +// ݹСֵ +int Algo_5_17_2(SqList L, int len); + +// ݹ +int Algo_5_17_3(SqList L, int len); + +// ݹ +double Algo_5_17_4(SqList L, int len); + +// ݹƽ +double Algo_5_17_5(SqList L, int len); + + +int main(int argc, char* argv[]) { + SqList L; + int i; + + InitList(&L); + + srand((unsigned) time(NULL)); // ϵͳʱ + + for(i = 1; i <= 10; i++) { + ListInsert(&L, i, rand() % 100); + } + + printf("˳еΪ"); + for(i = 0; i < L.length; i++) { + printf("%d ", L.elem[i]); + } + printf("\n"); + + printf("˳еֵΪ %d \n", Algo_5_17_1(L, L.length)); + printf("˳еСֵΪ %d \n", Algo_5_17_2(L, L.length)); + printf("˳еĺΪ %d \n", Algo_5_17_3(L, L.length)); + printf("˳еĻΪ %.2f \n", Algo_5_17_4(L, L.length)); + printf("˳еƽֵΪ %.2f \n", Algo_5_17_5(L, L.length)); + + return 0; +} + + +// ݹֵ +int Algo_5_17_1(SqList L, int len) { + int value, max; + + // ȡǰλõֵ + GetElem(L, len, &value); + + if(len == 1) { + return value; + } + + // ȡǰеֵ + max = Algo_5_17_1(L, --len); + + return max > value ? max : value; +} + +// ݹСֵ +int Algo_5_17_2(SqList L, int len) { + int value, min; + + // ȡǰλõֵ + GetElem(L, len, &value); + + if(len == 1) { + return value; + } + + // ȡǰеСֵ + min = Algo_5_17_2(L, --len); + + return min < value ? min : value; +} + +// ݹ +int Algo_5_17_3(SqList L, int len) { + int sum; + + // ȡǰλõֵ + GetElem(L, len, &sum); + + if(len == 1) { + return sum; + } + + // ȡǰеĺ + sum += Algo_5_17_3(L, --len); + + return sum; +} + +// ݹ +double Algo_5_17_4(SqList L, int len) { + int value; + double mul; + + // ȡǰλõֵ + GetElem(L, len, &value); + mul = value; + + if(len == 1) { + return mul; + } + + // ȡǰеĻ + mul *= Algo_5_17_4(L, --len); + + return mul; +} + +// ݹƽ +double Algo_5_17_5(SqList L, int len) { + int value; + double avg; + + // ȡǰλõֵ + GetElem(L, len, &value); + avg = value; + + if(len == 1) { + return avg; + } + + // ȡǰеƽ + avg = (Algo_5_17_5(L, len - 1) * (len - 1) + value) / len; + + return avg; +} diff --git a/Dev-C++/ExerciseBook/05.17/05.17.dev b/Dev-C++/ExerciseBook/05.17/05.17.dev new file mode 100644 index 0000000..572566c --- /dev/null +++ b/Dev-C++/ExerciseBook/05.17/05.17.dev @@ -0,0 +1,82 @@ +[Project] +FileName=05.17.dev +Name=05.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=3 + +[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=05.17.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit2] +FileName=SqList.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit3] +FileName=SqList.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + diff --git a/Dev-C++/ExerciseBook/05.17/SqList.cpp b/Dev-C++/ExerciseBook/05.17/SqList.cpp new file mode 100644 index 0000000..f797103 --- /dev/null +++ b/Dev-C++/ExerciseBook/05.17/SqList.cpp @@ -0,0 +1,337 @@ +/*============================= + * Ա˳洢ṹ˳ + * + * 㷨: 2.32.42.52.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; // ʼɹ +} + +/* + * (ṹ) + * + * ͷ˳ռڴ档 + */ +Status DestroyList(SqList* L) { + // ȷ˳ṹ + if(L == NULL || (*L).elem == NULL) { + return ERROR; + } + + // ͷ˳ڴ + free((*L).elem); + + // ͷڴÿָ + (*L).elem = NULL; + + // ˳ȸ + (*L).length = 0; + (*L).listsize = 0; + + return OK; +} + +/* + * ÿ() + * + * ֻ˳д洢ݣͷ˳ռڴ档 + */ +Status ClearList(SqList* L) { + // ȷ˳ṹ + if(L == NULL || (*L).elem == NULL) { + return ERROR; + } + + (*L).length = 0; + + return OK; +} + +/* + * п + * + * ж˳ǷЧݡ + * + * ֵ + * TRUE : ˳Ϊ + * FALSE: ˳Ϊ + */ +Status ListEmpty(SqList L) { + return L.length == 0 ? TRUE : FALSE; +} + +/* + * + * + * ˳ЧԪص + */ +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.6 + * + * + * + * ˳׸eCompareϵԪλ + * Ԫأ򷵻0 + * + *ע + * ԪeCompareڶβ + */ +int LocateElem(SqList L, ElemType e, Status(Compare)(ElemType, ElemType)) { + int i; + ElemType* p; + + // ȷ˳ṹ + if(L.elem == NULL) { + return ERROR; + } + + /* + * iijֵΪ1Ԫصλ + * + * ʵȻдǽiʼΪ1Ԫص + * ڽ̲ǰλģдλ + */ + i = 1; + + // pijֵΪ1ԪصĴ洢λ + p = L.elem; + + // ˳ + while(i <= L.length && !Compare(*p++, e)) { + ++i; + } + + if(i <= L.length) { + return i; + } else { + return 0; + } +} + +/* + * ǰ + * + * ȡԪcur_eǰ + * ڣ洢pre_eУOK + * ڣ򷵻ERROR + */ +Status PriorElem(SqList L, ElemType cur_e, ElemType* pre_e) { + int i; + + // ȷ˳ṹڣٰԪ + if(L.elem == NULL || L.length < 2) { + return ERROR; + } + + // iʼΪ1Ԫصġ + i = 0; + + // ӵ1Ԫؿʼcur_eλ + while(i < L.length && L.elem[i] != cur_e) { + ++i; + } + + // cur_e׸Ԫ(ûǰ)ûҵԪcur_eERROR + if(i==0 || i >= L.length) { + return ERROR; + } + + // 洢cur_eǰ + *pre_e = L.elem[i - 1]; + + return OK; +} + +/* + * + * + * ȡԪcur_eḷ́ + * ڣ洢next_eУOK + * ڣ򷵻ERROR + */ +Status NextElem(SqList L, ElemType cur_e, ElemType* next_e) { + int i; + + // ȷ˳ṹڣٰԪ + if(L.elem == NULL || L.length < 2) { + return ERROR; + } + + // iʼΪ1Ԫصġ + i = 0; + + // ӵ1Ԫؿʼcur_eλ + while(i < L.length-1 && L.elem[i] != cur_e) { + ++i; + } + + // cur_e1Ԫ(ûǰ)ûҵԪcur_eERROR + if(i >= L.length-1) { + return ERROR; + } + + // 洢cur_eǰ + *next_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; +} + +/* + * 㷨2.5 + * + * ɾ + * + * ɾ˳iλϵԪأɾԪش洢eС + * ɾɹ򷵻OK򷵻ERROR + * + *ע + * ̲iĺԪλã1ʼ + */ +Status ListDelete(SqList* L, int i, ElemType* e) { + ElemType* p, * q; + + // ȷ˳ṹ + if(L == NULL || (*L).elem == NULL) { + return ERROR; + } + + // iֵԽ + if(i < 1 || i > (*L).length) { + return ERROR; + } + + // pΪɾԪصλ + p = &(*L).elem[i - 1]; + + // 1.ȡɾԪ + *e = *p; + + // βԪλ + q = (*L).elem + (*L).length - 1; + + // 2.ԪأɾԪصλϻԪؽ + for(++p; p <= q; ++p) { + *(p - 1) = *p; + } + + // 3.1 + (*L).length--; + + return OK; +} + +/* + * + * + * visit˳L + */ +void ListTraverse(SqList L, void(Visit)(ElemType)) { + int i; + + for(i = 0; i < L.length; i++) { + Visit(L.elem[i]); + } + + printf("\n"); +} diff --git a/Dev-C++/ExerciseBook/05.17/SqList.h b/Dev-C++/ExerciseBook/05.17/SqList.h new file mode 100644 index 0000000..975e5b1 --- /dev/null +++ b/Dev-C++/ExerciseBook/05.17/SqList.h @@ -0,0 +1,149 @@ +/*============================= + * Ա˳洢ṹ˳ + * + * 㷨: 2.32.42.52.6 + =============================*/ + +#ifndef SQLIST_H +#define SQLIST_H + +#include +#include // ṩmallocreallocfreeexitԭ +#include "Status.h" //**01 **// + +/* 궨 */ +#define LIST_INIT_SIZE 100 // ˳洢ռijʼ +#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); + +/* + * (ṹ) + * + * ͷ˳ռڴ档 + */ +Status DestroyList(SqList* L); + +/* + * ÿ() + * + * ֻ˳д洢ݣͷ˳ռڴ档 + */ +Status ClearList(SqList* L); + +/* + * п + * + * ж˳ǷЧݡ + * + * ֵ + * TRUE : ˳Ϊ + * FALSE: ˳Ϊ + */ +Status ListEmpty(SqList L); + +/* + * + * + * ˳ЧԪص + */ +int ListLength(SqList L); + +/* + * ȡֵ + * + * ȡ˳еiԪأ洢eС + * ҵOK򣬷ERROR + * + *ע + * ̲iĺԪλã1ʼⲻϱͨԼ + * ͨiĺӦָ0ʼ + */ +Status GetElem(SqList L, int i, ElemType* e); + +/* + * 㷨2.6 + * + * + * + * ˳׸eCompareϵԪλ + * Ԫأ򷵻0 + * + *ע + * ԪeCompareڶβ + */ +int LocateElem(SqList L, ElemType e, Status(Compare)(ElemType, ElemType)); + +/* + * ǰ + * + * ȡԪcur_eǰ + * ڣ洢pre_eУOK + * ڣ򷵻ERROR + */ +Status PriorElem(SqList L, ElemType cur_e, ElemType* pre_e); + +/* + * + * + * ȡԪcur_eḷ́ + * ڣ洢next_eУOK + * ڣ򷵻ERROR + */ +Status NextElem(SqList L, ElemType cur_e, ElemType* next_e); + +/* + * 㷨2.4 + * + * + * + * ˳iλϲeɹ򷵻OK򷵻ERROR + * + *ע + * ̲iĺԪλã1ʼ + */ +Status ListInsert(SqList* L, int i, ElemType e); + +/* + * 㷨2.5 + * + * ɾ + * + * ɾ˳iλϵԪأɾԪش洢eС + * ɾɹ򷵻OK򷵻ERROR + * + *ע + * ̲iĺԪλã1ʼ + */ +Status ListDelete(SqList* L, int i, ElemType* e); + +/* + * + * + * visit˳L + */ +void ListTraverse(SqList L, void (Visit)(ElemType)); + +#endif diff --git a/Dev-C++/ExerciseBook/05.18/05.18.cpp b/Dev-C++/ExerciseBook/05.18/05.18.cpp new file mode 100644 index 0000000..2633309 --- /dev/null +++ b/Dev-C++/ExerciseBook/05.18/05.18.cpp @@ -0,0 +1,91 @@ +#include +#include // ṩ systemrandsrand ԭ +#include // ṩ time ԭ +#include "Status.h" //**01 **// +#include "Array.h" //**05 ͹**// + +/* + * AеԪѭkλ + */ +Status Algo_5_18(Array A, int k); + +// [begin, end]ΧڵԪ +static Status Reversal_5_18(Array A, int begin, int end); + + +int main(int argc, char* argv[]) { + Array A; + ElemType e; + int i; + int k = 7; // λ + + // ʼΪ10һά + InitArray(&A, 1, 10); + + srand((unsigned) time(NULL)); // ϵͳʱ + + for(i = 0; i < Length(A); i++) { + e = rand() % 100; + Assign(&A, e, i); + } + + printf("AԪΪ\n"); + for(i = 0; i < Length(A); i++) { + Value(A, &e, i); + printf("%2d ", e); + } + printf("\n"); + + printf("Aѭ %d λ\n", k); + Algo_5_18(A, k); + for(i = 0; i < Length(A); i++) { + Value(A, &e, i); + printf("%2d ", e); + } + printf("\n"); + + return 0; +} + + +/* + * AеԪѭkλ + */ +Status Algo_5_18(Array A, int k) { + int n, p; + + n = Length(A); + + p = k % n; // ʵҪѭƵλ + if(p <= 0) { + return ERROR; + } + + Reversal_5_18(A, 0, n-1); // [0, n-1]ΧڵԪ + Reversal_5_18(A, 0, p-1); // [0, p-1]ΧڵԪ + Reversal_5_18(A, p, n-1); // [p, n-1]ΧڵԪ + + return OK; +} + +// [begin, end]ΧڵԪ +static Status Reversal_5_18(Array A, int begin, int end) { + int i; + ElemType e1, e2; + + if(begin < 0 || end > Length(A)-1 || begin >= end) { + return ERROR; + } + + // "" + for(i = 0; i < (end - begin + 1) / 2; i++) { + Value(A, &e1, begin + i); // ȡеǰԪ + Value(A, &e2, end - i); // ȡеԪ + + // Ԫɽ + Assign(&A, e2, begin + i); + Assign(&A, e1, end - i); + } + + return OK; +} diff --git a/Dev-C++/ExerciseBook/05.18/05.18.dev b/Dev-C++/ExerciseBook/05.18/05.18.dev new file mode 100644 index 0000000..57dbe54 --- /dev/null +++ b/Dev-C++/ExerciseBook/05.18/05.18.dev @@ -0,0 +1,82 @@ +[Project] +FileName=05.18.dev +Name=05.18 +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=3 + +[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 + +[Unit2] +FileName=Array.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit1] +FileName=05.18.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit3] +FileName=Array.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + diff --git a/Dev-C++/ExerciseBook/05.18/Array.cpp b/Dev-C++/ExerciseBook/05.18/Array.cpp new file mode 100644 index 0000000..494d467 --- /dev/null +++ b/Dev-C++/ExerciseBook/05.18/Array.cpp @@ -0,0 +1,195 @@ +/*======== + * ά + =========*/ + +#include "Array.h" //**05 ͹**// + +/* + * ʼ + * + * ʼάΪdim飬ɱָʾάȵĴС + */ +Status InitArray(Array* A, int dim, ...) { + int elemtotal; // ͳԪظ + va_list ap; // apſɱϢָʾάȵĴС + int i; + + if(A == NULL) { + return ERROR; + } + + if(dim < 1 || dim > MAX_ARRAY_DIM) { // ά + return ERROR; + } + + (*A).dim = dim; // ʼά + + // ʼάϢ + (*A).bounds = (int*) malloc(dim * sizeof(int)); + if((*A).bounds == NULL) { + exit(OVERFLOW); + } + + // άȳȺϷboundsAԪelemtotal + elemtotal = 1; + + // ʹapָһɱdim൱ʼʶ + va_start(ap, dim); + + for(i = 0; i < dim; i++) { + // ¼ǰάȵĿ + (*A).bounds[i] = va_arg(ap, int); + if((*A).bounds[i] <= 0) { + return ERROR; + } + + elemtotal *= A->bounds[i]; + } + + // ÿap + va_end(ap); + + // ʼռ䣬ԴԪ + (*A).base = (ElemType*) malloc(elemtotal * sizeof(ElemType)); + if((*A).base == NULL) { + exit(OVERFLOW); + } + + // ʼӳϢ + (*A).constants = (int*) malloc(dim * sizeof(int)); + if((*A).constants == NULL) { + exit(OVERFLOW); + } + + // һάȣÿҪԽһԪ + (*A).constants[dim - 1] = 1; + for(i = dim - 2; i >= 0; i--) { + (*A).constants[i] = (*A).bounds[i + 1] * (*A).constants[i + 1]; + } + + /* + * + * ά[2,3,4]˵boundsֵΪ<2,3,4>constantsֵΪ<12,4,1> + * boundsһάа2Ԫأڶάа3Ԫأάа4Ԫ + * constantsһάÿҪ12ԪأڶάÿҪԽ4ԪأάÿҪԽ1Ԫ + */ + + return OK; +} + +/* + * (ṹ) + * + * ռõĿռ䡣 + */ +Status DestroyArray(Array* A) { + if(A == NULL || (*A).base == NULL || (*A).bounds == NULL || (*A).constants == NULL) { + return ERROR; + } + + free((*A).base); + (*A).base = NULL; + + free((*A).bounds); + (*A).bounds = NULL; + + free((*A).constants); + (*A).constants = NULL; + + (*A).dim = 0; + + return OK; +} + +/* + * ȡֵ + * + * ȡָ±괦ԪֵɱΪdim±ֵָʾȡԪ±ꡣ + */ +Status Value(Array A, ElemType* e, ...) { + va_list ap; + Status result; + int off; + + va_start(ap, e); + + // ԪصĿԪҪԽԪ + result = Locate(A, ap, &off); + + va_end(ap); + + if(result == OVERFLOW) { + return result; + } + + *e = *(A.base + off); + + return OK; +} + +/* + * ֵ + * + * Ϊָ±괦ԪظֵɱΪdim±ֵָʾֵԪ±ꡣ + */ +Status Assign(Array* A, ElemType e, ...) { + va_list ap; + Status result; + int off; + + va_start(ap, e); + + // ԪصĿԪҪԽԪ + result = Locate(*A, ap, &off); + + va_end(ap); + + if(result == OVERFLOW) { + return result; + } + + *(A->base + off) = e; + + return OK; +} + +/* + * apָʾֵAеλã + * ԪصĿԪҪԽԪ + */ +static Status Locate(Array A, va_list ap, int* off) { + int i, ind; + + *off = 0; + + for(i = 0; i < A.dim; i++) { + ind = va_arg(ap, int); + + // ֤±겻Խ + if(ind < 0 || ind >= A.bounds[i]) { + return OVERFLOW; + } + + // ijάȵĵλԪظ*Ҫĵλ + *off += A.constants[i] * ind; + } + + return OK; +} + +/* + * Ԫصĸ + * + *ע + * Ϊĺ + */ +int Length(Array A) { + int i; + int elemtotal = 1; + + for(i = 0; i < A.dim; i++) { + elemtotal *= A.bounds[i]; + } + + return elemtotal; +} diff --git a/Dev-C++/ExerciseBook/05.18/Array.h b/Dev-C++/ExerciseBook/05.18/Array.h new file mode 100644 index 0000000..bae6fab --- /dev/null +++ b/Dev-C++/ExerciseBook/05.18/Array.h @@ -0,0 +1,70 @@ +/*======== + * ά + =========*/ + +#ifndef ARRAY_H +#define ARRAY_H + +#include +#include // ṩmallocreallocfreeexitԭ +#include // ṩva_startva_argva_end +#include "Status.h" //**01 **// + +/* 궨 */ +#define MAX_ARRAY_DIM 8 // άΪ8 + +/* Ԫ */ +typedef int ElemType; + +/* ˳洢ʾ */ +typedef struct { + ElemType* base; // ԪػַԪأ + int dim; // ά + int* bounds; // άַСϢ + int* constants; // ӳַ洢ijάʱÿҪԽԪظ +} Array; + + +/* + * ʼ + * + * ʼάΪdim飬ɱָʾάȵĴС + */ +Status InitArray(Array* A, int dim, ...); + +/* + * (ṹ) + * + * ռõĿռ䡣 + */ +Status DestroyArray(Array* A); + +/* + * ȡֵ + * + * ȡָ±괦ԪֵɱΪdim±ֵָʾȡԪ±ꡣ + */ +Status Value(Array A, ElemType* e, ...); + +/* + * ֵ + * + * Ϊָ±괦ԪظֵɱΪdim±ֵָʾֵԪ±ꡣ + */ +Status Assign(Array* A, ElemType e, ...); + +/* + * apָʾֵAеλã + * ԪصĿԪҪԽԪ + */ +static Status Locate(Array A, va_list ap, int *off); + +/* + * Ԫصĸ + * + *ע + * Ϊĺ + */ +int Length(Array A); + +#endif diff --git a/Dev-C++/ExerciseBook/05.19/05.19.cpp b/Dev-C++/ExerciseBook/05.19/05.19.cpp new file mode 100644 index 0000000..c5f3ccb --- /dev/null +++ b/Dev-C++/ExerciseBook/05.19/05.19.cpp @@ -0,0 +1,114 @@ +#include +#include +#include +#include "Array.h" //**05 ͹**// + +/* Ԫ */ +typedef struct { + int x; + int y; + ElemType value; +} Elem; + +/* + * ѰҶάAе + * + *ע + * ÿÿеԪزΨһ + */ +void Algo_5_19(Array A); + + +int main(int argc, char* argv[]) { + int a[3][4] = { + {10, 16, 13, 14}, + {15, 18, 15, 20}, + { 5, 8, 12, 32} + }; + int i, j; + Array A; + + // ׼ + InitArray(&A, 2, 3, 4); + for(i = 0; i < 3; i++) { + for(j = 0; j < 4; j++) { + Assign(&A, a[i][j], i, j); + } + } + + // Ѱ + Algo_5_19(A); + + return 0; +} + + +/* + * ѰҶάAе + * + *ע + * ÿÿеԪزΨһ + */ +void Algo_5_19(Array A) { + int row, col; // + Elem* Min; // 洢AÿеСֵϢ + ElemType* Max; // 洢Aÿеֵֻ洢ֵ + int total, k; // total¼Minд洢Ԫ + int i, j; + ElemType e; + int count; + int min; + + row = A.bounds[0]; + col = A.bounds[1]; + + Min = (Elem*) malloc(row * col * sizeof(Elem)); + + Max = (ElemType*) malloc(col * sizeof(ElemType)); + // ʼֵ + for(j = 0; j < col; j++) { + Max[j] = INT_MIN; + } + + total = 0; + + for(i = 0; i < row; i++) { + min = INT_MAX; // ǰСֵ + + for(j = 0; j < col; j++) { + // ȡԪA[i][j] + Value(A, &e, i, j); + + // ¼ֵ + if(e > Max[j]) { + Max[j] = e; + } + + // ¼СֵϢ + if(e <= min) { + // ÿηָСģkҪ + if(e < min) { + k = total; // ͳƵǰеСֵԪ + min = e; + } + + Min[k].x = i; + Min[k].y = j; + Min[k].value = e; + + k++; + } + } + + // ۼӱԪ + total += (k - total); + } + + count = 0; + for(k = 0; k < total; k++) { + // ǰСֵеֵ뵱ǰСֵһ£ + if(Max[Min[k].y] == Min[k].value) { + printf(" %2d λ (%2d, %2d) %d\n", ++count, Min[k].x, Min[k].y, Min[k].value); + } + } +} diff --git a/Dev-C++/ExerciseBook/05.19/05.19.dev b/Dev-C++/ExerciseBook/05.19/05.19.dev new file mode 100644 index 0000000..17db02a --- /dev/null +++ b/Dev-C++/ExerciseBook/05.19/05.19.dev @@ -0,0 +1,82 @@ +[Project] +FileName=05.19.dev +Name=05.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=3 + +[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=05.19.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit2] +FileName=Array.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit3] +FileName=Array.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + diff --git a/Dev-C++/ExerciseBook/05.19/Array.cpp b/Dev-C++/ExerciseBook/05.19/Array.cpp new file mode 100644 index 0000000..e81eac3 --- /dev/null +++ b/Dev-C++/ExerciseBook/05.19/Array.cpp @@ -0,0 +1,178 @@ +/*======== + * ά + =========*/ + +#include "Array.h" //**05 ͹**// + +/* + * ʼ + * + * ʼάΪdim飬ɱָʾάȵĴС + */ +Status InitArray(Array* A, int dim, ...) { + int elemtotal; // ͳԪظ + va_list ap; // apſɱϢָʾάȵĴС + int i; + + if(A == NULL) { + return ERROR; + } + + if(dim < 1 || dim > MAX_ARRAY_DIM) { // ά + return ERROR; + } + + (*A).dim = dim; // ʼά + + // ʼάϢ + (*A).bounds = (int*) malloc(dim * sizeof(int)); + if((*A).bounds == NULL) { + exit(OVERFLOW); + } + + // άȳȺϷboundsAԪelemtotal + elemtotal = 1; + + // ʹapָһɱdim൱ʼʶ + va_start(ap, dim); + + for(i = 0; i < dim; i++) { + // ¼ǰάȵĿ + (*A).bounds[i] = va_arg(ap, int); + if((*A).bounds[i] <= 0) { + return ERROR; + } + + elemtotal *= A->bounds[i]; + } + + // ÿap + va_end(ap); + + // ʼռ䣬ԴԪ + (*A).base = (ElemType*) malloc(elemtotal * sizeof(ElemType)); + if((*A).base == NULL) { + exit(OVERFLOW); + } + + // ʼӳϢ + (*A).constants = (int*) malloc(dim * sizeof(int)); + if((*A).constants == NULL) { + exit(OVERFLOW); + } + + // һάȣÿҪԽһԪ + (*A).constants[dim - 1] = 1; + for(i = dim - 2; i >= 0; i--) { + (*A).constants[i] = (*A).bounds[i + 1] * (*A).constants[i + 1]; + } + + /* + * + * ά[2,3,4]˵boundsֵΪ<2,3,4>constantsֵΪ<12,4,1> + * boundsһάа2Ԫأڶάа3Ԫأάа4Ԫ + * constantsһάÿҪ12ԪأڶάÿҪԽ4ԪأάÿҪԽ1Ԫ + */ + + return OK; +} + +/* + * (ṹ) + * + * ռõĿռ䡣 + */ +Status DestroyArray(Array* A) { + if(A == NULL || (*A).base == NULL || (*A).bounds == NULL || (*A).constants == NULL) { + return ERROR; + } + + free((*A).base); + (*A).base = NULL; + + free((*A).bounds); + (*A).bounds = NULL; + + free((*A).constants); + (*A).constants = NULL; + + (*A).dim = 0; + + return OK; +} + +/* + * ȡֵ + * + * ȡָ±괦ԪֵɱΪdim±ֵָʾȡԪ±ꡣ + */ +Status Value(Array A, ElemType* e, ...) { + va_list ap; + Status result; + int off; + + va_start(ap, e); + + // ԪصĿԪҪԽԪ + result = Locate(A, ap, &off); + + va_end(ap); + + if(result == OVERFLOW) { + return result; + } + + *e = *(A.base + off); + + return OK; +} + +/* + * ֵ + * + * Ϊָ±괦ԪظֵɱΪdim±ֵָʾֵԪ±ꡣ + */ +Status Assign(Array* A, ElemType e, ...) { + va_list ap; + Status result; + int off; + + va_start(ap, e); + + // ԪصĿԪҪԽԪ + result = Locate(*A, ap, &off); + + va_end(ap); + + if(result == OVERFLOW) { + return result; + } + + *(A->base + off) = e; + + return OK; +} + +/* + * apָʾֵAеλã + * ԪصĿԪҪԽԪ + */ +static Status Locate(Array A, va_list ap, int* off) { + int i, ind; + + *off = 0; + + for(i = 0; i < A.dim; i++) { + ind = va_arg(ap, int); + + // ֤±겻Խ + if(ind < 0 || ind >= A.bounds[i]) { + return OVERFLOW; + } + + // ijάȵĵλԪظ*Ҫĵλ + *off += A.constants[i] * ind; + } + + return OK; +} diff --git a/Dev-C++/ExerciseBook/05.19/Array.h b/Dev-C++/ExerciseBook/05.19/Array.h new file mode 100644 index 0000000..31dd29f --- /dev/null +++ b/Dev-C++/ExerciseBook/05.19/Array.h @@ -0,0 +1,62 @@ +/*======== + * ά + =========*/ + +#ifndef ARRAY_H +#define ARRAY_H + +#include +#include // ṩmallocreallocfreeexitԭ +#include // ṩva_startva_argva_end +#include "Status.h" //**01 **// + +/* 궨 */ +#define MAX_ARRAY_DIM 8 // άΪ8 + +/* Ԫ */ +typedef int ElemType; + +/* ˳洢ʾ */ +typedef struct { + ElemType* base; // ԪػַԪأ + int dim; // ά + int* bounds; // άַСϢ + int* constants; // ӳַ洢ijάʱÿҪԽԪظ +} Array; + + +/* + * ʼ + * + * ʼάΪdim飬ɱָʾάȵĴС + */ +Status InitArray(Array* A, int dim, ...); + +/* + * (ṹ) + * + * ռõĿռ䡣 + */ +Status DestroyArray(Array* A); + +/* + * ȡֵ + * + * ȡָ±괦ԪֵɱΪdim±ֵָʾȡԪ±ꡣ + */ +Status Value(Array A, ElemType* e, ...); + +/* + * ֵ + * + * Ϊָ±괦ԪظֵɱΪdim±ֵָʾֵԪ±ꡣ + */ +Status Assign(Array* A, ElemType e, ...); + +/* + * apָʾֵAеλã + * ԪصĿԪҪԽԪ + */ +static Status Locate(Array A, va_list ap, int *off); + +#endif diff --git a/Dev-C++/ExerciseBook/05.20/05.20.cpp b/Dev-C++/ExerciseBook/05.20/05.20.cpp new file mode 100644 index 0000000..4246091 --- /dev/null +++ b/Dev-C++/ExerciseBook/05.20/05.20.cpp @@ -0,0 +1,112 @@ +#include +#include // ṩ systemrandsrand ԭ +#include // ṩ time ԭ +#include "Array.h" //**05 ͹**// + +// ݶʽϵʽ +void Algo_5_20(Array A); + +// ڲʵ +static void Print(Array A, int dim, int index[]); + + +int main(int argc, char* argv[]) { + Array A; + int i, j, k; + ElemType e = 0; + + // ʼһάΪ<2,3,4>ά + InitArray(&A, 3, 2, 3, 4); + + srand((unsigned) time(NULL)); // ϵͳʱ + + // ׼ + for(i = 0; i < A.bounds[0]; i++) { + for(j = 0; j < A.bounds[1]; j++) { + for(k = 0; k < A.bounds[2]; k++) { + e = rand() % 50 - 25; // + Assign(&A, e, i, j, k); + } + } + } + + // ʽ + Algo_5_20(A); + + return 0; +} + + +// ݶʽϵʽ +void Algo_5_20(Array A) { + int i; + int* index; + + // ڱԪʱ¼ÿԪصֻ¼ǰdim-1ά + index = (int*) malloc((A.dim - 1) * sizeof(int)); + for(i = 0; i < A.dim - 1; i++) { + index[i] = -1; + } + + Print(A, 1, index); + + printf("\n"); +} + +// ڲʵ +static void Print(Array A, int dim, int index[]) { + int i, j; + int start; + ElemType coef; + + if(dim == A.dim) { + start = 0; + + // 㱾αʼԪλ + for(i = 0; i < dim - 1; i++) { + start += index[i] * A.constants[i]; + } + + // һάڵԪ + for(i = 0; i < A.bounds[dim - 1]; i++) { + // ȡϵ + coef = A.base[start + i]; + + // ϵΪ0 + if(coef == 0) { + continue; + } + + if(coef < 0) { + printf(" - "); + } else { + printf(" + "); + } + + // ϵľֵΪ1ʱϵ + if(abs(coef) != 1) { + // ϵţǰѾţһҲŷ + printf("%d", abs(coef)); + } + + /* + * ʽÿһδ֪abc... + * + *ע + * ָλ0ָλ1ΣȻӡ + * ѡ񲻴ӡЩ + */ + for(j = 0; j < dim - 1; j++) { + printf("%c^%d", 'a' + j, index[j]); + } + printf("%c^%d", 'a' + j, i); + } + } else { + for(i = 0; i < A.bounds[dim - 1]; i++) { + // ת + index[dim - 1] = (index[dim - 1] + 1 + A.bounds[dim - 1]) % A.bounds[dim - 1]; + + Print(A, dim + 1, index); + } + } +} diff --git a/Dev-C++/ExerciseBook/05.20/05.20.dev b/Dev-C++/ExerciseBook/05.20/05.20.dev new file mode 100644 index 0000000..41c6f86 --- /dev/null +++ b/Dev-C++/ExerciseBook/05.20/05.20.dev @@ -0,0 +1,82 @@ +[Project] +FileName=05.20.dev +Name=05.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=3 + +[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=05.20.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit2] +FileName=Array.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit3] +FileName=Array.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + diff --git a/Dev-C++/ExerciseBook/05.20/Array.cpp b/Dev-C++/ExerciseBook/05.20/Array.cpp new file mode 100644 index 0000000..e81eac3 --- /dev/null +++ b/Dev-C++/ExerciseBook/05.20/Array.cpp @@ -0,0 +1,178 @@ +/*======== + * ά + =========*/ + +#include "Array.h" //**05 ͹**// + +/* + * ʼ + * + * ʼάΪdim飬ɱָʾάȵĴС + */ +Status InitArray(Array* A, int dim, ...) { + int elemtotal; // ͳԪظ + va_list ap; // apſɱϢָʾάȵĴС + int i; + + if(A == NULL) { + return ERROR; + } + + if(dim < 1 || dim > MAX_ARRAY_DIM) { // ά + return ERROR; + } + + (*A).dim = dim; // ʼά + + // ʼάϢ + (*A).bounds = (int*) malloc(dim * sizeof(int)); + if((*A).bounds == NULL) { + exit(OVERFLOW); + } + + // άȳȺϷboundsAԪelemtotal + elemtotal = 1; + + // ʹapָһɱdim൱ʼʶ + va_start(ap, dim); + + for(i = 0; i < dim; i++) { + // ¼ǰάȵĿ + (*A).bounds[i] = va_arg(ap, int); + if((*A).bounds[i] <= 0) { + return ERROR; + } + + elemtotal *= A->bounds[i]; + } + + // ÿap + va_end(ap); + + // ʼռ䣬ԴԪ + (*A).base = (ElemType*) malloc(elemtotal * sizeof(ElemType)); + if((*A).base == NULL) { + exit(OVERFLOW); + } + + // ʼӳϢ + (*A).constants = (int*) malloc(dim * sizeof(int)); + if((*A).constants == NULL) { + exit(OVERFLOW); + } + + // һάȣÿҪԽһԪ + (*A).constants[dim - 1] = 1; + for(i = dim - 2; i >= 0; i--) { + (*A).constants[i] = (*A).bounds[i + 1] * (*A).constants[i + 1]; + } + + /* + * + * ά[2,3,4]˵boundsֵΪ<2,3,4>constantsֵΪ<12,4,1> + * boundsһάа2Ԫأڶάа3Ԫأάа4Ԫ + * constantsһάÿҪ12ԪأڶάÿҪԽ4ԪأάÿҪԽ1Ԫ + */ + + return OK; +} + +/* + * (ṹ) + * + * ռõĿռ䡣 + */ +Status DestroyArray(Array* A) { + if(A == NULL || (*A).base == NULL || (*A).bounds == NULL || (*A).constants == NULL) { + return ERROR; + } + + free((*A).base); + (*A).base = NULL; + + free((*A).bounds); + (*A).bounds = NULL; + + free((*A).constants); + (*A).constants = NULL; + + (*A).dim = 0; + + return OK; +} + +/* + * ȡֵ + * + * ȡָ±괦ԪֵɱΪdim±ֵָʾȡԪ±ꡣ + */ +Status Value(Array A, ElemType* e, ...) { + va_list ap; + Status result; + int off; + + va_start(ap, e); + + // ԪصĿԪҪԽԪ + result = Locate(A, ap, &off); + + va_end(ap); + + if(result == OVERFLOW) { + return result; + } + + *e = *(A.base + off); + + return OK; +} + +/* + * ֵ + * + * Ϊָ±괦ԪظֵɱΪdim±ֵָʾֵԪ±ꡣ + */ +Status Assign(Array* A, ElemType e, ...) { + va_list ap; + Status result; + int off; + + va_start(ap, e); + + // ԪصĿԪҪԽԪ + result = Locate(*A, ap, &off); + + va_end(ap); + + if(result == OVERFLOW) { + return result; + } + + *(A->base + off) = e; + + return OK; +} + +/* + * apָʾֵAеλã + * ԪصĿԪҪԽԪ + */ +static Status Locate(Array A, va_list ap, int* off) { + int i, ind; + + *off = 0; + + for(i = 0; i < A.dim; i++) { + ind = va_arg(ap, int); + + // ֤±겻Խ + if(ind < 0 || ind >= A.bounds[i]) { + return OVERFLOW; + } + + // ijάȵĵλԪظ*Ҫĵλ + *off += A.constants[i] * ind; + } + + return OK; +} diff --git a/Dev-C++/ExerciseBook/05.20/Array.h b/Dev-C++/ExerciseBook/05.20/Array.h new file mode 100644 index 0000000..31dd29f --- /dev/null +++ b/Dev-C++/ExerciseBook/05.20/Array.h @@ -0,0 +1,62 @@ +/*======== + * ά + =========*/ + +#ifndef ARRAY_H +#define ARRAY_H + +#include +#include // ṩmallocreallocfreeexitԭ +#include // ṩva_startva_argva_end +#include "Status.h" //**01 **// + +/* 궨 */ +#define MAX_ARRAY_DIM 8 // άΪ8 + +/* Ԫ */ +typedef int ElemType; + +/* ˳洢ʾ */ +typedef struct { + ElemType* base; // ԪػַԪأ + int dim; // ά + int* bounds; // άַСϢ + int* constants; // ӳַ洢ijάʱÿҪԽԪظ +} Array; + + +/* + * ʼ + * + * ʼάΪdim飬ɱָʾάȵĴС + */ +Status InitArray(Array* A, int dim, ...); + +/* + * (ṹ) + * + * ռõĿռ䡣 + */ +Status DestroyArray(Array* A); + +/* + * ȡֵ + * + * ȡָ±괦ԪֵɱΪdim±ֵָʾȡԪ±ꡣ + */ +Status Value(Array A, ElemType* e, ...); + +/* + * ֵ + * + * Ϊָ±괦ԪظֵɱΪdim±ֵָʾֵԪ±ꡣ + */ +Status Assign(Array* A, ElemType e, ...); + +/* + * apָʾֵAеλã + * ԪصĿԪҪԽԪ + */ +static Status Locate(Array A, va_list ap, int *off); + +#endif diff --git a/Dev-C++/ExerciseBook/05.21/05.21.cpp b/Dev-C++/ExerciseBook/05.21/05.21.cpp new file mode 100644 index 0000000..c6f0b54 --- /dev/null +++ b/Dev-C++/ExerciseBook/05.21/05.21.cpp @@ -0,0 +1,43 @@ +#include +#include "Status.h" //**01 **// +#include "TSMatrix.h" //**05 ͹**// + +/* + * ϡӷAddSMatrix + * + *ע + * úTSMatrixļж + */ +Status Algo_5_21(TSMatrix A, TSMatrix B, TSMatrix* C); + + +int main(int argc, char* argv[]) { + TSMatrix A, B, C; + + printf(" ϡ AB ...\n"); + CreateSMatrix(&A, "TestData_A.txt"); + CreateSMatrix(&B, "TestData_B.txt"); + printf(" A = \n"); + PrintSMatrix(A); + printf(" B = \n"); + PrintSMatrix(B); + + // + Algo_5_21(A, B, &C); + + printf(" C = A + B = \n"); + PrintSMatrix(C); + + return 0; +} + + +/* + * ϡӷAddSMatrix + * + *ע + * úTSMatrixļж + */ +Status Algo_5_21(TSMatrix A, TSMatrix B, TSMatrix* C) { + return AddSMatrix(A, B, C); +} diff --git a/Dev-C++/ExerciseBook/05.21/05.21.dev b/Dev-C++/ExerciseBook/05.21/05.21.dev new file mode 100644 index 0000000..d5cb312 --- /dev/null +++ b/Dev-C++/ExerciseBook/05.21/05.21.dev @@ -0,0 +1,100 @@ +[Project] +FileName=05.21.dev +Name=05.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=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 + +[Unit4] +FileName=TSMatrix.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit1] +FileName=05.21.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit2] +FileName=TestData_A.txt +Folder= +Compile=0 +Link=0 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit3] +FileName=TestData_B.txt +Folder= +Compile=0 +Link=0 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit5] +FileName=TSMatrix.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + diff --git a/Dev-C++/ExerciseBook/05.21/TSMatrix.cpp b/Dev-C++/ExerciseBook/05.21/TSMatrix.cpp new file mode 100644 index 0000000..05eeaad --- /dev/null +++ b/Dev-C++/ExerciseBook/05.21/TSMatrix.cpp @@ -0,0 +1,433 @@ +/*======================= + * Ԫ˳ϡ + * + * 㷨: 5.15.2 + ========================*/ + +#include "TSMatrix.h" //**05 ͹**// + +/* + * ϡM + * + * + *ע + * + * ̲Ĭϴӿ̨ȡݡ + * Ϊ˷ԣÿжֶݣ + * ѡԤļpathжȡݡ + * + * Ҫӿ̨ȡݣpathΪNULLΪմ + * ҪļжȡݣҪpathдļϢ + */ +Status CreateSMatrix(TSMatrix* M, char* path) { + int k; + FILE* fp; + int readFromConsole; // Ƿӿ̨ȡ + + // ûļ·Ϣӿ̨ȡ + readFromConsole = path == NULL || strcmp(path, "") == 0; + + // ûļ·Ϣӿ̨ȡ + if(readFromConsole) { + printf(""); + scanf("%d", &((*M).mu)); + printf(""); + scanf("%d", &((*M).nu)); + printf("Ԫظ"); + scanf("%d", &((*M).tu)); + printf("%dԪϢ\n", (*M).tu); + for(k = 1; k <= (*M).tu; k++) { + printf("%2d飺", k); + scanf("%d%d%d", &((*M).data[k].i), &((*M).data[k].j), &((*M).data[k].e)); + } + } else { + fp = fopen(path, "r"); + + ReadData(fp, "%d%d%d", &((*M).mu), &((*M).nu), &((*M).tu)); + + for(k = 1; k <= (*M).tu; k++) { + ReadData(fp, "%d%d%d", &((*M).data[k].i), &((*M).data[k].j), &((*M).data[k].e)); + } + + fclose(fp); + } + + return OK; +} + +/* + * ϡ + * + *ע + * Ԫ˳Ľṹ޷١ + */ +Status DestroySMatrix(TSMatrix* M) { + if(M == NULL) { + return ERROR; + } + + (*M).mu = 0; + (*M).nu = 0; + (*M).tu = 0; + + return OK; +} + +/* + * + * + * һ¾Tþ˴ӾMаݡ + */ +Status CopySMatrix(TSMatrix M, TSMatrix* T) { + (*T) = M; // ṹֱ֮ӸƣʹڲҲ + + return OK; +} + +/* + * ӷ + * + * Q = M + N + */ +Status AddSMatrix(TSMatrix M, TSMatrix N, TSMatrix* Q) { + int m, n, k; + + if(M.mu != N.mu || M.nu != N.nu) { + printf("\n"); + return ERROR; + } + + // ʼQ + (*Q).mu = M.mu; + (*Q).nu = M.nu; + (*Q).tu = 0; + + m = n = k = 1; + + // αMNԪ + while(m <= M.tu && n <= N.tu) { + // MеԪ±С + if(M.data[m].i < N.data[n].i) { + (*Q).data[k] = M.data[m]; + m++; + + // NеԪ±С + } else if(M.data[m].i > N.data[n].i) { + (*Q).data[k] = N.data[n]; + n++; + + // MNеԪ±һ£ҪһȽ + } else { + // MеԪ±С + if(M.data[m].j < N.data[n].j) { + (*Q).data[k] = M.data[m]; + m++; + + // NеԪ±С + } else if(M.data[m].j > N.data[n].j) { + (*Q).data[k] = N.data[n]; + n++; + + // MNеԪ±һ£Ҫмӷ + } else { + // ֵѾΪ0ĻҪ洢Ԫ + if((M.data[m].e + N.data[n].e) == 0) { + m++; + n++; + continue; + } else { + (*Q).data[k].i = M.data[m].i; + (*Q).data[k].j = M.data[m].j; + (*Q).data[k].e = M.data[m].e + N.data[n].e; + m++; + n++; + } + } + } + + k++; + (*Q).tu++; + } + + // MʣԪ + while(m <= M.tu) { + (*Q).data[k] = M.data[m]; + m++; + k++; + (*Q).tu++; + } + + // NʣԪ + while(n <= N.tu) { + (*Q).data[k] = N.data[n]; + n++; + k++; + (*Q).tu++; + } + + return OK; +} + +/* + * + * + * Q = M - N + */ +Status SubSMatrix(TSMatrix M, TSMatrix N, TSMatrix* Q) { + int m, n, k; + + if(M.mu != N.mu || M.nu != N.nu) { + printf("\n"); + return ERROR; + } + + // ʼQ + (*Q).mu = M.mu; + (*Q).nu = M.nu; + (*Q).tu = 0; + + m = n = k = 1; + + // αMNԪ + while(m <= M.tu && n <= N.tu) { + // MеԪ±С + if(M.data[m].i < N.data[n].i) { + (*Q).data[k] = M.data[m]; + m++; + + // NеԪ±С + } else if(M.data[m].i > N.data[n].i) { + (*Q).data[k].i = N.data[n].i; + (*Q).data[k].j = N.data[n].j; + (*Q).data[k].e = -N.data[n].e; // ҪԪֵȡ෴ + n++; + + // MNеԪ±һ£ҪһȽ + } else { + // MеԪ±С + if(M.data[m].j < N.data[n].j) { + (*Q).data[k] = M.data[m]; + m++; + + // NеԪ±С + } else if(M.data[m].j > N.data[n].j) { + (*Q).data[k].i = N.data[n].i; + (*Q).data[k].j = N.data[n].j; + (*Q).data[k].e = -N.data[n].e; // ҪԪֵȡ෴ + n++; + + // MNеԪ±һ£Ҫм + } else { + // ֵѾΪ0ĻҪ洢Ԫ + if((M.data[m].e - N.data[n].e) == 0) { + m++; + n++; + continue; + } else { + (*Q).data[k].i = M.data[m].i; + (*Q).data[k].j = M.data[m].j; + (*Q).data[k].e = M.data[m].e - N.data[n].e; + m++; + n++; + } + } + } + + k++; + (*Q).tu++; + } + + // MʣԪ + while(m <= M.tu) { + (*Q).data[k] = M.data[m]; + m++; + k++; + (*Q).tu++; + } + + // NʣԪ + while(n <= N.tu) { + (*Q).data[k].i = N.data[n].i; + (*Q).data[k].j = N.data[n].j; + (*Q).data[k].e = -N.data[n].e; + n++; + k++; + (*Q).tu++; + } + + return OK; +} + +/* + * ˷ + * + * Q = M * NʵֵǴͳ˷ + */ +Status MultSMatrix(TSMatrix M, TSMatrix N, TSMatrix* Q) { + int m, n, i, j, k; + ElemType c, c1, c2; + + // MҪN + if(M.nu != N.mu) { + printf("\n"); + return ERROR; + } + + // ʼQ + (*Q).mu = M.mu; + (*Q).nu = N.nu; + (*Q).tu = 0; + + // + if(M.tu * N.tu == 0) { + return OK; + } + + // M + for(i = 1; i <= M.mu; i++) { + // N + for(j = 1; j <= N.nu; j++) { + c = 0; + for(k = 1; k <= M.nu; k++) { + // ¼M[i][k]ֵ + c1 = 0; + // ѰλָλõMԪ + for(m = 1; m <= M.tu; m++) { + if(M.data[m].i == i && M.data[m].j == k) { + c1 = M.data[m].e; + break; + } + } + + // ¼N[k][j]ֵ + c2 = 0; + //ѰλָλõNԪ + for(n = 1; n <= N.tu; n++) { + if(N.data[n].i == k && N.data[n].j == j) { + c2 = N.data[n].e; + break; + } + } + + // Q[i][j]ֵ + if(c1 && c2) { + c += c1 * c2; + } + } + + // Ϊ0д洢 + if(c != 0) { + (*Q).tu++; + (*Q).data[(*Q).tu].i = i; + (*Q).data[(*Q).tu].j = j; + (*Q).data[(*Q).tu].e = c; + } + } + } + + return OK; +} + +/* + * 㷨5.1 + * + * ת + */ +Status TransposeSMatrix(TSMatrix M, TSMatrix* T) { + int p, q, col; + + (*T).mu = M.nu; + (*T).nu = M.mu; + (*T).tu = M.tu; + + if((*T).tu != 0) { + q = 1; // qTзԪļ + + // colMУT + for(col = 1; col <= M.nu; ++col) { + // MвҵjеԪأνתõT + for(p = 1; p <= M.tu; ++p) { + if(M.data[p].j == col) { + (*T).data[q].i = M.data[p].j; // MбΪT + (*T).data[q].j = M.data[p].i; // MбΪT + (*T).data[q].e = M.data[p].e; // ÿԪֵ + ++q; + } + } + } + } + + return OK; +} + +/* + * 㷨5.2 + * + * ת + */ +Status FastTransposeSMatrix(TSMatrix M, TSMatrix* T) { + int col, t, p, q; + int* num; // num[col] ʾMcolзԪĸ + int* copt; // copt[col]ʾMcolеһԪתúеλ + + (*T).mu = M.nu; + (*T).nu = M.mu; + (*T).tu = M.tu; + + // ǰ + if((*T).tu == 0) { + return ERROR; + } + + num = (int*) malloc(M.nu * sizeof(int)); + copt = (int*) malloc(M.nu * sizeof(int)); + + // ʼnum + for(col = 1; col <= M.nu; ++col) { + num[col] = 0; + } + + // ͳMеķԪͳÿзԪĸ + for(t = 1; t <= M.tu; ++t) { + num[M.data[t].j]++; + } + + // 1е1Ԫλתúеλ + copt[1] = 1; + // е1Ԫתþеλ + for(col = 2; col <= M.nu; ++col) { + copt[col] = copt[col - 1] + num[col - 1]; + } + + // ɨMеԪ + for(p = 1; p <= M.tu; ++p) { + col = M.data[p].j; // 㵱ǰԪ + q = copt[col]; // 㵱ǰԪתþеλ + (*T).data[q].i = M.data[p].j; + (*T).data[q].j = M.data[p].i; + (*T).data[q].e = M.data[p].e; + ++copt[col]; // ԪʱתþеλӦһòҪ + } + + return OK; +} + +/* + * + */ +void PrintSMatrix(TSMatrix M) { + int r, c; + int k = 1; + + for(r = 1; r <= M.mu; r++) { + for(c = 1; c <= M.nu; c++) { + if(r == M.data[k].i && c == M.data[k].j) { + printf("%3d ", M.data[k].e); + k++; + } else { + printf("%3d ", 0); + } + } + printf("\n"); + } +} diff --git a/Dev-C++/ExerciseBook/05.21/TSMatrix.h b/Dev-C++/ExerciseBook/05.21/TSMatrix.h new file mode 100644 index 0000000..52cdeea --- /dev/null +++ b/Dev-C++/ExerciseBook/05.21/TSMatrix.h @@ -0,0 +1,107 @@ +/*======================= + * Ԫ˳ϡ + * + * 㷨: 5.15.2 + ========================*/ + +#ifndef TSMATRIX_H +#define TSMATRIX_H + +#include +#include // ṩ malloc ԭ +#include // ṩ strstr ԭ +#include "Status.h" //**01 **// + +/* + * Ԫֵ + * עֵҪIDEջڴ + */ +#define MAXSIZE 100 + +/* ԪϡԪ */ +typedef int ElemType; + +/* ԪͶ壬Ҫ洢Ԫ */ +typedef struct { + int i, j; // ԪԪ±± + ElemType e; +} Triple; + +/* ԪϡͶ */ +typedef struct { + Triple data[MAXSIZE + 1]; // ԪԪdata[0]δ + int mu, nu, tu; // ͷԪ +} TSMatrix; + + +/* + * ϡM + * + * + *ע + * + * ̲Ĭϴӿ̨ȡݡ + * Ϊ˷ԣÿжֶݣ + * ѡԤļpathжȡݡ + * + * Ҫӿ̨ȡݣpathΪNULLΪմ + * ҪļжȡݣҪpathдļϢ + */ +Status CreateSMatrix(TSMatrix* M, char* path); + +/* + * ϡ + * + *ע + * Ԫ˳Ľṹ޷١ + */ +Status DestroySMatrix(TSMatrix* M); + +/* + * + * + * һ¾Tþ˴ӾMаݡ + */ +Status CopySMatrix(TSMatrix M, TSMatrix* T); + +/* + * ӷ + * + * Q = M + N + */ +Status AddSMatrix(TSMatrix M, TSMatrix N, TSMatrix* Q); + +/* + * + * + * Q = M - N + */ +Status SubSMatrix(TSMatrix M, TSMatrix N, TSMatrix* Q); + +/* + * ˷ + * + * Q = M * NʵֵǴͳ˷ + */ +Status MultSMatrix(TSMatrix M, TSMatrix N, TSMatrix* Q); + +/* + * 㷨5.1 + * + * ת + */ +Status TransposeSMatrix(TSMatrix M, TSMatrix* T); + +/* + * 㷨5.2 + * + * ת + */ +Status FastTransposeSMatrix(TSMatrix M, TSMatrix* T); + +/* + * + */ +void PrintSMatrix(TSMatrix M); + +#endif diff --git a/Dev-C++/ExerciseBook/05.21/TestData_A.txt b/Dev-C++/ExerciseBook/05.21/TestData_A.txt new file mode 100644 index 0000000..be25c94 --- /dev/null +++ b/Dev-C++/ExerciseBook/05.21/TestData_A.txt @@ -0,0 +1,4 @@ +5 +5 +Ԫ10 +Ԫ飺(1,2,1),(1,4,5),(2,3,-3),(2,5,2),(3,1,2),(3,2,3),(3,3,4),(4,4,2),(5,1,3),(5,2,-1) \ No newline at end of file diff --git a/Dev-C++/ExerciseBook/05.21/TestData_B.txt b/Dev-C++/ExerciseBook/05.21/TestData_B.txt new file mode 100644 index 0000000..7c940db --- /dev/null +++ b/Dev-C++/ExerciseBook/05.21/TestData_B.txt @@ -0,0 +1,4 @@ +5 +5 +Ԫ8 +Ԫ飺(1,1,-3)(1,3,2)(2,4,-1)(3,2,4)(4,1,6)(4,5,5)(5,1,3)(5,3,2) \ No newline at end of file diff --git a/Dev-C++/ExerciseBook/05.22/05.22.cpp b/Dev-C++/ExerciseBook/05.22/05.22.cpp new file mode 100644 index 0000000..6ee74f7 --- /dev/null +++ b/Dev-C++/ExerciseBook/05.22/05.22.cpp @@ -0,0 +1,106 @@ +#include +#include "Status.h" //**01 **// +#include "TSMatrix.h" //**05 ͹**// + +/* + * ϡӷAddSMatrix + * + *ע + * Ҫ浽ԭA + */ +Status Algo_5_22(TSMatrix* A, TSMatrix B); + + +int main(int argc, char* argv[]) { + TSMatrix A, B; + + printf(" ϡ AB ...\n"); + CreateSMatrix(&A, "TestData_A.txt"); + CreateSMatrix(&B, "TestData_B.txt"); + printf(" A = \n"); + PrintSMatrix(A); + printf(" B = \n"); + PrintSMatrix(B); + + // + Algo_5_22(&A, B); + + printf(" A = A + B = \n"); + PrintSMatrix(A); + + return 0; +} + + +/* + * ϡӷAddSMatrix + * + *ע + * Ҫ浽ԭA + */ +Status Algo_5_22(TSMatrix* A, TSMatrix B) { + int m, n, k; + + if((*A).mu != B.mu || (*A).nu != B.nu) { + printf("\n"); + return ERROR; + } + + // AԪƶƶΪBԪظ + for(k = (*A).tu; k > 0; k--) { + (*A).data[k + B.tu] = (*A).data[k]; + } + + m = B.tu + 1; // A + n = 1; // B + k = 0; // ָα + + // αABԪ + while(m <= (*A).tu + B.tu && n <= B.tu) { + // AеԪ±С + if((*A).data[m].i < B.data[n].i) { + (*A).data[++k] = (*A).data[m++]; + + // BеԪ±С + } else if((*A).data[m].i > B.data[n].i) { + (*A).data[++k] = B.data[n++]; + + // ABеԪ±һ£ҪһȽ + } else { + // AеԪ±С + if((*A).data[m].j < B.data[n].j) { + (*A).data[++k] = (*A).data[m++]; + + // BеԪ±С + } else if((*A).data[m].j > B.data[n].j) { + (*A).data[++k] = B.data[n++]; + + // ABеԪ±һ£Ҫмӷ + } else { + // ֵΪ0ʱҪ洢Ԫ + if(((*A).data[m].e + B.data[n].e) != 0) { + k++; + (*A).data[k].i = (*A).data[m].i; + (*A).data[k].j = (*A).data[m].j; + (*A).data[k].e = (*A).data[m].e + B.data[n].e; + } + m++; + n++; + } + } + } + + // AʣԪ + while(m <= (*A).tu + B.tu) { + (*A).data[++k] = (*A).data[m++]; + } + + // BʣԪ + while(n <= B.tu) { + (*A).data[++k] = B.data[n++]; + } + + (*A).tu = k; + + return OK; +} diff --git a/Dev-C++/ExerciseBook/05.22/05.22.dev b/Dev-C++/ExerciseBook/05.22/05.22.dev new file mode 100644 index 0000000..06603f3 --- /dev/null +++ b/Dev-C++/ExerciseBook/05.22/05.22.dev @@ -0,0 +1,100 @@ +[Project] +FileName=05.22.dev +Name=05.22 +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 + +[Unit4] +FileName=TSMatrix.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit1] +FileName=05.22.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit2] +FileName=TestData_A.txt +Folder= +Compile=0 +Link=0 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit3] +FileName=TestData_B.txt +Folder= +Compile=0 +Link=0 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit5] +FileName=TSMatrix.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + diff --git a/Dev-C++/ExerciseBook/05.22/TSMatrix.cpp b/Dev-C++/ExerciseBook/05.22/TSMatrix.cpp new file mode 100644 index 0000000..05eeaad --- /dev/null +++ b/Dev-C++/ExerciseBook/05.22/TSMatrix.cpp @@ -0,0 +1,433 @@ +/*======================= + * Ԫ˳ϡ + * + * 㷨: 5.15.2 + ========================*/ + +#include "TSMatrix.h" //**05 ͹**// + +/* + * ϡM + * + * + *ע + * + * ̲Ĭϴӿ̨ȡݡ + * Ϊ˷ԣÿжֶݣ + * ѡԤļpathжȡݡ + * + * Ҫӿ̨ȡݣpathΪNULLΪմ + * ҪļжȡݣҪpathдļϢ + */ +Status CreateSMatrix(TSMatrix* M, char* path) { + int k; + FILE* fp; + int readFromConsole; // Ƿӿ̨ȡ + + // ûļ·Ϣӿ̨ȡ + readFromConsole = path == NULL || strcmp(path, "") == 0; + + // ûļ·Ϣӿ̨ȡ + if(readFromConsole) { + printf(""); + scanf("%d", &((*M).mu)); + printf(""); + scanf("%d", &((*M).nu)); + printf("Ԫظ"); + scanf("%d", &((*M).tu)); + printf("%dԪϢ\n", (*M).tu); + for(k = 1; k <= (*M).tu; k++) { + printf("%2d飺", k); + scanf("%d%d%d", &((*M).data[k].i), &((*M).data[k].j), &((*M).data[k].e)); + } + } else { + fp = fopen(path, "r"); + + ReadData(fp, "%d%d%d", &((*M).mu), &((*M).nu), &((*M).tu)); + + for(k = 1; k <= (*M).tu; k++) { + ReadData(fp, "%d%d%d", &((*M).data[k].i), &((*M).data[k].j), &((*M).data[k].e)); + } + + fclose(fp); + } + + return OK; +} + +/* + * ϡ + * + *ע + * Ԫ˳Ľṹ޷١ + */ +Status DestroySMatrix(TSMatrix* M) { + if(M == NULL) { + return ERROR; + } + + (*M).mu = 0; + (*M).nu = 0; + (*M).tu = 0; + + return OK; +} + +/* + * + * + * һ¾Tþ˴ӾMаݡ + */ +Status CopySMatrix(TSMatrix M, TSMatrix* T) { + (*T) = M; // ṹֱ֮ӸƣʹڲҲ + + return OK; +} + +/* + * ӷ + * + * Q = M + N + */ +Status AddSMatrix(TSMatrix M, TSMatrix N, TSMatrix* Q) { + int m, n, k; + + if(M.mu != N.mu || M.nu != N.nu) { + printf("\n"); + return ERROR; + } + + // ʼQ + (*Q).mu = M.mu; + (*Q).nu = M.nu; + (*Q).tu = 0; + + m = n = k = 1; + + // αMNԪ + while(m <= M.tu && n <= N.tu) { + // MеԪ±С + if(M.data[m].i < N.data[n].i) { + (*Q).data[k] = M.data[m]; + m++; + + // NеԪ±С + } else if(M.data[m].i > N.data[n].i) { + (*Q).data[k] = N.data[n]; + n++; + + // MNеԪ±һ£ҪһȽ + } else { + // MеԪ±С + if(M.data[m].j < N.data[n].j) { + (*Q).data[k] = M.data[m]; + m++; + + // NеԪ±С + } else if(M.data[m].j > N.data[n].j) { + (*Q).data[k] = N.data[n]; + n++; + + // MNеԪ±һ£Ҫмӷ + } else { + // ֵѾΪ0ĻҪ洢Ԫ + if((M.data[m].e + N.data[n].e) == 0) { + m++; + n++; + continue; + } else { + (*Q).data[k].i = M.data[m].i; + (*Q).data[k].j = M.data[m].j; + (*Q).data[k].e = M.data[m].e + N.data[n].e; + m++; + n++; + } + } + } + + k++; + (*Q).tu++; + } + + // MʣԪ + while(m <= M.tu) { + (*Q).data[k] = M.data[m]; + m++; + k++; + (*Q).tu++; + } + + // NʣԪ + while(n <= N.tu) { + (*Q).data[k] = N.data[n]; + n++; + k++; + (*Q).tu++; + } + + return OK; +} + +/* + * + * + * Q = M - N + */ +Status SubSMatrix(TSMatrix M, TSMatrix N, TSMatrix* Q) { + int m, n, k; + + if(M.mu != N.mu || M.nu != N.nu) { + printf("\n"); + return ERROR; + } + + // ʼQ + (*Q).mu = M.mu; + (*Q).nu = M.nu; + (*Q).tu = 0; + + m = n = k = 1; + + // αMNԪ + while(m <= M.tu && n <= N.tu) { + // MеԪ±С + if(M.data[m].i < N.data[n].i) { + (*Q).data[k] = M.data[m]; + m++; + + // NеԪ±С + } else if(M.data[m].i > N.data[n].i) { + (*Q).data[k].i = N.data[n].i; + (*Q).data[k].j = N.data[n].j; + (*Q).data[k].e = -N.data[n].e; // ҪԪֵȡ෴ + n++; + + // MNеԪ±һ£ҪһȽ + } else { + // MеԪ±С + if(M.data[m].j < N.data[n].j) { + (*Q).data[k] = M.data[m]; + m++; + + // NеԪ±С + } else if(M.data[m].j > N.data[n].j) { + (*Q).data[k].i = N.data[n].i; + (*Q).data[k].j = N.data[n].j; + (*Q).data[k].e = -N.data[n].e; // ҪԪֵȡ෴ + n++; + + // MNеԪ±һ£Ҫм + } else { + // ֵѾΪ0ĻҪ洢Ԫ + if((M.data[m].e - N.data[n].e) == 0) { + m++; + n++; + continue; + } else { + (*Q).data[k].i = M.data[m].i; + (*Q).data[k].j = M.data[m].j; + (*Q).data[k].e = M.data[m].e - N.data[n].e; + m++; + n++; + } + } + } + + k++; + (*Q).tu++; + } + + // MʣԪ + while(m <= M.tu) { + (*Q).data[k] = M.data[m]; + m++; + k++; + (*Q).tu++; + } + + // NʣԪ + while(n <= N.tu) { + (*Q).data[k].i = N.data[n].i; + (*Q).data[k].j = N.data[n].j; + (*Q).data[k].e = -N.data[n].e; + n++; + k++; + (*Q).tu++; + } + + return OK; +} + +/* + * ˷ + * + * Q = M * NʵֵǴͳ˷ + */ +Status MultSMatrix(TSMatrix M, TSMatrix N, TSMatrix* Q) { + int m, n, i, j, k; + ElemType c, c1, c2; + + // MҪN + if(M.nu != N.mu) { + printf("\n"); + return ERROR; + } + + // ʼQ + (*Q).mu = M.mu; + (*Q).nu = N.nu; + (*Q).tu = 0; + + // + if(M.tu * N.tu == 0) { + return OK; + } + + // M + for(i = 1; i <= M.mu; i++) { + // N + for(j = 1; j <= N.nu; j++) { + c = 0; + for(k = 1; k <= M.nu; k++) { + // ¼M[i][k]ֵ + c1 = 0; + // ѰλָλõMԪ + for(m = 1; m <= M.tu; m++) { + if(M.data[m].i == i && M.data[m].j == k) { + c1 = M.data[m].e; + break; + } + } + + // ¼N[k][j]ֵ + c2 = 0; + //ѰλָλõNԪ + for(n = 1; n <= N.tu; n++) { + if(N.data[n].i == k && N.data[n].j == j) { + c2 = N.data[n].e; + break; + } + } + + // Q[i][j]ֵ + if(c1 && c2) { + c += c1 * c2; + } + } + + // Ϊ0д洢 + if(c != 0) { + (*Q).tu++; + (*Q).data[(*Q).tu].i = i; + (*Q).data[(*Q).tu].j = j; + (*Q).data[(*Q).tu].e = c; + } + } + } + + return OK; +} + +/* + * 㷨5.1 + * + * ת + */ +Status TransposeSMatrix(TSMatrix M, TSMatrix* T) { + int p, q, col; + + (*T).mu = M.nu; + (*T).nu = M.mu; + (*T).tu = M.tu; + + if((*T).tu != 0) { + q = 1; // qTзԪļ + + // colMУT + for(col = 1; col <= M.nu; ++col) { + // MвҵjеԪأνתõT + for(p = 1; p <= M.tu; ++p) { + if(M.data[p].j == col) { + (*T).data[q].i = M.data[p].j; // MбΪT + (*T).data[q].j = M.data[p].i; // MбΪT + (*T).data[q].e = M.data[p].e; // ÿԪֵ + ++q; + } + } + } + } + + return OK; +} + +/* + * 㷨5.2 + * + * ת + */ +Status FastTransposeSMatrix(TSMatrix M, TSMatrix* T) { + int col, t, p, q; + int* num; // num[col] ʾMcolзԪĸ + int* copt; // copt[col]ʾMcolеһԪתúеλ + + (*T).mu = M.nu; + (*T).nu = M.mu; + (*T).tu = M.tu; + + // ǰ + if((*T).tu == 0) { + return ERROR; + } + + num = (int*) malloc(M.nu * sizeof(int)); + copt = (int*) malloc(M.nu * sizeof(int)); + + // ʼnum + for(col = 1; col <= M.nu; ++col) { + num[col] = 0; + } + + // ͳMеķԪͳÿзԪĸ + for(t = 1; t <= M.tu; ++t) { + num[M.data[t].j]++; + } + + // 1е1Ԫλתúеλ + copt[1] = 1; + // е1Ԫתþеλ + for(col = 2; col <= M.nu; ++col) { + copt[col] = copt[col - 1] + num[col - 1]; + } + + // ɨMеԪ + for(p = 1; p <= M.tu; ++p) { + col = M.data[p].j; // 㵱ǰԪ + q = copt[col]; // 㵱ǰԪתþеλ + (*T).data[q].i = M.data[p].j; + (*T).data[q].j = M.data[p].i; + (*T).data[q].e = M.data[p].e; + ++copt[col]; // ԪʱתþеλӦһòҪ + } + + return OK; +} + +/* + * + */ +void PrintSMatrix(TSMatrix M) { + int r, c; + int k = 1; + + for(r = 1; r <= M.mu; r++) { + for(c = 1; c <= M.nu; c++) { + if(r == M.data[k].i && c == M.data[k].j) { + printf("%3d ", M.data[k].e); + k++; + } else { + printf("%3d ", 0); + } + } + printf("\n"); + } +} diff --git a/Dev-C++/ExerciseBook/05.22/TSMatrix.h b/Dev-C++/ExerciseBook/05.22/TSMatrix.h new file mode 100644 index 0000000..52cdeea --- /dev/null +++ b/Dev-C++/ExerciseBook/05.22/TSMatrix.h @@ -0,0 +1,107 @@ +/*======================= + * Ԫ˳ϡ + * + * 㷨: 5.15.2 + ========================*/ + +#ifndef TSMATRIX_H +#define TSMATRIX_H + +#include +#include // ṩ malloc ԭ +#include // ṩ strstr ԭ +#include "Status.h" //**01 **// + +/* + * Ԫֵ + * עֵҪIDEջڴ + */ +#define MAXSIZE 100 + +/* ԪϡԪ */ +typedef int ElemType; + +/* ԪͶ壬Ҫ洢Ԫ */ +typedef struct { + int i, j; // ԪԪ±± + ElemType e; +} Triple; + +/* ԪϡͶ */ +typedef struct { + Triple data[MAXSIZE + 1]; // ԪԪdata[0]δ + int mu, nu, tu; // ͷԪ +} TSMatrix; + + +/* + * ϡM + * + * + *ע + * + * ̲Ĭϴӿ̨ȡݡ + * Ϊ˷ԣÿжֶݣ + * ѡԤļpathжȡݡ + * + * Ҫӿ̨ȡݣpathΪNULLΪմ + * ҪļжȡݣҪpathдļϢ + */ +Status CreateSMatrix(TSMatrix* M, char* path); + +/* + * ϡ + * + *ע + * Ԫ˳Ľṹ޷١ + */ +Status DestroySMatrix(TSMatrix* M); + +/* + * + * + * һ¾Tþ˴ӾMаݡ + */ +Status CopySMatrix(TSMatrix M, TSMatrix* T); + +/* + * ӷ + * + * Q = M + N + */ +Status AddSMatrix(TSMatrix M, TSMatrix N, TSMatrix* Q); + +/* + * + * + * Q = M - N + */ +Status SubSMatrix(TSMatrix M, TSMatrix N, TSMatrix* Q); + +/* + * ˷ + * + * Q = M * NʵֵǴͳ˷ + */ +Status MultSMatrix(TSMatrix M, TSMatrix N, TSMatrix* Q); + +/* + * 㷨5.1 + * + * ת + */ +Status TransposeSMatrix(TSMatrix M, TSMatrix* T); + +/* + * 㷨5.2 + * + * ת + */ +Status FastTransposeSMatrix(TSMatrix M, TSMatrix* T); + +/* + * + */ +void PrintSMatrix(TSMatrix M); + +#endif diff --git a/Dev-C++/ExerciseBook/05.22/TestData_A.txt b/Dev-C++/ExerciseBook/05.22/TestData_A.txt new file mode 100644 index 0000000..be25c94 --- /dev/null +++ b/Dev-C++/ExerciseBook/05.22/TestData_A.txt @@ -0,0 +1,4 @@ +5 +5 +Ԫ10 +Ԫ飺(1,2,1),(1,4,5),(2,3,-3),(2,5,2),(3,1,2),(3,2,3),(3,3,4),(4,4,2),(5,1,3),(5,2,-1) \ No newline at end of file diff --git a/Dev-C++/ExerciseBook/05.22/TestData_B.txt b/Dev-C++/ExerciseBook/05.22/TestData_B.txt new file mode 100644 index 0000000..7c940db --- /dev/null +++ b/Dev-C++/ExerciseBook/05.22/TestData_B.txt @@ -0,0 +1,4 @@ +5 +5 +Ԫ8 +Ԫ飺(1,1,-3)(1,3,2)(2,4,-1)(3,2,4)(4,1,6)(4,5,5)(5,1,3)(5,3,2) \ No newline at end of file diff --git a/Dev-C++/ExerciseBook/05.23/05.23.cpp b/Dev-C++/ExerciseBook/05.23/05.23.cpp new file mode 100644 index 0000000..27818c4 --- /dev/null +++ b/Dev-C++/ExerciseBook/05.23/05.23.cpp @@ -0,0 +1,52 @@ +#include +#include "Status.h" //**01 **// +#include "RLSMatrix.h" //**05 ͹**// + +/* + * ȡеiеjеԪأ洢e + */ +Status Algo_5_23(RLSMatrix M, int i, int j, int* e); + + +int main(int argc, char* argv[]) { + RLSMatrix M; + int e; + + printf(" ϡ M ...\n"); + CreateSMatrix(&M, "TestData_M.txt"); + printf("M = \n"); + PrintSMatrix(M); + + Algo_5_23(M, 2, 3, &e); + printf(" %d %d еԪΪ %d\n", 2, 3, e); + + return 0; +} + + +/* + * ȡеiеjеԪأ洢e + */ +Status Algo_5_23(RLSMatrix M, int i, int j, int* e) { + int begin, end, k; + + if(i < 1 || i > M.mu || j < 1 || j > M.nu) { + return ERROR; + } + + // ȡi׸ԪԪеλ + begin = M.rpos[i]; + end = (i == M.mu ? M.tu : M.rpos[i + 1] - 1); + + *e = 0; // ĬΪ0 + + for(k = begin; k <= end; k++) { + // ҵӦ±Ԫ + if(M.data[k].j == j) { + *e = M.data[k].e; + break; + } + } + + return OK; +} diff --git a/Dev-C++/ExerciseBook/05.23/05.23.dev b/Dev-C++/ExerciseBook/05.23/05.23.dev new file mode 100644 index 0000000..8492dec --- /dev/null +++ b/Dev-C++/ExerciseBook/05.23/05.23.dev @@ -0,0 +1,91 @@ +[Project] +FileName=05.23.dev +Name=05.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=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 + +[Unit2] +FileName=RLSMatrix.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit1] +FileName=05.23.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit3] +FileName=RLSMatrix.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit4] +FileName=TestData_M.txt +Folder= +Compile=0 +Link=0 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + diff --git a/Dev-C++/ExerciseBook/05.23/RLSMatrix.cpp b/Dev-C++/ExerciseBook/05.23/RLSMatrix.cpp new file mode 100644 index 0000000..5d28a0e --- /dev/null +++ b/Dev-C++/ExerciseBook/05.23/RLSMatrix.cpp @@ -0,0 +1,515 @@ +/*============================= + * ߼ӵ˳ϡ + * + * 㷨: 5.3 + ==============================*/ + +#include "RLSMatrix.h" //**05 ͹**// + +/* + * ϡM + * + * + *ע + * + * ̲Ĭϴӿ̨ȡݡ + * Ϊ˷ԣÿжֶݣ + * ѡԤļpathжȡݡ + * + * Ҫӿ̨ȡݣpathΪNULLΪմ + * ҪļжȡݣҪpathдļϢ + */ +Status CreateSMatrix(RLSMatrix* M, char* path) { + int k; + FILE* fp; + int readFromConsole; // Ƿӿ̨ȡ + + // ûļ·Ϣӿ̨ȡ + readFromConsole = path == NULL || strcmp(path, "") == 0; + + // ûļ·Ϣӿ̨ȡ + if(readFromConsole) { + printf(""); + scanf("%d", &((*M).mu)); + printf(""); + scanf("%d", &((*M).nu)); + printf("Ԫظ"); + scanf("%d", &((*M).tu)); + printf("%dԪϢ\n", (*M).tu); + for(k = 1; k <= (*M).tu; k++) { + printf("%2d飺", k); + scanf("%d%d%d", &((*M).data[k].i), &((*M).data[k].j), &((*M).data[k].e)); + } + } else { + fp = fopen(path, "r"); + + ReadData(fp, "%d%d%d", &((*M).mu), &((*M).nu), &((*M).tu)); + + for(k = 1; k <= (*M).tu; k++) { + ReadData(fp, "%d%d%d", &((*M).data[k].i), &((*M).data[k].j), &((*M).data[k].e)); + } + + fclose(fp); + } + + // Ϊrpos鸳ֵ + AssignRpos(M); + + return OK; +} + +/* + * ϡ + * + *ע + * ߼ӵ˳ṹ޷١ + */ +Status DestroySMatrix(RLSMatrix* M) { + int i; + + if(M == NULL) { + return ERROR; + } + + M->mu = 0; + M->nu = 0; + M->tu = 0; + + for(i = 0; i <= MAXRC; ++i) { + M->rpos[i] = 0; + } + + return OK; +} + +/* + * + * + * һ¾Tþ˴ӾMаݡ + */ +Status CopySMatrix(RLSMatrix M, RLSMatrix* T) { + (*T) = M; // ṹֱ֮ӸƣʹڲҲ + + return OK; +} + +/* + * ӷ + * + * Q = M + N + */ +Status AddSMatrix(RLSMatrix M, RLSMatrix N, RLSMatrix* Q) { + int m, n, k; + + if(M.mu != N.mu || M.nu != N.nu) { + printf("\n"); + return ERROR; + } + + // ʼQϢ + (*Q).mu = M.mu; + (*Q).nu = M.nu; + (*Q).tu = 0; + + m = n = k = 1; + + // αMNԪ + while(m <= M.tu && n <= N.tu) { + // MеԪ±С + if(M.data[m].i < N.data[n].i) { + (*Q).data[k] = M.data[m]; + m++; + + // NеԪ±С + } else if(M.data[m].i > N.data[n].i) { + (*Q).data[k] = N.data[n]; + n++; + + // MNеԪ±һ£ҪһȽ + } else { + // MеԪ±С + if(M.data[m].j < N.data[n].j) { + (*Q).data[k] = M.data[m]; + m++; + + // NеԪ±С + } else if(M.data[m].j > N.data[n].j) { + (*Q).data[k] = N.data[n]; + n++; + + // MNеԪ±һ£Ҫмӷ + } else { + // ֵѾΪ0ĻҪ洢Ԫ + if((M.data[m].e + N.data[n].e) == 0) { + m++; + n++; + continue; + } else { + (*Q).data[k].i = M.data[m].i; + (*Q).data[k].j = M.data[m].j; + (*Q).data[k].e = M.data[m].e + N.data[n].e; + m++; + n++; + } + } + } + + k++; + (*Q).tu++; + } + + // MʣԪ + while(m <= M.tu) { + (*Q).data[k] = M.data[m]; + m++; + k++; + (*Q).tu++; + } + + // NʣԪ + while(n <= N.tu) { + (*Q).data[k] = N.data[n]; + n++; + k++; + (*Q).tu++; + } + + // Ϊrpos鸳ֵ + AssignRpos(Q); + + return OK; +} + +/* + * + * + * Q = M - N + */ +Status SubSMatrix(RLSMatrix M, RLSMatrix N, RLSMatrix* Q) { + int m, n, k; + + if(M.mu != N.mu || M.nu != N.nu) { + printf("\n"); + return ERROR; + } + + // ʼQϢ + (*Q).mu = M.mu; + (*Q).nu = M.nu; + (*Q).tu = 0; + + m = n = k = 1; + + // αMNԪ + while(m <= M.tu && n <= N.tu) { + // MеԪ±С + if(M.data[m].i < N.data[n].i) { + (*Q).data[k] = M.data[m]; + m++; + + // NеԪ±С + } else if(M.data[m].i > N.data[n].i) { + (*Q).data[k].i = N.data[n].i; + (*Q).data[k].j = N.data[n].j; + (*Q).data[k].e = -N.data[n].e; // ҪԪֵȡ෴ + n++; + + // MNеԪ±һ£ҪһȽ + } else { + // MеԪ±С + if(M.data[m].j < N.data[n].j) { + (*Q).data[k] = M.data[m]; + m++; + + // NеԪ±С + } else if(M.data[m].j > N.data[n].j) { + (*Q).data[k].i = N.data[n].i; + (*Q).data[k].j = N.data[n].j; + (*Q).data[k].e = -N.data[n].e; // ҪԪֵȡ෴ + n++; + + // MNеԪ±һ£Ҫм + } else { + // ֵѾΪ0ĻҪ洢Ԫ + if((M.data[m].e - N.data[n].e) == 0) { + m++; + n++; + continue; + } else { + (*Q).data[k].i = M.data[m].i; + (*Q).data[k].j = M.data[m].j; + (*Q).data[k].e = M.data[m].e - N.data[n].e; + m++; + n++; + } + } + } + + k++; + (*Q).tu++; + } + + // MʣԪ + while(m <= M.tu) { + (*Q).data[k] = M.data[m]; + m++; + k++; + (*Q).tu++; + } + + // NʣԪ + while(n <= N.tu) { + (*Q).data[k].i = N.data[n].i; + (*Q).data[k].j = N.data[n].j; + (*Q).data[k].e = -N.data[n].e; + n++; + k++; + (*Q).tu++; + } + + // Ϊrpos鸳ֵ + AssignRpos(Q); + + return OK; +} + +/* + * 㷨5.3 + * + * ˷ + * + * Q = M * N + */ +Status MultSMatrix(RLSMatrix M, RLSMatrix N, RLSMatrix* Q) { + int arow, p, tp; + int brow, q, tq; + int ccol; + int* ctemp; // QиԪֵۼctemp[0]Ԫ + int i; + + // MҪN + if(M.nu != N.mu) { + printf("\n"); + return ERROR; + } + + // ʼQϢ + (*Q).mu = M.mu; + (*Q).nu = N.nu; + (*Q).tu = 0; + + // + if(M.tu * N.tu == 0) { + return OK; + } + + ctemp = (int*) malloc((N.nu + 1) * sizeof(int)); + + // Mÿһ + for(arow = 1; arow <= M.mu; ++arow) { + // ʼQԪֵ + for(i = 0; i <= N.nu; ++i) { + ctemp[i] = 0; + } + + // tpָMǰеһеһԪλ + if(arow < M.mu) { + tp = M.rpos[arow + 1]; + } else { + tp = M.tu + 1; + } + + // MarowезԪ + for(p = M.rpos[arow]; p < tp; ++p) { + // ȡ÷ԪNек + brow = M.data[p].j; + + // tqָNǰеһеһԪλ + if(brow < N.mu) { + tq = N.rpos[brow + 1]; + } else { + tq = N.tu + 1; + } + + // NbrowезԪ + for(q = N.rpos[brow]; q < tq; ++q) { + // ˻ԪQек + ccol = N.data[q].j; + + // ۼӳ˻ + ctemp[ccol] += M.data[p].e * N.data[q].e; + } + } + + /* + * ˣQеarowԪ + */ + + // ij˻ѡȡԪQ + for(ccol = 1; ccol <= (*Q).nu; ++ccol) { + // QеarowccolԪزΪ0 + if(ctemp[ccol]) { + ++(*Q).tu; + + // Ԫ + if((*Q).tu > MAXSIZE) { + return ERROR; + } + + (*Q).data[(*Q).tu].i = arow; + (*Q).data[(*Q).tu].j = ccol; + (*Q).data[(*Q).tu].e = ctemp[ccol]; + } + } + } + + // Ϊrpos鸳ֵ + AssignRpos(Q); + + return OK; +} + +/* + * ת + */ +Status TransposeSMatrix(RLSMatrix M, RLSMatrix* T) { + int p, q, col; + + (*T).mu = M.nu; + (*T).nu = M.mu; + (*T).tu = M.tu; + + if((*T).tu) { + q = 1; // qTзԪļ + + // colMУT + for(col = 1; col <= M.nu; ++col) { + // MвҵjеԪأνתõT + for(p = 1; p <= M.tu; ++p) { + if(M.data[p].j == col) { + (*T).data[q].i = M.data[p].j; // MбΪT + (*T).data[q].j = M.data[p].i; // MбΪT + (*T).data[q].e = M.data[p].e; // ÿԪֵ + + ++q; + } + } + } + } + + // Ϊrpos鸳ֵ + AssignRpos(T); + + return OK; +} + +/* + * ת + */ +Status FastTransposeSMatrix(RLSMatrix M, RLSMatrix* T) { + int col, t, p, q; + int* num; // num[col] ʾMcolзԪĸ + int* copt; // copt[col]ʾMcolеһԪתúеλ + + (*T).mu = M.nu; + (*T).nu = M.mu; + (*T).tu = M.tu; + + // ǰ + if((*T).tu == 0) { + return ERROR; + } + + num = (int*) malloc(M.nu * sizeof(int)); + copt = (int*) malloc(M.nu * sizeof(int)); + + // ʼnum + for(col = 1; col <= M.nu; ++col) { + num[col] = 0; + } + + // ͳMеķԪͳÿзԪĸ + for(t = 1; t <= M.tu; ++t) { + num[M.data[t].j]++; + } + + // 1е1Ԫλתúеλ + copt[1] = 1; + // е1Ԫתþеλ + for(col = 2; col <= M.nu; ++col) { + copt[col] = copt[col - 1] + num[col - 1]; + } + + // ɨMеԪ + for(p = 1; p <= M.tu; ++p) { + col = M.data[p].j; // 㵱ǰԪ + q = copt[col]; // 㵱ǰԪתþеλ + (*T).data[q].i = M.data[p].j; + (*T).data[q].j = M.data[p].i; + (*T).data[q].e = M.data[p].e; + ++copt[col]; // ԪʱתþеλӦһòҪ + } + + // Ϊrpos鸳ֵ + AssignRpos(T); + + return OK; +} + +/* + * + */ +void PrintSMatrix(RLSMatrix M) { + int r, c; + int k = 1; + + for(r = 1; r <= M.mu; ++r) { + for(c = 1; c <= M.nu; ++c) { + if(r == M.data[k].i && c == M.data[k].j) { + printf("%3d ", M.data[k].e); + k++; + } else { + printf("%3d ", 0); + } + } + printf("\n"); + } + + printf("rpos = "); + for(k = 1; k <= M.mu; ++k) { + printf("%d ", M.rpos[k]); + } + printf("\n"); +} + +// Ϊrpos鸳ֵ +static void AssignRpos(RLSMatrix* M) { + int k, m; + + // ʼrpos + for(k = 0; k <= MAXRC; ++k) { + (*M).rpos[k] = 0; + } + + for(k = 1; k <= (*M).tu; k++) { + m = (*M).data[k].i; // ǰԪԪھеλ + + // ¼ÿеһԪԪеλ + if((*M).rpos[m] == 0) { + (*M).rpos[m] = k; // ֻڵǰзԪ¼¼ + } + } + + // ЩûзԪ + for(k = (*M).mu; k >= 1; k--) { + // ǰûзԪ˴ֱȡһеIJ + if((*M).rpos[k] == 0) { + // һ޷ԪΪѾһˣ⴦ + if(k == (*M).mu) { + (*M).rpos[k] = (*M).tu + 1; + } else { + (*M).rpos[k] = (*M).rpos[k + 1]; + } + } + } +} diff --git a/Dev-C++/ExerciseBook/05.23/RLSMatrix.h b/Dev-C++/ExerciseBook/05.23/RLSMatrix.h new file mode 100644 index 0000000..0550c13 --- /dev/null +++ b/Dev-C++/ExerciseBook/05.23/RLSMatrix.h @@ -0,0 +1,107 @@ +/*============================= + * ߼ӵ˳ϡ + * + * 㷨: 5.3 + ==============================*/ + +#ifndef RLSMATRIX_H +#define RLSMATRIX_H + +#include +#include // ṩ malloc ԭ +#include // ṩ strstr ԭ +#include "Status.h" //**01 **// + +/* 궨 */ +#define MAXSIZE 12500 // Ԫֵ +#define MAXRC 20 // Ԫظֵ + +/* ߼ӵϡԪ */ +typedef int ElemType; + +/* ԪͶ壬Ҫ洢Ԫ */ +typedef struct { + int i, j; // ÷Ԫ±± + ElemType e; +} Triple; + +/* ߼ӵϡͶ */ +typedef struct { + Triple data[MAXSIZE + 1]; // ԪԪdata[0]δ + int rpos[MAXRC + 1]; // еһԪԪеλñrpos[0]δ + int mu, nu, tu; // ͷԪ +} RLSMatrix; + + +/* + * ϡM + * + * + *ע + * + * ̲Ĭϴӿ̨ȡݡ + * Ϊ˷ԣÿжֶݣ + * ѡԤļpathжȡݡ + * + * Ҫӿ̨ȡݣpathΪNULLΪմ + * ҪļжȡݣҪpathдļϢ + */ +Status CreateSMatrix(RLSMatrix* M, char* path); + +/* + * ϡ + * + *ע + * ߼ӵ˳ṹ޷١ + */ +Status DestroySMatrix(RLSMatrix* M); + +/* + * + * + * һ¾Tþ˴ӾMаݡ + */ +Status CopySMatrix(RLSMatrix M, RLSMatrix* T); + +/* + * ӷ + * + * Q = M + N + */ +Status AddSMatrix(RLSMatrix M, RLSMatrix N, RLSMatrix* Q); + +/* + * + * + * Q = M - N + */ +Status SubSMatrix(RLSMatrix M, RLSMatrix N, RLSMatrix* Q); + +/* + * 㷨5.3 + * + * ˷ + * + * Q = M * N + */ +Status MultSMatrix(RLSMatrix M, RLSMatrix N, RLSMatrix* Q); + +/* + * ת + */ +Status TransposeSMatrix(RLSMatrix M, RLSMatrix* T); + +/* + * ת + */ +Status FastTransposeSMatrix(RLSMatrix M, RLSMatrix* T); + +/* + * + */ +void PrintSMatrix(RLSMatrix M); + +// Ϊrpos鸳ֵ +static void AssignRpos(RLSMatrix* M); + +#endif diff --git a/Dev-C++/ExerciseBook/05.23/TestData_M.txt b/Dev-C++/ExerciseBook/05.23/TestData_M.txt new file mode 100644 index 0000000..be25c94 --- /dev/null +++ b/Dev-C++/ExerciseBook/05.23/TestData_M.txt @@ -0,0 +1,4 @@ +5 +5 +Ԫ10 +Ԫ飺(1,2,1),(1,4,5),(2,3,-3),(2,5,2),(3,1,2),(3,2,3),(3,3,4),(4,4,2),(5,1,3),(5,2,-1) \ No newline at end of file diff --git a/Dev-C++/ExerciseBook/05.24/05.24.cpp b/Dev-C++/ExerciseBook/05.24/05.24.cpp new file mode 100644 index 0000000..1da6f30 --- /dev/null +++ b/Dev-C++/ExerciseBook/05.24/05.24.cpp @@ -0,0 +1,49 @@ +#include +#include "Status.h" //**01 **// +#include "SMatrix.h" //**ϡ**// + +/* + * ȡеiеjеԪأ洢e + */ +Status Algo_5_24(SMatrix M, int i, int j, int* e); + + +int main(int argc, char* argv[]) { + SMatrix M; + int e; + + printf(" ϡ M ...\n"); + CreateSMatrix(&M, "TestData_M.txt"); + printf("M = \n"); + PrintSMatrix(M); + + Algo_5_24(M, 2, 3, &e); + printf(" %d %d еԪΪ %d\n", 2, 3, e); + + return 0; +} + + +/* + * ȡеiеjеԪأ洢e + */ +Status Algo_5_24(SMatrix M, int i, int j, int* e) { + int s, p; + + if(i < 1 || i > M.mu || j < 1 || j > M.nu) { + return ERROR; + } + + for(p = 1, s = (i - 1) * M.nu + j; M.data[p].seq < s; p++) { + // ѰָԪ + } + + *e = 0; // ĬΪ0 + + // ҵӦ±Ԫ + if(M.data[p].seq == s) { + *e = M.data[p].e; + } + + return OK; +} diff --git a/Dev-C++/ExerciseBook/05.24/05.24.dev b/Dev-C++/ExerciseBook/05.24/05.24.dev new file mode 100644 index 0000000..2c4a524 --- /dev/null +++ b/Dev-C++/ExerciseBook/05.24/05.24.dev @@ -0,0 +1,91 @@ +[Project] +FileName=05.24.dev +Name=05.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=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 + +[Unit2] +FileName=SMatrix.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit1] +FileName=05.24.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit3] +FileName=SMatrix.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit4] +FileName=TestData_M.txt +Folder= +Compile=0 +Link=0 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + diff --git a/Dev-C++/ExerciseBook/05.24/SMatrix.cpp b/Dev-C++/ExerciseBook/05.24/SMatrix.cpp new file mode 100644 index 0000000..729641b --- /dev/null +++ b/Dev-C++/ExerciseBook/05.24/SMatrix.cpp @@ -0,0 +1,44 @@ +/*====================== + * ϡϰ5.24 + =======================*/ + +#include "SMatrix.h" //**ϡ**// + +// ϡM +Status CreateSMatrix(SMatrix* M, char* path) { + FILE* fp; + int k, i, j; + + fp = fopen(path, "r"); + + ReadData(fp, "%d%d%d", &((*M).mu), &((*M).nu), &((*M).tu)); + + // ȡԪ + for(k = 1; k <= (*M).tu; k++) { + ReadData(fp, "%d%d%d", &i, &j, &((*M).data[k].e)); + (*M).data[k].seq = (i - 1) * (*M).nu + j; + } + + fclose(fp); + + return OK; +} + +// ϡM +void PrintSMatrix(SMatrix M) { + int r, c; + int k = 1; + + for(r = 1; r <= M.mu; r++) { + for(c = 1; c <= M.nu; c++) { + if(r == (M.data[k].seq - 1) / M.nu + 1 && c == (M.data[k].seq - 1) % M.nu + 1) { + + printf("%3d ", M.data[k].e); + k++; + } else { + printf(" 0 "); + } + } + printf("\n"); + } +} diff --git a/Dev-C++/ExerciseBook/05.24/SMatrix.h b/Dev-C++/ExerciseBook/05.24/SMatrix.h new file mode 100644 index 0000000..5df069c --- /dev/null +++ b/Dev-C++/ExerciseBook/05.24/SMatrix.h @@ -0,0 +1,32 @@ +/*====================== + * ϡϰ5.24 + =======================*/ + +#ifndef SMATRIX_H +#define SMATRIX_H + +#include +#include "Status.h" //**01 **// + +#define MAXSIZE 100 // ԪֵΪ400 + +/* Ԫ */ +typedef struct { + int seq; // ÷ԪھеţΪ + int e; +} SElem; + +/* ϡ */ +typedef struct { + SElem data[MAXSIZE + 1]; // 洢Ԫأdata[0]δ + int mu, nu, tu; // ͷԪ +} SMatrix; + + +// ϡM +Status CreateSMatrix(SMatrix* M, char* path); + +// ϡM +void PrintSMatrix(SMatrix M); + +#endif diff --git a/Dev-C++/ExerciseBook/05.24/TestData_M.txt b/Dev-C++/ExerciseBook/05.24/TestData_M.txt new file mode 100644 index 0000000..be25c94 --- /dev/null +++ b/Dev-C++/ExerciseBook/05.24/TestData_M.txt @@ -0,0 +1,4 @@ +5 +5 +Ԫ10 +Ԫ飺(1,2,1),(1,4,5),(2,3,-3),(2,5,2),(3,1,2),(3,2,3),(3,3,4),(4,4,2),(5,1,3),(5,2,-1) \ No newline at end of file diff --git a/Dev-C++/ExerciseBook/05.25/05.25.cpp b/Dev-C++/ExerciseBook/05.25/05.25.cpp new file mode 100644 index 0000000..9851d07 --- /dev/null +++ b/Dev-C++/ExerciseBook/05.25/05.25.cpp @@ -0,0 +1,79 @@ +#include +#include "Status.h" //**01 **// +#include "SMatrix.h" //**ϡ**// + +/* + * ϡӷAddSMatrix + */ +Status Algo_5_25(SMatrix P, SMatrix Q, SMatrix* R); + + +int main(int argc, char* argv[]) { + SMatrix M, N, Q; + + printf(" ϡ MN ...\n"); + CreateSMatrix(&M, "TestData_M.txt"); + CreateSMatrix(&N, "TestData_N.txt"); + printf(" M = \n"); + PrintSMatrix(M); + printf(" N = \n"); + PrintSMatrix(N); + + Algo_5_25(M, N, &Q); + printf("Q = M + N = \n"); + PrintSMatrix(Q); + + return 0; +} + + +/* + * ϡӷAddSMatrix + */ +Status Algo_5_25(SMatrix P, SMatrix Q, SMatrix* R) { + int i, j; + int p, q, r; + + if(P.mu != Q.mu || P.nu != Q.nu) { + printf("\n"); + return ERROR; + } + + // ʼRϢ + (*R).mu = P.mu; + (*R).nu = P.nu; + (*R).tu = 0; + memset((*R).V, 0, sizeof((*R).V)); + memset((*R).B, 0, sizeof((*R).B)); + + // ָPQRеV + p = q = r = 0; + + for(i = 0; i < P.mu; ++i) { + for(j = 0; j < P.nu; ++j) { + if(P.B[i][j] == 0 && Q.B[i][j] == 0) { + continue; + } else if(P.B[i][j] == 0 && Q.B[i][j] == 1) { + (*R).V[r++] = Q.V[q++]; + (*R).B[i][j] = 1; + } else if(P.B[i][j] == 1 && Q.B[i][j] == 0) { + (*R).V[r++] = P.V[p++]; + (*R).B[i][j] = 1; + + // PQзԪ + } else { + if((P.V[p] + Q.V[q])!=0) { + (*R).V[r++] = P.V[p] + Q.V[q]; + (*R).B[i][j] = 1; + } + + p++; + q++; + } + } + } + + (*R).tu = r; + + return OK; +} diff --git a/Dev-C++/ExerciseBook/05.25/05.25.dev b/Dev-C++/ExerciseBook/05.25/05.25.dev new file mode 100644 index 0000000..b40407a --- /dev/null +++ b/Dev-C++/ExerciseBook/05.25/05.25.dev @@ -0,0 +1,100 @@ +[Project] +FileName=05.25.dev +Name=05.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=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=05.25.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit2] +FileName=SMatrix.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit3] +FileName=SMatrix.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit4] +FileName=TestData_M.txt +Folder= +Compile=0 +Link=0 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit5] +FileName=TestData_N.txt +Folder= +Compile=0 +Link=0 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + diff --git a/Dev-C++/ExerciseBook/05.25/SMatrix.cpp b/Dev-C++/ExerciseBook/05.25/SMatrix.cpp new file mode 100644 index 0000000..aaef587 --- /dev/null +++ b/Dev-C++/ExerciseBook/05.25/SMatrix.cpp @@ -0,0 +1,48 @@ +/*====================== + * ϡϰ5.25 + =======================*/ + +#include "SMatrix.h" //**ϡ**// + +// ϡM +Status CreateSMatrix(SMatrix* M, char* path) { + FILE* fp; + int v, i, j; + + fp = fopen(path, "r"); + + ReadData(fp, "%d%d%d", &((*M).mu), &((*M).nu), &((*M).tu)); + + memset((*M).V, 0, sizeof((*M).V)); + memset((*M).B, 0, sizeof((*M).B)); + + for(v=0; v < (*M).tu; v++) { + // ȡԪϢԪشV + ReadData(fp, "%d%d%d", &i, &j, &((*M).V[v])); + + (*M).B[i-1][j-1] = 1; + } + + fclose(fp); + + return OK; +} + +// ϡM +void PrintSMatrix(SMatrix M) { + int v, i, j; + + v = 0; // Vα + + for(i = 1; i <= M.mu; i++) { + for(j = 1; j <= M.nu; j++) { + if(M.B[i-1][j-1] == 1) { + printf("%3d ", M.V[v++]); + } else { + printf("%3d ", M.B[i-1][j-1]); + } + } + + printf("\n"); + } +} diff --git a/Dev-C++/ExerciseBook/05.25/SMatrix.h b/Dev-C++/ExerciseBook/05.25/SMatrix.h new file mode 100644 index 0000000..6ad263d --- /dev/null +++ b/Dev-C++/ExerciseBook/05.25/SMatrix.h @@ -0,0 +1,32 @@ +/*====================== + * ϡϰ5.25 + =======================*/ + +#ifndef SMATRIX_H +#define SMATRIX_H + +#include +#include +#include +#include "Status.h" //**01 **// + +/* 궨 */ +#define Mu 20 // ֵΪ20 +#define Nu 20 // ֵΪ20 +#define MAXSIZE 400 // ԪֵΪ400 + +/* ϡͶ */ +typedef struct { + int V[MAXSIZE]; // 洢Ԫ + int B[Mu][Nu]; // ǾиλԪǷΪԪ + int mu, nu, tu; // Ԫ +} SMatrix; + + +// ϡM +Status CreateSMatrix(SMatrix* M, char* path); + +// ϡM +void PrintSMatrix(SMatrix M); + +#endif diff --git a/Dev-C++/ExerciseBook/05.25/TestData_M.txt b/Dev-C++/ExerciseBook/05.25/TestData_M.txt new file mode 100644 index 0000000..be25c94 --- /dev/null +++ b/Dev-C++/ExerciseBook/05.25/TestData_M.txt @@ -0,0 +1,4 @@ +5 +5 +Ԫ10 +Ԫ飺(1,2,1),(1,4,5),(2,3,-3),(2,5,2),(3,1,2),(3,2,3),(3,3,4),(4,4,2),(5,1,3),(5,2,-1) \ No newline at end of file diff --git a/Dev-C++/ExerciseBook/05.25/TestData_N.txt b/Dev-C++/ExerciseBook/05.25/TestData_N.txt new file mode 100644 index 0000000..7c940db --- /dev/null +++ b/Dev-C++/ExerciseBook/05.25/TestData_N.txt @@ -0,0 +1,4 @@ +5 +5 +Ԫ8 +Ԫ飺(1,1,-3)(1,3,2)(2,4,-1)(3,2,4)(4,1,6)(4,5,5)(5,1,3)(5,3,2) \ No newline at end of file diff --git a/Dev-C++/ExerciseBook/05.26/05.26.cpp b/Dev-C++/ExerciseBook/05.26/05.26.cpp new file mode 100644 index 0000000..a2146d0 --- /dev/null +++ b/Dev-C++/ExerciseBook/05.26/05.26.cpp @@ -0,0 +1,49 @@ +#include +#include "Status.h" //**01 **// +#include "CrossList.h" //**05 ͹**// + +/* + * Ԫʽʮ + */ +Status Algo_5_26(CrossList M); + + +int main(int argc, char* argv[]) { + CrossList M; + + printf("ʮ M...\n"); + CreateSMatrix(&M, "TestData_M.txt"); + printf("M = \n"); + PrintSMatrix(M); + + printf("Ԫʽ M...\n"); + printf(" ֵ\n"); + Algo_5_26(M); + + return 0; +} + + +/* + * Ԫʽʮ + */ +Status Algo_5_26(CrossList M) { + int i, j; + OLNode* p; + + if(M.tu==0) { + return ERROR; + } + + for(i = 1; i <= M.mu; ++i) { + p = M.rhead[i]; + for(j = 1; j <= M.nu; ++j) { + if(p && p->j == j) { + printf("(%2d %2d %3d)\n", i, j, p->e); + p = p->right; + } + } + } + + return OK; +} diff --git a/Dev-C++/ExerciseBook/05.26/05.26.dev b/Dev-C++/ExerciseBook/05.26/05.26.dev new file mode 100644 index 0000000..6d925d3 --- /dev/null +++ b/Dev-C++/ExerciseBook/05.26/05.26.dev @@ -0,0 +1,91 @@ +[Project] +FileName=05.26.dev +Name=05.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=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 + +[Unit2] +FileName=CrossList.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit1] +FileName=05.26.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit3] +FileName=CrossList.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit4] +FileName=TestData_M.txt +Folder= +Compile=0 +Link=0 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + diff --git a/Dev-C++/ExerciseBook/05.26/CrossList.cpp b/Dev-C++/ExerciseBook/05.26/CrossList.cpp new file mode 100644 index 0000000..07eb63d --- /dev/null +++ b/Dev-C++/ExerciseBook/05.26/CrossList.cpp @@ -0,0 +1,885 @@ +/*=================== + * ʮϡ + * + * 㷨: 5.4 + ====================*/ + +#include "CrossList.h" //**05 ͹**// + +/* + * 㷨5.4 + * + * ϡM + * + * + *ע + * + * ̲Ĭϴӿ̨ȡݡ + * Ϊ˷ԣÿжֶݣ + * ѡԤļpathжȡݡ + * + * Ҫӿ̨ȡݣpathΪNULLΪմ + * ҪļжȡݣҪpathдļϢ + */ +Status CreateSMatrix(CrossList* M, char* path) { + int i, j, k; + OLNode* p, * q; + FILE* fp; + int readFromConsole; // Ƿӿ̨ȡ + + // ûļ·Ϣӿ̨ȡ + readFromConsole = path == NULL || strcmp(path, "") == 0; + + if(readFromConsole) { + printf(""); + scanf("%d", &((*M).mu)); + printf(""); + scanf("%d", &((*M).nu)); + printf("Ԫظ"); + scanf("%d", &((*M).tu)); + printf("%dԪϢ\n", (*M).tu); + } else { + fp = fopen(path, "r"); + ReadData(fp, "%d%d%d", &((*M).mu), &((*M).nu), &((*M).tu)); + } + + // 0ŵԪã + (*M).rhead = (OLink*) malloc(((*M).mu + 1) * sizeof(OLink)); + if((*M).rhead == NULL) { + exit(OVERFLOW); + } + + // 0ŵԪã + (*M).chead = (OLink*) malloc(((*M).nu + 1) * sizeof(OLink)); + if((*M).chead == NULL) { + exit(OVERFLOW); + } + + // ʼΪNULL + for(k = 0; k <= (*M).mu; ++k) { + (*M).rhead[k] = NULL; + } + + // ʼΪNULL + for(k = 0; k <= (*M).nu; ++k) { + (*M).chead[k] = NULL; + } + + // ¼Ԫ + for(k = 1; k <= (*M).tu; ++k) { + // Ԫ + p = (OLNode*) malloc(sizeof(OLNode)); + if(p == NULL) { + exit(OVERFLOW); + } + + if(readFromConsole) { + printf("%2d飺", k); + scanf("%d%d%d", &i, &j, &(p->e)); + } else { + ReadData(fp, "%d%d%d", &i, &j, &(p->e)); + } + + p->i = i; // к + p->j = j; // к + p->right = p->down = NULL; + + /* + * ʼеIJ + */ + + // лûԪأԪؾλڸԪҲֱ࣬Ӳ + if((*M).rhead[i] == NULL || (*M).rhead[i]->j > j) { + // λбеIJλ + p->right = (*M).rhead[i]; + (*M).rhead[i] = p; + } else { + // ѰҲλõǰһλ + for(q = (*M).rhead[i]; (q->right) && (q->right->j < j); q = q->right) { + } + + if(q->j == p->j || ((q->right) && q->right->j == p->j)) { + printf("λѱռã\n"); + exit(ERROR); + } + + p->right = q->right; + q->right = p; + } + + /* + * ʼеIJ + */ + + // лûԪأԪؾλڸԪ²ֱ࣬Ӳ + if((*M).chead[j] == NULL || (*M).chead[j]->i > i) { + // λбеIJλ + p->down = (*M).chead[j]; + (*M).chead[j] = p; + } else { + // ѰҲλõǰһλ + for(q = (*M).chead[j]; (q->down) && (q->down->i < i); q = q->down) { + } + + if(q->i == p->i || ((q->down) && q->down->i == p->i)) { + printf("λѱռã\n"); + exit(ERROR); + } + + p->down = q->down; + q->down = p; + } + } + + if(!readFromConsole) { + fclose(fp); + } + + return OK; +} + +/* + * ϡ + */ +Status DestroySMatrix(CrossList* M) { + int i; + OLNode* p, * q; + + // ۴ӰлǰУֻҪһȥپͿ + for(i = 1; i <= (*M).mu; ++i) { + p = (*M).rhead[i]; + while(p != NULL) { + q = p; + p = p->right; + free(q); + } + } + + free((*M).rhead); + free((*M).chead); + + (*M).rhead = (*M).chead = NULL; + (*M).mu = (*M).nu = (*M).tu = 0; + + return OK; +} + +/* + * + * + * һ¾Tþ˴ӾMаݡ + */ +Status CopySMatrix(CrossList M, CrossList* T) { + int k; + OLNode* p, * q, * r, * l; + + if(T == NULL) { + return ERROR; + } + + // Ϣ + (*T).mu = M.mu; + (*T).nu = M.nu; + (*T).tu = M.tu; + + // 0ŵԪã + (*T).rhead = (OLink*) malloc(((*T).mu + 1) * sizeof(OLink)); + if((*T).rhead == NULL) { + exit(OVERFLOW); + } + + // 0ŵԪã + (*T).chead = (OLink*) malloc(((*T).nu + 1) * sizeof(OLink)); + if((*T).chead == NULL) { + exit(OVERFLOW); + } + + // ʼΪNULL + for(k = 0; k <= (*T).mu; ++k) { //ʼͷָΪ + (*T).rhead[k] = NULL; + } + + // ʼΪNULL + for(k = 0; k <= (*T).nu; ++k) { + (*T).chead[k] = NULL; + } + + // ɨ裬θƷԪ + for(k = 1; k <= M.mu; ++k) { + q = M.rhead[k]; + + // ǰûԪأֱ + if(q == NULL) { + continue; + } + + r = NULL; + + while(q != NULL) { + // Ԫ + p = (OLNode*) malloc(sizeof(OLNode)); + if(p == NULL) { + exit(OVERFLOW); + } + + // Ϊ㸳ֵ + p->i = q->i; + p->j = q->j; + p->e = q->e; + p->right = p->down = NULL; + + /* + * ʼеIJ + */ + + if(r == NULL) { + (*T).rhead[q->i] = p; + } else { + r->right = p; + } + + // rָǰ²Ľ + r = p; + + /* + * ʼеIJ + */ + + // ѰҲλ + if((*T).chead[q->j] == NULL || (*T).chead[q->j]->i > q->i) { + r->down = (*T).chead[q->j]; + (*T).chead[q->j] = r; + } else { + // ѰҲλõǰһλ + for(l = (*T).chead[q->j]; (l->down) && (l->down->i < q->i); l = l->down) { + } + r->down = l->down; + l->down = r; + } + + q = q->right; + } + } + + return OK; +} + +/* + * ӷ + * + * Q = M + N + */ +Status AddSMatrix(CrossList M, CrossList N, CrossList* Q) { + int i; + OLNode* pm, * pn, * p, * r, * l; + + if(M.mu != N.mu || M.nu != N.nu) { + printf("\n"); + return ERROR; + } + + // ʼQϢ + Q->mu = M.mu; + Q->nu = M.nu; + Q->tu = 0; + + // 0ŵԪã + Q->rhead = (OLink*) malloc((Q->mu + 1) * sizeof(OLink)); + if(!Q->rhead) { + exit(OVERFLOW); + } + + // 0ŵԪã + Q->chead = (OLink*) malloc((Q->nu + 1) * sizeof(OLink)); + if(!Q->chead) { + exit(OVERFLOW); + } + + // ʼΪNULL + for(i = 0; i <= Q->mu; ++i) { + Q->rhead[i] = NULL; + } + + // ʼΪNULL + for(i = 0; i <= Q->nu; ++i) { + Q->chead[i] = NULL; + } + + // ӵһ± + for(i = 1; i <= M.mu; ++i) { + pm = M.rhead[i]; + pn = N.rhead[i]; + + // MNĵǰоδķԪ + while(pm != NULL && pn != NULL) { + // + if(pm->j == pn->j && pm->e + pn->e == 0) { + pm = pm->right; + pn = pn->right; + continue; + } + + // + p = (OLNode*) malloc(sizeof(OLNode)); + if(!p) { + exit(OVERFLOW); + } + + // MеԪ±С + if(pm->j < pn->j) { + p->i = pm->i; + p->j = pm->j; + p->e = pm->e; + pm = pm->right; + + // NеԪ±С + } else if(pm->j > pn->j) { + p->i = pn->i; + p->j = pn->j; + p->e = pn->e; + pn = pn->right; + + // MNеԪ±һ£Ҫмӷ + } else { + p->i = pm->i; + p->j = pm->j; + p->e = pm->e + pn->e; + pm = pm->right; + pn = pn->right; + } + + p->right = p->down = NULL; + + Q->tu++; // QзԪһ + + /* + * ʼеIJ + */ + + if(Q->rhead[p->i] == NULL) { + Q->rhead[p->i] = p; + } else { + r->right = p; + } + + // rָǰ²Ľ + r = p; + + /* + * ʼеIJ + */ + + // ѰҲλ + if(Q->chead[p->j] == NULL || Q->chead[p->j]->i > p->i) { + r->down = Q->chead[p->j]; + Q->chead[p->j] = r; + } else { + // ѰҲλõǰһλ + for(l = Q->chead[p->j]; (l->down) && (l->down->i < p->i); l = l->down) { + } + r->down = l->down; + l->down = r; + } + } + + // MĵǰδķԪ + while(pm != NULL) { + p = (OLNode*) malloc(sizeof(OLNode)); + if(p == NULL) { + exit(OVERFLOW); + } + p->i = pm->i; + p->j = pm->j; + p->e = pm->e; + p->right = p->down = NULL; + + Q->tu++; // QзԪһ + + if(Q->rhead[p->i] == NULL) { + Q->rhead[p->i] = p; + } else { + r->right = p; + } + + // rָǰ²Ľ + r = p; + + // ѰҲλ + if(Q->chead[p->j] == NULL || Q->chead[p->j]->i > p->i) { + r->down = Q->chead[p->j]; + Q->chead[p->j] = r; + } else { + // ѰҲλõǰһλ + for(l = Q->chead[p->j]; (l->down) && (l->down->i < p->i); l = l->down) { + } + r->down = l->down; + l->down = r; + } + + pm = pm->right; + } + + // NĵǰδķԪ + while(pn != NULL) { + p = (OLNode*) malloc(sizeof(OLNode)); + if(p == NULL) { + exit(OVERFLOW); + } + p->i = pn->i; + p->j = pn->j; + p->e = pn->e; + p->right = p->down = NULL; + + Q->tu++; // QзԪһ + + if(Q->rhead[p->i] == NULL) { + Q->rhead[p->i] = p; + } else { + r->right = p; + } + + // rָǰ²Ľ + r = p; + + // ѰҲλ + if(Q->chead[p->j] == NULL || Q->chead[p->j]->i > p->i) { + r->down = Q->chead[p->j]; + Q->chead[p->j] = r; + } else { + // ѰҲλõǰһλ + for(l = Q->chead[p->j]; (l->down) && (l->down->i < p->i); l = l->down) { + } + r->down = l->down; + l->down = r; + } + + pn = pn->right; + } + } + + return OK; +} + +/* + * + * + * Q = M - N + */ +Status SubSMatrix(CrossList M, CrossList N, CrossList* Q) { + int i; + OLNode* pm, * pn, * p, * r, * l; + + if(M.mu != N.mu || M.nu != N.nu) { + printf("\n"); + return ERROR; + } + + // ʼQϢ + Q->mu = M.mu; + Q->nu = M.nu; + Q->tu = 0; + + // 0ŵԪã + Q->rhead = (OLink*) malloc((Q->mu + 1) * sizeof(OLink)); + if(!Q->rhead) { + exit(OVERFLOW); + } + + // 0ŵԪã + Q->chead = (OLink*) malloc((Q->nu + 1) * sizeof(OLink)); + if(!Q->chead) { + exit(OVERFLOW); + } + + // ʼΪNULL + for(i = 0; i <= Q->mu; ++i) { + Q->rhead[i] = NULL; + } + + // ʼΪNULL + for(i = 0; i <= Q->nu; ++i) { + Q->chead[i] = NULL; + } + + // ӵһ± + for(i = 1; i <= M.mu; ++i) { + pm = M.rhead[i]; + pn = N.rhead[i]; + + // MNĵǰоδķԪ + while(pm != NULL && pn != NULL) { + // + if(pm->j == pn->j && pm->e - pn->e == 0) { + pm = pm->right; + pn = pn->right; + continue; + } + + // + p = (OLNode*) malloc(sizeof(OLNode)); + if(!p) { + exit(OVERFLOW); + } + + // MеԪ±С + if(pm->j < pn->j) { + p->i = pm->i; + p->j = pm->j; + p->e = pm->e; + pm = pm->right; + + // NеԪ±С + } else if(pm->j > pn->j) { + p->i = pn->i; + p->j = pn->j; + p->e = -pn->e; // Ӹ + pn = pn->right; + + // MNеԪ±һ£Ҫм + } else { + p->i = pm->i; + p->j = pm->j; + p->e = pm->e - pn->e; + pm = pm->right; + pn = pn->right; + } + + p->right = p->down = NULL; + + Q->tu++; // QзԪһ + + /* + * ʼеIJ + */ + + if(Q->rhead[p->i] == NULL) { + Q->rhead[p->i] = p; + } else { + r->right = p; + } + + // rָǰ²Ľ + r = p; + + /* + * ʼеIJ + */ + + // ѰҲλ + if(Q->chead[p->j] == NULL || Q->chead[p->j]->i > p->i) { + r->down = Q->chead[p->j]; + Q->chead[p->j] = r; + } else { + //ѰҲλõǰһλ + for(l = Q->chead[p->j]; (l->down) && (l->down->i < p->i); l = l->down) { + } + r->down = l->down; + l->down = r; + } + } + + // MĵǰδķԪ + while(pm != NULL) { + p = (OLNode*) malloc(sizeof(OLNode)); + if(!p) { + exit(OVERFLOW); + } + p->i = pm->i; + p->j = pm->j; + p->e = pm->e; + p->right = p->down = NULL; + + Q->tu++; // QзԪһ + + if(Q->rhead[p->i] == NULL) { + Q->rhead[p->i] = p; + } else { + r->right = p; + } + + // rָǰ²Ľ + r = p; + + // ѰҲλ + if(Q->chead[p->j] == NULL || Q->chead[p->j]->i > p->i) { + r->down = Q->chead[p->j]; + Q->chead[p->j] = r; + } else { + // ѰҲλõǰһλ + for(l = Q->chead[p->j]; (l->down) && (l->down->i < p->i); l = l->down) { + } + r->down = l->down; + l->down = r; + } + + pm = pm->right; + } + + // NĵǰδķԪ + while(pn != NULL) { + p = (OLNode*) malloc(sizeof(OLNode)); + if(!p) { + exit(OVERFLOW); + } + p->i = pn->i; + p->j = pn->j; + p->e = -pn->e; // Ӹ + p->right = p->down = NULL; + + Q->tu++; // QзԪһ + + if(Q->rhead[p->i] == NULL) { + Q->rhead[p->i] = p; + } else { + r->right = p; + } + + // rָǰ²Ľ + r = p; + + // ѰҲλ + if(Q->chead[p->j] == NULL || Q->chead[p->j]->i > p->i) { + r->down = Q->chead[p->j]; + Q->chead[p->j] = r; + } else { + // ѰҲλõǰһλ + for(l = Q->chead[p->j]; (l->down) && (l->down->i < p->i); l = l->down) { + } + r->down = l->down; + l->down = r; + } + + pn = pn->right; + } + } + + return OK; +} + +/* + * ˷ + * + * Q = M * N + */ +Status MultSMatrix(CrossList M, CrossList N, CrossList* Q) { + int m_row, n_col, i; + ElemType e; + OLNode* pm, * pn, * p, * r, * l; + + // MҪN + if(M.nu != N.mu) { + printf("\n"); + return ERROR; + } + + // ʼQϢ + Q->mu = M.mu; + Q->nu = N.nu; + Q->tu = 0; + + // 0ŵԪã + Q->rhead = (OLink*) malloc((Q->mu + 1) * sizeof(OLink)); + if(!Q->rhead) { + exit(OVERFLOW); + } + + // 0ŵԪã + Q->chead = (OLink*) malloc((Q->nu + 1) * sizeof(OLink)); + if(!Q->chead) { + exit(OVERFLOW); + } + + // ʼΪNULL + for(i = 0; i <= Q->mu; ++i) { + Q->rhead[i] = NULL; + } + + // ʼΪNULL + for(i = 0; i <= Q->nu; ++i) { + Q->chead[i] = NULL; + } + + // QǷ + if(M.tu * N.tu) { + for(m_row = 1; m_row <= M.mu; ++m_row) { + for(n_col = 1; n_col <= N.nu; ++n_col) { + pm = M.rhead[m_row]; + pn = N.chead[n_col]; + + e = 0; + + // MN + while(pm && pn) { + if(pm->j < pn->i) { + pm = pm->right; + } else if(pm->j > pn->i) { + pn = pn->down; + } else { + e += pm->e * pn->e; + pm = pm->right; + pn = pn->down; + } + } + + if(e == 0) { + continue; + } + + p = (OLNode*) malloc(sizeof(OLNode)); + if(!p) { + exit(OVERFLOW); + } + + // Ϊ㸳ֵ + p->i = M.rhead[m_row]->i; + p->j = N.chead[n_col]->j; + p->e = e; + p->right = p->down = NULL; + + Q->tu++; // QзԪһ + + if(Q->rhead[p->i] == NULL) { + Q->rhead[p->i] = p; + } else { + r->right = p; + } + + // rָǰ²Ľ + r = p; + + // ѰҲλ + if(Q->chead[p->j] == NULL || Q->chead[p->j]->i > p->i) { + r->down = Q->chead[p->j]; + Q->chead[p->j] = r; + } else { + // ѰҲλõǰһλ + for(l = Q->chead[p->j]; (l->down) && (l->down->i < p->i); l = l->down) { + } + + r->down = l->down; + l->down = r; + } + } + } + } + + return OK; +} + +/* + * ת + */ +Status TransposeSMatrix(CrossList M, CrossList* T) { + int i; + OLNode* p, * q, * r, * l; + + // ʼQϢ + (*T).mu = M.nu; + (*T).nu = M.mu; + (*T).tu = M.tu; + + // 0ŵԪã + (*T).rhead = (OLink*) malloc(((*T).mu + 1) * sizeof(OLink)); + if(!(*T).rhead) { + exit(OVERFLOW); + } + + // 0ŵԪã + (*T).chead = (OLink*) malloc(((*T).nu + 1) * sizeof(OLink)); + if(!(*T).chead) { + exit(OVERFLOW); + } + + // ʼΪNULL + for(i = 0; i <= (*T).mu; ++i) { + (*T).rhead[i] = NULL; + } + + // ʼΪNULL + for(i = 0; i <= (*T).nu; ++i) { + (*T).chead[i] = NULL; + } + + // + if(!(*T).tu) { + return OK; + } + + // ɨ + for(i = 1; i <= M.nu; ++i) { + q = M.chead[i]; + + // ǰûԪأֱ + if(q == NULL) { + continue; + } + + while(q != NULL) { + // Ԫ + p = (OLNode*) malloc(sizeof(OLNode)); + if(!p) { + exit(OVERFLOW); + } + + // Ϊ㸳ֵбУб + p->i = q->j; + p->j = q->i; + p->e = q->e; + p->right = p->down = NULL; + + /* + * ʼеIJ + */ + + if((*T).rhead[p->i] == NULL) { + (*T).rhead[p->i] = p; + } else { + r->right = p; + } + + // rָǰ²Ľ + r = p; + + /* + * ʼеIJ + */ + + // ѰҲλ + if((*T).chead[p->j] == NULL || (*T).chead[p->j]->i > p->i) { + r->down = (*T).chead[p->j]; + (*T).chead[p->j] = r; + } else { + // ѰҲλõǰһλ + for(l = (*T).chead[p->j]; (l->down) && (l->down->i < p->i); l = l->down) { + } + r->down = l->down; + l->down = r; + } + + q = q->down; + } + } + + return OK; +} + +/* + * + */ +void PrintSMatrix(CrossList M) { + int i, j; + OLNode* p; + + for(i = 1; i <= M.mu; ++i) { + p = M.rhead[i]; + for(j = 1; j <= M.nu; ++j) { + if(p && p->j == j) { + printf("%3d ", p->e); + p = p->right; + } else { + printf("%3d ", 0); + } + } + printf("\n"); + } +} diff --git a/Dev-C++/ExerciseBook/05.26/CrossList.h b/Dev-C++/ExerciseBook/05.26/CrossList.h new file mode 100644 index 0000000..c774280 --- /dev/null +++ b/Dev-C++/ExerciseBook/05.26/CrossList.h @@ -0,0 +1,94 @@ +/*=================== + * ʮϡ + * + * 㷨: 5.4 + ====================*/ + +#ifndef CROSSLIST_H +#define CROSSLIST_H + +#include +#include // ṩmallocreallocfreeexitԭ +#include // ṩ strstr ԭ +#include "Status.h" //**01 **// + +/* ʮԪ */ +typedef int ElemType; + +/* ԪͶ */ +typedef struct OLNode { + int i, j; // ÷Ԫ±± + ElemType e; + struct OLNode* right; // ÷Ԫڵбĺ + struct OLNode* down; // ÷Ԫڵбĺ +} OLNode, * OLink; + +/* ʮͶ */ +typedef struct { + OLink* rhead; // ͷָ + OLink* chead; // ͷָ + int mu, nu, tu; // ͷԪ +} CrossList; + + +/* + * 㷨5.4 + * + * ϡM + * + * + *ע + * + * ̲Ĭϴӿ̨ȡݡ + * Ϊ˷ԣÿжֶݣ + * ѡԤļpathжȡݡ + * + * Ҫӿ̨ȡݣpathΪNULLΪմ + * ҪļжȡݣҪpathдļϢ + */ +Status CreateSMatrix(CrossList* M, char* path); + +/* + * ϡ + */ +Status DestroySMatrix(CrossList* M); + +/* + * + * + * һ¾Tþ˴ӾMаݡ + */ +Status CopySMatrix(CrossList M, CrossList* T); + +/* + * ӷ + * + * Q = M + N + */ +Status AddSMatrix(CrossList M, CrossList N, CrossList* Q); + +/* + * + * + * Q = M - N + */ +Status SubSMatrix(CrossList M, CrossList N, CrossList* Q); + +/* + * ˷ + * + * Q = M * N + */ +Status MultSMatrix(CrossList M, CrossList N, CrossList* Q); + +/* + * ת + */ +Status TransposeSMatrix(CrossList M, CrossList* T); + +/* + * + */ +void PrintSMatrix(CrossList M); + +#endif diff --git a/Dev-C++/ExerciseBook/05.26/TestData_M.txt b/Dev-C++/ExerciseBook/05.26/TestData_M.txt new file mode 100644 index 0000000..be25c94 --- /dev/null +++ b/Dev-C++/ExerciseBook/05.26/TestData_M.txt @@ -0,0 +1,4 @@ +5 +5 +Ԫ10 +Ԫ飺(1,2,1),(1,4,5),(2,3,-3),(2,5,2),(3,1,2),(3,2,3),(3,3,4),(4,4,2),(5,1,3),(5,2,-1) \ No newline at end of file diff --git a/Dev-C++/ExerciseBook/05.27/05.27.cpp b/Dev-C++/ExerciseBook/05.27/05.27.cpp new file mode 100644 index 0000000..c3015d0 --- /dev/null +++ b/Dev-C++/ExerciseBook/05.27/05.27.cpp @@ -0,0 +1,41 @@ +#include +#include "Status.h" //**01 **// +#include "CrossList.h" //**05 ͹**// + +/* + * ϡӷAddSMatrix + * + *ע + * úCrossListļж + */ +Status Algo_5_27(CrossList M, CrossList N, CrossList* Q); + + +int main(int argc, char* argv[]) { + CrossList M, N, Q; + + printf(" ϡ MN ...\n"); + CreateSMatrix(&M, "TestData_M.txt"); + CreateSMatrix(&N, "TestData_N.txt"); + printf(" M = \n"); + PrintSMatrix(M); + printf(" N = \n"); + PrintSMatrix(N); + + Algo_5_27(M, N, &Q); + printf(" Q = M + N = \n"); + PrintSMatrix(Q); + + return 0; +} + + +/* + * ϡӷAddSMatrix + * + *ע + * úCrossListļж + */ +Status Algo_5_27(CrossList M, CrossList N, CrossList* Q) { + return AddSMatrix(M, N, Q); +} diff --git a/Dev-C++/ExerciseBook/05.27/05.27.dev b/Dev-C++/ExerciseBook/05.27/05.27.dev new file mode 100644 index 0000000..2845795 --- /dev/null +++ b/Dev-C++/ExerciseBook/05.27/05.27.dev @@ -0,0 +1,100 @@ +[Project] +FileName=05.27.dev +Name=05.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=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 + +[Unit2] +FileName=CrossList.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit1] +FileName=05.27.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit3] +FileName=CrossList.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit4] +FileName=TestData_M.txt +Folder= +Compile=0 +Link=0 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit5] +FileName=TestData_N.txt +Folder= +Compile=0 +Link=0 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + diff --git a/Dev-C++/ExerciseBook/05.27/CrossList.cpp b/Dev-C++/ExerciseBook/05.27/CrossList.cpp new file mode 100644 index 0000000..07eb63d --- /dev/null +++ b/Dev-C++/ExerciseBook/05.27/CrossList.cpp @@ -0,0 +1,885 @@ +/*=================== + * ʮϡ + * + * 㷨: 5.4 + ====================*/ + +#include "CrossList.h" //**05 ͹**// + +/* + * 㷨5.4 + * + * ϡM + * + * + *ע + * + * ̲Ĭϴӿ̨ȡݡ + * Ϊ˷ԣÿжֶݣ + * ѡԤļpathжȡݡ + * + * Ҫӿ̨ȡݣpathΪNULLΪմ + * ҪļжȡݣҪpathдļϢ + */ +Status CreateSMatrix(CrossList* M, char* path) { + int i, j, k; + OLNode* p, * q; + FILE* fp; + int readFromConsole; // Ƿӿ̨ȡ + + // ûļ·Ϣӿ̨ȡ + readFromConsole = path == NULL || strcmp(path, "") == 0; + + if(readFromConsole) { + printf(""); + scanf("%d", &((*M).mu)); + printf(""); + scanf("%d", &((*M).nu)); + printf("Ԫظ"); + scanf("%d", &((*M).tu)); + printf("%dԪϢ\n", (*M).tu); + } else { + fp = fopen(path, "r"); + ReadData(fp, "%d%d%d", &((*M).mu), &((*M).nu), &((*M).tu)); + } + + // 0ŵԪã + (*M).rhead = (OLink*) malloc(((*M).mu + 1) * sizeof(OLink)); + if((*M).rhead == NULL) { + exit(OVERFLOW); + } + + // 0ŵԪã + (*M).chead = (OLink*) malloc(((*M).nu + 1) * sizeof(OLink)); + if((*M).chead == NULL) { + exit(OVERFLOW); + } + + // ʼΪNULL + for(k = 0; k <= (*M).mu; ++k) { + (*M).rhead[k] = NULL; + } + + // ʼΪNULL + for(k = 0; k <= (*M).nu; ++k) { + (*M).chead[k] = NULL; + } + + // ¼Ԫ + for(k = 1; k <= (*M).tu; ++k) { + // Ԫ + p = (OLNode*) malloc(sizeof(OLNode)); + if(p == NULL) { + exit(OVERFLOW); + } + + if(readFromConsole) { + printf("%2d飺", k); + scanf("%d%d%d", &i, &j, &(p->e)); + } else { + ReadData(fp, "%d%d%d", &i, &j, &(p->e)); + } + + p->i = i; // к + p->j = j; // к + p->right = p->down = NULL; + + /* + * ʼеIJ + */ + + // лûԪأԪؾλڸԪҲֱ࣬Ӳ + if((*M).rhead[i] == NULL || (*M).rhead[i]->j > j) { + // λбеIJλ + p->right = (*M).rhead[i]; + (*M).rhead[i] = p; + } else { + // ѰҲλõǰһλ + for(q = (*M).rhead[i]; (q->right) && (q->right->j < j); q = q->right) { + } + + if(q->j == p->j || ((q->right) && q->right->j == p->j)) { + printf("λѱռã\n"); + exit(ERROR); + } + + p->right = q->right; + q->right = p; + } + + /* + * ʼеIJ + */ + + // лûԪأԪؾλڸԪ²ֱ࣬Ӳ + if((*M).chead[j] == NULL || (*M).chead[j]->i > i) { + // λбеIJλ + p->down = (*M).chead[j]; + (*M).chead[j] = p; + } else { + // ѰҲλõǰһλ + for(q = (*M).chead[j]; (q->down) && (q->down->i < i); q = q->down) { + } + + if(q->i == p->i || ((q->down) && q->down->i == p->i)) { + printf("λѱռã\n"); + exit(ERROR); + } + + p->down = q->down; + q->down = p; + } + } + + if(!readFromConsole) { + fclose(fp); + } + + return OK; +} + +/* + * ϡ + */ +Status DestroySMatrix(CrossList* M) { + int i; + OLNode* p, * q; + + // ۴ӰлǰУֻҪһȥپͿ + for(i = 1; i <= (*M).mu; ++i) { + p = (*M).rhead[i]; + while(p != NULL) { + q = p; + p = p->right; + free(q); + } + } + + free((*M).rhead); + free((*M).chead); + + (*M).rhead = (*M).chead = NULL; + (*M).mu = (*M).nu = (*M).tu = 0; + + return OK; +} + +/* + * + * + * һ¾Tþ˴ӾMаݡ + */ +Status CopySMatrix(CrossList M, CrossList* T) { + int k; + OLNode* p, * q, * r, * l; + + if(T == NULL) { + return ERROR; + } + + // Ϣ + (*T).mu = M.mu; + (*T).nu = M.nu; + (*T).tu = M.tu; + + // 0ŵԪã + (*T).rhead = (OLink*) malloc(((*T).mu + 1) * sizeof(OLink)); + if((*T).rhead == NULL) { + exit(OVERFLOW); + } + + // 0ŵԪã + (*T).chead = (OLink*) malloc(((*T).nu + 1) * sizeof(OLink)); + if((*T).chead == NULL) { + exit(OVERFLOW); + } + + // ʼΪNULL + for(k = 0; k <= (*T).mu; ++k) { //ʼͷָΪ + (*T).rhead[k] = NULL; + } + + // ʼΪNULL + for(k = 0; k <= (*T).nu; ++k) { + (*T).chead[k] = NULL; + } + + // ɨ裬θƷԪ + for(k = 1; k <= M.mu; ++k) { + q = M.rhead[k]; + + // ǰûԪأֱ + if(q == NULL) { + continue; + } + + r = NULL; + + while(q != NULL) { + // Ԫ + p = (OLNode*) malloc(sizeof(OLNode)); + if(p == NULL) { + exit(OVERFLOW); + } + + // Ϊ㸳ֵ + p->i = q->i; + p->j = q->j; + p->e = q->e; + p->right = p->down = NULL; + + /* + * ʼеIJ + */ + + if(r == NULL) { + (*T).rhead[q->i] = p; + } else { + r->right = p; + } + + // rָǰ²Ľ + r = p; + + /* + * ʼеIJ + */ + + // ѰҲλ + if((*T).chead[q->j] == NULL || (*T).chead[q->j]->i > q->i) { + r->down = (*T).chead[q->j]; + (*T).chead[q->j] = r; + } else { + // ѰҲλõǰһλ + for(l = (*T).chead[q->j]; (l->down) && (l->down->i < q->i); l = l->down) { + } + r->down = l->down; + l->down = r; + } + + q = q->right; + } + } + + return OK; +} + +/* + * ӷ + * + * Q = M + N + */ +Status AddSMatrix(CrossList M, CrossList N, CrossList* Q) { + int i; + OLNode* pm, * pn, * p, * r, * l; + + if(M.mu != N.mu || M.nu != N.nu) { + printf("\n"); + return ERROR; + } + + // ʼQϢ + Q->mu = M.mu; + Q->nu = M.nu; + Q->tu = 0; + + // 0ŵԪã + Q->rhead = (OLink*) malloc((Q->mu + 1) * sizeof(OLink)); + if(!Q->rhead) { + exit(OVERFLOW); + } + + // 0ŵԪã + Q->chead = (OLink*) malloc((Q->nu + 1) * sizeof(OLink)); + if(!Q->chead) { + exit(OVERFLOW); + } + + // ʼΪNULL + for(i = 0; i <= Q->mu; ++i) { + Q->rhead[i] = NULL; + } + + // ʼΪNULL + for(i = 0; i <= Q->nu; ++i) { + Q->chead[i] = NULL; + } + + // ӵһ± + for(i = 1; i <= M.mu; ++i) { + pm = M.rhead[i]; + pn = N.rhead[i]; + + // MNĵǰоδķԪ + while(pm != NULL && pn != NULL) { + // + if(pm->j == pn->j && pm->e + pn->e == 0) { + pm = pm->right; + pn = pn->right; + continue; + } + + // + p = (OLNode*) malloc(sizeof(OLNode)); + if(!p) { + exit(OVERFLOW); + } + + // MеԪ±С + if(pm->j < pn->j) { + p->i = pm->i; + p->j = pm->j; + p->e = pm->e; + pm = pm->right; + + // NеԪ±С + } else if(pm->j > pn->j) { + p->i = pn->i; + p->j = pn->j; + p->e = pn->e; + pn = pn->right; + + // MNеԪ±һ£Ҫмӷ + } else { + p->i = pm->i; + p->j = pm->j; + p->e = pm->e + pn->e; + pm = pm->right; + pn = pn->right; + } + + p->right = p->down = NULL; + + Q->tu++; // QзԪһ + + /* + * ʼеIJ + */ + + if(Q->rhead[p->i] == NULL) { + Q->rhead[p->i] = p; + } else { + r->right = p; + } + + // rָǰ²Ľ + r = p; + + /* + * ʼеIJ + */ + + // ѰҲλ + if(Q->chead[p->j] == NULL || Q->chead[p->j]->i > p->i) { + r->down = Q->chead[p->j]; + Q->chead[p->j] = r; + } else { + // ѰҲλõǰһλ + for(l = Q->chead[p->j]; (l->down) && (l->down->i < p->i); l = l->down) { + } + r->down = l->down; + l->down = r; + } + } + + // MĵǰδķԪ + while(pm != NULL) { + p = (OLNode*) malloc(sizeof(OLNode)); + if(p == NULL) { + exit(OVERFLOW); + } + p->i = pm->i; + p->j = pm->j; + p->e = pm->e; + p->right = p->down = NULL; + + Q->tu++; // QзԪһ + + if(Q->rhead[p->i] == NULL) { + Q->rhead[p->i] = p; + } else { + r->right = p; + } + + // rָǰ²Ľ + r = p; + + // ѰҲλ + if(Q->chead[p->j] == NULL || Q->chead[p->j]->i > p->i) { + r->down = Q->chead[p->j]; + Q->chead[p->j] = r; + } else { + // ѰҲλõǰһλ + for(l = Q->chead[p->j]; (l->down) && (l->down->i < p->i); l = l->down) { + } + r->down = l->down; + l->down = r; + } + + pm = pm->right; + } + + // NĵǰδķԪ + while(pn != NULL) { + p = (OLNode*) malloc(sizeof(OLNode)); + if(p == NULL) { + exit(OVERFLOW); + } + p->i = pn->i; + p->j = pn->j; + p->e = pn->e; + p->right = p->down = NULL; + + Q->tu++; // QзԪһ + + if(Q->rhead[p->i] == NULL) { + Q->rhead[p->i] = p; + } else { + r->right = p; + } + + // rָǰ²Ľ + r = p; + + // ѰҲλ + if(Q->chead[p->j] == NULL || Q->chead[p->j]->i > p->i) { + r->down = Q->chead[p->j]; + Q->chead[p->j] = r; + } else { + // ѰҲλõǰһλ + for(l = Q->chead[p->j]; (l->down) && (l->down->i < p->i); l = l->down) { + } + r->down = l->down; + l->down = r; + } + + pn = pn->right; + } + } + + return OK; +} + +/* + * + * + * Q = M - N + */ +Status SubSMatrix(CrossList M, CrossList N, CrossList* Q) { + int i; + OLNode* pm, * pn, * p, * r, * l; + + if(M.mu != N.mu || M.nu != N.nu) { + printf("\n"); + return ERROR; + } + + // ʼQϢ + Q->mu = M.mu; + Q->nu = M.nu; + Q->tu = 0; + + // 0ŵԪã + Q->rhead = (OLink*) malloc((Q->mu + 1) * sizeof(OLink)); + if(!Q->rhead) { + exit(OVERFLOW); + } + + // 0ŵԪã + Q->chead = (OLink*) malloc((Q->nu + 1) * sizeof(OLink)); + if(!Q->chead) { + exit(OVERFLOW); + } + + // ʼΪNULL + for(i = 0; i <= Q->mu; ++i) { + Q->rhead[i] = NULL; + } + + // ʼΪNULL + for(i = 0; i <= Q->nu; ++i) { + Q->chead[i] = NULL; + } + + // ӵһ± + for(i = 1; i <= M.mu; ++i) { + pm = M.rhead[i]; + pn = N.rhead[i]; + + // MNĵǰоδķԪ + while(pm != NULL && pn != NULL) { + // + if(pm->j == pn->j && pm->e - pn->e == 0) { + pm = pm->right; + pn = pn->right; + continue; + } + + // + p = (OLNode*) malloc(sizeof(OLNode)); + if(!p) { + exit(OVERFLOW); + } + + // MеԪ±С + if(pm->j < pn->j) { + p->i = pm->i; + p->j = pm->j; + p->e = pm->e; + pm = pm->right; + + // NеԪ±С + } else if(pm->j > pn->j) { + p->i = pn->i; + p->j = pn->j; + p->e = -pn->e; // Ӹ + pn = pn->right; + + // MNеԪ±һ£Ҫм + } else { + p->i = pm->i; + p->j = pm->j; + p->e = pm->e - pn->e; + pm = pm->right; + pn = pn->right; + } + + p->right = p->down = NULL; + + Q->tu++; // QзԪһ + + /* + * ʼеIJ + */ + + if(Q->rhead[p->i] == NULL) { + Q->rhead[p->i] = p; + } else { + r->right = p; + } + + // rָǰ²Ľ + r = p; + + /* + * ʼеIJ + */ + + // ѰҲλ + if(Q->chead[p->j] == NULL || Q->chead[p->j]->i > p->i) { + r->down = Q->chead[p->j]; + Q->chead[p->j] = r; + } else { + //ѰҲλõǰһλ + for(l = Q->chead[p->j]; (l->down) && (l->down->i < p->i); l = l->down) { + } + r->down = l->down; + l->down = r; + } + } + + // MĵǰδķԪ + while(pm != NULL) { + p = (OLNode*) malloc(sizeof(OLNode)); + if(!p) { + exit(OVERFLOW); + } + p->i = pm->i; + p->j = pm->j; + p->e = pm->e; + p->right = p->down = NULL; + + Q->tu++; // QзԪһ + + if(Q->rhead[p->i] == NULL) { + Q->rhead[p->i] = p; + } else { + r->right = p; + } + + // rָǰ²Ľ + r = p; + + // ѰҲλ + if(Q->chead[p->j] == NULL || Q->chead[p->j]->i > p->i) { + r->down = Q->chead[p->j]; + Q->chead[p->j] = r; + } else { + // ѰҲλõǰһλ + for(l = Q->chead[p->j]; (l->down) && (l->down->i < p->i); l = l->down) { + } + r->down = l->down; + l->down = r; + } + + pm = pm->right; + } + + // NĵǰδķԪ + while(pn != NULL) { + p = (OLNode*) malloc(sizeof(OLNode)); + if(!p) { + exit(OVERFLOW); + } + p->i = pn->i; + p->j = pn->j; + p->e = -pn->e; // Ӹ + p->right = p->down = NULL; + + Q->tu++; // QзԪһ + + if(Q->rhead[p->i] == NULL) { + Q->rhead[p->i] = p; + } else { + r->right = p; + } + + // rָǰ²Ľ + r = p; + + // ѰҲλ + if(Q->chead[p->j] == NULL || Q->chead[p->j]->i > p->i) { + r->down = Q->chead[p->j]; + Q->chead[p->j] = r; + } else { + // ѰҲλõǰһλ + for(l = Q->chead[p->j]; (l->down) && (l->down->i < p->i); l = l->down) { + } + r->down = l->down; + l->down = r; + } + + pn = pn->right; + } + } + + return OK; +} + +/* + * ˷ + * + * Q = M * N + */ +Status MultSMatrix(CrossList M, CrossList N, CrossList* Q) { + int m_row, n_col, i; + ElemType e; + OLNode* pm, * pn, * p, * r, * l; + + // MҪN + if(M.nu != N.mu) { + printf("\n"); + return ERROR; + } + + // ʼQϢ + Q->mu = M.mu; + Q->nu = N.nu; + Q->tu = 0; + + // 0ŵԪã + Q->rhead = (OLink*) malloc((Q->mu + 1) * sizeof(OLink)); + if(!Q->rhead) { + exit(OVERFLOW); + } + + // 0ŵԪã + Q->chead = (OLink*) malloc((Q->nu + 1) * sizeof(OLink)); + if(!Q->chead) { + exit(OVERFLOW); + } + + // ʼΪNULL + for(i = 0; i <= Q->mu; ++i) { + Q->rhead[i] = NULL; + } + + // ʼΪNULL + for(i = 0; i <= Q->nu; ++i) { + Q->chead[i] = NULL; + } + + // QǷ + if(M.tu * N.tu) { + for(m_row = 1; m_row <= M.mu; ++m_row) { + for(n_col = 1; n_col <= N.nu; ++n_col) { + pm = M.rhead[m_row]; + pn = N.chead[n_col]; + + e = 0; + + // MN + while(pm && pn) { + if(pm->j < pn->i) { + pm = pm->right; + } else if(pm->j > pn->i) { + pn = pn->down; + } else { + e += pm->e * pn->e; + pm = pm->right; + pn = pn->down; + } + } + + if(e == 0) { + continue; + } + + p = (OLNode*) malloc(sizeof(OLNode)); + if(!p) { + exit(OVERFLOW); + } + + // Ϊ㸳ֵ + p->i = M.rhead[m_row]->i; + p->j = N.chead[n_col]->j; + p->e = e; + p->right = p->down = NULL; + + Q->tu++; // QзԪһ + + if(Q->rhead[p->i] == NULL) { + Q->rhead[p->i] = p; + } else { + r->right = p; + } + + // rָǰ²Ľ + r = p; + + // ѰҲλ + if(Q->chead[p->j] == NULL || Q->chead[p->j]->i > p->i) { + r->down = Q->chead[p->j]; + Q->chead[p->j] = r; + } else { + // ѰҲλõǰһλ + for(l = Q->chead[p->j]; (l->down) && (l->down->i < p->i); l = l->down) { + } + + r->down = l->down; + l->down = r; + } + } + } + } + + return OK; +} + +/* + * ת + */ +Status TransposeSMatrix(CrossList M, CrossList* T) { + int i; + OLNode* p, * q, * r, * l; + + // ʼQϢ + (*T).mu = M.nu; + (*T).nu = M.mu; + (*T).tu = M.tu; + + // 0ŵԪã + (*T).rhead = (OLink*) malloc(((*T).mu + 1) * sizeof(OLink)); + if(!(*T).rhead) { + exit(OVERFLOW); + } + + // 0ŵԪã + (*T).chead = (OLink*) malloc(((*T).nu + 1) * sizeof(OLink)); + if(!(*T).chead) { + exit(OVERFLOW); + } + + // ʼΪNULL + for(i = 0; i <= (*T).mu; ++i) { + (*T).rhead[i] = NULL; + } + + // ʼΪNULL + for(i = 0; i <= (*T).nu; ++i) { + (*T).chead[i] = NULL; + } + + // + if(!(*T).tu) { + return OK; + } + + // ɨ + for(i = 1; i <= M.nu; ++i) { + q = M.chead[i]; + + // ǰûԪأֱ + if(q == NULL) { + continue; + } + + while(q != NULL) { + // Ԫ + p = (OLNode*) malloc(sizeof(OLNode)); + if(!p) { + exit(OVERFLOW); + } + + // Ϊ㸳ֵбУб + p->i = q->j; + p->j = q->i; + p->e = q->e; + p->right = p->down = NULL; + + /* + * ʼеIJ + */ + + if((*T).rhead[p->i] == NULL) { + (*T).rhead[p->i] = p; + } else { + r->right = p; + } + + // rָǰ²Ľ + r = p; + + /* + * ʼеIJ + */ + + // ѰҲλ + if((*T).chead[p->j] == NULL || (*T).chead[p->j]->i > p->i) { + r->down = (*T).chead[p->j]; + (*T).chead[p->j] = r; + } else { + // ѰҲλõǰһλ + for(l = (*T).chead[p->j]; (l->down) && (l->down->i < p->i); l = l->down) { + } + r->down = l->down; + l->down = r; + } + + q = q->down; + } + } + + return OK; +} + +/* + * + */ +void PrintSMatrix(CrossList M) { + int i, j; + OLNode* p; + + for(i = 1; i <= M.mu; ++i) { + p = M.rhead[i]; + for(j = 1; j <= M.nu; ++j) { + if(p && p->j == j) { + printf("%3d ", p->e); + p = p->right; + } else { + printf("%3d ", 0); + } + } + printf("\n"); + } +} diff --git a/Dev-C++/ExerciseBook/05.27/CrossList.h b/Dev-C++/ExerciseBook/05.27/CrossList.h new file mode 100644 index 0000000..c774280 --- /dev/null +++ b/Dev-C++/ExerciseBook/05.27/CrossList.h @@ -0,0 +1,94 @@ +/*=================== + * ʮϡ + * + * 㷨: 5.4 + ====================*/ + +#ifndef CROSSLIST_H +#define CROSSLIST_H + +#include +#include // ṩmallocreallocfreeexitԭ +#include // ṩ strstr ԭ +#include "Status.h" //**01 **// + +/* ʮԪ */ +typedef int ElemType; + +/* ԪͶ */ +typedef struct OLNode { + int i, j; // ÷Ԫ±± + ElemType e; + struct OLNode* right; // ÷Ԫڵбĺ + struct OLNode* down; // ÷Ԫڵбĺ +} OLNode, * OLink; + +/* ʮͶ */ +typedef struct { + OLink* rhead; // ͷָ + OLink* chead; // ͷָ + int mu, nu, tu; // ͷԪ +} CrossList; + + +/* + * 㷨5.4 + * + * ϡM + * + * + *ע + * + * ̲Ĭϴӿ̨ȡݡ + * Ϊ˷ԣÿжֶݣ + * ѡԤļpathжȡݡ + * + * Ҫӿ̨ȡݣpathΪNULLΪմ + * ҪļжȡݣҪpathдļϢ + */ +Status CreateSMatrix(CrossList* M, char* path); + +/* + * ϡ + */ +Status DestroySMatrix(CrossList* M); + +/* + * + * + * һ¾Tþ˴ӾMаݡ + */ +Status CopySMatrix(CrossList M, CrossList* T); + +/* + * ӷ + * + * Q = M + N + */ +Status AddSMatrix(CrossList M, CrossList N, CrossList* Q); + +/* + * + * + * Q = M - N + */ +Status SubSMatrix(CrossList M, CrossList N, CrossList* Q); + +/* + * ˷ + * + * Q = M * N + */ +Status MultSMatrix(CrossList M, CrossList N, CrossList* Q); + +/* + * ת + */ +Status TransposeSMatrix(CrossList M, CrossList* T); + +/* + * + */ +void PrintSMatrix(CrossList M); + +#endif diff --git a/Dev-C++/ExerciseBook/05.27/TestData_M.txt b/Dev-C++/ExerciseBook/05.27/TestData_M.txt new file mode 100644 index 0000000..be25c94 --- /dev/null +++ b/Dev-C++/ExerciseBook/05.27/TestData_M.txt @@ -0,0 +1,4 @@ +5 +5 +Ԫ10 +Ԫ飺(1,2,1),(1,4,5),(2,3,-3),(2,5,2),(3,1,2),(3,2,3),(3,3,4),(4,4,2),(5,1,3),(5,2,-1) \ No newline at end of file diff --git a/Dev-C++/ExerciseBook/05.27/TestData_N.txt b/Dev-C++/ExerciseBook/05.27/TestData_N.txt new file mode 100644 index 0000000..7c940db --- /dev/null +++ b/Dev-C++/ExerciseBook/05.27/TestData_N.txt @@ -0,0 +1,4 @@ +5 +5 +Ԫ8 +Ԫ飺(1,1,-3)(1,3,2)(2,4,-1)(3,2,4)(4,1,6)(4,5,5)(5,1,3)(5,3,2) \ No newline at end of file diff --git a/Dev-C++/ExerciseBook/05.28-05.29/05.28-05.29.cpp b/Dev-C++/ExerciseBook/05.28-05.29/05.28-05.29.cpp new file mode 100644 index 0000000..eb0a701 --- /dev/null +++ b/Dev-C++/ExerciseBook/05.28-05.29/05.28-05.29.cpp @@ -0,0 +1,336 @@ +#include +#include "MPList.h" //**05 ͹**// + +/* + * mԪʽPеһԪƫPD + * + * ԤһԪΪⲿ + */ +Status Algo_5_28(MPList P, MPList* PD); + +/* + * ָexp˵ʽPԭӽϵ + */ +static void HandleExp(MPList P, int exp); + +/* + * ʽӷR = P + Q + */ +Status Algo_5_29(MPList P, MPList Q, MPList* R); + +/* + * ԷǿյĶԶʽPQӣPQָǸԪбͷ㡣 + */ +static void AddMpList(MPList P, MPList Q, MPList* R); + +/* + * 󴴽һ½㡣 + * tpΪNULLΪԭӽһͷ㣬Ϊӱͷ㡣 + * vΪͷԪ + */ +static MPList VirtualNode(int v, MPList tp, MPList hp); + + +int main(int argc, char* argv[]) { + MPList P, Q; + MPList PD, QD; + MPList R; + char *p = "z((3,y((1,x((3, 1))))),(2,y((2,1))),(0,3))"; + char *q = "z((4,1),(3,y((1,x((3,-1))))),(2,x((1,1))),(0,y((1,1),(0,4))))"; + + printf("Ԫʽ...\n"); + CreateMPList(&P, p, "zyx"); + printf("P = "); + PrintGraph(P); + CreateMPList(&Q, q, "zyx"); + printf("Q = "); + PrintGraph(Q); + + // һԪƫ + printf("P' = "); + Algo_5_28(P, &PD); + PrintGraph(PD); + printf("Q' = "); + Algo_5_28(Q, &QD); + PrintGraph(QD); + + // ʽӷ + printf("R = "); + Algo_5_29(P, Q, &R); + PrintGraph(R); +} + + +/* + * mԪʽPеһԪƫPD + * + * ԤһԪΪⲿ + */ +Status Algo_5_28(MPList P, MPList* PD) { + MPList r, rd, s; + int count; + + if(P == NULL || PD == NULL) { + return ERROR; + } + + // ʽ + *PD = (MPList) malloc(sizeof(MPNode)); + (*PD)->tag = List; + (*PD)->exp = P->exp; + (*PD)->tp = NULL; + + // ͷ + (*PD)->Node.hp = (MPList) malloc(sizeof(MPNode)); + (*PD)->Node.hp->tag = P->Node.hp->tag; + (*PD)->Node.hp->exp = P->Node.hp->exp; + (*PD)->Node.hp->Node.hp = P->Node.hp->Node.hp; + + r = P->Node.hp; // ָPͷ + rd = (*PD)->Node.hp; // ָPDͷ + count = 0; + + // һԪб + while(r->tp != NULL) { + r = r->tp; + + // û""㣬ߣʽPһ"" + if(r->exp!=0 || count==0) { + rd->tp = (MPList) malloc(sizeof(MPNode)); + rd = rd->tp; + } + + /* + * ""㣬󵼺Ϊ0 + * ע""ָΪ0 + */ + if(r->exp == 0) { + // ʽPһ"" + if(count==0) { + rd->tag = Atom; + rd->exp = 0; + rd->Node.coef = 0; + } + + break; + } + + rd->tag = r->tag; + rd->exp = r->exp - 1; + + // ԭӽ㣬ֱӼϵ + if(r->tag==Atom) { + rd->Node.coef = r->Node.coef * r->exp; // ָϵ + + // ӱ㣬Ҫָ˵ʵλ + } else { + Copy(r->Node.hp, &(rd->Node.hp)); + + // ָΪ1ʱûҪ˵ + if(r->exp!=1) { + // ָexp˵ʽPԭӽϵ + HandleExp(rd->Node.hp, r->exp); + } + } + + count++; + } + + rd->tp = NULL; + + return OK; +} + +/* + * ָexp˵ʽPԭӽϵ + */ +static void HandleExp(MPList P, int exp) { + MPList r; + + if(P == NULL) { + return; + } + + for(r = P->tp; r != NULL; r = r->tp) { + if(r->tag == Atom) { + r->Node.coef *= exp; + } else { + HandleExp(r->Node.hp, exp); + } + } +} + +/* + * ʽӷR = P + Q + */ +Status Algo_5_29(MPList P, MPList Q, MPList* R) { + MPList r; + + // ҪʽԪ + if(P == NULL || Q == NULL || R==NULL || P->exp != Q->exp) { + return ERROR; + } + + // ʽ + *R = (MPList) malloc(sizeof(MPNode)); + if(*R == NULL) { + exit(OVERFLOW); + } + (*R)->tag = List; + (*R)->exp = P->exp; // ʽԪ + (*R)->tp = NULL; + + AddMpList(P->Node.hp, Q->Node.hp, &r); + + if(r->tp == NULL) { + r->tp = (MPList) malloc(sizeof(MPNode)); + r->tp->tag = Atom; + r->tp->exp = 0; + r->tp->Node.coef = 0.0f; + r->tp->tp = NULL; + } + + (*R)->Node.hp = r; + + return OK; +} + +/* + * ԷǿյĶԶʽPQӣPQָǸԪбͷ㡣 + */ +static void AddMpList(MPList P, MPList Q, MPList* R) { + MPList p, q, h, r; + MPList t; + MPList tp; + float sum; + int a, b; + int v; + + // ͬһԪ + if(P->exp!=Q->exp) { + + a = (int)(strchr(Var, P->exp)-Var); + b = (int)(strchr(Var, Q->exp)-Var); + + if(aexp, NULL, Q); + v = P->exp; + } + + if(a>b) { + P = VirtualNode(Q->exp, NULL, P); + v = Q->exp; + } + } else { + v = P->exp; + } + + // ͷ + *R = (MPList) malloc(sizeof(MPNode)); + (*R)->tag = List; + (*R)->exp = v; + (*R)->Node.hp =NULL; + + h = *R; + + p = P->tp; + q = Q->tp; + + while(p!=NULL && q!=NULL){ + if(p->exp>q->exp) { + tp = p->tp; + p->tp = NULL; + Copy(p, &(h->tp)); + p->tp = tp; + p = p->tp; + h = h->tp; + } else if(p->expexp) { + tp = q->tp; + q->tp = NULL; + Copy(q, &(h->tp)); + q->tp = tp; + q = q->tp; + h = h->tp; + + // ָͬ + } else { + sum = 0.0f; // ʼϵͣһõ + r = NULL; + + if(p->tag==Atom && q->tag==List) { + t = VirtualNode(q->Node.hp->exp, p, NULL); + tp = p->tp; + p->tp = NULL; + AddMpList(t, q->Node.hp, &r); + p->tp = tp; + } else if(p->tag==List && q->tag==Atom) { + t = VirtualNode(p->Node.hp->exp, q, NULL); + tp = q->tp; + q->tp = NULL; + AddMpList(p->Node.hp, t, &r); + q->tp = tp; + + // ӱ + } else if(p->tag==List && q->tag==List) { + AddMpList(p->Node.hp, q->Node.hp, &r); + + // ԭӵĻֱ + } else if(p->tag==Atom && q->tag==Atom) { + sum = p->Node.coef + q->Node.coef; + } + + if(sum!=0.0f || (r!=NULL && r->tp!=NULL)) { + h->tp = (MPList) malloc(sizeof(MPNode)); + h = h->tp; + h->exp = p->exp; + + if(sum!=0.0f) { + h->tag = Atom; + h->Node.coef = sum; + } else { + h->tag = List; + h->Node.hp = r; + } + } + + p = p->tp; + q = q->tp; + } + } + + h->tp = NULL; + + if(p!=NULL){ + Copy(p, &(h->tp)); + } + + if(q!=NULL){ + Copy(q, &(h->tp)); + } +} + +/* + * 󴴽һ½㡣 + * tpΪNULLΪԭӽһͷ㣬Ϊӱͷ㡣 + * vΪͷԪ + */ +static MPList VirtualNode(int v, MPList tp, MPList hp){ + MPList P; + + P = (MPList) malloc(sizeof(MPNode)); + P->tag = List; + P->exp = v; + P->Node.hp = NULL; + + if(tp!=NULL) { + P->tp = tp; + } else { + P->tp = (MPList) malloc(sizeof(MPNode)); + P->tp->exp = 0; + P->tp->tag = List; + P->tp->Node.hp = hp; + P->tp->tp = NULL; + } + + return P; +} diff --git a/Dev-C++/ExerciseBook/05.28-05.29/05.28-05.29.dev b/Dev-C++/ExerciseBook/05.28-05.29/05.28-05.29.dev new file mode 100644 index 0000000..e1049f7 --- /dev/null +++ b/Dev-C++/ExerciseBook/05.28-05.29/05.28-05.29.dev @@ -0,0 +1,102 @@ +[Project] +FileName=05.28-05.29.dev +Name=05.28-05.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=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 + +[Unit2] +FileName=MPList.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit4] +FileName=StringUtil.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit1] +FileName=05.28-05.29.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit3] +FileName=MPList.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit5] +FileName=StringUtil.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + diff --git a/Dev-C++/ExerciseBook/05.28-05.29/MPList.cpp b/Dev-C++/ExerciseBook/05.28-05.29/MPList.cpp new file mode 100644 index 0000000..1f08b74 --- /dev/null +++ b/Dev-C++/ExerciseBook/05.28-05.29/MPList.cpp @@ -0,0 +1,233 @@ +/*========== + * mԪʽ + ===========*/ + +#include "MPList.h" + +// μͷļе +char Var[27]; + +/* + * + * + * ַSmԪP + * УSǷдȷ + * + * P : Ķʽ + * S : ʽַ + * vars: бӵһԪʼУxyzԪʽеδ֪ + */ +Status CreateMPList(MPList* P, char* S, char* vars) { + if(P == NULL) { + return ERROR; + } + + // ַSеĿհףɴӡַո + ClearBlank(&S); + + if(strlen(S) == 0) { + *P = NULL; + return ERROR; + } + + // ʼԪϢ + strcpy(Var, vars); + + *P = (MPList) malloc(sizeof(MPNode)); + if(*P == NULL) { + exit(OVERFLOW); + } + + (*P)->tag = List; + (*P)->exp = (int) strlen(vars); + (*P)->tp = NULL; + + Create(&(*P)->Node.hp, S); + + return OK; +} + +/* + * mԪʽ + */ +static Status Create(MPList* P, char* S) { + char* Sc; + char* hhstr, * hstr, * str; + char* sub; + MPList r; + float f; + + // ȡSһ + SubString(&Sc, S, 1, (int) strlen(S)); + + *P = (MPList) malloc(sizeof(MPNode)); + if(*P == NULL) { + exit(OVERFLOW); + } + + (*P)->tag = List; + (*P)->exp = (int) Sc[0]; // δ֪ǣxyz + (*P)->Node.hp = NULL; + (*P)->tp = NULL; + + StrDelete(&Sc, 1, 1); // ɾδ֪ + SubString(&str, Sc, 2, (int) strlen(Sc) - 2); // ȥ + + r = *P; + + while(!StrEmpty(str)) { + // + sever(&hstr, &str); + + SubString(&sub, hstr, 2, (int) strlen(hstr) - 2); // ȥ + sever(&hhstr, &sub); + + // ӽ + r->tp = (MPList) malloc(sizeof(MPNode)); + if(r->tp == NULL) { + exit(OVERFLOW); + } + GetElem(hhstr, 1, &f); + r->tp->exp = (int) f; // ȡָ + r->tp->tp = NULL; + + if(ElemCount(sub) == 1) { + r->tp->tag = Atom; + GetElem(sub, 1, &f); + r->tp->Node.coef = f; + } else { + r->tp->tag = List; + Create(&(r->tp->Node.hp), sub); + } + + r = r->tp; + } + + return OK; +} + +/* + * ͼλ + * + * mԪP + */ +void PrintGraph(MPList P) { + if(P == NULL) { + printf("\n"); + return; + } + Print(P->Node.hp); + printf("\n"); +} + +/* + * ͼλڲʵ + */ +static void Print(MPList head) { + MPList p; + + if(head == NULL) { + return; + } + + printf("%c(", head->exp); + + p = head->tp; + + while(p != NULL) { + printf("(%d,", p->exp); + + if(p->tag == List) { + Print(p->Node.hp); + } else { + printf("%.2f", p->Node.coef); + } + + printf(")"); + + p = p->tp; + + if(p != NULL) { + printf(","); + } + } + + printf(")"); +} + +/* + * ǿմstrָ֣hsubΪһ','֮ǰӴstrΪһ','֮Ӵ + * + *ע + * 1.ַstrȷ޿հ׷ţstrѾȥš + * 2.ɺstrҲᷢ仯 + */ +static void sever(char** hstr, char** str) { + int i, k, n; + + char* head, * tail; + + // strΪʱhstrҲΪ + if(strlen(*str) == 0) { + *hstr = NULL; + return; + } + + n = (int) strlen(*str); + + i = 0; // ַʱα + k = 0; // δ + + do { + if((*str)[i] == '(') { + ++k; + } + + if((*str)[i] == ')') { + --k; + } + + i++; + } while(i < n && ((*str)[i] != ',' || k != 0)); + + if(i < n) { + head = (char*) malloc((i + 1) * sizeof(char)); + tail = (char*) malloc((n - i - 1 + 1) * sizeof(char)); + + strncpy(head, *str, i); + head[i] = '\0'; + + strncpy(tail, (*str + i + 1), n - i - 1); + tail[n - i - 1] = '\0'; + } else { + head = *str; + tail = (char*) malloc(sizeof(char)); + tail[0] = '\0'; + } + + *hstr = head; + *str = tail; +} + + +/* + * ƶʽPƵQ + */ +void Copy(MPList P, MPList* Q) { + if(P == NULL) { + *Q = NULL; + return; + } + + *Q = (MPList) malloc(sizeof(MPNode)); + (*Q)->tag = P->tag; + (*Q)->exp = P->exp; + + if(P->tag == List) { + Copy(P->Node.hp, &((*Q)->Node.hp)); + } else { + (*Q)->Node.coef = P->Node.coef; + } + + Copy(P->tp, &((*Q)->tp)); +} diff --git a/Dev-C++/ExerciseBook/05.28-05.29/MPList.h b/Dev-C++/ExerciseBook/05.28-05.29/MPList.h new file mode 100644 index 0000000..455e7ea --- /dev/null +++ b/Dev-C++/ExerciseBook/05.28-05.29/MPList.h @@ -0,0 +1,97 @@ +/*========== + * mԪʽ + ===========*/ + +#ifndef MPLIST_H +#define MPLIST_H + +#include +#include // ṩ mallocreallocfreeexit ԭ +#include // ṩ strlen ԭ +#include "Status.h" //**01 **// +#include "StringUtil.h" //**ַ**// + +/* + * ʾ + * + * 1.ڶԪԼһԪλ㡣 + * 2.δ֪ĬΪa~zA~Z26ĸ + * 3.ԼʽÿԪָǡݼģ321 + */ + + +/* + * 浱ǰʽıϢxyz + * Լvarеַ˳λԪĴ磺 + * "zyx"ָʾzΪһԪyΪڶԪxΪԪ + */ +extern char Var[27]; + +/* + * mԪʽ + * + * Atom-0ԭӽ + * List-1 + */ +typedef enum { Atom, List } ElemTag; + +/* mԪʽԪؽ */ +typedef struct MPNode { + ElemTag tag; // ԭӽͱ + int exp; // ָ򣬶ͷ㣬洢δ֪ǣxyz + union { + float coef; // ϵ + struct MPNode* hp; // ıͷָ + } Node; + struct MPNode* tp; // ൱nextָһԪؽ +} MPNode; + +/* mԪʽ */ +typedef MPNode* MPList; + + +/* + * + * + * ַSmԪP + * УSǷдȷ + * + * P : Ķʽ + * S : ʽַ + * vars: бӵһԪʼУxyzԪʽеδ֪ + */ +Status CreateMPList(MPList* P, char* S, char* vars); + +/* + * mԪʽ + */ +static Status Create(MPList* P, char* S); + +/* + * ͼλ + * + * mԪP + */ +void PrintGraph(MPList P); + +/* + * ͼλڲʵ + */ +static void Print(MPList P); + +/* + * ǿմstrָ֣hsubΪһ','֮ǰӴstrΪһ','֮Ӵ + * + *ע + * 1.ַstrȷ޿հ׷ţstrѾȥš + * 2.ɺstrҲᷢ仯 + */ +static void sever(char** hstr, char** str); + + +/* + * ƶʽ + */ +void Copy(MPList P, MPList* Q); + +#endif diff --git a/Dev-C++/ExerciseBook/05.28-05.29/StringUtil.cpp b/Dev-C++/ExerciseBook/05.28-05.29/StringUtil.cpp new file mode 100644 index 0000000..b1b0fbf --- /dev/null +++ b/Dev-C++/ExerciseBook/05.28-05.29/StringUtil.cpp @@ -0,0 +1,160 @@ +/*================ + * ַ + =================*/ + +#include "StringUtil.h" + +/* + * ɾ + * + * ɾs[pos, pos+len-1]pos1ʼ + */ +Status StrDelete(char** s, int pos, int n) { + int len; + char* ss; + + len = (int) strlen(*s); + + if(pos < 1 || pos + n - 1 > len || n < 0) { + return ERROR; + } + + // ɾijΪ0ǰ + if(n == 0) { + return ERROR; + } + + ss = (char*) malloc((len - n + 1) * sizeof(char)); + + strncpy(ss, *s, pos - 1); + strncpy(ss, *s + pos + n - 1, len - pos - n + 1); + + ss[len - n] = '\0'; + + *s = ss; + + return OK; +} + +/* + * Ӵ + * + * subs[pos, pos+len-1]pos1ʼ + */ +Status SubString(char** sub, char* s, int pos, int n) { + int len, i; + + len = (int) strlen(s); + + if(pos < 1 || pos > len || n < 0 || pos + n - 1 > len) { + *sub = NULL; + return ERROR; + } + + *sub = (char*) malloc((n + 1) * sizeof(char)); + + for(i = 0; i < n; i++) { + (*sub)[i] = s[pos + i - 1]; + } + + // ȷ³ + (*sub)[n] = '\0'; + + return OK; +} + +/* + * п + * + * жϴsǷЧݡ + */ +Status StrEmpty(char* s) { + return strlen(s) == 0 ? TRUE : FALSE; +} + +/* + * + * + * ַsеĿհףɴӡַո + */ +Status ClearBlank(char** s) { + int len; + int i, j; + char* ss; + + len = (int) strlen(*s); + if(len == 0) { + return ERROR; + } + + ss = (char*) malloc((len + 1) * sizeof(char)); + + for(i = 0, j = 0; i < len; i++) { + // հףԹ + if((*s)[i] == ' ' || !isprint((*s)[i])) { + continue; + } + + ss[j++] = (*s)[i]; + } + + ss[j] = '\0'; + + *s = ss; + + return OK; +} + +/* + * + * + * ͳַsеԪظ + * ֮ڣ֣Ὣ䵱һԪء + */ +int ElemCount(const char* s) { + int count; + float f; + char c; + char* sub; + + if(s==NULL || strlen(s) == 0) { + return 0; + } + + sub = (char*) malloc((strlen(s) + 1) * sizeof(char)); + sub[0] = '\0'; + + // + if(sscanf(s, "%f", &f) == 1) { + sscanf(s, "%f%s", &f, sub); + } else { + sscanf(s, "%c%s", &c, sub); + } + + count = ElemCount(sub); + + return 1 + count; +} + +/* + * ȡֵ + * + * ȡַsеposԪ(pos1ʼ)fա + * ֮ڣ֣Ὣ䵱һԪء + */ +Status GetElem(char* s, int pos, float* f) { + int len; + + len = (int) strlen(s); + + if(pos < 1 || pos > len) { + return ERROR; + } + + // ȳԶ֣ȡʧܵĻٳԶַ + if(sscanf(s + pos - 1, "%f", f) < 1) { + *f = s[pos - 1]; + } + + return OK; +} diff --git a/Dev-C++/ExerciseBook/05.28-05.29/StringUtil.h b/Dev-C++/ExerciseBook/05.28-05.29/StringUtil.h new file mode 100644 index 0000000..e535a5e --- /dev/null +++ b/Dev-C++/ExerciseBook/05.28-05.29/StringUtil.h @@ -0,0 +1,58 @@ +/*================ + * ַ + =================*/ + +#ifndef STRINGUTIL_H +#define STRINGUTIL_H + +#include +#include // ṩ malloc ԭ +#include // ṩ strlenstrncpy ԭ +#include // ṩ isprint ԭ +#include "Status.h" //**01 **// + +/* + * ɾ + * + * ɾs[pos, pos+len-1]pos1ʼ + */ +Status StrDelete(char** S, int pos, int n); + +/* + * Ӵ + * + * subs[pos, pos+len-1]pos1ʼ + */ +Status SubString(char** sub, char* s, int pos, int len); + +/* + * п + * + * жϴsǷЧݡ + */ +Status StrEmpty(char* s); + +/* + * + * + * ַsеĿհףɴӡַո + */ +Status ClearBlank(char** s); + +/* + * + * + * ͳַsеԪظ + * ֮ڣ֣Ὣ䵱һԪء + */ +int ElemCount(const char* s); + +/* + * ȡֵ + * + * ȡַsеposԪ(pos1ʼ)fա + * ֮ڣ֣Ὣ䵱һԪء + */ +Status GetElem(char* s, int pos, float *f); + +#endif diff --git a/Dev-C++/ExerciseBook/05.30.1/05.30.1.cpp b/Dev-C++/ExerciseBook/05.30.1/05.30.1.cpp new file mode 100644 index 0000000..00aefcc --- /dev/null +++ b/Dev-C++/ExerciseBook/05.30.1/05.30.1.cpp @@ -0,0 +1,42 @@ +#include +#include "SString.h" //**04 **// +#include "GList-HT.h" //**05 ͹**// + +// ȣͷβ洢ʾ +int Algo_5_30_1(GList L); + + +int main(int argc, char* argv[]) { + GList L; + char* s = "((),(e),(a,(b,c,d)))"; + SString S; + + printf(" L ...\n"); + StrAssign(S, s); + CreateGList(&L, S); + printf("L = "); + PrintGraph(L); + + printf("Ϊ %d\n", Algo_5_30_1(L)); + + return 0; +} + + +// ȣͷβ洢ʾ +int Algo_5_30_1(GList L) { + int m, n; + + if(L==NULL) { + return 1; // ձΪ1 + } + + if(L->tag == Atom) { + return 0; // ԭΪ0 + } + + m = Algo_5_30_1(L->Node.ptr.hp) + 1; + n = Algo_5_30_1(L->Node.ptr.tp); + + return m > n ? m : n; +} diff --git a/Dev-C++/ExerciseBook/05.30.1/05.30.1.dev b/Dev-C++/ExerciseBook/05.30.1/05.30.1.dev new file mode 100644 index 0000000..1239375 --- /dev/null +++ b/Dev-C++/ExerciseBook/05.30.1/05.30.1.dev @@ -0,0 +1,102 @@ +[Project] +FileName=05.30.1.dev +Name=05.30.1 +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 + +[Unit4] +FileName=SString.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit2] +FileName=GList-HT.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit1] +FileName=05.30.1.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit3] +FileName=GList-HT.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit5] +FileName=SString.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + diff --git a/Dev-C++/ExerciseBook/05.30.1/GList-HT.cpp b/Dev-C++/ExerciseBook/05.30.1/GList-HT.cpp new file mode 100644 index 0000000..bad30df --- /dev/null +++ b/Dev-C++/ExerciseBook/05.30.1/GList-HT.cpp @@ -0,0 +1,418 @@ +/*============================ + * ͷβ洢ʾ + * + * 㷨: 5.55.65.75.8 + =============================*/ + +#include "GList-HT.h" //**05 ͹**// + +/* + * ʼ + * + * ʼյĹΪ0Ϊ1 + * + *ע + * Ҫÿһȥſ + */ +Status InitGList(GList* L) { + if(L == NULL) { + return ERROR; + } + + *L = NULL; + + return OK; +} + +/* + * 㷨5.7 + * + * + * + * ַSL + */ +Status CreateGList(GList* L, SString S) { + SString emp; // չַ + SString hsub, sub; + GList p, q; + + if(L == NULL) { + return ERROR; + } + + // ַSеĿհףɴӡַո + ClearBlank(S); + + if(StrEmpty(S)) { + return ERROR; + } + + StrAssign(emp, "()"); + + /* + * 봮Ϊ()ҪյĹ + * + *ע + * ̲Ĵġ + * StrCompareķֵָʾַĴСָʾַǷȡ + * S()ȣֵӦ0 + */ + if(!StrCompare(S, emp)) { + *L = NULL; + } else { + *L = (GList) malloc(sizeof(GLNode)); + if(*L == NULL) { + exit(OVERFLOW); + } + + // ԭ + if(StrLength(S) == 1) { + (*L)->tag = Atom; + (*L)->Node.atom = S[1]; + } else { + (*L)->tag = List; + + p = *L; + + // ȥ + SubString(sub, S, 2, StrLength(S) - 2); + + // ظnӱ + do { + // subзͷhsubɺsubҲᷢ仯 + sever(hsub, sub); + + // ݹ鴴 + CreateGList(&(p->Node.ptr.hp), hsub); + + q = p; + + // βΪգҪβ + if(!StrEmpty(sub)) { + p = (GList) malloc(sizeof(GLNode)); + if(p == NULL) { + exit(OVERFLOW); + } + + p->tag = List; + + q->Node.ptr.tp = p; + } + } while(!StrEmpty(sub)); + + q->Node.ptr.tp = NULL; + } + } + + return OK; +} + +/* + * + * + * ͷŹռڴ档 + */ +Status DestroyGList(GList* L) { + GList head, tail; + + if(L == NULL || *L == NULL) { + return ERROR; + } + + // ɾԭӽ + if((*L)->tag == Atom) { + free(*L); + *L = NULL; + + // ɾӱ + } else { + head = (*L)->Node.ptr.hp; + tail = (*L)->Node.ptr.tp; + free(*L); + *L = NULL; + DestroyGList(&head); + DestroyGList(&tail); + } + + return OK; +} + +/* + * 㷨5.6 + * + * + * + * ɹLƵõT + */ +Status CopyGList(GList* T, GList L) { + if(T == NULL) { + return ERROR; + } + + if(L == NULL) { + *T = NULL; + } else { + // ½ + *T = (GList) malloc(sizeof(GLNode)); + if(*T == NULL) { + exit(OVERFLOW); + } + + (*T)->tag = L->tag; + + // Ƶԭ + if(L->tag == Atom) { + (*T)->Node.atom = L->Node.atom; + + // Ʊͷͱβ + } else { + CopyGList(&((*T)->Node.ptr.hp), L->Node.ptr.hp); + CopyGList(&((*T)->Node.ptr.tp), L->Node.ptr.tp); + } + } + + return OK; +} + +/* + * + * + * عijȡ + */ +int GListLength(GList L) { + int count; + + for(count = 0; L != NULL; count++, L = L->Node.ptr.tp) { + } + + return count; +} + +/* + * 㷨5.5 + * + * + * + * ع + */ +int GListDepth(GList L) { + int max, deep; + GList p; + + // ձΪ1 + if(L == NULL) { + return 1; + } + + // ԭΪ0 + if(L->tag == Atom) { + return 0; + } + + // ݹӱ + for(max = 0, p = L; p != NULL; p = p->Node.ptr.tp) { + deep = GListDepth(p->Node.ptr.hp); + if(deep > max) { + max = deep; + } + } + + // ǿձǸԪȼһ + return max + 1; +} + +/* + * п + * + * жϹǷΪա + */ +Status GListEmpty(GList L) { + return L == NULL ? TRUE : FALSE; +} + +/* + * ͷ + */ +GList GetHead(GList L) { + GList p; + + // ձޱͷﲻܷNULLȻֲʧ˻Ƿ˿ձ + if(L == NULL) { + exit(ERROR); + } + + CopyGList(&p, L->Node.ptr.hp); + + return p; +} + +/* + * β + */ +GList GetTail(GList L) { + GList p; + + // ձޱβﲻܷNULLȻֲʧ˻Ƿ˿ձ + if(L == NULL) { + exit(ERROR); + } + + CopyGList(&p, L->Node.ptr.tp); + + return p; +} + +/* + * + * + * ԪeΪLĵһԪء + */ +Status InsertFirst(GList* L, GList e) { + GList g; + + if(L == NULL) { + return ERROR; + } + + g = (GList) malloc(sizeof(GLNode)); + if(g == NULL) { + exit(OVERFLOW); + } + + g->tag = List; + g->Node.ptr.hp = e; + g->Node.ptr.tp = *L; + *L = g; + + return OK; +} + +/* + * ɾ + * + * LĵһԪɾeء + */ +Status DeleteFirst(GList* L, GList* e) { + GList p; + + // ձ޷ɾ + if(L == NULL || *L == NULL) { + return ERROR; + } + + p = *L; + *L = (*L)->Node.ptr.tp; + + CopyGList(e, p->Node.ptr.hp); + + free(p); + + return OK; +} + +/* + * + * + * visitʹL + */ +void Traverse(GList L, void(Visit)(AtomType)) { + + if(L == NULL) { + return; + } + + if(L->tag == Atom) { + Visit(L->Node.atom); + } else { + Traverse(L->Node.ptr.hp, Visit); + Traverse(L->Node.ptr.tp, Visit); + } + +} + +/* + * ͼλ + * + * L + */ +void PrintGraph(GList L) { + Print(L, Head); + printf("\n"); +} + +/* + * ͼλڲʵ֣markͼλǡ + */ +static void Print(GList L, Mark mark) { + // LΪ + if(L == NULL) { + if(mark == Head) { + printf("("); + } + + printf(")"); + + // LΪʱ + } else { + // ԭӽ㣬ԭ + if(L->tag == Atom) { + printf("%c", L->Node.atom); + + // ӱ㣬ҪԱͷβֱ + } else { + if(mark == Head) { + printf("("); + } else { + printf(","); + } + + Print(L->Node.ptr.hp, Head); + Print(L->Node.ptr.tp, Tail); + } + } +} + +/* + * 㷨5.8 + * + * ǿմstrָ֣hsubΪһ','֮ǰӴstrΪһ','֮Ӵ + * + *ע + * 1.ַstrȷ޿հ׷ţstrѾȥš + * 2.ɺstrҲᷢ仯 + */ +static void sever(SString hstr, SString str) { + int i, k, n; + SString ch; + + n = StrLength(str); + + i = 0; // ַʱα + k = 0; // δ + + do { + ++i; + + // ȡstrһַ + SubString(ch, str, i, 1); + + if(ch[1] == '(') { + ++k; + } + + if(ch[1] == ')') { + --k; + } + } while(i < n && (ch[1] != ',' || k != 0)); + + // ڶ + if(i < n) { + SubString(hstr, str, 1, i - 1); + SubString(str, str, i + 1, n - i); + + // ֻһ + } else { + StrCopy(hstr, str); + ClearString(str); + } +} diff --git a/Dev-C++/ExerciseBook/05.30.1/GList-HT.h b/Dev-C++/ExerciseBook/05.30.1/GList-HT.h new file mode 100644 index 0000000..508b96f --- /dev/null +++ b/Dev-C++/ExerciseBook/05.30.1/GList-HT.h @@ -0,0 +1,164 @@ +/*============================ + * ͷβ洢ʾ + * + * 㷨: 5.55.65.75.8 + =============================*/ + +#ifndef GLIST_HT_H +#define GLIST_HT_H + +#include +#include // ṩ mallocreallocfreeexit ԭ +#include "Status.h" //**01 **// +#include "SString.h" //**04 **// + +/* ԭԪ */ +typedef char AtomType; + +/* + * + * + * Atom-0ԭӽ + * List-1 + */ +typedef enum { Atom, List } ElemTag; + +/* ͷβ洢ʾͶ */ +typedef struct GLNode { + ElemTag tag; // ǣԭӽͱ + + // ԭӽͱϲ + union { + AtomType atom; // atomԭӽֵAtomTypeû + struct { + struct GLNode* hp; // ָͷ + struct GLNode* tp; // ָβ + } ptr; // ָ + } Node; +} GLNode; + +/* */ +typedef GLNode* GList; + +/* + * ͼλ + * + * HeadָԱͷ + * TailָԱβ + */ +typedef enum { Head, Tail } Mark; + + +/* + * ʼ + * + * ʼյĹΪ0Ϊ1 + * + *ע + * Ҫÿһȥſ + */ +Status InitGList(GList* L); + +/* + * 㷨5.7 + * + * + * + * ַSL + */ +Status CreateGList(GList* L, SString S); + +/* + * + * + * ͷŹռڴ档 + */ +Status DestroyGList(GList* L); + +/* + * 㷨5.6 + * + * + * + * ɹLƵõT + */ +Status CopyGList(GList* T, GList L); + +/* + * + * + * عijȡ + */ +int GListLength(GList L); + +/* + * 㷨5.5 + * + * + * + * ع + */ +int GListDepth(GList L); + +/* + * п + * + * жϹǷΪա + */ +Status GListEmpty(GList L); + +/* + * ͷ + */ +GList GetHead(GList L); + +/* + * β + */ +GList GetTail(GList L); + +/* + * + * + * ԪeΪLĵһԪء + */ +Status InsertFirst(GList* L, GList e); + +/* + * ɾ + * + * LĵһԪɾeء + */ +Status DeleteFirst(GList* L, GList* e); + +/* + * + * + * visitʹL + */ +void Traverse(GList L, void (Visit)(AtomType)); + +/* + * ͼλ + * + * L + */ +void PrintGraph(GList L); + +/* + * ͼλڲʵ֣markͼλǡ + */ +static void Print(GList L, Mark mark); + +/* + * 㷨5.8 + * + * ǿմstrָ֣hsubΪһ','֮ǰӴstrΪһ','֮Ӵ + * + *ע + * 1.ַstrȷ޿հ׷ţstrѾȥš + * 2.ɺstrҲᷢ仯 + */ +static void sever(SString hstr, SString str); + +#endif diff --git a/Dev-C++/ExerciseBook/05.30.1/SString.cpp b/Dev-C++/ExerciseBook/05.30.1/SString.cpp new file mode 100644 index 0000000..7a96fcf --- /dev/null +++ b/Dev-C++/ExerciseBook/05.30.1/SString.cpp @@ -0,0 +1,195 @@ +/*============================= + * Ķ˳洢ʾ˳򴮣 + * + * 㷨: 4.14.24.34.5 + ==============================*/ + +#include "SString.h" //**04 **// + +/* + * ʼ + * + * һֵΪcharsĴT + * + *ע + * òСӼ + */ +Status StrAssign(SString T, const char* chars) { + int i, len; + + len = (int) strlen(chars); + + // chars + if(len > MAXSTRLEN) { + return ERROR; + } + + T[0] = len; + for(i = 1; i <= len; i++) { + T[i] = chars[i - 1]; + } + + return OK; +} + +/* + * + * + * Sա + */ +Status ClearString(SString S) { + // ֻҪΪ0Ϳ + S[0] = 0; + return OK; +} + +/* + * п + * + * жϴSǷЧݡ + * + * ֵ + * TRUE : SΪ + * FALSE: SΪ + */ +Status StrEmpty(SString S) { + return S[0] == 0 ? TRUE : FALSE; +} + +/* + * + * + * شSԪصĸ + * + *ע + * òСӼ + */ +int StrLength(SString S) { + return S[0]; +} + +/* + * 㷨4.3 + * + * Ӵ + * + * SubS[pos, pos+len-1] + * ֵָʾǷȡɹ + * + *ע + * òСӼ + */ +Status SubString(SString Sub, SString S, int pos, int len) { + int i; + + if(pos < 1 || pos > S[0] || len < 0 || pos + len - 1 > S[0]) { + return ERROR; + } + + // Ԫ + for(i = 1; i <= len; i++) { + Sub[i] = S[pos + i - 1]; + } + + // ȷ³ + Sub[0] = len; + + return OK; +} + +/* + * ɾ + * + * ɾS[pos, pos+len-1] + */ +Status StrDelete(SString S, int pos, int len) { + int i; + + if(pos < 1 || pos + len - 1 > S[0] || len < 0) { + return ERROR; + } + + // ɾijΪ0ǰ + if(len == 0) { + return OK; + } + + // ѺԪŲǰ棬ǵɾԪ + for(i = pos + len; i <= S[0]; i++) { + S[i - len] = S[i]; + } + + // ȼ + S[0] -= len; + + return OK; +} + +/* + * Ƚ + * + * ȽϴSʹTرȽϽ + * + *ע + * òСӼ + */ +int StrCompare(SString S, SString T) { + int i = 1; + + while(i <= S[0] && i <= T[0]) { + // ַͬʱȽС + if(S[i] != T[i]) { + return S[i] - T[i]; + } + + i++; + } + + return S[0] - T[0]; +} + +/* + * + * + * SƵT + */ +Status StrCopy(SString T, SString S) { + int i; + + // ͬϢһ + for(i = 0; i <= S[0]; i++) { + T[i] = S[i]; + } + + return OK; +} + +/* + * ַSеĿհףɴӡַո + * + *ע + * úڱġ + */ +Status ClearBlank(SString S) { + int i, j; + + // ǿմ + if(S[0] == 0) { + return ERROR; + } + + for(i = 1, j = 0; i <= S[0]; i++) { + // հףԹ + if(S[i] == ' ' || !isprint(S[i])) { + continue; + } + + j++; + + S[j] = S[i]; + } + + S[0] = j; + + return OK; +} diff --git a/Dev-C++/ExerciseBook/05.30.1/SString.h b/Dev-C++/ExerciseBook/05.30.1/SString.h new file mode 100644 index 0000000..0632f18 --- /dev/null +++ b/Dev-C++/ExerciseBook/05.30.1/SString.h @@ -0,0 +1,117 @@ +/*============================= + * Ķ˳洢ʾ˳򴮣 + * + * 㷨: 4.14.24.34.5 + ==============================*/ + +#ifndef SSTRING_H +#define SSTRING_H + +#include +#include // ṩ strlen ԭ +#include // ṩ isprint ԭ +#include "Status.h" //**01 **// + +/* 궨 */ +#define MAXSTRLEN 255 // ˳򴮵󴮳 + +/* + * ˳洢Ͷ + * + * עЧԪشSString1ŵԪʼ洢 + * SString0ŵԪ洢䳤 + */ +typedef unsigned char SString[MAXSTRLEN + 1]; // 0ŵԪŴij + + +/* + * ʾ + * + * ѭ̲ĵдϰߣposָʾַλ()1ʼ + */ + + +/* + * ʼ + * + * һֵΪcharsĴT + * + *ע + * òСӼ + */ +Status StrAssign(SString T, const char* chars); + +/* + * + * + * Sա + */ +Status ClearString(SString S); + +/* + * п + * + * жϴSǷЧݡ + * + * ֵ + * TRUE : SΪ + * FALSE: SΪ + */ +Status StrEmpty(SString S); + +/* + * + * + * شSԪصĸ + * + *ע + * òСӼ + */ +int StrLength(SString S); + +/* + * 㷨4.3 + * + * Ӵ + * + * SubS[pos, pos+len-1] + * ֵָʾǷȡɹ + * + *ע + * òСӼ + */ +Status SubString(SString Sub, SString S, int pos, int len); + +/* + * ɾ + * + * ɾS[pos, pos+len-1] + */ +Status StrDelete(SString S, int pos, int len); + +/* + * Ƚ + * + * ȽϴSʹTرȽϽ + * + *ע + * òСӼ + */ +int StrCompare(SString S, SString T); + +/* + * + * + * SƵT + */ +Status StrCopy(SString T, SString S); + +/* + * ַSеĿհףɴӡַո + * + *ע + * úڱġ + */ +Status ClearBlank(SString S); + +#endif diff --git a/Dev-C++/ExerciseBook/05.30.2/05.30.2.cpp b/Dev-C++/ExerciseBook/05.30.2/05.30.2.cpp new file mode 100644 index 0000000..929561f --- /dev/null +++ b/Dev-C++/ExerciseBook/05.30.2/05.30.2.cpp @@ -0,0 +1,42 @@ +#include +#include "SString.h" //**04 **// +#include "GList-E.h" //**05 ͹**// + +// ȣչ洢ʾ +int Algo_5_30_2(GList L); + + +int main(int argc, char* argv[]) { + GList L; + char* s = "((),(e),(a,(b,c,d)))"; + SString S; + + printf(" L ...\n"); + StrAssign(S, s); + CreateGList(&L, S); + printf("L = "); + PrintGraph(L); + + printf("Ϊ %d\n", Algo_5_30_2(L)); + + return 0; +} + + +// ȣչ洢ʾ +int Algo_5_30_2(GList L) { + int m, n; + + if(L==NULL) { + return 1; // ձΪ1 + } + + if(L->tag == Atom) { + return 0; // ԭΪ0 + } + + m = Algo_5_30_2(L->Node.hp) + 1; + n = Algo_5_30_2(L->tp); + + return m > n ? m : n; +} diff --git a/Dev-C++/ExerciseBook/05.30.2/05.30.2.dev b/Dev-C++/ExerciseBook/05.30.2/05.30.2.dev new file mode 100644 index 0000000..e9bd2d7 --- /dev/null +++ b/Dev-C++/ExerciseBook/05.30.2/05.30.2.dev @@ -0,0 +1,102 @@ +[Project] +FileName=05.30.2.dev +Name=05.30.2 +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 + +[Unit4] +FileName=SString.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit2] +FileName=GList-E.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit1] +FileName=05.30.2.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit3] +FileName=GList-E.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit5] +FileName=SString.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + diff --git a/Dev-C++/ExerciseBook/05.30.2/GList-E.cpp b/Dev-C++/ExerciseBook/05.30.2/GList-E.cpp new file mode 100644 index 0000000..3fc0ad9 --- /dev/null +++ b/Dev-C++/ExerciseBook/05.30.2/GList-E.cpp @@ -0,0 +1,449 @@ +/*=========================== + * չ洢ʾ + ============================*/ + +#include "GList-E.h" //**05 ͹**// + +/* + * ʼ + * + * ʼյĹΪ0Ϊ1 + * + *ע + * Ҫÿһſ + */ +Status InitGList(GList* L) { + if(L == NULL) { + return ERROR; + } + + *L = (GList) malloc(sizeof(GLNode)); + if(!*L) { + exit(OVERFLOW); + } + + (*L)->tag = List; + (*L)->Node.hp = NULL; + (*L)->tp = NULL; + + return OK; +} + +/* + * + * + * ַSL + */ +Status CreateGList(GList* L, SString S) { + SString emp, hsub, sub, tmp; + + if(L == NULL) { + return ERROR; + } + + // ַSеĿհףɴӡַո + ClearBlank(S); + + if(StrEmpty(S)) { + return ERROR; + } + + // Ϊ˲ƻS + StrCopy(sub, S); + + /* + * ִеʱ + * ٴִеʱѾȥ + */ + sever(hsub, sub); + + *L = (GList) malloc(sizeof(GLNode)); + if(*L == NULL) { + exit(OVERFLOW); + } + + StrAssign(emp, "()"); + + if(!StrCompare(hsub, emp)) { + (*L)->tag = List; + (*L)->Node.hp = NULL; + } else { + if(StrLength(hsub) == 1) { + (*L)->tag = Atom; + (*L)->Node.atom = hsub[1]; + } else { + (*L)->tag = List; + + SubString(tmp, hsub, 2, StrLength(hsub) - 2); + + CreateGList(&((*L)->Node.hp), tmp); + } + } + + // ڶβ˳ݹ + if(StrEmpty(sub)) { + (*L)->tp = NULL; + } else { + // ݹβ + CreateGList(&((*L)->tp), sub); + } + + return OK; +} + +/* + * + * + * ͷŹռڴ档 + */ +Status DestroyGList(GList* L) { + GList head, tail; + + if(L == NULL || *L == NULL) { + return ERROR; + } + + // ӱ + if((*L)->tag == List) { + head = (*L)->Node.hp; // ͷ + tail = (*L)->tp; // β + + free(*L); + *L = NULL; + + // ݹ鴦ͷ + if(head != NULL) { + DestroyGList(&head); + } + + // ݹ鴦β + if(tail != NULL) { + DestroyGList(&tail); + } + + // ԭӽ + } else { + tail = (*L)->tp; // β + + free(*L); + *L = NULL; + + if(tail != NULL) { + DestroyGList(&tail); + } + } + + return OK; +} + +/* + * + * + * ɹLƵõT + */ +Status CopyGList(GList* T, GList L) { + + if(L == NULL) { + return ERROR; + } + + *T = (GList) malloc(sizeof(GLNode)); + if(*T == NULL) { + exit(OVERFLOW); + } + + // ԭ + if(L->tag == Atom) { + (*T)->tag = Atom; + (*T)->Node.atom = L->Node.atom; + + // ӱ + } else { + (*T)->tag = List; + + // Ʊͷ + if(L->Node.hp != NULL) { + CopyGList(&((*T)->Node.hp), L->Node.hp); + } else { + (*T)->Node.hp = NULL; + } + } + + // Ʊβ + if(L->tp != NULL) { + CopyGList(&((*T)->tp), L->tp); + } else { + (*T)->tp = NULL; + } + + return OK; +} + +/* + * + * + * عijȡ + */ +int GListLength(GList L) { + int count = 0; + GList p; + + // + if(L == NULL) { + return -1; + } + + p = L->Node.hp; + + while(p != NULL) { + ++count; + p = p->tp; + } + + return count; +} + +/* + * + * + * ع + */ +int GListDepth(GList L) { + int max, deep; + GList p; + + max = 0; + + // + if(L == NULL) { + return -1; + } + + // ձΪ1 + if(L->tag == List && !L->Node.hp) { + return 1; + } + + // ԭΪ0 + if(L->tag == Atom) { + return 0; + } + + // ݹӱ + for(p = L->Node.hp; p != NULL; p = p->tp) { + // pΪͷָӱ + deep = GListDepth(p); + if(deep > max) { + max = deep; + } + } + + return max + 1; +} + +/* + * п + * + * жϹǷΪա + */ +Status GListEmpty(GList L) { + // + if(L == NULL) { + return ERROR; + } + + if(L->tag == List && L->Node.hp == NULL && L->tp == NULL) { + return TRUE; + } else { + return ERROR; + } +} + +/* + * ͷ + */ +GList GetHead(GList L) { + GList p, q; + + // ڻΪձ޷ȡͷ + if(L == NULL || L->Node.hp == NULL) { + return NULL; + } + + q = L->Node.hp->tp; // ʱLıβϢ + L->Node.hp->tp = NULL; // ȥLıβ + + CopyGList(&p, L->Node.hp); // ƱͷϢαβ + + L->Node.hp->tp = q; // ָLıβϢ + + return p; +} + +/* + * β + */ +GList GetTail(GList L) { + GList p, q; + + // ڻΪձ޷ȡβ + if(L == NULL || L->Node.hp == NULL) { + return NULL; + } + + q = L->Node.hp; // ʱLıͷϢ + L->Node.hp = q->tp; // ժLıͷ + + CopyGList(&p, L); // ƱβϢαͷ + + q->tp = L->Node.hp; // ָLıͷϢ + L->Node.hp = q; + + return p; +} + +/* + * + * + * ԪeΪLĵһԪء + */ +Status InsertFirst(GList* L, GList e) { + + // + if(L == NULL || *L == NULL) { + return ERROR; + } + + if(e == NULL) { + return ERROR; + } + + e->tp = (*L)->Node.hp; + (*L)->Node.hp = e; + + return OK; +} + +/* + * ɾ + * + * LĵһԪɾeء + */ +Status DeleteFirst(GList* L, GList* e) { + GList p; + + // ڻΪձ޷ɾͷ + if(*L == NULL || (*L)->Node.hp == NULL) { + return ERROR; + } + + p = (*L)->Node.hp; + (*L)->Node.hp = p->tp; + p->tp = NULL; + + *e = p; + + return OK; +} + +/* + * + * + * visitʹL + */ +void Traverse(GList L, void(Visit)(AtomType)) { + if(L == NULL) { + return; + } + + if(L->tag == List) { + Traverse(L->Node.hp, Visit); + } else { + Visit(L->Node.atom); + } + + Traverse(L->tp, Visit); +} + +/* + * ͼλ + * + * L + */ +void PrintGraph(GList L) { + Print(L); + printf("\n"); +} + +/* + * ͼλڲʵ֡ + */ +static void Print(GList L) { + if(L == NULL) { + return; + } + + // + if(L->tag == List) { + printf("("); + + if(L->Node.hp) { + Print(L->Node.hp); + } + + if(L->tp) { + printf("),"); + Print(L->tp); + } else { + printf(")"); + } + + // ԭӽ + } else { + printf("%c", L->Node.atom); + if(L->tp) { + printf(","); + Print(L->tp); + } + } +} + +/* + * ǿմstrָ֣hsubΪһ','֮ǰӴstrΪһ','֮Ӵ + * + *ע + * 1.ַstrȷ޿հ׷ţ + * strſȥҲδȥ + * 2.ɺstrҲᷢ仯 + */ +static void sever(SString hstr, SString str) { + int i, k, n; + SString ch; + + n = StrLength(str); + + i = 0; // ַʱα + k = 0; // δ + + do { + ++i; + + // ȡstrһַ + SubString(ch, str, i, 1); + + if(ch[1] == '(') { + ++k; + } + if(ch[1] == ')') { + --k; + } + } while(i < n && (ch[1] != ',' || k != 0)); + + if(i < n) { + SubString(hstr, str, 1, i - 1); + SubString(str, str, i + 1, n - i); + } else { + StrCopy(hstr, str); + ClearString(str); + } +} diff --git a/Dev-C++/ExerciseBook/05.30.2/GList-E.h b/Dev-C++/ExerciseBook/05.30.2/GList-E.h new file mode 100644 index 0000000..fa9af82 --- /dev/null +++ b/Dev-C++/ExerciseBook/05.30.2/GList-E.h @@ -0,0 +1,146 @@ +/*=========================== + * չ洢ʾ + ============================*/ + +#ifndef GLIST_E_H +#define GLIST_E_H + +#include +#include // ṩ mallocreallocfreeexit ԭ +#include "Status.h" //**01 **// +#include "SString.h" //**04 **// + +/* ԭԪ */ +typedef char AtomType; //ԭ + +/* + * + * + * Atom-0ԭӽ + * List-1 + */ +typedef enum { Atom, List } ElemTag; + +/* չ洢ʾͶ */ +typedef struct GLNode { + ElemTag tag; // ǣԭӽͱ + + // ԭӽͱϲ + union + { + AtomType atom; // atomԭӽֵAtomTypeû + struct GLNode* hp; // ָͷ + } Node; + struct GLNode* tp; // ָβ +} GLNode; + +/* */ +typedef GLNode* GList; + + +/* + * ʼ + * + * ʼյĹΪ0Ϊ1 + * + *ע + * Ҫÿһſ + */ +Status InitGList(GList* L); + +/* + * + * + * ַSL + */ +Status CreateGList(GList* L, SString S); + +/* + * + * + * ͷŹռڴ档 + */ +Status DestroyGList(GList* L); + +/* + * + * + * ɹLƵõT + */ +Status CopyGList(GList* T, GList L); + +/* + * + * + * عijȡ + */ +int GListLength(GList L); + +/* + * + * + * ع + */ +int GListDepth(GList L); + +/* + * п + * + * жϹǷΪա + */ +Status GListEmpty(GList L); + +/* + * ͷ + */ +GList GetHead(GList L); + +/* + * β + */ +GList GetTail(GList L); + +/* + * + * + * ԪeΪLĵһԪء + */ +Status InsertFirst(GList* L, GList e); + +/* + * ɾ + * + * LĵһԪɾeء + */ +Status DeleteFirst(GList* L, GList* e); + +/* + * + * + * visitʹL + */ +void Traverse(GList L, void(Visit)(AtomType)); + +/* + * ͼλ + * + * L + */ +void PrintGraph(GList L); + +/* + * ͼλڲʵ֡ + */ +static void Print(GList L); + +/* + * ǿմstrָ֣hsubΪһ','֮ǰӴstrΪһ','֮Ӵ + * + *ע + * 1.ַstrȷ޿հ׷ţ + * strſȥҲδȥ + * 2.ɺstrҲᷢ仯 + */ +static void sever(SString hstr, SString str); + +#endif diff --git a/Dev-C++/ExerciseBook/05.30.2/SString.cpp b/Dev-C++/ExerciseBook/05.30.2/SString.cpp new file mode 100644 index 0000000..7a96fcf --- /dev/null +++ b/Dev-C++/ExerciseBook/05.30.2/SString.cpp @@ -0,0 +1,195 @@ +/*============================= + * Ķ˳洢ʾ˳򴮣 + * + * 㷨: 4.14.24.34.5 + ==============================*/ + +#include "SString.h" //**04 **// + +/* + * ʼ + * + * һֵΪcharsĴT + * + *ע + * òСӼ + */ +Status StrAssign(SString T, const char* chars) { + int i, len; + + len = (int) strlen(chars); + + // chars + if(len > MAXSTRLEN) { + return ERROR; + } + + T[0] = len; + for(i = 1; i <= len; i++) { + T[i] = chars[i - 1]; + } + + return OK; +} + +/* + * + * + * Sա + */ +Status ClearString(SString S) { + // ֻҪΪ0Ϳ + S[0] = 0; + return OK; +} + +/* + * п + * + * жϴSǷЧݡ + * + * ֵ + * TRUE : SΪ + * FALSE: SΪ + */ +Status StrEmpty(SString S) { + return S[0] == 0 ? TRUE : FALSE; +} + +/* + * + * + * شSԪصĸ + * + *ע + * òСӼ + */ +int StrLength(SString S) { + return S[0]; +} + +/* + * 㷨4.3 + * + * Ӵ + * + * SubS[pos, pos+len-1] + * ֵָʾǷȡɹ + * + *ע + * òСӼ + */ +Status SubString(SString Sub, SString S, int pos, int len) { + int i; + + if(pos < 1 || pos > S[0] || len < 0 || pos + len - 1 > S[0]) { + return ERROR; + } + + // Ԫ + for(i = 1; i <= len; i++) { + Sub[i] = S[pos + i - 1]; + } + + // ȷ³ + Sub[0] = len; + + return OK; +} + +/* + * ɾ + * + * ɾS[pos, pos+len-1] + */ +Status StrDelete(SString S, int pos, int len) { + int i; + + if(pos < 1 || pos + len - 1 > S[0] || len < 0) { + return ERROR; + } + + // ɾijΪ0ǰ + if(len == 0) { + return OK; + } + + // ѺԪŲǰ棬ǵɾԪ + for(i = pos + len; i <= S[0]; i++) { + S[i - len] = S[i]; + } + + // ȼ + S[0] -= len; + + return OK; +} + +/* + * Ƚ + * + * ȽϴSʹTرȽϽ + * + *ע + * òСӼ + */ +int StrCompare(SString S, SString T) { + int i = 1; + + while(i <= S[0] && i <= T[0]) { + // ַͬʱȽС + if(S[i] != T[i]) { + return S[i] - T[i]; + } + + i++; + } + + return S[0] - T[0]; +} + +/* + * + * + * SƵT + */ +Status StrCopy(SString T, SString S) { + int i; + + // ͬϢһ + for(i = 0; i <= S[0]; i++) { + T[i] = S[i]; + } + + return OK; +} + +/* + * ַSеĿհףɴӡַո + * + *ע + * úڱġ + */ +Status ClearBlank(SString S) { + int i, j; + + // ǿմ + if(S[0] == 0) { + return ERROR; + } + + for(i = 1, j = 0; i <= S[0]; i++) { + // հףԹ + if(S[i] == ' ' || !isprint(S[i])) { + continue; + } + + j++; + + S[j] = S[i]; + } + + S[0] = j; + + return OK; +} diff --git a/Dev-C++/ExerciseBook/05.30.2/SString.h b/Dev-C++/ExerciseBook/05.30.2/SString.h new file mode 100644 index 0000000..0632f18 --- /dev/null +++ b/Dev-C++/ExerciseBook/05.30.2/SString.h @@ -0,0 +1,117 @@ +/*============================= + * Ķ˳洢ʾ˳򴮣 + * + * 㷨: 4.14.24.34.5 + ==============================*/ + +#ifndef SSTRING_H +#define SSTRING_H + +#include +#include // ṩ strlen ԭ +#include // ṩ isprint ԭ +#include "Status.h" //**01 **// + +/* 궨 */ +#define MAXSTRLEN 255 // ˳򴮵󴮳 + +/* + * ˳洢Ͷ + * + * עЧԪشSString1ŵԪʼ洢 + * SString0ŵԪ洢䳤 + */ +typedef unsigned char SString[MAXSTRLEN + 1]; // 0ŵԪŴij + + +/* + * ʾ + * + * ѭ̲ĵдϰߣposָʾַλ()1ʼ + */ + + +/* + * ʼ + * + * һֵΪcharsĴT + * + *ע + * òСӼ + */ +Status StrAssign(SString T, const char* chars); + +/* + * + * + * Sա + */ +Status ClearString(SString S); + +/* + * п + * + * жϴSǷЧݡ + * + * ֵ + * TRUE : SΪ + * FALSE: SΪ + */ +Status StrEmpty(SString S); + +/* + * + * + * شSԪصĸ + * + *ע + * òСӼ + */ +int StrLength(SString S); + +/* + * 㷨4.3 + * + * Ӵ + * + * SubS[pos, pos+len-1] + * ֵָʾǷȡɹ + * + *ע + * òСӼ + */ +Status SubString(SString Sub, SString S, int pos, int len); + +/* + * ɾ + * + * ɾS[pos, pos+len-1] + */ +Status StrDelete(SString S, int pos, int len); + +/* + * Ƚ + * + * ȽϴSʹTرȽϽ + * + *ע + * òСӼ + */ +int StrCompare(SString S, SString T); + +/* + * + * + * SƵT + */ +Status StrCopy(SString T, SString S); + +/* + * ַSеĿհףɴӡַո + * + *ע + * úڱġ + */ +Status ClearBlank(SString S); + +#endif diff --git a/Dev-C++/ExerciseBook/05.31/05.31.cpp b/Dev-C++/ExerciseBook/05.31/05.31.cpp new file mode 100644 index 0000000..da70a36 --- /dev/null +++ b/Dev-C++/ExerciseBook/05.31/05.31.cpp @@ -0,0 +1,43 @@ +#include +#include "Status.h" //**01 **// +#include "SString.h" //**04 **// +#include "GList-E.h" //**05 ͹**// + +/* + * ƣչ洢ʾ + * + *ע + * úGList-Eļж + */ +Status Algo_5_31(GList* T, GList L); + + +int main(int argc, char* argv[]) { + GList L, T; + char* s = "((),(e),(a,(b,c,d)))"; + SString S; + + printf(" L ...\n"); + StrAssign(S, s); + CreateGList(&L, S); + printf("L = "); + PrintGraph(L); + + printf("ƹ L T...\n"); + Algo_5_31(&T, L); + printf("T = "); + PrintGraph(T); + + return 0; +} + + +/* + * ƣչ洢ʾ + * + *ע + * úGList-Eļж + */ +Status Algo_5_31(GList* T, GList L) { + return CopyGList(T, L); +} diff --git a/Dev-C++/ExerciseBook/05.31/05.31.dev b/Dev-C++/ExerciseBook/05.31/05.31.dev new file mode 100644 index 0000000..4424705 --- /dev/null +++ b/Dev-C++/ExerciseBook/05.31/05.31.dev @@ -0,0 +1,102 @@ +[Project] +FileName=05.31.dev +Name=05.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=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 + +[Unit4] +FileName=SString.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit2] +FileName=GList-E.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit1] +FileName=05.31.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit3] +FileName=GList-E.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit5] +FileName=SString.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + diff --git a/Dev-C++/ExerciseBook/05.31/GList-E.cpp b/Dev-C++/ExerciseBook/05.31/GList-E.cpp new file mode 100644 index 0000000..3fc0ad9 --- /dev/null +++ b/Dev-C++/ExerciseBook/05.31/GList-E.cpp @@ -0,0 +1,449 @@ +/*=========================== + * չ洢ʾ + ============================*/ + +#include "GList-E.h" //**05 ͹**// + +/* + * ʼ + * + * ʼյĹΪ0Ϊ1 + * + *ע + * Ҫÿһſ + */ +Status InitGList(GList* L) { + if(L == NULL) { + return ERROR; + } + + *L = (GList) malloc(sizeof(GLNode)); + if(!*L) { + exit(OVERFLOW); + } + + (*L)->tag = List; + (*L)->Node.hp = NULL; + (*L)->tp = NULL; + + return OK; +} + +/* + * + * + * ַSL + */ +Status CreateGList(GList* L, SString S) { + SString emp, hsub, sub, tmp; + + if(L == NULL) { + return ERROR; + } + + // ַSеĿհףɴӡַո + ClearBlank(S); + + if(StrEmpty(S)) { + return ERROR; + } + + // Ϊ˲ƻS + StrCopy(sub, S); + + /* + * ִеʱ + * ٴִеʱѾȥ + */ + sever(hsub, sub); + + *L = (GList) malloc(sizeof(GLNode)); + if(*L == NULL) { + exit(OVERFLOW); + } + + StrAssign(emp, "()"); + + if(!StrCompare(hsub, emp)) { + (*L)->tag = List; + (*L)->Node.hp = NULL; + } else { + if(StrLength(hsub) == 1) { + (*L)->tag = Atom; + (*L)->Node.atom = hsub[1]; + } else { + (*L)->tag = List; + + SubString(tmp, hsub, 2, StrLength(hsub) - 2); + + CreateGList(&((*L)->Node.hp), tmp); + } + } + + // ڶβ˳ݹ + if(StrEmpty(sub)) { + (*L)->tp = NULL; + } else { + // ݹβ + CreateGList(&((*L)->tp), sub); + } + + return OK; +} + +/* + * + * + * ͷŹռڴ档 + */ +Status DestroyGList(GList* L) { + GList head, tail; + + if(L == NULL || *L == NULL) { + return ERROR; + } + + // ӱ + if((*L)->tag == List) { + head = (*L)->Node.hp; // ͷ + tail = (*L)->tp; // β + + free(*L); + *L = NULL; + + // ݹ鴦ͷ + if(head != NULL) { + DestroyGList(&head); + } + + // ݹ鴦β + if(tail != NULL) { + DestroyGList(&tail); + } + + // ԭӽ + } else { + tail = (*L)->tp; // β + + free(*L); + *L = NULL; + + if(tail != NULL) { + DestroyGList(&tail); + } + } + + return OK; +} + +/* + * + * + * ɹLƵõT + */ +Status CopyGList(GList* T, GList L) { + + if(L == NULL) { + return ERROR; + } + + *T = (GList) malloc(sizeof(GLNode)); + if(*T == NULL) { + exit(OVERFLOW); + } + + // ԭ + if(L->tag == Atom) { + (*T)->tag = Atom; + (*T)->Node.atom = L->Node.atom; + + // ӱ + } else { + (*T)->tag = List; + + // Ʊͷ + if(L->Node.hp != NULL) { + CopyGList(&((*T)->Node.hp), L->Node.hp); + } else { + (*T)->Node.hp = NULL; + } + } + + // Ʊβ + if(L->tp != NULL) { + CopyGList(&((*T)->tp), L->tp); + } else { + (*T)->tp = NULL; + } + + return OK; +} + +/* + * + * + * عijȡ + */ +int GListLength(GList L) { + int count = 0; + GList p; + + // + if(L == NULL) { + return -1; + } + + p = L->Node.hp; + + while(p != NULL) { + ++count; + p = p->tp; + } + + return count; +} + +/* + * + * + * ع + */ +int GListDepth(GList L) { + int max, deep; + GList p; + + max = 0; + + // + if(L == NULL) { + return -1; + } + + // ձΪ1 + if(L->tag == List && !L->Node.hp) { + return 1; + } + + // ԭΪ0 + if(L->tag == Atom) { + return 0; + } + + // ݹӱ + for(p = L->Node.hp; p != NULL; p = p->tp) { + // pΪͷָӱ + deep = GListDepth(p); + if(deep > max) { + max = deep; + } + } + + return max + 1; +} + +/* + * п + * + * жϹǷΪա + */ +Status GListEmpty(GList L) { + // + if(L == NULL) { + return ERROR; + } + + if(L->tag == List && L->Node.hp == NULL && L->tp == NULL) { + return TRUE; + } else { + return ERROR; + } +} + +/* + * ͷ + */ +GList GetHead(GList L) { + GList p, q; + + // ڻΪձ޷ȡͷ + if(L == NULL || L->Node.hp == NULL) { + return NULL; + } + + q = L->Node.hp->tp; // ʱLıβϢ + L->Node.hp->tp = NULL; // ȥLıβ + + CopyGList(&p, L->Node.hp); // ƱͷϢαβ + + L->Node.hp->tp = q; // ָLıβϢ + + return p; +} + +/* + * β + */ +GList GetTail(GList L) { + GList p, q; + + // ڻΪձ޷ȡβ + if(L == NULL || L->Node.hp == NULL) { + return NULL; + } + + q = L->Node.hp; // ʱLıͷϢ + L->Node.hp = q->tp; // ժLıͷ + + CopyGList(&p, L); // ƱβϢαͷ + + q->tp = L->Node.hp; // ָLıͷϢ + L->Node.hp = q; + + return p; +} + +/* + * + * + * ԪeΪLĵһԪء + */ +Status InsertFirst(GList* L, GList e) { + + // + if(L == NULL || *L == NULL) { + return ERROR; + } + + if(e == NULL) { + return ERROR; + } + + e->tp = (*L)->Node.hp; + (*L)->Node.hp = e; + + return OK; +} + +/* + * ɾ + * + * LĵһԪɾeء + */ +Status DeleteFirst(GList* L, GList* e) { + GList p; + + // ڻΪձ޷ɾͷ + if(*L == NULL || (*L)->Node.hp == NULL) { + return ERROR; + } + + p = (*L)->Node.hp; + (*L)->Node.hp = p->tp; + p->tp = NULL; + + *e = p; + + return OK; +} + +/* + * + * + * visitʹL + */ +void Traverse(GList L, void(Visit)(AtomType)) { + if(L == NULL) { + return; + } + + if(L->tag == List) { + Traverse(L->Node.hp, Visit); + } else { + Visit(L->Node.atom); + } + + Traverse(L->tp, Visit); +} + +/* + * ͼλ + * + * L + */ +void PrintGraph(GList L) { + Print(L); + printf("\n"); +} + +/* + * ͼλڲʵ֡ + */ +static void Print(GList L) { + if(L == NULL) { + return; + } + + // + if(L->tag == List) { + printf("("); + + if(L->Node.hp) { + Print(L->Node.hp); + } + + if(L->tp) { + printf("),"); + Print(L->tp); + } else { + printf(")"); + } + + // ԭӽ + } else { + printf("%c", L->Node.atom); + if(L->tp) { + printf(","); + Print(L->tp); + } + } +} + +/* + * ǿմstrָ֣hsubΪһ','֮ǰӴstrΪһ','֮Ӵ + * + *ע + * 1.ַstrȷ޿հ׷ţ + * strſȥҲδȥ + * 2.ɺstrҲᷢ仯 + */ +static void sever(SString hstr, SString str) { + int i, k, n; + SString ch; + + n = StrLength(str); + + i = 0; // ַʱα + k = 0; // δ + + do { + ++i; + + // ȡstrһַ + SubString(ch, str, i, 1); + + if(ch[1] == '(') { + ++k; + } + if(ch[1] == ')') { + --k; + } + } while(i < n && (ch[1] != ',' || k != 0)); + + if(i < n) { + SubString(hstr, str, 1, i - 1); + SubString(str, str, i + 1, n - i); + } else { + StrCopy(hstr, str); + ClearString(str); + } +} diff --git a/Dev-C++/ExerciseBook/05.31/GList-E.h b/Dev-C++/ExerciseBook/05.31/GList-E.h new file mode 100644 index 0000000..fa9af82 --- /dev/null +++ b/Dev-C++/ExerciseBook/05.31/GList-E.h @@ -0,0 +1,146 @@ +/*=========================== + * չ洢ʾ + ============================*/ + +#ifndef GLIST_E_H +#define GLIST_E_H + +#include +#include // ṩ mallocreallocfreeexit ԭ +#include "Status.h" //**01 **// +#include "SString.h" //**04 **// + +/* ԭԪ */ +typedef char AtomType; //ԭ + +/* + * + * + * Atom-0ԭӽ + * List-1 + */ +typedef enum { Atom, List } ElemTag; + +/* չ洢ʾͶ */ +typedef struct GLNode { + ElemTag tag; // ǣԭӽͱ + + // ԭӽͱϲ + union + { + AtomType atom; // atomԭӽֵAtomTypeû + struct GLNode* hp; // ָͷ + } Node; + struct GLNode* tp; // ָβ +} GLNode; + +/* */ +typedef GLNode* GList; + + +/* + * ʼ + * + * ʼյĹΪ0Ϊ1 + * + *ע + * Ҫÿһſ + */ +Status InitGList(GList* L); + +/* + * + * + * ַSL + */ +Status CreateGList(GList* L, SString S); + +/* + * + * + * ͷŹռڴ档 + */ +Status DestroyGList(GList* L); + +/* + * + * + * ɹLƵõT + */ +Status CopyGList(GList* T, GList L); + +/* + * + * + * عijȡ + */ +int GListLength(GList L); + +/* + * + * + * ع + */ +int GListDepth(GList L); + +/* + * п + * + * жϹǷΪա + */ +Status GListEmpty(GList L); + +/* + * ͷ + */ +GList GetHead(GList L); + +/* + * β + */ +GList GetTail(GList L); + +/* + * + * + * ԪeΪLĵһԪء + */ +Status InsertFirst(GList* L, GList e); + +/* + * ɾ + * + * LĵһԪɾeء + */ +Status DeleteFirst(GList* L, GList* e); + +/* + * + * + * visitʹL + */ +void Traverse(GList L, void(Visit)(AtomType)); + +/* + * ͼλ + * + * L + */ +void PrintGraph(GList L); + +/* + * ͼλڲʵ֡ + */ +static void Print(GList L); + +/* + * ǿմstrָ֣hsubΪһ','֮ǰӴstrΪһ','֮Ӵ + * + *ע + * 1.ַstrȷ޿հ׷ţ + * strſȥҲδȥ + * 2.ɺstrҲᷢ仯 + */ +static void sever(SString hstr, SString str); + +#endif diff --git a/Dev-C++/ExerciseBook/05.31/SString.cpp b/Dev-C++/ExerciseBook/05.31/SString.cpp new file mode 100644 index 0000000..7a96fcf --- /dev/null +++ b/Dev-C++/ExerciseBook/05.31/SString.cpp @@ -0,0 +1,195 @@ +/*============================= + * Ķ˳洢ʾ˳򴮣 + * + * 㷨: 4.14.24.34.5 + ==============================*/ + +#include "SString.h" //**04 **// + +/* + * ʼ + * + * һֵΪcharsĴT + * + *ע + * òСӼ + */ +Status StrAssign(SString T, const char* chars) { + int i, len; + + len = (int) strlen(chars); + + // chars + if(len > MAXSTRLEN) { + return ERROR; + } + + T[0] = len; + for(i = 1; i <= len; i++) { + T[i] = chars[i - 1]; + } + + return OK; +} + +/* + * + * + * Sա + */ +Status ClearString(SString S) { + // ֻҪΪ0Ϳ + S[0] = 0; + return OK; +} + +/* + * п + * + * жϴSǷЧݡ + * + * ֵ + * TRUE : SΪ + * FALSE: SΪ + */ +Status StrEmpty(SString S) { + return S[0] == 0 ? TRUE : FALSE; +} + +/* + * + * + * شSԪصĸ + * + *ע + * òСӼ + */ +int StrLength(SString S) { + return S[0]; +} + +/* + * 㷨4.3 + * + * Ӵ + * + * SubS[pos, pos+len-1] + * ֵָʾǷȡɹ + * + *ע + * òСӼ + */ +Status SubString(SString Sub, SString S, int pos, int len) { + int i; + + if(pos < 1 || pos > S[0] || len < 0 || pos + len - 1 > S[0]) { + return ERROR; + } + + // Ԫ + for(i = 1; i <= len; i++) { + Sub[i] = S[pos + i - 1]; + } + + // ȷ³ + Sub[0] = len; + + return OK; +} + +/* + * ɾ + * + * ɾS[pos, pos+len-1] + */ +Status StrDelete(SString S, int pos, int len) { + int i; + + if(pos < 1 || pos + len - 1 > S[0] || len < 0) { + return ERROR; + } + + // ɾijΪ0ǰ + if(len == 0) { + return OK; + } + + // ѺԪŲǰ棬ǵɾԪ + for(i = pos + len; i <= S[0]; i++) { + S[i - len] = S[i]; + } + + // ȼ + S[0] -= len; + + return OK; +} + +/* + * Ƚ + * + * ȽϴSʹTرȽϽ + * + *ע + * òСӼ + */ +int StrCompare(SString S, SString T) { + int i = 1; + + while(i <= S[0] && i <= T[0]) { + // ַͬʱȽС + if(S[i] != T[i]) { + return S[i] - T[i]; + } + + i++; + } + + return S[0] - T[0]; +} + +/* + * + * + * SƵT + */ +Status StrCopy(SString T, SString S) { + int i; + + // ͬϢһ + for(i = 0; i <= S[0]; i++) { + T[i] = S[i]; + } + + return OK; +} + +/* + * ַSеĿհףɴӡַո + * + *ע + * úڱġ + */ +Status ClearBlank(SString S) { + int i, j; + + // ǿմ + if(S[0] == 0) { + return ERROR; + } + + for(i = 1, j = 0; i <= S[0]; i++) { + // հףԹ + if(S[i] == ' ' || !isprint(S[i])) { + continue; + } + + j++; + + S[j] = S[i]; + } + + S[0] = j; + + return OK; +} diff --git a/Dev-C++/ExerciseBook/05.31/SString.h b/Dev-C++/ExerciseBook/05.31/SString.h new file mode 100644 index 0000000..0632f18 --- /dev/null +++ b/Dev-C++/ExerciseBook/05.31/SString.h @@ -0,0 +1,117 @@ +/*============================= + * Ķ˳洢ʾ˳򴮣 + * + * 㷨: 4.14.24.34.5 + ==============================*/ + +#ifndef SSTRING_H +#define SSTRING_H + +#include +#include // ṩ strlen ԭ +#include // ṩ isprint ԭ +#include "Status.h" //**01 **// + +/* 궨 */ +#define MAXSTRLEN 255 // ˳򴮵󴮳 + +/* + * ˳洢Ͷ + * + * עЧԪشSString1ŵԪʼ洢 + * SString0ŵԪ洢䳤 + */ +typedef unsigned char SString[MAXSTRLEN + 1]; // 0ŵԪŴij + + +/* + * ʾ + * + * ѭ̲ĵдϰߣposָʾַλ()1ʼ + */ + + +/* + * ʼ + * + * һֵΪcharsĴT + * + *ע + * òСӼ + */ +Status StrAssign(SString T, const char* chars); + +/* + * + * + * Sա + */ +Status ClearString(SString S); + +/* + * п + * + * жϴSǷЧݡ + * + * ֵ + * TRUE : SΪ + * FALSE: SΪ + */ +Status StrEmpty(SString S); + +/* + * + * + * شSԪصĸ + * + *ע + * òСӼ + */ +int StrLength(SString S); + +/* + * 㷨4.3 + * + * Ӵ + * + * SubS[pos, pos+len-1] + * ֵָʾǷȡɹ + * + *ע + * òСӼ + */ +Status SubString(SString Sub, SString S, int pos, int len); + +/* + * ɾ + * + * ɾS[pos, pos+len-1] + */ +Status StrDelete(SString S, int pos, int len); + +/* + * Ƚ + * + * ȽϴSʹTرȽϽ + * + *ע + * òСӼ + */ +int StrCompare(SString S, SString T); + +/* + * + * + * SƵT + */ +Status StrCopy(SString T, SString S); + +/* + * ַSеĿհףɴӡַո + * + *ע + * úڱġ + */ +Status ClearBlank(SString S); + +#endif diff --git a/Dev-C++/ExerciseBook/05.32.1/05.32.1.cpp b/Dev-C++/ExerciseBook/05.32.1/05.32.1.cpp new file mode 100644 index 0000000..49d7e91 --- /dev/null +++ b/Dev-C++/ExerciseBook/05.32.1/05.32.1.cpp @@ -0,0 +1,64 @@ +#include +#include "Status.h" //**01 **// +#include "SString.h" //**04 **// +#include "GList-HT.h" //**05 ͹**// + +/* + * жϹǷȣͷβ洢ʾ + */ +Status Algo_5_32_1(GList A, GList B); + + +int main(int argc, char* argv[]) { + GList A, B; + char* a = "((),(e),(a,(b,c,d)))"; + char* b = "((),(e),(a,(b,c,f)))"; + SString Sa, Sb; + + printf(" AB ...\n"); + StrAssign(Sa, a); + CreateGList(&A, Sa); + StrAssign(Sb, b); + CreateGList(&B, Sb); + printf("A = "); + PrintGraph(A); + printf("B = "); + PrintGraph(B); + + Algo_5_32_1(A, B) ? printf("ȣ\n") : printf("ȣ\n"); + + return 0; +} + + +/* + * жϹǷȣͷβ洢ʾ + */ +Status Algo_5_32_1(GList A, GList B) { + if(!A && !B) { + return TRUE; // ձ + } + + // Ϊ + if(A && B) { + // Ԫͬ + if(A->tag == B->tag) { + // ԭӽ + if(A->tag == Atom) { + if(A->Node.atom == B->Node.atom) { + return TRUE; + } + + // + } else { + if(Algo_5_32_1(A->Node.ptr.hp, B->Node.ptr.hp) == TRUE) { + if(Algo_5_32_1(A->Node.ptr.tp, B->Node.ptr.tp) == TRUE) { + return TRUE; + } + } + } + } + } + + return FALSE; +} diff --git a/Dev-C++/ExerciseBook/05.32.1/05.32.1.dev b/Dev-C++/ExerciseBook/05.32.1/05.32.1.dev new file mode 100644 index 0000000..85de419 --- /dev/null +++ b/Dev-C++/ExerciseBook/05.32.1/05.32.1.dev @@ -0,0 +1,102 @@ +[Project] +FileName=05.32.1.dev +Name=05.32.1 +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 + +[Unit4] +FileName=SString.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit2] +FileName=GList-HT.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit1] +FileName=05.32.1.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit3] +FileName=GList-HT.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit5] +FileName=SString.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + diff --git a/Dev-C++/ExerciseBook/05.32.1/GList-HT.cpp b/Dev-C++/ExerciseBook/05.32.1/GList-HT.cpp new file mode 100644 index 0000000..bad30df --- /dev/null +++ b/Dev-C++/ExerciseBook/05.32.1/GList-HT.cpp @@ -0,0 +1,418 @@ +/*============================ + * ͷβ洢ʾ + * + * 㷨: 5.55.65.75.8 + =============================*/ + +#include "GList-HT.h" //**05 ͹**// + +/* + * ʼ + * + * ʼյĹΪ0Ϊ1 + * + *ע + * Ҫÿһȥſ + */ +Status InitGList(GList* L) { + if(L == NULL) { + return ERROR; + } + + *L = NULL; + + return OK; +} + +/* + * 㷨5.7 + * + * + * + * ַSL + */ +Status CreateGList(GList* L, SString S) { + SString emp; // չַ + SString hsub, sub; + GList p, q; + + if(L == NULL) { + return ERROR; + } + + // ַSеĿհףɴӡַո + ClearBlank(S); + + if(StrEmpty(S)) { + return ERROR; + } + + StrAssign(emp, "()"); + + /* + * 봮Ϊ()ҪյĹ + * + *ע + * ̲Ĵġ + * StrCompareķֵָʾַĴСָʾַǷȡ + * S()ȣֵӦ0 + */ + if(!StrCompare(S, emp)) { + *L = NULL; + } else { + *L = (GList) malloc(sizeof(GLNode)); + if(*L == NULL) { + exit(OVERFLOW); + } + + // ԭ + if(StrLength(S) == 1) { + (*L)->tag = Atom; + (*L)->Node.atom = S[1]; + } else { + (*L)->tag = List; + + p = *L; + + // ȥ + SubString(sub, S, 2, StrLength(S) - 2); + + // ظnӱ + do { + // subзͷhsubɺsubҲᷢ仯 + sever(hsub, sub); + + // ݹ鴴 + CreateGList(&(p->Node.ptr.hp), hsub); + + q = p; + + // βΪգҪβ + if(!StrEmpty(sub)) { + p = (GList) malloc(sizeof(GLNode)); + if(p == NULL) { + exit(OVERFLOW); + } + + p->tag = List; + + q->Node.ptr.tp = p; + } + } while(!StrEmpty(sub)); + + q->Node.ptr.tp = NULL; + } + } + + return OK; +} + +/* + * + * + * ͷŹռڴ档 + */ +Status DestroyGList(GList* L) { + GList head, tail; + + if(L == NULL || *L == NULL) { + return ERROR; + } + + // ɾԭӽ + if((*L)->tag == Atom) { + free(*L); + *L = NULL; + + // ɾӱ + } else { + head = (*L)->Node.ptr.hp; + tail = (*L)->Node.ptr.tp; + free(*L); + *L = NULL; + DestroyGList(&head); + DestroyGList(&tail); + } + + return OK; +} + +/* + * 㷨5.6 + * + * + * + * ɹLƵõT + */ +Status CopyGList(GList* T, GList L) { + if(T == NULL) { + return ERROR; + } + + if(L == NULL) { + *T = NULL; + } else { + // ½ + *T = (GList) malloc(sizeof(GLNode)); + if(*T == NULL) { + exit(OVERFLOW); + } + + (*T)->tag = L->tag; + + // Ƶԭ + if(L->tag == Atom) { + (*T)->Node.atom = L->Node.atom; + + // Ʊͷͱβ + } else { + CopyGList(&((*T)->Node.ptr.hp), L->Node.ptr.hp); + CopyGList(&((*T)->Node.ptr.tp), L->Node.ptr.tp); + } + } + + return OK; +} + +/* + * + * + * عijȡ + */ +int GListLength(GList L) { + int count; + + for(count = 0; L != NULL; count++, L = L->Node.ptr.tp) { + } + + return count; +} + +/* + * 㷨5.5 + * + * + * + * ع + */ +int GListDepth(GList L) { + int max, deep; + GList p; + + // ձΪ1 + if(L == NULL) { + return 1; + } + + // ԭΪ0 + if(L->tag == Atom) { + return 0; + } + + // ݹӱ + for(max = 0, p = L; p != NULL; p = p->Node.ptr.tp) { + deep = GListDepth(p->Node.ptr.hp); + if(deep > max) { + max = deep; + } + } + + // ǿձǸԪȼһ + return max + 1; +} + +/* + * п + * + * жϹǷΪա + */ +Status GListEmpty(GList L) { + return L == NULL ? TRUE : FALSE; +} + +/* + * ͷ + */ +GList GetHead(GList L) { + GList p; + + // ձޱͷﲻܷNULLȻֲʧ˻Ƿ˿ձ + if(L == NULL) { + exit(ERROR); + } + + CopyGList(&p, L->Node.ptr.hp); + + return p; +} + +/* + * β + */ +GList GetTail(GList L) { + GList p; + + // ձޱβﲻܷNULLȻֲʧ˻Ƿ˿ձ + if(L == NULL) { + exit(ERROR); + } + + CopyGList(&p, L->Node.ptr.tp); + + return p; +} + +/* + * + * + * ԪeΪLĵһԪء + */ +Status InsertFirst(GList* L, GList e) { + GList g; + + if(L == NULL) { + return ERROR; + } + + g = (GList) malloc(sizeof(GLNode)); + if(g == NULL) { + exit(OVERFLOW); + } + + g->tag = List; + g->Node.ptr.hp = e; + g->Node.ptr.tp = *L; + *L = g; + + return OK; +} + +/* + * ɾ + * + * LĵһԪɾeء + */ +Status DeleteFirst(GList* L, GList* e) { + GList p; + + // ձ޷ɾ + if(L == NULL || *L == NULL) { + return ERROR; + } + + p = *L; + *L = (*L)->Node.ptr.tp; + + CopyGList(e, p->Node.ptr.hp); + + free(p); + + return OK; +} + +/* + * + * + * visitʹL + */ +void Traverse(GList L, void(Visit)(AtomType)) { + + if(L == NULL) { + return; + } + + if(L->tag == Atom) { + Visit(L->Node.atom); + } else { + Traverse(L->Node.ptr.hp, Visit); + Traverse(L->Node.ptr.tp, Visit); + } + +} + +/* + * ͼλ + * + * L + */ +void PrintGraph(GList L) { + Print(L, Head); + printf("\n"); +} + +/* + * ͼλڲʵ֣markͼλǡ + */ +static void Print(GList L, Mark mark) { + // LΪ + if(L == NULL) { + if(mark == Head) { + printf("("); + } + + printf(")"); + + // LΪʱ + } else { + // ԭӽ㣬ԭ + if(L->tag == Atom) { + printf("%c", L->Node.atom); + + // ӱ㣬ҪԱͷβֱ + } else { + if(mark == Head) { + printf("("); + } else { + printf(","); + } + + Print(L->Node.ptr.hp, Head); + Print(L->Node.ptr.tp, Tail); + } + } +} + +/* + * 㷨5.8 + * + * ǿմstrָ֣hsubΪһ','֮ǰӴstrΪһ','֮Ӵ + * + *ע + * 1.ַstrȷ޿հ׷ţstrѾȥš + * 2.ɺstrҲᷢ仯 + */ +static void sever(SString hstr, SString str) { + int i, k, n; + SString ch; + + n = StrLength(str); + + i = 0; // ַʱα + k = 0; // δ + + do { + ++i; + + // ȡstrһַ + SubString(ch, str, i, 1); + + if(ch[1] == '(') { + ++k; + } + + if(ch[1] == ')') { + --k; + } + } while(i < n && (ch[1] != ',' || k != 0)); + + // ڶ + if(i < n) { + SubString(hstr, str, 1, i - 1); + SubString(str, str, i + 1, n - i); + + // ֻһ + } else { + StrCopy(hstr, str); + ClearString(str); + } +} diff --git a/Dev-C++/ExerciseBook/05.32.1/GList-HT.h b/Dev-C++/ExerciseBook/05.32.1/GList-HT.h new file mode 100644 index 0000000..508b96f --- /dev/null +++ b/Dev-C++/ExerciseBook/05.32.1/GList-HT.h @@ -0,0 +1,164 @@ +/*============================ + * ͷβ洢ʾ + * + * 㷨: 5.55.65.75.8 + =============================*/ + +#ifndef GLIST_HT_H +#define GLIST_HT_H + +#include +#include // ṩ mallocreallocfreeexit ԭ +#include "Status.h" //**01 **// +#include "SString.h" //**04 **// + +/* ԭԪ */ +typedef char AtomType; + +/* + * + * + * Atom-0ԭӽ + * List-1 + */ +typedef enum { Atom, List } ElemTag; + +/* ͷβ洢ʾͶ */ +typedef struct GLNode { + ElemTag tag; // ǣԭӽͱ + + // ԭӽͱϲ + union { + AtomType atom; // atomԭӽֵAtomTypeû + struct { + struct GLNode* hp; // ָͷ + struct GLNode* tp; // ָβ + } ptr; // ָ + } Node; +} GLNode; + +/* */ +typedef GLNode* GList; + +/* + * ͼλ + * + * HeadָԱͷ + * TailָԱβ + */ +typedef enum { Head, Tail } Mark; + + +/* + * ʼ + * + * ʼյĹΪ0Ϊ1 + * + *ע + * Ҫÿһȥſ + */ +Status InitGList(GList* L); + +/* + * 㷨5.7 + * + * + * + * ַSL + */ +Status CreateGList(GList* L, SString S); + +/* + * + * + * ͷŹռڴ档 + */ +Status DestroyGList(GList* L); + +/* + * 㷨5.6 + * + * + * + * ɹLƵõT + */ +Status CopyGList(GList* T, GList L); + +/* + * + * + * عijȡ + */ +int GListLength(GList L); + +/* + * 㷨5.5 + * + * + * + * ع + */ +int GListDepth(GList L); + +/* + * п + * + * жϹǷΪա + */ +Status GListEmpty(GList L); + +/* + * ͷ + */ +GList GetHead(GList L); + +/* + * β + */ +GList GetTail(GList L); + +/* + * + * + * ԪeΪLĵһԪء + */ +Status InsertFirst(GList* L, GList e); + +/* + * ɾ + * + * LĵһԪɾeء + */ +Status DeleteFirst(GList* L, GList* e); + +/* + * + * + * visitʹL + */ +void Traverse(GList L, void (Visit)(AtomType)); + +/* + * ͼλ + * + * L + */ +void PrintGraph(GList L); + +/* + * ͼλڲʵ֣markͼλǡ + */ +static void Print(GList L, Mark mark); + +/* + * 㷨5.8 + * + * ǿմstrָ֣hsubΪһ','֮ǰӴstrΪһ','֮Ӵ + * + *ע + * 1.ַstrȷ޿հ׷ţstrѾȥš + * 2.ɺstrҲᷢ仯 + */ +static void sever(SString hstr, SString str); + +#endif diff --git a/Dev-C++/ExerciseBook/05.32.1/SString.cpp b/Dev-C++/ExerciseBook/05.32.1/SString.cpp new file mode 100644 index 0000000..7a96fcf --- /dev/null +++ b/Dev-C++/ExerciseBook/05.32.1/SString.cpp @@ -0,0 +1,195 @@ +/*============================= + * Ķ˳洢ʾ˳򴮣 + * + * 㷨: 4.14.24.34.5 + ==============================*/ + +#include "SString.h" //**04 **// + +/* + * ʼ + * + * һֵΪcharsĴT + * + *ע + * òСӼ + */ +Status StrAssign(SString T, const char* chars) { + int i, len; + + len = (int) strlen(chars); + + // chars + if(len > MAXSTRLEN) { + return ERROR; + } + + T[0] = len; + for(i = 1; i <= len; i++) { + T[i] = chars[i - 1]; + } + + return OK; +} + +/* + * + * + * Sա + */ +Status ClearString(SString S) { + // ֻҪΪ0Ϳ + S[0] = 0; + return OK; +} + +/* + * п + * + * жϴSǷЧݡ + * + * ֵ + * TRUE : SΪ + * FALSE: SΪ + */ +Status StrEmpty(SString S) { + return S[0] == 0 ? TRUE : FALSE; +} + +/* + * + * + * شSԪصĸ + * + *ע + * òСӼ + */ +int StrLength(SString S) { + return S[0]; +} + +/* + * 㷨4.3 + * + * Ӵ + * + * SubS[pos, pos+len-1] + * ֵָʾǷȡɹ + * + *ע + * òСӼ + */ +Status SubString(SString Sub, SString S, int pos, int len) { + int i; + + if(pos < 1 || pos > S[0] || len < 0 || pos + len - 1 > S[0]) { + return ERROR; + } + + // Ԫ + for(i = 1; i <= len; i++) { + Sub[i] = S[pos + i - 1]; + } + + // ȷ³ + Sub[0] = len; + + return OK; +} + +/* + * ɾ + * + * ɾS[pos, pos+len-1] + */ +Status StrDelete(SString S, int pos, int len) { + int i; + + if(pos < 1 || pos + len - 1 > S[0] || len < 0) { + return ERROR; + } + + // ɾijΪ0ǰ + if(len == 0) { + return OK; + } + + // ѺԪŲǰ棬ǵɾԪ + for(i = pos + len; i <= S[0]; i++) { + S[i - len] = S[i]; + } + + // ȼ + S[0] -= len; + + return OK; +} + +/* + * Ƚ + * + * ȽϴSʹTرȽϽ + * + *ע + * òСӼ + */ +int StrCompare(SString S, SString T) { + int i = 1; + + while(i <= S[0] && i <= T[0]) { + // ַͬʱȽС + if(S[i] != T[i]) { + return S[i] - T[i]; + } + + i++; + } + + return S[0] - T[0]; +} + +/* + * + * + * SƵT + */ +Status StrCopy(SString T, SString S) { + int i; + + // ͬϢһ + for(i = 0; i <= S[0]; i++) { + T[i] = S[i]; + } + + return OK; +} + +/* + * ַSеĿհףɴӡַո + * + *ע + * úڱġ + */ +Status ClearBlank(SString S) { + int i, j; + + // ǿմ + if(S[0] == 0) { + return ERROR; + } + + for(i = 1, j = 0; i <= S[0]; i++) { + // հףԹ + if(S[i] == ' ' || !isprint(S[i])) { + continue; + } + + j++; + + S[j] = S[i]; + } + + S[0] = j; + + return OK; +} diff --git a/Dev-C++/ExerciseBook/05.32.1/SString.h b/Dev-C++/ExerciseBook/05.32.1/SString.h new file mode 100644 index 0000000..0632f18 --- /dev/null +++ b/Dev-C++/ExerciseBook/05.32.1/SString.h @@ -0,0 +1,117 @@ +/*============================= + * Ķ˳洢ʾ˳򴮣 + * + * 㷨: 4.14.24.34.5 + ==============================*/ + +#ifndef SSTRING_H +#define SSTRING_H + +#include +#include // ṩ strlen ԭ +#include // ṩ isprint ԭ +#include "Status.h" //**01 **// + +/* 궨 */ +#define MAXSTRLEN 255 // ˳򴮵󴮳 + +/* + * ˳洢Ͷ + * + * עЧԪشSString1ŵԪʼ洢 + * SString0ŵԪ洢䳤 + */ +typedef unsigned char SString[MAXSTRLEN + 1]; // 0ŵԪŴij + + +/* + * ʾ + * + * ѭ̲ĵдϰߣposָʾַλ()1ʼ + */ + + +/* + * ʼ + * + * һֵΪcharsĴT + * + *ע + * òСӼ + */ +Status StrAssign(SString T, const char* chars); + +/* + * + * + * Sա + */ +Status ClearString(SString S); + +/* + * п + * + * жϴSǷЧݡ + * + * ֵ + * TRUE : SΪ + * FALSE: SΪ + */ +Status StrEmpty(SString S); + +/* + * + * + * شSԪصĸ + * + *ע + * òСӼ + */ +int StrLength(SString S); + +/* + * 㷨4.3 + * + * Ӵ + * + * SubS[pos, pos+len-1] + * ֵָʾǷȡɹ + * + *ע + * òСӼ + */ +Status SubString(SString Sub, SString S, int pos, int len); + +/* + * ɾ + * + * ɾS[pos, pos+len-1] + */ +Status StrDelete(SString S, int pos, int len); + +/* + * Ƚ + * + * ȽϴSʹTرȽϽ + * + *ע + * òСӼ + */ +int StrCompare(SString S, SString T); + +/* + * + * + * SƵT + */ +Status StrCopy(SString T, SString S); + +/* + * ַSеĿհףɴӡַո + * + *ע + * úڱġ + */ +Status ClearBlank(SString S); + +#endif diff --git a/Dev-C++/ExerciseBook/05.32.2/05.32.2.cpp b/Dev-C++/ExerciseBook/05.32.2/05.32.2.cpp new file mode 100644 index 0000000..adc2453 --- /dev/null +++ b/Dev-C++/ExerciseBook/05.32.2/05.32.2.cpp @@ -0,0 +1,66 @@ +#include +#include "Status.h" //**01 **// +#include "SString.h" //**04 **// +#include "GList-E.h" //**05 ͹**// + +/* + * жϹǷȣչ洢ʾ + */ +Status Algo_5_32_2(GList A, GList B); + + +int main(int argc, char* argv[]) { + GList A, B; + char* a = "((),(e),(a,(b,c,d)))"; + char* b = "((),(e),(a,(b,c,f)))"; + SString Sa, Sb; + + printf(" AB ...\n"); + StrAssign(Sa, a); + CreateGList(&A, Sa); + StrAssign(Sb, b); + CreateGList(&B, Sb); + printf("A = "); + PrintGraph(A); + printf("B = "); + PrintGraph(B); + + Algo_5_32_2(A, B) ? printf("ȣ\n") : printf("ȣ\n"); + + return 0; +} + + +/* + * жϹǷȣչ洢ʾ + */ +Status Algo_5_32_2(GList A, GList B) { + if(!A && !B) { + return TRUE; // ձ + } + + // Ϊ + if(A && B) { + // Ԫͬ + if(A->tag == B->tag) { + // ԭӽ + if(A->tag == Atom) { + if(A->Node.atom == B->Node.atom) { + if(Algo_5_32_2(A->tp, B->tp) == TRUE) { + return TRUE; + } + } + + // + } else { + if(Algo_5_32_2(A->Node.hp, B->Node.hp) == TRUE) { + if(Algo_5_32_2(A->tp, B->tp) == TRUE) { + return TRUE; + } + } + } + } + } + + return FALSE; +} diff --git a/Dev-C++/ExerciseBook/05.32.2/05.32.2.dev b/Dev-C++/ExerciseBook/05.32.2/05.32.2.dev new file mode 100644 index 0000000..7117946 --- /dev/null +++ b/Dev-C++/ExerciseBook/05.32.2/05.32.2.dev @@ -0,0 +1,102 @@ +[Project] +FileName=05.32.2.dev +Name=05.32.2 +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 + +[Unit4] +FileName=SString.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit2] +FileName=GList-E.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit1] +FileName=05.32.2.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit3] +FileName=GList-E.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit5] +FileName=SString.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + diff --git a/Dev-C++/ExerciseBook/05.32.2/GList-E.cpp b/Dev-C++/ExerciseBook/05.32.2/GList-E.cpp new file mode 100644 index 0000000..3fc0ad9 --- /dev/null +++ b/Dev-C++/ExerciseBook/05.32.2/GList-E.cpp @@ -0,0 +1,449 @@ +/*=========================== + * չ洢ʾ + ============================*/ + +#include "GList-E.h" //**05 ͹**// + +/* + * ʼ + * + * ʼյĹΪ0Ϊ1 + * + *ע + * Ҫÿһſ + */ +Status InitGList(GList* L) { + if(L == NULL) { + return ERROR; + } + + *L = (GList) malloc(sizeof(GLNode)); + if(!*L) { + exit(OVERFLOW); + } + + (*L)->tag = List; + (*L)->Node.hp = NULL; + (*L)->tp = NULL; + + return OK; +} + +/* + * + * + * ַSL + */ +Status CreateGList(GList* L, SString S) { + SString emp, hsub, sub, tmp; + + if(L == NULL) { + return ERROR; + } + + // ַSеĿհףɴӡַո + ClearBlank(S); + + if(StrEmpty(S)) { + return ERROR; + } + + // Ϊ˲ƻS + StrCopy(sub, S); + + /* + * ִеʱ + * ٴִеʱѾȥ + */ + sever(hsub, sub); + + *L = (GList) malloc(sizeof(GLNode)); + if(*L == NULL) { + exit(OVERFLOW); + } + + StrAssign(emp, "()"); + + if(!StrCompare(hsub, emp)) { + (*L)->tag = List; + (*L)->Node.hp = NULL; + } else { + if(StrLength(hsub) == 1) { + (*L)->tag = Atom; + (*L)->Node.atom = hsub[1]; + } else { + (*L)->tag = List; + + SubString(tmp, hsub, 2, StrLength(hsub) - 2); + + CreateGList(&((*L)->Node.hp), tmp); + } + } + + // ڶβ˳ݹ + if(StrEmpty(sub)) { + (*L)->tp = NULL; + } else { + // ݹβ + CreateGList(&((*L)->tp), sub); + } + + return OK; +} + +/* + * + * + * ͷŹռڴ档 + */ +Status DestroyGList(GList* L) { + GList head, tail; + + if(L == NULL || *L == NULL) { + return ERROR; + } + + // ӱ + if((*L)->tag == List) { + head = (*L)->Node.hp; // ͷ + tail = (*L)->tp; // β + + free(*L); + *L = NULL; + + // ݹ鴦ͷ + if(head != NULL) { + DestroyGList(&head); + } + + // ݹ鴦β + if(tail != NULL) { + DestroyGList(&tail); + } + + // ԭӽ + } else { + tail = (*L)->tp; // β + + free(*L); + *L = NULL; + + if(tail != NULL) { + DestroyGList(&tail); + } + } + + return OK; +} + +/* + * + * + * ɹLƵõT + */ +Status CopyGList(GList* T, GList L) { + + if(L == NULL) { + return ERROR; + } + + *T = (GList) malloc(sizeof(GLNode)); + if(*T == NULL) { + exit(OVERFLOW); + } + + // ԭ + if(L->tag == Atom) { + (*T)->tag = Atom; + (*T)->Node.atom = L->Node.atom; + + // ӱ + } else { + (*T)->tag = List; + + // Ʊͷ + if(L->Node.hp != NULL) { + CopyGList(&((*T)->Node.hp), L->Node.hp); + } else { + (*T)->Node.hp = NULL; + } + } + + // Ʊβ + if(L->tp != NULL) { + CopyGList(&((*T)->tp), L->tp); + } else { + (*T)->tp = NULL; + } + + return OK; +} + +/* + * + * + * عijȡ + */ +int GListLength(GList L) { + int count = 0; + GList p; + + // + if(L == NULL) { + return -1; + } + + p = L->Node.hp; + + while(p != NULL) { + ++count; + p = p->tp; + } + + return count; +} + +/* + * + * + * ع + */ +int GListDepth(GList L) { + int max, deep; + GList p; + + max = 0; + + // + if(L == NULL) { + return -1; + } + + // ձΪ1 + if(L->tag == List && !L->Node.hp) { + return 1; + } + + // ԭΪ0 + if(L->tag == Atom) { + return 0; + } + + // ݹӱ + for(p = L->Node.hp; p != NULL; p = p->tp) { + // pΪͷָӱ + deep = GListDepth(p); + if(deep > max) { + max = deep; + } + } + + return max + 1; +} + +/* + * п + * + * жϹǷΪա + */ +Status GListEmpty(GList L) { + // + if(L == NULL) { + return ERROR; + } + + if(L->tag == List && L->Node.hp == NULL && L->tp == NULL) { + return TRUE; + } else { + return ERROR; + } +} + +/* + * ͷ + */ +GList GetHead(GList L) { + GList p, q; + + // ڻΪձ޷ȡͷ + if(L == NULL || L->Node.hp == NULL) { + return NULL; + } + + q = L->Node.hp->tp; // ʱLıβϢ + L->Node.hp->tp = NULL; // ȥLıβ + + CopyGList(&p, L->Node.hp); // ƱͷϢαβ + + L->Node.hp->tp = q; // ָLıβϢ + + return p; +} + +/* + * β + */ +GList GetTail(GList L) { + GList p, q; + + // ڻΪձ޷ȡβ + if(L == NULL || L->Node.hp == NULL) { + return NULL; + } + + q = L->Node.hp; // ʱLıͷϢ + L->Node.hp = q->tp; // ժLıͷ + + CopyGList(&p, L); // ƱβϢαͷ + + q->tp = L->Node.hp; // ָLıͷϢ + L->Node.hp = q; + + return p; +} + +/* + * + * + * ԪeΪLĵһԪء + */ +Status InsertFirst(GList* L, GList e) { + + // + if(L == NULL || *L == NULL) { + return ERROR; + } + + if(e == NULL) { + return ERROR; + } + + e->tp = (*L)->Node.hp; + (*L)->Node.hp = e; + + return OK; +} + +/* + * ɾ + * + * LĵһԪɾeء + */ +Status DeleteFirst(GList* L, GList* e) { + GList p; + + // ڻΪձ޷ɾͷ + if(*L == NULL || (*L)->Node.hp == NULL) { + return ERROR; + } + + p = (*L)->Node.hp; + (*L)->Node.hp = p->tp; + p->tp = NULL; + + *e = p; + + return OK; +} + +/* + * + * + * visitʹL + */ +void Traverse(GList L, void(Visit)(AtomType)) { + if(L == NULL) { + return; + } + + if(L->tag == List) { + Traverse(L->Node.hp, Visit); + } else { + Visit(L->Node.atom); + } + + Traverse(L->tp, Visit); +} + +/* + * ͼλ + * + * L + */ +void PrintGraph(GList L) { + Print(L); + printf("\n"); +} + +/* + * ͼλڲʵ֡ + */ +static void Print(GList L) { + if(L == NULL) { + return; + } + + // + if(L->tag == List) { + printf("("); + + if(L->Node.hp) { + Print(L->Node.hp); + } + + if(L->tp) { + printf("),"); + Print(L->tp); + } else { + printf(")"); + } + + // ԭӽ + } else { + printf("%c", L->Node.atom); + if(L->tp) { + printf(","); + Print(L->tp); + } + } +} + +/* + * ǿմstrָ֣hsubΪһ','֮ǰӴstrΪһ','֮Ӵ + * + *ע + * 1.ַstrȷ޿հ׷ţ + * strſȥҲδȥ + * 2.ɺstrҲᷢ仯 + */ +static void sever(SString hstr, SString str) { + int i, k, n; + SString ch; + + n = StrLength(str); + + i = 0; // ַʱα + k = 0; // δ + + do { + ++i; + + // ȡstrһַ + SubString(ch, str, i, 1); + + if(ch[1] == '(') { + ++k; + } + if(ch[1] == ')') { + --k; + } + } while(i < n && (ch[1] != ',' || k != 0)); + + if(i < n) { + SubString(hstr, str, 1, i - 1); + SubString(str, str, i + 1, n - i); + } else { + StrCopy(hstr, str); + ClearString(str); + } +} diff --git a/Dev-C++/ExerciseBook/05.32.2/GList-E.h b/Dev-C++/ExerciseBook/05.32.2/GList-E.h new file mode 100644 index 0000000..fa9af82 --- /dev/null +++ b/Dev-C++/ExerciseBook/05.32.2/GList-E.h @@ -0,0 +1,146 @@ +/*=========================== + * չ洢ʾ + ============================*/ + +#ifndef GLIST_E_H +#define GLIST_E_H + +#include +#include // ṩ mallocreallocfreeexit ԭ +#include "Status.h" //**01 **// +#include "SString.h" //**04 **// + +/* ԭԪ */ +typedef char AtomType; //ԭ + +/* + * + * + * Atom-0ԭӽ + * List-1 + */ +typedef enum { Atom, List } ElemTag; + +/* չ洢ʾͶ */ +typedef struct GLNode { + ElemTag tag; // ǣԭӽͱ + + // ԭӽͱϲ + union + { + AtomType atom; // atomԭӽֵAtomTypeû + struct GLNode* hp; // ָͷ + } Node; + struct GLNode* tp; // ָβ +} GLNode; + +/* */ +typedef GLNode* GList; + + +/* + * ʼ + * + * ʼյĹΪ0Ϊ1 + * + *ע + * Ҫÿһſ + */ +Status InitGList(GList* L); + +/* + * + * + * ַSL + */ +Status CreateGList(GList* L, SString S); + +/* + * + * + * ͷŹռڴ档 + */ +Status DestroyGList(GList* L); + +/* + * + * + * ɹLƵõT + */ +Status CopyGList(GList* T, GList L); + +/* + * + * + * عijȡ + */ +int GListLength(GList L); + +/* + * + * + * ع + */ +int GListDepth(GList L); + +/* + * п + * + * жϹǷΪա + */ +Status GListEmpty(GList L); + +/* + * ͷ + */ +GList GetHead(GList L); + +/* + * β + */ +GList GetTail(GList L); + +/* + * + * + * ԪeΪLĵһԪء + */ +Status InsertFirst(GList* L, GList e); + +/* + * ɾ + * + * LĵһԪɾeء + */ +Status DeleteFirst(GList* L, GList* e); + +/* + * + * + * visitʹL + */ +void Traverse(GList L, void(Visit)(AtomType)); + +/* + * ͼλ + * + * L + */ +void PrintGraph(GList L); + +/* + * ͼλڲʵ֡ + */ +static void Print(GList L); + +/* + * ǿմstrָ֣hsubΪһ','֮ǰӴstrΪһ','֮Ӵ + * + *ע + * 1.ַstrȷ޿հ׷ţ + * strſȥҲδȥ + * 2.ɺstrҲᷢ仯 + */ +static void sever(SString hstr, SString str); + +#endif diff --git a/Dev-C++/ExerciseBook/05.32.2/SString.cpp b/Dev-C++/ExerciseBook/05.32.2/SString.cpp new file mode 100644 index 0000000..7a96fcf --- /dev/null +++ b/Dev-C++/ExerciseBook/05.32.2/SString.cpp @@ -0,0 +1,195 @@ +/*============================= + * Ķ˳洢ʾ˳򴮣 + * + * 㷨: 4.14.24.34.5 + ==============================*/ + +#include "SString.h" //**04 **// + +/* + * ʼ + * + * һֵΪcharsĴT + * + *ע + * òСӼ + */ +Status StrAssign(SString T, const char* chars) { + int i, len; + + len = (int) strlen(chars); + + // chars + if(len > MAXSTRLEN) { + return ERROR; + } + + T[0] = len; + for(i = 1; i <= len; i++) { + T[i] = chars[i - 1]; + } + + return OK; +} + +/* + * + * + * Sա + */ +Status ClearString(SString S) { + // ֻҪΪ0Ϳ + S[0] = 0; + return OK; +} + +/* + * п + * + * жϴSǷЧݡ + * + * ֵ + * TRUE : SΪ + * FALSE: SΪ + */ +Status StrEmpty(SString S) { + return S[0] == 0 ? TRUE : FALSE; +} + +/* + * + * + * شSԪصĸ + * + *ע + * òСӼ + */ +int StrLength(SString S) { + return S[0]; +} + +/* + * 㷨4.3 + * + * Ӵ + * + * SubS[pos, pos+len-1] + * ֵָʾǷȡɹ + * + *ע + * òСӼ + */ +Status SubString(SString Sub, SString S, int pos, int len) { + int i; + + if(pos < 1 || pos > S[0] || len < 0 || pos + len - 1 > S[0]) { + return ERROR; + } + + // Ԫ + for(i = 1; i <= len; i++) { + Sub[i] = S[pos + i - 1]; + } + + // ȷ³ + Sub[0] = len; + + return OK; +} + +/* + * ɾ + * + * ɾS[pos, pos+len-1] + */ +Status StrDelete(SString S, int pos, int len) { + int i; + + if(pos < 1 || pos + len - 1 > S[0] || len < 0) { + return ERROR; + } + + // ɾijΪ0ǰ + if(len == 0) { + return OK; + } + + // ѺԪŲǰ棬ǵɾԪ + for(i = pos + len; i <= S[0]; i++) { + S[i - len] = S[i]; + } + + // ȼ + S[0] -= len; + + return OK; +} + +/* + * Ƚ + * + * ȽϴSʹTرȽϽ + * + *ע + * òСӼ + */ +int StrCompare(SString S, SString T) { + int i = 1; + + while(i <= S[0] && i <= T[0]) { + // ַͬʱȽС + if(S[i] != T[i]) { + return S[i] - T[i]; + } + + i++; + } + + return S[0] - T[0]; +} + +/* + * + * + * SƵT + */ +Status StrCopy(SString T, SString S) { + int i; + + // ͬϢһ + for(i = 0; i <= S[0]; i++) { + T[i] = S[i]; + } + + return OK; +} + +/* + * ַSеĿհףɴӡַո + * + *ע + * úڱġ + */ +Status ClearBlank(SString S) { + int i, j; + + // ǿմ + if(S[0] == 0) { + return ERROR; + } + + for(i = 1, j = 0; i <= S[0]; i++) { + // հףԹ + if(S[i] == ' ' || !isprint(S[i])) { + continue; + } + + j++; + + S[j] = S[i]; + } + + S[0] = j; + + return OK; +} diff --git a/Dev-C++/ExerciseBook/05.32.2/SString.h b/Dev-C++/ExerciseBook/05.32.2/SString.h new file mode 100644 index 0000000..0632f18 --- /dev/null +++ b/Dev-C++/ExerciseBook/05.32.2/SString.h @@ -0,0 +1,117 @@ +/*============================= + * Ķ˳洢ʾ˳򴮣 + * + * 㷨: 4.14.24.34.5 + ==============================*/ + +#ifndef SSTRING_H +#define SSTRING_H + +#include +#include // ṩ strlen ԭ +#include // ṩ isprint ԭ +#include "Status.h" //**01 **// + +/* 궨 */ +#define MAXSTRLEN 255 // ˳򴮵󴮳 + +/* + * ˳洢Ͷ + * + * עЧԪشSString1ŵԪʼ洢 + * SString0ŵԪ洢䳤 + */ +typedef unsigned char SString[MAXSTRLEN + 1]; // 0ŵԪŴij + + +/* + * ʾ + * + * ѭ̲ĵдϰߣposָʾַλ()1ʼ + */ + + +/* + * ʼ + * + * һֵΪcharsĴT + * + *ע + * òСӼ + */ +Status StrAssign(SString T, const char* chars); + +/* + * + * + * Sա + */ +Status ClearString(SString S); + +/* + * п + * + * жϴSǷЧݡ + * + * ֵ + * TRUE : SΪ + * FALSE: SΪ + */ +Status StrEmpty(SString S); + +/* + * + * + * شSԪصĸ + * + *ע + * òСӼ + */ +int StrLength(SString S); + +/* + * 㷨4.3 + * + * Ӵ + * + * SubS[pos, pos+len-1] + * ֵָʾǷȡɹ + * + *ע + * òСӼ + */ +Status SubString(SString Sub, SString S, int pos, int len); + +/* + * ɾ + * + * ɾS[pos, pos+len-1] + */ +Status StrDelete(SString S, int pos, int len); + +/* + * Ƚ + * + * ȽϴSʹTرȽϽ + * + *ע + * òСӼ + */ +int StrCompare(SString S, SString T); + +/* + * + * + * SƵT + */ +Status StrCopy(SString T, SString S); + +/* + * ַSеĿհףɴӡַո + * + *ע + * úڱġ + */ +Status ClearBlank(SString S); + +#endif diff --git a/Dev-C++/ExerciseBook/05.33.1/05.33.1.cpp b/Dev-C++/ExerciseBook/05.33.1/05.33.1.cpp new file mode 100644 index 0000000..0ee6f53 --- /dev/null +++ b/Dev-C++/ExerciseBook/05.33.1/05.33.1.cpp @@ -0,0 +1,47 @@ +#include +#include "SString.h" //**04 **// +#include "GList-HT.h" //**05 ͹**// + +/* + * ԭڲΣͷβ洢ʾ + */ +void Algo_5_33_1(GList L, int d); + + +int main(int argc, char* argv[]) { + GList L; + char* s = "((),(e),(a,(b,c,d)))"; + SString S; + + printf(" L ...\n"); + StrAssign(S, s); + CreateGList(&L, S); + printf("L = "); + PrintGraph(L); + + Algo_5_33_1(L, 0); + + return 0; +} + + +/* + * ԭڲΣͷβ洢ʾ + */ +void Algo_5_33_1(GList L, int d) { + int i = d; // dijֵֵΪ0 + + if(L == NULL) { + return; + } + + if(L->tag == Atom) { + printf("%c -> %d\n", L->Node.atom, i); + } + + // ͷָָĻһ + if(L->tag == List) { + Algo_5_33_1(L->Node.ptr.hp, i + 1); + Algo_5_33_1(L->Node.ptr.tp, i); + } +} diff --git a/Dev-C++/ExerciseBook/05.33.1/05.33.1.dev b/Dev-C++/ExerciseBook/05.33.1/05.33.1.dev new file mode 100644 index 0000000..b1c9505 --- /dev/null +++ b/Dev-C++/ExerciseBook/05.33.1/05.33.1.dev @@ -0,0 +1,102 @@ +[Project] +FileName=05.33.1.dev +Name=05.33.1 +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 + +[Unit4] +FileName=SString.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit2] +FileName=GList-HT.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit1] +FileName=05.33.1.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit3] +FileName=GList-HT.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit5] +FileName=SString.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + diff --git a/Dev-C++/ExerciseBook/05.33.1/GList-HT.cpp b/Dev-C++/ExerciseBook/05.33.1/GList-HT.cpp new file mode 100644 index 0000000..bad30df --- /dev/null +++ b/Dev-C++/ExerciseBook/05.33.1/GList-HT.cpp @@ -0,0 +1,418 @@ +/*============================ + * ͷβ洢ʾ + * + * 㷨: 5.55.65.75.8 + =============================*/ + +#include "GList-HT.h" //**05 ͹**// + +/* + * ʼ + * + * ʼյĹΪ0Ϊ1 + * + *ע + * Ҫÿһȥſ + */ +Status InitGList(GList* L) { + if(L == NULL) { + return ERROR; + } + + *L = NULL; + + return OK; +} + +/* + * 㷨5.7 + * + * + * + * ַSL + */ +Status CreateGList(GList* L, SString S) { + SString emp; // չַ + SString hsub, sub; + GList p, q; + + if(L == NULL) { + return ERROR; + } + + // ַSеĿհףɴӡַո + ClearBlank(S); + + if(StrEmpty(S)) { + return ERROR; + } + + StrAssign(emp, "()"); + + /* + * 봮Ϊ()ҪյĹ + * + *ע + * ̲Ĵġ + * StrCompareķֵָʾַĴСָʾַǷȡ + * S()ȣֵӦ0 + */ + if(!StrCompare(S, emp)) { + *L = NULL; + } else { + *L = (GList) malloc(sizeof(GLNode)); + if(*L == NULL) { + exit(OVERFLOW); + } + + // ԭ + if(StrLength(S) == 1) { + (*L)->tag = Atom; + (*L)->Node.atom = S[1]; + } else { + (*L)->tag = List; + + p = *L; + + // ȥ + SubString(sub, S, 2, StrLength(S) - 2); + + // ظnӱ + do { + // subзͷhsubɺsubҲᷢ仯 + sever(hsub, sub); + + // ݹ鴴 + CreateGList(&(p->Node.ptr.hp), hsub); + + q = p; + + // βΪգҪβ + if(!StrEmpty(sub)) { + p = (GList) malloc(sizeof(GLNode)); + if(p == NULL) { + exit(OVERFLOW); + } + + p->tag = List; + + q->Node.ptr.tp = p; + } + } while(!StrEmpty(sub)); + + q->Node.ptr.tp = NULL; + } + } + + return OK; +} + +/* + * + * + * ͷŹռڴ档 + */ +Status DestroyGList(GList* L) { + GList head, tail; + + if(L == NULL || *L == NULL) { + return ERROR; + } + + // ɾԭӽ + if((*L)->tag == Atom) { + free(*L); + *L = NULL; + + // ɾӱ + } else { + head = (*L)->Node.ptr.hp; + tail = (*L)->Node.ptr.tp; + free(*L); + *L = NULL; + DestroyGList(&head); + DestroyGList(&tail); + } + + return OK; +} + +/* + * 㷨5.6 + * + * + * + * ɹLƵõT + */ +Status CopyGList(GList* T, GList L) { + if(T == NULL) { + return ERROR; + } + + if(L == NULL) { + *T = NULL; + } else { + // ½ + *T = (GList) malloc(sizeof(GLNode)); + if(*T == NULL) { + exit(OVERFLOW); + } + + (*T)->tag = L->tag; + + // Ƶԭ + if(L->tag == Atom) { + (*T)->Node.atom = L->Node.atom; + + // Ʊͷͱβ + } else { + CopyGList(&((*T)->Node.ptr.hp), L->Node.ptr.hp); + CopyGList(&((*T)->Node.ptr.tp), L->Node.ptr.tp); + } + } + + return OK; +} + +/* + * + * + * عijȡ + */ +int GListLength(GList L) { + int count; + + for(count = 0; L != NULL; count++, L = L->Node.ptr.tp) { + } + + return count; +} + +/* + * 㷨5.5 + * + * + * + * ع + */ +int GListDepth(GList L) { + int max, deep; + GList p; + + // ձΪ1 + if(L == NULL) { + return 1; + } + + // ԭΪ0 + if(L->tag == Atom) { + return 0; + } + + // ݹӱ + for(max = 0, p = L; p != NULL; p = p->Node.ptr.tp) { + deep = GListDepth(p->Node.ptr.hp); + if(deep > max) { + max = deep; + } + } + + // ǿձǸԪȼһ + return max + 1; +} + +/* + * п + * + * жϹǷΪա + */ +Status GListEmpty(GList L) { + return L == NULL ? TRUE : FALSE; +} + +/* + * ͷ + */ +GList GetHead(GList L) { + GList p; + + // ձޱͷﲻܷNULLȻֲʧ˻Ƿ˿ձ + if(L == NULL) { + exit(ERROR); + } + + CopyGList(&p, L->Node.ptr.hp); + + return p; +} + +/* + * β + */ +GList GetTail(GList L) { + GList p; + + // ձޱβﲻܷNULLȻֲʧ˻Ƿ˿ձ + if(L == NULL) { + exit(ERROR); + } + + CopyGList(&p, L->Node.ptr.tp); + + return p; +} + +/* + * + * + * ԪeΪLĵһԪء + */ +Status InsertFirst(GList* L, GList e) { + GList g; + + if(L == NULL) { + return ERROR; + } + + g = (GList) malloc(sizeof(GLNode)); + if(g == NULL) { + exit(OVERFLOW); + } + + g->tag = List; + g->Node.ptr.hp = e; + g->Node.ptr.tp = *L; + *L = g; + + return OK; +} + +/* + * ɾ + * + * LĵһԪɾeء + */ +Status DeleteFirst(GList* L, GList* e) { + GList p; + + // ձ޷ɾ + if(L == NULL || *L == NULL) { + return ERROR; + } + + p = *L; + *L = (*L)->Node.ptr.tp; + + CopyGList(e, p->Node.ptr.hp); + + free(p); + + return OK; +} + +/* + * + * + * visitʹL + */ +void Traverse(GList L, void(Visit)(AtomType)) { + + if(L == NULL) { + return; + } + + if(L->tag == Atom) { + Visit(L->Node.atom); + } else { + Traverse(L->Node.ptr.hp, Visit); + Traverse(L->Node.ptr.tp, Visit); + } + +} + +/* + * ͼλ + * + * L + */ +void PrintGraph(GList L) { + Print(L, Head); + printf("\n"); +} + +/* + * ͼλڲʵ֣markͼλǡ + */ +static void Print(GList L, Mark mark) { + // LΪ + if(L == NULL) { + if(mark == Head) { + printf("("); + } + + printf(")"); + + // LΪʱ + } else { + // ԭӽ㣬ԭ + if(L->tag == Atom) { + printf("%c", L->Node.atom); + + // ӱ㣬ҪԱͷβֱ + } else { + if(mark == Head) { + printf("("); + } else { + printf(","); + } + + Print(L->Node.ptr.hp, Head); + Print(L->Node.ptr.tp, Tail); + } + } +} + +/* + * 㷨5.8 + * + * ǿմstrָ֣hsubΪһ','֮ǰӴstrΪһ','֮Ӵ + * + *ע + * 1.ַstrȷ޿հ׷ţstrѾȥš + * 2.ɺstrҲᷢ仯 + */ +static void sever(SString hstr, SString str) { + int i, k, n; + SString ch; + + n = StrLength(str); + + i = 0; // ַʱα + k = 0; // δ + + do { + ++i; + + // ȡstrһַ + SubString(ch, str, i, 1); + + if(ch[1] == '(') { + ++k; + } + + if(ch[1] == ')') { + --k; + } + } while(i < n && (ch[1] != ',' || k != 0)); + + // ڶ + if(i < n) { + SubString(hstr, str, 1, i - 1); + SubString(str, str, i + 1, n - i); + + // ֻһ + } else { + StrCopy(hstr, str); + ClearString(str); + } +} diff --git a/Dev-C++/ExerciseBook/05.33.1/GList-HT.h b/Dev-C++/ExerciseBook/05.33.1/GList-HT.h new file mode 100644 index 0000000..508b96f --- /dev/null +++ b/Dev-C++/ExerciseBook/05.33.1/GList-HT.h @@ -0,0 +1,164 @@ +/*============================ + * ͷβ洢ʾ + * + * 㷨: 5.55.65.75.8 + =============================*/ + +#ifndef GLIST_HT_H +#define GLIST_HT_H + +#include +#include // ṩ mallocreallocfreeexit ԭ +#include "Status.h" //**01 **// +#include "SString.h" //**04 **// + +/* ԭԪ */ +typedef char AtomType; + +/* + * + * + * Atom-0ԭӽ + * List-1 + */ +typedef enum { Atom, List } ElemTag; + +/* ͷβ洢ʾͶ */ +typedef struct GLNode { + ElemTag tag; // ǣԭӽͱ + + // ԭӽͱϲ + union { + AtomType atom; // atomԭӽֵAtomTypeû + struct { + struct GLNode* hp; // ָͷ + struct GLNode* tp; // ָβ + } ptr; // ָ + } Node; +} GLNode; + +/* */ +typedef GLNode* GList; + +/* + * ͼλ + * + * HeadָԱͷ + * TailָԱβ + */ +typedef enum { Head, Tail } Mark; + + +/* + * ʼ + * + * ʼյĹΪ0Ϊ1 + * + *ע + * Ҫÿһȥſ + */ +Status InitGList(GList* L); + +/* + * 㷨5.7 + * + * + * + * ַSL + */ +Status CreateGList(GList* L, SString S); + +/* + * + * + * ͷŹռڴ档 + */ +Status DestroyGList(GList* L); + +/* + * 㷨5.6 + * + * + * + * ɹLƵõT + */ +Status CopyGList(GList* T, GList L); + +/* + * + * + * عijȡ + */ +int GListLength(GList L); + +/* + * 㷨5.5 + * + * + * + * ع + */ +int GListDepth(GList L); + +/* + * п + * + * жϹǷΪա + */ +Status GListEmpty(GList L); + +/* + * ͷ + */ +GList GetHead(GList L); + +/* + * β + */ +GList GetTail(GList L); + +/* + * + * + * ԪeΪLĵһԪء + */ +Status InsertFirst(GList* L, GList e); + +/* + * ɾ + * + * LĵһԪɾeء + */ +Status DeleteFirst(GList* L, GList* e); + +/* + * + * + * visitʹL + */ +void Traverse(GList L, void (Visit)(AtomType)); + +/* + * ͼλ + * + * L + */ +void PrintGraph(GList L); + +/* + * ͼλڲʵ֣markͼλǡ + */ +static void Print(GList L, Mark mark); + +/* + * 㷨5.8 + * + * ǿմstrָ֣hsubΪһ','֮ǰӴstrΪһ','֮Ӵ + * + *ע + * 1.ַstrȷ޿հ׷ţstrѾȥš + * 2.ɺstrҲᷢ仯 + */ +static void sever(SString hstr, SString str); + +#endif diff --git a/Dev-C++/ExerciseBook/05.33.1/SString.cpp b/Dev-C++/ExerciseBook/05.33.1/SString.cpp new file mode 100644 index 0000000..7a96fcf --- /dev/null +++ b/Dev-C++/ExerciseBook/05.33.1/SString.cpp @@ -0,0 +1,195 @@ +/*============================= + * Ķ˳洢ʾ˳򴮣 + * + * 㷨: 4.14.24.34.5 + ==============================*/ + +#include "SString.h" //**04 **// + +/* + * ʼ + * + * һֵΪcharsĴT + * + *ע + * òСӼ + */ +Status StrAssign(SString T, const char* chars) { + int i, len; + + len = (int) strlen(chars); + + // chars + if(len > MAXSTRLEN) { + return ERROR; + } + + T[0] = len; + for(i = 1; i <= len; i++) { + T[i] = chars[i - 1]; + } + + return OK; +} + +/* + * + * + * Sա + */ +Status ClearString(SString S) { + // ֻҪΪ0Ϳ + S[0] = 0; + return OK; +} + +/* + * п + * + * жϴSǷЧݡ + * + * ֵ + * TRUE : SΪ + * FALSE: SΪ + */ +Status StrEmpty(SString S) { + return S[0] == 0 ? TRUE : FALSE; +} + +/* + * + * + * شSԪصĸ + * + *ע + * òСӼ + */ +int StrLength(SString S) { + return S[0]; +} + +/* + * 㷨4.3 + * + * Ӵ + * + * SubS[pos, pos+len-1] + * ֵָʾǷȡɹ + * + *ע + * òСӼ + */ +Status SubString(SString Sub, SString S, int pos, int len) { + int i; + + if(pos < 1 || pos > S[0] || len < 0 || pos + len - 1 > S[0]) { + return ERROR; + } + + // Ԫ + for(i = 1; i <= len; i++) { + Sub[i] = S[pos + i - 1]; + } + + // ȷ³ + Sub[0] = len; + + return OK; +} + +/* + * ɾ + * + * ɾS[pos, pos+len-1] + */ +Status StrDelete(SString S, int pos, int len) { + int i; + + if(pos < 1 || pos + len - 1 > S[0] || len < 0) { + return ERROR; + } + + // ɾijΪ0ǰ + if(len == 0) { + return OK; + } + + // ѺԪŲǰ棬ǵɾԪ + for(i = pos + len; i <= S[0]; i++) { + S[i - len] = S[i]; + } + + // ȼ + S[0] -= len; + + return OK; +} + +/* + * Ƚ + * + * ȽϴSʹTرȽϽ + * + *ע + * òСӼ + */ +int StrCompare(SString S, SString T) { + int i = 1; + + while(i <= S[0] && i <= T[0]) { + // ַͬʱȽС + if(S[i] != T[i]) { + return S[i] - T[i]; + } + + i++; + } + + return S[0] - T[0]; +} + +/* + * + * + * SƵT + */ +Status StrCopy(SString T, SString S) { + int i; + + // ͬϢһ + for(i = 0; i <= S[0]; i++) { + T[i] = S[i]; + } + + return OK; +} + +/* + * ַSеĿհףɴӡַո + * + *ע + * úڱġ + */ +Status ClearBlank(SString S) { + int i, j; + + // ǿմ + if(S[0] == 0) { + return ERROR; + } + + for(i = 1, j = 0; i <= S[0]; i++) { + // հףԹ + if(S[i] == ' ' || !isprint(S[i])) { + continue; + } + + j++; + + S[j] = S[i]; + } + + S[0] = j; + + return OK; +} diff --git a/Dev-C++/ExerciseBook/05.33.1/SString.h b/Dev-C++/ExerciseBook/05.33.1/SString.h new file mode 100644 index 0000000..0632f18 --- /dev/null +++ b/Dev-C++/ExerciseBook/05.33.1/SString.h @@ -0,0 +1,117 @@ +/*============================= + * Ķ˳洢ʾ˳򴮣 + * + * 㷨: 4.14.24.34.5 + ==============================*/ + +#ifndef SSTRING_H +#define SSTRING_H + +#include +#include // ṩ strlen ԭ +#include // ṩ isprint ԭ +#include "Status.h" //**01 **// + +/* 궨 */ +#define MAXSTRLEN 255 // ˳򴮵󴮳 + +/* + * ˳洢Ͷ + * + * עЧԪشSString1ŵԪʼ洢 + * SString0ŵԪ洢䳤 + */ +typedef unsigned char SString[MAXSTRLEN + 1]; // 0ŵԪŴij + + +/* + * ʾ + * + * ѭ̲ĵдϰߣposָʾַλ()1ʼ + */ + + +/* + * ʼ + * + * һֵΪcharsĴT + * + *ע + * òСӼ + */ +Status StrAssign(SString T, const char* chars); + +/* + * + * + * Sա + */ +Status ClearString(SString S); + +/* + * п + * + * жϴSǷЧݡ + * + * ֵ + * TRUE : SΪ + * FALSE: SΪ + */ +Status StrEmpty(SString S); + +/* + * + * + * شSԪصĸ + * + *ע + * òСӼ + */ +int StrLength(SString S); + +/* + * 㷨4.3 + * + * Ӵ + * + * SubS[pos, pos+len-1] + * ֵָʾǷȡɹ + * + *ע + * òСӼ + */ +Status SubString(SString Sub, SString S, int pos, int len); + +/* + * ɾ + * + * ɾS[pos, pos+len-1] + */ +Status StrDelete(SString S, int pos, int len); + +/* + * Ƚ + * + * ȽϴSʹTرȽϽ + * + *ע + * òСӼ + */ +int StrCompare(SString S, SString T); + +/* + * + * + * SƵT + */ +Status StrCopy(SString T, SString S); + +/* + * ַSеĿհףɴӡַո + * + *ע + * úڱġ + */ +Status ClearBlank(SString S); + +#endif diff --git a/Dev-C++/ExerciseBook/05.33.2/05.33.2.cpp b/Dev-C++/ExerciseBook/05.33.2/05.33.2.cpp new file mode 100644 index 0000000..11aa567 --- /dev/null +++ b/Dev-C++/ExerciseBook/05.33.2/05.33.2.cpp @@ -0,0 +1,48 @@ +#include +#include "SString.h" //**04 **// +#include "GList-E.h" //**05 ͹**// + +/* + * ԭڲΣչ洢ʾ + */ +void Algo_5_33_2(GList L, int d); + + +int main(int argc, char* argv[]) { + GList L; + char* s = "((),(e),(a,(b,c,d)))"; + SString S; + + printf(" L ...\n"); + StrAssign(S, s); + CreateGList(&L, S); + printf("L = "); + PrintGraph(L); + + Algo_5_33_2(L, 0); + + return 0; +} + + +/* + * ԭڲΣչ洢ʾ + */ +void Algo_5_33_2(GList L, int d) { + int i = d; // dֵΪ0 + + if(L == NULL) { + return; + } + + if(L->tag == Atom) { + printf("%c -> %d\n", L->Node.atom, i); + } + + + if(L->tag == List) { + Algo_5_33_2(L->Node.hp, i + 1); // ͷָָĻһ + } + + Algo_5_33_2(L->tp, i); +} diff --git a/Dev-C++/ExerciseBook/05.33.2/05.33.2.dev b/Dev-C++/ExerciseBook/05.33.2/05.33.2.dev new file mode 100644 index 0000000..d81b8a2 --- /dev/null +++ b/Dev-C++/ExerciseBook/05.33.2/05.33.2.dev @@ -0,0 +1,102 @@ +[Project] +FileName=05.33.2.dev +Name=05.33.2 +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 + +[Unit4] +FileName=SString.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit2] +FileName=GList-E.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit1] +FileName=05.33.2.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit3] +FileName=GList-E.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit5] +FileName=SString.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + diff --git a/Dev-C++/ExerciseBook/05.33.2/GList-E.cpp b/Dev-C++/ExerciseBook/05.33.2/GList-E.cpp new file mode 100644 index 0000000..3fc0ad9 --- /dev/null +++ b/Dev-C++/ExerciseBook/05.33.2/GList-E.cpp @@ -0,0 +1,449 @@ +/*=========================== + * չ洢ʾ + ============================*/ + +#include "GList-E.h" //**05 ͹**// + +/* + * ʼ + * + * ʼյĹΪ0Ϊ1 + * + *ע + * Ҫÿһſ + */ +Status InitGList(GList* L) { + if(L == NULL) { + return ERROR; + } + + *L = (GList) malloc(sizeof(GLNode)); + if(!*L) { + exit(OVERFLOW); + } + + (*L)->tag = List; + (*L)->Node.hp = NULL; + (*L)->tp = NULL; + + return OK; +} + +/* + * + * + * ַSL + */ +Status CreateGList(GList* L, SString S) { + SString emp, hsub, sub, tmp; + + if(L == NULL) { + return ERROR; + } + + // ַSеĿհףɴӡַո + ClearBlank(S); + + if(StrEmpty(S)) { + return ERROR; + } + + // Ϊ˲ƻS + StrCopy(sub, S); + + /* + * ִеʱ + * ٴִеʱѾȥ + */ + sever(hsub, sub); + + *L = (GList) malloc(sizeof(GLNode)); + if(*L == NULL) { + exit(OVERFLOW); + } + + StrAssign(emp, "()"); + + if(!StrCompare(hsub, emp)) { + (*L)->tag = List; + (*L)->Node.hp = NULL; + } else { + if(StrLength(hsub) == 1) { + (*L)->tag = Atom; + (*L)->Node.atom = hsub[1]; + } else { + (*L)->tag = List; + + SubString(tmp, hsub, 2, StrLength(hsub) - 2); + + CreateGList(&((*L)->Node.hp), tmp); + } + } + + // ڶβ˳ݹ + if(StrEmpty(sub)) { + (*L)->tp = NULL; + } else { + // ݹβ + CreateGList(&((*L)->tp), sub); + } + + return OK; +} + +/* + * + * + * ͷŹռڴ档 + */ +Status DestroyGList(GList* L) { + GList head, tail; + + if(L == NULL || *L == NULL) { + return ERROR; + } + + // ӱ + if((*L)->tag == List) { + head = (*L)->Node.hp; // ͷ + tail = (*L)->tp; // β + + free(*L); + *L = NULL; + + // ݹ鴦ͷ + if(head != NULL) { + DestroyGList(&head); + } + + // ݹ鴦β + if(tail != NULL) { + DestroyGList(&tail); + } + + // ԭӽ + } else { + tail = (*L)->tp; // β + + free(*L); + *L = NULL; + + if(tail != NULL) { + DestroyGList(&tail); + } + } + + return OK; +} + +/* + * + * + * ɹLƵõT + */ +Status CopyGList(GList* T, GList L) { + + if(L == NULL) { + return ERROR; + } + + *T = (GList) malloc(sizeof(GLNode)); + if(*T == NULL) { + exit(OVERFLOW); + } + + // ԭ + if(L->tag == Atom) { + (*T)->tag = Atom; + (*T)->Node.atom = L->Node.atom; + + // ӱ + } else { + (*T)->tag = List; + + // Ʊͷ + if(L->Node.hp != NULL) { + CopyGList(&((*T)->Node.hp), L->Node.hp); + } else { + (*T)->Node.hp = NULL; + } + } + + // Ʊβ + if(L->tp != NULL) { + CopyGList(&((*T)->tp), L->tp); + } else { + (*T)->tp = NULL; + } + + return OK; +} + +/* + * + * + * عijȡ + */ +int GListLength(GList L) { + int count = 0; + GList p; + + // + if(L == NULL) { + return -1; + } + + p = L->Node.hp; + + while(p != NULL) { + ++count; + p = p->tp; + } + + return count; +} + +/* + * + * + * ع + */ +int GListDepth(GList L) { + int max, deep; + GList p; + + max = 0; + + // + if(L == NULL) { + return -1; + } + + // ձΪ1 + if(L->tag == List && !L->Node.hp) { + return 1; + } + + // ԭΪ0 + if(L->tag == Atom) { + return 0; + } + + // ݹӱ + for(p = L->Node.hp; p != NULL; p = p->tp) { + // pΪͷָӱ + deep = GListDepth(p); + if(deep > max) { + max = deep; + } + } + + return max + 1; +} + +/* + * п + * + * жϹǷΪա + */ +Status GListEmpty(GList L) { + // + if(L == NULL) { + return ERROR; + } + + if(L->tag == List && L->Node.hp == NULL && L->tp == NULL) { + return TRUE; + } else { + return ERROR; + } +} + +/* + * ͷ + */ +GList GetHead(GList L) { + GList p, q; + + // ڻΪձ޷ȡͷ + if(L == NULL || L->Node.hp == NULL) { + return NULL; + } + + q = L->Node.hp->tp; // ʱLıβϢ + L->Node.hp->tp = NULL; // ȥLıβ + + CopyGList(&p, L->Node.hp); // ƱͷϢαβ + + L->Node.hp->tp = q; // ָLıβϢ + + return p; +} + +/* + * β + */ +GList GetTail(GList L) { + GList p, q; + + // ڻΪձ޷ȡβ + if(L == NULL || L->Node.hp == NULL) { + return NULL; + } + + q = L->Node.hp; // ʱLıͷϢ + L->Node.hp = q->tp; // ժLıͷ + + CopyGList(&p, L); // ƱβϢαͷ + + q->tp = L->Node.hp; // ָLıͷϢ + L->Node.hp = q; + + return p; +} + +/* + * + * + * ԪeΪLĵһԪء + */ +Status InsertFirst(GList* L, GList e) { + + // + if(L == NULL || *L == NULL) { + return ERROR; + } + + if(e == NULL) { + return ERROR; + } + + e->tp = (*L)->Node.hp; + (*L)->Node.hp = e; + + return OK; +} + +/* + * ɾ + * + * LĵһԪɾeء + */ +Status DeleteFirst(GList* L, GList* e) { + GList p; + + // ڻΪձ޷ɾͷ + if(*L == NULL || (*L)->Node.hp == NULL) { + return ERROR; + } + + p = (*L)->Node.hp; + (*L)->Node.hp = p->tp; + p->tp = NULL; + + *e = p; + + return OK; +} + +/* + * + * + * visitʹL + */ +void Traverse(GList L, void(Visit)(AtomType)) { + if(L == NULL) { + return; + } + + if(L->tag == List) { + Traverse(L->Node.hp, Visit); + } else { + Visit(L->Node.atom); + } + + Traverse(L->tp, Visit); +} + +/* + * ͼλ + * + * L + */ +void PrintGraph(GList L) { + Print(L); + printf("\n"); +} + +/* + * ͼλڲʵ֡ + */ +static void Print(GList L) { + if(L == NULL) { + return; + } + + // + if(L->tag == List) { + printf("("); + + if(L->Node.hp) { + Print(L->Node.hp); + } + + if(L->tp) { + printf("),"); + Print(L->tp); + } else { + printf(")"); + } + + // ԭӽ + } else { + printf("%c", L->Node.atom); + if(L->tp) { + printf(","); + Print(L->tp); + } + } +} + +/* + * ǿմstrָ֣hsubΪһ','֮ǰӴstrΪһ','֮Ӵ + * + *ע + * 1.ַstrȷ޿հ׷ţ + * strſȥҲδȥ + * 2.ɺstrҲᷢ仯 + */ +static void sever(SString hstr, SString str) { + int i, k, n; + SString ch; + + n = StrLength(str); + + i = 0; // ַʱα + k = 0; // δ + + do { + ++i; + + // ȡstrһַ + SubString(ch, str, i, 1); + + if(ch[1] == '(') { + ++k; + } + if(ch[1] == ')') { + --k; + } + } while(i < n && (ch[1] != ',' || k != 0)); + + if(i < n) { + SubString(hstr, str, 1, i - 1); + SubString(str, str, i + 1, n - i); + } else { + StrCopy(hstr, str); + ClearString(str); + } +} diff --git a/Dev-C++/ExerciseBook/05.33.2/GList-E.h b/Dev-C++/ExerciseBook/05.33.2/GList-E.h new file mode 100644 index 0000000..fa9af82 --- /dev/null +++ b/Dev-C++/ExerciseBook/05.33.2/GList-E.h @@ -0,0 +1,146 @@ +/*=========================== + * չ洢ʾ + ============================*/ + +#ifndef GLIST_E_H +#define GLIST_E_H + +#include +#include // ṩ mallocreallocfreeexit ԭ +#include "Status.h" //**01 **// +#include "SString.h" //**04 **// + +/* ԭԪ */ +typedef char AtomType; //ԭ + +/* + * + * + * Atom-0ԭӽ + * List-1 + */ +typedef enum { Atom, List } ElemTag; + +/* չ洢ʾͶ */ +typedef struct GLNode { + ElemTag tag; // ǣԭӽͱ + + // ԭӽͱϲ + union + { + AtomType atom; // atomԭӽֵAtomTypeû + struct GLNode* hp; // ָͷ + } Node; + struct GLNode* tp; // ָβ +} GLNode; + +/* */ +typedef GLNode* GList; + + +/* + * ʼ + * + * ʼյĹΪ0Ϊ1 + * + *ע + * Ҫÿһſ + */ +Status InitGList(GList* L); + +/* + * + * + * ַSL + */ +Status CreateGList(GList* L, SString S); + +/* + * + * + * ͷŹռڴ档 + */ +Status DestroyGList(GList* L); + +/* + * + * + * ɹLƵõT + */ +Status CopyGList(GList* T, GList L); + +/* + * + * + * عijȡ + */ +int GListLength(GList L); + +/* + * + * + * ع + */ +int GListDepth(GList L); + +/* + * п + * + * жϹǷΪա + */ +Status GListEmpty(GList L); + +/* + * ͷ + */ +GList GetHead(GList L); + +/* + * β + */ +GList GetTail(GList L); + +/* + * + * + * ԪeΪLĵһԪء + */ +Status InsertFirst(GList* L, GList e); + +/* + * ɾ + * + * LĵһԪɾeء + */ +Status DeleteFirst(GList* L, GList* e); + +/* + * + * + * visitʹL + */ +void Traverse(GList L, void(Visit)(AtomType)); + +/* + * ͼλ + * + * L + */ +void PrintGraph(GList L); + +/* + * ͼλڲʵ֡ + */ +static void Print(GList L); + +/* + * ǿմstrָ֣hsubΪһ','֮ǰӴstrΪһ','֮Ӵ + * + *ע + * 1.ַstrȷ޿հ׷ţ + * strſȥҲδȥ + * 2.ɺstrҲᷢ仯 + */ +static void sever(SString hstr, SString str); + +#endif diff --git a/Dev-C++/ExerciseBook/05.33.2/SString.cpp b/Dev-C++/ExerciseBook/05.33.2/SString.cpp new file mode 100644 index 0000000..7a96fcf --- /dev/null +++ b/Dev-C++/ExerciseBook/05.33.2/SString.cpp @@ -0,0 +1,195 @@ +/*============================= + * Ķ˳洢ʾ˳򴮣 + * + * 㷨: 4.14.24.34.5 + ==============================*/ + +#include "SString.h" //**04 **// + +/* + * ʼ + * + * һֵΪcharsĴT + * + *ע + * òСӼ + */ +Status StrAssign(SString T, const char* chars) { + int i, len; + + len = (int) strlen(chars); + + // chars + if(len > MAXSTRLEN) { + return ERROR; + } + + T[0] = len; + for(i = 1; i <= len; i++) { + T[i] = chars[i - 1]; + } + + return OK; +} + +/* + * + * + * Sա + */ +Status ClearString(SString S) { + // ֻҪΪ0Ϳ + S[0] = 0; + return OK; +} + +/* + * п + * + * жϴSǷЧݡ + * + * ֵ + * TRUE : SΪ + * FALSE: SΪ + */ +Status StrEmpty(SString S) { + return S[0] == 0 ? TRUE : FALSE; +} + +/* + * + * + * شSԪصĸ + * + *ע + * òСӼ + */ +int StrLength(SString S) { + return S[0]; +} + +/* + * 㷨4.3 + * + * Ӵ + * + * SubS[pos, pos+len-1] + * ֵָʾǷȡɹ + * + *ע + * òСӼ + */ +Status SubString(SString Sub, SString S, int pos, int len) { + int i; + + if(pos < 1 || pos > S[0] || len < 0 || pos + len - 1 > S[0]) { + return ERROR; + } + + // Ԫ + for(i = 1; i <= len; i++) { + Sub[i] = S[pos + i - 1]; + } + + // ȷ³ + Sub[0] = len; + + return OK; +} + +/* + * ɾ + * + * ɾS[pos, pos+len-1] + */ +Status StrDelete(SString S, int pos, int len) { + int i; + + if(pos < 1 || pos + len - 1 > S[0] || len < 0) { + return ERROR; + } + + // ɾijΪ0ǰ + if(len == 0) { + return OK; + } + + // ѺԪŲǰ棬ǵɾԪ + for(i = pos + len; i <= S[0]; i++) { + S[i - len] = S[i]; + } + + // ȼ + S[0] -= len; + + return OK; +} + +/* + * Ƚ + * + * ȽϴSʹTرȽϽ + * + *ע + * òСӼ + */ +int StrCompare(SString S, SString T) { + int i = 1; + + while(i <= S[0] && i <= T[0]) { + // ַͬʱȽС + if(S[i] != T[i]) { + return S[i] - T[i]; + } + + i++; + } + + return S[0] - T[0]; +} + +/* + * + * + * SƵT + */ +Status StrCopy(SString T, SString S) { + int i; + + // ͬϢһ + for(i = 0; i <= S[0]; i++) { + T[i] = S[i]; + } + + return OK; +} + +/* + * ַSеĿհףɴӡַո + * + *ע + * úڱġ + */ +Status ClearBlank(SString S) { + int i, j; + + // ǿմ + if(S[0] == 0) { + return ERROR; + } + + for(i = 1, j = 0; i <= S[0]; i++) { + // հףԹ + if(S[i] == ' ' || !isprint(S[i])) { + continue; + } + + j++; + + S[j] = S[i]; + } + + S[0] = j; + + return OK; +} diff --git a/Dev-C++/ExerciseBook/05.33.2/SString.h b/Dev-C++/ExerciseBook/05.33.2/SString.h new file mode 100644 index 0000000..0632f18 --- /dev/null +++ b/Dev-C++/ExerciseBook/05.33.2/SString.h @@ -0,0 +1,117 @@ +/*============================= + * Ķ˳洢ʾ˳򴮣 + * + * 㷨: 4.14.24.34.5 + ==============================*/ + +#ifndef SSTRING_H +#define SSTRING_H + +#include +#include // ṩ strlen ԭ +#include // ṩ isprint ԭ +#include "Status.h" //**01 **// + +/* 궨 */ +#define MAXSTRLEN 255 // ˳򴮵󴮳 + +/* + * ˳洢Ͷ + * + * עЧԪشSString1ŵԪʼ洢 + * SString0ŵԪ洢䳤 + */ +typedef unsigned char SString[MAXSTRLEN + 1]; // 0ŵԪŴij + + +/* + * ʾ + * + * ѭ̲ĵдϰߣposָʾַλ()1ʼ + */ + + +/* + * ʼ + * + * һֵΪcharsĴT + * + *ע + * òСӼ + */ +Status StrAssign(SString T, const char* chars); + +/* + * + * + * Sա + */ +Status ClearString(SString S); + +/* + * п + * + * жϴSǷЧݡ + * + * ֵ + * TRUE : SΪ + * FALSE: SΪ + */ +Status StrEmpty(SString S); + +/* + * + * + * شSԪصĸ + * + *ע + * òСӼ + */ +int StrLength(SString S); + +/* + * 㷨4.3 + * + * Ӵ + * + * SubS[pos, pos+len-1] + * ֵָʾǷȡɹ + * + *ע + * òСӼ + */ +Status SubString(SString Sub, SString S, int pos, int len); + +/* + * ɾ + * + * ɾS[pos, pos+len-1] + */ +Status StrDelete(SString S, int pos, int len); + +/* + * Ƚ + * + * ȽϴSʹTرȽϽ + * + *ע + * òСӼ + */ +int StrCompare(SString S, SString T); + +/* + * + * + * SƵT + */ +Status StrCopy(SString T, SString S); + +/* + * ַSеĿհףɴӡַո + * + *ע + * úڱġ + */ +Status ClearBlank(SString S); + +#endif diff --git a/Dev-C++/ExerciseBook/05.34.1/05.34.1.cpp b/Dev-C++/ExerciseBook/05.34.1/05.34.1.cpp new file mode 100644 index 0000000..b3a2013 --- /dev/null +++ b/Dev-C++/ExerciseBook/05.34.1/05.34.1.cpp @@ -0,0 +1,62 @@ +#include +#include "Status.h" //**01 **// +#include "SString.h" //**04 **// +#include "GList-HT.h" //**05 ͹**// + +/* + * ùͷβ洢ʾ + */ +Status Algo_5_34_1(GList* L); + + +int main(int argc, char* argv[]) { + GList L; + char* s = "(a,((b,c),()),(((d),e),f))"; + SString S; + + printf(" L ...\n"); + StrAssign(S, s); + CreateGList(&L, S); + printf("L = "); + PrintGraph(L); + + printf("ù...\n"); + Algo_5_34_1(&L); + printf("L = "); + PrintGraph(L); + + return 0; +} + + +/* + * ùͷβ洢ʾ + */ +Status Algo_5_34_1(GList* L) { + GList head, tail; + + if(L == NULL || *L == NULL) { + return ERROR; + } + + // Ӻǰﵽ + head = *L; + tail = (*L)->Node.ptr.tp; + + // Աͷ + if(head->Node.ptr.hp != NULL && head->Node.ptr.hp->tag == List) { + Algo_5_34_1(&(head->Node.ptr.hp)); + } + + // Աβ + if(tail != NULL) { + Algo_5_34_1(&((*L)->Node.ptr.tp)); + + // ͷβ + *L = (*L)->Node.ptr.tp; + tail->Node.ptr.tp = head; + head->Node.ptr.tp = NULL; + } + + return OK; +} diff --git a/Dev-C++/ExerciseBook/05.34.1/05.34.1.dev b/Dev-C++/ExerciseBook/05.34.1/05.34.1.dev new file mode 100644 index 0000000..5b17ca2 --- /dev/null +++ b/Dev-C++/ExerciseBook/05.34.1/05.34.1.dev @@ -0,0 +1,102 @@ +[Project] +FileName=05.34.1.dev +Name=05.34.1 +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 + +[Unit4] +FileName=SString.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit2] +FileName=GList-HT.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit1] +FileName=05.34.1.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit3] +FileName=GList-HT.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit5] +FileName=SString.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + diff --git a/Dev-C++/ExerciseBook/05.34.1/GList-HT.cpp b/Dev-C++/ExerciseBook/05.34.1/GList-HT.cpp new file mode 100644 index 0000000..bad30df --- /dev/null +++ b/Dev-C++/ExerciseBook/05.34.1/GList-HT.cpp @@ -0,0 +1,418 @@ +/*============================ + * ͷβ洢ʾ + * + * 㷨: 5.55.65.75.8 + =============================*/ + +#include "GList-HT.h" //**05 ͹**// + +/* + * ʼ + * + * ʼյĹΪ0Ϊ1 + * + *ע + * Ҫÿһȥſ + */ +Status InitGList(GList* L) { + if(L == NULL) { + return ERROR; + } + + *L = NULL; + + return OK; +} + +/* + * 㷨5.7 + * + * + * + * ַSL + */ +Status CreateGList(GList* L, SString S) { + SString emp; // չַ + SString hsub, sub; + GList p, q; + + if(L == NULL) { + return ERROR; + } + + // ַSеĿհףɴӡַո + ClearBlank(S); + + if(StrEmpty(S)) { + return ERROR; + } + + StrAssign(emp, "()"); + + /* + * 봮Ϊ()ҪյĹ + * + *ע + * ̲Ĵġ + * StrCompareķֵָʾַĴСָʾַǷȡ + * S()ȣֵӦ0 + */ + if(!StrCompare(S, emp)) { + *L = NULL; + } else { + *L = (GList) malloc(sizeof(GLNode)); + if(*L == NULL) { + exit(OVERFLOW); + } + + // ԭ + if(StrLength(S) == 1) { + (*L)->tag = Atom; + (*L)->Node.atom = S[1]; + } else { + (*L)->tag = List; + + p = *L; + + // ȥ + SubString(sub, S, 2, StrLength(S) - 2); + + // ظnӱ + do { + // subзͷhsubɺsubҲᷢ仯 + sever(hsub, sub); + + // ݹ鴴 + CreateGList(&(p->Node.ptr.hp), hsub); + + q = p; + + // βΪգҪβ + if(!StrEmpty(sub)) { + p = (GList) malloc(sizeof(GLNode)); + if(p == NULL) { + exit(OVERFLOW); + } + + p->tag = List; + + q->Node.ptr.tp = p; + } + } while(!StrEmpty(sub)); + + q->Node.ptr.tp = NULL; + } + } + + return OK; +} + +/* + * + * + * ͷŹռڴ档 + */ +Status DestroyGList(GList* L) { + GList head, tail; + + if(L == NULL || *L == NULL) { + return ERROR; + } + + // ɾԭӽ + if((*L)->tag == Atom) { + free(*L); + *L = NULL; + + // ɾӱ + } else { + head = (*L)->Node.ptr.hp; + tail = (*L)->Node.ptr.tp; + free(*L); + *L = NULL; + DestroyGList(&head); + DestroyGList(&tail); + } + + return OK; +} + +/* + * 㷨5.6 + * + * + * + * ɹLƵõT + */ +Status CopyGList(GList* T, GList L) { + if(T == NULL) { + return ERROR; + } + + if(L == NULL) { + *T = NULL; + } else { + // ½ + *T = (GList) malloc(sizeof(GLNode)); + if(*T == NULL) { + exit(OVERFLOW); + } + + (*T)->tag = L->tag; + + // Ƶԭ + if(L->tag == Atom) { + (*T)->Node.atom = L->Node.atom; + + // Ʊͷͱβ + } else { + CopyGList(&((*T)->Node.ptr.hp), L->Node.ptr.hp); + CopyGList(&((*T)->Node.ptr.tp), L->Node.ptr.tp); + } + } + + return OK; +} + +/* + * + * + * عijȡ + */ +int GListLength(GList L) { + int count; + + for(count = 0; L != NULL; count++, L = L->Node.ptr.tp) { + } + + return count; +} + +/* + * 㷨5.5 + * + * + * + * ع + */ +int GListDepth(GList L) { + int max, deep; + GList p; + + // ձΪ1 + if(L == NULL) { + return 1; + } + + // ԭΪ0 + if(L->tag == Atom) { + return 0; + } + + // ݹӱ + for(max = 0, p = L; p != NULL; p = p->Node.ptr.tp) { + deep = GListDepth(p->Node.ptr.hp); + if(deep > max) { + max = deep; + } + } + + // ǿձǸԪȼһ + return max + 1; +} + +/* + * п + * + * жϹǷΪա + */ +Status GListEmpty(GList L) { + return L == NULL ? TRUE : FALSE; +} + +/* + * ͷ + */ +GList GetHead(GList L) { + GList p; + + // ձޱͷﲻܷNULLȻֲʧ˻Ƿ˿ձ + if(L == NULL) { + exit(ERROR); + } + + CopyGList(&p, L->Node.ptr.hp); + + return p; +} + +/* + * β + */ +GList GetTail(GList L) { + GList p; + + // ձޱβﲻܷNULLȻֲʧ˻Ƿ˿ձ + if(L == NULL) { + exit(ERROR); + } + + CopyGList(&p, L->Node.ptr.tp); + + return p; +} + +/* + * + * + * ԪeΪLĵһԪء + */ +Status InsertFirst(GList* L, GList e) { + GList g; + + if(L == NULL) { + return ERROR; + } + + g = (GList) malloc(sizeof(GLNode)); + if(g == NULL) { + exit(OVERFLOW); + } + + g->tag = List; + g->Node.ptr.hp = e; + g->Node.ptr.tp = *L; + *L = g; + + return OK; +} + +/* + * ɾ + * + * LĵһԪɾeء + */ +Status DeleteFirst(GList* L, GList* e) { + GList p; + + // ձ޷ɾ + if(L == NULL || *L == NULL) { + return ERROR; + } + + p = *L; + *L = (*L)->Node.ptr.tp; + + CopyGList(e, p->Node.ptr.hp); + + free(p); + + return OK; +} + +/* + * + * + * visitʹL + */ +void Traverse(GList L, void(Visit)(AtomType)) { + + if(L == NULL) { + return; + } + + if(L->tag == Atom) { + Visit(L->Node.atom); + } else { + Traverse(L->Node.ptr.hp, Visit); + Traverse(L->Node.ptr.tp, Visit); + } + +} + +/* + * ͼλ + * + * L + */ +void PrintGraph(GList L) { + Print(L, Head); + printf("\n"); +} + +/* + * ͼλڲʵ֣markͼλǡ + */ +static void Print(GList L, Mark mark) { + // LΪ + if(L == NULL) { + if(mark == Head) { + printf("("); + } + + printf(")"); + + // LΪʱ + } else { + // ԭӽ㣬ԭ + if(L->tag == Atom) { + printf("%c", L->Node.atom); + + // ӱ㣬ҪԱͷβֱ + } else { + if(mark == Head) { + printf("("); + } else { + printf(","); + } + + Print(L->Node.ptr.hp, Head); + Print(L->Node.ptr.tp, Tail); + } + } +} + +/* + * 㷨5.8 + * + * ǿմstrָ֣hsubΪһ','֮ǰӴstrΪһ','֮Ӵ + * + *ע + * 1.ַstrȷ޿հ׷ţstrѾȥš + * 2.ɺstrҲᷢ仯 + */ +static void sever(SString hstr, SString str) { + int i, k, n; + SString ch; + + n = StrLength(str); + + i = 0; // ַʱα + k = 0; // δ + + do { + ++i; + + // ȡstrһַ + SubString(ch, str, i, 1); + + if(ch[1] == '(') { + ++k; + } + + if(ch[1] == ')') { + --k; + } + } while(i < n && (ch[1] != ',' || k != 0)); + + // ڶ + if(i < n) { + SubString(hstr, str, 1, i - 1); + SubString(str, str, i + 1, n - i); + + // ֻһ + } else { + StrCopy(hstr, str); + ClearString(str); + } +} diff --git a/Dev-C++/ExerciseBook/05.34.1/GList-HT.h b/Dev-C++/ExerciseBook/05.34.1/GList-HT.h new file mode 100644 index 0000000..508b96f --- /dev/null +++ b/Dev-C++/ExerciseBook/05.34.1/GList-HT.h @@ -0,0 +1,164 @@ +/*============================ + * ͷβ洢ʾ + * + * 㷨: 5.55.65.75.8 + =============================*/ + +#ifndef GLIST_HT_H +#define GLIST_HT_H + +#include +#include // ṩ mallocreallocfreeexit ԭ +#include "Status.h" //**01 **// +#include "SString.h" //**04 **// + +/* ԭԪ */ +typedef char AtomType; + +/* + * + * + * Atom-0ԭӽ + * List-1 + */ +typedef enum { Atom, List } ElemTag; + +/* ͷβ洢ʾͶ */ +typedef struct GLNode { + ElemTag tag; // ǣԭӽͱ + + // ԭӽͱϲ + union { + AtomType atom; // atomԭӽֵAtomTypeû + struct { + struct GLNode* hp; // ָͷ + struct GLNode* tp; // ָβ + } ptr; // ָ + } Node; +} GLNode; + +/* */ +typedef GLNode* GList; + +/* + * ͼλ + * + * HeadָԱͷ + * TailָԱβ + */ +typedef enum { Head, Tail } Mark; + + +/* + * ʼ + * + * ʼյĹΪ0Ϊ1 + * + *ע + * Ҫÿһȥſ + */ +Status InitGList(GList* L); + +/* + * 㷨5.7 + * + * + * + * ַSL + */ +Status CreateGList(GList* L, SString S); + +/* + * + * + * ͷŹռڴ档 + */ +Status DestroyGList(GList* L); + +/* + * 㷨5.6 + * + * + * + * ɹLƵõT + */ +Status CopyGList(GList* T, GList L); + +/* + * + * + * عijȡ + */ +int GListLength(GList L); + +/* + * 㷨5.5 + * + * + * + * ع + */ +int GListDepth(GList L); + +/* + * п + * + * жϹǷΪա + */ +Status GListEmpty(GList L); + +/* + * ͷ + */ +GList GetHead(GList L); + +/* + * β + */ +GList GetTail(GList L); + +/* + * + * + * ԪeΪLĵһԪء + */ +Status InsertFirst(GList* L, GList e); + +/* + * ɾ + * + * LĵһԪɾeء + */ +Status DeleteFirst(GList* L, GList* e); + +/* + * + * + * visitʹL + */ +void Traverse(GList L, void (Visit)(AtomType)); + +/* + * ͼλ + * + * L + */ +void PrintGraph(GList L); + +/* + * ͼλڲʵ֣markͼλǡ + */ +static void Print(GList L, Mark mark); + +/* + * 㷨5.8 + * + * ǿմstrָ֣hsubΪһ','֮ǰӴstrΪһ','֮Ӵ + * + *ע + * 1.ַstrȷ޿հ׷ţstrѾȥš + * 2.ɺstrҲᷢ仯 + */ +static void sever(SString hstr, SString str); + +#endif diff --git a/Dev-C++/ExerciseBook/05.34.1/SString.cpp b/Dev-C++/ExerciseBook/05.34.1/SString.cpp new file mode 100644 index 0000000..7a96fcf --- /dev/null +++ b/Dev-C++/ExerciseBook/05.34.1/SString.cpp @@ -0,0 +1,195 @@ +/*============================= + * Ķ˳洢ʾ˳򴮣 + * + * 㷨: 4.14.24.34.5 + ==============================*/ + +#include "SString.h" //**04 **// + +/* + * ʼ + * + * һֵΪcharsĴT + * + *ע + * òСӼ + */ +Status StrAssign(SString T, const char* chars) { + int i, len; + + len = (int) strlen(chars); + + // chars + if(len > MAXSTRLEN) { + return ERROR; + } + + T[0] = len; + for(i = 1; i <= len; i++) { + T[i] = chars[i - 1]; + } + + return OK; +} + +/* + * + * + * Sա + */ +Status ClearString(SString S) { + // ֻҪΪ0Ϳ + S[0] = 0; + return OK; +} + +/* + * п + * + * жϴSǷЧݡ + * + * ֵ + * TRUE : SΪ + * FALSE: SΪ + */ +Status StrEmpty(SString S) { + return S[0] == 0 ? TRUE : FALSE; +} + +/* + * + * + * شSԪصĸ + * + *ע + * òСӼ + */ +int StrLength(SString S) { + return S[0]; +} + +/* + * 㷨4.3 + * + * Ӵ + * + * SubS[pos, pos+len-1] + * ֵָʾǷȡɹ + * + *ע + * òСӼ + */ +Status SubString(SString Sub, SString S, int pos, int len) { + int i; + + if(pos < 1 || pos > S[0] || len < 0 || pos + len - 1 > S[0]) { + return ERROR; + } + + // Ԫ + for(i = 1; i <= len; i++) { + Sub[i] = S[pos + i - 1]; + } + + // ȷ³ + Sub[0] = len; + + return OK; +} + +/* + * ɾ + * + * ɾS[pos, pos+len-1] + */ +Status StrDelete(SString S, int pos, int len) { + int i; + + if(pos < 1 || pos + len - 1 > S[0] || len < 0) { + return ERROR; + } + + // ɾijΪ0ǰ + if(len == 0) { + return OK; + } + + // ѺԪŲǰ棬ǵɾԪ + for(i = pos + len; i <= S[0]; i++) { + S[i - len] = S[i]; + } + + // ȼ + S[0] -= len; + + return OK; +} + +/* + * Ƚ + * + * ȽϴSʹTرȽϽ + * + *ע + * òСӼ + */ +int StrCompare(SString S, SString T) { + int i = 1; + + while(i <= S[0] && i <= T[0]) { + // ַͬʱȽС + if(S[i] != T[i]) { + return S[i] - T[i]; + } + + i++; + } + + return S[0] - T[0]; +} + +/* + * + * + * SƵT + */ +Status StrCopy(SString T, SString S) { + int i; + + // ͬϢһ + for(i = 0; i <= S[0]; i++) { + T[i] = S[i]; + } + + return OK; +} + +/* + * ַSеĿհףɴӡַո + * + *ע + * úڱġ + */ +Status ClearBlank(SString S) { + int i, j; + + // ǿմ + if(S[0] == 0) { + return ERROR; + } + + for(i = 1, j = 0; i <= S[0]; i++) { + // հףԹ + if(S[i] == ' ' || !isprint(S[i])) { + continue; + } + + j++; + + S[j] = S[i]; + } + + S[0] = j; + + return OK; +} diff --git a/Dev-C++/ExerciseBook/05.34.1/SString.h b/Dev-C++/ExerciseBook/05.34.1/SString.h new file mode 100644 index 0000000..0632f18 --- /dev/null +++ b/Dev-C++/ExerciseBook/05.34.1/SString.h @@ -0,0 +1,117 @@ +/*============================= + * Ķ˳洢ʾ˳򴮣 + * + * 㷨: 4.14.24.34.5 + ==============================*/ + +#ifndef SSTRING_H +#define SSTRING_H + +#include +#include // ṩ strlen ԭ +#include // ṩ isprint ԭ +#include "Status.h" //**01 **// + +/* 궨 */ +#define MAXSTRLEN 255 // ˳򴮵󴮳 + +/* + * ˳洢Ͷ + * + * עЧԪشSString1ŵԪʼ洢 + * SString0ŵԪ洢䳤 + */ +typedef unsigned char SString[MAXSTRLEN + 1]; // 0ŵԪŴij + + +/* + * ʾ + * + * ѭ̲ĵдϰߣposָʾַλ()1ʼ + */ + + +/* + * ʼ + * + * һֵΪcharsĴT + * + *ע + * òСӼ + */ +Status StrAssign(SString T, const char* chars); + +/* + * + * + * Sա + */ +Status ClearString(SString S); + +/* + * п + * + * жϴSǷЧݡ + * + * ֵ + * TRUE : SΪ + * FALSE: SΪ + */ +Status StrEmpty(SString S); + +/* + * + * + * شSԪصĸ + * + *ע + * òСӼ + */ +int StrLength(SString S); + +/* + * 㷨4.3 + * + * Ӵ + * + * SubS[pos, pos+len-1] + * ֵָʾǷȡɹ + * + *ע + * òСӼ + */ +Status SubString(SString Sub, SString S, int pos, int len); + +/* + * ɾ + * + * ɾS[pos, pos+len-1] + */ +Status StrDelete(SString S, int pos, int len); + +/* + * Ƚ + * + * ȽϴSʹTرȽϽ + * + *ע + * òСӼ + */ +int StrCompare(SString S, SString T); + +/* + * + * + * SƵT + */ +Status StrCopy(SString T, SString S); + +/* + * ַSеĿհףɴӡַո + * + *ע + * úڱġ + */ +Status ClearBlank(SString S); + +#endif diff --git a/Dev-C++/ExerciseBook/05.34.2/05.34.2.cpp b/Dev-C++/ExerciseBook/05.34.2/05.34.2.cpp new file mode 100644 index 0000000..c72e80d --- /dev/null +++ b/Dev-C++/ExerciseBook/05.34.2/05.34.2.cpp @@ -0,0 +1,61 @@ +#include +#include "Status.h" //**01 **// +#include "SString.h" //**04 **// +#include "GList-E.h" //**05 ͹**// + +/* + * ùչ洢ʾ + */ +Status Algo_5_34_2(GList* L); + + +int main(int argc, char* argv[]) { + GList L; + char* s = "(a,((b,c),()),(((d),e),f))"; + SString S; + + printf(" L ...\n"); + StrAssign(S, s); + CreateGList(&L, S); + printf("L = "); + PrintGraph(L); + + printf("ù...\n"); + Algo_5_34_2(&L); + printf("L = "); + PrintGraph(L); + + return 0; +} + + +/* + * ùչ洢ʾ + */ +Status Algo_5_34_2(GList* L) { + GList head, tail; + + if(L == NULL || *L == NULL) { + return ERROR; + } + + // Ӻǰﵽ + head = *L; + tail = (*L)->tp; + + if(head->tag == List && head->Node.hp != NULL) { + Algo_5_34_2(&(head->Node.hp)); + } + + // Աβ + if(tail != NULL) { + Algo_5_34_2(&((*L)->tp)); + + // ͷβ + *L = (*L)->tp; + tail->tp = head; + head->tp = NULL; + } + + return OK; +} diff --git a/Dev-C++/ExerciseBook/05.34.2/05.34.2.dev b/Dev-C++/ExerciseBook/05.34.2/05.34.2.dev new file mode 100644 index 0000000..8808872 --- /dev/null +++ b/Dev-C++/ExerciseBook/05.34.2/05.34.2.dev @@ -0,0 +1,102 @@ +[Project] +FileName=05.34.2.dev +Name=05.34.2 +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 + +[Unit4] +FileName=SString.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit2] +FileName=GList-E.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit1] +FileName=05.34.2.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit3] +FileName=GList-E.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit5] +FileName=SString.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + diff --git a/Dev-C++/ExerciseBook/05.34.2/GList-E.cpp b/Dev-C++/ExerciseBook/05.34.2/GList-E.cpp new file mode 100644 index 0000000..3fc0ad9 --- /dev/null +++ b/Dev-C++/ExerciseBook/05.34.2/GList-E.cpp @@ -0,0 +1,449 @@ +/*=========================== + * չ洢ʾ + ============================*/ + +#include "GList-E.h" //**05 ͹**// + +/* + * ʼ + * + * ʼյĹΪ0Ϊ1 + * + *ע + * Ҫÿһſ + */ +Status InitGList(GList* L) { + if(L == NULL) { + return ERROR; + } + + *L = (GList) malloc(sizeof(GLNode)); + if(!*L) { + exit(OVERFLOW); + } + + (*L)->tag = List; + (*L)->Node.hp = NULL; + (*L)->tp = NULL; + + return OK; +} + +/* + * + * + * ַSL + */ +Status CreateGList(GList* L, SString S) { + SString emp, hsub, sub, tmp; + + if(L == NULL) { + return ERROR; + } + + // ַSеĿհףɴӡַո + ClearBlank(S); + + if(StrEmpty(S)) { + return ERROR; + } + + // Ϊ˲ƻS + StrCopy(sub, S); + + /* + * ִеʱ + * ٴִеʱѾȥ + */ + sever(hsub, sub); + + *L = (GList) malloc(sizeof(GLNode)); + if(*L == NULL) { + exit(OVERFLOW); + } + + StrAssign(emp, "()"); + + if(!StrCompare(hsub, emp)) { + (*L)->tag = List; + (*L)->Node.hp = NULL; + } else { + if(StrLength(hsub) == 1) { + (*L)->tag = Atom; + (*L)->Node.atom = hsub[1]; + } else { + (*L)->tag = List; + + SubString(tmp, hsub, 2, StrLength(hsub) - 2); + + CreateGList(&((*L)->Node.hp), tmp); + } + } + + // ڶβ˳ݹ + if(StrEmpty(sub)) { + (*L)->tp = NULL; + } else { + // ݹβ + CreateGList(&((*L)->tp), sub); + } + + return OK; +} + +/* + * + * + * ͷŹռڴ档 + */ +Status DestroyGList(GList* L) { + GList head, tail; + + if(L == NULL || *L == NULL) { + return ERROR; + } + + // ӱ + if((*L)->tag == List) { + head = (*L)->Node.hp; // ͷ + tail = (*L)->tp; // β + + free(*L); + *L = NULL; + + // ݹ鴦ͷ + if(head != NULL) { + DestroyGList(&head); + } + + // ݹ鴦β + if(tail != NULL) { + DestroyGList(&tail); + } + + // ԭӽ + } else { + tail = (*L)->tp; // β + + free(*L); + *L = NULL; + + if(tail != NULL) { + DestroyGList(&tail); + } + } + + return OK; +} + +/* + * + * + * ɹLƵõT + */ +Status CopyGList(GList* T, GList L) { + + if(L == NULL) { + return ERROR; + } + + *T = (GList) malloc(sizeof(GLNode)); + if(*T == NULL) { + exit(OVERFLOW); + } + + // ԭ + if(L->tag == Atom) { + (*T)->tag = Atom; + (*T)->Node.atom = L->Node.atom; + + // ӱ + } else { + (*T)->tag = List; + + // Ʊͷ + if(L->Node.hp != NULL) { + CopyGList(&((*T)->Node.hp), L->Node.hp); + } else { + (*T)->Node.hp = NULL; + } + } + + // Ʊβ + if(L->tp != NULL) { + CopyGList(&((*T)->tp), L->tp); + } else { + (*T)->tp = NULL; + } + + return OK; +} + +/* + * + * + * عijȡ + */ +int GListLength(GList L) { + int count = 0; + GList p; + + // + if(L == NULL) { + return -1; + } + + p = L->Node.hp; + + while(p != NULL) { + ++count; + p = p->tp; + } + + return count; +} + +/* + * + * + * ع + */ +int GListDepth(GList L) { + int max, deep; + GList p; + + max = 0; + + // + if(L == NULL) { + return -1; + } + + // ձΪ1 + if(L->tag == List && !L->Node.hp) { + return 1; + } + + // ԭΪ0 + if(L->tag == Atom) { + return 0; + } + + // ݹӱ + for(p = L->Node.hp; p != NULL; p = p->tp) { + // pΪͷָӱ + deep = GListDepth(p); + if(deep > max) { + max = deep; + } + } + + return max + 1; +} + +/* + * п + * + * жϹǷΪա + */ +Status GListEmpty(GList L) { + // + if(L == NULL) { + return ERROR; + } + + if(L->tag == List && L->Node.hp == NULL && L->tp == NULL) { + return TRUE; + } else { + return ERROR; + } +} + +/* + * ͷ + */ +GList GetHead(GList L) { + GList p, q; + + // ڻΪձ޷ȡͷ + if(L == NULL || L->Node.hp == NULL) { + return NULL; + } + + q = L->Node.hp->tp; // ʱLıβϢ + L->Node.hp->tp = NULL; // ȥLıβ + + CopyGList(&p, L->Node.hp); // ƱͷϢαβ + + L->Node.hp->tp = q; // ָLıβϢ + + return p; +} + +/* + * β + */ +GList GetTail(GList L) { + GList p, q; + + // ڻΪձ޷ȡβ + if(L == NULL || L->Node.hp == NULL) { + return NULL; + } + + q = L->Node.hp; // ʱLıͷϢ + L->Node.hp = q->tp; // ժLıͷ + + CopyGList(&p, L); // ƱβϢαͷ + + q->tp = L->Node.hp; // ָLıͷϢ + L->Node.hp = q; + + return p; +} + +/* + * + * + * ԪeΪLĵһԪء + */ +Status InsertFirst(GList* L, GList e) { + + // + if(L == NULL || *L == NULL) { + return ERROR; + } + + if(e == NULL) { + return ERROR; + } + + e->tp = (*L)->Node.hp; + (*L)->Node.hp = e; + + return OK; +} + +/* + * ɾ + * + * LĵһԪɾeء + */ +Status DeleteFirst(GList* L, GList* e) { + GList p; + + // ڻΪձ޷ɾͷ + if(*L == NULL || (*L)->Node.hp == NULL) { + return ERROR; + } + + p = (*L)->Node.hp; + (*L)->Node.hp = p->tp; + p->tp = NULL; + + *e = p; + + return OK; +} + +/* + * + * + * visitʹL + */ +void Traverse(GList L, void(Visit)(AtomType)) { + if(L == NULL) { + return; + } + + if(L->tag == List) { + Traverse(L->Node.hp, Visit); + } else { + Visit(L->Node.atom); + } + + Traverse(L->tp, Visit); +} + +/* + * ͼλ + * + * L + */ +void PrintGraph(GList L) { + Print(L); + printf("\n"); +} + +/* + * ͼλڲʵ֡ + */ +static void Print(GList L) { + if(L == NULL) { + return; + } + + // + if(L->tag == List) { + printf("("); + + if(L->Node.hp) { + Print(L->Node.hp); + } + + if(L->tp) { + printf("),"); + Print(L->tp); + } else { + printf(")"); + } + + // ԭӽ + } else { + printf("%c", L->Node.atom); + if(L->tp) { + printf(","); + Print(L->tp); + } + } +} + +/* + * ǿմstrָ֣hsubΪһ','֮ǰӴstrΪһ','֮Ӵ + * + *ע + * 1.ַstrȷ޿հ׷ţ + * strſȥҲδȥ + * 2.ɺstrҲᷢ仯 + */ +static void sever(SString hstr, SString str) { + int i, k, n; + SString ch; + + n = StrLength(str); + + i = 0; // ַʱα + k = 0; // δ + + do { + ++i; + + // ȡstrһַ + SubString(ch, str, i, 1); + + if(ch[1] == '(') { + ++k; + } + if(ch[1] == ')') { + --k; + } + } while(i < n && (ch[1] != ',' || k != 0)); + + if(i < n) { + SubString(hstr, str, 1, i - 1); + SubString(str, str, i + 1, n - i); + } else { + StrCopy(hstr, str); + ClearString(str); + } +} diff --git a/Dev-C++/ExerciseBook/05.34.2/GList-E.h b/Dev-C++/ExerciseBook/05.34.2/GList-E.h new file mode 100644 index 0000000..fa9af82 --- /dev/null +++ b/Dev-C++/ExerciseBook/05.34.2/GList-E.h @@ -0,0 +1,146 @@ +/*=========================== + * չ洢ʾ + ============================*/ + +#ifndef GLIST_E_H +#define GLIST_E_H + +#include +#include // ṩ mallocreallocfreeexit ԭ +#include "Status.h" //**01 **// +#include "SString.h" //**04 **// + +/* ԭԪ */ +typedef char AtomType; //ԭ + +/* + * + * + * Atom-0ԭӽ + * List-1 + */ +typedef enum { Atom, List } ElemTag; + +/* չ洢ʾͶ */ +typedef struct GLNode { + ElemTag tag; // ǣԭӽͱ + + // ԭӽͱϲ + union + { + AtomType atom; // atomԭӽֵAtomTypeû + struct GLNode* hp; // ָͷ + } Node; + struct GLNode* tp; // ָβ +} GLNode; + +/* */ +typedef GLNode* GList; + + +/* + * ʼ + * + * ʼյĹΪ0Ϊ1 + * + *ע + * Ҫÿһſ + */ +Status InitGList(GList* L); + +/* + * + * + * ַSL + */ +Status CreateGList(GList* L, SString S); + +/* + * + * + * ͷŹռڴ档 + */ +Status DestroyGList(GList* L); + +/* + * + * + * ɹLƵõT + */ +Status CopyGList(GList* T, GList L); + +/* + * + * + * عijȡ + */ +int GListLength(GList L); + +/* + * + * + * ع + */ +int GListDepth(GList L); + +/* + * п + * + * жϹǷΪա + */ +Status GListEmpty(GList L); + +/* + * ͷ + */ +GList GetHead(GList L); + +/* + * β + */ +GList GetTail(GList L); + +/* + * + * + * ԪeΪLĵһԪء + */ +Status InsertFirst(GList* L, GList e); + +/* + * ɾ + * + * LĵһԪɾeء + */ +Status DeleteFirst(GList* L, GList* e); + +/* + * + * + * visitʹL + */ +void Traverse(GList L, void(Visit)(AtomType)); + +/* + * ͼλ + * + * L + */ +void PrintGraph(GList L); + +/* + * ͼλڲʵ֡ + */ +static void Print(GList L); + +/* + * ǿմstrָ֣hsubΪһ','֮ǰӴstrΪһ','֮Ӵ + * + *ע + * 1.ַstrȷ޿հ׷ţ + * strſȥҲδȥ + * 2.ɺstrҲᷢ仯 + */ +static void sever(SString hstr, SString str); + +#endif diff --git a/Dev-C++/ExerciseBook/05.34.2/SString.cpp b/Dev-C++/ExerciseBook/05.34.2/SString.cpp new file mode 100644 index 0000000..7a96fcf --- /dev/null +++ b/Dev-C++/ExerciseBook/05.34.2/SString.cpp @@ -0,0 +1,195 @@ +/*============================= + * Ķ˳洢ʾ˳򴮣 + * + * 㷨: 4.14.24.34.5 + ==============================*/ + +#include "SString.h" //**04 **// + +/* + * ʼ + * + * һֵΪcharsĴT + * + *ע + * òСӼ + */ +Status StrAssign(SString T, const char* chars) { + int i, len; + + len = (int) strlen(chars); + + // chars + if(len > MAXSTRLEN) { + return ERROR; + } + + T[0] = len; + for(i = 1; i <= len; i++) { + T[i] = chars[i - 1]; + } + + return OK; +} + +/* + * + * + * Sա + */ +Status ClearString(SString S) { + // ֻҪΪ0Ϳ + S[0] = 0; + return OK; +} + +/* + * п + * + * жϴSǷЧݡ + * + * ֵ + * TRUE : SΪ + * FALSE: SΪ + */ +Status StrEmpty(SString S) { + return S[0] == 0 ? TRUE : FALSE; +} + +/* + * + * + * شSԪصĸ + * + *ע + * òСӼ + */ +int StrLength(SString S) { + return S[0]; +} + +/* + * 㷨4.3 + * + * Ӵ + * + * SubS[pos, pos+len-1] + * ֵָʾǷȡɹ + * + *ע + * òСӼ + */ +Status SubString(SString Sub, SString S, int pos, int len) { + int i; + + if(pos < 1 || pos > S[0] || len < 0 || pos + len - 1 > S[0]) { + return ERROR; + } + + // Ԫ + for(i = 1; i <= len; i++) { + Sub[i] = S[pos + i - 1]; + } + + // ȷ³ + Sub[0] = len; + + return OK; +} + +/* + * ɾ + * + * ɾS[pos, pos+len-1] + */ +Status StrDelete(SString S, int pos, int len) { + int i; + + if(pos < 1 || pos + len - 1 > S[0] || len < 0) { + return ERROR; + } + + // ɾijΪ0ǰ + if(len == 0) { + return OK; + } + + // ѺԪŲǰ棬ǵɾԪ + for(i = pos + len; i <= S[0]; i++) { + S[i - len] = S[i]; + } + + // ȼ + S[0] -= len; + + return OK; +} + +/* + * Ƚ + * + * ȽϴSʹTرȽϽ + * + *ע + * òСӼ + */ +int StrCompare(SString S, SString T) { + int i = 1; + + while(i <= S[0] && i <= T[0]) { + // ַͬʱȽС + if(S[i] != T[i]) { + return S[i] - T[i]; + } + + i++; + } + + return S[0] - T[0]; +} + +/* + * + * + * SƵT + */ +Status StrCopy(SString T, SString S) { + int i; + + // ͬϢһ + for(i = 0; i <= S[0]; i++) { + T[i] = S[i]; + } + + return OK; +} + +/* + * ַSеĿհףɴӡַո + * + *ע + * úڱġ + */ +Status ClearBlank(SString S) { + int i, j; + + // ǿմ + if(S[0] == 0) { + return ERROR; + } + + for(i = 1, j = 0; i <= S[0]; i++) { + // հףԹ + if(S[i] == ' ' || !isprint(S[i])) { + continue; + } + + j++; + + S[j] = S[i]; + } + + S[0] = j; + + return OK; +} diff --git a/Dev-C++/ExerciseBook/05.34.2/SString.h b/Dev-C++/ExerciseBook/05.34.2/SString.h new file mode 100644 index 0000000..0632f18 --- /dev/null +++ b/Dev-C++/ExerciseBook/05.34.2/SString.h @@ -0,0 +1,117 @@ +/*============================= + * Ķ˳洢ʾ˳򴮣 + * + * 㷨: 4.14.24.34.5 + ==============================*/ + +#ifndef SSTRING_H +#define SSTRING_H + +#include +#include // ṩ strlen ԭ +#include // ṩ isprint ԭ +#include "Status.h" //**01 **// + +/* 궨 */ +#define MAXSTRLEN 255 // ˳򴮵󴮳 + +/* + * ˳洢Ͷ + * + * עЧԪشSString1ŵԪʼ洢 + * SString0ŵԪ洢䳤 + */ +typedef unsigned char SString[MAXSTRLEN + 1]; // 0ŵԪŴij + + +/* + * ʾ + * + * ѭ̲ĵдϰߣposָʾַλ()1ʼ + */ + + +/* + * ʼ + * + * һֵΪcharsĴT + * + *ע + * òСӼ + */ +Status StrAssign(SString T, const char* chars); + +/* + * + * + * Sա + */ +Status ClearString(SString S); + +/* + * п + * + * жϴSǷЧݡ + * + * ֵ + * TRUE : SΪ + * FALSE: SΪ + */ +Status StrEmpty(SString S); + +/* + * + * + * شSԪصĸ + * + *ע + * òСӼ + */ +int StrLength(SString S); + +/* + * 㷨4.3 + * + * Ӵ + * + * SubS[pos, pos+len-1] + * ֵָʾǷȡɹ + * + *ע + * òСӼ + */ +Status SubString(SString Sub, SString S, int pos, int len); + +/* + * ɾ + * + * ɾS[pos, pos+len-1] + */ +Status StrDelete(SString S, int pos, int len); + +/* + * Ƚ + * + * ȽϴSʹTرȽϽ + * + *ע + * òСӼ + */ +int StrCompare(SString S, SString T); + +/* + * + * + * SƵT + */ +Status StrCopy(SString T, SString S); + +/* + * ַSеĿհףɴӡַո + * + *ע + * úڱġ + */ +Status ClearBlank(SString S); + +#endif diff --git a/Dev-C++/ExerciseBook/05.35-05.36/05.35-05.36.cpp b/Dev-C++/ExerciseBook/05.35-05.36/05.35-05.36.cpp new file mode 100644 index 0000000..615ee5e --- /dev/null +++ b/Dev-C++/ExerciseBook/05.35-05.36/05.35-05.36.cpp @@ -0,0 +1,45 @@ +#include +#include "Status.h" //**01 **// +#include "SString.h" //**04 **// +#include "GList.h" //**05 ͹**// + +/* + * Lォ"( )"ΪΪյ״̬ + */ +Status Algo_5_35(GList* L, SString S); + +/* + * Lォ"( )"ΪΪյ״̬ + */ +void Algo_5_36(GList L); + + +int main(int argc, char* argv[]) { + GList L; + char* s = "(( ),(e),(a,(b,c,d)))"; + SString S; + + printf(" L ...\n"); + StrAssign(S, s); + Algo_5_35(&L, S); + + printf("L = "); + Algo_5_36(L); + + return 0; +} + + +/* + * Lォ"( )"ΪΪյ״̬ + */ +Status Algo_5_35(GList* L, SString S) { + return CreateGList(L, S); +} + +/* + * Lォ"( )"ΪΪյ״̬ + */ +void Algo_5_36(GList L) { + PrintGraph(L); +} diff --git a/Dev-C++/ExerciseBook/05.35-05.36/05.35-05.36.dev b/Dev-C++/ExerciseBook/05.35-05.36/05.35-05.36.dev new file mode 100644 index 0000000..5f68ebb --- /dev/null +++ b/Dev-C++/ExerciseBook/05.35-05.36/05.35-05.36.dev @@ -0,0 +1,102 @@ +[Project] +FileName=05.35-05.36.dev +Name=05.35-05.36 +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 + +[Unit4] +FileName=SString.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit2] +FileName=GList.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit1] +FileName=05.35-05.36.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit3] +FileName=GList.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit5] +FileName=SString.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + diff --git a/Dev-C++/ExerciseBook/05.35-05.36/GList.cpp b/Dev-C++/ExerciseBook/05.35-05.36/GList.cpp new file mode 100644 index 0000000..3956155 --- /dev/null +++ b/Dev-C++/ExerciseBook/05.35-05.36/GList.cpp @@ -0,0 +1,179 @@ +/*============================ + * ͷβ洢ʾ + =============================*/ + +#include "GList.h" + +/* + * + * + * ַSL + * + *ע + * ォ"( )"ΪΪյ״̬ + */ +Status CreateGList(GList* L, SString S) { + SString emp; // չַ + SString hsub, sub; + GList p, q; + + if(L == NULL) { + return ERROR; + } + + // ַSеĿհףɴӡַո + ClearBlank(S); + + if(StrEmpty(S)) { + return ERROR; + } + + StrAssign(emp, "( )"); + + /* + * 봮Ϊ()ҪյĹ + * + *ע + * ̲Ĵġ + * StrCompareķֵָʾַĴСָʾַǷȡ + * S()ȣֵӦ0 + */ + if(!StrCompare(S, emp)) { + *L = NULL; + } else { + *L = (GList) malloc(sizeof(GLNode)); + if(*L == NULL) { + exit(OVERFLOW); + } + + // ԭ + if(StrLength(S) == 1) { + (*L)->tag = Atom; + (*L)->Node.atom = S[1]; + } else { + (*L)->tag = List; + + p = *L; + + // ȥ + SubString(sub, S, 2, StrLength(S) - 2); + + // ظnӱ + do { + // subзͷhsubɺsubҲᷢ仯 + sever(hsub, sub); + + // ݹ鴴 + CreateGList(&(p->Node.ptr.hp), hsub); + + q = p; + + // βΪգҪβ + if(!StrEmpty(sub)) { + p = (GList) malloc(sizeof(GLNode)); + if(p == NULL) { + exit(OVERFLOW); + } + + p->tag = List; + + q->Node.ptr.tp = p; + } + } while(!StrEmpty(sub)); + + q->Node.ptr.tp = NULL; + } + } + + return OK; +} + +/* + * ͼλ + * + * L + * + *ע + * ォ"( )"ΪΪյ״̬ + */ +void PrintGraph(GList L) { + Print(L, Head); + printf("\n"); +} + +/* + * ͼλڲʵ֣markͼλǡ + */ +static void Print(GList L, Mark mark) { + // LΪ + if(L == NULL) { + if(mark == Head) { + printf("( "); + } + + printf(")"); + + // LΪʱ + } else { + // ԭӽ㣬ԭ + if(L->tag == Atom) { + printf("%c", L->Node.atom); + + // ӱ㣬ҪԱͷβֱ + } else { + if(mark == Head) { + printf("("); + } else { + printf(","); + } + + Print(L->Node.ptr.hp, Head); + Print(L->Node.ptr.tp, Tail); + } + } +} + +/* + * 㷨5.8 + * + * ǿմstrָ֣hsubΪһ','֮ǰӴstrΪһ','֮Ӵ + * + *ע + * 1.ַstrȷ޿հ׷ţstrѾȥš + * 2.ɺstrҲᷢ仯 + */ +static void sever(SString hstr, SString str) { + int i, k, n; + SString ch; + + n = StrLength(str); + + i = 0; // ַʱα + k = 0; // δ + + do { + ++i; + + // ȡstrһַ + SubString(ch, str, i, 1); + + if(ch[1] == '(') { + ++k; + } + + if(ch[1] == ')') { + --k; + } + } while(i < n && (ch[1] != ',' || k != 0)); + + // ڶ + if(i < n) { + SubString(hstr, str, 1, i - 1); + SubString(str, str, i + 1, n - i); + + // ֻһ + } else { + StrCopy(hstr, str); + ClearString(str); + } +} diff --git a/Dev-C++/ExerciseBook/05.35-05.36/GList.h b/Dev-C++/ExerciseBook/05.35-05.36/GList.h new file mode 100644 index 0000000..c9837e7 --- /dev/null +++ b/Dev-C++/ExerciseBook/05.35-05.36/GList.h @@ -0,0 +1,82 @@ +/*============================ + * ͷβ洢ʾ + =============================*/ + +#ifndef GLIST_H +#define GLIST_H + +#include +#include // ṩ mallocreallocfreeexit ԭ +#include "Status.h" //**01 **// +#include "SString.h" //**04 **// + +/* ԭԪ */ +typedef char AtomType; + +/* + * + * + * Atom-0ԭӽ + * List-1 + */ +typedef enum { Atom, List } ElemTag; + +/* ͷβ洢ʾͶ */ +typedef struct GLNode { + ElemTag tag; // ǣԭӽͱ + + // ԭӽͱϲ + union { + AtomType atom; // atomԭӽֵAtomTypeû + struct { + struct GLNode* hp; // ָͷ + struct GLNode* tp; // ָβ + } ptr; // ָ + } Node; +} GLNode; + +/* */ +typedef GLNode* GList; + +/* + * ͼλ + * + * HeadָԱͷ + * TailָԱβ + */ +typedef enum { Head, Tail } Mark; + + +/* + * 㷨5.7 + * + * + * + * ַSL + */ +Status CreateGList(GList* L, SString S); + +/* + * ͼλ + * + * L + */ +void PrintGraph(GList L); + +/* + * ͼλڲʵ֣markͼλǡ + */ +static void Print(GList L, Mark mark); + +/* + * 㷨5.8 + * + * ǿմstrָ֣hsubΪһ','֮ǰӴstrΪһ','֮Ӵ + * + *ע + * 1.ַstrȷ޿հ׷ţstrѾȥš + * 2.ɺstrҲᷢ仯 + */ +static void sever(SString hstr, SString str); + +#endif diff --git a/Dev-C++/ExerciseBook/05.35-05.36/SString.cpp b/Dev-C++/ExerciseBook/05.35-05.36/SString.cpp new file mode 100644 index 0000000..b8bb831 --- /dev/null +++ b/Dev-C++/ExerciseBook/05.35-05.36/SString.cpp @@ -0,0 +1,195 @@ +/*============================= + * Ķ˳洢ʾ˳򴮣 + * + * 㷨: 4.14.24.34.5 + ==============================*/ + +#include "SString.h" //**04 **// + +/* + * ʼ + * + * һֵΪcharsĴT + * + *ע + * òСӼ + */ +Status StrAssign(SString T, const char* chars) { + int i, len; + + len = (int) strlen(chars); + + // chars + if(len > MAXSTRLEN) { + return ERROR; + } + + T[0] = len; + for(i = 1; i <= len; i++) { + T[i] = chars[i - 1]; + } + + return OK; +} + +/* + * + * + * Sա + */ +Status ClearString(SString S) { + // ֻҪΪ0Ϳ + S[0] = 0; + return OK; +} + +/* + * п + * + * жϴSǷЧݡ + * + * ֵ + * TRUE : SΪ + * FALSE: SΪ + */ +Status StrEmpty(SString S) { + return S[0] == 0 ? TRUE : FALSE; +} + +/* + * + * + * شSԪصĸ + * + *ע + * òСӼ + */ +int StrLength(SString S) { + return S[0]; +} + +/* + * 㷨4.3 + * + * Ӵ + * + * SubS[pos, pos+len-1] + * ֵָʾǷȡɹ + * + *ע + * òСӼ + */ +Status SubString(SString Sub, SString S, int pos, int len) { + int i; + + if(pos < 1 || pos > S[0] || len < 0 || pos + len - 1 > S[0]) { + return ERROR; + } + + // Ԫ + for(i = 1; i <= len; i++) { + Sub[i] = S[pos + i - 1]; + } + + // ȷ³ + Sub[0] = len; + + return OK; +} + +/* + * ɾ + * + * ɾS[pos, pos+len-1] + */ +Status StrDelete(SString S, int pos, int len) { + int i; + + if(pos < 1 || pos + len - 1 > S[0] || len < 0) { + return ERROR; + } + + // ɾijΪ0ǰ + if(len == 0) { + return OK; + } + + // ѺԪŲǰ棬ǵɾԪ + for(i = pos + len; i <= S[0]; i++) { + S[i - len] = S[i]; + } + + // ȼ + S[0] -= len; + + return OK; +} + +/* + * Ƚ + * + * ȽϴSʹTرȽϽ + * + *ע + * òСӼ + */ +int StrCompare(SString S, SString T) { + int i = 1; + + while(i <= S[0] && i <= T[0]) { + // ַͬʱȽС + if(S[i] != T[i]) { + return S[i] - T[i]; + } + + i++; + } + + return S[0] - T[0]; +} + +/* + * + * + * SƵT + */ +Status StrCopy(SString T, SString S) { + int i; + + // ͬϢһ + for(i = 0; i <= S[0]; i++) { + T[i] = S[i]; + } + + return OK; +} + +/* + * ַSеIJɴӡַո + * + *ע + * úڱġ + */ +Status ClearBlank(SString S) { + int i, j; + + // ǿմ + if(S[0] == 0) { + return ERROR; + } + + for(i = 1, j = 0; i <= S[0]; i++) { + // հףԹ + if(!isprint(S[i])) { + continue; + } + + j++; + + S[j] = S[i]; + } + + S[0] = j; + + return OK; +} diff --git a/Dev-C++/ExerciseBook/05.35-05.36/SString.h b/Dev-C++/ExerciseBook/05.35-05.36/SString.h new file mode 100644 index 0000000..3635a16 --- /dev/null +++ b/Dev-C++/ExerciseBook/05.35-05.36/SString.h @@ -0,0 +1,117 @@ +/*============================= + * Ķ˳洢ʾ˳򴮣 + * + * 㷨: 4.14.24.34.5 + ==============================*/ + +#ifndef SSTRING_H +#define SSTRING_H + +#include +#include // ṩ strlen ԭ +#include // ṩ isprint ԭ +#include "Status.h" //**01 **// + +/* 궨 */ +#define MAXSTRLEN 255 // ˳򴮵󴮳 + +/* + * ˳洢Ͷ + * + * עЧԪشSString1ŵԪʼ洢 + * SString0ŵԪ洢䳤 + */ +typedef unsigned char SString[MAXSTRLEN + 1]; // 0ŵԪŴij + + +/* + * ʾ + * + * ѭ̲ĵдϰߣposָʾַλ()1ʼ + */ + + +/* + * ʼ + * + * һֵΪcharsĴT + * + *ע + * òСӼ + */ +Status StrAssign(SString T, const char* chars); + +/* + * + * + * Sա + */ +Status ClearString(SString S); + +/* + * п + * + * жϴSǷЧݡ + * + * ֵ + * TRUE : SΪ + * FALSE: SΪ + */ +Status StrEmpty(SString S); + +/* + * + * + * شSԪصĸ + * + *ע + * òСӼ + */ +int StrLength(SString S); + +/* + * 㷨4.3 + * + * Ӵ + * + * SubS[pos, pos+len-1] + * ֵָʾǷȡɹ + * + *ע + * òСӼ + */ +Status SubString(SString Sub, SString S, int pos, int len); + +/* + * ɾ + * + * ɾS[pos, pos+len-1] + */ +Status StrDelete(SString S, int pos, int len); + +/* + * Ƚ + * + * ȽϴSʹTرȽϽ + * + *ע + * òСӼ + */ +int StrCompare(SString S, SString T); + +/* + * + * + * SƵT + */ +Status StrCopy(SString T, SString S); + +/* + * ַSеIJɴӡַո + * + *ע + * úڱġ + */ +Status ClearBlank(SString S); + +#endif diff --git a/Dev-C++/ExerciseBook/05.37.1/05.37.1.cpp b/Dev-C++/ExerciseBook/05.37.1/05.37.1.cpp new file mode 100644 index 0000000..11b37d6 --- /dev/null +++ b/Dev-C++/ExerciseBook/05.37.1/05.37.1.cpp @@ -0,0 +1,63 @@ +#include +#include "SString.h" //**04 **// +#include "GList-HT.h" //**05 ͹**// + +/* + * ɾֵΪxԭͷβ洢ʾ + */ +void Algo_5_37_1(GList* L, AtomType x); + + +int main(int argc, char* argv[]) { + GList L; + char* s = "((b),(e),(a,(b,c,d)),(b,((b),b)),x,b,(y))"; + SString S; + + printf(" L ...\n"); + StrAssign(S, s); + CreateGList(&L, S); + printf("L = "); + PrintGraph(L); + + printf("ɾ L еԪ 'b' ...\n"); + Algo_5_37_1(&L, 'b'); + printf("L = "); + PrintGraph(L); + + return 0; +} + + +/* + * ɾֵΪxԭͷβ洢ʾ + */ +void Algo_5_37_1(GList* L, AtomType x) { + GList h, p; + + if(L == NULL || *L == NULL || (*L)->tag == Atom) { + return; + } + + h = (*L)->Node.ptr.hp; + + if(h != NULL) { + if(h->tag == List) { + Algo_5_37_1(&((*L)->Node.ptr.hp), x); + Algo_5_37_1(&((*L)->Node.ptr.tp), x); + } else { + if(h->Node.atom == x) { + p = *L; + *L = (*L)->Node.ptr.tp; + p->Node.ptr.tp = NULL; + DestroyGList(&p); + Algo_5_37_1(L, x); + } else { + Algo_5_37_1(&((*L)->Node.ptr.tp), x); + } + } + } else { + if((*L)->Node.ptr.tp != NULL) { + Algo_5_37_1(&((*L)->Node.ptr.tp), x); + } + } +} diff --git a/Dev-C++/ExerciseBook/05.37.1/05.37.1.dev b/Dev-C++/ExerciseBook/05.37.1/05.37.1.dev new file mode 100644 index 0000000..d2794e4 --- /dev/null +++ b/Dev-C++/ExerciseBook/05.37.1/05.37.1.dev @@ -0,0 +1,102 @@ +[Project] +FileName=05.37.1.dev +Name=05.37.1 +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 + +[Unit4] +FileName=SString.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit2] +FileName=GList-HT.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit1] +FileName=05.37.1.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit3] +FileName=GList-HT.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit5] +FileName=SString.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + diff --git a/Dev-C++/ExerciseBook/05.37.1/GList-HT.cpp b/Dev-C++/ExerciseBook/05.37.1/GList-HT.cpp new file mode 100644 index 0000000..bad30df --- /dev/null +++ b/Dev-C++/ExerciseBook/05.37.1/GList-HT.cpp @@ -0,0 +1,418 @@ +/*============================ + * ͷβ洢ʾ + * + * 㷨: 5.55.65.75.8 + =============================*/ + +#include "GList-HT.h" //**05 ͹**// + +/* + * ʼ + * + * ʼյĹΪ0Ϊ1 + * + *ע + * Ҫÿһȥſ + */ +Status InitGList(GList* L) { + if(L == NULL) { + return ERROR; + } + + *L = NULL; + + return OK; +} + +/* + * 㷨5.7 + * + * + * + * ַSL + */ +Status CreateGList(GList* L, SString S) { + SString emp; // չַ + SString hsub, sub; + GList p, q; + + if(L == NULL) { + return ERROR; + } + + // ַSеĿհףɴӡַո + ClearBlank(S); + + if(StrEmpty(S)) { + return ERROR; + } + + StrAssign(emp, "()"); + + /* + * 봮Ϊ()ҪյĹ + * + *ע + * ̲Ĵġ + * StrCompareķֵָʾַĴСָʾַǷȡ + * S()ȣֵӦ0 + */ + if(!StrCompare(S, emp)) { + *L = NULL; + } else { + *L = (GList) malloc(sizeof(GLNode)); + if(*L == NULL) { + exit(OVERFLOW); + } + + // ԭ + if(StrLength(S) == 1) { + (*L)->tag = Atom; + (*L)->Node.atom = S[1]; + } else { + (*L)->tag = List; + + p = *L; + + // ȥ + SubString(sub, S, 2, StrLength(S) - 2); + + // ظnӱ + do { + // subзͷhsubɺsubҲᷢ仯 + sever(hsub, sub); + + // ݹ鴴 + CreateGList(&(p->Node.ptr.hp), hsub); + + q = p; + + // βΪգҪβ + if(!StrEmpty(sub)) { + p = (GList) malloc(sizeof(GLNode)); + if(p == NULL) { + exit(OVERFLOW); + } + + p->tag = List; + + q->Node.ptr.tp = p; + } + } while(!StrEmpty(sub)); + + q->Node.ptr.tp = NULL; + } + } + + return OK; +} + +/* + * + * + * ͷŹռڴ档 + */ +Status DestroyGList(GList* L) { + GList head, tail; + + if(L == NULL || *L == NULL) { + return ERROR; + } + + // ɾԭӽ + if((*L)->tag == Atom) { + free(*L); + *L = NULL; + + // ɾӱ + } else { + head = (*L)->Node.ptr.hp; + tail = (*L)->Node.ptr.tp; + free(*L); + *L = NULL; + DestroyGList(&head); + DestroyGList(&tail); + } + + return OK; +} + +/* + * 㷨5.6 + * + * + * + * ɹLƵõT + */ +Status CopyGList(GList* T, GList L) { + if(T == NULL) { + return ERROR; + } + + if(L == NULL) { + *T = NULL; + } else { + // ½ + *T = (GList) malloc(sizeof(GLNode)); + if(*T == NULL) { + exit(OVERFLOW); + } + + (*T)->tag = L->tag; + + // Ƶԭ + if(L->tag == Atom) { + (*T)->Node.atom = L->Node.atom; + + // Ʊͷͱβ + } else { + CopyGList(&((*T)->Node.ptr.hp), L->Node.ptr.hp); + CopyGList(&((*T)->Node.ptr.tp), L->Node.ptr.tp); + } + } + + return OK; +} + +/* + * + * + * عijȡ + */ +int GListLength(GList L) { + int count; + + for(count = 0; L != NULL; count++, L = L->Node.ptr.tp) { + } + + return count; +} + +/* + * 㷨5.5 + * + * + * + * ع + */ +int GListDepth(GList L) { + int max, deep; + GList p; + + // ձΪ1 + if(L == NULL) { + return 1; + } + + // ԭΪ0 + if(L->tag == Atom) { + return 0; + } + + // ݹӱ + for(max = 0, p = L; p != NULL; p = p->Node.ptr.tp) { + deep = GListDepth(p->Node.ptr.hp); + if(deep > max) { + max = deep; + } + } + + // ǿձǸԪȼһ + return max + 1; +} + +/* + * п + * + * жϹǷΪա + */ +Status GListEmpty(GList L) { + return L == NULL ? TRUE : FALSE; +} + +/* + * ͷ + */ +GList GetHead(GList L) { + GList p; + + // ձޱͷﲻܷNULLȻֲʧ˻Ƿ˿ձ + if(L == NULL) { + exit(ERROR); + } + + CopyGList(&p, L->Node.ptr.hp); + + return p; +} + +/* + * β + */ +GList GetTail(GList L) { + GList p; + + // ձޱβﲻܷNULLȻֲʧ˻Ƿ˿ձ + if(L == NULL) { + exit(ERROR); + } + + CopyGList(&p, L->Node.ptr.tp); + + return p; +} + +/* + * + * + * ԪeΪLĵһԪء + */ +Status InsertFirst(GList* L, GList e) { + GList g; + + if(L == NULL) { + return ERROR; + } + + g = (GList) malloc(sizeof(GLNode)); + if(g == NULL) { + exit(OVERFLOW); + } + + g->tag = List; + g->Node.ptr.hp = e; + g->Node.ptr.tp = *L; + *L = g; + + return OK; +} + +/* + * ɾ + * + * LĵһԪɾeء + */ +Status DeleteFirst(GList* L, GList* e) { + GList p; + + // ձ޷ɾ + if(L == NULL || *L == NULL) { + return ERROR; + } + + p = *L; + *L = (*L)->Node.ptr.tp; + + CopyGList(e, p->Node.ptr.hp); + + free(p); + + return OK; +} + +/* + * + * + * visitʹL + */ +void Traverse(GList L, void(Visit)(AtomType)) { + + if(L == NULL) { + return; + } + + if(L->tag == Atom) { + Visit(L->Node.atom); + } else { + Traverse(L->Node.ptr.hp, Visit); + Traverse(L->Node.ptr.tp, Visit); + } + +} + +/* + * ͼλ + * + * L + */ +void PrintGraph(GList L) { + Print(L, Head); + printf("\n"); +} + +/* + * ͼλڲʵ֣markͼλǡ + */ +static void Print(GList L, Mark mark) { + // LΪ + if(L == NULL) { + if(mark == Head) { + printf("("); + } + + printf(")"); + + // LΪʱ + } else { + // ԭӽ㣬ԭ + if(L->tag == Atom) { + printf("%c", L->Node.atom); + + // ӱ㣬ҪԱͷβֱ + } else { + if(mark == Head) { + printf("("); + } else { + printf(","); + } + + Print(L->Node.ptr.hp, Head); + Print(L->Node.ptr.tp, Tail); + } + } +} + +/* + * 㷨5.8 + * + * ǿմstrָ֣hsubΪһ','֮ǰӴstrΪһ','֮Ӵ + * + *ע + * 1.ַstrȷ޿հ׷ţstrѾȥš + * 2.ɺstrҲᷢ仯 + */ +static void sever(SString hstr, SString str) { + int i, k, n; + SString ch; + + n = StrLength(str); + + i = 0; // ַʱα + k = 0; // δ + + do { + ++i; + + // ȡstrһַ + SubString(ch, str, i, 1); + + if(ch[1] == '(') { + ++k; + } + + if(ch[1] == ')') { + --k; + } + } while(i < n && (ch[1] != ',' || k != 0)); + + // ڶ + if(i < n) { + SubString(hstr, str, 1, i - 1); + SubString(str, str, i + 1, n - i); + + // ֻһ + } else { + StrCopy(hstr, str); + ClearString(str); + } +} diff --git a/Dev-C++/ExerciseBook/05.37.1/GList-HT.h b/Dev-C++/ExerciseBook/05.37.1/GList-HT.h new file mode 100644 index 0000000..508b96f --- /dev/null +++ b/Dev-C++/ExerciseBook/05.37.1/GList-HT.h @@ -0,0 +1,164 @@ +/*============================ + * ͷβ洢ʾ + * + * 㷨: 5.55.65.75.8 + =============================*/ + +#ifndef GLIST_HT_H +#define GLIST_HT_H + +#include +#include // ṩ mallocreallocfreeexit ԭ +#include "Status.h" //**01 **// +#include "SString.h" //**04 **// + +/* ԭԪ */ +typedef char AtomType; + +/* + * + * + * Atom-0ԭӽ + * List-1 + */ +typedef enum { Atom, List } ElemTag; + +/* ͷβ洢ʾͶ */ +typedef struct GLNode { + ElemTag tag; // ǣԭӽͱ + + // ԭӽͱϲ + union { + AtomType atom; // atomԭӽֵAtomTypeû + struct { + struct GLNode* hp; // ָͷ + struct GLNode* tp; // ָβ + } ptr; // ָ + } Node; +} GLNode; + +/* */ +typedef GLNode* GList; + +/* + * ͼλ + * + * HeadָԱͷ + * TailָԱβ + */ +typedef enum { Head, Tail } Mark; + + +/* + * ʼ + * + * ʼյĹΪ0Ϊ1 + * + *ע + * Ҫÿһȥſ + */ +Status InitGList(GList* L); + +/* + * 㷨5.7 + * + * + * + * ַSL + */ +Status CreateGList(GList* L, SString S); + +/* + * + * + * ͷŹռڴ档 + */ +Status DestroyGList(GList* L); + +/* + * 㷨5.6 + * + * + * + * ɹLƵõT + */ +Status CopyGList(GList* T, GList L); + +/* + * + * + * عijȡ + */ +int GListLength(GList L); + +/* + * 㷨5.5 + * + * + * + * ع + */ +int GListDepth(GList L); + +/* + * п + * + * жϹǷΪա + */ +Status GListEmpty(GList L); + +/* + * ͷ + */ +GList GetHead(GList L); + +/* + * β + */ +GList GetTail(GList L); + +/* + * + * + * ԪeΪLĵһԪء + */ +Status InsertFirst(GList* L, GList e); + +/* + * ɾ + * + * LĵһԪɾeء + */ +Status DeleteFirst(GList* L, GList* e); + +/* + * + * + * visitʹL + */ +void Traverse(GList L, void (Visit)(AtomType)); + +/* + * ͼλ + * + * L + */ +void PrintGraph(GList L); + +/* + * ͼλڲʵ֣markͼλǡ + */ +static void Print(GList L, Mark mark); + +/* + * 㷨5.8 + * + * ǿմstrָ֣hsubΪһ','֮ǰӴstrΪһ','֮Ӵ + * + *ע + * 1.ַstrȷ޿հ׷ţstrѾȥš + * 2.ɺstrҲᷢ仯 + */ +static void sever(SString hstr, SString str); + +#endif diff --git a/Dev-C++/ExerciseBook/05.37.1/SString.cpp b/Dev-C++/ExerciseBook/05.37.1/SString.cpp new file mode 100644 index 0000000..7a96fcf --- /dev/null +++ b/Dev-C++/ExerciseBook/05.37.1/SString.cpp @@ -0,0 +1,195 @@ +/*============================= + * Ķ˳洢ʾ˳򴮣 + * + * 㷨: 4.14.24.34.5 + ==============================*/ + +#include "SString.h" //**04 **// + +/* + * ʼ + * + * һֵΪcharsĴT + * + *ע + * òСӼ + */ +Status StrAssign(SString T, const char* chars) { + int i, len; + + len = (int) strlen(chars); + + // chars + if(len > MAXSTRLEN) { + return ERROR; + } + + T[0] = len; + for(i = 1; i <= len; i++) { + T[i] = chars[i - 1]; + } + + return OK; +} + +/* + * + * + * Sա + */ +Status ClearString(SString S) { + // ֻҪΪ0Ϳ + S[0] = 0; + return OK; +} + +/* + * п + * + * жϴSǷЧݡ + * + * ֵ + * TRUE : SΪ + * FALSE: SΪ + */ +Status StrEmpty(SString S) { + return S[0] == 0 ? TRUE : FALSE; +} + +/* + * + * + * شSԪصĸ + * + *ע + * òСӼ + */ +int StrLength(SString S) { + return S[0]; +} + +/* + * 㷨4.3 + * + * Ӵ + * + * SubS[pos, pos+len-1] + * ֵָʾǷȡɹ + * + *ע + * òСӼ + */ +Status SubString(SString Sub, SString S, int pos, int len) { + int i; + + if(pos < 1 || pos > S[0] || len < 0 || pos + len - 1 > S[0]) { + return ERROR; + } + + // Ԫ + for(i = 1; i <= len; i++) { + Sub[i] = S[pos + i - 1]; + } + + // ȷ³ + Sub[0] = len; + + return OK; +} + +/* + * ɾ + * + * ɾS[pos, pos+len-1] + */ +Status StrDelete(SString S, int pos, int len) { + int i; + + if(pos < 1 || pos + len - 1 > S[0] || len < 0) { + return ERROR; + } + + // ɾijΪ0ǰ + if(len == 0) { + return OK; + } + + // ѺԪŲǰ棬ǵɾԪ + for(i = pos + len; i <= S[0]; i++) { + S[i - len] = S[i]; + } + + // ȼ + S[0] -= len; + + return OK; +} + +/* + * Ƚ + * + * ȽϴSʹTرȽϽ + * + *ע + * òСӼ + */ +int StrCompare(SString S, SString T) { + int i = 1; + + while(i <= S[0] && i <= T[0]) { + // ַͬʱȽС + if(S[i] != T[i]) { + return S[i] - T[i]; + } + + i++; + } + + return S[0] - T[0]; +} + +/* + * + * + * SƵT + */ +Status StrCopy(SString T, SString S) { + int i; + + // ͬϢһ + for(i = 0; i <= S[0]; i++) { + T[i] = S[i]; + } + + return OK; +} + +/* + * ַSеĿհףɴӡַո + * + *ע + * úڱġ + */ +Status ClearBlank(SString S) { + int i, j; + + // ǿմ + if(S[0] == 0) { + return ERROR; + } + + for(i = 1, j = 0; i <= S[0]; i++) { + // հףԹ + if(S[i] == ' ' || !isprint(S[i])) { + continue; + } + + j++; + + S[j] = S[i]; + } + + S[0] = j; + + return OK; +} diff --git a/Dev-C++/ExerciseBook/05.37.1/SString.h b/Dev-C++/ExerciseBook/05.37.1/SString.h new file mode 100644 index 0000000..0632f18 --- /dev/null +++ b/Dev-C++/ExerciseBook/05.37.1/SString.h @@ -0,0 +1,117 @@ +/*============================= + * Ķ˳洢ʾ˳򴮣 + * + * 㷨: 4.14.24.34.5 + ==============================*/ + +#ifndef SSTRING_H +#define SSTRING_H + +#include +#include // ṩ strlen ԭ +#include // ṩ isprint ԭ +#include "Status.h" //**01 **// + +/* 궨 */ +#define MAXSTRLEN 255 // ˳򴮵󴮳 + +/* + * ˳洢Ͷ + * + * עЧԪشSString1ŵԪʼ洢 + * SString0ŵԪ洢䳤 + */ +typedef unsigned char SString[MAXSTRLEN + 1]; // 0ŵԪŴij + + +/* + * ʾ + * + * ѭ̲ĵдϰߣposָʾַλ()1ʼ + */ + + +/* + * ʼ + * + * һֵΪcharsĴT + * + *ע + * òСӼ + */ +Status StrAssign(SString T, const char* chars); + +/* + * + * + * Sա + */ +Status ClearString(SString S); + +/* + * п + * + * жϴSǷЧݡ + * + * ֵ + * TRUE : SΪ + * FALSE: SΪ + */ +Status StrEmpty(SString S); + +/* + * + * + * شSԪصĸ + * + *ע + * òСӼ + */ +int StrLength(SString S); + +/* + * 㷨4.3 + * + * Ӵ + * + * SubS[pos, pos+len-1] + * ֵָʾǷȡɹ + * + *ע + * òСӼ + */ +Status SubString(SString Sub, SString S, int pos, int len); + +/* + * ɾ + * + * ɾS[pos, pos+len-1] + */ +Status StrDelete(SString S, int pos, int len); + +/* + * Ƚ + * + * ȽϴSʹTرȽϽ + * + *ע + * òСӼ + */ +int StrCompare(SString S, SString T); + +/* + * + * + * SƵT + */ +Status StrCopy(SString T, SString S); + +/* + * ַSеĿհףɴӡַո + * + *ע + * úڱġ + */ +Status ClearBlank(SString S); + +#endif diff --git a/Dev-C++/ExerciseBook/05.37.2/05.37.2.cpp b/Dev-C++/ExerciseBook/05.37.2/05.37.2.cpp new file mode 100644 index 0000000..9e5afb1 --- /dev/null +++ b/Dev-C++/ExerciseBook/05.37.2/05.37.2.cpp @@ -0,0 +1,56 @@ +#include +#include // ṩmallocreallocfreeexitԭ +#include "SString.h" //**04 **// +#include "GList-E.h" //**05 ͹**// + +/* + * ɾֵΪxԭչ洢ʾ + */ +void Algo_5_37_2(GList* L, AtomType x); + + +int main(int argc, char* argv[]) { + GList L; + char* s = "((b),(e),(a,(b,c,d)),(b,((b),b)),x,b,(y))"; + SString S; + + printf(" L ...\n"); + StrAssign(S, s); + CreateGList(&L, S); + printf("L = "); + PrintGraph(L); + + printf("ɾ L еԪ 'b' ...\n"); + Algo_5_37_2(&L, 'b'); + printf("L = "); + PrintGraph(L); + + return 0; +} + + +/* + * ɾֵΪxԭչ洢ʾ + */ +void Algo_5_37_2(GList* L, AtomType x) { + GList p; + + if(L == NULL || *L == NULL) { + return; + } + + if((*L)->tag == List) { + Algo_5_37_2(&((*L)->Node.hp), x); + Algo_5_37_2(&((*L)->tp), x); + } else { + if((*L)->Node.atom == x) { + p = *L; + *L = (*L)->tp; + free(p); + + Algo_5_37_2(L, x); + } else { + Algo_5_37_2(&((*L)->tp), x); + } + } +} diff --git a/Dev-C++/ExerciseBook/05.37.2/05.37.2.dev b/Dev-C++/ExerciseBook/05.37.2/05.37.2.dev new file mode 100644 index 0000000..f6537dd --- /dev/null +++ b/Dev-C++/ExerciseBook/05.37.2/05.37.2.dev @@ -0,0 +1,102 @@ +[Project] +FileName=05.37.2.dev +Name=05.37.2 +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 + +[Unit4] +FileName=SString.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit2] +FileName=GList-E.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit1] +FileName=05.37.2.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit3] +FileName=GList-E.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit5] +FileName=SString.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + diff --git a/Dev-C++/ExerciseBook/05.37.2/GList-E.cpp b/Dev-C++/ExerciseBook/05.37.2/GList-E.cpp new file mode 100644 index 0000000..3fc0ad9 --- /dev/null +++ b/Dev-C++/ExerciseBook/05.37.2/GList-E.cpp @@ -0,0 +1,449 @@ +/*=========================== + * չ洢ʾ + ============================*/ + +#include "GList-E.h" //**05 ͹**// + +/* + * ʼ + * + * ʼյĹΪ0Ϊ1 + * + *ע + * Ҫÿһſ + */ +Status InitGList(GList* L) { + if(L == NULL) { + return ERROR; + } + + *L = (GList) malloc(sizeof(GLNode)); + if(!*L) { + exit(OVERFLOW); + } + + (*L)->tag = List; + (*L)->Node.hp = NULL; + (*L)->tp = NULL; + + return OK; +} + +/* + * + * + * ַSL + */ +Status CreateGList(GList* L, SString S) { + SString emp, hsub, sub, tmp; + + if(L == NULL) { + return ERROR; + } + + // ַSеĿհףɴӡַո + ClearBlank(S); + + if(StrEmpty(S)) { + return ERROR; + } + + // Ϊ˲ƻS + StrCopy(sub, S); + + /* + * ִеʱ + * ٴִеʱѾȥ + */ + sever(hsub, sub); + + *L = (GList) malloc(sizeof(GLNode)); + if(*L == NULL) { + exit(OVERFLOW); + } + + StrAssign(emp, "()"); + + if(!StrCompare(hsub, emp)) { + (*L)->tag = List; + (*L)->Node.hp = NULL; + } else { + if(StrLength(hsub) == 1) { + (*L)->tag = Atom; + (*L)->Node.atom = hsub[1]; + } else { + (*L)->tag = List; + + SubString(tmp, hsub, 2, StrLength(hsub) - 2); + + CreateGList(&((*L)->Node.hp), tmp); + } + } + + // ڶβ˳ݹ + if(StrEmpty(sub)) { + (*L)->tp = NULL; + } else { + // ݹβ + CreateGList(&((*L)->tp), sub); + } + + return OK; +} + +/* + * + * + * ͷŹռڴ档 + */ +Status DestroyGList(GList* L) { + GList head, tail; + + if(L == NULL || *L == NULL) { + return ERROR; + } + + // ӱ + if((*L)->tag == List) { + head = (*L)->Node.hp; // ͷ + tail = (*L)->tp; // β + + free(*L); + *L = NULL; + + // ݹ鴦ͷ + if(head != NULL) { + DestroyGList(&head); + } + + // ݹ鴦β + if(tail != NULL) { + DestroyGList(&tail); + } + + // ԭӽ + } else { + tail = (*L)->tp; // β + + free(*L); + *L = NULL; + + if(tail != NULL) { + DestroyGList(&tail); + } + } + + return OK; +} + +/* + * + * + * ɹLƵõT + */ +Status CopyGList(GList* T, GList L) { + + if(L == NULL) { + return ERROR; + } + + *T = (GList) malloc(sizeof(GLNode)); + if(*T == NULL) { + exit(OVERFLOW); + } + + // ԭ + if(L->tag == Atom) { + (*T)->tag = Atom; + (*T)->Node.atom = L->Node.atom; + + // ӱ + } else { + (*T)->tag = List; + + // Ʊͷ + if(L->Node.hp != NULL) { + CopyGList(&((*T)->Node.hp), L->Node.hp); + } else { + (*T)->Node.hp = NULL; + } + } + + // Ʊβ + if(L->tp != NULL) { + CopyGList(&((*T)->tp), L->tp); + } else { + (*T)->tp = NULL; + } + + return OK; +} + +/* + * + * + * عijȡ + */ +int GListLength(GList L) { + int count = 0; + GList p; + + // + if(L == NULL) { + return -1; + } + + p = L->Node.hp; + + while(p != NULL) { + ++count; + p = p->tp; + } + + return count; +} + +/* + * + * + * ع + */ +int GListDepth(GList L) { + int max, deep; + GList p; + + max = 0; + + // + if(L == NULL) { + return -1; + } + + // ձΪ1 + if(L->tag == List && !L->Node.hp) { + return 1; + } + + // ԭΪ0 + if(L->tag == Atom) { + return 0; + } + + // ݹӱ + for(p = L->Node.hp; p != NULL; p = p->tp) { + // pΪͷָӱ + deep = GListDepth(p); + if(deep > max) { + max = deep; + } + } + + return max + 1; +} + +/* + * п + * + * жϹǷΪա + */ +Status GListEmpty(GList L) { + // + if(L == NULL) { + return ERROR; + } + + if(L->tag == List && L->Node.hp == NULL && L->tp == NULL) { + return TRUE; + } else { + return ERROR; + } +} + +/* + * ͷ + */ +GList GetHead(GList L) { + GList p, q; + + // ڻΪձ޷ȡͷ + if(L == NULL || L->Node.hp == NULL) { + return NULL; + } + + q = L->Node.hp->tp; // ʱLıβϢ + L->Node.hp->tp = NULL; // ȥLıβ + + CopyGList(&p, L->Node.hp); // ƱͷϢαβ + + L->Node.hp->tp = q; // ָLıβϢ + + return p; +} + +/* + * β + */ +GList GetTail(GList L) { + GList p, q; + + // ڻΪձ޷ȡβ + if(L == NULL || L->Node.hp == NULL) { + return NULL; + } + + q = L->Node.hp; // ʱLıͷϢ + L->Node.hp = q->tp; // ժLıͷ + + CopyGList(&p, L); // ƱβϢαͷ + + q->tp = L->Node.hp; // ָLıͷϢ + L->Node.hp = q; + + return p; +} + +/* + * + * + * ԪeΪLĵһԪء + */ +Status InsertFirst(GList* L, GList e) { + + // + if(L == NULL || *L == NULL) { + return ERROR; + } + + if(e == NULL) { + return ERROR; + } + + e->tp = (*L)->Node.hp; + (*L)->Node.hp = e; + + return OK; +} + +/* + * ɾ + * + * LĵһԪɾeء + */ +Status DeleteFirst(GList* L, GList* e) { + GList p; + + // ڻΪձ޷ɾͷ + if(*L == NULL || (*L)->Node.hp == NULL) { + return ERROR; + } + + p = (*L)->Node.hp; + (*L)->Node.hp = p->tp; + p->tp = NULL; + + *e = p; + + return OK; +} + +/* + * + * + * visitʹL + */ +void Traverse(GList L, void(Visit)(AtomType)) { + if(L == NULL) { + return; + } + + if(L->tag == List) { + Traverse(L->Node.hp, Visit); + } else { + Visit(L->Node.atom); + } + + Traverse(L->tp, Visit); +} + +/* + * ͼλ + * + * L + */ +void PrintGraph(GList L) { + Print(L); + printf("\n"); +} + +/* + * ͼλڲʵ֡ + */ +static void Print(GList L) { + if(L == NULL) { + return; + } + + // + if(L->tag == List) { + printf("("); + + if(L->Node.hp) { + Print(L->Node.hp); + } + + if(L->tp) { + printf("),"); + Print(L->tp); + } else { + printf(")"); + } + + // ԭӽ + } else { + printf("%c", L->Node.atom); + if(L->tp) { + printf(","); + Print(L->tp); + } + } +} + +/* + * ǿմstrָ֣hsubΪһ','֮ǰӴstrΪһ','֮Ӵ + * + *ע + * 1.ַstrȷ޿հ׷ţ + * strſȥҲδȥ + * 2.ɺstrҲᷢ仯 + */ +static void sever(SString hstr, SString str) { + int i, k, n; + SString ch; + + n = StrLength(str); + + i = 0; // ַʱα + k = 0; // δ + + do { + ++i; + + // ȡstrһַ + SubString(ch, str, i, 1); + + if(ch[1] == '(') { + ++k; + } + if(ch[1] == ')') { + --k; + } + } while(i < n && (ch[1] != ',' || k != 0)); + + if(i < n) { + SubString(hstr, str, 1, i - 1); + SubString(str, str, i + 1, n - i); + } else { + StrCopy(hstr, str); + ClearString(str); + } +} diff --git a/Dev-C++/ExerciseBook/05.37.2/GList-E.h b/Dev-C++/ExerciseBook/05.37.2/GList-E.h new file mode 100644 index 0000000..fa9af82 --- /dev/null +++ b/Dev-C++/ExerciseBook/05.37.2/GList-E.h @@ -0,0 +1,146 @@ +/*=========================== + * չ洢ʾ + ============================*/ + +#ifndef GLIST_E_H +#define GLIST_E_H + +#include +#include // ṩ mallocreallocfreeexit ԭ +#include "Status.h" //**01 **// +#include "SString.h" //**04 **// + +/* ԭԪ */ +typedef char AtomType; //ԭ + +/* + * + * + * Atom-0ԭӽ + * List-1 + */ +typedef enum { Atom, List } ElemTag; + +/* չ洢ʾͶ */ +typedef struct GLNode { + ElemTag tag; // ǣԭӽͱ + + // ԭӽͱϲ + union + { + AtomType atom; // atomԭӽֵAtomTypeû + struct GLNode* hp; // ָͷ + } Node; + struct GLNode* tp; // ָβ +} GLNode; + +/* */ +typedef GLNode* GList; + + +/* + * ʼ + * + * ʼյĹΪ0Ϊ1 + * + *ע + * Ҫÿһſ + */ +Status InitGList(GList* L); + +/* + * + * + * ַSL + */ +Status CreateGList(GList* L, SString S); + +/* + * + * + * ͷŹռڴ档 + */ +Status DestroyGList(GList* L); + +/* + * + * + * ɹLƵõT + */ +Status CopyGList(GList* T, GList L); + +/* + * + * + * عijȡ + */ +int GListLength(GList L); + +/* + * + * + * ع + */ +int GListDepth(GList L); + +/* + * п + * + * жϹǷΪա + */ +Status GListEmpty(GList L); + +/* + * ͷ + */ +GList GetHead(GList L); + +/* + * β + */ +GList GetTail(GList L); + +/* + * + * + * ԪeΪLĵһԪء + */ +Status InsertFirst(GList* L, GList e); + +/* + * ɾ + * + * LĵһԪɾeء + */ +Status DeleteFirst(GList* L, GList* e); + +/* + * + * + * visitʹL + */ +void Traverse(GList L, void(Visit)(AtomType)); + +/* + * ͼλ + * + * L + */ +void PrintGraph(GList L); + +/* + * ͼλڲʵ֡ + */ +static void Print(GList L); + +/* + * ǿմstrָ֣hsubΪһ','֮ǰӴstrΪһ','֮Ӵ + * + *ע + * 1.ַstrȷ޿հ׷ţ + * strſȥҲδȥ + * 2.ɺstrҲᷢ仯 + */ +static void sever(SString hstr, SString str); + +#endif diff --git a/Dev-C++/ExerciseBook/05.37.2/SString.cpp b/Dev-C++/ExerciseBook/05.37.2/SString.cpp new file mode 100644 index 0000000..7a96fcf --- /dev/null +++ b/Dev-C++/ExerciseBook/05.37.2/SString.cpp @@ -0,0 +1,195 @@ +/*============================= + * Ķ˳洢ʾ˳򴮣 + * + * 㷨: 4.14.24.34.5 + ==============================*/ + +#include "SString.h" //**04 **// + +/* + * ʼ + * + * һֵΪcharsĴT + * + *ע + * òСӼ + */ +Status StrAssign(SString T, const char* chars) { + int i, len; + + len = (int) strlen(chars); + + // chars + if(len > MAXSTRLEN) { + return ERROR; + } + + T[0] = len; + for(i = 1; i <= len; i++) { + T[i] = chars[i - 1]; + } + + return OK; +} + +/* + * + * + * Sա + */ +Status ClearString(SString S) { + // ֻҪΪ0Ϳ + S[0] = 0; + return OK; +} + +/* + * п + * + * жϴSǷЧݡ + * + * ֵ + * TRUE : SΪ + * FALSE: SΪ + */ +Status StrEmpty(SString S) { + return S[0] == 0 ? TRUE : FALSE; +} + +/* + * + * + * شSԪصĸ + * + *ע + * òСӼ + */ +int StrLength(SString S) { + return S[0]; +} + +/* + * 㷨4.3 + * + * Ӵ + * + * SubS[pos, pos+len-1] + * ֵָʾǷȡɹ + * + *ע + * òСӼ + */ +Status SubString(SString Sub, SString S, int pos, int len) { + int i; + + if(pos < 1 || pos > S[0] || len < 0 || pos + len - 1 > S[0]) { + return ERROR; + } + + // Ԫ + for(i = 1; i <= len; i++) { + Sub[i] = S[pos + i - 1]; + } + + // ȷ³ + Sub[0] = len; + + return OK; +} + +/* + * ɾ + * + * ɾS[pos, pos+len-1] + */ +Status StrDelete(SString S, int pos, int len) { + int i; + + if(pos < 1 || pos + len - 1 > S[0] || len < 0) { + return ERROR; + } + + // ɾijΪ0ǰ + if(len == 0) { + return OK; + } + + // ѺԪŲǰ棬ǵɾԪ + for(i = pos + len; i <= S[0]; i++) { + S[i - len] = S[i]; + } + + // ȼ + S[0] -= len; + + return OK; +} + +/* + * Ƚ + * + * ȽϴSʹTرȽϽ + * + *ע + * òСӼ + */ +int StrCompare(SString S, SString T) { + int i = 1; + + while(i <= S[0] && i <= T[0]) { + // ַͬʱȽС + if(S[i] != T[i]) { + return S[i] - T[i]; + } + + i++; + } + + return S[0] - T[0]; +} + +/* + * + * + * SƵT + */ +Status StrCopy(SString T, SString S) { + int i; + + // ͬϢһ + for(i = 0; i <= S[0]; i++) { + T[i] = S[i]; + } + + return OK; +} + +/* + * ַSеĿհףɴӡַո + * + *ע + * úڱġ + */ +Status ClearBlank(SString S) { + int i, j; + + // ǿմ + if(S[0] == 0) { + return ERROR; + } + + for(i = 1, j = 0; i <= S[0]; i++) { + // հףԹ + if(S[i] == ' ' || !isprint(S[i])) { + continue; + } + + j++; + + S[j] = S[i]; + } + + S[0] = j; + + return OK; +} diff --git a/Dev-C++/ExerciseBook/05.37.2/SString.h b/Dev-C++/ExerciseBook/05.37.2/SString.h new file mode 100644 index 0000000..0632f18 --- /dev/null +++ b/Dev-C++/ExerciseBook/05.37.2/SString.h @@ -0,0 +1,117 @@ +/*============================= + * Ķ˳洢ʾ˳򴮣 + * + * 㷨: 4.14.24.34.5 + ==============================*/ + +#ifndef SSTRING_H +#define SSTRING_H + +#include +#include // ṩ strlen ԭ +#include // ṩ isprint ԭ +#include "Status.h" //**01 **// + +/* 궨 */ +#define MAXSTRLEN 255 // ˳򴮵󴮳 + +/* + * ˳洢Ͷ + * + * עЧԪشSString1ŵԪʼ洢 + * SString0ŵԪ洢䳤 + */ +typedef unsigned char SString[MAXSTRLEN + 1]; // 0ŵԪŴij + + +/* + * ʾ + * + * ѭ̲ĵдϰߣposָʾַλ()1ʼ + */ + + +/* + * ʼ + * + * һֵΪcharsĴT + * + *ע + * òСӼ + */ +Status StrAssign(SString T, const char* chars); + +/* + * + * + * Sա + */ +Status ClearString(SString S); + +/* + * п + * + * жϴSǷЧݡ + * + * ֵ + * TRUE : SΪ + * FALSE: SΪ + */ +Status StrEmpty(SString S); + +/* + * + * + * شSԪصĸ + * + *ע + * òСӼ + */ +int StrLength(SString S); + +/* + * 㷨4.3 + * + * Ӵ + * + * SubS[pos, pos+len-1] + * ֵָʾǷȡɹ + * + *ע + * òСӼ + */ +Status SubString(SString Sub, SString S, int pos, int len); + +/* + * ɾ + * + * ɾS[pos, pos+len-1] + */ +Status StrDelete(SString S, int pos, int len); + +/* + * Ƚ + * + * ȽϴSʹTرȽϽ + * + *ע + * òСӼ + */ +int StrCompare(SString S, SString T); + +/* + * + * + * SƵT + */ +Status StrCopy(SString T, SString S); + +/* + * ַSеĿհףɴӡַո + * + *ע + * úڱġ + */ +Status ClearBlank(SString S); + +#endif diff --git a/Dev-C++/ExerciseBook/05.38.1/05.38.1.cpp b/Dev-C++/ExerciseBook/05.38.1/05.38.1.cpp new file mode 100644 index 0000000..c41ea76 --- /dev/null +++ b/Dev-C++/ExerciseBook/05.38.1/05.38.1.cpp @@ -0,0 +1,47 @@ +#include +#include "SString.h" //**04 **// +#include "GList-HT.h" //**05 ͹**// + +/* + * еlԭ(ͷβ洢ʾ) + */ +void Algo_5_38_1(GList L, int d, int l); + + +int main(int argc, char* argv[]) { + GList L; + char* s = "((a),(b),(c,(d,e,f)),(g,((h),i)))"; + SString S; + + printf(" L ...\n"); + StrAssign(S, s); + CreateGList(&L, S); + printf("L = "); + PrintGraph(L); + + printf(" 2 ԭΪ"); + Algo_5_38_1(L, 0, 2); + printf("\n"); + + return 0; +} + + +/* + * еlԭ(ͷβ洢ʾ) + */ +void Algo_5_38_1(GList L, int d, int l) { + int i = d; // dijֵֵΪ0 + + if(L && l >= i) { + if(L->tag == Atom) { + // + if(l == i) { + printf("%c ", L->Node.atom); + } + } else { + Algo_5_38_1(L->Node.ptr.hp, i + 1, l); // ͷָָĻһ + Algo_5_38_1(L->Node.ptr.tp, i, l); + } + } +} diff --git a/Dev-C++/ExerciseBook/05.38.1/05.38.1.dev b/Dev-C++/ExerciseBook/05.38.1/05.38.1.dev new file mode 100644 index 0000000..1fd4a1c --- /dev/null +++ b/Dev-C++/ExerciseBook/05.38.1/05.38.1.dev @@ -0,0 +1,102 @@ +[Project] +FileName=05.38.1.dev +Name=05.38.1 +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 + +[Unit4] +FileName=SString.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit2] +FileName=GList-HT.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit1] +FileName=05.38.1.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit3] +FileName=GList-HT.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit5] +FileName=SString.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + diff --git a/Dev-C++/ExerciseBook/05.38.1/GList-HT.cpp b/Dev-C++/ExerciseBook/05.38.1/GList-HT.cpp new file mode 100644 index 0000000..bad30df --- /dev/null +++ b/Dev-C++/ExerciseBook/05.38.1/GList-HT.cpp @@ -0,0 +1,418 @@ +/*============================ + * ͷβ洢ʾ + * + * 㷨: 5.55.65.75.8 + =============================*/ + +#include "GList-HT.h" //**05 ͹**// + +/* + * ʼ + * + * ʼյĹΪ0Ϊ1 + * + *ע + * Ҫÿһȥſ + */ +Status InitGList(GList* L) { + if(L == NULL) { + return ERROR; + } + + *L = NULL; + + return OK; +} + +/* + * 㷨5.7 + * + * + * + * ַSL + */ +Status CreateGList(GList* L, SString S) { + SString emp; // չַ + SString hsub, sub; + GList p, q; + + if(L == NULL) { + return ERROR; + } + + // ַSеĿհףɴӡַո + ClearBlank(S); + + if(StrEmpty(S)) { + return ERROR; + } + + StrAssign(emp, "()"); + + /* + * 봮Ϊ()ҪյĹ + * + *ע + * ̲Ĵġ + * StrCompareķֵָʾַĴСָʾַǷȡ + * S()ȣֵӦ0 + */ + if(!StrCompare(S, emp)) { + *L = NULL; + } else { + *L = (GList) malloc(sizeof(GLNode)); + if(*L == NULL) { + exit(OVERFLOW); + } + + // ԭ + if(StrLength(S) == 1) { + (*L)->tag = Atom; + (*L)->Node.atom = S[1]; + } else { + (*L)->tag = List; + + p = *L; + + // ȥ + SubString(sub, S, 2, StrLength(S) - 2); + + // ظnӱ + do { + // subзͷhsubɺsubҲᷢ仯 + sever(hsub, sub); + + // ݹ鴴 + CreateGList(&(p->Node.ptr.hp), hsub); + + q = p; + + // βΪգҪβ + if(!StrEmpty(sub)) { + p = (GList) malloc(sizeof(GLNode)); + if(p == NULL) { + exit(OVERFLOW); + } + + p->tag = List; + + q->Node.ptr.tp = p; + } + } while(!StrEmpty(sub)); + + q->Node.ptr.tp = NULL; + } + } + + return OK; +} + +/* + * + * + * ͷŹռڴ档 + */ +Status DestroyGList(GList* L) { + GList head, tail; + + if(L == NULL || *L == NULL) { + return ERROR; + } + + // ɾԭӽ + if((*L)->tag == Atom) { + free(*L); + *L = NULL; + + // ɾӱ + } else { + head = (*L)->Node.ptr.hp; + tail = (*L)->Node.ptr.tp; + free(*L); + *L = NULL; + DestroyGList(&head); + DestroyGList(&tail); + } + + return OK; +} + +/* + * 㷨5.6 + * + * + * + * ɹLƵõT + */ +Status CopyGList(GList* T, GList L) { + if(T == NULL) { + return ERROR; + } + + if(L == NULL) { + *T = NULL; + } else { + // ½ + *T = (GList) malloc(sizeof(GLNode)); + if(*T == NULL) { + exit(OVERFLOW); + } + + (*T)->tag = L->tag; + + // Ƶԭ + if(L->tag == Atom) { + (*T)->Node.atom = L->Node.atom; + + // Ʊͷͱβ + } else { + CopyGList(&((*T)->Node.ptr.hp), L->Node.ptr.hp); + CopyGList(&((*T)->Node.ptr.tp), L->Node.ptr.tp); + } + } + + return OK; +} + +/* + * + * + * عijȡ + */ +int GListLength(GList L) { + int count; + + for(count = 0; L != NULL; count++, L = L->Node.ptr.tp) { + } + + return count; +} + +/* + * 㷨5.5 + * + * + * + * ع + */ +int GListDepth(GList L) { + int max, deep; + GList p; + + // ձΪ1 + if(L == NULL) { + return 1; + } + + // ԭΪ0 + if(L->tag == Atom) { + return 0; + } + + // ݹӱ + for(max = 0, p = L; p != NULL; p = p->Node.ptr.tp) { + deep = GListDepth(p->Node.ptr.hp); + if(deep > max) { + max = deep; + } + } + + // ǿձǸԪȼһ + return max + 1; +} + +/* + * п + * + * жϹǷΪա + */ +Status GListEmpty(GList L) { + return L == NULL ? TRUE : FALSE; +} + +/* + * ͷ + */ +GList GetHead(GList L) { + GList p; + + // ձޱͷﲻܷNULLȻֲʧ˻Ƿ˿ձ + if(L == NULL) { + exit(ERROR); + } + + CopyGList(&p, L->Node.ptr.hp); + + return p; +} + +/* + * β + */ +GList GetTail(GList L) { + GList p; + + // ձޱβﲻܷNULLȻֲʧ˻Ƿ˿ձ + if(L == NULL) { + exit(ERROR); + } + + CopyGList(&p, L->Node.ptr.tp); + + return p; +} + +/* + * + * + * ԪeΪLĵһԪء + */ +Status InsertFirst(GList* L, GList e) { + GList g; + + if(L == NULL) { + return ERROR; + } + + g = (GList) malloc(sizeof(GLNode)); + if(g == NULL) { + exit(OVERFLOW); + } + + g->tag = List; + g->Node.ptr.hp = e; + g->Node.ptr.tp = *L; + *L = g; + + return OK; +} + +/* + * ɾ + * + * LĵһԪɾeء + */ +Status DeleteFirst(GList* L, GList* e) { + GList p; + + // ձ޷ɾ + if(L == NULL || *L == NULL) { + return ERROR; + } + + p = *L; + *L = (*L)->Node.ptr.tp; + + CopyGList(e, p->Node.ptr.hp); + + free(p); + + return OK; +} + +/* + * + * + * visitʹL + */ +void Traverse(GList L, void(Visit)(AtomType)) { + + if(L == NULL) { + return; + } + + if(L->tag == Atom) { + Visit(L->Node.atom); + } else { + Traverse(L->Node.ptr.hp, Visit); + Traverse(L->Node.ptr.tp, Visit); + } + +} + +/* + * ͼλ + * + * L + */ +void PrintGraph(GList L) { + Print(L, Head); + printf("\n"); +} + +/* + * ͼλڲʵ֣markͼλǡ + */ +static void Print(GList L, Mark mark) { + // LΪ + if(L == NULL) { + if(mark == Head) { + printf("("); + } + + printf(")"); + + // LΪʱ + } else { + // ԭӽ㣬ԭ + if(L->tag == Atom) { + printf("%c", L->Node.atom); + + // ӱ㣬ҪԱͷβֱ + } else { + if(mark == Head) { + printf("("); + } else { + printf(","); + } + + Print(L->Node.ptr.hp, Head); + Print(L->Node.ptr.tp, Tail); + } + } +} + +/* + * 㷨5.8 + * + * ǿմstrָ֣hsubΪһ','֮ǰӴstrΪһ','֮Ӵ + * + *ע + * 1.ַstrȷ޿հ׷ţstrѾȥš + * 2.ɺstrҲᷢ仯 + */ +static void sever(SString hstr, SString str) { + int i, k, n; + SString ch; + + n = StrLength(str); + + i = 0; // ַʱα + k = 0; // δ + + do { + ++i; + + // ȡstrһַ + SubString(ch, str, i, 1); + + if(ch[1] == '(') { + ++k; + } + + if(ch[1] == ')') { + --k; + } + } while(i < n && (ch[1] != ',' || k != 0)); + + // ڶ + if(i < n) { + SubString(hstr, str, 1, i - 1); + SubString(str, str, i + 1, n - i); + + // ֻһ + } else { + StrCopy(hstr, str); + ClearString(str); + } +} diff --git a/Dev-C++/ExerciseBook/05.38.1/GList-HT.h b/Dev-C++/ExerciseBook/05.38.1/GList-HT.h new file mode 100644 index 0000000..508b96f --- /dev/null +++ b/Dev-C++/ExerciseBook/05.38.1/GList-HT.h @@ -0,0 +1,164 @@ +/*============================ + * ͷβ洢ʾ + * + * 㷨: 5.55.65.75.8 + =============================*/ + +#ifndef GLIST_HT_H +#define GLIST_HT_H + +#include +#include // ṩ mallocreallocfreeexit ԭ +#include "Status.h" //**01 **// +#include "SString.h" //**04 **// + +/* ԭԪ */ +typedef char AtomType; + +/* + * + * + * Atom-0ԭӽ + * List-1 + */ +typedef enum { Atom, List } ElemTag; + +/* ͷβ洢ʾͶ */ +typedef struct GLNode { + ElemTag tag; // ǣԭӽͱ + + // ԭӽͱϲ + union { + AtomType atom; // atomԭӽֵAtomTypeû + struct { + struct GLNode* hp; // ָͷ + struct GLNode* tp; // ָβ + } ptr; // ָ + } Node; +} GLNode; + +/* */ +typedef GLNode* GList; + +/* + * ͼλ + * + * HeadָԱͷ + * TailָԱβ + */ +typedef enum { Head, Tail } Mark; + + +/* + * ʼ + * + * ʼյĹΪ0Ϊ1 + * + *ע + * Ҫÿһȥſ + */ +Status InitGList(GList* L); + +/* + * 㷨5.7 + * + * + * + * ַSL + */ +Status CreateGList(GList* L, SString S); + +/* + * + * + * ͷŹռڴ档 + */ +Status DestroyGList(GList* L); + +/* + * 㷨5.6 + * + * + * + * ɹLƵõT + */ +Status CopyGList(GList* T, GList L); + +/* + * + * + * عijȡ + */ +int GListLength(GList L); + +/* + * 㷨5.5 + * + * + * + * ع + */ +int GListDepth(GList L); + +/* + * п + * + * жϹǷΪա + */ +Status GListEmpty(GList L); + +/* + * ͷ + */ +GList GetHead(GList L); + +/* + * β + */ +GList GetTail(GList L); + +/* + * + * + * ԪeΪLĵһԪء + */ +Status InsertFirst(GList* L, GList e); + +/* + * ɾ + * + * LĵһԪɾeء + */ +Status DeleteFirst(GList* L, GList* e); + +/* + * + * + * visitʹL + */ +void Traverse(GList L, void (Visit)(AtomType)); + +/* + * ͼλ + * + * L + */ +void PrintGraph(GList L); + +/* + * ͼλڲʵ֣markͼλǡ + */ +static void Print(GList L, Mark mark); + +/* + * 㷨5.8 + * + * ǿմstrָ֣hsubΪһ','֮ǰӴstrΪһ','֮Ӵ + * + *ע + * 1.ַstrȷ޿հ׷ţstrѾȥš + * 2.ɺstrҲᷢ仯 + */ +static void sever(SString hstr, SString str); + +#endif diff --git a/Dev-C++/ExerciseBook/05.38.1/SString.cpp b/Dev-C++/ExerciseBook/05.38.1/SString.cpp new file mode 100644 index 0000000..7a96fcf --- /dev/null +++ b/Dev-C++/ExerciseBook/05.38.1/SString.cpp @@ -0,0 +1,195 @@ +/*============================= + * Ķ˳洢ʾ˳򴮣 + * + * 㷨: 4.14.24.34.5 + ==============================*/ + +#include "SString.h" //**04 **// + +/* + * ʼ + * + * һֵΪcharsĴT + * + *ע + * òСӼ + */ +Status StrAssign(SString T, const char* chars) { + int i, len; + + len = (int) strlen(chars); + + // chars + if(len > MAXSTRLEN) { + return ERROR; + } + + T[0] = len; + for(i = 1; i <= len; i++) { + T[i] = chars[i - 1]; + } + + return OK; +} + +/* + * + * + * Sա + */ +Status ClearString(SString S) { + // ֻҪΪ0Ϳ + S[0] = 0; + return OK; +} + +/* + * п + * + * жϴSǷЧݡ + * + * ֵ + * TRUE : SΪ + * FALSE: SΪ + */ +Status StrEmpty(SString S) { + return S[0] == 0 ? TRUE : FALSE; +} + +/* + * + * + * شSԪصĸ + * + *ע + * òСӼ + */ +int StrLength(SString S) { + return S[0]; +} + +/* + * 㷨4.3 + * + * Ӵ + * + * SubS[pos, pos+len-1] + * ֵָʾǷȡɹ + * + *ע + * òСӼ + */ +Status SubString(SString Sub, SString S, int pos, int len) { + int i; + + if(pos < 1 || pos > S[0] || len < 0 || pos + len - 1 > S[0]) { + return ERROR; + } + + // Ԫ + for(i = 1; i <= len; i++) { + Sub[i] = S[pos + i - 1]; + } + + // ȷ³ + Sub[0] = len; + + return OK; +} + +/* + * ɾ + * + * ɾS[pos, pos+len-1] + */ +Status StrDelete(SString S, int pos, int len) { + int i; + + if(pos < 1 || pos + len - 1 > S[0] || len < 0) { + return ERROR; + } + + // ɾijΪ0ǰ + if(len == 0) { + return OK; + } + + // ѺԪŲǰ棬ǵɾԪ + for(i = pos + len; i <= S[0]; i++) { + S[i - len] = S[i]; + } + + // ȼ + S[0] -= len; + + return OK; +} + +/* + * Ƚ + * + * ȽϴSʹTرȽϽ + * + *ע + * òСӼ + */ +int StrCompare(SString S, SString T) { + int i = 1; + + while(i <= S[0] && i <= T[0]) { + // ַͬʱȽС + if(S[i] != T[i]) { + return S[i] - T[i]; + } + + i++; + } + + return S[0] - T[0]; +} + +/* + * + * + * SƵT + */ +Status StrCopy(SString T, SString S) { + int i; + + // ͬϢһ + for(i = 0; i <= S[0]; i++) { + T[i] = S[i]; + } + + return OK; +} + +/* + * ַSеĿհףɴӡַո + * + *ע + * úڱġ + */ +Status ClearBlank(SString S) { + int i, j; + + // ǿմ + if(S[0] == 0) { + return ERROR; + } + + for(i = 1, j = 0; i <= S[0]; i++) { + // հףԹ + if(S[i] == ' ' || !isprint(S[i])) { + continue; + } + + j++; + + S[j] = S[i]; + } + + S[0] = j; + + return OK; +} diff --git a/Dev-C++/ExerciseBook/05.38.1/SString.h b/Dev-C++/ExerciseBook/05.38.1/SString.h new file mode 100644 index 0000000..0632f18 --- /dev/null +++ b/Dev-C++/ExerciseBook/05.38.1/SString.h @@ -0,0 +1,117 @@ +/*============================= + * Ķ˳洢ʾ˳򴮣 + * + * 㷨: 4.14.24.34.5 + ==============================*/ + +#ifndef SSTRING_H +#define SSTRING_H + +#include +#include // ṩ strlen ԭ +#include // ṩ isprint ԭ +#include "Status.h" //**01 **// + +/* 궨 */ +#define MAXSTRLEN 255 // ˳򴮵󴮳 + +/* + * ˳洢Ͷ + * + * עЧԪشSString1ŵԪʼ洢 + * SString0ŵԪ洢䳤 + */ +typedef unsigned char SString[MAXSTRLEN + 1]; // 0ŵԪŴij + + +/* + * ʾ + * + * ѭ̲ĵдϰߣposָʾַλ()1ʼ + */ + + +/* + * ʼ + * + * һֵΪcharsĴT + * + *ע + * òСӼ + */ +Status StrAssign(SString T, const char* chars); + +/* + * + * + * Sա + */ +Status ClearString(SString S); + +/* + * п + * + * жϴSǷЧݡ + * + * ֵ + * TRUE : SΪ + * FALSE: SΪ + */ +Status StrEmpty(SString S); + +/* + * + * + * شSԪصĸ + * + *ע + * òСӼ + */ +int StrLength(SString S); + +/* + * 㷨4.3 + * + * Ӵ + * + * SubS[pos, pos+len-1] + * ֵָʾǷȡɹ + * + *ע + * òСӼ + */ +Status SubString(SString Sub, SString S, int pos, int len); + +/* + * ɾ + * + * ɾS[pos, pos+len-1] + */ +Status StrDelete(SString S, int pos, int len); + +/* + * Ƚ + * + * ȽϴSʹTرȽϽ + * + *ע + * òСӼ + */ +int StrCompare(SString S, SString T); + +/* + * + * + * SƵT + */ +Status StrCopy(SString T, SString S); + +/* + * ַSеĿհףɴӡַո + * + *ע + * úڱġ + */ +Status ClearBlank(SString S); + +#endif diff --git a/Dev-C++/ExerciseBook/05.38.2/05.38.2.cpp b/Dev-C++/ExerciseBook/05.38.2/05.38.2.cpp new file mode 100644 index 0000000..ed3096f --- /dev/null +++ b/Dev-C++/ExerciseBook/05.38.2/05.38.2.cpp @@ -0,0 +1,48 @@ +#include +#include "SString.h" //**04 **// +#include "GList-E.h" //**05 ͹**// + +/* + * еlԭ(չ洢ʾ) + */ +void Algo_5_38_2(GList L, int d, int l); + + +int main(int argc, char* argv[]) { + GList L; + char* s = "((a),(b),(c,(d,e,f)),(g,((h),i)))"; + SString S; + + printf(" L ...\n"); + StrAssign(S, s); + CreateGList(&L, S); + printf("L = "); + PrintGraph(L); + + printf(" 2 ԭΪ"); + Algo_5_38_2(L, 0, 2); + printf("\n"); + + return 0; +} + + +/* + * еlԭ(չ洢ʾ) + */ +void Algo_5_38_2(GList L, int d, int l) { + int i = d; // dijֵֵΪ0 + + if(L && l >= i) { + if(L->tag == Atom) { + // + if(l == i) { + printf("%c ", L->Node.atom); + } + } else { + Algo_5_38_2(L->Node.hp, i + 1, l); // ͷָָĻһ + } + + Algo_5_38_2(L->tp, i, l); + } +} diff --git a/Dev-C++/ExerciseBook/05.38.2/05.38.2.dev b/Dev-C++/ExerciseBook/05.38.2/05.38.2.dev new file mode 100644 index 0000000..f454314 --- /dev/null +++ b/Dev-C++/ExerciseBook/05.38.2/05.38.2.dev @@ -0,0 +1,102 @@ +[Project] +FileName=05.38.2.dev +Name=05.38.2 +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 + +[Unit4] +FileName=SString.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit1] +FileName=05.38.2.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit5] +FileName=GList-E.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit2] +FileName=GList-E.h +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + +[Unit3] +FileName=SString.cpp +CompileCpp=0 +Folder= +Compile=1 +Link=1 +Priority=1000 +OverrideBuildCmd=0 +BuildCmd= + diff --git a/Dev-C++/ExerciseBook/05.38.2/GList-E.cpp b/Dev-C++/ExerciseBook/05.38.2/GList-E.cpp new file mode 100644 index 0000000..3fc0ad9 --- /dev/null +++ b/Dev-C++/ExerciseBook/05.38.2/GList-E.cpp @@ -0,0 +1,449 @@ +/*=========================== + * չ洢ʾ + ============================*/ + +#include "GList-E.h" //**05 ͹**// + +/* + * ʼ + * + * ʼյĹΪ0Ϊ1 + * + *ע + * Ҫÿһſ + */ +Status InitGList(GList* L) { + if(L == NULL) { + return ERROR; + } + + *L = (GList) malloc(sizeof(GLNode)); + if(!*L) { + exit(OVERFLOW); + } + + (*L)->tag = List; + (*L)->Node.hp = NULL; + (*L)->tp = NULL; + + return OK; +} + +/* + * + * + * ַSL + */ +Status CreateGList(GList* L, SString S) { + SString emp, hsub, sub, tmp; + + if(L == NULL) { + return ERROR; + } + + // ַSеĿհףɴӡַո + ClearBlank(S); + + if(StrEmpty(S)) { + return ERROR; + } + + // Ϊ˲ƻS + StrCopy(sub, S); + + /* + * ִеʱ + * ٴִеʱѾȥ + */ + sever(hsub, sub); + + *L = (GList) malloc(sizeof(GLNode)); + if(*L == NULL) { + exit(OVERFLOW); + } + + StrAssign(emp, "()"); + + if(!StrCompare(hsub, emp)) { + (*L)->tag = List; + (*L)->Node.hp = NULL; + } else { + if(StrLength(hsub) == 1) { + (*L)->tag = Atom; + (*L)->Node.atom = hsub[1]; + } else { + (*L)->tag = List; + + SubString(tmp, hsub, 2, StrLength(hsub) - 2); + + CreateGList(&((*L)->Node.hp), tmp); + } + } + + // ڶβ˳ݹ + if(StrEmpty(sub)) { + (*L)->tp = NULL; + } else { + // ݹβ + CreateGList(&((*L)->tp), sub); + } + + return OK; +} + +/* + * + * + * ͷŹռڴ档 + */ +Status DestroyGList(GList* L) { + GList head, tail; + + if(L == NULL || *L == NULL) { + return ERROR; + } + + // ӱ + if((*L)->tag == List) { + head = (*L)->Node.hp; // ͷ + tail = (*L)->tp; // β + + free(*L); + *L = NULL; + + // ݹ鴦ͷ + if(head != NULL) { + DestroyGList(&head); + } + + // ݹ鴦β + if(tail != NULL) { + DestroyGList(&tail); + } + + // ԭӽ + } else { + tail = (*L)->tp; // β + + free(*L); + *L = NULL; + + if(tail != NULL) { + DestroyGList(&tail); + } + } + + return OK; +} + +/* + * + * + * ɹLƵõT + */ +Status CopyGList(GList* T, GList L) { + + if(L == NULL) { + return ERROR; + } + + *T = (GList) malloc(sizeof(GLNode)); + if(*T == NULL) { + exit(OVERFLOW); + } + + // ԭ + if(L->tag == Atom) { + (*T)->tag = Atom; + (*T)->Node.atom = L->Node.atom; + + // ӱ + } else { + (*T)->tag = List; + + // Ʊͷ + if(L->Node.hp != NULL) { + CopyGList(&((*T)->Node.hp), L->Node.hp); + } else { + (*T)->Node.hp = NULL; + } + } + + // Ʊβ + if(L->tp != NULL) { + CopyGList(&((*T)->tp), L->tp); + } else { + (*T)->tp = NULL; + } + + return OK; +} + +/* + * + * + * عijȡ + */ +int GListLength(GList L) { + int count = 0; + GList p; + + // + if(L == NULL) { + return -1; + } + + p = L->Node.hp; + + while(p != NULL) { + ++count; + p = p->tp; + } + + return count; +} + +/* + * + * + * ع + */ +int GListDepth(GList L) { + int max, deep; + GList p; + + max = 0; + + // + if(L == NULL) { + return -1; + } + + // ձΪ1 + if(L->tag == List && !L->Node.hp) { + return 1; + } + + // ԭΪ0 + if(L->tag == Atom) { + return 0; + } + + // ݹӱ + for(p = L->Node.hp; p != NULL; p = p->tp) { + // pΪͷָӱ + deep = GListDepth(p); + if(deep > max) { + max = deep; + } + } + + return max + 1; +} + +/* + * п + * + * жϹǷΪա + */ +Status GListEmpty(GList L) { + // + if(L == NULL) { + return ERROR; + } + + if(L->tag == List && L->Node.hp == NULL && L->tp == NULL) { + return TRUE; + } else { + return ERROR; + } +} + +/* + * ͷ + */ +GList GetHead(GList L) { + GList p, q; + + // ڻΪձ޷ȡͷ + if(L == NULL || L->Node.hp == NULL) { + return NULL; + } + + q = L->Node.hp->tp; // ʱLıβϢ + L->Node.hp->tp = NULL; // ȥLıβ + + CopyGList(&p, L->Node.hp); // ƱͷϢαβ + + L->Node.hp->tp = q; // ָLıβϢ + + return p; +} + +/* + * β + */ +GList GetTail(GList L) { + GList p, q; + + // ڻΪձ޷ȡβ + if(L == NULL || L->Node.hp == NULL) { + return NULL; + } + + q = L->Node.hp; // ʱLıͷϢ + L->Node.hp = q->tp; // ժLıͷ + + CopyGList(&p, L); // ƱβϢαͷ + + q->tp = L->Node.hp; // ָLıͷϢ + L->Node.hp = q; + + return p; +} + +/* + * + * + * ԪeΪLĵһԪء + */ +Status InsertFirst(GList* L, GList e) { + + // + if(L == NULL || *L == NULL) { + return ERROR; + } + + if(e == NULL) { + return ERROR; + } + + e->tp = (*L)->Node.hp; + (*L)->Node.hp = e; + + return OK; +} + +/* + * ɾ + * + * LĵһԪɾeء + */ +Status DeleteFirst(GList* L, GList* e) { + GList p; + + // ڻΪձ޷ɾͷ + if(*L == NULL || (*L)->Node.hp == NULL) { + return ERROR; + } + + p = (*L)->Node.hp; + (*L)->Node.hp = p->tp; + p->tp = NULL; + + *e = p; + + return OK; +} + +/* + * + * + * visitʹL + */ +void Traverse(GList L, void(Visit)(AtomType)) { + if(L == NULL) { + return; + } + + if(L->tag == List) { + Traverse(L->Node.hp, Visit); + } else { + Visit(L->Node.atom); + } + + Traverse(L->tp, Visit); +} + +/* + * ͼλ + * + * L + */ +void PrintGraph(GList L) { + Print(L); + printf("\n"); +} + +/* + * ͼλڲʵ֡ + */ +static void Print(GList L) { + if(L == NULL) { + return; + } + + // + if(L->tag == List) { + printf("("); + + if(L->Node.hp) { + Print(L->Node.hp); + } + + if(L->tp) { + printf("),"); + Print(L->tp); + } else { + printf(")"); + } + + // ԭӽ + } else { + printf("%c", L->Node.atom); + if(L->tp) { + printf(","); + Print(L->tp); + } + } +} + +/* + * ǿմstrָ֣hsubΪһ','֮ǰӴstrΪһ','֮Ӵ + * + *ע + * 1.ַstrȷ޿հ׷ţ + * strſȥҲδȥ + * 2.ɺstrҲᷢ仯 + */ +static void sever(SString hstr, SString str) { + int i, k, n; + SString ch; + + n = StrLength(str); + + i = 0; // ַʱα + k = 0; // δ + + do { + ++i; + + // ȡstrһַ + SubString(ch, str, i, 1); + + if(ch[1] == '(') { + ++k; + } + if(ch[1] == ')') { + --k; + } + } while(i < n && (ch[1] != ',' || k != 0)); + + if(i < n) { + SubString(hstr, str, 1, i - 1); + SubString(str, str, i + 1, n - i); + } else { + StrCopy(hstr, str); + ClearString(str); + } +} diff --git a/Dev-C++/ExerciseBook/05.38.2/GList-E.h b/Dev-C++/ExerciseBook/05.38.2/GList-E.h new file mode 100644 index 0000000..fa9af82 --- /dev/null +++ b/Dev-C++/ExerciseBook/05.38.2/GList-E.h @@ -0,0 +1,146 @@ +/*=========================== + * չ洢ʾ + ============================*/ + +#ifndef GLIST_E_H +#define GLIST_E_H + +#include +#include // ṩ mallocreallocfreeexit ԭ +#include "Status.h" //**01 **// +#include "SString.h" //**04 **// + +/* ԭԪ */ +typedef char AtomType; //ԭ + +/* + * + * + * Atom-0ԭӽ + * List-1 + */ +typedef enum { Atom, List } ElemTag; + +/* չ洢ʾͶ */ +typedef struct GLNode { + ElemTag tag; // ǣԭӽͱ + + // ԭӽͱϲ + union + { + AtomType atom; // atomԭӽֵAtomTypeû + struct GLNode* hp; // ָͷ + } Node; + struct GLNode* tp; // ָβ +} GLNode; + +/* */ +typedef GLNode* GList; + + +/* + * ʼ + * + * ʼյĹΪ0Ϊ1 + * + *ע + * Ҫÿһſ + */ +Status InitGList(GList* L); + +/* + * + * + * ַSL + */ +Status CreateGList(GList* L, SString S); + +/* + * + * + * ͷŹռڴ档 + */ +Status DestroyGList(GList* L); + +/* + * + * + * ɹLƵõT + */ +Status CopyGList(GList* T, GList L); + +/* + * + * + * عijȡ + */ +int GListLength(GList L); + +/* + * + * + * ع + */ +int GListDepth(GList L); + +/* + * п + * + * жϹǷΪա + */ +Status GListEmpty(GList L); + +/* + * ͷ + */ +GList GetHead(GList L); + +/* + * β + */ +GList GetTail(GList L); + +/* + * + * + * ԪeΪLĵһԪء + */ +Status InsertFirst(GList* L, GList e); + +/* + * ɾ + * + * LĵһԪɾeء + */ +Status DeleteFirst(GList* L, GList* e); + +/* + * + * + * visitʹL + */ +void Traverse(GList L, void(Visit)(AtomType)); + +/* + * ͼλ + * + * L + */ +void PrintGraph(GList L); + +/* + * ͼλڲʵ֡ + */ +static void Print(GList L); + +/* + * ǿմstrָ֣hsubΪһ','֮ǰӴstrΪһ','֮Ӵ + * + *ע + * 1.ַstrȷ޿հ׷ţ + * strſȥҲδȥ + * 2.ɺstrҲᷢ仯 + */ +static void sever(SString hstr, SString str); + +#endif diff --git a/Dev-C++/ExerciseBook/05.38.2/SString.cpp b/Dev-C++/ExerciseBook/05.38.2/SString.cpp new file mode 100644 index 0000000..7a96fcf --- /dev/null +++ b/Dev-C++/ExerciseBook/05.38.2/SString.cpp @@ -0,0 +1,195 @@ +/*============================= + * Ķ˳洢ʾ˳򴮣 + * + * 㷨: 4.14.24.34.5 + ==============================*/ + +#include "SString.h" //**04 **// + +/* + * ʼ + * + * һֵΪcharsĴT + * + *ע + * òСӼ + */ +Status StrAssign(SString T, const char* chars) { + int i, len; + + len = (int) strlen(chars); + + // chars + if(len > MAXSTRLEN) { + return ERROR; + } + + T[0] = len; + for(i = 1; i <= len; i++) { + T[i] = chars[i - 1]; + } + + return OK; +} + +/* + * + * + * Sա + */ +Status ClearString(SString S) { + // ֻҪΪ0Ϳ + S[0] = 0; + return OK; +} + +/* + * п + * + * жϴSǷЧݡ + * + * ֵ + * TRUE : SΪ + * FALSE: SΪ + */ +Status StrEmpty(SString S) { + return S[0] == 0 ? TRUE : FALSE; +} + +/* + * + * + * شSԪصĸ + * + *ע + * òСӼ + */ +int StrLength(SString S) { + return S[0]; +} + +/* + * 㷨4.3 + * + * Ӵ + * + * SubS[pos, pos+len-1] + * ֵָʾǷȡɹ + * + *ע + * òСӼ + */ +Status SubString(SString Sub, SString S, int pos, int len) { + int i; + + if(pos < 1 || pos > S[0] || len < 0 || pos + len - 1 > S[0]) { + return ERROR; + } + + // Ԫ + for(i = 1; i <= len; i++) { + Sub[i] = S[pos + i - 1]; + } + + // ȷ³ + Sub[0] = len; + + return OK; +} + +/* + * ɾ + * + * ɾS[pos, pos+len-1] + */ +Status StrDelete(SString S, int pos, int len) { + int i; + + if(pos < 1 || pos + len - 1 > S[0] || len < 0) { + return ERROR; + } + + // ɾijΪ0ǰ + if(len == 0) { + return OK; + } + + // ѺԪŲǰ棬ǵɾԪ + for(i = pos + len; i <= S[0]; i++) { + S[i - len] = S[i]; + } + + // ȼ + S[0] -= len; + + return OK; +} + +/* + * Ƚ + * + * ȽϴSʹTرȽϽ + * + *ע + * òСӼ + */ +int StrCompare(SString S, SString T) { + int i = 1; + + while(i <= S[0] && i <= T[0]) { + // ַͬʱȽС + if(S[i] != T[i]) { + return S[i] - T[i]; + } + + i++; + } + + return S[0] - T[0]; +} + +/* + * + * + * SƵT + */ +Status StrCopy(SString T, SString S) { + int i; + + // ͬϢһ + for(i = 0; i <= S[0]; i++) { + T[i] = S[i]; + } + + return OK; +} + +/* + * ַSеĿհףɴӡַո + * + *ע + * úڱġ + */ +Status ClearBlank(SString S) { + int i, j; + + // ǿմ + if(S[0] == 0) { + return ERROR; + } + + for(i = 1, j = 0; i <= S[0]; i++) { + // հףԹ + if(S[i] == ' ' || !isprint(S[i])) { + continue; + } + + j++; + + S[j] = S[i]; + } + + S[0] = j; + + return OK; +} diff --git a/Dev-C++/ExerciseBook/05.38.2/SString.h b/Dev-C++/ExerciseBook/05.38.2/SString.h new file mode 100644 index 0000000..0632f18 --- /dev/null +++ b/Dev-C++/ExerciseBook/05.38.2/SString.h @@ -0,0 +1,117 @@ +/*============================= + * Ķ˳洢ʾ˳򴮣 + * + * 㷨: 4.14.24.34.5 + ==============================*/ + +#ifndef SSTRING_H +#define SSTRING_H + +#include +#include // ṩ strlen ԭ +#include // ṩ isprint ԭ +#include "Status.h" //**01 **// + +/* 궨 */ +#define MAXSTRLEN 255 // ˳򴮵󴮳 + +/* + * ˳洢Ͷ + * + * עЧԪشSString1ŵԪʼ洢 + * SString0ŵԪ洢䳤 + */ +typedef unsigned char SString[MAXSTRLEN + 1]; // 0ŵԪŴij + + +/* + * ʾ + * + * ѭ̲ĵдϰߣposָʾַλ()1ʼ + */ + + +/* + * ʼ + * + * һֵΪcharsĴT + * + *ע + * òСӼ + */ +Status StrAssign(SString T, const char* chars); + +/* + * + * + * Sա + */ +Status ClearString(SString S); + +/* + * п + * + * жϴSǷЧݡ + * + * ֵ + * TRUE : SΪ + * FALSE: SΪ + */ +Status StrEmpty(SString S); + +/* + * + * + * شSԪصĸ + * + *ע + * òСӼ + */ +int StrLength(SString S); + +/* + * 㷨4.3 + * + * Ӵ + * + * SubS[pos, pos+len-1] + * ֵָʾǷȡɹ + * + *ע + * òСӼ + */ +Status SubString(SString Sub, SString S, int pos, int len); + +/* + * ɾ + * + * ɾS[pos, pos+len-1] + */ +Status StrDelete(SString S, int pos, int len); + +/* + * Ƚ + * + * ȽϴSʹTرȽϽ + * + *ע + * òСӼ + */ +int StrCompare(SString S, SString T); + +/* + * + * + * SƵT + */ +Status StrCopy(SString T, SString S); + +/* + * ַSеĿհףɴӡַո + * + *ע + * úڱġ + */ +Status ClearBlank(SString S); + +#endif diff --git a/VisualC++/ExerciseBook/05.17/05.17.c b/VisualC++/ExerciseBook/05.17/05.17.c new file mode 100644 index 0000000..17a0f00 --- /dev/null +++ b/VisualC++/ExerciseBook/05.17/05.17.c @@ -0,0 +1,137 @@ +#include +#include // ṩ systemrandsrand ԭ +#include // ṩ time ԭ +#include "SqList.h" //**02 Ա**// + +// ݹֵ +int Algo_5_17_1(SqList L, int len); + +// ݹСֵ +int Algo_5_17_2(SqList L, int len); + +// ݹ +int Algo_5_17_3(SqList L, int len); + +// ݹ +double Algo_5_17_4(SqList L, int len); + +// ݹƽ +double Algo_5_17_5(SqList L, int len); + + +int main(int argc, char* argv[]) { + SqList L; + int i; + + InitList(&L); + + srand((unsigned) time(NULL)); // ϵͳʱ + + for(i = 1; i <= 10; i++) { + ListInsert(&L, i, rand() % 100); + } + + printf("˳еΪ"); + for(i = 0; i < L.length; i++) { + printf("%d ", L.elem[i]); + } + printf("\n"); + + printf("˳еֵΪ %d \n", Algo_5_17_1(L, L.length)); + printf("˳еСֵΪ %d \n", Algo_5_17_2(L, L.length)); + printf("˳еĺΪ %d \n", Algo_5_17_3(L, L.length)); + printf("˳еĻΪ %.2f \n", Algo_5_17_4(L, L.length)); + printf("˳еƽֵΪ %.2f \n", Algo_5_17_5(L, L.length)); + + return 0; +} + + +// ݹֵ +int Algo_5_17_1(SqList L, int len) { + int value, max; + + // ȡǰλõֵ + GetElem(L, len, &value); + + if(len == 1) { + return value; + } + + // ȡǰеֵ + max = Algo_5_17_1(L, --len); + + return max > value ? max : value; +} + +// ݹСֵ +int Algo_5_17_2(SqList L, int len) { + int value, min; + + // ȡǰλõֵ + GetElem(L, len, &value); + + if(len == 1) { + return value; + } + + // ȡǰеСֵ + min = Algo_5_17_2(L, --len); + + return min < value ? min : value; +} + +// ݹ +int Algo_5_17_3(SqList L, int len) { + int sum; + + // ȡǰλõֵ + GetElem(L, len, &sum); + + if(len == 1) { + return sum; + } + + // ȡǰеĺ + sum += Algo_5_17_3(L, --len); + + return sum; +} + +// ݹ +double Algo_5_17_4(SqList L, int len) { + int value; + double mul; + + // ȡǰλõֵ + GetElem(L, len, &value); + mul = value; + + if(len == 1) { + return mul; + } + + // ȡǰеĻ + mul *= Algo_5_17_4(L, --len); + + return mul; +} + +// ݹƽ +double Algo_5_17_5(SqList L, int len) { + int value; + double avg; + + // ȡǰλõֵ + GetElem(L, len, &value); + avg = value; + + if(len == 1) { + return avg; + } + + // ȡǰеƽ + avg = (Algo_5_17_5(L, len - 1) * (len - 1) + value) / len; + + return avg; +} diff --git a/VisualC++/ExerciseBook/05.17/05.17.vcxproj b/VisualC++/ExerciseBook/05.17/05.17.vcxproj new file mode 100644 index 0000000..8d651e8 --- /dev/null +++ b/VisualC++/ExerciseBook/05.17/05.17.vcxproj @@ -0,0 +1,76 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {AD70051F-9782-4A15-A23D-76E1E8A6CC68} + My0517 + + + + 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/05.17/05.17.vcxproj.filters b/VisualC++/ExerciseBook/05.17/05.17.vcxproj.filters new file mode 100644 index 0000000..9228834 --- /dev/null +++ b/VisualC++/ExerciseBook/05.17/05.17.vcxproj.filters @@ -0,0 +1,30 @@ + + + + + {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/05.17/05.17.vcxproj.user b/VisualC++/ExerciseBook/05.17/05.17.vcxproj.user new file mode 100644 index 0000000..ace9a86 --- /dev/null +++ b/VisualC++/ExerciseBook/05.17/05.17.vcxproj.user @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/05.17/SqList.c b/VisualC++/ExerciseBook/05.17/SqList.c new file mode 100644 index 0000000..f797103 --- /dev/null +++ b/VisualC++/ExerciseBook/05.17/SqList.c @@ -0,0 +1,337 @@ +/*============================= + * Ա˳洢ṹ˳ + * + * 㷨: 2.32.42.52.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; // ʼɹ +} + +/* + * (ṹ) + * + * ͷ˳ռڴ档 + */ +Status DestroyList(SqList* L) { + // ȷ˳ṹ + if(L == NULL || (*L).elem == NULL) { + return ERROR; + } + + // ͷ˳ڴ + free((*L).elem); + + // ͷڴÿָ + (*L).elem = NULL; + + // ˳ȸ + (*L).length = 0; + (*L).listsize = 0; + + return OK; +} + +/* + * ÿ() + * + * ֻ˳д洢ݣͷ˳ռڴ档 + */ +Status ClearList(SqList* L) { + // ȷ˳ṹ + if(L == NULL || (*L).elem == NULL) { + return ERROR; + } + + (*L).length = 0; + + return OK; +} + +/* + * п + * + * ж˳ǷЧݡ + * + * ֵ + * TRUE : ˳Ϊ + * FALSE: ˳Ϊ + */ +Status ListEmpty(SqList L) { + return L.length == 0 ? TRUE : FALSE; +} + +/* + * + * + * ˳ЧԪص + */ +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.6 + * + * + * + * ˳׸eCompareϵԪλ + * Ԫأ򷵻0 + * + *ע + * ԪeCompareڶβ + */ +int LocateElem(SqList L, ElemType e, Status(Compare)(ElemType, ElemType)) { + int i; + ElemType* p; + + // ȷ˳ṹ + if(L.elem == NULL) { + return ERROR; + } + + /* + * iijֵΪ1Ԫصλ + * + * ʵȻдǽiʼΪ1Ԫص + * ڽ̲ǰλģдλ + */ + i = 1; + + // pijֵΪ1ԪصĴ洢λ + p = L.elem; + + // ˳ + while(i <= L.length && !Compare(*p++, e)) { + ++i; + } + + if(i <= L.length) { + return i; + } else { + return 0; + } +} + +/* + * ǰ + * + * ȡԪcur_eǰ + * ڣ洢pre_eУOK + * ڣ򷵻ERROR + */ +Status PriorElem(SqList L, ElemType cur_e, ElemType* pre_e) { + int i; + + // ȷ˳ṹڣٰԪ + if(L.elem == NULL || L.length < 2) { + return ERROR; + } + + // iʼΪ1Ԫصġ + i = 0; + + // ӵ1Ԫؿʼcur_eλ + while(i < L.length && L.elem[i] != cur_e) { + ++i; + } + + // cur_e׸Ԫ(ûǰ)ûҵԪcur_eERROR + if(i==0 || i >= L.length) { + return ERROR; + } + + // 洢cur_eǰ + *pre_e = L.elem[i - 1]; + + return OK; +} + +/* + * + * + * ȡԪcur_eḷ́ + * ڣ洢next_eУOK + * ڣ򷵻ERROR + */ +Status NextElem(SqList L, ElemType cur_e, ElemType* next_e) { + int i; + + // ȷ˳ṹڣٰԪ + if(L.elem == NULL || L.length < 2) { + return ERROR; + } + + // iʼΪ1Ԫصġ + i = 0; + + // ӵ1Ԫؿʼcur_eλ + while(i < L.length-1 && L.elem[i] != cur_e) { + ++i; + } + + // cur_e1Ԫ(ûǰ)ûҵԪcur_eERROR + if(i >= L.length-1) { + return ERROR; + } + + // 洢cur_eǰ + *next_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; +} + +/* + * 㷨2.5 + * + * ɾ + * + * ɾ˳iλϵԪأɾԪش洢eС + * ɾɹ򷵻OK򷵻ERROR + * + *ע + * ̲iĺԪλã1ʼ + */ +Status ListDelete(SqList* L, int i, ElemType* e) { + ElemType* p, * q; + + // ȷ˳ṹ + if(L == NULL || (*L).elem == NULL) { + return ERROR; + } + + // iֵԽ + if(i < 1 || i > (*L).length) { + return ERROR; + } + + // pΪɾԪصλ + p = &(*L).elem[i - 1]; + + // 1.ȡɾԪ + *e = *p; + + // βԪλ + q = (*L).elem + (*L).length - 1; + + // 2.ԪأɾԪصλϻԪؽ + for(++p; p <= q; ++p) { + *(p - 1) = *p; + } + + // 3.1 + (*L).length--; + + return OK; +} + +/* + * + * + * visit˳L + */ +void ListTraverse(SqList L, void(Visit)(ElemType)) { + int i; + + for(i = 0; i < L.length; i++) { + Visit(L.elem[i]); + } + + printf("\n"); +} diff --git a/VisualC++/ExerciseBook/05.17/SqList.h b/VisualC++/ExerciseBook/05.17/SqList.h new file mode 100644 index 0000000..975e5b1 --- /dev/null +++ b/VisualC++/ExerciseBook/05.17/SqList.h @@ -0,0 +1,149 @@ +/*============================= + * Ա˳洢ṹ˳ + * + * 㷨: 2.32.42.52.6 + =============================*/ + +#ifndef SQLIST_H +#define SQLIST_H + +#include +#include // ṩmallocreallocfreeexitԭ +#include "Status.h" //**01 **// + +/* 궨 */ +#define LIST_INIT_SIZE 100 // ˳洢ռijʼ +#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); + +/* + * (ṹ) + * + * ͷ˳ռڴ档 + */ +Status DestroyList(SqList* L); + +/* + * ÿ() + * + * ֻ˳д洢ݣͷ˳ռڴ档 + */ +Status ClearList(SqList* L); + +/* + * п + * + * ж˳ǷЧݡ + * + * ֵ + * TRUE : ˳Ϊ + * FALSE: ˳Ϊ + */ +Status ListEmpty(SqList L); + +/* + * + * + * ˳ЧԪص + */ +int ListLength(SqList L); + +/* + * ȡֵ + * + * ȡ˳еiԪأ洢eС + * ҵOK򣬷ERROR + * + *ע + * ̲iĺԪλã1ʼⲻϱͨԼ + * ͨiĺӦָ0ʼ + */ +Status GetElem(SqList L, int i, ElemType* e); + +/* + * 㷨2.6 + * + * + * + * ˳׸eCompareϵԪλ + * Ԫأ򷵻0 + * + *ע + * ԪeCompareڶβ + */ +int LocateElem(SqList L, ElemType e, Status(Compare)(ElemType, ElemType)); + +/* + * ǰ + * + * ȡԪcur_eǰ + * ڣ洢pre_eУOK + * ڣ򷵻ERROR + */ +Status PriorElem(SqList L, ElemType cur_e, ElemType* pre_e); + +/* + * + * + * ȡԪcur_eḷ́ + * ڣ洢next_eУOK + * ڣ򷵻ERROR + */ +Status NextElem(SqList L, ElemType cur_e, ElemType* next_e); + +/* + * 㷨2.4 + * + * + * + * ˳iλϲeɹ򷵻OK򷵻ERROR + * + *ע + * ̲iĺԪλã1ʼ + */ +Status ListInsert(SqList* L, int i, ElemType e); + +/* + * 㷨2.5 + * + * ɾ + * + * ɾ˳iλϵԪأɾԪش洢eС + * ɾɹ򷵻OK򷵻ERROR + * + *ע + * ̲iĺԪλã1ʼ + */ +Status ListDelete(SqList* L, int i, ElemType* e); + +/* + * + * + * visit˳L + */ +void ListTraverse(SqList L, void (Visit)(ElemType)); + +#endif diff --git a/VisualC++/ExerciseBook/05.18/05.18.c b/VisualC++/ExerciseBook/05.18/05.18.c new file mode 100644 index 0000000..2633309 --- /dev/null +++ b/VisualC++/ExerciseBook/05.18/05.18.c @@ -0,0 +1,91 @@ +#include +#include // ṩ systemrandsrand ԭ +#include // ṩ time ԭ +#include "Status.h" //**01 **// +#include "Array.h" //**05 ͹**// + +/* + * AеԪѭkλ + */ +Status Algo_5_18(Array A, int k); + +// [begin, end]ΧڵԪ +static Status Reversal_5_18(Array A, int begin, int end); + + +int main(int argc, char* argv[]) { + Array A; + ElemType e; + int i; + int k = 7; // λ + + // ʼΪ10һά + InitArray(&A, 1, 10); + + srand((unsigned) time(NULL)); // ϵͳʱ + + for(i = 0; i < Length(A); i++) { + e = rand() % 100; + Assign(&A, e, i); + } + + printf("AԪΪ\n"); + for(i = 0; i < Length(A); i++) { + Value(A, &e, i); + printf("%2d ", e); + } + printf("\n"); + + printf("Aѭ %d λ\n", k); + Algo_5_18(A, k); + for(i = 0; i < Length(A); i++) { + Value(A, &e, i); + printf("%2d ", e); + } + printf("\n"); + + return 0; +} + + +/* + * AеԪѭkλ + */ +Status Algo_5_18(Array A, int k) { + int n, p; + + n = Length(A); + + p = k % n; // ʵҪѭƵλ + if(p <= 0) { + return ERROR; + } + + Reversal_5_18(A, 0, n-1); // [0, n-1]ΧڵԪ + Reversal_5_18(A, 0, p-1); // [0, p-1]ΧڵԪ + Reversal_5_18(A, p, n-1); // [p, n-1]ΧڵԪ + + return OK; +} + +// [begin, end]ΧڵԪ +static Status Reversal_5_18(Array A, int begin, int end) { + int i; + ElemType e1, e2; + + if(begin < 0 || end > Length(A)-1 || begin >= end) { + return ERROR; + } + + // "" + for(i = 0; i < (end - begin + 1) / 2; i++) { + Value(A, &e1, begin + i); // ȡеǰԪ + Value(A, &e2, end - i); // ȡеԪ + + // Ԫɽ + Assign(&A, e2, begin + i); + Assign(&A, e1, end - i); + } + + return OK; +} diff --git a/VisualC++/ExerciseBook/05.18/05.18.vcxproj b/VisualC++/ExerciseBook/05.18/05.18.vcxproj new file mode 100644 index 0000000..a71a968 --- /dev/null +++ b/VisualC++/ExerciseBook/05.18/05.18.vcxproj @@ -0,0 +1,76 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {DEAB729F-1809-4FAC-93DC-9E42774A3BFA} + My0518 + + + + 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/05.18/05.18.vcxproj.filters b/VisualC++/ExerciseBook/05.18/05.18.vcxproj.filters new file mode 100644 index 0000000..b5ff1e0 --- /dev/null +++ b/VisualC++/ExerciseBook/05.18/05.18.vcxproj.filters @@ -0,0 +1,30 @@ + + + + + {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/05.18/05.18.vcxproj.user b/VisualC++/ExerciseBook/05.18/05.18.vcxproj.user new file mode 100644 index 0000000..ace9a86 --- /dev/null +++ b/VisualC++/ExerciseBook/05.18/05.18.vcxproj.user @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/05.18/Array.c b/VisualC++/ExerciseBook/05.18/Array.c new file mode 100644 index 0000000..494d467 --- /dev/null +++ b/VisualC++/ExerciseBook/05.18/Array.c @@ -0,0 +1,195 @@ +/*======== + * ά + =========*/ + +#include "Array.h" //**05 ͹**// + +/* + * ʼ + * + * ʼάΪdim飬ɱָʾάȵĴС + */ +Status InitArray(Array* A, int dim, ...) { + int elemtotal; // ͳԪظ + va_list ap; // apſɱϢָʾάȵĴС + int i; + + if(A == NULL) { + return ERROR; + } + + if(dim < 1 || dim > MAX_ARRAY_DIM) { // ά + return ERROR; + } + + (*A).dim = dim; // ʼά + + // ʼάϢ + (*A).bounds = (int*) malloc(dim * sizeof(int)); + if((*A).bounds == NULL) { + exit(OVERFLOW); + } + + // άȳȺϷboundsAԪelemtotal + elemtotal = 1; + + // ʹapָһɱdim൱ʼʶ + va_start(ap, dim); + + for(i = 0; i < dim; i++) { + // ¼ǰάȵĿ + (*A).bounds[i] = va_arg(ap, int); + if((*A).bounds[i] <= 0) { + return ERROR; + } + + elemtotal *= A->bounds[i]; + } + + // ÿap + va_end(ap); + + // ʼռ䣬ԴԪ + (*A).base = (ElemType*) malloc(elemtotal * sizeof(ElemType)); + if((*A).base == NULL) { + exit(OVERFLOW); + } + + // ʼӳϢ + (*A).constants = (int*) malloc(dim * sizeof(int)); + if((*A).constants == NULL) { + exit(OVERFLOW); + } + + // һάȣÿҪԽһԪ + (*A).constants[dim - 1] = 1; + for(i = dim - 2; i >= 0; i--) { + (*A).constants[i] = (*A).bounds[i + 1] * (*A).constants[i + 1]; + } + + /* + * + * ά[2,3,4]˵boundsֵΪ<2,3,4>constantsֵΪ<12,4,1> + * boundsһάа2Ԫأڶάа3Ԫأάа4Ԫ + * constantsһάÿҪ12ԪأڶάÿҪԽ4ԪأάÿҪԽ1Ԫ + */ + + return OK; +} + +/* + * (ṹ) + * + * ռõĿռ䡣 + */ +Status DestroyArray(Array* A) { + if(A == NULL || (*A).base == NULL || (*A).bounds == NULL || (*A).constants == NULL) { + return ERROR; + } + + free((*A).base); + (*A).base = NULL; + + free((*A).bounds); + (*A).bounds = NULL; + + free((*A).constants); + (*A).constants = NULL; + + (*A).dim = 0; + + return OK; +} + +/* + * ȡֵ + * + * ȡָ±괦ԪֵɱΪdim±ֵָʾȡԪ±ꡣ + */ +Status Value(Array A, ElemType* e, ...) { + va_list ap; + Status result; + int off; + + va_start(ap, e); + + // ԪصĿԪҪԽԪ + result = Locate(A, ap, &off); + + va_end(ap); + + if(result == OVERFLOW) { + return result; + } + + *e = *(A.base + off); + + return OK; +} + +/* + * ֵ + * + * Ϊָ±괦ԪظֵɱΪdim±ֵָʾֵԪ±ꡣ + */ +Status Assign(Array* A, ElemType e, ...) { + va_list ap; + Status result; + int off; + + va_start(ap, e); + + // ԪصĿԪҪԽԪ + result = Locate(*A, ap, &off); + + va_end(ap); + + if(result == OVERFLOW) { + return result; + } + + *(A->base + off) = e; + + return OK; +} + +/* + * apָʾֵAеλã + * ԪصĿԪҪԽԪ + */ +static Status Locate(Array A, va_list ap, int* off) { + int i, ind; + + *off = 0; + + for(i = 0; i < A.dim; i++) { + ind = va_arg(ap, int); + + // ֤±겻Խ + if(ind < 0 || ind >= A.bounds[i]) { + return OVERFLOW; + } + + // ijάȵĵλԪظ*Ҫĵλ + *off += A.constants[i] * ind; + } + + return OK; +} + +/* + * Ԫصĸ + * + *ע + * Ϊĺ + */ +int Length(Array A) { + int i; + int elemtotal = 1; + + for(i = 0; i < A.dim; i++) { + elemtotal *= A.bounds[i]; + } + + return elemtotal; +} diff --git a/VisualC++/ExerciseBook/05.18/Array.h b/VisualC++/ExerciseBook/05.18/Array.h new file mode 100644 index 0000000..bae6fab --- /dev/null +++ b/VisualC++/ExerciseBook/05.18/Array.h @@ -0,0 +1,70 @@ +/*======== + * ά + =========*/ + +#ifndef ARRAY_H +#define ARRAY_H + +#include +#include // ṩmallocreallocfreeexitԭ +#include // ṩva_startva_argva_end +#include "Status.h" //**01 **// + +/* 궨 */ +#define MAX_ARRAY_DIM 8 // άΪ8 + +/* Ԫ */ +typedef int ElemType; + +/* ˳洢ʾ */ +typedef struct { + ElemType* base; // ԪػַԪأ + int dim; // ά + int* bounds; // άַСϢ + int* constants; // ӳַ洢ijάʱÿҪԽԪظ +} Array; + + +/* + * ʼ + * + * ʼάΪdim飬ɱָʾάȵĴС + */ +Status InitArray(Array* A, int dim, ...); + +/* + * (ṹ) + * + * ռõĿռ䡣 + */ +Status DestroyArray(Array* A); + +/* + * ȡֵ + * + * ȡָ±괦ԪֵɱΪdim±ֵָʾȡԪ±ꡣ + */ +Status Value(Array A, ElemType* e, ...); + +/* + * ֵ + * + * Ϊָ±괦ԪظֵɱΪdim±ֵָʾֵԪ±ꡣ + */ +Status Assign(Array* A, ElemType e, ...); + +/* + * apָʾֵAеλã + * ԪصĿԪҪԽԪ + */ +static Status Locate(Array A, va_list ap, int *off); + +/* + * Ԫصĸ + * + *ע + * Ϊĺ + */ +int Length(Array A); + +#endif diff --git a/VisualC++/ExerciseBook/05.19/05.19.c b/VisualC++/ExerciseBook/05.19/05.19.c new file mode 100644 index 0000000..c5f3ccb --- /dev/null +++ b/VisualC++/ExerciseBook/05.19/05.19.c @@ -0,0 +1,114 @@ +#include +#include +#include +#include "Array.h" //**05 ͹**// + +/* Ԫ */ +typedef struct { + int x; + int y; + ElemType value; +} Elem; + +/* + * ѰҶάAе + * + *ע + * ÿÿеԪزΨһ + */ +void Algo_5_19(Array A); + + +int main(int argc, char* argv[]) { + int a[3][4] = { + {10, 16, 13, 14}, + {15, 18, 15, 20}, + { 5, 8, 12, 32} + }; + int i, j; + Array A; + + // ׼ + InitArray(&A, 2, 3, 4); + for(i = 0; i < 3; i++) { + for(j = 0; j < 4; j++) { + Assign(&A, a[i][j], i, j); + } + } + + // Ѱ + Algo_5_19(A); + + return 0; +} + + +/* + * ѰҶάAе + * + *ע + * ÿÿеԪزΨһ + */ +void Algo_5_19(Array A) { + int row, col; // + Elem* Min; // 洢AÿеСֵϢ + ElemType* Max; // 洢Aÿеֵֻ洢ֵ + int total, k; // total¼Minд洢Ԫ + int i, j; + ElemType e; + int count; + int min; + + row = A.bounds[0]; + col = A.bounds[1]; + + Min = (Elem*) malloc(row * col * sizeof(Elem)); + + Max = (ElemType*) malloc(col * sizeof(ElemType)); + // ʼֵ + for(j = 0; j < col; j++) { + Max[j] = INT_MIN; + } + + total = 0; + + for(i = 0; i < row; i++) { + min = INT_MAX; // ǰСֵ + + for(j = 0; j < col; j++) { + // ȡԪA[i][j] + Value(A, &e, i, j); + + // ¼ֵ + if(e > Max[j]) { + Max[j] = e; + } + + // ¼СֵϢ + if(e <= min) { + // ÿηָСģkҪ + if(e < min) { + k = total; // ͳƵǰеСֵԪ + min = e; + } + + Min[k].x = i; + Min[k].y = j; + Min[k].value = e; + + k++; + } + } + + // ۼӱԪ + total += (k - total); + } + + count = 0; + for(k = 0; k < total; k++) { + // ǰСֵеֵ뵱ǰСֵһ£ + if(Max[Min[k].y] == Min[k].value) { + printf(" %2d λ (%2d, %2d) %d\n", ++count, Min[k].x, Min[k].y, Min[k].value); + } + } +} diff --git a/VisualC++/ExerciseBook/05.19/05.19.vcxproj b/VisualC++/ExerciseBook/05.19/05.19.vcxproj new file mode 100644 index 0000000..02c2a58 --- /dev/null +++ b/VisualC++/ExerciseBook/05.19/05.19.vcxproj @@ -0,0 +1,76 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {0E1F3F75-49AB-4167-83E2-C118DB269292} + My0519 + + + + 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/05.19/05.19.vcxproj.filters b/VisualC++/ExerciseBook/05.19/05.19.vcxproj.filters new file mode 100644 index 0000000..22049ec --- /dev/null +++ b/VisualC++/ExerciseBook/05.19/05.19.vcxproj.filters @@ -0,0 +1,30 @@ + + + + + {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/05.19/05.19.vcxproj.user b/VisualC++/ExerciseBook/05.19/05.19.vcxproj.user new file mode 100644 index 0000000..ace9a86 --- /dev/null +++ b/VisualC++/ExerciseBook/05.19/05.19.vcxproj.user @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/05.19/Array.c b/VisualC++/ExerciseBook/05.19/Array.c new file mode 100644 index 0000000..e81eac3 --- /dev/null +++ b/VisualC++/ExerciseBook/05.19/Array.c @@ -0,0 +1,178 @@ +/*======== + * ά + =========*/ + +#include "Array.h" //**05 ͹**// + +/* + * ʼ + * + * ʼάΪdim飬ɱָʾάȵĴС + */ +Status InitArray(Array* A, int dim, ...) { + int elemtotal; // ͳԪظ + va_list ap; // apſɱϢָʾάȵĴС + int i; + + if(A == NULL) { + return ERROR; + } + + if(dim < 1 || dim > MAX_ARRAY_DIM) { // ά + return ERROR; + } + + (*A).dim = dim; // ʼά + + // ʼάϢ + (*A).bounds = (int*) malloc(dim * sizeof(int)); + if((*A).bounds == NULL) { + exit(OVERFLOW); + } + + // άȳȺϷboundsAԪelemtotal + elemtotal = 1; + + // ʹapָһɱdim൱ʼʶ + va_start(ap, dim); + + for(i = 0; i < dim; i++) { + // ¼ǰάȵĿ + (*A).bounds[i] = va_arg(ap, int); + if((*A).bounds[i] <= 0) { + return ERROR; + } + + elemtotal *= A->bounds[i]; + } + + // ÿap + va_end(ap); + + // ʼռ䣬ԴԪ + (*A).base = (ElemType*) malloc(elemtotal * sizeof(ElemType)); + if((*A).base == NULL) { + exit(OVERFLOW); + } + + // ʼӳϢ + (*A).constants = (int*) malloc(dim * sizeof(int)); + if((*A).constants == NULL) { + exit(OVERFLOW); + } + + // һάȣÿҪԽһԪ + (*A).constants[dim - 1] = 1; + for(i = dim - 2; i >= 0; i--) { + (*A).constants[i] = (*A).bounds[i + 1] * (*A).constants[i + 1]; + } + + /* + * + * ά[2,3,4]˵boundsֵΪ<2,3,4>constantsֵΪ<12,4,1> + * boundsһάа2Ԫأڶάа3Ԫأάа4Ԫ + * constantsһάÿҪ12ԪأڶάÿҪԽ4ԪأάÿҪԽ1Ԫ + */ + + return OK; +} + +/* + * (ṹ) + * + * ռõĿռ䡣 + */ +Status DestroyArray(Array* A) { + if(A == NULL || (*A).base == NULL || (*A).bounds == NULL || (*A).constants == NULL) { + return ERROR; + } + + free((*A).base); + (*A).base = NULL; + + free((*A).bounds); + (*A).bounds = NULL; + + free((*A).constants); + (*A).constants = NULL; + + (*A).dim = 0; + + return OK; +} + +/* + * ȡֵ + * + * ȡָ±괦ԪֵɱΪdim±ֵָʾȡԪ±ꡣ + */ +Status Value(Array A, ElemType* e, ...) { + va_list ap; + Status result; + int off; + + va_start(ap, e); + + // ԪصĿԪҪԽԪ + result = Locate(A, ap, &off); + + va_end(ap); + + if(result == OVERFLOW) { + return result; + } + + *e = *(A.base + off); + + return OK; +} + +/* + * ֵ + * + * Ϊָ±괦ԪظֵɱΪdim±ֵָʾֵԪ±ꡣ + */ +Status Assign(Array* A, ElemType e, ...) { + va_list ap; + Status result; + int off; + + va_start(ap, e); + + // ԪصĿԪҪԽԪ + result = Locate(*A, ap, &off); + + va_end(ap); + + if(result == OVERFLOW) { + return result; + } + + *(A->base + off) = e; + + return OK; +} + +/* + * apָʾֵAеλã + * ԪصĿԪҪԽԪ + */ +static Status Locate(Array A, va_list ap, int* off) { + int i, ind; + + *off = 0; + + for(i = 0; i < A.dim; i++) { + ind = va_arg(ap, int); + + // ֤±겻Խ + if(ind < 0 || ind >= A.bounds[i]) { + return OVERFLOW; + } + + // ijάȵĵλԪظ*Ҫĵλ + *off += A.constants[i] * ind; + } + + return OK; +} diff --git a/VisualC++/ExerciseBook/05.19/Array.h b/VisualC++/ExerciseBook/05.19/Array.h new file mode 100644 index 0000000..31dd29f --- /dev/null +++ b/VisualC++/ExerciseBook/05.19/Array.h @@ -0,0 +1,62 @@ +/*======== + * ά + =========*/ + +#ifndef ARRAY_H +#define ARRAY_H + +#include +#include // ṩmallocreallocfreeexitԭ +#include // ṩva_startva_argva_end +#include "Status.h" //**01 **// + +/* 궨 */ +#define MAX_ARRAY_DIM 8 // άΪ8 + +/* Ԫ */ +typedef int ElemType; + +/* ˳洢ʾ */ +typedef struct { + ElemType* base; // ԪػַԪأ + int dim; // ά + int* bounds; // άַСϢ + int* constants; // ӳַ洢ijάʱÿҪԽԪظ +} Array; + + +/* + * ʼ + * + * ʼάΪdim飬ɱָʾάȵĴС + */ +Status InitArray(Array* A, int dim, ...); + +/* + * (ṹ) + * + * ռõĿռ䡣 + */ +Status DestroyArray(Array* A); + +/* + * ȡֵ + * + * ȡָ±괦ԪֵɱΪdim±ֵָʾȡԪ±ꡣ + */ +Status Value(Array A, ElemType* e, ...); + +/* + * ֵ + * + * Ϊָ±괦ԪظֵɱΪdim±ֵָʾֵԪ±ꡣ + */ +Status Assign(Array* A, ElemType e, ...); + +/* + * apָʾֵAеλã + * ԪصĿԪҪԽԪ + */ +static Status Locate(Array A, va_list ap, int *off); + +#endif diff --git a/VisualC++/ExerciseBook/05.20/05.20.c b/VisualC++/ExerciseBook/05.20/05.20.c new file mode 100644 index 0000000..4246091 --- /dev/null +++ b/VisualC++/ExerciseBook/05.20/05.20.c @@ -0,0 +1,112 @@ +#include +#include // ṩ systemrandsrand ԭ +#include // ṩ time ԭ +#include "Array.h" //**05 ͹**// + +// ݶʽϵʽ +void Algo_5_20(Array A); + +// ڲʵ +static void Print(Array A, int dim, int index[]); + + +int main(int argc, char* argv[]) { + Array A; + int i, j, k; + ElemType e = 0; + + // ʼһάΪ<2,3,4>ά + InitArray(&A, 3, 2, 3, 4); + + srand((unsigned) time(NULL)); // ϵͳʱ + + // ׼ + for(i = 0; i < A.bounds[0]; i++) { + for(j = 0; j < A.bounds[1]; j++) { + for(k = 0; k < A.bounds[2]; k++) { + e = rand() % 50 - 25; // + Assign(&A, e, i, j, k); + } + } + } + + // ʽ + Algo_5_20(A); + + return 0; +} + + +// ݶʽϵʽ +void Algo_5_20(Array A) { + int i; + int* index; + + // ڱԪʱ¼ÿԪصֻ¼ǰdim-1ά + index = (int*) malloc((A.dim - 1) * sizeof(int)); + for(i = 0; i < A.dim - 1; i++) { + index[i] = -1; + } + + Print(A, 1, index); + + printf("\n"); +} + +// ڲʵ +static void Print(Array A, int dim, int index[]) { + int i, j; + int start; + ElemType coef; + + if(dim == A.dim) { + start = 0; + + // 㱾αʼԪλ + for(i = 0; i < dim - 1; i++) { + start += index[i] * A.constants[i]; + } + + // һάڵԪ + for(i = 0; i < A.bounds[dim - 1]; i++) { + // ȡϵ + coef = A.base[start + i]; + + // ϵΪ0 + if(coef == 0) { + continue; + } + + if(coef < 0) { + printf(" - "); + } else { + printf(" + "); + } + + // ϵľֵΪ1ʱϵ + if(abs(coef) != 1) { + // ϵţǰѾţһҲŷ + printf("%d", abs(coef)); + } + + /* + * ʽÿһδ֪abc... + * + *ע + * ָλ0ָλ1ΣȻӡ + * ѡ񲻴ӡЩ + */ + for(j = 0; j < dim - 1; j++) { + printf("%c^%d", 'a' + j, index[j]); + } + printf("%c^%d", 'a' + j, i); + } + } else { + for(i = 0; i < A.bounds[dim - 1]; i++) { + // ת + index[dim - 1] = (index[dim - 1] + 1 + A.bounds[dim - 1]) % A.bounds[dim - 1]; + + Print(A, dim + 1, index); + } + } +} diff --git a/VisualC++/ExerciseBook/05.20/05.20.vcxproj b/VisualC++/ExerciseBook/05.20/05.20.vcxproj new file mode 100644 index 0000000..60d7790 --- /dev/null +++ b/VisualC++/ExerciseBook/05.20/05.20.vcxproj @@ -0,0 +1,76 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {685BE3FF-10F8-417E-9601-7CDE7AEFAC0B} + My0520 + + + + 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/05.20/05.20.vcxproj.filters b/VisualC++/ExerciseBook/05.20/05.20.vcxproj.filters new file mode 100644 index 0000000..547966c --- /dev/null +++ b/VisualC++/ExerciseBook/05.20/05.20.vcxproj.filters @@ -0,0 +1,30 @@ + + + + + {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/05.20/05.20.vcxproj.user b/VisualC++/ExerciseBook/05.20/05.20.vcxproj.user new file mode 100644 index 0000000..ace9a86 --- /dev/null +++ b/VisualC++/ExerciseBook/05.20/05.20.vcxproj.user @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/05.20/Array.c b/VisualC++/ExerciseBook/05.20/Array.c new file mode 100644 index 0000000..e81eac3 --- /dev/null +++ b/VisualC++/ExerciseBook/05.20/Array.c @@ -0,0 +1,178 @@ +/*======== + * ά + =========*/ + +#include "Array.h" //**05 ͹**// + +/* + * ʼ + * + * ʼάΪdim飬ɱָʾάȵĴС + */ +Status InitArray(Array* A, int dim, ...) { + int elemtotal; // ͳԪظ + va_list ap; // apſɱϢָʾάȵĴС + int i; + + if(A == NULL) { + return ERROR; + } + + if(dim < 1 || dim > MAX_ARRAY_DIM) { // ά + return ERROR; + } + + (*A).dim = dim; // ʼά + + // ʼάϢ + (*A).bounds = (int*) malloc(dim * sizeof(int)); + if((*A).bounds == NULL) { + exit(OVERFLOW); + } + + // άȳȺϷboundsAԪelemtotal + elemtotal = 1; + + // ʹapָһɱdim൱ʼʶ + va_start(ap, dim); + + for(i = 0; i < dim; i++) { + // ¼ǰάȵĿ + (*A).bounds[i] = va_arg(ap, int); + if((*A).bounds[i] <= 0) { + return ERROR; + } + + elemtotal *= A->bounds[i]; + } + + // ÿap + va_end(ap); + + // ʼռ䣬ԴԪ + (*A).base = (ElemType*) malloc(elemtotal * sizeof(ElemType)); + if((*A).base == NULL) { + exit(OVERFLOW); + } + + // ʼӳϢ + (*A).constants = (int*) malloc(dim * sizeof(int)); + if((*A).constants == NULL) { + exit(OVERFLOW); + } + + // һάȣÿҪԽһԪ + (*A).constants[dim - 1] = 1; + for(i = dim - 2; i >= 0; i--) { + (*A).constants[i] = (*A).bounds[i + 1] * (*A).constants[i + 1]; + } + + /* + * + * ά[2,3,4]˵boundsֵΪ<2,3,4>constantsֵΪ<12,4,1> + * boundsһάа2Ԫأڶάа3Ԫأάа4Ԫ + * constantsһάÿҪ12ԪأڶάÿҪԽ4ԪأάÿҪԽ1Ԫ + */ + + return OK; +} + +/* + * (ṹ) + * + * ռõĿռ䡣 + */ +Status DestroyArray(Array* A) { + if(A == NULL || (*A).base == NULL || (*A).bounds == NULL || (*A).constants == NULL) { + return ERROR; + } + + free((*A).base); + (*A).base = NULL; + + free((*A).bounds); + (*A).bounds = NULL; + + free((*A).constants); + (*A).constants = NULL; + + (*A).dim = 0; + + return OK; +} + +/* + * ȡֵ + * + * ȡָ±괦ԪֵɱΪdim±ֵָʾȡԪ±ꡣ + */ +Status Value(Array A, ElemType* e, ...) { + va_list ap; + Status result; + int off; + + va_start(ap, e); + + // ԪصĿԪҪԽԪ + result = Locate(A, ap, &off); + + va_end(ap); + + if(result == OVERFLOW) { + return result; + } + + *e = *(A.base + off); + + return OK; +} + +/* + * ֵ + * + * Ϊָ±괦ԪظֵɱΪdim±ֵָʾֵԪ±ꡣ + */ +Status Assign(Array* A, ElemType e, ...) { + va_list ap; + Status result; + int off; + + va_start(ap, e); + + // ԪصĿԪҪԽԪ + result = Locate(*A, ap, &off); + + va_end(ap); + + if(result == OVERFLOW) { + return result; + } + + *(A->base + off) = e; + + return OK; +} + +/* + * apָʾֵAеλã + * ԪصĿԪҪԽԪ + */ +static Status Locate(Array A, va_list ap, int* off) { + int i, ind; + + *off = 0; + + for(i = 0; i < A.dim; i++) { + ind = va_arg(ap, int); + + // ֤±겻Խ + if(ind < 0 || ind >= A.bounds[i]) { + return OVERFLOW; + } + + // ijάȵĵλԪظ*Ҫĵλ + *off += A.constants[i] * ind; + } + + return OK; +} diff --git a/VisualC++/ExerciseBook/05.20/Array.h b/VisualC++/ExerciseBook/05.20/Array.h new file mode 100644 index 0000000..31dd29f --- /dev/null +++ b/VisualC++/ExerciseBook/05.20/Array.h @@ -0,0 +1,62 @@ +/*======== + * ά + =========*/ + +#ifndef ARRAY_H +#define ARRAY_H + +#include +#include // ṩmallocreallocfreeexitԭ +#include // ṩva_startva_argva_end +#include "Status.h" //**01 **// + +/* 궨 */ +#define MAX_ARRAY_DIM 8 // άΪ8 + +/* Ԫ */ +typedef int ElemType; + +/* ˳洢ʾ */ +typedef struct { + ElemType* base; // ԪػַԪأ + int dim; // ά + int* bounds; // άַСϢ + int* constants; // ӳַ洢ijάʱÿҪԽԪظ +} Array; + + +/* + * ʼ + * + * ʼάΪdim飬ɱָʾάȵĴС + */ +Status InitArray(Array* A, int dim, ...); + +/* + * (ṹ) + * + * ռõĿռ䡣 + */ +Status DestroyArray(Array* A); + +/* + * ȡֵ + * + * ȡָ±괦ԪֵɱΪdim±ֵָʾȡԪ±ꡣ + */ +Status Value(Array A, ElemType* e, ...); + +/* + * ֵ + * + * Ϊָ±괦ԪظֵɱΪdim±ֵָʾֵԪ±ꡣ + */ +Status Assign(Array* A, ElemType e, ...); + +/* + * apָʾֵAеλã + * ԪصĿԪҪԽԪ + */ +static Status Locate(Array A, va_list ap, int *off); + +#endif diff --git a/VisualC++/ExerciseBook/05.21/05.21.c b/VisualC++/ExerciseBook/05.21/05.21.c new file mode 100644 index 0000000..c6f0b54 --- /dev/null +++ b/VisualC++/ExerciseBook/05.21/05.21.c @@ -0,0 +1,43 @@ +#include +#include "Status.h" //**01 **// +#include "TSMatrix.h" //**05 ͹**// + +/* + * ϡӷAddSMatrix + * + *ע + * úTSMatrixļж + */ +Status Algo_5_21(TSMatrix A, TSMatrix B, TSMatrix* C); + + +int main(int argc, char* argv[]) { + TSMatrix A, B, C; + + printf(" ϡ AB ...\n"); + CreateSMatrix(&A, "TestData_A.txt"); + CreateSMatrix(&B, "TestData_B.txt"); + printf(" A = \n"); + PrintSMatrix(A); + printf(" B = \n"); + PrintSMatrix(B); + + // + Algo_5_21(A, B, &C); + + printf(" C = A + B = \n"); + PrintSMatrix(C); + + return 0; +} + + +/* + * ϡӷAddSMatrix + * + *ע + * úTSMatrixļж + */ +Status Algo_5_21(TSMatrix A, TSMatrix B, TSMatrix* C) { + return AddSMatrix(A, B, C); +} diff --git a/VisualC++/ExerciseBook/05.21/05.21.vcxproj b/VisualC++/ExerciseBook/05.21/05.21.vcxproj new file mode 100644 index 0000000..53c36c0 --- /dev/null +++ b/VisualC++/ExerciseBook/05.21/05.21.vcxproj @@ -0,0 +1,80 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {2E30EE16-A652-4316-8FBC-6245559F35E3} + My0521 + + + + 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/05.21/05.21.vcxproj.filters b/VisualC++/ExerciseBook/05.21/05.21.vcxproj.filters new file mode 100644 index 0000000..149a548 --- /dev/null +++ b/VisualC++/ExerciseBook/05.21/05.21.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/05.21/05.21.vcxproj.user b/VisualC++/ExerciseBook/05.21/05.21.vcxproj.user new file mode 100644 index 0000000..ace9a86 --- /dev/null +++ b/VisualC++/ExerciseBook/05.21/05.21.vcxproj.user @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/05.21/TSMatrix.c b/VisualC++/ExerciseBook/05.21/TSMatrix.c new file mode 100644 index 0000000..05eeaad --- /dev/null +++ b/VisualC++/ExerciseBook/05.21/TSMatrix.c @@ -0,0 +1,433 @@ +/*======================= + * Ԫ˳ϡ + * + * 㷨: 5.15.2 + ========================*/ + +#include "TSMatrix.h" //**05 ͹**// + +/* + * ϡM + * + * + *ע + * + * ̲Ĭϴӿ̨ȡݡ + * Ϊ˷ԣÿжֶݣ + * ѡԤļpathжȡݡ + * + * Ҫӿ̨ȡݣpathΪNULLΪմ + * ҪļжȡݣҪpathдļϢ + */ +Status CreateSMatrix(TSMatrix* M, char* path) { + int k; + FILE* fp; + int readFromConsole; // Ƿӿ̨ȡ + + // ûļ·Ϣӿ̨ȡ + readFromConsole = path == NULL || strcmp(path, "") == 0; + + // ûļ·Ϣӿ̨ȡ + if(readFromConsole) { + printf(""); + scanf("%d", &((*M).mu)); + printf(""); + scanf("%d", &((*M).nu)); + printf("Ԫظ"); + scanf("%d", &((*M).tu)); + printf("%dԪϢ\n", (*M).tu); + for(k = 1; k <= (*M).tu; k++) { + printf("%2d飺", k); + scanf("%d%d%d", &((*M).data[k].i), &((*M).data[k].j), &((*M).data[k].e)); + } + } else { + fp = fopen(path, "r"); + + ReadData(fp, "%d%d%d", &((*M).mu), &((*M).nu), &((*M).tu)); + + for(k = 1; k <= (*M).tu; k++) { + ReadData(fp, "%d%d%d", &((*M).data[k].i), &((*M).data[k].j), &((*M).data[k].e)); + } + + fclose(fp); + } + + return OK; +} + +/* + * ϡ + * + *ע + * Ԫ˳Ľṹ޷١ + */ +Status DestroySMatrix(TSMatrix* M) { + if(M == NULL) { + return ERROR; + } + + (*M).mu = 0; + (*M).nu = 0; + (*M).tu = 0; + + return OK; +} + +/* + * + * + * һ¾Tþ˴ӾMаݡ + */ +Status CopySMatrix(TSMatrix M, TSMatrix* T) { + (*T) = M; // ṹֱ֮ӸƣʹڲҲ + + return OK; +} + +/* + * ӷ + * + * Q = M + N + */ +Status AddSMatrix(TSMatrix M, TSMatrix N, TSMatrix* Q) { + int m, n, k; + + if(M.mu != N.mu || M.nu != N.nu) { + printf("\n"); + return ERROR; + } + + // ʼQ + (*Q).mu = M.mu; + (*Q).nu = M.nu; + (*Q).tu = 0; + + m = n = k = 1; + + // αMNԪ + while(m <= M.tu && n <= N.tu) { + // MеԪ±С + if(M.data[m].i < N.data[n].i) { + (*Q).data[k] = M.data[m]; + m++; + + // NеԪ±С + } else if(M.data[m].i > N.data[n].i) { + (*Q).data[k] = N.data[n]; + n++; + + // MNеԪ±һ£ҪһȽ + } else { + // MеԪ±С + if(M.data[m].j < N.data[n].j) { + (*Q).data[k] = M.data[m]; + m++; + + // NеԪ±С + } else if(M.data[m].j > N.data[n].j) { + (*Q).data[k] = N.data[n]; + n++; + + // MNеԪ±һ£Ҫмӷ + } else { + // ֵѾΪ0ĻҪ洢Ԫ + if((M.data[m].e + N.data[n].e) == 0) { + m++; + n++; + continue; + } else { + (*Q).data[k].i = M.data[m].i; + (*Q).data[k].j = M.data[m].j; + (*Q).data[k].e = M.data[m].e + N.data[n].e; + m++; + n++; + } + } + } + + k++; + (*Q).tu++; + } + + // MʣԪ + while(m <= M.tu) { + (*Q).data[k] = M.data[m]; + m++; + k++; + (*Q).tu++; + } + + // NʣԪ + while(n <= N.tu) { + (*Q).data[k] = N.data[n]; + n++; + k++; + (*Q).tu++; + } + + return OK; +} + +/* + * + * + * Q = M - N + */ +Status SubSMatrix(TSMatrix M, TSMatrix N, TSMatrix* Q) { + int m, n, k; + + if(M.mu != N.mu || M.nu != N.nu) { + printf("\n"); + return ERROR; + } + + // ʼQ + (*Q).mu = M.mu; + (*Q).nu = M.nu; + (*Q).tu = 0; + + m = n = k = 1; + + // αMNԪ + while(m <= M.tu && n <= N.tu) { + // MеԪ±С + if(M.data[m].i < N.data[n].i) { + (*Q).data[k] = M.data[m]; + m++; + + // NеԪ±С + } else if(M.data[m].i > N.data[n].i) { + (*Q).data[k].i = N.data[n].i; + (*Q).data[k].j = N.data[n].j; + (*Q).data[k].e = -N.data[n].e; // ҪԪֵȡ෴ + n++; + + // MNеԪ±һ£ҪһȽ + } else { + // MеԪ±С + if(M.data[m].j < N.data[n].j) { + (*Q).data[k] = M.data[m]; + m++; + + // NеԪ±С + } else if(M.data[m].j > N.data[n].j) { + (*Q).data[k].i = N.data[n].i; + (*Q).data[k].j = N.data[n].j; + (*Q).data[k].e = -N.data[n].e; // ҪԪֵȡ෴ + n++; + + // MNеԪ±һ£Ҫм + } else { + // ֵѾΪ0ĻҪ洢Ԫ + if((M.data[m].e - N.data[n].e) == 0) { + m++; + n++; + continue; + } else { + (*Q).data[k].i = M.data[m].i; + (*Q).data[k].j = M.data[m].j; + (*Q).data[k].e = M.data[m].e - N.data[n].e; + m++; + n++; + } + } + } + + k++; + (*Q).tu++; + } + + // MʣԪ + while(m <= M.tu) { + (*Q).data[k] = M.data[m]; + m++; + k++; + (*Q).tu++; + } + + // NʣԪ + while(n <= N.tu) { + (*Q).data[k].i = N.data[n].i; + (*Q).data[k].j = N.data[n].j; + (*Q).data[k].e = -N.data[n].e; + n++; + k++; + (*Q).tu++; + } + + return OK; +} + +/* + * ˷ + * + * Q = M * NʵֵǴͳ˷ + */ +Status MultSMatrix(TSMatrix M, TSMatrix N, TSMatrix* Q) { + int m, n, i, j, k; + ElemType c, c1, c2; + + // MҪN + if(M.nu != N.mu) { + printf("\n"); + return ERROR; + } + + // ʼQ + (*Q).mu = M.mu; + (*Q).nu = N.nu; + (*Q).tu = 0; + + // + if(M.tu * N.tu == 0) { + return OK; + } + + // M + for(i = 1; i <= M.mu; i++) { + // N + for(j = 1; j <= N.nu; j++) { + c = 0; + for(k = 1; k <= M.nu; k++) { + // ¼M[i][k]ֵ + c1 = 0; + // ѰλָλõMԪ + for(m = 1; m <= M.tu; m++) { + if(M.data[m].i == i && M.data[m].j == k) { + c1 = M.data[m].e; + break; + } + } + + // ¼N[k][j]ֵ + c2 = 0; + //ѰλָλõNԪ + for(n = 1; n <= N.tu; n++) { + if(N.data[n].i == k && N.data[n].j == j) { + c2 = N.data[n].e; + break; + } + } + + // Q[i][j]ֵ + if(c1 && c2) { + c += c1 * c2; + } + } + + // Ϊ0д洢 + if(c != 0) { + (*Q).tu++; + (*Q).data[(*Q).tu].i = i; + (*Q).data[(*Q).tu].j = j; + (*Q).data[(*Q).tu].e = c; + } + } + } + + return OK; +} + +/* + * 㷨5.1 + * + * ת + */ +Status TransposeSMatrix(TSMatrix M, TSMatrix* T) { + int p, q, col; + + (*T).mu = M.nu; + (*T).nu = M.mu; + (*T).tu = M.tu; + + if((*T).tu != 0) { + q = 1; // qTзԪļ + + // colMУT + for(col = 1; col <= M.nu; ++col) { + // MвҵjеԪأνתõT + for(p = 1; p <= M.tu; ++p) { + if(M.data[p].j == col) { + (*T).data[q].i = M.data[p].j; // MбΪT + (*T).data[q].j = M.data[p].i; // MбΪT + (*T).data[q].e = M.data[p].e; // ÿԪֵ + ++q; + } + } + } + } + + return OK; +} + +/* + * 㷨5.2 + * + * ת + */ +Status FastTransposeSMatrix(TSMatrix M, TSMatrix* T) { + int col, t, p, q; + int* num; // num[col] ʾMcolзԪĸ + int* copt; // copt[col]ʾMcolеһԪתúеλ + + (*T).mu = M.nu; + (*T).nu = M.mu; + (*T).tu = M.tu; + + // ǰ + if((*T).tu == 0) { + return ERROR; + } + + num = (int*) malloc(M.nu * sizeof(int)); + copt = (int*) malloc(M.nu * sizeof(int)); + + // ʼnum + for(col = 1; col <= M.nu; ++col) { + num[col] = 0; + } + + // ͳMеķԪͳÿзԪĸ + for(t = 1; t <= M.tu; ++t) { + num[M.data[t].j]++; + } + + // 1е1Ԫλתúеλ + copt[1] = 1; + // е1Ԫתþеλ + for(col = 2; col <= M.nu; ++col) { + copt[col] = copt[col - 1] + num[col - 1]; + } + + // ɨMеԪ + for(p = 1; p <= M.tu; ++p) { + col = M.data[p].j; // 㵱ǰԪ + q = copt[col]; // 㵱ǰԪתþеλ + (*T).data[q].i = M.data[p].j; + (*T).data[q].j = M.data[p].i; + (*T).data[q].e = M.data[p].e; + ++copt[col]; // ԪʱתþеλӦһòҪ + } + + return OK; +} + +/* + * + */ +void PrintSMatrix(TSMatrix M) { + int r, c; + int k = 1; + + for(r = 1; r <= M.mu; r++) { + for(c = 1; c <= M.nu; c++) { + if(r == M.data[k].i && c == M.data[k].j) { + printf("%3d ", M.data[k].e); + k++; + } else { + printf("%3d ", 0); + } + } + printf("\n"); + } +} diff --git a/VisualC++/ExerciseBook/05.21/TSMatrix.h b/VisualC++/ExerciseBook/05.21/TSMatrix.h new file mode 100644 index 0000000..52cdeea --- /dev/null +++ b/VisualC++/ExerciseBook/05.21/TSMatrix.h @@ -0,0 +1,107 @@ +/*======================= + * Ԫ˳ϡ + * + * 㷨: 5.15.2 + ========================*/ + +#ifndef TSMATRIX_H +#define TSMATRIX_H + +#include +#include // ṩ malloc ԭ +#include // ṩ strstr ԭ +#include "Status.h" //**01 **// + +/* + * Ԫֵ + * עֵҪIDEջڴ + */ +#define MAXSIZE 100 + +/* ԪϡԪ */ +typedef int ElemType; + +/* ԪͶ壬Ҫ洢Ԫ */ +typedef struct { + int i, j; // ԪԪ±± + ElemType e; +} Triple; + +/* ԪϡͶ */ +typedef struct { + Triple data[MAXSIZE + 1]; // ԪԪdata[0]δ + int mu, nu, tu; // ͷԪ +} TSMatrix; + + +/* + * ϡM + * + * + *ע + * + * ̲Ĭϴӿ̨ȡݡ + * Ϊ˷ԣÿжֶݣ + * ѡԤļpathжȡݡ + * + * Ҫӿ̨ȡݣpathΪNULLΪմ + * ҪļжȡݣҪpathдļϢ + */ +Status CreateSMatrix(TSMatrix* M, char* path); + +/* + * ϡ + * + *ע + * Ԫ˳Ľṹ޷١ + */ +Status DestroySMatrix(TSMatrix* M); + +/* + * + * + * һ¾Tþ˴ӾMаݡ + */ +Status CopySMatrix(TSMatrix M, TSMatrix* T); + +/* + * ӷ + * + * Q = M + N + */ +Status AddSMatrix(TSMatrix M, TSMatrix N, TSMatrix* Q); + +/* + * + * + * Q = M - N + */ +Status SubSMatrix(TSMatrix M, TSMatrix N, TSMatrix* Q); + +/* + * ˷ + * + * Q = M * NʵֵǴͳ˷ + */ +Status MultSMatrix(TSMatrix M, TSMatrix N, TSMatrix* Q); + +/* + * 㷨5.1 + * + * ת + */ +Status TransposeSMatrix(TSMatrix M, TSMatrix* T); + +/* + * 㷨5.2 + * + * ת + */ +Status FastTransposeSMatrix(TSMatrix M, TSMatrix* T); + +/* + * + */ +void PrintSMatrix(TSMatrix M); + +#endif diff --git a/VisualC++/ExerciseBook/05.21/TestData_A.txt b/VisualC++/ExerciseBook/05.21/TestData_A.txt new file mode 100644 index 0000000..be25c94 --- /dev/null +++ b/VisualC++/ExerciseBook/05.21/TestData_A.txt @@ -0,0 +1,4 @@ +5 +5 +Ԫ10 +Ԫ飺(1,2,1),(1,4,5),(2,3,-3),(2,5,2),(3,1,2),(3,2,3),(3,3,4),(4,4,2),(5,1,3),(5,2,-1) \ No newline at end of file diff --git a/VisualC++/ExerciseBook/05.21/TestData_B.txt b/VisualC++/ExerciseBook/05.21/TestData_B.txt new file mode 100644 index 0000000..7c940db --- /dev/null +++ b/VisualC++/ExerciseBook/05.21/TestData_B.txt @@ -0,0 +1,4 @@ +5 +5 +Ԫ8 +Ԫ飺(1,1,-3)(1,3,2)(2,4,-1)(3,2,4)(4,1,6)(4,5,5)(5,1,3)(5,3,2) \ No newline at end of file diff --git a/VisualC++/ExerciseBook/05.22/05.22.c b/VisualC++/ExerciseBook/05.22/05.22.c new file mode 100644 index 0000000..6ee74f7 --- /dev/null +++ b/VisualC++/ExerciseBook/05.22/05.22.c @@ -0,0 +1,106 @@ +#include +#include "Status.h" //**01 **// +#include "TSMatrix.h" //**05 ͹**// + +/* + * ϡӷAddSMatrix + * + *ע + * Ҫ浽ԭA + */ +Status Algo_5_22(TSMatrix* A, TSMatrix B); + + +int main(int argc, char* argv[]) { + TSMatrix A, B; + + printf(" ϡ AB ...\n"); + CreateSMatrix(&A, "TestData_A.txt"); + CreateSMatrix(&B, "TestData_B.txt"); + printf(" A = \n"); + PrintSMatrix(A); + printf(" B = \n"); + PrintSMatrix(B); + + // + Algo_5_22(&A, B); + + printf(" A = A + B = \n"); + PrintSMatrix(A); + + return 0; +} + + +/* + * ϡӷAddSMatrix + * + *ע + * Ҫ浽ԭA + */ +Status Algo_5_22(TSMatrix* A, TSMatrix B) { + int m, n, k; + + if((*A).mu != B.mu || (*A).nu != B.nu) { + printf("\n"); + return ERROR; + } + + // AԪƶƶΪBԪظ + for(k = (*A).tu; k > 0; k--) { + (*A).data[k + B.tu] = (*A).data[k]; + } + + m = B.tu + 1; // A + n = 1; // B + k = 0; // ָα + + // αABԪ + while(m <= (*A).tu + B.tu && n <= B.tu) { + // AеԪ±С + if((*A).data[m].i < B.data[n].i) { + (*A).data[++k] = (*A).data[m++]; + + // BеԪ±С + } else if((*A).data[m].i > B.data[n].i) { + (*A).data[++k] = B.data[n++]; + + // ABеԪ±һ£ҪһȽ + } else { + // AеԪ±С + if((*A).data[m].j < B.data[n].j) { + (*A).data[++k] = (*A).data[m++]; + + // BеԪ±С + } else if((*A).data[m].j > B.data[n].j) { + (*A).data[++k] = B.data[n++]; + + // ABеԪ±һ£Ҫмӷ + } else { + // ֵΪ0ʱҪ洢Ԫ + if(((*A).data[m].e + B.data[n].e) != 0) { + k++; + (*A).data[k].i = (*A).data[m].i; + (*A).data[k].j = (*A).data[m].j; + (*A).data[k].e = (*A).data[m].e + B.data[n].e; + } + m++; + n++; + } + } + } + + // AʣԪ + while(m <= (*A).tu + B.tu) { + (*A).data[++k] = (*A).data[m++]; + } + + // BʣԪ + while(n <= B.tu) { + (*A).data[++k] = B.data[n++]; + } + + (*A).tu = k; + + return OK; +} diff --git a/VisualC++/ExerciseBook/05.22/05.22.vcxproj b/VisualC++/ExerciseBook/05.22/05.22.vcxproj new file mode 100644 index 0000000..ce921a8 --- /dev/null +++ b/VisualC++/ExerciseBook/05.22/05.22.vcxproj @@ -0,0 +1,80 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {AF31443B-830F-4A4C-A72D-40FC9ACE5654} + My0522 + + + + 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/05.22/05.22.vcxproj.filters b/VisualC++/ExerciseBook/05.22/05.22.vcxproj.filters new file mode 100644 index 0000000..4260a59 --- /dev/null +++ b/VisualC++/ExerciseBook/05.22/05.22.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/05.22/05.22.vcxproj.user b/VisualC++/ExerciseBook/05.22/05.22.vcxproj.user new file mode 100644 index 0000000..ace9a86 --- /dev/null +++ b/VisualC++/ExerciseBook/05.22/05.22.vcxproj.user @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/05.22/TSMatrix.c b/VisualC++/ExerciseBook/05.22/TSMatrix.c new file mode 100644 index 0000000..05eeaad --- /dev/null +++ b/VisualC++/ExerciseBook/05.22/TSMatrix.c @@ -0,0 +1,433 @@ +/*======================= + * Ԫ˳ϡ + * + * 㷨: 5.15.2 + ========================*/ + +#include "TSMatrix.h" //**05 ͹**// + +/* + * ϡM + * + * + *ע + * + * ̲Ĭϴӿ̨ȡݡ + * Ϊ˷ԣÿжֶݣ + * ѡԤļpathжȡݡ + * + * Ҫӿ̨ȡݣpathΪNULLΪմ + * ҪļжȡݣҪpathдļϢ + */ +Status CreateSMatrix(TSMatrix* M, char* path) { + int k; + FILE* fp; + int readFromConsole; // Ƿӿ̨ȡ + + // ûļ·Ϣӿ̨ȡ + readFromConsole = path == NULL || strcmp(path, "") == 0; + + // ûļ·Ϣӿ̨ȡ + if(readFromConsole) { + printf(""); + scanf("%d", &((*M).mu)); + printf(""); + scanf("%d", &((*M).nu)); + printf("Ԫظ"); + scanf("%d", &((*M).tu)); + printf("%dԪϢ\n", (*M).tu); + for(k = 1; k <= (*M).tu; k++) { + printf("%2d飺", k); + scanf("%d%d%d", &((*M).data[k].i), &((*M).data[k].j), &((*M).data[k].e)); + } + } else { + fp = fopen(path, "r"); + + ReadData(fp, "%d%d%d", &((*M).mu), &((*M).nu), &((*M).tu)); + + for(k = 1; k <= (*M).tu; k++) { + ReadData(fp, "%d%d%d", &((*M).data[k].i), &((*M).data[k].j), &((*M).data[k].e)); + } + + fclose(fp); + } + + return OK; +} + +/* + * ϡ + * + *ע + * Ԫ˳Ľṹ޷١ + */ +Status DestroySMatrix(TSMatrix* M) { + if(M == NULL) { + return ERROR; + } + + (*M).mu = 0; + (*M).nu = 0; + (*M).tu = 0; + + return OK; +} + +/* + * + * + * һ¾Tþ˴ӾMаݡ + */ +Status CopySMatrix(TSMatrix M, TSMatrix* T) { + (*T) = M; // ṹֱ֮ӸƣʹڲҲ + + return OK; +} + +/* + * ӷ + * + * Q = M + N + */ +Status AddSMatrix(TSMatrix M, TSMatrix N, TSMatrix* Q) { + int m, n, k; + + if(M.mu != N.mu || M.nu != N.nu) { + printf("\n"); + return ERROR; + } + + // ʼQ + (*Q).mu = M.mu; + (*Q).nu = M.nu; + (*Q).tu = 0; + + m = n = k = 1; + + // αMNԪ + while(m <= M.tu && n <= N.tu) { + // MеԪ±С + if(M.data[m].i < N.data[n].i) { + (*Q).data[k] = M.data[m]; + m++; + + // NеԪ±С + } else if(M.data[m].i > N.data[n].i) { + (*Q).data[k] = N.data[n]; + n++; + + // MNеԪ±һ£ҪһȽ + } else { + // MеԪ±С + if(M.data[m].j < N.data[n].j) { + (*Q).data[k] = M.data[m]; + m++; + + // NеԪ±С + } else if(M.data[m].j > N.data[n].j) { + (*Q).data[k] = N.data[n]; + n++; + + // MNеԪ±һ£Ҫмӷ + } else { + // ֵѾΪ0ĻҪ洢Ԫ + if((M.data[m].e + N.data[n].e) == 0) { + m++; + n++; + continue; + } else { + (*Q).data[k].i = M.data[m].i; + (*Q).data[k].j = M.data[m].j; + (*Q).data[k].e = M.data[m].e + N.data[n].e; + m++; + n++; + } + } + } + + k++; + (*Q).tu++; + } + + // MʣԪ + while(m <= M.tu) { + (*Q).data[k] = M.data[m]; + m++; + k++; + (*Q).tu++; + } + + // NʣԪ + while(n <= N.tu) { + (*Q).data[k] = N.data[n]; + n++; + k++; + (*Q).tu++; + } + + return OK; +} + +/* + * + * + * Q = M - N + */ +Status SubSMatrix(TSMatrix M, TSMatrix N, TSMatrix* Q) { + int m, n, k; + + if(M.mu != N.mu || M.nu != N.nu) { + printf("\n"); + return ERROR; + } + + // ʼQ + (*Q).mu = M.mu; + (*Q).nu = M.nu; + (*Q).tu = 0; + + m = n = k = 1; + + // αMNԪ + while(m <= M.tu && n <= N.tu) { + // MеԪ±С + if(M.data[m].i < N.data[n].i) { + (*Q).data[k] = M.data[m]; + m++; + + // NеԪ±С + } else if(M.data[m].i > N.data[n].i) { + (*Q).data[k].i = N.data[n].i; + (*Q).data[k].j = N.data[n].j; + (*Q).data[k].e = -N.data[n].e; // ҪԪֵȡ෴ + n++; + + // MNеԪ±һ£ҪһȽ + } else { + // MеԪ±С + if(M.data[m].j < N.data[n].j) { + (*Q).data[k] = M.data[m]; + m++; + + // NеԪ±С + } else if(M.data[m].j > N.data[n].j) { + (*Q).data[k].i = N.data[n].i; + (*Q).data[k].j = N.data[n].j; + (*Q).data[k].e = -N.data[n].e; // ҪԪֵȡ෴ + n++; + + // MNеԪ±һ£Ҫм + } else { + // ֵѾΪ0ĻҪ洢Ԫ + if((M.data[m].e - N.data[n].e) == 0) { + m++; + n++; + continue; + } else { + (*Q).data[k].i = M.data[m].i; + (*Q).data[k].j = M.data[m].j; + (*Q).data[k].e = M.data[m].e - N.data[n].e; + m++; + n++; + } + } + } + + k++; + (*Q).tu++; + } + + // MʣԪ + while(m <= M.tu) { + (*Q).data[k] = M.data[m]; + m++; + k++; + (*Q).tu++; + } + + // NʣԪ + while(n <= N.tu) { + (*Q).data[k].i = N.data[n].i; + (*Q).data[k].j = N.data[n].j; + (*Q).data[k].e = -N.data[n].e; + n++; + k++; + (*Q).tu++; + } + + return OK; +} + +/* + * ˷ + * + * Q = M * NʵֵǴͳ˷ + */ +Status MultSMatrix(TSMatrix M, TSMatrix N, TSMatrix* Q) { + int m, n, i, j, k; + ElemType c, c1, c2; + + // MҪN + if(M.nu != N.mu) { + printf("\n"); + return ERROR; + } + + // ʼQ + (*Q).mu = M.mu; + (*Q).nu = N.nu; + (*Q).tu = 0; + + // + if(M.tu * N.tu == 0) { + return OK; + } + + // M + for(i = 1; i <= M.mu; i++) { + // N + for(j = 1; j <= N.nu; j++) { + c = 0; + for(k = 1; k <= M.nu; k++) { + // ¼M[i][k]ֵ + c1 = 0; + // ѰλָλõMԪ + for(m = 1; m <= M.tu; m++) { + if(M.data[m].i == i && M.data[m].j == k) { + c1 = M.data[m].e; + break; + } + } + + // ¼N[k][j]ֵ + c2 = 0; + //ѰλָλõNԪ + for(n = 1; n <= N.tu; n++) { + if(N.data[n].i == k && N.data[n].j == j) { + c2 = N.data[n].e; + break; + } + } + + // Q[i][j]ֵ + if(c1 && c2) { + c += c1 * c2; + } + } + + // Ϊ0д洢 + if(c != 0) { + (*Q).tu++; + (*Q).data[(*Q).tu].i = i; + (*Q).data[(*Q).tu].j = j; + (*Q).data[(*Q).tu].e = c; + } + } + } + + return OK; +} + +/* + * 㷨5.1 + * + * ת + */ +Status TransposeSMatrix(TSMatrix M, TSMatrix* T) { + int p, q, col; + + (*T).mu = M.nu; + (*T).nu = M.mu; + (*T).tu = M.tu; + + if((*T).tu != 0) { + q = 1; // qTзԪļ + + // colMУT + for(col = 1; col <= M.nu; ++col) { + // MвҵjеԪأνתõT + for(p = 1; p <= M.tu; ++p) { + if(M.data[p].j == col) { + (*T).data[q].i = M.data[p].j; // MбΪT + (*T).data[q].j = M.data[p].i; // MбΪT + (*T).data[q].e = M.data[p].e; // ÿԪֵ + ++q; + } + } + } + } + + return OK; +} + +/* + * 㷨5.2 + * + * ת + */ +Status FastTransposeSMatrix(TSMatrix M, TSMatrix* T) { + int col, t, p, q; + int* num; // num[col] ʾMcolзԪĸ + int* copt; // copt[col]ʾMcolеһԪתúеλ + + (*T).mu = M.nu; + (*T).nu = M.mu; + (*T).tu = M.tu; + + // ǰ + if((*T).tu == 0) { + return ERROR; + } + + num = (int*) malloc(M.nu * sizeof(int)); + copt = (int*) malloc(M.nu * sizeof(int)); + + // ʼnum + for(col = 1; col <= M.nu; ++col) { + num[col] = 0; + } + + // ͳMеķԪͳÿзԪĸ + for(t = 1; t <= M.tu; ++t) { + num[M.data[t].j]++; + } + + // 1е1Ԫλתúеλ + copt[1] = 1; + // е1Ԫתþеλ + for(col = 2; col <= M.nu; ++col) { + copt[col] = copt[col - 1] + num[col - 1]; + } + + // ɨMеԪ + for(p = 1; p <= M.tu; ++p) { + col = M.data[p].j; // 㵱ǰԪ + q = copt[col]; // 㵱ǰԪתþеλ + (*T).data[q].i = M.data[p].j; + (*T).data[q].j = M.data[p].i; + (*T).data[q].e = M.data[p].e; + ++copt[col]; // ԪʱתþеλӦһòҪ + } + + return OK; +} + +/* + * + */ +void PrintSMatrix(TSMatrix M) { + int r, c; + int k = 1; + + for(r = 1; r <= M.mu; r++) { + for(c = 1; c <= M.nu; c++) { + if(r == M.data[k].i && c == M.data[k].j) { + printf("%3d ", M.data[k].e); + k++; + } else { + printf("%3d ", 0); + } + } + printf("\n"); + } +} diff --git a/VisualC++/ExerciseBook/05.22/TSMatrix.h b/VisualC++/ExerciseBook/05.22/TSMatrix.h new file mode 100644 index 0000000..52cdeea --- /dev/null +++ b/VisualC++/ExerciseBook/05.22/TSMatrix.h @@ -0,0 +1,107 @@ +/*======================= + * Ԫ˳ϡ + * + * 㷨: 5.15.2 + ========================*/ + +#ifndef TSMATRIX_H +#define TSMATRIX_H + +#include +#include // ṩ malloc ԭ +#include // ṩ strstr ԭ +#include "Status.h" //**01 **// + +/* + * Ԫֵ + * עֵҪIDEջڴ + */ +#define MAXSIZE 100 + +/* ԪϡԪ */ +typedef int ElemType; + +/* ԪͶ壬Ҫ洢Ԫ */ +typedef struct { + int i, j; // ԪԪ±± + ElemType e; +} Triple; + +/* ԪϡͶ */ +typedef struct { + Triple data[MAXSIZE + 1]; // ԪԪdata[0]δ + int mu, nu, tu; // ͷԪ +} TSMatrix; + + +/* + * ϡM + * + * + *ע + * + * ̲Ĭϴӿ̨ȡݡ + * Ϊ˷ԣÿжֶݣ + * ѡԤļpathжȡݡ + * + * Ҫӿ̨ȡݣpathΪNULLΪմ + * ҪļжȡݣҪpathдļϢ + */ +Status CreateSMatrix(TSMatrix* M, char* path); + +/* + * ϡ + * + *ע + * Ԫ˳Ľṹ޷١ + */ +Status DestroySMatrix(TSMatrix* M); + +/* + * + * + * һ¾Tþ˴ӾMаݡ + */ +Status CopySMatrix(TSMatrix M, TSMatrix* T); + +/* + * ӷ + * + * Q = M + N + */ +Status AddSMatrix(TSMatrix M, TSMatrix N, TSMatrix* Q); + +/* + * + * + * Q = M - N + */ +Status SubSMatrix(TSMatrix M, TSMatrix N, TSMatrix* Q); + +/* + * ˷ + * + * Q = M * NʵֵǴͳ˷ + */ +Status MultSMatrix(TSMatrix M, TSMatrix N, TSMatrix* Q); + +/* + * 㷨5.1 + * + * ת + */ +Status TransposeSMatrix(TSMatrix M, TSMatrix* T); + +/* + * 㷨5.2 + * + * ת + */ +Status FastTransposeSMatrix(TSMatrix M, TSMatrix* T); + +/* + * + */ +void PrintSMatrix(TSMatrix M); + +#endif diff --git a/VisualC++/ExerciseBook/05.22/TestData_A.txt b/VisualC++/ExerciseBook/05.22/TestData_A.txt new file mode 100644 index 0000000..be25c94 --- /dev/null +++ b/VisualC++/ExerciseBook/05.22/TestData_A.txt @@ -0,0 +1,4 @@ +5 +5 +Ԫ10 +Ԫ飺(1,2,1),(1,4,5),(2,3,-3),(2,5,2),(3,1,2),(3,2,3),(3,3,4),(4,4,2),(5,1,3),(5,2,-1) \ No newline at end of file diff --git a/VisualC++/ExerciseBook/05.22/TestData_B.txt b/VisualC++/ExerciseBook/05.22/TestData_B.txt new file mode 100644 index 0000000..7c940db --- /dev/null +++ b/VisualC++/ExerciseBook/05.22/TestData_B.txt @@ -0,0 +1,4 @@ +5 +5 +Ԫ8 +Ԫ飺(1,1,-3)(1,3,2)(2,4,-1)(3,2,4)(4,1,6)(4,5,5)(5,1,3)(5,3,2) \ No newline at end of file diff --git a/VisualC++/ExerciseBook/05.23/05.23.c b/VisualC++/ExerciseBook/05.23/05.23.c new file mode 100644 index 0000000..27818c4 --- /dev/null +++ b/VisualC++/ExerciseBook/05.23/05.23.c @@ -0,0 +1,52 @@ +#include +#include "Status.h" //**01 **// +#include "RLSMatrix.h" //**05 ͹**// + +/* + * ȡеiеjеԪأ洢e + */ +Status Algo_5_23(RLSMatrix M, int i, int j, int* e); + + +int main(int argc, char* argv[]) { + RLSMatrix M; + int e; + + printf(" ϡ M ...\n"); + CreateSMatrix(&M, "TestData_M.txt"); + printf("M = \n"); + PrintSMatrix(M); + + Algo_5_23(M, 2, 3, &e); + printf(" %d %d еԪΪ %d\n", 2, 3, e); + + return 0; +} + + +/* + * ȡеiеjеԪأ洢e + */ +Status Algo_5_23(RLSMatrix M, int i, int j, int* e) { + int begin, end, k; + + if(i < 1 || i > M.mu || j < 1 || j > M.nu) { + return ERROR; + } + + // ȡi׸ԪԪеλ + begin = M.rpos[i]; + end = (i == M.mu ? M.tu : M.rpos[i + 1] - 1); + + *e = 0; // ĬΪ0 + + for(k = begin; k <= end; k++) { + // ҵӦ±Ԫ + if(M.data[k].j == j) { + *e = M.data[k].e; + break; + } + } + + return OK; +} diff --git a/VisualC++/ExerciseBook/05.23/05.23.vcxproj b/VisualC++/ExerciseBook/05.23/05.23.vcxproj new file mode 100644 index 0000000..b9cd533 --- /dev/null +++ b/VisualC++/ExerciseBook/05.23/05.23.vcxproj @@ -0,0 +1,79 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {D342BB95-DAA3-4C66-889A-9DC49DA213B0} + My0523 + + + + 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/05.23/05.23.vcxproj.filters b/VisualC++/ExerciseBook/05.23/05.23.vcxproj.filters new file mode 100644 index 0000000..ec899ed --- /dev/null +++ b/VisualC++/ExerciseBook/05.23/05.23.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/05.23/05.23.vcxproj.user b/VisualC++/ExerciseBook/05.23/05.23.vcxproj.user new file mode 100644 index 0000000..ace9a86 --- /dev/null +++ b/VisualC++/ExerciseBook/05.23/05.23.vcxproj.user @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/05.23/RLSMatrix.c b/VisualC++/ExerciseBook/05.23/RLSMatrix.c new file mode 100644 index 0000000..5d28a0e --- /dev/null +++ b/VisualC++/ExerciseBook/05.23/RLSMatrix.c @@ -0,0 +1,515 @@ +/*============================= + * ߼ӵ˳ϡ + * + * 㷨: 5.3 + ==============================*/ + +#include "RLSMatrix.h" //**05 ͹**// + +/* + * ϡM + * + * + *ע + * + * ̲Ĭϴӿ̨ȡݡ + * Ϊ˷ԣÿжֶݣ + * ѡԤļpathжȡݡ + * + * Ҫӿ̨ȡݣpathΪNULLΪմ + * ҪļжȡݣҪpathдļϢ + */ +Status CreateSMatrix(RLSMatrix* M, char* path) { + int k; + FILE* fp; + int readFromConsole; // Ƿӿ̨ȡ + + // ûļ·Ϣӿ̨ȡ + readFromConsole = path == NULL || strcmp(path, "") == 0; + + // ûļ·Ϣӿ̨ȡ + if(readFromConsole) { + printf(""); + scanf("%d", &((*M).mu)); + printf(""); + scanf("%d", &((*M).nu)); + printf("Ԫظ"); + scanf("%d", &((*M).tu)); + printf("%dԪϢ\n", (*M).tu); + for(k = 1; k <= (*M).tu; k++) { + printf("%2d飺", k); + scanf("%d%d%d", &((*M).data[k].i), &((*M).data[k].j), &((*M).data[k].e)); + } + } else { + fp = fopen(path, "r"); + + ReadData(fp, "%d%d%d", &((*M).mu), &((*M).nu), &((*M).tu)); + + for(k = 1; k <= (*M).tu; k++) { + ReadData(fp, "%d%d%d", &((*M).data[k].i), &((*M).data[k].j), &((*M).data[k].e)); + } + + fclose(fp); + } + + // Ϊrpos鸳ֵ + AssignRpos(M); + + return OK; +} + +/* + * ϡ + * + *ע + * ߼ӵ˳ṹ޷١ + */ +Status DestroySMatrix(RLSMatrix* M) { + int i; + + if(M == NULL) { + return ERROR; + } + + M->mu = 0; + M->nu = 0; + M->tu = 0; + + for(i = 0; i <= MAXRC; ++i) { + M->rpos[i] = 0; + } + + return OK; +} + +/* + * + * + * һ¾Tþ˴ӾMаݡ + */ +Status CopySMatrix(RLSMatrix M, RLSMatrix* T) { + (*T) = M; // ṹֱ֮ӸƣʹڲҲ + + return OK; +} + +/* + * ӷ + * + * Q = M + N + */ +Status AddSMatrix(RLSMatrix M, RLSMatrix N, RLSMatrix* Q) { + int m, n, k; + + if(M.mu != N.mu || M.nu != N.nu) { + printf("\n"); + return ERROR; + } + + // ʼQϢ + (*Q).mu = M.mu; + (*Q).nu = M.nu; + (*Q).tu = 0; + + m = n = k = 1; + + // αMNԪ + while(m <= M.tu && n <= N.tu) { + // MеԪ±С + if(M.data[m].i < N.data[n].i) { + (*Q).data[k] = M.data[m]; + m++; + + // NеԪ±С + } else if(M.data[m].i > N.data[n].i) { + (*Q).data[k] = N.data[n]; + n++; + + // MNеԪ±һ£ҪһȽ + } else { + // MеԪ±С + if(M.data[m].j < N.data[n].j) { + (*Q).data[k] = M.data[m]; + m++; + + // NеԪ±С + } else if(M.data[m].j > N.data[n].j) { + (*Q).data[k] = N.data[n]; + n++; + + // MNеԪ±һ£Ҫмӷ + } else { + // ֵѾΪ0ĻҪ洢Ԫ + if((M.data[m].e + N.data[n].e) == 0) { + m++; + n++; + continue; + } else { + (*Q).data[k].i = M.data[m].i; + (*Q).data[k].j = M.data[m].j; + (*Q).data[k].e = M.data[m].e + N.data[n].e; + m++; + n++; + } + } + } + + k++; + (*Q).tu++; + } + + // MʣԪ + while(m <= M.tu) { + (*Q).data[k] = M.data[m]; + m++; + k++; + (*Q).tu++; + } + + // NʣԪ + while(n <= N.tu) { + (*Q).data[k] = N.data[n]; + n++; + k++; + (*Q).tu++; + } + + // Ϊrpos鸳ֵ + AssignRpos(Q); + + return OK; +} + +/* + * + * + * Q = M - N + */ +Status SubSMatrix(RLSMatrix M, RLSMatrix N, RLSMatrix* Q) { + int m, n, k; + + if(M.mu != N.mu || M.nu != N.nu) { + printf("\n"); + return ERROR; + } + + // ʼQϢ + (*Q).mu = M.mu; + (*Q).nu = M.nu; + (*Q).tu = 0; + + m = n = k = 1; + + // αMNԪ + while(m <= M.tu && n <= N.tu) { + // MеԪ±С + if(M.data[m].i < N.data[n].i) { + (*Q).data[k] = M.data[m]; + m++; + + // NеԪ±С + } else if(M.data[m].i > N.data[n].i) { + (*Q).data[k].i = N.data[n].i; + (*Q).data[k].j = N.data[n].j; + (*Q).data[k].e = -N.data[n].e; // ҪԪֵȡ෴ + n++; + + // MNеԪ±һ£ҪһȽ + } else { + // MеԪ±С + if(M.data[m].j < N.data[n].j) { + (*Q).data[k] = M.data[m]; + m++; + + // NеԪ±С + } else if(M.data[m].j > N.data[n].j) { + (*Q).data[k].i = N.data[n].i; + (*Q).data[k].j = N.data[n].j; + (*Q).data[k].e = -N.data[n].e; // ҪԪֵȡ෴ + n++; + + // MNеԪ±һ£Ҫм + } else { + // ֵѾΪ0ĻҪ洢Ԫ + if((M.data[m].e - N.data[n].e) == 0) { + m++; + n++; + continue; + } else { + (*Q).data[k].i = M.data[m].i; + (*Q).data[k].j = M.data[m].j; + (*Q).data[k].e = M.data[m].e - N.data[n].e; + m++; + n++; + } + } + } + + k++; + (*Q).tu++; + } + + // MʣԪ + while(m <= M.tu) { + (*Q).data[k] = M.data[m]; + m++; + k++; + (*Q).tu++; + } + + // NʣԪ + while(n <= N.tu) { + (*Q).data[k].i = N.data[n].i; + (*Q).data[k].j = N.data[n].j; + (*Q).data[k].e = -N.data[n].e; + n++; + k++; + (*Q).tu++; + } + + // Ϊrpos鸳ֵ + AssignRpos(Q); + + return OK; +} + +/* + * 㷨5.3 + * + * ˷ + * + * Q = M * N + */ +Status MultSMatrix(RLSMatrix M, RLSMatrix N, RLSMatrix* Q) { + int arow, p, tp; + int brow, q, tq; + int ccol; + int* ctemp; // QиԪֵۼctemp[0]Ԫ + int i; + + // MҪN + if(M.nu != N.mu) { + printf("\n"); + return ERROR; + } + + // ʼQϢ + (*Q).mu = M.mu; + (*Q).nu = N.nu; + (*Q).tu = 0; + + // + if(M.tu * N.tu == 0) { + return OK; + } + + ctemp = (int*) malloc((N.nu + 1) * sizeof(int)); + + // Mÿһ + for(arow = 1; arow <= M.mu; ++arow) { + // ʼQԪֵ + for(i = 0; i <= N.nu; ++i) { + ctemp[i] = 0; + } + + // tpָMǰеһеһԪλ + if(arow < M.mu) { + tp = M.rpos[arow + 1]; + } else { + tp = M.tu + 1; + } + + // MarowезԪ + for(p = M.rpos[arow]; p < tp; ++p) { + // ȡ÷ԪNек + brow = M.data[p].j; + + // tqָNǰеһеһԪλ + if(brow < N.mu) { + tq = N.rpos[brow + 1]; + } else { + tq = N.tu + 1; + } + + // NbrowезԪ + for(q = N.rpos[brow]; q < tq; ++q) { + // ˻ԪQек + ccol = N.data[q].j; + + // ۼӳ˻ + ctemp[ccol] += M.data[p].e * N.data[q].e; + } + } + + /* + * ˣQеarowԪ + */ + + // ij˻ѡȡԪQ + for(ccol = 1; ccol <= (*Q).nu; ++ccol) { + // QеarowccolԪزΪ0 + if(ctemp[ccol]) { + ++(*Q).tu; + + // Ԫ + if((*Q).tu > MAXSIZE) { + return ERROR; + } + + (*Q).data[(*Q).tu].i = arow; + (*Q).data[(*Q).tu].j = ccol; + (*Q).data[(*Q).tu].e = ctemp[ccol]; + } + } + } + + // Ϊrpos鸳ֵ + AssignRpos(Q); + + return OK; +} + +/* + * ת + */ +Status TransposeSMatrix(RLSMatrix M, RLSMatrix* T) { + int p, q, col; + + (*T).mu = M.nu; + (*T).nu = M.mu; + (*T).tu = M.tu; + + if((*T).tu) { + q = 1; // qTзԪļ + + // colMУT + for(col = 1; col <= M.nu; ++col) { + // MвҵjеԪأνתõT + for(p = 1; p <= M.tu; ++p) { + if(M.data[p].j == col) { + (*T).data[q].i = M.data[p].j; // MбΪT + (*T).data[q].j = M.data[p].i; // MбΪT + (*T).data[q].e = M.data[p].e; // ÿԪֵ + + ++q; + } + } + } + } + + // Ϊrpos鸳ֵ + AssignRpos(T); + + return OK; +} + +/* + * ת + */ +Status FastTransposeSMatrix(RLSMatrix M, RLSMatrix* T) { + int col, t, p, q; + int* num; // num[col] ʾMcolзԪĸ + int* copt; // copt[col]ʾMcolеһԪתúеλ + + (*T).mu = M.nu; + (*T).nu = M.mu; + (*T).tu = M.tu; + + // ǰ + if((*T).tu == 0) { + return ERROR; + } + + num = (int*) malloc(M.nu * sizeof(int)); + copt = (int*) malloc(M.nu * sizeof(int)); + + // ʼnum + for(col = 1; col <= M.nu; ++col) { + num[col] = 0; + } + + // ͳMеķԪͳÿзԪĸ + for(t = 1; t <= M.tu; ++t) { + num[M.data[t].j]++; + } + + // 1е1Ԫλתúеλ + copt[1] = 1; + // е1Ԫתþеλ + for(col = 2; col <= M.nu; ++col) { + copt[col] = copt[col - 1] + num[col - 1]; + } + + // ɨMеԪ + for(p = 1; p <= M.tu; ++p) { + col = M.data[p].j; // 㵱ǰԪ + q = copt[col]; // 㵱ǰԪתþеλ + (*T).data[q].i = M.data[p].j; + (*T).data[q].j = M.data[p].i; + (*T).data[q].e = M.data[p].e; + ++copt[col]; // ԪʱתþеλӦһòҪ + } + + // Ϊrpos鸳ֵ + AssignRpos(T); + + return OK; +} + +/* + * + */ +void PrintSMatrix(RLSMatrix M) { + int r, c; + int k = 1; + + for(r = 1; r <= M.mu; ++r) { + for(c = 1; c <= M.nu; ++c) { + if(r == M.data[k].i && c == M.data[k].j) { + printf("%3d ", M.data[k].e); + k++; + } else { + printf("%3d ", 0); + } + } + printf("\n"); + } + + printf("rpos = "); + for(k = 1; k <= M.mu; ++k) { + printf("%d ", M.rpos[k]); + } + printf("\n"); +} + +// Ϊrpos鸳ֵ +static void AssignRpos(RLSMatrix* M) { + int k, m; + + // ʼrpos + for(k = 0; k <= MAXRC; ++k) { + (*M).rpos[k] = 0; + } + + for(k = 1; k <= (*M).tu; k++) { + m = (*M).data[k].i; // ǰԪԪھеλ + + // ¼ÿеһԪԪеλ + if((*M).rpos[m] == 0) { + (*M).rpos[m] = k; // ֻڵǰзԪ¼¼ + } + } + + // ЩûзԪ + for(k = (*M).mu; k >= 1; k--) { + // ǰûзԪ˴ֱȡһеIJ + if((*M).rpos[k] == 0) { + // һ޷ԪΪѾһˣ⴦ + if(k == (*M).mu) { + (*M).rpos[k] = (*M).tu + 1; + } else { + (*M).rpos[k] = (*M).rpos[k + 1]; + } + } + } +} diff --git a/VisualC++/ExerciseBook/05.23/RLSMatrix.h b/VisualC++/ExerciseBook/05.23/RLSMatrix.h new file mode 100644 index 0000000..0550c13 --- /dev/null +++ b/VisualC++/ExerciseBook/05.23/RLSMatrix.h @@ -0,0 +1,107 @@ +/*============================= + * ߼ӵ˳ϡ + * + * 㷨: 5.3 + ==============================*/ + +#ifndef RLSMATRIX_H +#define RLSMATRIX_H + +#include +#include // ṩ malloc ԭ +#include // ṩ strstr ԭ +#include "Status.h" //**01 **// + +/* 궨 */ +#define MAXSIZE 12500 // Ԫֵ +#define MAXRC 20 // Ԫظֵ + +/* ߼ӵϡԪ */ +typedef int ElemType; + +/* ԪͶ壬Ҫ洢Ԫ */ +typedef struct { + int i, j; // ÷Ԫ±± + ElemType e; +} Triple; + +/* ߼ӵϡͶ */ +typedef struct { + Triple data[MAXSIZE + 1]; // ԪԪdata[0]δ + int rpos[MAXRC + 1]; // еһԪԪеλñrpos[0]δ + int mu, nu, tu; // ͷԪ +} RLSMatrix; + + +/* + * ϡM + * + * + *ע + * + * ̲Ĭϴӿ̨ȡݡ + * Ϊ˷ԣÿжֶݣ + * ѡԤļpathжȡݡ + * + * Ҫӿ̨ȡݣpathΪNULLΪմ + * ҪļжȡݣҪpathдļϢ + */ +Status CreateSMatrix(RLSMatrix* M, char* path); + +/* + * ϡ + * + *ע + * ߼ӵ˳ṹ޷١ + */ +Status DestroySMatrix(RLSMatrix* M); + +/* + * + * + * һ¾Tþ˴ӾMаݡ + */ +Status CopySMatrix(RLSMatrix M, RLSMatrix* T); + +/* + * ӷ + * + * Q = M + N + */ +Status AddSMatrix(RLSMatrix M, RLSMatrix N, RLSMatrix* Q); + +/* + * + * + * Q = M - N + */ +Status SubSMatrix(RLSMatrix M, RLSMatrix N, RLSMatrix* Q); + +/* + * 㷨5.3 + * + * ˷ + * + * Q = M * N + */ +Status MultSMatrix(RLSMatrix M, RLSMatrix N, RLSMatrix* Q); + +/* + * ת + */ +Status TransposeSMatrix(RLSMatrix M, RLSMatrix* T); + +/* + * ת + */ +Status FastTransposeSMatrix(RLSMatrix M, RLSMatrix* T); + +/* + * + */ +void PrintSMatrix(RLSMatrix M); + +// Ϊrpos鸳ֵ +static void AssignRpos(RLSMatrix* M); + +#endif diff --git a/VisualC++/ExerciseBook/05.23/TestData_M.txt b/VisualC++/ExerciseBook/05.23/TestData_M.txt new file mode 100644 index 0000000..be25c94 --- /dev/null +++ b/VisualC++/ExerciseBook/05.23/TestData_M.txt @@ -0,0 +1,4 @@ +5 +5 +Ԫ10 +Ԫ飺(1,2,1),(1,4,5),(2,3,-3),(2,5,2),(3,1,2),(3,2,3),(3,3,4),(4,4,2),(5,1,3),(5,2,-1) \ No newline at end of file diff --git a/VisualC++/ExerciseBook/05.24/05.24.c b/VisualC++/ExerciseBook/05.24/05.24.c new file mode 100644 index 0000000..1da6f30 --- /dev/null +++ b/VisualC++/ExerciseBook/05.24/05.24.c @@ -0,0 +1,49 @@ +#include +#include "Status.h" //**01 **// +#include "SMatrix.h" //**ϡ**// + +/* + * ȡеiеjеԪأ洢e + */ +Status Algo_5_24(SMatrix M, int i, int j, int* e); + + +int main(int argc, char* argv[]) { + SMatrix M; + int e; + + printf(" ϡ M ...\n"); + CreateSMatrix(&M, "TestData_M.txt"); + printf("M = \n"); + PrintSMatrix(M); + + Algo_5_24(M, 2, 3, &e); + printf(" %d %d еԪΪ %d\n", 2, 3, e); + + return 0; +} + + +/* + * ȡеiеjеԪأ洢e + */ +Status Algo_5_24(SMatrix M, int i, int j, int* e) { + int s, p; + + if(i < 1 || i > M.mu || j < 1 || j > M.nu) { + return ERROR; + } + + for(p = 1, s = (i - 1) * M.nu + j; M.data[p].seq < s; p++) { + // ѰָԪ + } + + *e = 0; // ĬΪ0 + + // ҵӦ±Ԫ + if(M.data[p].seq == s) { + *e = M.data[p].e; + } + + return OK; +} diff --git a/VisualC++/ExerciseBook/05.24/05.24.vcxproj b/VisualC++/ExerciseBook/05.24/05.24.vcxproj new file mode 100644 index 0000000..004337c --- /dev/null +++ b/VisualC++/ExerciseBook/05.24/05.24.vcxproj @@ -0,0 +1,79 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {7B1D365B-1574-45A1-AECD-1E16A521398B} + My0524 + + + + 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/05.24/05.24.vcxproj.filters b/VisualC++/ExerciseBook/05.24/05.24.vcxproj.filters new file mode 100644 index 0000000..b9b145b --- /dev/null +++ b/VisualC++/ExerciseBook/05.24/05.24.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/05.24/05.24.vcxproj.user b/VisualC++/ExerciseBook/05.24/05.24.vcxproj.user new file mode 100644 index 0000000..ace9a86 --- /dev/null +++ b/VisualC++/ExerciseBook/05.24/05.24.vcxproj.user @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/05.24/SMatrix.c b/VisualC++/ExerciseBook/05.24/SMatrix.c new file mode 100644 index 0000000..729641b --- /dev/null +++ b/VisualC++/ExerciseBook/05.24/SMatrix.c @@ -0,0 +1,44 @@ +/*====================== + * ϡϰ5.24 + =======================*/ + +#include "SMatrix.h" //**ϡ**// + +// ϡM +Status CreateSMatrix(SMatrix* M, char* path) { + FILE* fp; + int k, i, j; + + fp = fopen(path, "r"); + + ReadData(fp, "%d%d%d", &((*M).mu), &((*M).nu), &((*M).tu)); + + // ȡԪ + for(k = 1; k <= (*M).tu; k++) { + ReadData(fp, "%d%d%d", &i, &j, &((*M).data[k].e)); + (*M).data[k].seq = (i - 1) * (*M).nu + j; + } + + fclose(fp); + + return OK; +} + +// ϡM +void PrintSMatrix(SMatrix M) { + int r, c; + int k = 1; + + for(r = 1; r <= M.mu; r++) { + for(c = 1; c <= M.nu; c++) { + if(r == (M.data[k].seq - 1) / M.nu + 1 && c == (M.data[k].seq - 1) % M.nu + 1) { + + printf("%3d ", M.data[k].e); + k++; + } else { + printf(" 0 "); + } + } + printf("\n"); + } +} diff --git a/VisualC++/ExerciseBook/05.24/SMatrix.h b/VisualC++/ExerciseBook/05.24/SMatrix.h new file mode 100644 index 0000000..5df069c --- /dev/null +++ b/VisualC++/ExerciseBook/05.24/SMatrix.h @@ -0,0 +1,32 @@ +/*====================== + * ϡϰ5.24 + =======================*/ + +#ifndef SMATRIX_H +#define SMATRIX_H + +#include +#include "Status.h" //**01 **// + +#define MAXSIZE 100 // ԪֵΪ400 + +/* Ԫ */ +typedef struct { + int seq; // ÷ԪھеţΪ + int e; +} SElem; + +/* ϡ */ +typedef struct { + SElem data[MAXSIZE + 1]; // 洢Ԫأdata[0]δ + int mu, nu, tu; // ͷԪ +} SMatrix; + + +// ϡM +Status CreateSMatrix(SMatrix* M, char* path); + +// ϡM +void PrintSMatrix(SMatrix M); + +#endif diff --git a/VisualC++/ExerciseBook/05.24/TestData_M.txt b/VisualC++/ExerciseBook/05.24/TestData_M.txt new file mode 100644 index 0000000..be25c94 --- /dev/null +++ b/VisualC++/ExerciseBook/05.24/TestData_M.txt @@ -0,0 +1,4 @@ +5 +5 +Ԫ10 +Ԫ飺(1,2,1),(1,4,5),(2,3,-3),(2,5,2),(3,1,2),(3,2,3),(3,3,4),(4,4,2),(5,1,3),(5,2,-1) \ No newline at end of file diff --git a/VisualC++/ExerciseBook/05.25/05.25.c b/VisualC++/ExerciseBook/05.25/05.25.c new file mode 100644 index 0000000..9851d07 --- /dev/null +++ b/VisualC++/ExerciseBook/05.25/05.25.c @@ -0,0 +1,79 @@ +#include +#include "Status.h" //**01 **// +#include "SMatrix.h" //**ϡ**// + +/* + * ϡӷAddSMatrix + */ +Status Algo_5_25(SMatrix P, SMatrix Q, SMatrix* R); + + +int main(int argc, char* argv[]) { + SMatrix M, N, Q; + + printf(" ϡ MN ...\n"); + CreateSMatrix(&M, "TestData_M.txt"); + CreateSMatrix(&N, "TestData_N.txt"); + printf(" M = \n"); + PrintSMatrix(M); + printf(" N = \n"); + PrintSMatrix(N); + + Algo_5_25(M, N, &Q); + printf("Q = M + N = \n"); + PrintSMatrix(Q); + + return 0; +} + + +/* + * ϡӷAddSMatrix + */ +Status Algo_5_25(SMatrix P, SMatrix Q, SMatrix* R) { + int i, j; + int p, q, r; + + if(P.mu != Q.mu || P.nu != Q.nu) { + printf("\n"); + return ERROR; + } + + // ʼRϢ + (*R).mu = P.mu; + (*R).nu = P.nu; + (*R).tu = 0; + memset((*R).V, 0, sizeof((*R).V)); + memset((*R).B, 0, sizeof((*R).B)); + + // ָPQRеV + p = q = r = 0; + + for(i = 0; i < P.mu; ++i) { + for(j = 0; j < P.nu; ++j) { + if(P.B[i][j] == 0 && Q.B[i][j] == 0) { + continue; + } else if(P.B[i][j] == 0 && Q.B[i][j] == 1) { + (*R).V[r++] = Q.V[q++]; + (*R).B[i][j] = 1; + } else if(P.B[i][j] == 1 && Q.B[i][j] == 0) { + (*R).V[r++] = P.V[p++]; + (*R).B[i][j] = 1; + + // PQзԪ + } else { + if((P.V[p] + Q.V[q])!=0) { + (*R).V[r++] = P.V[p] + Q.V[q]; + (*R).B[i][j] = 1; + } + + p++; + q++; + } + } + } + + (*R).tu = r; + + return OK; +} diff --git a/VisualC++/ExerciseBook/05.25/05.25.vcxproj b/VisualC++/ExerciseBook/05.25/05.25.vcxproj new file mode 100644 index 0000000..f842f09 --- /dev/null +++ b/VisualC++/ExerciseBook/05.25/05.25.vcxproj @@ -0,0 +1,80 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {0E85120D-878D-4F74-9D6E-2BC465659A38} + My0525 + + + + 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/05.25/05.25.vcxproj.filters b/VisualC++/ExerciseBook/05.25/05.25.vcxproj.filters new file mode 100644 index 0000000..48837ad --- /dev/null +++ b/VisualC++/ExerciseBook/05.25/05.25.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/05.25/05.25.vcxproj.user b/VisualC++/ExerciseBook/05.25/05.25.vcxproj.user new file mode 100644 index 0000000..ace9a86 --- /dev/null +++ b/VisualC++/ExerciseBook/05.25/05.25.vcxproj.user @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/05.25/SMatrix.c b/VisualC++/ExerciseBook/05.25/SMatrix.c new file mode 100644 index 0000000..aaef587 --- /dev/null +++ b/VisualC++/ExerciseBook/05.25/SMatrix.c @@ -0,0 +1,48 @@ +/*====================== + * ϡϰ5.25 + =======================*/ + +#include "SMatrix.h" //**ϡ**// + +// ϡM +Status CreateSMatrix(SMatrix* M, char* path) { + FILE* fp; + int v, i, j; + + fp = fopen(path, "r"); + + ReadData(fp, "%d%d%d", &((*M).mu), &((*M).nu), &((*M).tu)); + + memset((*M).V, 0, sizeof((*M).V)); + memset((*M).B, 0, sizeof((*M).B)); + + for(v=0; v < (*M).tu; v++) { + // ȡԪϢԪشV + ReadData(fp, "%d%d%d", &i, &j, &((*M).V[v])); + + (*M).B[i-1][j-1] = 1; + } + + fclose(fp); + + return OK; +} + +// ϡM +void PrintSMatrix(SMatrix M) { + int v, i, j; + + v = 0; // Vα + + for(i = 1; i <= M.mu; i++) { + for(j = 1; j <= M.nu; j++) { + if(M.B[i-1][j-1] == 1) { + printf("%3d ", M.V[v++]); + } else { + printf("%3d ", M.B[i-1][j-1]); + } + } + + printf("\n"); + } +} diff --git a/VisualC++/ExerciseBook/05.25/SMatrix.h b/VisualC++/ExerciseBook/05.25/SMatrix.h new file mode 100644 index 0000000..6ad263d --- /dev/null +++ b/VisualC++/ExerciseBook/05.25/SMatrix.h @@ -0,0 +1,32 @@ +/*====================== + * ϡϰ5.25 + =======================*/ + +#ifndef SMATRIX_H +#define SMATRIX_H + +#include +#include +#include +#include "Status.h" //**01 **// + +/* 궨 */ +#define Mu 20 // ֵΪ20 +#define Nu 20 // ֵΪ20 +#define MAXSIZE 400 // ԪֵΪ400 + +/* ϡͶ */ +typedef struct { + int V[MAXSIZE]; // 洢Ԫ + int B[Mu][Nu]; // ǾиλԪǷΪԪ + int mu, nu, tu; // Ԫ +} SMatrix; + + +// ϡM +Status CreateSMatrix(SMatrix* M, char* path); + +// ϡM +void PrintSMatrix(SMatrix M); + +#endif diff --git a/VisualC++/ExerciseBook/05.25/TestData_M.txt b/VisualC++/ExerciseBook/05.25/TestData_M.txt new file mode 100644 index 0000000..be25c94 --- /dev/null +++ b/VisualC++/ExerciseBook/05.25/TestData_M.txt @@ -0,0 +1,4 @@ +5 +5 +Ԫ10 +Ԫ飺(1,2,1),(1,4,5),(2,3,-3),(2,5,2),(3,1,2),(3,2,3),(3,3,4),(4,4,2),(5,1,3),(5,2,-1) \ No newline at end of file diff --git a/VisualC++/ExerciseBook/05.25/TestData_N.txt b/VisualC++/ExerciseBook/05.25/TestData_N.txt new file mode 100644 index 0000000..7c940db --- /dev/null +++ b/VisualC++/ExerciseBook/05.25/TestData_N.txt @@ -0,0 +1,4 @@ +5 +5 +Ԫ8 +Ԫ飺(1,1,-3)(1,3,2)(2,4,-1)(3,2,4)(4,1,6)(4,5,5)(5,1,3)(5,3,2) \ No newline at end of file diff --git a/VisualC++/ExerciseBook/05.26/05.26.c b/VisualC++/ExerciseBook/05.26/05.26.c new file mode 100644 index 0000000..a2146d0 --- /dev/null +++ b/VisualC++/ExerciseBook/05.26/05.26.c @@ -0,0 +1,49 @@ +#include +#include "Status.h" //**01 **// +#include "CrossList.h" //**05 ͹**// + +/* + * Ԫʽʮ + */ +Status Algo_5_26(CrossList M); + + +int main(int argc, char* argv[]) { + CrossList M; + + printf("ʮ M...\n"); + CreateSMatrix(&M, "TestData_M.txt"); + printf("M = \n"); + PrintSMatrix(M); + + printf("Ԫʽ M...\n"); + printf(" ֵ\n"); + Algo_5_26(M); + + return 0; +} + + +/* + * Ԫʽʮ + */ +Status Algo_5_26(CrossList M) { + int i, j; + OLNode* p; + + if(M.tu==0) { + return ERROR; + } + + for(i = 1; i <= M.mu; ++i) { + p = M.rhead[i]; + for(j = 1; j <= M.nu; ++j) { + if(p && p->j == j) { + printf("(%2d %2d %3d)\n", i, j, p->e); + p = p->right; + } + } + } + + return OK; +} diff --git a/VisualC++/ExerciseBook/05.26/05.26.vcxproj b/VisualC++/ExerciseBook/05.26/05.26.vcxproj new file mode 100644 index 0000000..002358f --- /dev/null +++ b/VisualC++/ExerciseBook/05.26/05.26.vcxproj @@ -0,0 +1,79 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {A124BA87-11B9-4329-8572-F4D3EAE759E8} + My0526 + + + + 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/05.26/05.26.vcxproj.filters b/VisualC++/ExerciseBook/05.26/05.26.vcxproj.filters new file mode 100644 index 0000000..4efbb8c --- /dev/null +++ b/VisualC++/ExerciseBook/05.26/05.26.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/05.26/05.26.vcxproj.user b/VisualC++/ExerciseBook/05.26/05.26.vcxproj.user new file mode 100644 index 0000000..ace9a86 --- /dev/null +++ b/VisualC++/ExerciseBook/05.26/05.26.vcxproj.user @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/05.26/CrossList.c b/VisualC++/ExerciseBook/05.26/CrossList.c new file mode 100644 index 0000000..07eb63d --- /dev/null +++ b/VisualC++/ExerciseBook/05.26/CrossList.c @@ -0,0 +1,885 @@ +/*=================== + * ʮϡ + * + * 㷨: 5.4 + ====================*/ + +#include "CrossList.h" //**05 ͹**// + +/* + * 㷨5.4 + * + * ϡM + * + * + *ע + * + * ̲Ĭϴӿ̨ȡݡ + * Ϊ˷ԣÿжֶݣ + * ѡԤļpathжȡݡ + * + * Ҫӿ̨ȡݣpathΪNULLΪմ + * ҪļжȡݣҪpathдļϢ + */ +Status CreateSMatrix(CrossList* M, char* path) { + int i, j, k; + OLNode* p, * q; + FILE* fp; + int readFromConsole; // Ƿӿ̨ȡ + + // ûļ·Ϣӿ̨ȡ + readFromConsole = path == NULL || strcmp(path, "") == 0; + + if(readFromConsole) { + printf(""); + scanf("%d", &((*M).mu)); + printf(""); + scanf("%d", &((*M).nu)); + printf("Ԫظ"); + scanf("%d", &((*M).tu)); + printf("%dԪϢ\n", (*M).tu); + } else { + fp = fopen(path, "r"); + ReadData(fp, "%d%d%d", &((*M).mu), &((*M).nu), &((*M).tu)); + } + + // 0ŵԪã + (*M).rhead = (OLink*) malloc(((*M).mu + 1) * sizeof(OLink)); + if((*M).rhead == NULL) { + exit(OVERFLOW); + } + + // 0ŵԪã + (*M).chead = (OLink*) malloc(((*M).nu + 1) * sizeof(OLink)); + if((*M).chead == NULL) { + exit(OVERFLOW); + } + + // ʼΪNULL + for(k = 0; k <= (*M).mu; ++k) { + (*M).rhead[k] = NULL; + } + + // ʼΪNULL + for(k = 0; k <= (*M).nu; ++k) { + (*M).chead[k] = NULL; + } + + // ¼Ԫ + for(k = 1; k <= (*M).tu; ++k) { + // Ԫ + p = (OLNode*) malloc(sizeof(OLNode)); + if(p == NULL) { + exit(OVERFLOW); + } + + if(readFromConsole) { + printf("%2d飺", k); + scanf("%d%d%d", &i, &j, &(p->e)); + } else { + ReadData(fp, "%d%d%d", &i, &j, &(p->e)); + } + + p->i = i; // к + p->j = j; // к + p->right = p->down = NULL; + + /* + * ʼеIJ + */ + + // лûԪأԪؾλڸԪҲֱ࣬Ӳ + if((*M).rhead[i] == NULL || (*M).rhead[i]->j > j) { + // λбеIJλ + p->right = (*M).rhead[i]; + (*M).rhead[i] = p; + } else { + // ѰҲλõǰһλ + for(q = (*M).rhead[i]; (q->right) && (q->right->j < j); q = q->right) { + } + + if(q->j == p->j || ((q->right) && q->right->j == p->j)) { + printf("λѱռã\n"); + exit(ERROR); + } + + p->right = q->right; + q->right = p; + } + + /* + * ʼеIJ + */ + + // лûԪأԪؾλڸԪ²ֱ࣬Ӳ + if((*M).chead[j] == NULL || (*M).chead[j]->i > i) { + // λбеIJλ + p->down = (*M).chead[j]; + (*M).chead[j] = p; + } else { + // ѰҲλõǰһλ + for(q = (*M).chead[j]; (q->down) && (q->down->i < i); q = q->down) { + } + + if(q->i == p->i || ((q->down) && q->down->i == p->i)) { + printf("λѱռã\n"); + exit(ERROR); + } + + p->down = q->down; + q->down = p; + } + } + + if(!readFromConsole) { + fclose(fp); + } + + return OK; +} + +/* + * ϡ + */ +Status DestroySMatrix(CrossList* M) { + int i; + OLNode* p, * q; + + // ۴ӰлǰУֻҪһȥپͿ + for(i = 1; i <= (*M).mu; ++i) { + p = (*M).rhead[i]; + while(p != NULL) { + q = p; + p = p->right; + free(q); + } + } + + free((*M).rhead); + free((*M).chead); + + (*M).rhead = (*M).chead = NULL; + (*M).mu = (*M).nu = (*M).tu = 0; + + return OK; +} + +/* + * + * + * һ¾Tþ˴ӾMаݡ + */ +Status CopySMatrix(CrossList M, CrossList* T) { + int k; + OLNode* p, * q, * r, * l; + + if(T == NULL) { + return ERROR; + } + + // Ϣ + (*T).mu = M.mu; + (*T).nu = M.nu; + (*T).tu = M.tu; + + // 0ŵԪã + (*T).rhead = (OLink*) malloc(((*T).mu + 1) * sizeof(OLink)); + if((*T).rhead == NULL) { + exit(OVERFLOW); + } + + // 0ŵԪã + (*T).chead = (OLink*) malloc(((*T).nu + 1) * sizeof(OLink)); + if((*T).chead == NULL) { + exit(OVERFLOW); + } + + // ʼΪNULL + for(k = 0; k <= (*T).mu; ++k) { //ʼͷָΪ + (*T).rhead[k] = NULL; + } + + // ʼΪNULL + for(k = 0; k <= (*T).nu; ++k) { + (*T).chead[k] = NULL; + } + + // ɨ裬θƷԪ + for(k = 1; k <= M.mu; ++k) { + q = M.rhead[k]; + + // ǰûԪأֱ + if(q == NULL) { + continue; + } + + r = NULL; + + while(q != NULL) { + // Ԫ + p = (OLNode*) malloc(sizeof(OLNode)); + if(p == NULL) { + exit(OVERFLOW); + } + + // Ϊ㸳ֵ + p->i = q->i; + p->j = q->j; + p->e = q->e; + p->right = p->down = NULL; + + /* + * ʼеIJ + */ + + if(r == NULL) { + (*T).rhead[q->i] = p; + } else { + r->right = p; + } + + // rָǰ²Ľ + r = p; + + /* + * ʼеIJ + */ + + // ѰҲλ + if((*T).chead[q->j] == NULL || (*T).chead[q->j]->i > q->i) { + r->down = (*T).chead[q->j]; + (*T).chead[q->j] = r; + } else { + // ѰҲλõǰһλ + for(l = (*T).chead[q->j]; (l->down) && (l->down->i < q->i); l = l->down) { + } + r->down = l->down; + l->down = r; + } + + q = q->right; + } + } + + return OK; +} + +/* + * ӷ + * + * Q = M + N + */ +Status AddSMatrix(CrossList M, CrossList N, CrossList* Q) { + int i; + OLNode* pm, * pn, * p, * r, * l; + + if(M.mu != N.mu || M.nu != N.nu) { + printf("\n"); + return ERROR; + } + + // ʼQϢ + Q->mu = M.mu; + Q->nu = M.nu; + Q->tu = 0; + + // 0ŵԪã + Q->rhead = (OLink*) malloc((Q->mu + 1) * sizeof(OLink)); + if(!Q->rhead) { + exit(OVERFLOW); + } + + // 0ŵԪã + Q->chead = (OLink*) malloc((Q->nu + 1) * sizeof(OLink)); + if(!Q->chead) { + exit(OVERFLOW); + } + + // ʼΪNULL + for(i = 0; i <= Q->mu; ++i) { + Q->rhead[i] = NULL; + } + + // ʼΪNULL + for(i = 0; i <= Q->nu; ++i) { + Q->chead[i] = NULL; + } + + // ӵһ± + for(i = 1; i <= M.mu; ++i) { + pm = M.rhead[i]; + pn = N.rhead[i]; + + // MNĵǰоδķԪ + while(pm != NULL && pn != NULL) { + // + if(pm->j == pn->j && pm->e + pn->e == 0) { + pm = pm->right; + pn = pn->right; + continue; + } + + // + p = (OLNode*) malloc(sizeof(OLNode)); + if(!p) { + exit(OVERFLOW); + } + + // MеԪ±С + if(pm->j < pn->j) { + p->i = pm->i; + p->j = pm->j; + p->e = pm->e; + pm = pm->right; + + // NеԪ±С + } else if(pm->j > pn->j) { + p->i = pn->i; + p->j = pn->j; + p->e = pn->e; + pn = pn->right; + + // MNеԪ±һ£Ҫмӷ + } else { + p->i = pm->i; + p->j = pm->j; + p->e = pm->e + pn->e; + pm = pm->right; + pn = pn->right; + } + + p->right = p->down = NULL; + + Q->tu++; // QзԪһ + + /* + * ʼеIJ + */ + + if(Q->rhead[p->i] == NULL) { + Q->rhead[p->i] = p; + } else { + r->right = p; + } + + // rָǰ²Ľ + r = p; + + /* + * ʼеIJ + */ + + // ѰҲλ + if(Q->chead[p->j] == NULL || Q->chead[p->j]->i > p->i) { + r->down = Q->chead[p->j]; + Q->chead[p->j] = r; + } else { + // ѰҲλõǰһλ + for(l = Q->chead[p->j]; (l->down) && (l->down->i < p->i); l = l->down) { + } + r->down = l->down; + l->down = r; + } + } + + // MĵǰδķԪ + while(pm != NULL) { + p = (OLNode*) malloc(sizeof(OLNode)); + if(p == NULL) { + exit(OVERFLOW); + } + p->i = pm->i; + p->j = pm->j; + p->e = pm->e; + p->right = p->down = NULL; + + Q->tu++; // QзԪһ + + if(Q->rhead[p->i] == NULL) { + Q->rhead[p->i] = p; + } else { + r->right = p; + } + + // rָǰ²Ľ + r = p; + + // ѰҲλ + if(Q->chead[p->j] == NULL || Q->chead[p->j]->i > p->i) { + r->down = Q->chead[p->j]; + Q->chead[p->j] = r; + } else { + // ѰҲλõǰһλ + for(l = Q->chead[p->j]; (l->down) && (l->down->i < p->i); l = l->down) { + } + r->down = l->down; + l->down = r; + } + + pm = pm->right; + } + + // NĵǰδķԪ + while(pn != NULL) { + p = (OLNode*) malloc(sizeof(OLNode)); + if(p == NULL) { + exit(OVERFLOW); + } + p->i = pn->i; + p->j = pn->j; + p->e = pn->e; + p->right = p->down = NULL; + + Q->tu++; // QзԪһ + + if(Q->rhead[p->i] == NULL) { + Q->rhead[p->i] = p; + } else { + r->right = p; + } + + // rָǰ²Ľ + r = p; + + // ѰҲλ + if(Q->chead[p->j] == NULL || Q->chead[p->j]->i > p->i) { + r->down = Q->chead[p->j]; + Q->chead[p->j] = r; + } else { + // ѰҲλõǰһλ + for(l = Q->chead[p->j]; (l->down) && (l->down->i < p->i); l = l->down) { + } + r->down = l->down; + l->down = r; + } + + pn = pn->right; + } + } + + return OK; +} + +/* + * + * + * Q = M - N + */ +Status SubSMatrix(CrossList M, CrossList N, CrossList* Q) { + int i; + OLNode* pm, * pn, * p, * r, * l; + + if(M.mu != N.mu || M.nu != N.nu) { + printf("\n"); + return ERROR; + } + + // ʼQϢ + Q->mu = M.mu; + Q->nu = M.nu; + Q->tu = 0; + + // 0ŵԪã + Q->rhead = (OLink*) malloc((Q->mu + 1) * sizeof(OLink)); + if(!Q->rhead) { + exit(OVERFLOW); + } + + // 0ŵԪã + Q->chead = (OLink*) malloc((Q->nu + 1) * sizeof(OLink)); + if(!Q->chead) { + exit(OVERFLOW); + } + + // ʼΪNULL + for(i = 0; i <= Q->mu; ++i) { + Q->rhead[i] = NULL; + } + + // ʼΪNULL + for(i = 0; i <= Q->nu; ++i) { + Q->chead[i] = NULL; + } + + // ӵһ± + for(i = 1; i <= M.mu; ++i) { + pm = M.rhead[i]; + pn = N.rhead[i]; + + // MNĵǰоδķԪ + while(pm != NULL && pn != NULL) { + // + if(pm->j == pn->j && pm->e - pn->e == 0) { + pm = pm->right; + pn = pn->right; + continue; + } + + // + p = (OLNode*) malloc(sizeof(OLNode)); + if(!p) { + exit(OVERFLOW); + } + + // MеԪ±С + if(pm->j < pn->j) { + p->i = pm->i; + p->j = pm->j; + p->e = pm->e; + pm = pm->right; + + // NеԪ±С + } else if(pm->j > pn->j) { + p->i = pn->i; + p->j = pn->j; + p->e = -pn->e; // Ӹ + pn = pn->right; + + // MNеԪ±һ£Ҫм + } else { + p->i = pm->i; + p->j = pm->j; + p->e = pm->e - pn->e; + pm = pm->right; + pn = pn->right; + } + + p->right = p->down = NULL; + + Q->tu++; // QзԪһ + + /* + * ʼеIJ + */ + + if(Q->rhead[p->i] == NULL) { + Q->rhead[p->i] = p; + } else { + r->right = p; + } + + // rָǰ²Ľ + r = p; + + /* + * ʼеIJ + */ + + // ѰҲλ + if(Q->chead[p->j] == NULL || Q->chead[p->j]->i > p->i) { + r->down = Q->chead[p->j]; + Q->chead[p->j] = r; + } else { + //ѰҲλõǰһλ + for(l = Q->chead[p->j]; (l->down) && (l->down->i < p->i); l = l->down) { + } + r->down = l->down; + l->down = r; + } + } + + // MĵǰδķԪ + while(pm != NULL) { + p = (OLNode*) malloc(sizeof(OLNode)); + if(!p) { + exit(OVERFLOW); + } + p->i = pm->i; + p->j = pm->j; + p->e = pm->e; + p->right = p->down = NULL; + + Q->tu++; // QзԪһ + + if(Q->rhead[p->i] == NULL) { + Q->rhead[p->i] = p; + } else { + r->right = p; + } + + // rָǰ²Ľ + r = p; + + // ѰҲλ + if(Q->chead[p->j] == NULL || Q->chead[p->j]->i > p->i) { + r->down = Q->chead[p->j]; + Q->chead[p->j] = r; + } else { + // ѰҲλõǰһλ + for(l = Q->chead[p->j]; (l->down) && (l->down->i < p->i); l = l->down) { + } + r->down = l->down; + l->down = r; + } + + pm = pm->right; + } + + // NĵǰδķԪ + while(pn != NULL) { + p = (OLNode*) malloc(sizeof(OLNode)); + if(!p) { + exit(OVERFLOW); + } + p->i = pn->i; + p->j = pn->j; + p->e = -pn->e; // Ӹ + p->right = p->down = NULL; + + Q->tu++; // QзԪһ + + if(Q->rhead[p->i] == NULL) { + Q->rhead[p->i] = p; + } else { + r->right = p; + } + + // rָǰ²Ľ + r = p; + + // ѰҲλ + if(Q->chead[p->j] == NULL || Q->chead[p->j]->i > p->i) { + r->down = Q->chead[p->j]; + Q->chead[p->j] = r; + } else { + // ѰҲλõǰһλ + for(l = Q->chead[p->j]; (l->down) && (l->down->i < p->i); l = l->down) { + } + r->down = l->down; + l->down = r; + } + + pn = pn->right; + } + } + + return OK; +} + +/* + * ˷ + * + * Q = M * N + */ +Status MultSMatrix(CrossList M, CrossList N, CrossList* Q) { + int m_row, n_col, i; + ElemType e; + OLNode* pm, * pn, * p, * r, * l; + + // MҪN + if(M.nu != N.mu) { + printf("\n"); + return ERROR; + } + + // ʼQϢ + Q->mu = M.mu; + Q->nu = N.nu; + Q->tu = 0; + + // 0ŵԪã + Q->rhead = (OLink*) malloc((Q->mu + 1) * sizeof(OLink)); + if(!Q->rhead) { + exit(OVERFLOW); + } + + // 0ŵԪã + Q->chead = (OLink*) malloc((Q->nu + 1) * sizeof(OLink)); + if(!Q->chead) { + exit(OVERFLOW); + } + + // ʼΪNULL + for(i = 0; i <= Q->mu; ++i) { + Q->rhead[i] = NULL; + } + + // ʼΪNULL + for(i = 0; i <= Q->nu; ++i) { + Q->chead[i] = NULL; + } + + // QǷ + if(M.tu * N.tu) { + for(m_row = 1; m_row <= M.mu; ++m_row) { + for(n_col = 1; n_col <= N.nu; ++n_col) { + pm = M.rhead[m_row]; + pn = N.chead[n_col]; + + e = 0; + + // MN + while(pm && pn) { + if(pm->j < pn->i) { + pm = pm->right; + } else if(pm->j > pn->i) { + pn = pn->down; + } else { + e += pm->e * pn->e; + pm = pm->right; + pn = pn->down; + } + } + + if(e == 0) { + continue; + } + + p = (OLNode*) malloc(sizeof(OLNode)); + if(!p) { + exit(OVERFLOW); + } + + // Ϊ㸳ֵ + p->i = M.rhead[m_row]->i; + p->j = N.chead[n_col]->j; + p->e = e; + p->right = p->down = NULL; + + Q->tu++; // QзԪһ + + if(Q->rhead[p->i] == NULL) { + Q->rhead[p->i] = p; + } else { + r->right = p; + } + + // rָǰ²Ľ + r = p; + + // ѰҲλ + if(Q->chead[p->j] == NULL || Q->chead[p->j]->i > p->i) { + r->down = Q->chead[p->j]; + Q->chead[p->j] = r; + } else { + // ѰҲλõǰһλ + for(l = Q->chead[p->j]; (l->down) && (l->down->i < p->i); l = l->down) { + } + + r->down = l->down; + l->down = r; + } + } + } + } + + return OK; +} + +/* + * ת + */ +Status TransposeSMatrix(CrossList M, CrossList* T) { + int i; + OLNode* p, * q, * r, * l; + + // ʼQϢ + (*T).mu = M.nu; + (*T).nu = M.mu; + (*T).tu = M.tu; + + // 0ŵԪã + (*T).rhead = (OLink*) malloc(((*T).mu + 1) * sizeof(OLink)); + if(!(*T).rhead) { + exit(OVERFLOW); + } + + // 0ŵԪã + (*T).chead = (OLink*) malloc(((*T).nu + 1) * sizeof(OLink)); + if(!(*T).chead) { + exit(OVERFLOW); + } + + // ʼΪNULL + for(i = 0; i <= (*T).mu; ++i) { + (*T).rhead[i] = NULL; + } + + // ʼΪNULL + for(i = 0; i <= (*T).nu; ++i) { + (*T).chead[i] = NULL; + } + + // + if(!(*T).tu) { + return OK; + } + + // ɨ + for(i = 1; i <= M.nu; ++i) { + q = M.chead[i]; + + // ǰûԪأֱ + if(q == NULL) { + continue; + } + + while(q != NULL) { + // Ԫ + p = (OLNode*) malloc(sizeof(OLNode)); + if(!p) { + exit(OVERFLOW); + } + + // Ϊ㸳ֵбУб + p->i = q->j; + p->j = q->i; + p->e = q->e; + p->right = p->down = NULL; + + /* + * ʼеIJ + */ + + if((*T).rhead[p->i] == NULL) { + (*T).rhead[p->i] = p; + } else { + r->right = p; + } + + // rָǰ²Ľ + r = p; + + /* + * ʼеIJ + */ + + // ѰҲλ + if((*T).chead[p->j] == NULL || (*T).chead[p->j]->i > p->i) { + r->down = (*T).chead[p->j]; + (*T).chead[p->j] = r; + } else { + // ѰҲλõǰһλ + for(l = (*T).chead[p->j]; (l->down) && (l->down->i < p->i); l = l->down) { + } + r->down = l->down; + l->down = r; + } + + q = q->down; + } + } + + return OK; +} + +/* + * + */ +void PrintSMatrix(CrossList M) { + int i, j; + OLNode* p; + + for(i = 1; i <= M.mu; ++i) { + p = M.rhead[i]; + for(j = 1; j <= M.nu; ++j) { + if(p && p->j == j) { + printf("%3d ", p->e); + p = p->right; + } else { + printf("%3d ", 0); + } + } + printf("\n"); + } +} diff --git a/VisualC++/ExerciseBook/05.26/CrossList.h b/VisualC++/ExerciseBook/05.26/CrossList.h new file mode 100644 index 0000000..c774280 --- /dev/null +++ b/VisualC++/ExerciseBook/05.26/CrossList.h @@ -0,0 +1,94 @@ +/*=================== + * ʮϡ + * + * 㷨: 5.4 + ====================*/ + +#ifndef CROSSLIST_H +#define CROSSLIST_H + +#include +#include // ṩmallocreallocfreeexitԭ +#include // ṩ strstr ԭ +#include "Status.h" //**01 **// + +/* ʮԪ */ +typedef int ElemType; + +/* ԪͶ */ +typedef struct OLNode { + int i, j; // ÷Ԫ±± + ElemType e; + struct OLNode* right; // ÷Ԫڵбĺ + struct OLNode* down; // ÷Ԫڵбĺ +} OLNode, * OLink; + +/* ʮͶ */ +typedef struct { + OLink* rhead; // ͷָ + OLink* chead; // ͷָ + int mu, nu, tu; // ͷԪ +} CrossList; + + +/* + * 㷨5.4 + * + * ϡM + * + * + *ע + * + * ̲Ĭϴӿ̨ȡݡ + * Ϊ˷ԣÿжֶݣ + * ѡԤļpathжȡݡ + * + * Ҫӿ̨ȡݣpathΪNULLΪմ + * ҪļжȡݣҪpathдļϢ + */ +Status CreateSMatrix(CrossList* M, char* path); + +/* + * ϡ + */ +Status DestroySMatrix(CrossList* M); + +/* + * + * + * һ¾Tþ˴ӾMаݡ + */ +Status CopySMatrix(CrossList M, CrossList* T); + +/* + * ӷ + * + * Q = M + N + */ +Status AddSMatrix(CrossList M, CrossList N, CrossList* Q); + +/* + * + * + * Q = M - N + */ +Status SubSMatrix(CrossList M, CrossList N, CrossList* Q); + +/* + * ˷ + * + * Q = M * N + */ +Status MultSMatrix(CrossList M, CrossList N, CrossList* Q); + +/* + * ת + */ +Status TransposeSMatrix(CrossList M, CrossList* T); + +/* + * + */ +void PrintSMatrix(CrossList M); + +#endif diff --git a/VisualC++/ExerciseBook/05.26/TestData_M.txt b/VisualC++/ExerciseBook/05.26/TestData_M.txt new file mode 100644 index 0000000..be25c94 --- /dev/null +++ b/VisualC++/ExerciseBook/05.26/TestData_M.txt @@ -0,0 +1,4 @@ +5 +5 +Ԫ10 +Ԫ飺(1,2,1),(1,4,5),(2,3,-3),(2,5,2),(3,1,2),(3,2,3),(3,3,4),(4,4,2),(5,1,3),(5,2,-1) \ No newline at end of file diff --git a/VisualC++/ExerciseBook/05.27/05.27.c b/VisualC++/ExerciseBook/05.27/05.27.c new file mode 100644 index 0000000..c3015d0 --- /dev/null +++ b/VisualC++/ExerciseBook/05.27/05.27.c @@ -0,0 +1,41 @@ +#include +#include "Status.h" //**01 **// +#include "CrossList.h" //**05 ͹**// + +/* + * ϡӷAddSMatrix + * + *ע + * úCrossListļж + */ +Status Algo_5_27(CrossList M, CrossList N, CrossList* Q); + + +int main(int argc, char* argv[]) { + CrossList M, N, Q; + + printf(" ϡ MN ...\n"); + CreateSMatrix(&M, "TestData_M.txt"); + CreateSMatrix(&N, "TestData_N.txt"); + printf(" M = \n"); + PrintSMatrix(M); + printf(" N = \n"); + PrintSMatrix(N); + + Algo_5_27(M, N, &Q); + printf(" Q = M + N = \n"); + PrintSMatrix(Q); + + return 0; +} + + +/* + * ϡӷAddSMatrix + * + *ע + * úCrossListļж + */ +Status Algo_5_27(CrossList M, CrossList N, CrossList* Q) { + return AddSMatrix(M, N, Q); +} diff --git a/VisualC++/ExerciseBook/05.27/05.27.vcxproj b/VisualC++/ExerciseBook/05.27/05.27.vcxproj new file mode 100644 index 0000000..9e5bc4d --- /dev/null +++ b/VisualC++/ExerciseBook/05.27/05.27.vcxproj @@ -0,0 +1,80 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {EF60CDEA-A37D-4A91-ABB9-95D41D970927} + My0527 + + + + 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/05.27/05.27.vcxproj.filters b/VisualC++/ExerciseBook/05.27/05.27.vcxproj.filters new file mode 100644 index 0000000..4cace26 --- /dev/null +++ b/VisualC++/ExerciseBook/05.27/05.27.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/05.27/05.27.vcxproj.user b/VisualC++/ExerciseBook/05.27/05.27.vcxproj.user new file mode 100644 index 0000000..ace9a86 --- /dev/null +++ b/VisualC++/ExerciseBook/05.27/05.27.vcxproj.user @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/05.27/CrossList.c b/VisualC++/ExerciseBook/05.27/CrossList.c new file mode 100644 index 0000000..07eb63d --- /dev/null +++ b/VisualC++/ExerciseBook/05.27/CrossList.c @@ -0,0 +1,885 @@ +/*=================== + * ʮϡ + * + * 㷨: 5.4 + ====================*/ + +#include "CrossList.h" //**05 ͹**// + +/* + * 㷨5.4 + * + * ϡM + * + * + *ע + * + * ̲Ĭϴӿ̨ȡݡ + * Ϊ˷ԣÿжֶݣ + * ѡԤļpathжȡݡ + * + * Ҫӿ̨ȡݣpathΪNULLΪմ + * ҪļжȡݣҪpathдļϢ + */ +Status CreateSMatrix(CrossList* M, char* path) { + int i, j, k; + OLNode* p, * q; + FILE* fp; + int readFromConsole; // Ƿӿ̨ȡ + + // ûļ·Ϣӿ̨ȡ + readFromConsole = path == NULL || strcmp(path, "") == 0; + + if(readFromConsole) { + printf(""); + scanf("%d", &((*M).mu)); + printf(""); + scanf("%d", &((*M).nu)); + printf("Ԫظ"); + scanf("%d", &((*M).tu)); + printf("%dԪϢ\n", (*M).tu); + } else { + fp = fopen(path, "r"); + ReadData(fp, "%d%d%d", &((*M).mu), &((*M).nu), &((*M).tu)); + } + + // 0ŵԪã + (*M).rhead = (OLink*) malloc(((*M).mu + 1) * sizeof(OLink)); + if((*M).rhead == NULL) { + exit(OVERFLOW); + } + + // 0ŵԪã + (*M).chead = (OLink*) malloc(((*M).nu + 1) * sizeof(OLink)); + if((*M).chead == NULL) { + exit(OVERFLOW); + } + + // ʼΪNULL + for(k = 0; k <= (*M).mu; ++k) { + (*M).rhead[k] = NULL; + } + + // ʼΪNULL + for(k = 0; k <= (*M).nu; ++k) { + (*M).chead[k] = NULL; + } + + // ¼Ԫ + for(k = 1; k <= (*M).tu; ++k) { + // Ԫ + p = (OLNode*) malloc(sizeof(OLNode)); + if(p == NULL) { + exit(OVERFLOW); + } + + if(readFromConsole) { + printf("%2d飺", k); + scanf("%d%d%d", &i, &j, &(p->e)); + } else { + ReadData(fp, "%d%d%d", &i, &j, &(p->e)); + } + + p->i = i; // к + p->j = j; // к + p->right = p->down = NULL; + + /* + * ʼеIJ + */ + + // лûԪأԪؾλڸԪҲֱ࣬Ӳ + if((*M).rhead[i] == NULL || (*M).rhead[i]->j > j) { + // λбеIJλ + p->right = (*M).rhead[i]; + (*M).rhead[i] = p; + } else { + // ѰҲλõǰһλ + for(q = (*M).rhead[i]; (q->right) && (q->right->j < j); q = q->right) { + } + + if(q->j == p->j || ((q->right) && q->right->j == p->j)) { + printf("λѱռã\n"); + exit(ERROR); + } + + p->right = q->right; + q->right = p; + } + + /* + * ʼеIJ + */ + + // лûԪأԪؾλڸԪ²ֱ࣬Ӳ + if((*M).chead[j] == NULL || (*M).chead[j]->i > i) { + // λбеIJλ + p->down = (*M).chead[j]; + (*M).chead[j] = p; + } else { + // ѰҲλõǰһλ + for(q = (*M).chead[j]; (q->down) && (q->down->i < i); q = q->down) { + } + + if(q->i == p->i || ((q->down) && q->down->i == p->i)) { + printf("λѱռã\n"); + exit(ERROR); + } + + p->down = q->down; + q->down = p; + } + } + + if(!readFromConsole) { + fclose(fp); + } + + return OK; +} + +/* + * ϡ + */ +Status DestroySMatrix(CrossList* M) { + int i; + OLNode* p, * q; + + // ۴ӰлǰУֻҪһȥپͿ + for(i = 1; i <= (*M).mu; ++i) { + p = (*M).rhead[i]; + while(p != NULL) { + q = p; + p = p->right; + free(q); + } + } + + free((*M).rhead); + free((*M).chead); + + (*M).rhead = (*M).chead = NULL; + (*M).mu = (*M).nu = (*M).tu = 0; + + return OK; +} + +/* + * + * + * һ¾Tþ˴ӾMаݡ + */ +Status CopySMatrix(CrossList M, CrossList* T) { + int k; + OLNode* p, * q, * r, * l; + + if(T == NULL) { + return ERROR; + } + + // Ϣ + (*T).mu = M.mu; + (*T).nu = M.nu; + (*T).tu = M.tu; + + // 0ŵԪã + (*T).rhead = (OLink*) malloc(((*T).mu + 1) * sizeof(OLink)); + if((*T).rhead == NULL) { + exit(OVERFLOW); + } + + // 0ŵԪã + (*T).chead = (OLink*) malloc(((*T).nu + 1) * sizeof(OLink)); + if((*T).chead == NULL) { + exit(OVERFLOW); + } + + // ʼΪNULL + for(k = 0; k <= (*T).mu; ++k) { //ʼͷָΪ + (*T).rhead[k] = NULL; + } + + // ʼΪNULL + for(k = 0; k <= (*T).nu; ++k) { + (*T).chead[k] = NULL; + } + + // ɨ裬θƷԪ + for(k = 1; k <= M.mu; ++k) { + q = M.rhead[k]; + + // ǰûԪأֱ + if(q == NULL) { + continue; + } + + r = NULL; + + while(q != NULL) { + // Ԫ + p = (OLNode*) malloc(sizeof(OLNode)); + if(p == NULL) { + exit(OVERFLOW); + } + + // Ϊ㸳ֵ + p->i = q->i; + p->j = q->j; + p->e = q->e; + p->right = p->down = NULL; + + /* + * ʼеIJ + */ + + if(r == NULL) { + (*T).rhead[q->i] = p; + } else { + r->right = p; + } + + // rָǰ²Ľ + r = p; + + /* + * ʼеIJ + */ + + // ѰҲλ + if((*T).chead[q->j] == NULL || (*T).chead[q->j]->i > q->i) { + r->down = (*T).chead[q->j]; + (*T).chead[q->j] = r; + } else { + // ѰҲλõǰһλ + for(l = (*T).chead[q->j]; (l->down) && (l->down->i < q->i); l = l->down) { + } + r->down = l->down; + l->down = r; + } + + q = q->right; + } + } + + return OK; +} + +/* + * ӷ + * + * Q = M + N + */ +Status AddSMatrix(CrossList M, CrossList N, CrossList* Q) { + int i; + OLNode* pm, * pn, * p, * r, * l; + + if(M.mu != N.mu || M.nu != N.nu) { + printf("\n"); + return ERROR; + } + + // ʼQϢ + Q->mu = M.mu; + Q->nu = M.nu; + Q->tu = 0; + + // 0ŵԪã + Q->rhead = (OLink*) malloc((Q->mu + 1) * sizeof(OLink)); + if(!Q->rhead) { + exit(OVERFLOW); + } + + // 0ŵԪã + Q->chead = (OLink*) malloc((Q->nu + 1) * sizeof(OLink)); + if(!Q->chead) { + exit(OVERFLOW); + } + + // ʼΪNULL + for(i = 0; i <= Q->mu; ++i) { + Q->rhead[i] = NULL; + } + + // ʼΪNULL + for(i = 0; i <= Q->nu; ++i) { + Q->chead[i] = NULL; + } + + // ӵһ± + for(i = 1; i <= M.mu; ++i) { + pm = M.rhead[i]; + pn = N.rhead[i]; + + // MNĵǰоδķԪ + while(pm != NULL && pn != NULL) { + // + if(pm->j == pn->j && pm->e + pn->e == 0) { + pm = pm->right; + pn = pn->right; + continue; + } + + // + p = (OLNode*) malloc(sizeof(OLNode)); + if(!p) { + exit(OVERFLOW); + } + + // MеԪ±С + if(pm->j < pn->j) { + p->i = pm->i; + p->j = pm->j; + p->e = pm->e; + pm = pm->right; + + // NеԪ±С + } else if(pm->j > pn->j) { + p->i = pn->i; + p->j = pn->j; + p->e = pn->e; + pn = pn->right; + + // MNеԪ±һ£Ҫмӷ + } else { + p->i = pm->i; + p->j = pm->j; + p->e = pm->e + pn->e; + pm = pm->right; + pn = pn->right; + } + + p->right = p->down = NULL; + + Q->tu++; // QзԪһ + + /* + * ʼеIJ + */ + + if(Q->rhead[p->i] == NULL) { + Q->rhead[p->i] = p; + } else { + r->right = p; + } + + // rָǰ²Ľ + r = p; + + /* + * ʼеIJ + */ + + // ѰҲλ + if(Q->chead[p->j] == NULL || Q->chead[p->j]->i > p->i) { + r->down = Q->chead[p->j]; + Q->chead[p->j] = r; + } else { + // ѰҲλõǰһλ + for(l = Q->chead[p->j]; (l->down) && (l->down->i < p->i); l = l->down) { + } + r->down = l->down; + l->down = r; + } + } + + // MĵǰδķԪ + while(pm != NULL) { + p = (OLNode*) malloc(sizeof(OLNode)); + if(p == NULL) { + exit(OVERFLOW); + } + p->i = pm->i; + p->j = pm->j; + p->e = pm->e; + p->right = p->down = NULL; + + Q->tu++; // QзԪһ + + if(Q->rhead[p->i] == NULL) { + Q->rhead[p->i] = p; + } else { + r->right = p; + } + + // rָǰ²Ľ + r = p; + + // ѰҲλ + if(Q->chead[p->j] == NULL || Q->chead[p->j]->i > p->i) { + r->down = Q->chead[p->j]; + Q->chead[p->j] = r; + } else { + // ѰҲλõǰһλ + for(l = Q->chead[p->j]; (l->down) && (l->down->i < p->i); l = l->down) { + } + r->down = l->down; + l->down = r; + } + + pm = pm->right; + } + + // NĵǰδķԪ + while(pn != NULL) { + p = (OLNode*) malloc(sizeof(OLNode)); + if(p == NULL) { + exit(OVERFLOW); + } + p->i = pn->i; + p->j = pn->j; + p->e = pn->e; + p->right = p->down = NULL; + + Q->tu++; // QзԪһ + + if(Q->rhead[p->i] == NULL) { + Q->rhead[p->i] = p; + } else { + r->right = p; + } + + // rָǰ²Ľ + r = p; + + // ѰҲλ + if(Q->chead[p->j] == NULL || Q->chead[p->j]->i > p->i) { + r->down = Q->chead[p->j]; + Q->chead[p->j] = r; + } else { + // ѰҲλõǰһλ + for(l = Q->chead[p->j]; (l->down) && (l->down->i < p->i); l = l->down) { + } + r->down = l->down; + l->down = r; + } + + pn = pn->right; + } + } + + return OK; +} + +/* + * + * + * Q = M - N + */ +Status SubSMatrix(CrossList M, CrossList N, CrossList* Q) { + int i; + OLNode* pm, * pn, * p, * r, * l; + + if(M.mu != N.mu || M.nu != N.nu) { + printf("\n"); + return ERROR; + } + + // ʼQϢ + Q->mu = M.mu; + Q->nu = M.nu; + Q->tu = 0; + + // 0ŵԪã + Q->rhead = (OLink*) malloc((Q->mu + 1) * sizeof(OLink)); + if(!Q->rhead) { + exit(OVERFLOW); + } + + // 0ŵԪã + Q->chead = (OLink*) malloc((Q->nu + 1) * sizeof(OLink)); + if(!Q->chead) { + exit(OVERFLOW); + } + + // ʼΪNULL + for(i = 0; i <= Q->mu; ++i) { + Q->rhead[i] = NULL; + } + + // ʼΪNULL + for(i = 0; i <= Q->nu; ++i) { + Q->chead[i] = NULL; + } + + // ӵһ± + for(i = 1; i <= M.mu; ++i) { + pm = M.rhead[i]; + pn = N.rhead[i]; + + // MNĵǰоδķԪ + while(pm != NULL && pn != NULL) { + // + if(pm->j == pn->j && pm->e - pn->e == 0) { + pm = pm->right; + pn = pn->right; + continue; + } + + // + p = (OLNode*) malloc(sizeof(OLNode)); + if(!p) { + exit(OVERFLOW); + } + + // MеԪ±С + if(pm->j < pn->j) { + p->i = pm->i; + p->j = pm->j; + p->e = pm->e; + pm = pm->right; + + // NеԪ±С + } else if(pm->j > pn->j) { + p->i = pn->i; + p->j = pn->j; + p->e = -pn->e; // Ӹ + pn = pn->right; + + // MNеԪ±һ£Ҫм + } else { + p->i = pm->i; + p->j = pm->j; + p->e = pm->e - pn->e; + pm = pm->right; + pn = pn->right; + } + + p->right = p->down = NULL; + + Q->tu++; // QзԪһ + + /* + * ʼеIJ + */ + + if(Q->rhead[p->i] == NULL) { + Q->rhead[p->i] = p; + } else { + r->right = p; + } + + // rָǰ²Ľ + r = p; + + /* + * ʼеIJ + */ + + // ѰҲλ + if(Q->chead[p->j] == NULL || Q->chead[p->j]->i > p->i) { + r->down = Q->chead[p->j]; + Q->chead[p->j] = r; + } else { + //ѰҲλõǰһλ + for(l = Q->chead[p->j]; (l->down) && (l->down->i < p->i); l = l->down) { + } + r->down = l->down; + l->down = r; + } + } + + // MĵǰδķԪ + while(pm != NULL) { + p = (OLNode*) malloc(sizeof(OLNode)); + if(!p) { + exit(OVERFLOW); + } + p->i = pm->i; + p->j = pm->j; + p->e = pm->e; + p->right = p->down = NULL; + + Q->tu++; // QзԪһ + + if(Q->rhead[p->i] == NULL) { + Q->rhead[p->i] = p; + } else { + r->right = p; + } + + // rָǰ²Ľ + r = p; + + // ѰҲλ + if(Q->chead[p->j] == NULL || Q->chead[p->j]->i > p->i) { + r->down = Q->chead[p->j]; + Q->chead[p->j] = r; + } else { + // ѰҲλõǰһλ + for(l = Q->chead[p->j]; (l->down) && (l->down->i < p->i); l = l->down) { + } + r->down = l->down; + l->down = r; + } + + pm = pm->right; + } + + // NĵǰδķԪ + while(pn != NULL) { + p = (OLNode*) malloc(sizeof(OLNode)); + if(!p) { + exit(OVERFLOW); + } + p->i = pn->i; + p->j = pn->j; + p->e = -pn->e; // Ӹ + p->right = p->down = NULL; + + Q->tu++; // QзԪһ + + if(Q->rhead[p->i] == NULL) { + Q->rhead[p->i] = p; + } else { + r->right = p; + } + + // rָǰ²Ľ + r = p; + + // ѰҲλ + if(Q->chead[p->j] == NULL || Q->chead[p->j]->i > p->i) { + r->down = Q->chead[p->j]; + Q->chead[p->j] = r; + } else { + // ѰҲλõǰһλ + for(l = Q->chead[p->j]; (l->down) && (l->down->i < p->i); l = l->down) { + } + r->down = l->down; + l->down = r; + } + + pn = pn->right; + } + } + + return OK; +} + +/* + * ˷ + * + * Q = M * N + */ +Status MultSMatrix(CrossList M, CrossList N, CrossList* Q) { + int m_row, n_col, i; + ElemType e; + OLNode* pm, * pn, * p, * r, * l; + + // MҪN + if(M.nu != N.mu) { + printf("\n"); + return ERROR; + } + + // ʼQϢ + Q->mu = M.mu; + Q->nu = N.nu; + Q->tu = 0; + + // 0ŵԪã + Q->rhead = (OLink*) malloc((Q->mu + 1) * sizeof(OLink)); + if(!Q->rhead) { + exit(OVERFLOW); + } + + // 0ŵԪã + Q->chead = (OLink*) malloc((Q->nu + 1) * sizeof(OLink)); + if(!Q->chead) { + exit(OVERFLOW); + } + + // ʼΪNULL + for(i = 0; i <= Q->mu; ++i) { + Q->rhead[i] = NULL; + } + + // ʼΪNULL + for(i = 0; i <= Q->nu; ++i) { + Q->chead[i] = NULL; + } + + // QǷ + if(M.tu * N.tu) { + for(m_row = 1; m_row <= M.mu; ++m_row) { + for(n_col = 1; n_col <= N.nu; ++n_col) { + pm = M.rhead[m_row]; + pn = N.chead[n_col]; + + e = 0; + + // MN + while(pm && pn) { + if(pm->j < pn->i) { + pm = pm->right; + } else if(pm->j > pn->i) { + pn = pn->down; + } else { + e += pm->e * pn->e; + pm = pm->right; + pn = pn->down; + } + } + + if(e == 0) { + continue; + } + + p = (OLNode*) malloc(sizeof(OLNode)); + if(!p) { + exit(OVERFLOW); + } + + // Ϊ㸳ֵ + p->i = M.rhead[m_row]->i; + p->j = N.chead[n_col]->j; + p->e = e; + p->right = p->down = NULL; + + Q->tu++; // QзԪһ + + if(Q->rhead[p->i] == NULL) { + Q->rhead[p->i] = p; + } else { + r->right = p; + } + + // rָǰ²Ľ + r = p; + + // ѰҲλ + if(Q->chead[p->j] == NULL || Q->chead[p->j]->i > p->i) { + r->down = Q->chead[p->j]; + Q->chead[p->j] = r; + } else { + // ѰҲλõǰһλ + for(l = Q->chead[p->j]; (l->down) && (l->down->i < p->i); l = l->down) { + } + + r->down = l->down; + l->down = r; + } + } + } + } + + return OK; +} + +/* + * ת + */ +Status TransposeSMatrix(CrossList M, CrossList* T) { + int i; + OLNode* p, * q, * r, * l; + + // ʼQϢ + (*T).mu = M.nu; + (*T).nu = M.mu; + (*T).tu = M.tu; + + // 0ŵԪã + (*T).rhead = (OLink*) malloc(((*T).mu + 1) * sizeof(OLink)); + if(!(*T).rhead) { + exit(OVERFLOW); + } + + // 0ŵԪã + (*T).chead = (OLink*) malloc(((*T).nu + 1) * sizeof(OLink)); + if(!(*T).chead) { + exit(OVERFLOW); + } + + // ʼΪNULL + for(i = 0; i <= (*T).mu; ++i) { + (*T).rhead[i] = NULL; + } + + // ʼΪNULL + for(i = 0; i <= (*T).nu; ++i) { + (*T).chead[i] = NULL; + } + + // + if(!(*T).tu) { + return OK; + } + + // ɨ + for(i = 1; i <= M.nu; ++i) { + q = M.chead[i]; + + // ǰûԪأֱ + if(q == NULL) { + continue; + } + + while(q != NULL) { + // Ԫ + p = (OLNode*) malloc(sizeof(OLNode)); + if(!p) { + exit(OVERFLOW); + } + + // Ϊ㸳ֵбУб + p->i = q->j; + p->j = q->i; + p->e = q->e; + p->right = p->down = NULL; + + /* + * ʼеIJ + */ + + if((*T).rhead[p->i] == NULL) { + (*T).rhead[p->i] = p; + } else { + r->right = p; + } + + // rָǰ²Ľ + r = p; + + /* + * ʼеIJ + */ + + // ѰҲλ + if((*T).chead[p->j] == NULL || (*T).chead[p->j]->i > p->i) { + r->down = (*T).chead[p->j]; + (*T).chead[p->j] = r; + } else { + // ѰҲλõǰһλ + for(l = (*T).chead[p->j]; (l->down) && (l->down->i < p->i); l = l->down) { + } + r->down = l->down; + l->down = r; + } + + q = q->down; + } + } + + return OK; +} + +/* + * + */ +void PrintSMatrix(CrossList M) { + int i, j; + OLNode* p; + + for(i = 1; i <= M.mu; ++i) { + p = M.rhead[i]; + for(j = 1; j <= M.nu; ++j) { + if(p && p->j == j) { + printf("%3d ", p->e); + p = p->right; + } else { + printf("%3d ", 0); + } + } + printf("\n"); + } +} diff --git a/VisualC++/ExerciseBook/05.27/CrossList.h b/VisualC++/ExerciseBook/05.27/CrossList.h new file mode 100644 index 0000000..c774280 --- /dev/null +++ b/VisualC++/ExerciseBook/05.27/CrossList.h @@ -0,0 +1,94 @@ +/*=================== + * ʮϡ + * + * 㷨: 5.4 + ====================*/ + +#ifndef CROSSLIST_H +#define CROSSLIST_H + +#include +#include // ṩmallocreallocfreeexitԭ +#include // ṩ strstr ԭ +#include "Status.h" //**01 **// + +/* ʮԪ */ +typedef int ElemType; + +/* ԪͶ */ +typedef struct OLNode { + int i, j; // ÷Ԫ±± + ElemType e; + struct OLNode* right; // ÷Ԫڵбĺ + struct OLNode* down; // ÷Ԫڵбĺ +} OLNode, * OLink; + +/* ʮͶ */ +typedef struct { + OLink* rhead; // ͷָ + OLink* chead; // ͷָ + int mu, nu, tu; // ͷԪ +} CrossList; + + +/* + * 㷨5.4 + * + * ϡM + * + * + *ע + * + * ̲Ĭϴӿ̨ȡݡ + * Ϊ˷ԣÿжֶݣ + * ѡԤļpathжȡݡ + * + * Ҫӿ̨ȡݣpathΪNULLΪմ + * ҪļжȡݣҪpathдļϢ + */ +Status CreateSMatrix(CrossList* M, char* path); + +/* + * ϡ + */ +Status DestroySMatrix(CrossList* M); + +/* + * + * + * һ¾Tþ˴ӾMаݡ + */ +Status CopySMatrix(CrossList M, CrossList* T); + +/* + * ӷ + * + * Q = M + N + */ +Status AddSMatrix(CrossList M, CrossList N, CrossList* Q); + +/* + * + * + * Q = M - N + */ +Status SubSMatrix(CrossList M, CrossList N, CrossList* Q); + +/* + * ˷ + * + * Q = M * N + */ +Status MultSMatrix(CrossList M, CrossList N, CrossList* Q); + +/* + * ת + */ +Status TransposeSMatrix(CrossList M, CrossList* T); + +/* + * + */ +void PrintSMatrix(CrossList M); + +#endif diff --git a/VisualC++/ExerciseBook/05.27/TestData_M.txt b/VisualC++/ExerciseBook/05.27/TestData_M.txt new file mode 100644 index 0000000..be25c94 --- /dev/null +++ b/VisualC++/ExerciseBook/05.27/TestData_M.txt @@ -0,0 +1,4 @@ +5 +5 +Ԫ10 +Ԫ飺(1,2,1),(1,4,5),(2,3,-3),(2,5,2),(3,1,2),(3,2,3),(3,3,4),(4,4,2),(5,1,3),(5,2,-1) \ No newline at end of file diff --git a/VisualC++/ExerciseBook/05.27/TestData_N.txt b/VisualC++/ExerciseBook/05.27/TestData_N.txt new file mode 100644 index 0000000..7c940db --- /dev/null +++ b/VisualC++/ExerciseBook/05.27/TestData_N.txt @@ -0,0 +1,4 @@ +5 +5 +Ԫ8 +Ԫ飺(1,1,-3)(1,3,2)(2,4,-1)(3,2,4)(4,1,6)(4,5,5)(5,1,3)(5,3,2) \ No newline at end of file diff --git a/VisualC++/ExerciseBook/05.28-05.29/05.28-05.29.c b/VisualC++/ExerciseBook/05.28-05.29/05.28-05.29.c new file mode 100644 index 0000000..eb0a701 --- /dev/null +++ b/VisualC++/ExerciseBook/05.28-05.29/05.28-05.29.c @@ -0,0 +1,336 @@ +#include +#include "MPList.h" //**05 ͹**// + +/* + * mԪʽPеһԪƫPD + * + * ԤһԪΪⲿ + */ +Status Algo_5_28(MPList P, MPList* PD); + +/* + * ָexp˵ʽPԭӽϵ + */ +static void HandleExp(MPList P, int exp); + +/* + * ʽӷR = P + Q + */ +Status Algo_5_29(MPList P, MPList Q, MPList* R); + +/* + * ԷǿյĶԶʽPQӣPQָǸԪбͷ㡣 + */ +static void AddMpList(MPList P, MPList Q, MPList* R); + +/* + * 󴴽һ½㡣 + * tpΪNULLΪԭӽһͷ㣬Ϊӱͷ㡣 + * vΪͷԪ + */ +static MPList VirtualNode(int v, MPList tp, MPList hp); + + +int main(int argc, char* argv[]) { + MPList P, Q; + MPList PD, QD; + MPList R; + char *p = "z((3,y((1,x((3, 1))))),(2,y((2,1))),(0,3))"; + char *q = "z((4,1),(3,y((1,x((3,-1))))),(2,x((1,1))),(0,y((1,1),(0,4))))"; + + printf("Ԫʽ...\n"); + CreateMPList(&P, p, "zyx"); + printf("P = "); + PrintGraph(P); + CreateMPList(&Q, q, "zyx"); + printf("Q = "); + PrintGraph(Q); + + // һԪƫ + printf("P' = "); + Algo_5_28(P, &PD); + PrintGraph(PD); + printf("Q' = "); + Algo_5_28(Q, &QD); + PrintGraph(QD); + + // ʽӷ + printf("R = "); + Algo_5_29(P, Q, &R); + PrintGraph(R); +} + + +/* + * mԪʽPеһԪƫPD + * + * ԤһԪΪⲿ + */ +Status Algo_5_28(MPList P, MPList* PD) { + MPList r, rd, s; + int count; + + if(P == NULL || PD == NULL) { + return ERROR; + } + + // ʽ + *PD = (MPList) malloc(sizeof(MPNode)); + (*PD)->tag = List; + (*PD)->exp = P->exp; + (*PD)->tp = NULL; + + // ͷ + (*PD)->Node.hp = (MPList) malloc(sizeof(MPNode)); + (*PD)->Node.hp->tag = P->Node.hp->tag; + (*PD)->Node.hp->exp = P->Node.hp->exp; + (*PD)->Node.hp->Node.hp = P->Node.hp->Node.hp; + + r = P->Node.hp; // ָPͷ + rd = (*PD)->Node.hp; // ָPDͷ + count = 0; + + // һԪб + while(r->tp != NULL) { + r = r->tp; + + // û""㣬ߣʽPһ"" + if(r->exp!=0 || count==0) { + rd->tp = (MPList) malloc(sizeof(MPNode)); + rd = rd->tp; + } + + /* + * ""㣬󵼺Ϊ0 + * ע""ָΪ0 + */ + if(r->exp == 0) { + // ʽPһ"" + if(count==0) { + rd->tag = Atom; + rd->exp = 0; + rd->Node.coef = 0; + } + + break; + } + + rd->tag = r->tag; + rd->exp = r->exp - 1; + + // ԭӽ㣬ֱӼϵ + if(r->tag==Atom) { + rd->Node.coef = r->Node.coef * r->exp; // ָϵ + + // ӱ㣬Ҫָ˵ʵλ + } else { + Copy(r->Node.hp, &(rd->Node.hp)); + + // ָΪ1ʱûҪ˵ + if(r->exp!=1) { + // ָexp˵ʽPԭӽϵ + HandleExp(rd->Node.hp, r->exp); + } + } + + count++; + } + + rd->tp = NULL; + + return OK; +} + +/* + * ָexp˵ʽPԭӽϵ + */ +static void HandleExp(MPList P, int exp) { + MPList r; + + if(P == NULL) { + return; + } + + for(r = P->tp; r != NULL; r = r->tp) { + if(r->tag == Atom) { + r->Node.coef *= exp; + } else { + HandleExp(r->Node.hp, exp); + } + } +} + +/* + * ʽӷR = P + Q + */ +Status Algo_5_29(MPList P, MPList Q, MPList* R) { + MPList r; + + // ҪʽԪ + if(P == NULL || Q == NULL || R==NULL || P->exp != Q->exp) { + return ERROR; + } + + // ʽ + *R = (MPList) malloc(sizeof(MPNode)); + if(*R == NULL) { + exit(OVERFLOW); + } + (*R)->tag = List; + (*R)->exp = P->exp; // ʽԪ + (*R)->tp = NULL; + + AddMpList(P->Node.hp, Q->Node.hp, &r); + + if(r->tp == NULL) { + r->tp = (MPList) malloc(sizeof(MPNode)); + r->tp->tag = Atom; + r->tp->exp = 0; + r->tp->Node.coef = 0.0f; + r->tp->tp = NULL; + } + + (*R)->Node.hp = r; + + return OK; +} + +/* + * ԷǿյĶԶʽPQӣPQָǸԪбͷ㡣 + */ +static void AddMpList(MPList P, MPList Q, MPList* R) { + MPList p, q, h, r; + MPList t; + MPList tp; + float sum; + int a, b; + int v; + + // ͬһԪ + if(P->exp!=Q->exp) { + + a = (int)(strchr(Var, P->exp)-Var); + b = (int)(strchr(Var, Q->exp)-Var); + + if(aexp, NULL, Q); + v = P->exp; + } + + if(a>b) { + P = VirtualNode(Q->exp, NULL, P); + v = Q->exp; + } + } else { + v = P->exp; + } + + // ͷ + *R = (MPList) malloc(sizeof(MPNode)); + (*R)->tag = List; + (*R)->exp = v; + (*R)->Node.hp =NULL; + + h = *R; + + p = P->tp; + q = Q->tp; + + while(p!=NULL && q!=NULL){ + if(p->exp>q->exp) { + tp = p->tp; + p->tp = NULL; + Copy(p, &(h->tp)); + p->tp = tp; + p = p->tp; + h = h->tp; + } else if(p->expexp) { + tp = q->tp; + q->tp = NULL; + Copy(q, &(h->tp)); + q->tp = tp; + q = q->tp; + h = h->tp; + + // ָͬ + } else { + sum = 0.0f; // ʼϵͣһõ + r = NULL; + + if(p->tag==Atom && q->tag==List) { + t = VirtualNode(q->Node.hp->exp, p, NULL); + tp = p->tp; + p->tp = NULL; + AddMpList(t, q->Node.hp, &r); + p->tp = tp; + } else if(p->tag==List && q->tag==Atom) { + t = VirtualNode(p->Node.hp->exp, q, NULL); + tp = q->tp; + q->tp = NULL; + AddMpList(p->Node.hp, t, &r); + q->tp = tp; + + // ӱ + } else if(p->tag==List && q->tag==List) { + AddMpList(p->Node.hp, q->Node.hp, &r); + + // ԭӵĻֱ + } else if(p->tag==Atom && q->tag==Atom) { + sum = p->Node.coef + q->Node.coef; + } + + if(sum!=0.0f || (r!=NULL && r->tp!=NULL)) { + h->tp = (MPList) malloc(sizeof(MPNode)); + h = h->tp; + h->exp = p->exp; + + if(sum!=0.0f) { + h->tag = Atom; + h->Node.coef = sum; + } else { + h->tag = List; + h->Node.hp = r; + } + } + + p = p->tp; + q = q->tp; + } + } + + h->tp = NULL; + + if(p!=NULL){ + Copy(p, &(h->tp)); + } + + if(q!=NULL){ + Copy(q, &(h->tp)); + } +} + +/* + * 󴴽һ½㡣 + * tpΪNULLΪԭӽһͷ㣬Ϊӱͷ㡣 + * vΪͷԪ + */ +static MPList VirtualNode(int v, MPList tp, MPList hp){ + MPList P; + + P = (MPList) malloc(sizeof(MPNode)); + P->tag = List; + P->exp = v; + P->Node.hp = NULL; + + if(tp!=NULL) { + P->tp = tp; + } else { + P->tp = (MPList) malloc(sizeof(MPNode)); + P->tp->exp = 0; + P->tp->tag = List; + P->tp->Node.hp = hp; + P->tp->tp = NULL; + } + + return P; +} diff --git a/VisualC++/ExerciseBook/05.28-05.29/05.28-05.29.vcxproj b/VisualC++/ExerciseBook/05.28-05.29/05.28-05.29.vcxproj new file mode 100644 index 0000000..e44d727 --- /dev/null +++ b/VisualC++/ExerciseBook/05.28-05.29/05.28-05.29.vcxproj @@ -0,0 +1,78 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {1E4BBDA3-6E21-433D-95B3-CCBB7A450A34} + My05280529 + + + + 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/05.28-05.29/05.28-05.29.vcxproj.filters b/VisualC++/ExerciseBook/05.28-05.29/05.28-05.29.vcxproj.filters new file mode 100644 index 0000000..a479b20 --- /dev/null +++ b/VisualC++/ExerciseBook/05.28-05.29/05.28-05.29.vcxproj.filters @@ -0,0 +1,36 @@ + + + + + {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/05.28-05.29/05.28-05.29.vcxproj.user b/VisualC++/ExerciseBook/05.28-05.29/05.28-05.29.vcxproj.user new file mode 100644 index 0000000..ace9a86 --- /dev/null +++ b/VisualC++/ExerciseBook/05.28-05.29/05.28-05.29.vcxproj.user @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/05.28-05.29/MPList.c b/VisualC++/ExerciseBook/05.28-05.29/MPList.c new file mode 100644 index 0000000..1f08b74 --- /dev/null +++ b/VisualC++/ExerciseBook/05.28-05.29/MPList.c @@ -0,0 +1,233 @@ +/*========== + * mԪʽ + ===========*/ + +#include "MPList.h" + +// μͷļе +char Var[27]; + +/* + * + * + * ַSmԪP + * УSǷдȷ + * + * P : Ķʽ + * S : ʽַ + * vars: бӵһԪʼУxyzԪʽеδ֪ + */ +Status CreateMPList(MPList* P, char* S, char* vars) { + if(P == NULL) { + return ERROR; + } + + // ַSеĿհףɴӡַո + ClearBlank(&S); + + if(strlen(S) == 0) { + *P = NULL; + return ERROR; + } + + // ʼԪϢ + strcpy(Var, vars); + + *P = (MPList) malloc(sizeof(MPNode)); + if(*P == NULL) { + exit(OVERFLOW); + } + + (*P)->tag = List; + (*P)->exp = (int) strlen(vars); + (*P)->tp = NULL; + + Create(&(*P)->Node.hp, S); + + return OK; +} + +/* + * mԪʽ + */ +static Status Create(MPList* P, char* S) { + char* Sc; + char* hhstr, * hstr, * str; + char* sub; + MPList r; + float f; + + // ȡSһ + SubString(&Sc, S, 1, (int) strlen(S)); + + *P = (MPList) malloc(sizeof(MPNode)); + if(*P == NULL) { + exit(OVERFLOW); + } + + (*P)->tag = List; + (*P)->exp = (int) Sc[0]; // δ֪ǣxyz + (*P)->Node.hp = NULL; + (*P)->tp = NULL; + + StrDelete(&Sc, 1, 1); // ɾδ֪ + SubString(&str, Sc, 2, (int) strlen(Sc) - 2); // ȥ + + r = *P; + + while(!StrEmpty(str)) { + // + sever(&hstr, &str); + + SubString(&sub, hstr, 2, (int) strlen(hstr) - 2); // ȥ + sever(&hhstr, &sub); + + // ӽ + r->tp = (MPList) malloc(sizeof(MPNode)); + if(r->tp == NULL) { + exit(OVERFLOW); + } + GetElem(hhstr, 1, &f); + r->tp->exp = (int) f; // ȡָ + r->tp->tp = NULL; + + if(ElemCount(sub) == 1) { + r->tp->tag = Atom; + GetElem(sub, 1, &f); + r->tp->Node.coef = f; + } else { + r->tp->tag = List; + Create(&(r->tp->Node.hp), sub); + } + + r = r->tp; + } + + return OK; +} + +/* + * ͼλ + * + * mԪP + */ +void PrintGraph(MPList P) { + if(P == NULL) { + printf("\n"); + return; + } + Print(P->Node.hp); + printf("\n"); +} + +/* + * ͼλڲʵ + */ +static void Print(MPList head) { + MPList p; + + if(head == NULL) { + return; + } + + printf("%c(", head->exp); + + p = head->tp; + + while(p != NULL) { + printf("(%d,", p->exp); + + if(p->tag == List) { + Print(p->Node.hp); + } else { + printf("%.2f", p->Node.coef); + } + + printf(")"); + + p = p->tp; + + if(p != NULL) { + printf(","); + } + } + + printf(")"); +} + +/* + * ǿմstrָ֣hsubΪһ','֮ǰӴstrΪһ','֮Ӵ + * + *ע + * 1.ַstrȷ޿հ׷ţstrѾȥš + * 2.ɺstrҲᷢ仯 + */ +static void sever(char** hstr, char** str) { + int i, k, n; + + char* head, * tail; + + // strΪʱhstrҲΪ + if(strlen(*str) == 0) { + *hstr = NULL; + return; + } + + n = (int) strlen(*str); + + i = 0; // ַʱα + k = 0; // δ + + do { + if((*str)[i] == '(') { + ++k; + } + + if((*str)[i] == ')') { + --k; + } + + i++; + } while(i < n && ((*str)[i] != ',' || k != 0)); + + if(i < n) { + head = (char*) malloc((i + 1) * sizeof(char)); + tail = (char*) malloc((n - i - 1 + 1) * sizeof(char)); + + strncpy(head, *str, i); + head[i] = '\0'; + + strncpy(tail, (*str + i + 1), n - i - 1); + tail[n - i - 1] = '\0'; + } else { + head = *str; + tail = (char*) malloc(sizeof(char)); + tail[0] = '\0'; + } + + *hstr = head; + *str = tail; +} + + +/* + * ƶʽPƵQ + */ +void Copy(MPList P, MPList* Q) { + if(P == NULL) { + *Q = NULL; + return; + } + + *Q = (MPList) malloc(sizeof(MPNode)); + (*Q)->tag = P->tag; + (*Q)->exp = P->exp; + + if(P->tag == List) { + Copy(P->Node.hp, &((*Q)->Node.hp)); + } else { + (*Q)->Node.coef = P->Node.coef; + } + + Copy(P->tp, &((*Q)->tp)); +} diff --git a/VisualC++/ExerciseBook/05.28-05.29/MPList.h b/VisualC++/ExerciseBook/05.28-05.29/MPList.h new file mode 100644 index 0000000..455e7ea --- /dev/null +++ b/VisualC++/ExerciseBook/05.28-05.29/MPList.h @@ -0,0 +1,97 @@ +/*========== + * mԪʽ + ===========*/ + +#ifndef MPLIST_H +#define MPLIST_H + +#include +#include // ṩ mallocreallocfreeexit ԭ +#include // ṩ strlen ԭ +#include "Status.h" //**01 **// +#include "StringUtil.h" //**ַ**// + +/* + * ʾ + * + * 1.ڶԪԼһԪλ㡣 + * 2.δ֪ĬΪa~zA~Z26ĸ + * 3.ԼʽÿԪָǡݼģ321 + */ + + +/* + * 浱ǰʽıϢxyz + * Լvarеַ˳λԪĴ磺 + * "zyx"ָʾzΪһԪyΪڶԪxΪԪ + */ +extern char Var[27]; + +/* + * mԪʽ + * + * Atom-0ԭӽ + * List-1 + */ +typedef enum { Atom, List } ElemTag; + +/* mԪʽԪؽ */ +typedef struct MPNode { + ElemTag tag; // ԭӽͱ + int exp; // ָ򣬶ͷ㣬洢δ֪ǣxyz + union { + float coef; // ϵ + struct MPNode* hp; // ıͷָ + } Node; + struct MPNode* tp; // ൱nextָһԪؽ +} MPNode; + +/* mԪʽ */ +typedef MPNode* MPList; + + +/* + * + * + * ַSmԪP + * УSǷдȷ + * + * P : Ķʽ + * S : ʽַ + * vars: бӵһԪʼУxyzԪʽеδ֪ + */ +Status CreateMPList(MPList* P, char* S, char* vars); + +/* + * mԪʽ + */ +static Status Create(MPList* P, char* S); + +/* + * ͼλ + * + * mԪP + */ +void PrintGraph(MPList P); + +/* + * ͼλڲʵ + */ +static void Print(MPList P); + +/* + * ǿմstrָ֣hsubΪһ','֮ǰӴstrΪһ','֮Ӵ + * + *ע + * 1.ַstrȷ޿հ׷ţstrѾȥš + * 2.ɺstrҲᷢ仯 + */ +static void sever(char** hstr, char** str); + + +/* + * ƶʽ + */ +void Copy(MPList P, MPList* Q); + +#endif diff --git a/VisualC++/ExerciseBook/05.28-05.29/StringUtil.c b/VisualC++/ExerciseBook/05.28-05.29/StringUtil.c new file mode 100644 index 0000000..b1b0fbf --- /dev/null +++ b/VisualC++/ExerciseBook/05.28-05.29/StringUtil.c @@ -0,0 +1,160 @@ +/*================ + * ַ + =================*/ + +#include "StringUtil.h" + +/* + * ɾ + * + * ɾs[pos, pos+len-1]pos1ʼ + */ +Status StrDelete(char** s, int pos, int n) { + int len; + char* ss; + + len = (int) strlen(*s); + + if(pos < 1 || pos + n - 1 > len || n < 0) { + return ERROR; + } + + // ɾijΪ0ǰ + if(n == 0) { + return ERROR; + } + + ss = (char*) malloc((len - n + 1) * sizeof(char)); + + strncpy(ss, *s, pos - 1); + strncpy(ss, *s + pos + n - 1, len - pos - n + 1); + + ss[len - n] = '\0'; + + *s = ss; + + return OK; +} + +/* + * Ӵ + * + * subs[pos, pos+len-1]pos1ʼ + */ +Status SubString(char** sub, char* s, int pos, int n) { + int len, i; + + len = (int) strlen(s); + + if(pos < 1 || pos > len || n < 0 || pos + n - 1 > len) { + *sub = NULL; + return ERROR; + } + + *sub = (char*) malloc((n + 1) * sizeof(char)); + + for(i = 0; i < n; i++) { + (*sub)[i] = s[pos + i - 1]; + } + + // ȷ³ + (*sub)[n] = '\0'; + + return OK; +} + +/* + * п + * + * жϴsǷЧݡ + */ +Status StrEmpty(char* s) { + return strlen(s) == 0 ? TRUE : FALSE; +} + +/* + * + * + * ַsеĿհףɴӡַո + */ +Status ClearBlank(char** s) { + int len; + int i, j; + char* ss; + + len = (int) strlen(*s); + if(len == 0) { + return ERROR; + } + + ss = (char*) malloc((len + 1) * sizeof(char)); + + for(i = 0, j = 0; i < len; i++) { + // հףԹ + if((*s)[i] == ' ' || !isprint((*s)[i])) { + continue; + } + + ss[j++] = (*s)[i]; + } + + ss[j] = '\0'; + + *s = ss; + + return OK; +} + +/* + * + * + * ͳַsеԪظ + * ֮ڣ֣Ὣ䵱һԪء + */ +int ElemCount(const char* s) { + int count; + float f; + char c; + char* sub; + + if(s==NULL || strlen(s) == 0) { + return 0; + } + + sub = (char*) malloc((strlen(s) + 1) * sizeof(char)); + sub[0] = '\0'; + + // + if(sscanf(s, "%f", &f) == 1) { + sscanf(s, "%f%s", &f, sub); + } else { + sscanf(s, "%c%s", &c, sub); + } + + count = ElemCount(sub); + + return 1 + count; +} + +/* + * ȡֵ + * + * ȡַsеposԪ(pos1ʼ)fա + * ֮ڣ֣Ὣ䵱һԪء + */ +Status GetElem(char* s, int pos, float* f) { + int len; + + len = (int) strlen(s); + + if(pos < 1 || pos > len) { + return ERROR; + } + + // ȳԶ֣ȡʧܵĻٳԶַ + if(sscanf(s + pos - 1, "%f", f) < 1) { + *f = s[pos - 1]; + } + + return OK; +} diff --git a/VisualC++/ExerciseBook/05.28-05.29/StringUtil.h b/VisualC++/ExerciseBook/05.28-05.29/StringUtil.h new file mode 100644 index 0000000..e535a5e --- /dev/null +++ b/VisualC++/ExerciseBook/05.28-05.29/StringUtil.h @@ -0,0 +1,58 @@ +/*================ + * ַ + =================*/ + +#ifndef STRINGUTIL_H +#define STRINGUTIL_H + +#include +#include // ṩ malloc ԭ +#include // ṩ strlenstrncpy ԭ +#include // ṩ isprint ԭ +#include "Status.h" //**01 **// + +/* + * ɾ + * + * ɾs[pos, pos+len-1]pos1ʼ + */ +Status StrDelete(char** S, int pos, int n); + +/* + * Ӵ + * + * subs[pos, pos+len-1]pos1ʼ + */ +Status SubString(char** sub, char* s, int pos, int len); + +/* + * п + * + * жϴsǷЧݡ + */ +Status StrEmpty(char* s); + +/* + * + * + * ַsеĿհףɴӡַո + */ +Status ClearBlank(char** s); + +/* + * + * + * ͳַsеԪظ + * ֮ڣ֣Ὣ䵱һԪء + */ +int ElemCount(const char* s); + +/* + * ȡֵ + * + * ȡַsеposԪ(pos1ʼ)fա + * ֮ڣ֣Ὣ䵱һԪء + */ +Status GetElem(char* s, int pos, float *f); + +#endif diff --git a/VisualC++/ExerciseBook/05.30.1/05.30.1.c b/VisualC++/ExerciseBook/05.30.1/05.30.1.c new file mode 100644 index 0000000..00aefcc --- /dev/null +++ b/VisualC++/ExerciseBook/05.30.1/05.30.1.c @@ -0,0 +1,42 @@ +#include +#include "SString.h" //**04 **// +#include "GList-HT.h" //**05 ͹**// + +// ȣͷβ洢ʾ +int Algo_5_30_1(GList L); + + +int main(int argc, char* argv[]) { + GList L; + char* s = "((),(e),(a,(b,c,d)))"; + SString S; + + printf(" L ...\n"); + StrAssign(S, s); + CreateGList(&L, S); + printf("L = "); + PrintGraph(L); + + printf("Ϊ %d\n", Algo_5_30_1(L)); + + return 0; +} + + +// ȣͷβ洢ʾ +int Algo_5_30_1(GList L) { + int m, n; + + if(L==NULL) { + return 1; // ձΪ1 + } + + if(L->tag == Atom) { + return 0; // ԭΪ0 + } + + m = Algo_5_30_1(L->Node.ptr.hp) + 1; + n = Algo_5_30_1(L->Node.ptr.tp); + + return m > n ? m : n; +} diff --git a/VisualC++/ExerciseBook/05.30.1/05.30.1.vcxproj b/VisualC++/ExerciseBook/05.30.1/05.30.1.vcxproj new file mode 100644 index 0000000..199b6aa --- /dev/null +++ b/VisualC++/ExerciseBook/05.30.1/05.30.1.vcxproj @@ -0,0 +1,78 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {404AA05D-2412-4645-9E2C-280BFC6284FD} + My05301 + + + + 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/05.30.1/05.30.1.vcxproj.filters b/VisualC++/ExerciseBook/05.30.1/05.30.1.vcxproj.filters new file mode 100644 index 0000000..229a44d --- /dev/null +++ b/VisualC++/ExerciseBook/05.30.1/05.30.1.vcxproj.filters @@ -0,0 +1,36 @@ + + + + + {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/05.30.1/05.30.1.vcxproj.user b/VisualC++/ExerciseBook/05.30.1/05.30.1.vcxproj.user new file mode 100644 index 0000000..ace9a86 --- /dev/null +++ b/VisualC++/ExerciseBook/05.30.1/05.30.1.vcxproj.user @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/05.30.1/GList-HT.c b/VisualC++/ExerciseBook/05.30.1/GList-HT.c new file mode 100644 index 0000000..bad30df --- /dev/null +++ b/VisualC++/ExerciseBook/05.30.1/GList-HT.c @@ -0,0 +1,418 @@ +/*============================ + * ͷβ洢ʾ + * + * 㷨: 5.55.65.75.8 + =============================*/ + +#include "GList-HT.h" //**05 ͹**// + +/* + * ʼ + * + * ʼյĹΪ0Ϊ1 + * + *ע + * Ҫÿһȥſ + */ +Status InitGList(GList* L) { + if(L == NULL) { + return ERROR; + } + + *L = NULL; + + return OK; +} + +/* + * 㷨5.7 + * + * + * + * ַSL + */ +Status CreateGList(GList* L, SString S) { + SString emp; // չַ + SString hsub, sub; + GList p, q; + + if(L == NULL) { + return ERROR; + } + + // ַSеĿհףɴӡַո + ClearBlank(S); + + if(StrEmpty(S)) { + return ERROR; + } + + StrAssign(emp, "()"); + + /* + * 봮Ϊ()ҪյĹ + * + *ע + * ̲Ĵġ + * StrCompareķֵָʾַĴСָʾַǷȡ + * S()ȣֵӦ0 + */ + if(!StrCompare(S, emp)) { + *L = NULL; + } else { + *L = (GList) malloc(sizeof(GLNode)); + if(*L == NULL) { + exit(OVERFLOW); + } + + // ԭ + if(StrLength(S) == 1) { + (*L)->tag = Atom; + (*L)->Node.atom = S[1]; + } else { + (*L)->tag = List; + + p = *L; + + // ȥ + SubString(sub, S, 2, StrLength(S) - 2); + + // ظnӱ + do { + // subзͷhsubɺsubҲᷢ仯 + sever(hsub, sub); + + // ݹ鴴 + CreateGList(&(p->Node.ptr.hp), hsub); + + q = p; + + // βΪգҪβ + if(!StrEmpty(sub)) { + p = (GList) malloc(sizeof(GLNode)); + if(p == NULL) { + exit(OVERFLOW); + } + + p->tag = List; + + q->Node.ptr.tp = p; + } + } while(!StrEmpty(sub)); + + q->Node.ptr.tp = NULL; + } + } + + return OK; +} + +/* + * + * + * ͷŹռڴ档 + */ +Status DestroyGList(GList* L) { + GList head, tail; + + if(L == NULL || *L == NULL) { + return ERROR; + } + + // ɾԭӽ + if((*L)->tag == Atom) { + free(*L); + *L = NULL; + + // ɾӱ + } else { + head = (*L)->Node.ptr.hp; + tail = (*L)->Node.ptr.tp; + free(*L); + *L = NULL; + DestroyGList(&head); + DestroyGList(&tail); + } + + return OK; +} + +/* + * 㷨5.6 + * + * + * + * ɹLƵõT + */ +Status CopyGList(GList* T, GList L) { + if(T == NULL) { + return ERROR; + } + + if(L == NULL) { + *T = NULL; + } else { + // ½ + *T = (GList) malloc(sizeof(GLNode)); + if(*T == NULL) { + exit(OVERFLOW); + } + + (*T)->tag = L->tag; + + // Ƶԭ + if(L->tag == Atom) { + (*T)->Node.atom = L->Node.atom; + + // Ʊͷͱβ + } else { + CopyGList(&((*T)->Node.ptr.hp), L->Node.ptr.hp); + CopyGList(&((*T)->Node.ptr.tp), L->Node.ptr.tp); + } + } + + return OK; +} + +/* + * + * + * عijȡ + */ +int GListLength(GList L) { + int count; + + for(count = 0; L != NULL; count++, L = L->Node.ptr.tp) { + } + + return count; +} + +/* + * 㷨5.5 + * + * + * + * ع + */ +int GListDepth(GList L) { + int max, deep; + GList p; + + // ձΪ1 + if(L == NULL) { + return 1; + } + + // ԭΪ0 + if(L->tag == Atom) { + return 0; + } + + // ݹӱ + for(max = 0, p = L; p != NULL; p = p->Node.ptr.tp) { + deep = GListDepth(p->Node.ptr.hp); + if(deep > max) { + max = deep; + } + } + + // ǿձǸԪȼһ + return max + 1; +} + +/* + * п + * + * жϹǷΪա + */ +Status GListEmpty(GList L) { + return L == NULL ? TRUE : FALSE; +} + +/* + * ͷ + */ +GList GetHead(GList L) { + GList p; + + // ձޱͷﲻܷNULLȻֲʧ˻Ƿ˿ձ + if(L == NULL) { + exit(ERROR); + } + + CopyGList(&p, L->Node.ptr.hp); + + return p; +} + +/* + * β + */ +GList GetTail(GList L) { + GList p; + + // ձޱβﲻܷNULLȻֲʧ˻Ƿ˿ձ + if(L == NULL) { + exit(ERROR); + } + + CopyGList(&p, L->Node.ptr.tp); + + return p; +} + +/* + * + * + * ԪeΪLĵһԪء + */ +Status InsertFirst(GList* L, GList e) { + GList g; + + if(L == NULL) { + return ERROR; + } + + g = (GList) malloc(sizeof(GLNode)); + if(g == NULL) { + exit(OVERFLOW); + } + + g->tag = List; + g->Node.ptr.hp = e; + g->Node.ptr.tp = *L; + *L = g; + + return OK; +} + +/* + * ɾ + * + * LĵһԪɾeء + */ +Status DeleteFirst(GList* L, GList* e) { + GList p; + + // ձ޷ɾ + if(L == NULL || *L == NULL) { + return ERROR; + } + + p = *L; + *L = (*L)->Node.ptr.tp; + + CopyGList(e, p->Node.ptr.hp); + + free(p); + + return OK; +} + +/* + * + * + * visitʹL + */ +void Traverse(GList L, void(Visit)(AtomType)) { + + if(L == NULL) { + return; + } + + if(L->tag == Atom) { + Visit(L->Node.atom); + } else { + Traverse(L->Node.ptr.hp, Visit); + Traverse(L->Node.ptr.tp, Visit); + } + +} + +/* + * ͼλ + * + * L + */ +void PrintGraph(GList L) { + Print(L, Head); + printf("\n"); +} + +/* + * ͼλڲʵ֣markͼλǡ + */ +static void Print(GList L, Mark mark) { + // LΪ + if(L == NULL) { + if(mark == Head) { + printf("("); + } + + printf(")"); + + // LΪʱ + } else { + // ԭӽ㣬ԭ + if(L->tag == Atom) { + printf("%c", L->Node.atom); + + // ӱ㣬ҪԱͷβֱ + } else { + if(mark == Head) { + printf("("); + } else { + printf(","); + } + + Print(L->Node.ptr.hp, Head); + Print(L->Node.ptr.tp, Tail); + } + } +} + +/* + * 㷨5.8 + * + * ǿմstrָ֣hsubΪһ','֮ǰӴstrΪһ','֮Ӵ + * + *ע + * 1.ַstrȷ޿հ׷ţstrѾȥš + * 2.ɺstrҲᷢ仯 + */ +static void sever(SString hstr, SString str) { + int i, k, n; + SString ch; + + n = StrLength(str); + + i = 0; // ַʱα + k = 0; // δ + + do { + ++i; + + // ȡstrһַ + SubString(ch, str, i, 1); + + if(ch[1] == '(') { + ++k; + } + + if(ch[1] == ')') { + --k; + } + } while(i < n && (ch[1] != ',' || k != 0)); + + // ڶ + if(i < n) { + SubString(hstr, str, 1, i - 1); + SubString(str, str, i + 1, n - i); + + // ֻһ + } else { + StrCopy(hstr, str); + ClearString(str); + } +} diff --git a/VisualC++/ExerciseBook/05.30.1/GList-HT.h b/VisualC++/ExerciseBook/05.30.1/GList-HT.h new file mode 100644 index 0000000..508b96f --- /dev/null +++ b/VisualC++/ExerciseBook/05.30.1/GList-HT.h @@ -0,0 +1,164 @@ +/*============================ + * ͷβ洢ʾ + * + * 㷨: 5.55.65.75.8 + =============================*/ + +#ifndef GLIST_HT_H +#define GLIST_HT_H + +#include +#include // ṩ mallocreallocfreeexit ԭ +#include "Status.h" //**01 **// +#include "SString.h" //**04 **// + +/* ԭԪ */ +typedef char AtomType; + +/* + * + * + * Atom-0ԭӽ + * List-1 + */ +typedef enum { Atom, List } ElemTag; + +/* ͷβ洢ʾͶ */ +typedef struct GLNode { + ElemTag tag; // ǣԭӽͱ + + // ԭӽͱϲ + union { + AtomType atom; // atomԭӽֵAtomTypeû + struct { + struct GLNode* hp; // ָͷ + struct GLNode* tp; // ָβ + } ptr; // ָ + } Node; +} GLNode; + +/* */ +typedef GLNode* GList; + +/* + * ͼλ + * + * HeadָԱͷ + * TailָԱβ + */ +typedef enum { Head, Tail } Mark; + + +/* + * ʼ + * + * ʼյĹΪ0Ϊ1 + * + *ע + * Ҫÿһȥſ + */ +Status InitGList(GList* L); + +/* + * 㷨5.7 + * + * + * + * ַSL + */ +Status CreateGList(GList* L, SString S); + +/* + * + * + * ͷŹռڴ档 + */ +Status DestroyGList(GList* L); + +/* + * 㷨5.6 + * + * + * + * ɹLƵõT + */ +Status CopyGList(GList* T, GList L); + +/* + * + * + * عijȡ + */ +int GListLength(GList L); + +/* + * 㷨5.5 + * + * + * + * ع + */ +int GListDepth(GList L); + +/* + * п + * + * жϹǷΪա + */ +Status GListEmpty(GList L); + +/* + * ͷ + */ +GList GetHead(GList L); + +/* + * β + */ +GList GetTail(GList L); + +/* + * + * + * ԪeΪLĵһԪء + */ +Status InsertFirst(GList* L, GList e); + +/* + * ɾ + * + * LĵһԪɾeء + */ +Status DeleteFirst(GList* L, GList* e); + +/* + * + * + * visitʹL + */ +void Traverse(GList L, void (Visit)(AtomType)); + +/* + * ͼλ + * + * L + */ +void PrintGraph(GList L); + +/* + * ͼλڲʵ֣markͼλǡ + */ +static void Print(GList L, Mark mark); + +/* + * 㷨5.8 + * + * ǿմstrָ֣hsubΪһ','֮ǰӴstrΪһ','֮Ӵ + * + *ע + * 1.ַstrȷ޿հ׷ţstrѾȥš + * 2.ɺstrҲᷢ仯 + */ +static void sever(SString hstr, SString str); + +#endif diff --git a/VisualC++/ExerciseBook/05.30.1/SString.c b/VisualC++/ExerciseBook/05.30.1/SString.c new file mode 100644 index 0000000..7a96fcf --- /dev/null +++ b/VisualC++/ExerciseBook/05.30.1/SString.c @@ -0,0 +1,195 @@ +/*============================= + * Ķ˳洢ʾ˳򴮣 + * + * 㷨: 4.14.24.34.5 + ==============================*/ + +#include "SString.h" //**04 **// + +/* + * ʼ + * + * һֵΪcharsĴT + * + *ע + * òСӼ + */ +Status StrAssign(SString T, const char* chars) { + int i, len; + + len = (int) strlen(chars); + + // chars + if(len > MAXSTRLEN) { + return ERROR; + } + + T[0] = len; + for(i = 1; i <= len; i++) { + T[i] = chars[i - 1]; + } + + return OK; +} + +/* + * + * + * Sա + */ +Status ClearString(SString S) { + // ֻҪΪ0Ϳ + S[0] = 0; + return OK; +} + +/* + * п + * + * жϴSǷЧݡ + * + * ֵ + * TRUE : SΪ + * FALSE: SΪ + */ +Status StrEmpty(SString S) { + return S[0] == 0 ? TRUE : FALSE; +} + +/* + * + * + * شSԪصĸ + * + *ע + * òСӼ + */ +int StrLength(SString S) { + return S[0]; +} + +/* + * 㷨4.3 + * + * Ӵ + * + * SubS[pos, pos+len-1] + * ֵָʾǷȡɹ + * + *ע + * òСӼ + */ +Status SubString(SString Sub, SString S, int pos, int len) { + int i; + + if(pos < 1 || pos > S[0] || len < 0 || pos + len - 1 > S[0]) { + return ERROR; + } + + // Ԫ + for(i = 1; i <= len; i++) { + Sub[i] = S[pos + i - 1]; + } + + // ȷ³ + Sub[0] = len; + + return OK; +} + +/* + * ɾ + * + * ɾS[pos, pos+len-1] + */ +Status StrDelete(SString S, int pos, int len) { + int i; + + if(pos < 1 || pos + len - 1 > S[0] || len < 0) { + return ERROR; + } + + // ɾijΪ0ǰ + if(len == 0) { + return OK; + } + + // ѺԪŲǰ棬ǵɾԪ + for(i = pos + len; i <= S[0]; i++) { + S[i - len] = S[i]; + } + + // ȼ + S[0] -= len; + + return OK; +} + +/* + * Ƚ + * + * ȽϴSʹTرȽϽ + * + *ע + * òСӼ + */ +int StrCompare(SString S, SString T) { + int i = 1; + + while(i <= S[0] && i <= T[0]) { + // ַͬʱȽС + if(S[i] != T[i]) { + return S[i] - T[i]; + } + + i++; + } + + return S[0] - T[0]; +} + +/* + * + * + * SƵT + */ +Status StrCopy(SString T, SString S) { + int i; + + // ͬϢһ + for(i = 0; i <= S[0]; i++) { + T[i] = S[i]; + } + + return OK; +} + +/* + * ַSеĿհףɴӡַո + * + *ע + * úڱġ + */ +Status ClearBlank(SString S) { + int i, j; + + // ǿմ + if(S[0] == 0) { + return ERROR; + } + + for(i = 1, j = 0; i <= S[0]; i++) { + // հףԹ + if(S[i] == ' ' || !isprint(S[i])) { + continue; + } + + j++; + + S[j] = S[i]; + } + + S[0] = j; + + return OK; +} diff --git a/VisualC++/ExerciseBook/05.30.1/SString.h b/VisualC++/ExerciseBook/05.30.1/SString.h new file mode 100644 index 0000000..0632f18 --- /dev/null +++ b/VisualC++/ExerciseBook/05.30.1/SString.h @@ -0,0 +1,117 @@ +/*============================= + * Ķ˳洢ʾ˳򴮣 + * + * 㷨: 4.14.24.34.5 + ==============================*/ + +#ifndef SSTRING_H +#define SSTRING_H + +#include +#include // ṩ strlen ԭ +#include // ṩ isprint ԭ +#include "Status.h" //**01 **// + +/* 궨 */ +#define MAXSTRLEN 255 // ˳򴮵󴮳 + +/* + * ˳洢Ͷ + * + * עЧԪشSString1ŵԪʼ洢 + * SString0ŵԪ洢䳤 + */ +typedef unsigned char SString[MAXSTRLEN + 1]; // 0ŵԪŴij + + +/* + * ʾ + * + * ѭ̲ĵдϰߣposָʾַλ()1ʼ + */ + + +/* + * ʼ + * + * һֵΪcharsĴT + * + *ע + * òСӼ + */ +Status StrAssign(SString T, const char* chars); + +/* + * + * + * Sա + */ +Status ClearString(SString S); + +/* + * п + * + * жϴSǷЧݡ + * + * ֵ + * TRUE : SΪ + * FALSE: SΪ + */ +Status StrEmpty(SString S); + +/* + * + * + * شSԪصĸ + * + *ע + * òСӼ + */ +int StrLength(SString S); + +/* + * 㷨4.3 + * + * Ӵ + * + * SubS[pos, pos+len-1] + * ֵָʾǷȡɹ + * + *ע + * òСӼ + */ +Status SubString(SString Sub, SString S, int pos, int len); + +/* + * ɾ + * + * ɾS[pos, pos+len-1] + */ +Status StrDelete(SString S, int pos, int len); + +/* + * Ƚ + * + * ȽϴSʹTرȽϽ + * + *ע + * òСӼ + */ +int StrCompare(SString S, SString T); + +/* + * + * + * SƵT + */ +Status StrCopy(SString T, SString S); + +/* + * ַSеĿհףɴӡַո + * + *ע + * úڱġ + */ +Status ClearBlank(SString S); + +#endif diff --git a/VisualC++/ExerciseBook/05.30.2/05.30.2.c b/VisualC++/ExerciseBook/05.30.2/05.30.2.c new file mode 100644 index 0000000..929561f --- /dev/null +++ b/VisualC++/ExerciseBook/05.30.2/05.30.2.c @@ -0,0 +1,42 @@ +#include +#include "SString.h" //**04 **// +#include "GList-E.h" //**05 ͹**// + +// ȣչ洢ʾ +int Algo_5_30_2(GList L); + + +int main(int argc, char* argv[]) { + GList L; + char* s = "((),(e),(a,(b,c,d)))"; + SString S; + + printf(" L ...\n"); + StrAssign(S, s); + CreateGList(&L, S); + printf("L = "); + PrintGraph(L); + + printf("Ϊ %d\n", Algo_5_30_2(L)); + + return 0; +} + + +// ȣչ洢ʾ +int Algo_5_30_2(GList L) { + int m, n; + + if(L==NULL) { + return 1; // ձΪ1 + } + + if(L->tag == Atom) { + return 0; // ԭΪ0 + } + + m = Algo_5_30_2(L->Node.hp) + 1; + n = Algo_5_30_2(L->tp); + + return m > n ? m : n; +} diff --git a/VisualC++/ExerciseBook/05.30.2/05.30.2.vcxproj b/VisualC++/ExerciseBook/05.30.2/05.30.2.vcxproj new file mode 100644 index 0000000..ddf9756 --- /dev/null +++ b/VisualC++/ExerciseBook/05.30.2/05.30.2.vcxproj @@ -0,0 +1,78 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {986E6EF4-6118-4504-9667-3B86BC71D7CC} + My05302 + + + + 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/05.30.2/05.30.2.vcxproj.filters b/VisualC++/ExerciseBook/05.30.2/05.30.2.vcxproj.filters new file mode 100644 index 0000000..494d692 --- /dev/null +++ b/VisualC++/ExerciseBook/05.30.2/05.30.2.vcxproj.filters @@ -0,0 +1,36 @@ + + + + + {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/05.30.2/05.30.2.vcxproj.user b/VisualC++/ExerciseBook/05.30.2/05.30.2.vcxproj.user new file mode 100644 index 0000000..ace9a86 --- /dev/null +++ b/VisualC++/ExerciseBook/05.30.2/05.30.2.vcxproj.user @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/05.30.2/GList-E.c b/VisualC++/ExerciseBook/05.30.2/GList-E.c new file mode 100644 index 0000000..3fc0ad9 --- /dev/null +++ b/VisualC++/ExerciseBook/05.30.2/GList-E.c @@ -0,0 +1,449 @@ +/*=========================== + * չ洢ʾ + ============================*/ + +#include "GList-E.h" //**05 ͹**// + +/* + * ʼ + * + * ʼյĹΪ0Ϊ1 + * + *ע + * Ҫÿһſ + */ +Status InitGList(GList* L) { + if(L == NULL) { + return ERROR; + } + + *L = (GList) malloc(sizeof(GLNode)); + if(!*L) { + exit(OVERFLOW); + } + + (*L)->tag = List; + (*L)->Node.hp = NULL; + (*L)->tp = NULL; + + return OK; +} + +/* + * + * + * ַSL + */ +Status CreateGList(GList* L, SString S) { + SString emp, hsub, sub, tmp; + + if(L == NULL) { + return ERROR; + } + + // ַSеĿհףɴӡַո + ClearBlank(S); + + if(StrEmpty(S)) { + return ERROR; + } + + // Ϊ˲ƻS + StrCopy(sub, S); + + /* + * ִеʱ + * ٴִеʱѾȥ + */ + sever(hsub, sub); + + *L = (GList) malloc(sizeof(GLNode)); + if(*L == NULL) { + exit(OVERFLOW); + } + + StrAssign(emp, "()"); + + if(!StrCompare(hsub, emp)) { + (*L)->tag = List; + (*L)->Node.hp = NULL; + } else { + if(StrLength(hsub) == 1) { + (*L)->tag = Atom; + (*L)->Node.atom = hsub[1]; + } else { + (*L)->tag = List; + + SubString(tmp, hsub, 2, StrLength(hsub) - 2); + + CreateGList(&((*L)->Node.hp), tmp); + } + } + + // ڶβ˳ݹ + if(StrEmpty(sub)) { + (*L)->tp = NULL; + } else { + // ݹβ + CreateGList(&((*L)->tp), sub); + } + + return OK; +} + +/* + * + * + * ͷŹռڴ档 + */ +Status DestroyGList(GList* L) { + GList head, tail; + + if(L == NULL || *L == NULL) { + return ERROR; + } + + // ӱ + if((*L)->tag == List) { + head = (*L)->Node.hp; // ͷ + tail = (*L)->tp; // β + + free(*L); + *L = NULL; + + // ݹ鴦ͷ + if(head != NULL) { + DestroyGList(&head); + } + + // ݹ鴦β + if(tail != NULL) { + DestroyGList(&tail); + } + + // ԭӽ + } else { + tail = (*L)->tp; // β + + free(*L); + *L = NULL; + + if(tail != NULL) { + DestroyGList(&tail); + } + } + + return OK; +} + +/* + * + * + * ɹLƵõT + */ +Status CopyGList(GList* T, GList L) { + + if(L == NULL) { + return ERROR; + } + + *T = (GList) malloc(sizeof(GLNode)); + if(*T == NULL) { + exit(OVERFLOW); + } + + // ԭ + if(L->tag == Atom) { + (*T)->tag = Atom; + (*T)->Node.atom = L->Node.atom; + + // ӱ + } else { + (*T)->tag = List; + + // Ʊͷ + if(L->Node.hp != NULL) { + CopyGList(&((*T)->Node.hp), L->Node.hp); + } else { + (*T)->Node.hp = NULL; + } + } + + // Ʊβ + if(L->tp != NULL) { + CopyGList(&((*T)->tp), L->tp); + } else { + (*T)->tp = NULL; + } + + return OK; +} + +/* + * + * + * عijȡ + */ +int GListLength(GList L) { + int count = 0; + GList p; + + // + if(L == NULL) { + return -1; + } + + p = L->Node.hp; + + while(p != NULL) { + ++count; + p = p->tp; + } + + return count; +} + +/* + * + * + * ع + */ +int GListDepth(GList L) { + int max, deep; + GList p; + + max = 0; + + // + if(L == NULL) { + return -1; + } + + // ձΪ1 + if(L->tag == List && !L->Node.hp) { + return 1; + } + + // ԭΪ0 + if(L->tag == Atom) { + return 0; + } + + // ݹӱ + for(p = L->Node.hp; p != NULL; p = p->tp) { + // pΪͷָӱ + deep = GListDepth(p); + if(deep > max) { + max = deep; + } + } + + return max + 1; +} + +/* + * п + * + * жϹǷΪա + */ +Status GListEmpty(GList L) { + // + if(L == NULL) { + return ERROR; + } + + if(L->tag == List && L->Node.hp == NULL && L->tp == NULL) { + return TRUE; + } else { + return ERROR; + } +} + +/* + * ͷ + */ +GList GetHead(GList L) { + GList p, q; + + // ڻΪձ޷ȡͷ + if(L == NULL || L->Node.hp == NULL) { + return NULL; + } + + q = L->Node.hp->tp; // ʱLıβϢ + L->Node.hp->tp = NULL; // ȥLıβ + + CopyGList(&p, L->Node.hp); // ƱͷϢαβ + + L->Node.hp->tp = q; // ָLıβϢ + + return p; +} + +/* + * β + */ +GList GetTail(GList L) { + GList p, q; + + // ڻΪձ޷ȡβ + if(L == NULL || L->Node.hp == NULL) { + return NULL; + } + + q = L->Node.hp; // ʱLıͷϢ + L->Node.hp = q->tp; // ժLıͷ + + CopyGList(&p, L); // ƱβϢαͷ + + q->tp = L->Node.hp; // ָLıͷϢ + L->Node.hp = q; + + return p; +} + +/* + * + * + * ԪeΪLĵһԪء + */ +Status InsertFirst(GList* L, GList e) { + + // + if(L == NULL || *L == NULL) { + return ERROR; + } + + if(e == NULL) { + return ERROR; + } + + e->tp = (*L)->Node.hp; + (*L)->Node.hp = e; + + return OK; +} + +/* + * ɾ + * + * LĵһԪɾeء + */ +Status DeleteFirst(GList* L, GList* e) { + GList p; + + // ڻΪձ޷ɾͷ + if(*L == NULL || (*L)->Node.hp == NULL) { + return ERROR; + } + + p = (*L)->Node.hp; + (*L)->Node.hp = p->tp; + p->tp = NULL; + + *e = p; + + return OK; +} + +/* + * + * + * visitʹL + */ +void Traverse(GList L, void(Visit)(AtomType)) { + if(L == NULL) { + return; + } + + if(L->tag == List) { + Traverse(L->Node.hp, Visit); + } else { + Visit(L->Node.atom); + } + + Traverse(L->tp, Visit); +} + +/* + * ͼλ + * + * L + */ +void PrintGraph(GList L) { + Print(L); + printf("\n"); +} + +/* + * ͼλڲʵ֡ + */ +static void Print(GList L) { + if(L == NULL) { + return; + } + + // + if(L->tag == List) { + printf("("); + + if(L->Node.hp) { + Print(L->Node.hp); + } + + if(L->tp) { + printf("),"); + Print(L->tp); + } else { + printf(")"); + } + + // ԭӽ + } else { + printf("%c", L->Node.atom); + if(L->tp) { + printf(","); + Print(L->tp); + } + } +} + +/* + * ǿմstrָ֣hsubΪһ','֮ǰӴstrΪһ','֮Ӵ + * + *ע + * 1.ַstrȷ޿հ׷ţ + * strſȥҲδȥ + * 2.ɺstrҲᷢ仯 + */ +static void sever(SString hstr, SString str) { + int i, k, n; + SString ch; + + n = StrLength(str); + + i = 0; // ַʱα + k = 0; // δ + + do { + ++i; + + // ȡstrһַ + SubString(ch, str, i, 1); + + if(ch[1] == '(') { + ++k; + } + if(ch[1] == ')') { + --k; + } + } while(i < n && (ch[1] != ',' || k != 0)); + + if(i < n) { + SubString(hstr, str, 1, i - 1); + SubString(str, str, i + 1, n - i); + } else { + StrCopy(hstr, str); + ClearString(str); + } +} diff --git a/VisualC++/ExerciseBook/05.30.2/GList-E.h b/VisualC++/ExerciseBook/05.30.2/GList-E.h new file mode 100644 index 0000000..fa9af82 --- /dev/null +++ b/VisualC++/ExerciseBook/05.30.2/GList-E.h @@ -0,0 +1,146 @@ +/*=========================== + * չ洢ʾ + ============================*/ + +#ifndef GLIST_E_H +#define GLIST_E_H + +#include +#include // ṩ mallocreallocfreeexit ԭ +#include "Status.h" //**01 **// +#include "SString.h" //**04 **// + +/* ԭԪ */ +typedef char AtomType; //ԭ + +/* + * + * + * Atom-0ԭӽ + * List-1 + */ +typedef enum { Atom, List } ElemTag; + +/* չ洢ʾͶ */ +typedef struct GLNode { + ElemTag tag; // ǣԭӽͱ + + // ԭӽͱϲ + union + { + AtomType atom; // atomԭӽֵAtomTypeû + struct GLNode* hp; // ָͷ + } Node; + struct GLNode* tp; // ָβ +} GLNode; + +/* */ +typedef GLNode* GList; + + +/* + * ʼ + * + * ʼյĹΪ0Ϊ1 + * + *ע + * Ҫÿһſ + */ +Status InitGList(GList* L); + +/* + * + * + * ַSL + */ +Status CreateGList(GList* L, SString S); + +/* + * + * + * ͷŹռڴ档 + */ +Status DestroyGList(GList* L); + +/* + * + * + * ɹLƵõT + */ +Status CopyGList(GList* T, GList L); + +/* + * + * + * عijȡ + */ +int GListLength(GList L); + +/* + * + * + * ع + */ +int GListDepth(GList L); + +/* + * п + * + * жϹǷΪա + */ +Status GListEmpty(GList L); + +/* + * ͷ + */ +GList GetHead(GList L); + +/* + * β + */ +GList GetTail(GList L); + +/* + * + * + * ԪeΪLĵһԪء + */ +Status InsertFirst(GList* L, GList e); + +/* + * ɾ + * + * LĵһԪɾeء + */ +Status DeleteFirst(GList* L, GList* e); + +/* + * + * + * visitʹL + */ +void Traverse(GList L, void(Visit)(AtomType)); + +/* + * ͼλ + * + * L + */ +void PrintGraph(GList L); + +/* + * ͼλڲʵ֡ + */ +static void Print(GList L); + +/* + * ǿմstrָ֣hsubΪһ','֮ǰӴstrΪһ','֮Ӵ + * + *ע + * 1.ַstrȷ޿հ׷ţ + * strſȥҲδȥ + * 2.ɺstrҲᷢ仯 + */ +static void sever(SString hstr, SString str); + +#endif diff --git a/VisualC++/ExerciseBook/05.30.2/SString.c b/VisualC++/ExerciseBook/05.30.2/SString.c new file mode 100644 index 0000000..7a96fcf --- /dev/null +++ b/VisualC++/ExerciseBook/05.30.2/SString.c @@ -0,0 +1,195 @@ +/*============================= + * Ķ˳洢ʾ˳򴮣 + * + * 㷨: 4.14.24.34.5 + ==============================*/ + +#include "SString.h" //**04 **// + +/* + * ʼ + * + * һֵΪcharsĴT + * + *ע + * òСӼ + */ +Status StrAssign(SString T, const char* chars) { + int i, len; + + len = (int) strlen(chars); + + // chars + if(len > MAXSTRLEN) { + return ERROR; + } + + T[0] = len; + for(i = 1; i <= len; i++) { + T[i] = chars[i - 1]; + } + + return OK; +} + +/* + * + * + * Sա + */ +Status ClearString(SString S) { + // ֻҪΪ0Ϳ + S[0] = 0; + return OK; +} + +/* + * п + * + * жϴSǷЧݡ + * + * ֵ + * TRUE : SΪ + * FALSE: SΪ + */ +Status StrEmpty(SString S) { + return S[0] == 0 ? TRUE : FALSE; +} + +/* + * + * + * شSԪصĸ + * + *ע + * òСӼ + */ +int StrLength(SString S) { + return S[0]; +} + +/* + * 㷨4.3 + * + * Ӵ + * + * SubS[pos, pos+len-1] + * ֵָʾǷȡɹ + * + *ע + * òСӼ + */ +Status SubString(SString Sub, SString S, int pos, int len) { + int i; + + if(pos < 1 || pos > S[0] || len < 0 || pos + len - 1 > S[0]) { + return ERROR; + } + + // Ԫ + for(i = 1; i <= len; i++) { + Sub[i] = S[pos + i - 1]; + } + + // ȷ³ + Sub[0] = len; + + return OK; +} + +/* + * ɾ + * + * ɾS[pos, pos+len-1] + */ +Status StrDelete(SString S, int pos, int len) { + int i; + + if(pos < 1 || pos + len - 1 > S[0] || len < 0) { + return ERROR; + } + + // ɾijΪ0ǰ + if(len == 0) { + return OK; + } + + // ѺԪŲǰ棬ǵɾԪ + for(i = pos + len; i <= S[0]; i++) { + S[i - len] = S[i]; + } + + // ȼ + S[0] -= len; + + return OK; +} + +/* + * Ƚ + * + * ȽϴSʹTرȽϽ + * + *ע + * òСӼ + */ +int StrCompare(SString S, SString T) { + int i = 1; + + while(i <= S[0] && i <= T[0]) { + // ַͬʱȽС + if(S[i] != T[i]) { + return S[i] - T[i]; + } + + i++; + } + + return S[0] - T[0]; +} + +/* + * + * + * SƵT + */ +Status StrCopy(SString T, SString S) { + int i; + + // ͬϢһ + for(i = 0; i <= S[0]; i++) { + T[i] = S[i]; + } + + return OK; +} + +/* + * ַSеĿհףɴӡַո + * + *ע + * úڱġ + */ +Status ClearBlank(SString S) { + int i, j; + + // ǿմ + if(S[0] == 0) { + return ERROR; + } + + for(i = 1, j = 0; i <= S[0]; i++) { + // հףԹ + if(S[i] == ' ' || !isprint(S[i])) { + continue; + } + + j++; + + S[j] = S[i]; + } + + S[0] = j; + + return OK; +} diff --git a/VisualC++/ExerciseBook/05.30.2/SString.h b/VisualC++/ExerciseBook/05.30.2/SString.h new file mode 100644 index 0000000..0632f18 --- /dev/null +++ b/VisualC++/ExerciseBook/05.30.2/SString.h @@ -0,0 +1,117 @@ +/*============================= + * Ķ˳洢ʾ˳򴮣 + * + * 㷨: 4.14.24.34.5 + ==============================*/ + +#ifndef SSTRING_H +#define SSTRING_H + +#include +#include // ṩ strlen ԭ +#include // ṩ isprint ԭ +#include "Status.h" //**01 **// + +/* 궨 */ +#define MAXSTRLEN 255 // ˳򴮵󴮳 + +/* + * ˳洢Ͷ + * + * עЧԪشSString1ŵԪʼ洢 + * SString0ŵԪ洢䳤 + */ +typedef unsigned char SString[MAXSTRLEN + 1]; // 0ŵԪŴij + + +/* + * ʾ + * + * ѭ̲ĵдϰߣposָʾַλ()1ʼ + */ + + +/* + * ʼ + * + * һֵΪcharsĴT + * + *ע + * òСӼ + */ +Status StrAssign(SString T, const char* chars); + +/* + * + * + * Sա + */ +Status ClearString(SString S); + +/* + * п + * + * жϴSǷЧݡ + * + * ֵ + * TRUE : SΪ + * FALSE: SΪ + */ +Status StrEmpty(SString S); + +/* + * + * + * شSԪصĸ + * + *ע + * òСӼ + */ +int StrLength(SString S); + +/* + * 㷨4.3 + * + * Ӵ + * + * SubS[pos, pos+len-1] + * ֵָʾǷȡɹ + * + *ע + * òСӼ + */ +Status SubString(SString Sub, SString S, int pos, int len); + +/* + * ɾ + * + * ɾS[pos, pos+len-1] + */ +Status StrDelete(SString S, int pos, int len); + +/* + * Ƚ + * + * ȽϴSʹTرȽϽ + * + *ע + * òСӼ + */ +int StrCompare(SString S, SString T); + +/* + * + * + * SƵT + */ +Status StrCopy(SString T, SString S); + +/* + * ַSеĿհףɴӡַո + * + *ע + * úڱġ + */ +Status ClearBlank(SString S); + +#endif diff --git a/VisualC++/ExerciseBook/05.31/05.31.c b/VisualC++/ExerciseBook/05.31/05.31.c new file mode 100644 index 0000000..da70a36 --- /dev/null +++ b/VisualC++/ExerciseBook/05.31/05.31.c @@ -0,0 +1,43 @@ +#include +#include "Status.h" //**01 **// +#include "SString.h" //**04 **// +#include "GList-E.h" //**05 ͹**// + +/* + * ƣչ洢ʾ + * + *ע + * úGList-Eļж + */ +Status Algo_5_31(GList* T, GList L); + + +int main(int argc, char* argv[]) { + GList L, T; + char* s = "((),(e),(a,(b,c,d)))"; + SString S; + + printf(" L ...\n"); + StrAssign(S, s); + CreateGList(&L, S); + printf("L = "); + PrintGraph(L); + + printf("ƹ L T...\n"); + Algo_5_31(&T, L); + printf("T = "); + PrintGraph(T); + + return 0; +} + + +/* + * ƣչ洢ʾ + * + *ע + * úGList-Eļж + */ +Status Algo_5_31(GList* T, GList L) { + return CopyGList(T, L); +} diff --git a/VisualC++/ExerciseBook/05.31/05.31.vcxproj b/VisualC++/ExerciseBook/05.31/05.31.vcxproj new file mode 100644 index 0000000..47fd141 --- /dev/null +++ b/VisualC++/ExerciseBook/05.31/05.31.vcxproj @@ -0,0 +1,78 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {F63981E9-26D4-4EF9-82F5-1482260619CF} + My0531 + + + + 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/05.31/05.31.vcxproj.filters b/VisualC++/ExerciseBook/05.31/05.31.vcxproj.filters new file mode 100644 index 0000000..3b28619 --- /dev/null +++ b/VisualC++/ExerciseBook/05.31/05.31.vcxproj.filters @@ -0,0 +1,36 @@ + + + + + {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/05.31/05.31.vcxproj.user b/VisualC++/ExerciseBook/05.31/05.31.vcxproj.user new file mode 100644 index 0000000..ace9a86 --- /dev/null +++ b/VisualC++/ExerciseBook/05.31/05.31.vcxproj.user @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/05.31/GList-E.c b/VisualC++/ExerciseBook/05.31/GList-E.c new file mode 100644 index 0000000..3fc0ad9 --- /dev/null +++ b/VisualC++/ExerciseBook/05.31/GList-E.c @@ -0,0 +1,449 @@ +/*=========================== + * չ洢ʾ + ============================*/ + +#include "GList-E.h" //**05 ͹**// + +/* + * ʼ + * + * ʼյĹΪ0Ϊ1 + * + *ע + * Ҫÿһſ + */ +Status InitGList(GList* L) { + if(L == NULL) { + return ERROR; + } + + *L = (GList) malloc(sizeof(GLNode)); + if(!*L) { + exit(OVERFLOW); + } + + (*L)->tag = List; + (*L)->Node.hp = NULL; + (*L)->tp = NULL; + + return OK; +} + +/* + * + * + * ַSL + */ +Status CreateGList(GList* L, SString S) { + SString emp, hsub, sub, tmp; + + if(L == NULL) { + return ERROR; + } + + // ַSеĿհףɴӡַո + ClearBlank(S); + + if(StrEmpty(S)) { + return ERROR; + } + + // Ϊ˲ƻS + StrCopy(sub, S); + + /* + * ִеʱ + * ٴִеʱѾȥ + */ + sever(hsub, sub); + + *L = (GList) malloc(sizeof(GLNode)); + if(*L == NULL) { + exit(OVERFLOW); + } + + StrAssign(emp, "()"); + + if(!StrCompare(hsub, emp)) { + (*L)->tag = List; + (*L)->Node.hp = NULL; + } else { + if(StrLength(hsub) == 1) { + (*L)->tag = Atom; + (*L)->Node.atom = hsub[1]; + } else { + (*L)->tag = List; + + SubString(tmp, hsub, 2, StrLength(hsub) - 2); + + CreateGList(&((*L)->Node.hp), tmp); + } + } + + // ڶβ˳ݹ + if(StrEmpty(sub)) { + (*L)->tp = NULL; + } else { + // ݹβ + CreateGList(&((*L)->tp), sub); + } + + return OK; +} + +/* + * + * + * ͷŹռڴ档 + */ +Status DestroyGList(GList* L) { + GList head, tail; + + if(L == NULL || *L == NULL) { + return ERROR; + } + + // ӱ + if((*L)->tag == List) { + head = (*L)->Node.hp; // ͷ + tail = (*L)->tp; // β + + free(*L); + *L = NULL; + + // ݹ鴦ͷ + if(head != NULL) { + DestroyGList(&head); + } + + // ݹ鴦β + if(tail != NULL) { + DestroyGList(&tail); + } + + // ԭӽ + } else { + tail = (*L)->tp; // β + + free(*L); + *L = NULL; + + if(tail != NULL) { + DestroyGList(&tail); + } + } + + return OK; +} + +/* + * + * + * ɹLƵõT + */ +Status CopyGList(GList* T, GList L) { + + if(L == NULL) { + return ERROR; + } + + *T = (GList) malloc(sizeof(GLNode)); + if(*T == NULL) { + exit(OVERFLOW); + } + + // ԭ + if(L->tag == Atom) { + (*T)->tag = Atom; + (*T)->Node.atom = L->Node.atom; + + // ӱ + } else { + (*T)->tag = List; + + // Ʊͷ + if(L->Node.hp != NULL) { + CopyGList(&((*T)->Node.hp), L->Node.hp); + } else { + (*T)->Node.hp = NULL; + } + } + + // Ʊβ + if(L->tp != NULL) { + CopyGList(&((*T)->tp), L->tp); + } else { + (*T)->tp = NULL; + } + + return OK; +} + +/* + * + * + * عijȡ + */ +int GListLength(GList L) { + int count = 0; + GList p; + + // + if(L == NULL) { + return -1; + } + + p = L->Node.hp; + + while(p != NULL) { + ++count; + p = p->tp; + } + + return count; +} + +/* + * + * + * ع + */ +int GListDepth(GList L) { + int max, deep; + GList p; + + max = 0; + + // + if(L == NULL) { + return -1; + } + + // ձΪ1 + if(L->tag == List && !L->Node.hp) { + return 1; + } + + // ԭΪ0 + if(L->tag == Atom) { + return 0; + } + + // ݹӱ + for(p = L->Node.hp; p != NULL; p = p->tp) { + // pΪͷָӱ + deep = GListDepth(p); + if(deep > max) { + max = deep; + } + } + + return max + 1; +} + +/* + * п + * + * жϹǷΪա + */ +Status GListEmpty(GList L) { + // + if(L == NULL) { + return ERROR; + } + + if(L->tag == List && L->Node.hp == NULL && L->tp == NULL) { + return TRUE; + } else { + return ERROR; + } +} + +/* + * ͷ + */ +GList GetHead(GList L) { + GList p, q; + + // ڻΪձ޷ȡͷ + if(L == NULL || L->Node.hp == NULL) { + return NULL; + } + + q = L->Node.hp->tp; // ʱLıβϢ + L->Node.hp->tp = NULL; // ȥLıβ + + CopyGList(&p, L->Node.hp); // ƱͷϢαβ + + L->Node.hp->tp = q; // ָLıβϢ + + return p; +} + +/* + * β + */ +GList GetTail(GList L) { + GList p, q; + + // ڻΪձ޷ȡβ + if(L == NULL || L->Node.hp == NULL) { + return NULL; + } + + q = L->Node.hp; // ʱLıͷϢ + L->Node.hp = q->tp; // ժLıͷ + + CopyGList(&p, L); // ƱβϢαͷ + + q->tp = L->Node.hp; // ָLıͷϢ + L->Node.hp = q; + + return p; +} + +/* + * + * + * ԪeΪLĵһԪء + */ +Status InsertFirst(GList* L, GList e) { + + // + if(L == NULL || *L == NULL) { + return ERROR; + } + + if(e == NULL) { + return ERROR; + } + + e->tp = (*L)->Node.hp; + (*L)->Node.hp = e; + + return OK; +} + +/* + * ɾ + * + * LĵһԪɾeء + */ +Status DeleteFirst(GList* L, GList* e) { + GList p; + + // ڻΪձ޷ɾͷ + if(*L == NULL || (*L)->Node.hp == NULL) { + return ERROR; + } + + p = (*L)->Node.hp; + (*L)->Node.hp = p->tp; + p->tp = NULL; + + *e = p; + + return OK; +} + +/* + * + * + * visitʹL + */ +void Traverse(GList L, void(Visit)(AtomType)) { + if(L == NULL) { + return; + } + + if(L->tag == List) { + Traverse(L->Node.hp, Visit); + } else { + Visit(L->Node.atom); + } + + Traverse(L->tp, Visit); +} + +/* + * ͼλ + * + * L + */ +void PrintGraph(GList L) { + Print(L); + printf("\n"); +} + +/* + * ͼλڲʵ֡ + */ +static void Print(GList L) { + if(L == NULL) { + return; + } + + // + if(L->tag == List) { + printf("("); + + if(L->Node.hp) { + Print(L->Node.hp); + } + + if(L->tp) { + printf("),"); + Print(L->tp); + } else { + printf(")"); + } + + // ԭӽ + } else { + printf("%c", L->Node.atom); + if(L->tp) { + printf(","); + Print(L->tp); + } + } +} + +/* + * ǿմstrָ֣hsubΪһ','֮ǰӴstrΪһ','֮Ӵ + * + *ע + * 1.ַstrȷ޿հ׷ţ + * strſȥҲδȥ + * 2.ɺstrҲᷢ仯 + */ +static void sever(SString hstr, SString str) { + int i, k, n; + SString ch; + + n = StrLength(str); + + i = 0; // ַʱα + k = 0; // δ + + do { + ++i; + + // ȡstrһַ + SubString(ch, str, i, 1); + + if(ch[1] == '(') { + ++k; + } + if(ch[1] == ')') { + --k; + } + } while(i < n && (ch[1] != ',' || k != 0)); + + if(i < n) { + SubString(hstr, str, 1, i - 1); + SubString(str, str, i + 1, n - i); + } else { + StrCopy(hstr, str); + ClearString(str); + } +} diff --git a/VisualC++/ExerciseBook/05.31/GList-E.h b/VisualC++/ExerciseBook/05.31/GList-E.h new file mode 100644 index 0000000..fa9af82 --- /dev/null +++ b/VisualC++/ExerciseBook/05.31/GList-E.h @@ -0,0 +1,146 @@ +/*=========================== + * չ洢ʾ + ============================*/ + +#ifndef GLIST_E_H +#define GLIST_E_H + +#include +#include // ṩ mallocreallocfreeexit ԭ +#include "Status.h" //**01 **// +#include "SString.h" //**04 **// + +/* ԭԪ */ +typedef char AtomType; //ԭ + +/* + * + * + * Atom-0ԭӽ + * List-1 + */ +typedef enum { Atom, List } ElemTag; + +/* չ洢ʾͶ */ +typedef struct GLNode { + ElemTag tag; // ǣԭӽͱ + + // ԭӽͱϲ + union + { + AtomType atom; // atomԭӽֵAtomTypeû + struct GLNode* hp; // ָͷ + } Node; + struct GLNode* tp; // ָβ +} GLNode; + +/* */ +typedef GLNode* GList; + + +/* + * ʼ + * + * ʼյĹΪ0Ϊ1 + * + *ע + * Ҫÿһſ + */ +Status InitGList(GList* L); + +/* + * + * + * ַSL + */ +Status CreateGList(GList* L, SString S); + +/* + * + * + * ͷŹռڴ档 + */ +Status DestroyGList(GList* L); + +/* + * + * + * ɹLƵõT + */ +Status CopyGList(GList* T, GList L); + +/* + * + * + * عijȡ + */ +int GListLength(GList L); + +/* + * + * + * ع + */ +int GListDepth(GList L); + +/* + * п + * + * жϹǷΪա + */ +Status GListEmpty(GList L); + +/* + * ͷ + */ +GList GetHead(GList L); + +/* + * β + */ +GList GetTail(GList L); + +/* + * + * + * ԪeΪLĵһԪء + */ +Status InsertFirst(GList* L, GList e); + +/* + * ɾ + * + * LĵһԪɾeء + */ +Status DeleteFirst(GList* L, GList* e); + +/* + * + * + * visitʹL + */ +void Traverse(GList L, void(Visit)(AtomType)); + +/* + * ͼλ + * + * L + */ +void PrintGraph(GList L); + +/* + * ͼλڲʵ֡ + */ +static void Print(GList L); + +/* + * ǿմstrָ֣hsubΪһ','֮ǰӴstrΪһ','֮Ӵ + * + *ע + * 1.ַstrȷ޿հ׷ţ + * strſȥҲδȥ + * 2.ɺstrҲᷢ仯 + */ +static void sever(SString hstr, SString str); + +#endif diff --git a/VisualC++/ExerciseBook/05.31/SString.c b/VisualC++/ExerciseBook/05.31/SString.c new file mode 100644 index 0000000..7a96fcf --- /dev/null +++ b/VisualC++/ExerciseBook/05.31/SString.c @@ -0,0 +1,195 @@ +/*============================= + * Ķ˳洢ʾ˳򴮣 + * + * 㷨: 4.14.24.34.5 + ==============================*/ + +#include "SString.h" //**04 **// + +/* + * ʼ + * + * һֵΪcharsĴT + * + *ע + * òСӼ + */ +Status StrAssign(SString T, const char* chars) { + int i, len; + + len = (int) strlen(chars); + + // chars + if(len > MAXSTRLEN) { + return ERROR; + } + + T[0] = len; + for(i = 1; i <= len; i++) { + T[i] = chars[i - 1]; + } + + return OK; +} + +/* + * + * + * Sա + */ +Status ClearString(SString S) { + // ֻҪΪ0Ϳ + S[0] = 0; + return OK; +} + +/* + * п + * + * жϴSǷЧݡ + * + * ֵ + * TRUE : SΪ + * FALSE: SΪ + */ +Status StrEmpty(SString S) { + return S[0] == 0 ? TRUE : FALSE; +} + +/* + * + * + * شSԪصĸ + * + *ע + * òСӼ + */ +int StrLength(SString S) { + return S[0]; +} + +/* + * 㷨4.3 + * + * Ӵ + * + * SubS[pos, pos+len-1] + * ֵָʾǷȡɹ + * + *ע + * òСӼ + */ +Status SubString(SString Sub, SString S, int pos, int len) { + int i; + + if(pos < 1 || pos > S[0] || len < 0 || pos + len - 1 > S[0]) { + return ERROR; + } + + // Ԫ + for(i = 1; i <= len; i++) { + Sub[i] = S[pos + i - 1]; + } + + // ȷ³ + Sub[0] = len; + + return OK; +} + +/* + * ɾ + * + * ɾS[pos, pos+len-1] + */ +Status StrDelete(SString S, int pos, int len) { + int i; + + if(pos < 1 || pos + len - 1 > S[0] || len < 0) { + return ERROR; + } + + // ɾijΪ0ǰ + if(len == 0) { + return OK; + } + + // ѺԪŲǰ棬ǵɾԪ + for(i = pos + len; i <= S[0]; i++) { + S[i - len] = S[i]; + } + + // ȼ + S[0] -= len; + + return OK; +} + +/* + * Ƚ + * + * ȽϴSʹTرȽϽ + * + *ע + * òСӼ + */ +int StrCompare(SString S, SString T) { + int i = 1; + + while(i <= S[0] && i <= T[0]) { + // ַͬʱȽС + if(S[i] != T[i]) { + return S[i] - T[i]; + } + + i++; + } + + return S[0] - T[0]; +} + +/* + * + * + * SƵT + */ +Status StrCopy(SString T, SString S) { + int i; + + // ͬϢһ + for(i = 0; i <= S[0]; i++) { + T[i] = S[i]; + } + + return OK; +} + +/* + * ַSеĿհףɴӡַո + * + *ע + * úڱġ + */ +Status ClearBlank(SString S) { + int i, j; + + // ǿմ + if(S[0] == 0) { + return ERROR; + } + + for(i = 1, j = 0; i <= S[0]; i++) { + // հףԹ + if(S[i] == ' ' || !isprint(S[i])) { + continue; + } + + j++; + + S[j] = S[i]; + } + + S[0] = j; + + return OK; +} diff --git a/VisualC++/ExerciseBook/05.31/SString.h b/VisualC++/ExerciseBook/05.31/SString.h new file mode 100644 index 0000000..0632f18 --- /dev/null +++ b/VisualC++/ExerciseBook/05.31/SString.h @@ -0,0 +1,117 @@ +/*============================= + * Ķ˳洢ʾ˳򴮣 + * + * 㷨: 4.14.24.34.5 + ==============================*/ + +#ifndef SSTRING_H +#define SSTRING_H + +#include +#include // ṩ strlen ԭ +#include // ṩ isprint ԭ +#include "Status.h" //**01 **// + +/* 궨 */ +#define MAXSTRLEN 255 // ˳򴮵󴮳 + +/* + * ˳洢Ͷ + * + * עЧԪشSString1ŵԪʼ洢 + * SString0ŵԪ洢䳤 + */ +typedef unsigned char SString[MAXSTRLEN + 1]; // 0ŵԪŴij + + +/* + * ʾ + * + * ѭ̲ĵдϰߣposָʾַλ()1ʼ + */ + + +/* + * ʼ + * + * һֵΪcharsĴT + * + *ע + * òСӼ + */ +Status StrAssign(SString T, const char* chars); + +/* + * + * + * Sա + */ +Status ClearString(SString S); + +/* + * п + * + * жϴSǷЧݡ + * + * ֵ + * TRUE : SΪ + * FALSE: SΪ + */ +Status StrEmpty(SString S); + +/* + * + * + * شSԪصĸ + * + *ע + * òСӼ + */ +int StrLength(SString S); + +/* + * 㷨4.3 + * + * Ӵ + * + * SubS[pos, pos+len-1] + * ֵָʾǷȡɹ + * + *ע + * òСӼ + */ +Status SubString(SString Sub, SString S, int pos, int len); + +/* + * ɾ + * + * ɾS[pos, pos+len-1] + */ +Status StrDelete(SString S, int pos, int len); + +/* + * Ƚ + * + * ȽϴSʹTرȽϽ + * + *ע + * òСӼ + */ +int StrCompare(SString S, SString T); + +/* + * + * + * SƵT + */ +Status StrCopy(SString T, SString S); + +/* + * ַSеĿհףɴӡַո + * + *ע + * úڱġ + */ +Status ClearBlank(SString S); + +#endif diff --git a/VisualC++/ExerciseBook/05.32.1/05.32.1.c b/VisualC++/ExerciseBook/05.32.1/05.32.1.c new file mode 100644 index 0000000..49d7e91 --- /dev/null +++ b/VisualC++/ExerciseBook/05.32.1/05.32.1.c @@ -0,0 +1,64 @@ +#include +#include "Status.h" //**01 **// +#include "SString.h" //**04 **// +#include "GList-HT.h" //**05 ͹**// + +/* + * жϹǷȣͷβ洢ʾ + */ +Status Algo_5_32_1(GList A, GList B); + + +int main(int argc, char* argv[]) { + GList A, B; + char* a = "((),(e),(a,(b,c,d)))"; + char* b = "((),(e),(a,(b,c,f)))"; + SString Sa, Sb; + + printf(" AB ...\n"); + StrAssign(Sa, a); + CreateGList(&A, Sa); + StrAssign(Sb, b); + CreateGList(&B, Sb); + printf("A = "); + PrintGraph(A); + printf("B = "); + PrintGraph(B); + + Algo_5_32_1(A, B) ? printf("ȣ\n") : printf("ȣ\n"); + + return 0; +} + + +/* + * жϹǷȣͷβ洢ʾ + */ +Status Algo_5_32_1(GList A, GList B) { + if(!A && !B) { + return TRUE; // ձ + } + + // Ϊ + if(A && B) { + // Ԫͬ + if(A->tag == B->tag) { + // ԭӽ + if(A->tag == Atom) { + if(A->Node.atom == B->Node.atom) { + return TRUE; + } + + // + } else { + if(Algo_5_32_1(A->Node.ptr.hp, B->Node.ptr.hp) == TRUE) { + if(Algo_5_32_1(A->Node.ptr.tp, B->Node.ptr.tp) == TRUE) { + return TRUE; + } + } + } + } + } + + return FALSE; +} diff --git a/VisualC++/ExerciseBook/05.32.1/05.32.1.vcxproj b/VisualC++/ExerciseBook/05.32.1/05.32.1.vcxproj new file mode 100644 index 0000000..b0abe34 --- /dev/null +++ b/VisualC++/ExerciseBook/05.32.1/05.32.1.vcxproj @@ -0,0 +1,78 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {CF15AF01-BA4A-45D2-89DC-98FF7B722AB0} + My05321 + + + + 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/05.32.1/05.32.1.vcxproj.filters b/VisualC++/ExerciseBook/05.32.1/05.32.1.vcxproj.filters new file mode 100644 index 0000000..60850ec --- /dev/null +++ b/VisualC++/ExerciseBook/05.32.1/05.32.1.vcxproj.filters @@ -0,0 +1,36 @@ + + + + + {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/05.32.1/05.32.1.vcxproj.user b/VisualC++/ExerciseBook/05.32.1/05.32.1.vcxproj.user new file mode 100644 index 0000000..ace9a86 --- /dev/null +++ b/VisualC++/ExerciseBook/05.32.1/05.32.1.vcxproj.user @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/05.32.1/GList-HT.c b/VisualC++/ExerciseBook/05.32.1/GList-HT.c new file mode 100644 index 0000000..bad30df --- /dev/null +++ b/VisualC++/ExerciseBook/05.32.1/GList-HT.c @@ -0,0 +1,418 @@ +/*============================ + * ͷβ洢ʾ + * + * 㷨: 5.55.65.75.8 + =============================*/ + +#include "GList-HT.h" //**05 ͹**// + +/* + * ʼ + * + * ʼյĹΪ0Ϊ1 + * + *ע + * Ҫÿһȥſ + */ +Status InitGList(GList* L) { + if(L == NULL) { + return ERROR; + } + + *L = NULL; + + return OK; +} + +/* + * 㷨5.7 + * + * + * + * ַSL + */ +Status CreateGList(GList* L, SString S) { + SString emp; // չַ + SString hsub, sub; + GList p, q; + + if(L == NULL) { + return ERROR; + } + + // ַSеĿհףɴӡַո + ClearBlank(S); + + if(StrEmpty(S)) { + return ERROR; + } + + StrAssign(emp, "()"); + + /* + * 봮Ϊ()ҪյĹ + * + *ע + * ̲Ĵġ + * StrCompareķֵָʾַĴСָʾַǷȡ + * S()ȣֵӦ0 + */ + if(!StrCompare(S, emp)) { + *L = NULL; + } else { + *L = (GList) malloc(sizeof(GLNode)); + if(*L == NULL) { + exit(OVERFLOW); + } + + // ԭ + if(StrLength(S) == 1) { + (*L)->tag = Atom; + (*L)->Node.atom = S[1]; + } else { + (*L)->tag = List; + + p = *L; + + // ȥ + SubString(sub, S, 2, StrLength(S) - 2); + + // ظnӱ + do { + // subзͷhsubɺsubҲᷢ仯 + sever(hsub, sub); + + // ݹ鴴 + CreateGList(&(p->Node.ptr.hp), hsub); + + q = p; + + // βΪգҪβ + if(!StrEmpty(sub)) { + p = (GList) malloc(sizeof(GLNode)); + if(p == NULL) { + exit(OVERFLOW); + } + + p->tag = List; + + q->Node.ptr.tp = p; + } + } while(!StrEmpty(sub)); + + q->Node.ptr.tp = NULL; + } + } + + return OK; +} + +/* + * + * + * ͷŹռڴ档 + */ +Status DestroyGList(GList* L) { + GList head, tail; + + if(L == NULL || *L == NULL) { + return ERROR; + } + + // ɾԭӽ + if((*L)->tag == Atom) { + free(*L); + *L = NULL; + + // ɾӱ + } else { + head = (*L)->Node.ptr.hp; + tail = (*L)->Node.ptr.tp; + free(*L); + *L = NULL; + DestroyGList(&head); + DestroyGList(&tail); + } + + return OK; +} + +/* + * 㷨5.6 + * + * + * + * ɹLƵõT + */ +Status CopyGList(GList* T, GList L) { + if(T == NULL) { + return ERROR; + } + + if(L == NULL) { + *T = NULL; + } else { + // ½ + *T = (GList) malloc(sizeof(GLNode)); + if(*T == NULL) { + exit(OVERFLOW); + } + + (*T)->tag = L->tag; + + // Ƶԭ + if(L->tag == Atom) { + (*T)->Node.atom = L->Node.atom; + + // Ʊͷͱβ + } else { + CopyGList(&((*T)->Node.ptr.hp), L->Node.ptr.hp); + CopyGList(&((*T)->Node.ptr.tp), L->Node.ptr.tp); + } + } + + return OK; +} + +/* + * + * + * عijȡ + */ +int GListLength(GList L) { + int count; + + for(count = 0; L != NULL; count++, L = L->Node.ptr.tp) { + } + + return count; +} + +/* + * 㷨5.5 + * + * + * + * ع + */ +int GListDepth(GList L) { + int max, deep; + GList p; + + // ձΪ1 + if(L == NULL) { + return 1; + } + + // ԭΪ0 + if(L->tag == Atom) { + return 0; + } + + // ݹӱ + for(max = 0, p = L; p != NULL; p = p->Node.ptr.tp) { + deep = GListDepth(p->Node.ptr.hp); + if(deep > max) { + max = deep; + } + } + + // ǿձǸԪȼһ + return max + 1; +} + +/* + * п + * + * жϹǷΪա + */ +Status GListEmpty(GList L) { + return L == NULL ? TRUE : FALSE; +} + +/* + * ͷ + */ +GList GetHead(GList L) { + GList p; + + // ձޱͷﲻܷNULLȻֲʧ˻Ƿ˿ձ + if(L == NULL) { + exit(ERROR); + } + + CopyGList(&p, L->Node.ptr.hp); + + return p; +} + +/* + * β + */ +GList GetTail(GList L) { + GList p; + + // ձޱβﲻܷNULLȻֲʧ˻Ƿ˿ձ + if(L == NULL) { + exit(ERROR); + } + + CopyGList(&p, L->Node.ptr.tp); + + return p; +} + +/* + * + * + * ԪeΪLĵһԪء + */ +Status InsertFirst(GList* L, GList e) { + GList g; + + if(L == NULL) { + return ERROR; + } + + g = (GList) malloc(sizeof(GLNode)); + if(g == NULL) { + exit(OVERFLOW); + } + + g->tag = List; + g->Node.ptr.hp = e; + g->Node.ptr.tp = *L; + *L = g; + + return OK; +} + +/* + * ɾ + * + * LĵһԪɾeء + */ +Status DeleteFirst(GList* L, GList* e) { + GList p; + + // ձ޷ɾ + if(L == NULL || *L == NULL) { + return ERROR; + } + + p = *L; + *L = (*L)->Node.ptr.tp; + + CopyGList(e, p->Node.ptr.hp); + + free(p); + + return OK; +} + +/* + * + * + * visitʹL + */ +void Traverse(GList L, void(Visit)(AtomType)) { + + if(L == NULL) { + return; + } + + if(L->tag == Atom) { + Visit(L->Node.atom); + } else { + Traverse(L->Node.ptr.hp, Visit); + Traverse(L->Node.ptr.tp, Visit); + } + +} + +/* + * ͼλ + * + * L + */ +void PrintGraph(GList L) { + Print(L, Head); + printf("\n"); +} + +/* + * ͼλڲʵ֣markͼλǡ + */ +static void Print(GList L, Mark mark) { + // LΪ + if(L == NULL) { + if(mark == Head) { + printf("("); + } + + printf(")"); + + // LΪʱ + } else { + // ԭӽ㣬ԭ + if(L->tag == Atom) { + printf("%c", L->Node.atom); + + // ӱ㣬ҪԱͷβֱ + } else { + if(mark == Head) { + printf("("); + } else { + printf(","); + } + + Print(L->Node.ptr.hp, Head); + Print(L->Node.ptr.tp, Tail); + } + } +} + +/* + * 㷨5.8 + * + * ǿմstrָ֣hsubΪһ','֮ǰӴstrΪһ','֮Ӵ + * + *ע + * 1.ַstrȷ޿հ׷ţstrѾȥš + * 2.ɺstrҲᷢ仯 + */ +static void sever(SString hstr, SString str) { + int i, k, n; + SString ch; + + n = StrLength(str); + + i = 0; // ַʱα + k = 0; // δ + + do { + ++i; + + // ȡstrһַ + SubString(ch, str, i, 1); + + if(ch[1] == '(') { + ++k; + } + + if(ch[1] == ')') { + --k; + } + } while(i < n && (ch[1] != ',' || k != 0)); + + // ڶ + if(i < n) { + SubString(hstr, str, 1, i - 1); + SubString(str, str, i + 1, n - i); + + // ֻһ + } else { + StrCopy(hstr, str); + ClearString(str); + } +} diff --git a/VisualC++/ExerciseBook/05.32.1/GList-HT.h b/VisualC++/ExerciseBook/05.32.1/GList-HT.h new file mode 100644 index 0000000..508b96f --- /dev/null +++ b/VisualC++/ExerciseBook/05.32.1/GList-HT.h @@ -0,0 +1,164 @@ +/*============================ + * ͷβ洢ʾ + * + * 㷨: 5.55.65.75.8 + =============================*/ + +#ifndef GLIST_HT_H +#define GLIST_HT_H + +#include +#include // ṩ mallocreallocfreeexit ԭ +#include "Status.h" //**01 **// +#include "SString.h" //**04 **// + +/* ԭԪ */ +typedef char AtomType; + +/* + * + * + * Atom-0ԭӽ + * List-1 + */ +typedef enum { Atom, List } ElemTag; + +/* ͷβ洢ʾͶ */ +typedef struct GLNode { + ElemTag tag; // ǣԭӽͱ + + // ԭӽͱϲ + union { + AtomType atom; // atomԭӽֵAtomTypeû + struct { + struct GLNode* hp; // ָͷ + struct GLNode* tp; // ָβ + } ptr; // ָ + } Node; +} GLNode; + +/* */ +typedef GLNode* GList; + +/* + * ͼλ + * + * HeadָԱͷ + * TailָԱβ + */ +typedef enum { Head, Tail } Mark; + + +/* + * ʼ + * + * ʼյĹΪ0Ϊ1 + * + *ע + * Ҫÿһȥſ + */ +Status InitGList(GList* L); + +/* + * 㷨5.7 + * + * + * + * ַSL + */ +Status CreateGList(GList* L, SString S); + +/* + * + * + * ͷŹռڴ档 + */ +Status DestroyGList(GList* L); + +/* + * 㷨5.6 + * + * + * + * ɹLƵõT + */ +Status CopyGList(GList* T, GList L); + +/* + * + * + * عijȡ + */ +int GListLength(GList L); + +/* + * 㷨5.5 + * + * + * + * ع + */ +int GListDepth(GList L); + +/* + * п + * + * жϹǷΪա + */ +Status GListEmpty(GList L); + +/* + * ͷ + */ +GList GetHead(GList L); + +/* + * β + */ +GList GetTail(GList L); + +/* + * + * + * ԪeΪLĵһԪء + */ +Status InsertFirst(GList* L, GList e); + +/* + * ɾ + * + * LĵһԪɾeء + */ +Status DeleteFirst(GList* L, GList* e); + +/* + * + * + * visitʹL + */ +void Traverse(GList L, void (Visit)(AtomType)); + +/* + * ͼλ + * + * L + */ +void PrintGraph(GList L); + +/* + * ͼλڲʵ֣markͼλǡ + */ +static void Print(GList L, Mark mark); + +/* + * 㷨5.8 + * + * ǿմstrָ֣hsubΪһ','֮ǰӴstrΪһ','֮Ӵ + * + *ע + * 1.ַstrȷ޿հ׷ţstrѾȥš + * 2.ɺstrҲᷢ仯 + */ +static void sever(SString hstr, SString str); + +#endif diff --git a/VisualC++/ExerciseBook/05.32.1/SString.c b/VisualC++/ExerciseBook/05.32.1/SString.c new file mode 100644 index 0000000..7a96fcf --- /dev/null +++ b/VisualC++/ExerciseBook/05.32.1/SString.c @@ -0,0 +1,195 @@ +/*============================= + * Ķ˳洢ʾ˳򴮣 + * + * 㷨: 4.14.24.34.5 + ==============================*/ + +#include "SString.h" //**04 **// + +/* + * ʼ + * + * һֵΪcharsĴT + * + *ע + * òСӼ + */ +Status StrAssign(SString T, const char* chars) { + int i, len; + + len = (int) strlen(chars); + + // chars + if(len > MAXSTRLEN) { + return ERROR; + } + + T[0] = len; + for(i = 1; i <= len; i++) { + T[i] = chars[i - 1]; + } + + return OK; +} + +/* + * + * + * Sա + */ +Status ClearString(SString S) { + // ֻҪΪ0Ϳ + S[0] = 0; + return OK; +} + +/* + * п + * + * жϴSǷЧݡ + * + * ֵ + * TRUE : SΪ + * FALSE: SΪ + */ +Status StrEmpty(SString S) { + return S[0] == 0 ? TRUE : FALSE; +} + +/* + * + * + * شSԪصĸ + * + *ע + * òСӼ + */ +int StrLength(SString S) { + return S[0]; +} + +/* + * 㷨4.3 + * + * Ӵ + * + * SubS[pos, pos+len-1] + * ֵָʾǷȡɹ + * + *ע + * òСӼ + */ +Status SubString(SString Sub, SString S, int pos, int len) { + int i; + + if(pos < 1 || pos > S[0] || len < 0 || pos + len - 1 > S[0]) { + return ERROR; + } + + // Ԫ + for(i = 1; i <= len; i++) { + Sub[i] = S[pos + i - 1]; + } + + // ȷ³ + Sub[0] = len; + + return OK; +} + +/* + * ɾ + * + * ɾS[pos, pos+len-1] + */ +Status StrDelete(SString S, int pos, int len) { + int i; + + if(pos < 1 || pos + len - 1 > S[0] || len < 0) { + return ERROR; + } + + // ɾijΪ0ǰ + if(len == 0) { + return OK; + } + + // ѺԪŲǰ棬ǵɾԪ + for(i = pos + len; i <= S[0]; i++) { + S[i - len] = S[i]; + } + + // ȼ + S[0] -= len; + + return OK; +} + +/* + * Ƚ + * + * ȽϴSʹTرȽϽ + * + *ע + * òСӼ + */ +int StrCompare(SString S, SString T) { + int i = 1; + + while(i <= S[0] && i <= T[0]) { + // ַͬʱȽС + if(S[i] != T[i]) { + return S[i] - T[i]; + } + + i++; + } + + return S[0] - T[0]; +} + +/* + * + * + * SƵT + */ +Status StrCopy(SString T, SString S) { + int i; + + // ͬϢһ + for(i = 0; i <= S[0]; i++) { + T[i] = S[i]; + } + + return OK; +} + +/* + * ַSеĿհףɴӡַո + * + *ע + * úڱġ + */ +Status ClearBlank(SString S) { + int i, j; + + // ǿմ + if(S[0] == 0) { + return ERROR; + } + + for(i = 1, j = 0; i <= S[0]; i++) { + // հףԹ + if(S[i] == ' ' || !isprint(S[i])) { + continue; + } + + j++; + + S[j] = S[i]; + } + + S[0] = j; + + return OK; +} diff --git a/VisualC++/ExerciseBook/05.32.1/SString.h b/VisualC++/ExerciseBook/05.32.1/SString.h new file mode 100644 index 0000000..0632f18 --- /dev/null +++ b/VisualC++/ExerciseBook/05.32.1/SString.h @@ -0,0 +1,117 @@ +/*============================= + * Ķ˳洢ʾ˳򴮣 + * + * 㷨: 4.14.24.34.5 + ==============================*/ + +#ifndef SSTRING_H +#define SSTRING_H + +#include +#include // ṩ strlen ԭ +#include // ṩ isprint ԭ +#include "Status.h" //**01 **// + +/* 궨 */ +#define MAXSTRLEN 255 // ˳򴮵󴮳 + +/* + * ˳洢Ͷ + * + * עЧԪشSString1ŵԪʼ洢 + * SString0ŵԪ洢䳤 + */ +typedef unsigned char SString[MAXSTRLEN + 1]; // 0ŵԪŴij + + +/* + * ʾ + * + * ѭ̲ĵдϰߣposָʾַλ()1ʼ + */ + + +/* + * ʼ + * + * һֵΪcharsĴT + * + *ע + * òСӼ + */ +Status StrAssign(SString T, const char* chars); + +/* + * + * + * Sա + */ +Status ClearString(SString S); + +/* + * п + * + * жϴSǷЧݡ + * + * ֵ + * TRUE : SΪ + * FALSE: SΪ + */ +Status StrEmpty(SString S); + +/* + * + * + * شSԪصĸ + * + *ע + * òСӼ + */ +int StrLength(SString S); + +/* + * 㷨4.3 + * + * Ӵ + * + * SubS[pos, pos+len-1] + * ֵָʾǷȡɹ + * + *ע + * òСӼ + */ +Status SubString(SString Sub, SString S, int pos, int len); + +/* + * ɾ + * + * ɾS[pos, pos+len-1] + */ +Status StrDelete(SString S, int pos, int len); + +/* + * Ƚ + * + * ȽϴSʹTرȽϽ + * + *ע + * òСӼ + */ +int StrCompare(SString S, SString T); + +/* + * + * + * SƵT + */ +Status StrCopy(SString T, SString S); + +/* + * ַSеĿհףɴӡַո + * + *ע + * úڱġ + */ +Status ClearBlank(SString S); + +#endif diff --git a/VisualC++/ExerciseBook/05.32.2/05.32.2.c b/VisualC++/ExerciseBook/05.32.2/05.32.2.c new file mode 100644 index 0000000..adc2453 --- /dev/null +++ b/VisualC++/ExerciseBook/05.32.2/05.32.2.c @@ -0,0 +1,66 @@ +#include +#include "Status.h" //**01 **// +#include "SString.h" //**04 **// +#include "GList-E.h" //**05 ͹**// + +/* + * жϹǷȣչ洢ʾ + */ +Status Algo_5_32_2(GList A, GList B); + + +int main(int argc, char* argv[]) { + GList A, B; + char* a = "((),(e),(a,(b,c,d)))"; + char* b = "((),(e),(a,(b,c,f)))"; + SString Sa, Sb; + + printf(" AB ...\n"); + StrAssign(Sa, a); + CreateGList(&A, Sa); + StrAssign(Sb, b); + CreateGList(&B, Sb); + printf("A = "); + PrintGraph(A); + printf("B = "); + PrintGraph(B); + + Algo_5_32_2(A, B) ? printf("ȣ\n") : printf("ȣ\n"); + + return 0; +} + + +/* + * жϹǷȣչ洢ʾ + */ +Status Algo_5_32_2(GList A, GList B) { + if(!A && !B) { + return TRUE; // ձ + } + + // Ϊ + if(A && B) { + // Ԫͬ + if(A->tag == B->tag) { + // ԭӽ + if(A->tag == Atom) { + if(A->Node.atom == B->Node.atom) { + if(Algo_5_32_2(A->tp, B->tp) == TRUE) { + return TRUE; + } + } + + // + } else { + if(Algo_5_32_2(A->Node.hp, B->Node.hp) == TRUE) { + if(Algo_5_32_2(A->tp, B->tp) == TRUE) { + return TRUE; + } + } + } + } + } + + return FALSE; +} diff --git a/VisualC++/ExerciseBook/05.32.2/05.32.2.vcxproj b/VisualC++/ExerciseBook/05.32.2/05.32.2.vcxproj new file mode 100644 index 0000000..b451459 --- /dev/null +++ b/VisualC++/ExerciseBook/05.32.2/05.32.2.vcxproj @@ -0,0 +1,78 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {2C7DDD17-6590-4684-826B-AEC0A0E4221A} + My05322 + + + + 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/05.32.2/05.32.2.vcxproj.filters b/VisualC++/ExerciseBook/05.32.2/05.32.2.vcxproj.filters new file mode 100644 index 0000000..2fef25a --- /dev/null +++ b/VisualC++/ExerciseBook/05.32.2/05.32.2.vcxproj.filters @@ -0,0 +1,36 @@ + + + + + {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/05.32.2/05.32.2.vcxproj.user b/VisualC++/ExerciseBook/05.32.2/05.32.2.vcxproj.user new file mode 100644 index 0000000..ace9a86 --- /dev/null +++ b/VisualC++/ExerciseBook/05.32.2/05.32.2.vcxproj.user @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/05.32.2/GList-E.c b/VisualC++/ExerciseBook/05.32.2/GList-E.c new file mode 100644 index 0000000..3fc0ad9 --- /dev/null +++ b/VisualC++/ExerciseBook/05.32.2/GList-E.c @@ -0,0 +1,449 @@ +/*=========================== + * չ洢ʾ + ============================*/ + +#include "GList-E.h" //**05 ͹**// + +/* + * ʼ + * + * ʼյĹΪ0Ϊ1 + * + *ע + * Ҫÿһſ + */ +Status InitGList(GList* L) { + if(L == NULL) { + return ERROR; + } + + *L = (GList) malloc(sizeof(GLNode)); + if(!*L) { + exit(OVERFLOW); + } + + (*L)->tag = List; + (*L)->Node.hp = NULL; + (*L)->tp = NULL; + + return OK; +} + +/* + * + * + * ַSL + */ +Status CreateGList(GList* L, SString S) { + SString emp, hsub, sub, tmp; + + if(L == NULL) { + return ERROR; + } + + // ַSеĿհףɴӡַո + ClearBlank(S); + + if(StrEmpty(S)) { + return ERROR; + } + + // Ϊ˲ƻS + StrCopy(sub, S); + + /* + * ִеʱ + * ٴִеʱѾȥ + */ + sever(hsub, sub); + + *L = (GList) malloc(sizeof(GLNode)); + if(*L == NULL) { + exit(OVERFLOW); + } + + StrAssign(emp, "()"); + + if(!StrCompare(hsub, emp)) { + (*L)->tag = List; + (*L)->Node.hp = NULL; + } else { + if(StrLength(hsub) == 1) { + (*L)->tag = Atom; + (*L)->Node.atom = hsub[1]; + } else { + (*L)->tag = List; + + SubString(tmp, hsub, 2, StrLength(hsub) - 2); + + CreateGList(&((*L)->Node.hp), tmp); + } + } + + // ڶβ˳ݹ + if(StrEmpty(sub)) { + (*L)->tp = NULL; + } else { + // ݹβ + CreateGList(&((*L)->tp), sub); + } + + return OK; +} + +/* + * + * + * ͷŹռڴ档 + */ +Status DestroyGList(GList* L) { + GList head, tail; + + if(L == NULL || *L == NULL) { + return ERROR; + } + + // ӱ + if((*L)->tag == List) { + head = (*L)->Node.hp; // ͷ + tail = (*L)->tp; // β + + free(*L); + *L = NULL; + + // ݹ鴦ͷ + if(head != NULL) { + DestroyGList(&head); + } + + // ݹ鴦β + if(tail != NULL) { + DestroyGList(&tail); + } + + // ԭӽ + } else { + tail = (*L)->tp; // β + + free(*L); + *L = NULL; + + if(tail != NULL) { + DestroyGList(&tail); + } + } + + return OK; +} + +/* + * + * + * ɹLƵõT + */ +Status CopyGList(GList* T, GList L) { + + if(L == NULL) { + return ERROR; + } + + *T = (GList) malloc(sizeof(GLNode)); + if(*T == NULL) { + exit(OVERFLOW); + } + + // ԭ + if(L->tag == Atom) { + (*T)->tag = Atom; + (*T)->Node.atom = L->Node.atom; + + // ӱ + } else { + (*T)->tag = List; + + // Ʊͷ + if(L->Node.hp != NULL) { + CopyGList(&((*T)->Node.hp), L->Node.hp); + } else { + (*T)->Node.hp = NULL; + } + } + + // Ʊβ + if(L->tp != NULL) { + CopyGList(&((*T)->tp), L->tp); + } else { + (*T)->tp = NULL; + } + + return OK; +} + +/* + * + * + * عijȡ + */ +int GListLength(GList L) { + int count = 0; + GList p; + + // + if(L == NULL) { + return -1; + } + + p = L->Node.hp; + + while(p != NULL) { + ++count; + p = p->tp; + } + + return count; +} + +/* + * + * + * ع + */ +int GListDepth(GList L) { + int max, deep; + GList p; + + max = 0; + + // + if(L == NULL) { + return -1; + } + + // ձΪ1 + if(L->tag == List && !L->Node.hp) { + return 1; + } + + // ԭΪ0 + if(L->tag == Atom) { + return 0; + } + + // ݹӱ + for(p = L->Node.hp; p != NULL; p = p->tp) { + // pΪͷָӱ + deep = GListDepth(p); + if(deep > max) { + max = deep; + } + } + + return max + 1; +} + +/* + * п + * + * жϹǷΪա + */ +Status GListEmpty(GList L) { + // + if(L == NULL) { + return ERROR; + } + + if(L->tag == List && L->Node.hp == NULL && L->tp == NULL) { + return TRUE; + } else { + return ERROR; + } +} + +/* + * ͷ + */ +GList GetHead(GList L) { + GList p, q; + + // ڻΪձ޷ȡͷ + if(L == NULL || L->Node.hp == NULL) { + return NULL; + } + + q = L->Node.hp->tp; // ʱLıβϢ + L->Node.hp->tp = NULL; // ȥLıβ + + CopyGList(&p, L->Node.hp); // ƱͷϢαβ + + L->Node.hp->tp = q; // ָLıβϢ + + return p; +} + +/* + * β + */ +GList GetTail(GList L) { + GList p, q; + + // ڻΪձ޷ȡβ + if(L == NULL || L->Node.hp == NULL) { + return NULL; + } + + q = L->Node.hp; // ʱLıͷϢ + L->Node.hp = q->tp; // ժLıͷ + + CopyGList(&p, L); // ƱβϢαͷ + + q->tp = L->Node.hp; // ָLıͷϢ + L->Node.hp = q; + + return p; +} + +/* + * + * + * ԪeΪLĵһԪء + */ +Status InsertFirst(GList* L, GList e) { + + // + if(L == NULL || *L == NULL) { + return ERROR; + } + + if(e == NULL) { + return ERROR; + } + + e->tp = (*L)->Node.hp; + (*L)->Node.hp = e; + + return OK; +} + +/* + * ɾ + * + * LĵһԪɾeء + */ +Status DeleteFirst(GList* L, GList* e) { + GList p; + + // ڻΪձ޷ɾͷ + if(*L == NULL || (*L)->Node.hp == NULL) { + return ERROR; + } + + p = (*L)->Node.hp; + (*L)->Node.hp = p->tp; + p->tp = NULL; + + *e = p; + + return OK; +} + +/* + * + * + * visitʹL + */ +void Traverse(GList L, void(Visit)(AtomType)) { + if(L == NULL) { + return; + } + + if(L->tag == List) { + Traverse(L->Node.hp, Visit); + } else { + Visit(L->Node.atom); + } + + Traverse(L->tp, Visit); +} + +/* + * ͼλ + * + * L + */ +void PrintGraph(GList L) { + Print(L); + printf("\n"); +} + +/* + * ͼλڲʵ֡ + */ +static void Print(GList L) { + if(L == NULL) { + return; + } + + // + if(L->tag == List) { + printf("("); + + if(L->Node.hp) { + Print(L->Node.hp); + } + + if(L->tp) { + printf("),"); + Print(L->tp); + } else { + printf(")"); + } + + // ԭӽ + } else { + printf("%c", L->Node.atom); + if(L->tp) { + printf(","); + Print(L->tp); + } + } +} + +/* + * ǿմstrָ֣hsubΪһ','֮ǰӴstrΪһ','֮Ӵ + * + *ע + * 1.ַstrȷ޿հ׷ţ + * strſȥҲδȥ + * 2.ɺstrҲᷢ仯 + */ +static void sever(SString hstr, SString str) { + int i, k, n; + SString ch; + + n = StrLength(str); + + i = 0; // ַʱα + k = 0; // δ + + do { + ++i; + + // ȡstrһַ + SubString(ch, str, i, 1); + + if(ch[1] == '(') { + ++k; + } + if(ch[1] == ')') { + --k; + } + } while(i < n && (ch[1] != ',' || k != 0)); + + if(i < n) { + SubString(hstr, str, 1, i - 1); + SubString(str, str, i + 1, n - i); + } else { + StrCopy(hstr, str); + ClearString(str); + } +} diff --git a/VisualC++/ExerciseBook/05.32.2/GList-E.h b/VisualC++/ExerciseBook/05.32.2/GList-E.h new file mode 100644 index 0000000..fa9af82 --- /dev/null +++ b/VisualC++/ExerciseBook/05.32.2/GList-E.h @@ -0,0 +1,146 @@ +/*=========================== + * չ洢ʾ + ============================*/ + +#ifndef GLIST_E_H +#define GLIST_E_H + +#include +#include // ṩ mallocreallocfreeexit ԭ +#include "Status.h" //**01 **// +#include "SString.h" //**04 **// + +/* ԭԪ */ +typedef char AtomType; //ԭ + +/* + * + * + * Atom-0ԭӽ + * List-1 + */ +typedef enum { Atom, List } ElemTag; + +/* չ洢ʾͶ */ +typedef struct GLNode { + ElemTag tag; // ǣԭӽͱ + + // ԭӽͱϲ + union + { + AtomType atom; // atomԭӽֵAtomTypeû + struct GLNode* hp; // ָͷ + } Node; + struct GLNode* tp; // ָβ +} GLNode; + +/* */ +typedef GLNode* GList; + + +/* + * ʼ + * + * ʼյĹΪ0Ϊ1 + * + *ע + * Ҫÿһſ + */ +Status InitGList(GList* L); + +/* + * + * + * ַSL + */ +Status CreateGList(GList* L, SString S); + +/* + * + * + * ͷŹռڴ档 + */ +Status DestroyGList(GList* L); + +/* + * + * + * ɹLƵõT + */ +Status CopyGList(GList* T, GList L); + +/* + * + * + * عijȡ + */ +int GListLength(GList L); + +/* + * + * + * ع + */ +int GListDepth(GList L); + +/* + * п + * + * жϹǷΪա + */ +Status GListEmpty(GList L); + +/* + * ͷ + */ +GList GetHead(GList L); + +/* + * β + */ +GList GetTail(GList L); + +/* + * + * + * ԪeΪLĵһԪء + */ +Status InsertFirst(GList* L, GList e); + +/* + * ɾ + * + * LĵһԪɾeء + */ +Status DeleteFirst(GList* L, GList* e); + +/* + * + * + * visitʹL + */ +void Traverse(GList L, void(Visit)(AtomType)); + +/* + * ͼλ + * + * L + */ +void PrintGraph(GList L); + +/* + * ͼλڲʵ֡ + */ +static void Print(GList L); + +/* + * ǿմstrָ֣hsubΪһ','֮ǰӴstrΪһ','֮Ӵ + * + *ע + * 1.ַstrȷ޿հ׷ţ + * strſȥҲδȥ + * 2.ɺstrҲᷢ仯 + */ +static void sever(SString hstr, SString str); + +#endif diff --git a/VisualC++/ExerciseBook/05.32.2/SString.c b/VisualC++/ExerciseBook/05.32.2/SString.c new file mode 100644 index 0000000..7a96fcf --- /dev/null +++ b/VisualC++/ExerciseBook/05.32.2/SString.c @@ -0,0 +1,195 @@ +/*============================= + * Ķ˳洢ʾ˳򴮣 + * + * 㷨: 4.14.24.34.5 + ==============================*/ + +#include "SString.h" //**04 **// + +/* + * ʼ + * + * һֵΪcharsĴT + * + *ע + * òСӼ + */ +Status StrAssign(SString T, const char* chars) { + int i, len; + + len = (int) strlen(chars); + + // chars + if(len > MAXSTRLEN) { + return ERROR; + } + + T[0] = len; + for(i = 1; i <= len; i++) { + T[i] = chars[i - 1]; + } + + return OK; +} + +/* + * + * + * Sա + */ +Status ClearString(SString S) { + // ֻҪΪ0Ϳ + S[0] = 0; + return OK; +} + +/* + * п + * + * жϴSǷЧݡ + * + * ֵ + * TRUE : SΪ + * FALSE: SΪ + */ +Status StrEmpty(SString S) { + return S[0] == 0 ? TRUE : FALSE; +} + +/* + * + * + * شSԪصĸ + * + *ע + * òСӼ + */ +int StrLength(SString S) { + return S[0]; +} + +/* + * 㷨4.3 + * + * Ӵ + * + * SubS[pos, pos+len-1] + * ֵָʾǷȡɹ + * + *ע + * òСӼ + */ +Status SubString(SString Sub, SString S, int pos, int len) { + int i; + + if(pos < 1 || pos > S[0] || len < 0 || pos + len - 1 > S[0]) { + return ERROR; + } + + // Ԫ + for(i = 1; i <= len; i++) { + Sub[i] = S[pos + i - 1]; + } + + // ȷ³ + Sub[0] = len; + + return OK; +} + +/* + * ɾ + * + * ɾS[pos, pos+len-1] + */ +Status StrDelete(SString S, int pos, int len) { + int i; + + if(pos < 1 || pos + len - 1 > S[0] || len < 0) { + return ERROR; + } + + // ɾijΪ0ǰ + if(len == 0) { + return OK; + } + + // ѺԪŲǰ棬ǵɾԪ + for(i = pos + len; i <= S[0]; i++) { + S[i - len] = S[i]; + } + + // ȼ + S[0] -= len; + + return OK; +} + +/* + * Ƚ + * + * ȽϴSʹTرȽϽ + * + *ע + * òСӼ + */ +int StrCompare(SString S, SString T) { + int i = 1; + + while(i <= S[0] && i <= T[0]) { + // ַͬʱȽС + if(S[i] != T[i]) { + return S[i] - T[i]; + } + + i++; + } + + return S[0] - T[0]; +} + +/* + * + * + * SƵT + */ +Status StrCopy(SString T, SString S) { + int i; + + // ͬϢһ + for(i = 0; i <= S[0]; i++) { + T[i] = S[i]; + } + + return OK; +} + +/* + * ַSеĿհףɴӡַո + * + *ע + * úڱġ + */ +Status ClearBlank(SString S) { + int i, j; + + // ǿմ + if(S[0] == 0) { + return ERROR; + } + + for(i = 1, j = 0; i <= S[0]; i++) { + // հףԹ + if(S[i] == ' ' || !isprint(S[i])) { + continue; + } + + j++; + + S[j] = S[i]; + } + + S[0] = j; + + return OK; +} diff --git a/VisualC++/ExerciseBook/05.32.2/SString.h b/VisualC++/ExerciseBook/05.32.2/SString.h new file mode 100644 index 0000000..0632f18 --- /dev/null +++ b/VisualC++/ExerciseBook/05.32.2/SString.h @@ -0,0 +1,117 @@ +/*============================= + * Ķ˳洢ʾ˳򴮣 + * + * 㷨: 4.14.24.34.5 + ==============================*/ + +#ifndef SSTRING_H +#define SSTRING_H + +#include +#include // ṩ strlen ԭ +#include // ṩ isprint ԭ +#include "Status.h" //**01 **// + +/* 궨 */ +#define MAXSTRLEN 255 // ˳򴮵󴮳 + +/* + * ˳洢Ͷ + * + * עЧԪشSString1ŵԪʼ洢 + * SString0ŵԪ洢䳤 + */ +typedef unsigned char SString[MAXSTRLEN + 1]; // 0ŵԪŴij + + +/* + * ʾ + * + * ѭ̲ĵдϰߣposָʾַλ()1ʼ + */ + + +/* + * ʼ + * + * һֵΪcharsĴT + * + *ע + * òСӼ + */ +Status StrAssign(SString T, const char* chars); + +/* + * + * + * Sա + */ +Status ClearString(SString S); + +/* + * п + * + * жϴSǷЧݡ + * + * ֵ + * TRUE : SΪ + * FALSE: SΪ + */ +Status StrEmpty(SString S); + +/* + * + * + * شSԪصĸ + * + *ע + * òСӼ + */ +int StrLength(SString S); + +/* + * 㷨4.3 + * + * Ӵ + * + * SubS[pos, pos+len-1] + * ֵָʾǷȡɹ + * + *ע + * òСӼ + */ +Status SubString(SString Sub, SString S, int pos, int len); + +/* + * ɾ + * + * ɾS[pos, pos+len-1] + */ +Status StrDelete(SString S, int pos, int len); + +/* + * Ƚ + * + * ȽϴSʹTرȽϽ + * + *ע + * òСӼ + */ +int StrCompare(SString S, SString T); + +/* + * + * + * SƵT + */ +Status StrCopy(SString T, SString S); + +/* + * ַSеĿհףɴӡַո + * + *ע + * úڱġ + */ +Status ClearBlank(SString S); + +#endif diff --git a/VisualC++/ExerciseBook/05.33.1/05.33.1.c b/VisualC++/ExerciseBook/05.33.1/05.33.1.c new file mode 100644 index 0000000..0ee6f53 --- /dev/null +++ b/VisualC++/ExerciseBook/05.33.1/05.33.1.c @@ -0,0 +1,47 @@ +#include +#include "SString.h" //**04 **// +#include "GList-HT.h" //**05 ͹**// + +/* + * ԭڲΣͷβ洢ʾ + */ +void Algo_5_33_1(GList L, int d); + + +int main(int argc, char* argv[]) { + GList L; + char* s = "((),(e),(a,(b,c,d)))"; + SString S; + + printf(" L ...\n"); + StrAssign(S, s); + CreateGList(&L, S); + printf("L = "); + PrintGraph(L); + + Algo_5_33_1(L, 0); + + return 0; +} + + +/* + * ԭڲΣͷβ洢ʾ + */ +void Algo_5_33_1(GList L, int d) { + int i = d; // dijֵֵΪ0 + + if(L == NULL) { + return; + } + + if(L->tag == Atom) { + printf("%c -> %d\n", L->Node.atom, i); + } + + // ͷָָĻһ + if(L->tag == List) { + Algo_5_33_1(L->Node.ptr.hp, i + 1); + Algo_5_33_1(L->Node.ptr.tp, i); + } +} diff --git a/VisualC++/ExerciseBook/05.33.1/05.33.1.vcxproj b/VisualC++/ExerciseBook/05.33.1/05.33.1.vcxproj new file mode 100644 index 0000000..5b205e9 --- /dev/null +++ b/VisualC++/ExerciseBook/05.33.1/05.33.1.vcxproj @@ -0,0 +1,78 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {4862063F-4D32-4C02-AF63-35381605EDFE} + My05331 + + + + 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/05.33.1/05.33.1.vcxproj.filters b/VisualC++/ExerciseBook/05.33.1/05.33.1.vcxproj.filters new file mode 100644 index 0000000..313eca2 --- /dev/null +++ b/VisualC++/ExerciseBook/05.33.1/05.33.1.vcxproj.filters @@ -0,0 +1,36 @@ + + + + + {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/05.33.1/05.33.1.vcxproj.user b/VisualC++/ExerciseBook/05.33.1/05.33.1.vcxproj.user new file mode 100644 index 0000000..ace9a86 --- /dev/null +++ b/VisualC++/ExerciseBook/05.33.1/05.33.1.vcxproj.user @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/05.33.1/GList-HT.c b/VisualC++/ExerciseBook/05.33.1/GList-HT.c new file mode 100644 index 0000000..bad30df --- /dev/null +++ b/VisualC++/ExerciseBook/05.33.1/GList-HT.c @@ -0,0 +1,418 @@ +/*============================ + * ͷβ洢ʾ + * + * 㷨: 5.55.65.75.8 + =============================*/ + +#include "GList-HT.h" //**05 ͹**// + +/* + * ʼ + * + * ʼյĹΪ0Ϊ1 + * + *ע + * Ҫÿһȥſ + */ +Status InitGList(GList* L) { + if(L == NULL) { + return ERROR; + } + + *L = NULL; + + return OK; +} + +/* + * 㷨5.7 + * + * + * + * ַSL + */ +Status CreateGList(GList* L, SString S) { + SString emp; // չַ + SString hsub, sub; + GList p, q; + + if(L == NULL) { + return ERROR; + } + + // ַSеĿհףɴӡַո + ClearBlank(S); + + if(StrEmpty(S)) { + return ERROR; + } + + StrAssign(emp, "()"); + + /* + * 봮Ϊ()ҪյĹ + * + *ע + * ̲Ĵġ + * StrCompareķֵָʾַĴСָʾַǷȡ + * S()ȣֵӦ0 + */ + if(!StrCompare(S, emp)) { + *L = NULL; + } else { + *L = (GList) malloc(sizeof(GLNode)); + if(*L == NULL) { + exit(OVERFLOW); + } + + // ԭ + if(StrLength(S) == 1) { + (*L)->tag = Atom; + (*L)->Node.atom = S[1]; + } else { + (*L)->tag = List; + + p = *L; + + // ȥ + SubString(sub, S, 2, StrLength(S) - 2); + + // ظnӱ + do { + // subзͷhsubɺsubҲᷢ仯 + sever(hsub, sub); + + // ݹ鴴 + CreateGList(&(p->Node.ptr.hp), hsub); + + q = p; + + // βΪգҪβ + if(!StrEmpty(sub)) { + p = (GList) malloc(sizeof(GLNode)); + if(p == NULL) { + exit(OVERFLOW); + } + + p->tag = List; + + q->Node.ptr.tp = p; + } + } while(!StrEmpty(sub)); + + q->Node.ptr.tp = NULL; + } + } + + return OK; +} + +/* + * + * + * ͷŹռڴ档 + */ +Status DestroyGList(GList* L) { + GList head, tail; + + if(L == NULL || *L == NULL) { + return ERROR; + } + + // ɾԭӽ + if((*L)->tag == Atom) { + free(*L); + *L = NULL; + + // ɾӱ + } else { + head = (*L)->Node.ptr.hp; + tail = (*L)->Node.ptr.tp; + free(*L); + *L = NULL; + DestroyGList(&head); + DestroyGList(&tail); + } + + return OK; +} + +/* + * 㷨5.6 + * + * + * + * ɹLƵõT + */ +Status CopyGList(GList* T, GList L) { + if(T == NULL) { + return ERROR; + } + + if(L == NULL) { + *T = NULL; + } else { + // ½ + *T = (GList) malloc(sizeof(GLNode)); + if(*T == NULL) { + exit(OVERFLOW); + } + + (*T)->tag = L->tag; + + // Ƶԭ + if(L->tag == Atom) { + (*T)->Node.atom = L->Node.atom; + + // Ʊͷͱβ + } else { + CopyGList(&((*T)->Node.ptr.hp), L->Node.ptr.hp); + CopyGList(&((*T)->Node.ptr.tp), L->Node.ptr.tp); + } + } + + return OK; +} + +/* + * + * + * عijȡ + */ +int GListLength(GList L) { + int count; + + for(count = 0; L != NULL; count++, L = L->Node.ptr.tp) { + } + + return count; +} + +/* + * 㷨5.5 + * + * + * + * ع + */ +int GListDepth(GList L) { + int max, deep; + GList p; + + // ձΪ1 + if(L == NULL) { + return 1; + } + + // ԭΪ0 + if(L->tag == Atom) { + return 0; + } + + // ݹӱ + for(max = 0, p = L; p != NULL; p = p->Node.ptr.tp) { + deep = GListDepth(p->Node.ptr.hp); + if(deep > max) { + max = deep; + } + } + + // ǿձǸԪȼһ + return max + 1; +} + +/* + * п + * + * жϹǷΪա + */ +Status GListEmpty(GList L) { + return L == NULL ? TRUE : FALSE; +} + +/* + * ͷ + */ +GList GetHead(GList L) { + GList p; + + // ձޱͷﲻܷNULLȻֲʧ˻Ƿ˿ձ + if(L == NULL) { + exit(ERROR); + } + + CopyGList(&p, L->Node.ptr.hp); + + return p; +} + +/* + * β + */ +GList GetTail(GList L) { + GList p; + + // ձޱβﲻܷNULLȻֲʧ˻Ƿ˿ձ + if(L == NULL) { + exit(ERROR); + } + + CopyGList(&p, L->Node.ptr.tp); + + return p; +} + +/* + * + * + * ԪeΪLĵһԪء + */ +Status InsertFirst(GList* L, GList e) { + GList g; + + if(L == NULL) { + return ERROR; + } + + g = (GList) malloc(sizeof(GLNode)); + if(g == NULL) { + exit(OVERFLOW); + } + + g->tag = List; + g->Node.ptr.hp = e; + g->Node.ptr.tp = *L; + *L = g; + + return OK; +} + +/* + * ɾ + * + * LĵһԪɾeء + */ +Status DeleteFirst(GList* L, GList* e) { + GList p; + + // ձ޷ɾ + if(L == NULL || *L == NULL) { + return ERROR; + } + + p = *L; + *L = (*L)->Node.ptr.tp; + + CopyGList(e, p->Node.ptr.hp); + + free(p); + + return OK; +} + +/* + * + * + * visitʹL + */ +void Traverse(GList L, void(Visit)(AtomType)) { + + if(L == NULL) { + return; + } + + if(L->tag == Atom) { + Visit(L->Node.atom); + } else { + Traverse(L->Node.ptr.hp, Visit); + Traverse(L->Node.ptr.tp, Visit); + } + +} + +/* + * ͼλ + * + * L + */ +void PrintGraph(GList L) { + Print(L, Head); + printf("\n"); +} + +/* + * ͼλڲʵ֣markͼλǡ + */ +static void Print(GList L, Mark mark) { + // LΪ + if(L == NULL) { + if(mark == Head) { + printf("("); + } + + printf(")"); + + // LΪʱ + } else { + // ԭӽ㣬ԭ + if(L->tag == Atom) { + printf("%c", L->Node.atom); + + // ӱ㣬ҪԱͷβֱ + } else { + if(mark == Head) { + printf("("); + } else { + printf(","); + } + + Print(L->Node.ptr.hp, Head); + Print(L->Node.ptr.tp, Tail); + } + } +} + +/* + * 㷨5.8 + * + * ǿմstrָ֣hsubΪһ','֮ǰӴstrΪһ','֮Ӵ + * + *ע + * 1.ַstrȷ޿հ׷ţstrѾȥš + * 2.ɺstrҲᷢ仯 + */ +static void sever(SString hstr, SString str) { + int i, k, n; + SString ch; + + n = StrLength(str); + + i = 0; // ַʱα + k = 0; // δ + + do { + ++i; + + // ȡstrһַ + SubString(ch, str, i, 1); + + if(ch[1] == '(') { + ++k; + } + + if(ch[1] == ')') { + --k; + } + } while(i < n && (ch[1] != ',' || k != 0)); + + // ڶ + if(i < n) { + SubString(hstr, str, 1, i - 1); + SubString(str, str, i + 1, n - i); + + // ֻһ + } else { + StrCopy(hstr, str); + ClearString(str); + } +} diff --git a/VisualC++/ExerciseBook/05.33.1/GList-HT.h b/VisualC++/ExerciseBook/05.33.1/GList-HT.h new file mode 100644 index 0000000..508b96f --- /dev/null +++ b/VisualC++/ExerciseBook/05.33.1/GList-HT.h @@ -0,0 +1,164 @@ +/*============================ + * ͷβ洢ʾ + * + * 㷨: 5.55.65.75.8 + =============================*/ + +#ifndef GLIST_HT_H +#define GLIST_HT_H + +#include +#include // ṩ mallocreallocfreeexit ԭ +#include "Status.h" //**01 **// +#include "SString.h" //**04 **// + +/* ԭԪ */ +typedef char AtomType; + +/* + * + * + * Atom-0ԭӽ + * List-1 + */ +typedef enum { Atom, List } ElemTag; + +/* ͷβ洢ʾͶ */ +typedef struct GLNode { + ElemTag tag; // ǣԭӽͱ + + // ԭӽͱϲ + union { + AtomType atom; // atomԭӽֵAtomTypeû + struct { + struct GLNode* hp; // ָͷ + struct GLNode* tp; // ָβ + } ptr; // ָ + } Node; +} GLNode; + +/* */ +typedef GLNode* GList; + +/* + * ͼλ + * + * HeadָԱͷ + * TailָԱβ + */ +typedef enum { Head, Tail } Mark; + + +/* + * ʼ + * + * ʼյĹΪ0Ϊ1 + * + *ע + * Ҫÿһȥſ + */ +Status InitGList(GList* L); + +/* + * 㷨5.7 + * + * + * + * ַSL + */ +Status CreateGList(GList* L, SString S); + +/* + * + * + * ͷŹռڴ档 + */ +Status DestroyGList(GList* L); + +/* + * 㷨5.6 + * + * + * + * ɹLƵõT + */ +Status CopyGList(GList* T, GList L); + +/* + * + * + * عijȡ + */ +int GListLength(GList L); + +/* + * 㷨5.5 + * + * + * + * ع + */ +int GListDepth(GList L); + +/* + * п + * + * жϹǷΪա + */ +Status GListEmpty(GList L); + +/* + * ͷ + */ +GList GetHead(GList L); + +/* + * β + */ +GList GetTail(GList L); + +/* + * + * + * ԪeΪLĵһԪء + */ +Status InsertFirst(GList* L, GList e); + +/* + * ɾ + * + * LĵһԪɾeء + */ +Status DeleteFirst(GList* L, GList* e); + +/* + * + * + * visitʹL + */ +void Traverse(GList L, void (Visit)(AtomType)); + +/* + * ͼλ + * + * L + */ +void PrintGraph(GList L); + +/* + * ͼλڲʵ֣markͼλǡ + */ +static void Print(GList L, Mark mark); + +/* + * 㷨5.8 + * + * ǿմstrָ֣hsubΪһ','֮ǰӴstrΪһ','֮Ӵ + * + *ע + * 1.ַstrȷ޿հ׷ţstrѾȥš + * 2.ɺstrҲᷢ仯 + */ +static void sever(SString hstr, SString str); + +#endif diff --git a/VisualC++/ExerciseBook/05.33.1/SString.c b/VisualC++/ExerciseBook/05.33.1/SString.c new file mode 100644 index 0000000..7a96fcf --- /dev/null +++ b/VisualC++/ExerciseBook/05.33.1/SString.c @@ -0,0 +1,195 @@ +/*============================= + * Ķ˳洢ʾ˳򴮣 + * + * 㷨: 4.14.24.34.5 + ==============================*/ + +#include "SString.h" //**04 **// + +/* + * ʼ + * + * һֵΪcharsĴT + * + *ע + * òСӼ + */ +Status StrAssign(SString T, const char* chars) { + int i, len; + + len = (int) strlen(chars); + + // chars + if(len > MAXSTRLEN) { + return ERROR; + } + + T[0] = len; + for(i = 1; i <= len; i++) { + T[i] = chars[i - 1]; + } + + return OK; +} + +/* + * + * + * Sա + */ +Status ClearString(SString S) { + // ֻҪΪ0Ϳ + S[0] = 0; + return OK; +} + +/* + * п + * + * жϴSǷЧݡ + * + * ֵ + * TRUE : SΪ + * FALSE: SΪ + */ +Status StrEmpty(SString S) { + return S[0] == 0 ? TRUE : FALSE; +} + +/* + * + * + * شSԪصĸ + * + *ע + * òСӼ + */ +int StrLength(SString S) { + return S[0]; +} + +/* + * 㷨4.3 + * + * Ӵ + * + * SubS[pos, pos+len-1] + * ֵָʾǷȡɹ + * + *ע + * òСӼ + */ +Status SubString(SString Sub, SString S, int pos, int len) { + int i; + + if(pos < 1 || pos > S[0] || len < 0 || pos + len - 1 > S[0]) { + return ERROR; + } + + // Ԫ + for(i = 1; i <= len; i++) { + Sub[i] = S[pos + i - 1]; + } + + // ȷ³ + Sub[0] = len; + + return OK; +} + +/* + * ɾ + * + * ɾS[pos, pos+len-1] + */ +Status StrDelete(SString S, int pos, int len) { + int i; + + if(pos < 1 || pos + len - 1 > S[0] || len < 0) { + return ERROR; + } + + // ɾijΪ0ǰ + if(len == 0) { + return OK; + } + + // ѺԪŲǰ棬ǵɾԪ + for(i = pos + len; i <= S[0]; i++) { + S[i - len] = S[i]; + } + + // ȼ + S[0] -= len; + + return OK; +} + +/* + * Ƚ + * + * ȽϴSʹTرȽϽ + * + *ע + * òСӼ + */ +int StrCompare(SString S, SString T) { + int i = 1; + + while(i <= S[0] && i <= T[0]) { + // ַͬʱȽС + if(S[i] != T[i]) { + return S[i] - T[i]; + } + + i++; + } + + return S[0] - T[0]; +} + +/* + * + * + * SƵT + */ +Status StrCopy(SString T, SString S) { + int i; + + // ͬϢһ + for(i = 0; i <= S[0]; i++) { + T[i] = S[i]; + } + + return OK; +} + +/* + * ַSеĿհףɴӡַո + * + *ע + * úڱġ + */ +Status ClearBlank(SString S) { + int i, j; + + // ǿմ + if(S[0] == 0) { + return ERROR; + } + + for(i = 1, j = 0; i <= S[0]; i++) { + // հףԹ + if(S[i] == ' ' || !isprint(S[i])) { + continue; + } + + j++; + + S[j] = S[i]; + } + + S[0] = j; + + return OK; +} diff --git a/VisualC++/ExerciseBook/05.33.1/SString.h b/VisualC++/ExerciseBook/05.33.1/SString.h new file mode 100644 index 0000000..0632f18 --- /dev/null +++ b/VisualC++/ExerciseBook/05.33.1/SString.h @@ -0,0 +1,117 @@ +/*============================= + * Ķ˳洢ʾ˳򴮣 + * + * 㷨: 4.14.24.34.5 + ==============================*/ + +#ifndef SSTRING_H +#define SSTRING_H + +#include +#include // ṩ strlen ԭ +#include // ṩ isprint ԭ +#include "Status.h" //**01 **// + +/* 궨 */ +#define MAXSTRLEN 255 // ˳򴮵󴮳 + +/* + * ˳洢Ͷ + * + * עЧԪشSString1ŵԪʼ洢 + * SString0ŵԪ洢䳤 + */ +typedef unsigned char SString[MAXSTRLEN + 1]; // 0ŵԪŴij + + +/* + * ʾ + * + * ѭ̲ĵдϰߣposָʾַλ()1ʼ + */ + + +/* + * ʼ + * + * һֵΪcharsĴT + * + *ע + * òСӼ + */ +Status StrAssign(SString T, const char* chars); + +/* + * + * + * Sա + */ +Status ClearString(SString S); + +/* + * п + * + * жϴSǷЧݡ + * + * ֵ + * TRUE : SΪ + * FALSE: SΪ + */ +Status StrEmpty(SString S); + +/* + * + * + * شSԪصĸ + * + *ע + * òСӼ + */ +int StrLength(SString S); + +/* + * 㷨4.3 + * + * Ӵ + * + * SubS[pos, pos+len-1] + * ֵָʾǷȡɹ + * + *ע + * òСӼ + */ +Status SubString(SString Sub, SString S, int pos, int len); + +/* + * ɾ + * + * ɾS[pos, pos+len-1] + */ +Status StrDelete(SString S, int pos, int len); + +/* + * Ƚ + * + * ȽϴSʹTرȽϽ + * + *ע + * òСӼ + */ +int StrCompare(SString S, SString T); + +/* + * + * + * SƵT + */ +Status StrCopy(SString T, SString S); + +/* + * ַSеĿհףɴӡַո + * + *ע + * úڱġ + */ +Status ClearBlank(SString S); + +#endif diff --git a/VisualC++/ExerciseBook/05.33.2/05.33.2.c b/VisualC++/ExerciseBook/05.33.2/05.33.2.c new file mode 100644 index 0000000..11aa567 --- /dev/null +++ b/VisualC++/ExerciseBook/05.33.2/05.33.2.c @@ -0,0 +1,48 @@ +#include +#include "SString.h" //**04 **// +#include "GList-E.h" //**05 ͹**// + +/* + * ԭڲΣչ洢ʾ + */ +void Algo_5_33_2(GList L, int d); + + +int main(int argc, char* argv[]) { + GList L; + char* s = "((),(e),(a,(b,c,d)))"; + SString S; + + printf(" L ...\n"); + StrAssign(S, s); + CreateGList(&L, S); + printf("L = "); + PrintGraph(L); + + Algo_5_33_2(L, 0); + + return 0; +} + + +/* + * ԭڲΣչ洢ʾ + */ +void Algo_5_33_2(GList L, int d) { + int i = d; // dֵΪ0 + + if(L == NULL) { + return; + } + + if(L->tag == Atom) { + printf("%c -> %d\n", L->Node.atom, i); + } + + + if(L->tag == List) { + Algo_5_33_2(L->Node.hp, i + 1); // ͷָָĻһ + } + + Algo_5_33_2(L->tp, i); +} diff --git a/VisualC++/ExerciseBook/05.33.2/05.33.2.vcxproj b/VisualC++/ExerciseBook/05.33.2/05.33.2.vcxproj new file mode 100644 index 0000000..4a7a6f2 --- /dev/null +++ b/VisualC++/ExerciseBook/05.33.2/05.33.2.vcxproj @@ -0,0 +1,78 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {D7EEED63-8BE4-4754-9657-D2276236E34A} + My05332 + + + + 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/05.33.2/05.33.2.vcxproj.filters b/VisualC++/ExerciseBook/05.33.2/05.33.2.vcxproj.filters new file mode 100644 index 0000000..e8be8db --- /dev/null +++ b/VisualC++/ExerciseBook/05.33.2/05.33.2.vcxproj.filters @@ -0,0 +1,36 @@ + + + + + {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/05.33.2/05.33.2.vcxproj.user b/VisualC++/ExerciseBook/05.33.2/05.33.2.vcxproj.user new file mode 100644 index 0000000..ace9a86 --- /dev/null +++ b/VisualC++/ExerciseBook/05.33.2/05.33.2.vcxproj.user @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/05.33.2/GList-E.c b/VisualC++/ExerciseBook/05.33.2/GList-E.c new file mode 100644 index 0000000..3fc0ad9 --- /dev/null +++ b/VisualC++/ExerciseBook/05.33.2/GList-E.c @@ -0,0 +1,449 @@ +/*=========================== + * չ洢ʾ + ============================*/ + +#include "GList-E.h" //**05 ͹**// + +/* + * ʼ + * + * ʼյĹΪ0Ϊ1 + * + *ע + * Ҫÿһſ + */ +Status InitGList(GList* L) { + if(L == NULL) { + return ERROR; + } + + *L = (GList) malloc(sizeof(GLNode)); + if(!*L) { + exit(OVERFLOW); + } + + (*L)->tag = List; + (*L)->Node.hp = NULL; + (*L)->tp = NULL; + + return OK; +} + +/* + * + * + * ַSL + */ +Status CreateGList(GList* L, SString S) { + SString emp, hsub, sub, tmp; + + if(L == NULL) { + return ERROR; + } + + // ַSеĿհףɴӡַո + ClearBlank(S); + + if(StrEmpty(S)) { + return ERROR; + } + + // Ϊ˲ƻS + StrCopy(sub, S); + + /* + * ִеʱ + * ٴִеʱѾȥ + */ + sever(hsub, sub); + + *L = (GList) malloc(sizeof(GLNode)); + if(*L == NULL) { + exit(OVERFLOW); + } + + StrAssign(emp, "()"); + + if(!StrCompare(hsub, emp)) { + (*L)->tag = List; + (*L)->Node.hp = NULL; + } else { + if(StrLength(hsub) == 1) { + (*L)->tag = Atom; + (*L)->Node.atom = hsub[1]; + } else { + (*L)->tag = List; + + SubString(tmp, hsub, 2, StrLength(hsub) - 2); + + CreateGList(&((*L)->Node.hp), tmp); + } + } + + // ڶβ˳ݹ + if(StrEmpty(sub)) { + (*L)->tp = NULL; + } else { + // ݹβ + CreateGList(&((*L)->tp), sub); + } + + return OK; +} + +/* + * + * + * ͷŹռڴ档 + */ +Status DestroyGList(GList* L) { + GList head, tail; + + if(L == NULL || *L == NULL) { + return ERROR; + } + + // ӱ + if((*L)->tag == List) { + head = (*L)->Node.hp; // ͷ + tail = (*L)->tp; // β + + free(*L); + *L = NULL; + + // ݹ鴦ͷ + if(head != NULL) { + DestroyGList(&head); + } + + // ݹ鴦β + if(tail != NULL) { + DestroyGList(&tail); + } + + // ԭӽ + } else { + tail = (*L)->tp; // β + + free(*L); + *L = NULL; + + if(tail != NULL) { + DestroyGList(&tail); + } + } + + return OK; +} + +/* + * + * + * ɹLƵõT + */ +Status CopyGList(GList* T, GList L) { + + if(L == NULL) { + return ERROR; + } + + *T = (GList) malloc(sizeof(GLNode)); + if(*T == NULL) { + exit(OVERFLOW); + } + + // ԭ + if(L->tag == Atom) { + (*T)->tag = Atom; + (*T)->Node.atom = L->Node.atom; + + // ӱ + } else { + (*T)->tag = List; + + // Ʊͷ + if(L->Node.hp != NULL) { + CopyGList(&((*T)->Node.hp), L->Node.hp); + } else { + (*T)->Node.hp = NULL; + } + } + + // Ʊβ + if(L->tp != NULL) { + CopyGList(&((*T)->tp), L->tp); + } else { + (*T)->tp = NULL; + } + + return OK; +} + +/* + * + * + * عijȡ + */ +int GListLength(GList L) { + int count = 0; + GList p; + + // + if(L == NULL) { + return -1; + } + + p = L->Node.hp; + + while(p != NULL) { + ++count; + p = p->tp; + } + + return count; +} + +/* + * + * + * ع + */ +int GListDepth(GList L) { + int max, deep; + GList p; + + max = 0; + + // + if(L == NULL) { + return -1; + } + + // ձΪ1 + if(L->tag == List && !L->Node.hp) { + return 1; + } + + // ԭΪ0 + if(L->tag == Atom) { + return 0; + } + + // ݹӱ + for(p = L->Node.hp; p != NULL; p = p->tp) { + // pΪͷָӱ + deep = GListDepth(p); + if(deep > max) { + max = deep; + } + } + + return max + 1; +} + +/* + * п + * + * жϹǷΪա + */ +Status GListEmpty(GList L) { + // + if(L == NULL) { + return ERROR; + } + + if(L->tag == List && L->Node.hp == NULL && L->tp == NULL) { + return TRUE; + } else { + return ERROR; + } +} + +/* + * ͷ + */ +GList GetHead(GList L) { + GList p, q; + + // ڻΪձ޷ȡͷ + if(L == NULL || L->Node.hp == NULL) { + return NULL; + } + + q = L->Node.hp->tp; // ʱLıβϢ + L->Node.hp->tp = NULL; // ȥLıβ + + CopyGList(&p, L->Node.hp); // ƱͷϢαβ + + L->Node.hp->tp = q; // ָLıβϢ + + return p; +} + +/* + * β + */ +GList GetTail(GList L) { + GList p, q; + + // ڻΪձ޷ȡβ + if(L == NULL || L->Node.hp == NULL) { + return NULL; + } + + q = L->Node.hp; // ʱLıͷϢ + L->Node.hp = q->tp; // ժLıͷ + + CopyGList(&p, L); // ƱβϢαͷ + + q->tp = L->Node.hp; // ָLıͷϢ + L->Node.hp = q; + + return p; +} + +/* + * + * + * ԪeΪLĵһԪء + */ +Status InsertFirst(GList* L, GList e) { + + // + if(L == NULL || *L == NULL) { + return ERROR; + } + + if(e == NULL) { + return ERROR; + } + + e->tp = (*L)->Node.hp; + (*L)->Node.hp = e; + + return OK; +} + +/* + * ɾ + * + * LĵһԪɾeء + */ +Status DeleteFirst(GList* L, GList* e) { + GList p; + + // ڻΪձ޷ɾͷ + if(*L == NULL || (*L)->Node.hp == NULL) { + return ERROR; + } + + p = (*L)->Node.hp; + (*L)->Node.hp = p->tp; + p->tp = NULL; + + *e = p; + + return OK; +} + +/* + * + * + * visitʹL + */ +void Traverse(GList L, void(Visit)(AtomType)) { + if(L == NULL) { + return; + } + + if(L->tag == List) { + Traverse(L->Node.hp, Visit); + } else { + Visit(L->Node.atom); + } + + Traverse(L->tp, Visit); +} + +/* + * ͼλ + * + * L + */ +void PrintGraph(GList L) { + Print(L); + printf("\n"); +} + +/* + * ͼλڲʵ֡ + */ +static void Print(GList L) { + if(L == NULL) { + return; + } + + // + if(L->tag == List) { + printf("("); + + if(L->Node.hp) { + Print(L->Node.hp); + } + + if(L->tp) { + printf("),"); + Print(L->tp); + } else { + printf(")"); + } + + // ԭӽ + } else { + printf("%c", L->Node.atom); + if(L->tp) { + printf(","); + Print(L->tp); + } + } +} + +/* + * ǿմstrָ֣hsubΪһ','֮ǰӴstrΪһ','֮Ӵ + * + *ע + * 1.ַstrȷ޿հ׷ţ + * strſȥҲδȥ + * 2.ɺstrҲᷢ仯 + */ +static void sever(SString hstr, SString str) { + int i, k, n; + SString ch; + + n = StrLength(str); + + i = 0; // ַʱα + k = 0; // δ + + do { + ++i; + + // ȡstrһַ + SubString(ch, str, i, 1); + + if(ch[1] == '(') { + ++k; + } + if(ch[1] == ')') { + --k; + } + } while(i < n && (ch[1] != ',' || k != 0)); + + if(i < n) { + SubString(hstr, str, 1, i - 1); + SubString(str, str, i + 1, n - i); + } else { + StrCopy(hstr, str); + ClearString(str); + } +} diff --git a/VisualC++/ExerciseBook/05.33.2/GList-E.h b/VisualC++/ExerciseBook/05.33.2/GList-E.h new file mode 100644 index 0000000..fa9af82 --- /dev/null +++ b/VisualC++/ExerciseBook/05.33.2/GList-E.h @@ -0,0 +1,146 @@ +/*=========================== + * չ洢ʾ + ============================*/ + +#ifndef GLIST_E_H +#define GLIST_E_H + +#include +#include // ṩ mallocreallocfreeexit ԭ +#include "Status.h" //**01 **// +#include "SString.h" //**04 **// + +/* ԭԪ */ +typedef char AtomType; //ԭ + +/* + * + * + * Atom-0ԭӽ + * List-1 + */ +typedef enum { Atom, List } ElemTag; + +/* չ洢ʾͶ */ +typedef struct GLNode { + ElemTag tag; // ǣԭӽͱ + + // ԭӽͱϲ + union + { + AtomType atom; // atomԭӽֵAtomTypeû + struct GLNode* hp; // ָͷ + } Node; + struct GLNode* tp; // ָβ +} GLNode; + +/* */ +typedef GLNode* GList; + + +/* + * ʼ + * + * ʼյĹΪ0Ϊ1 + * + *ע + * Ҫÿһſ + */ +Status InitGList(GList* L); + +/* + * + * + * ַSL + */ +Status CreateGList(GList* L, SString S); + +/* + * + * + * ͷŹռڴ档 + */ +Status DestroyGList(GList* L); + +/* + * + * + * ɹLƵõT + */ +Status CopyGList(GList* T, GList L); + +/* + * + * + * عijȡ + */ +int GListLength(GList L); + +/* + * + * + * ع + */ +int GListDepth(GList L); + +/* + * п + * + * жϹǷΪա + */ +Status GListEmpty(GList L); + +/* + * ͷ + */ +GList GetHead(GList L); + +/* + * β + */ +GList GetTail(GList L); + +/* + * + * + * ԪeΪLĵһԪء + */ +Status InsertFirst(GList* L, GList e); + +/* + * ɾ + * + * LĵһԪɾeء + */ +Status DeleteFirst(GList* L, GList* e); + +/* + * + * + * visitʹL + */ +void Traverse(GList L, void(Visit)(AtomType)); + +/* + * ͼλ + * + * L + */ +void PrintGraph(GList L); + +/* + * ͼλڲʵ֡ + */ +static void Print(GList L); + +/* + * ǿմstrָ֣hsubΪһ','֮ǰӴstrΪһ','֮Ӵ + * + *ע + * 1.ַstrȷ޿հ׷ţ + * strſȥҲδȥ + * 2.ɺstrҲᷢ仯 + */ +static void sever(SString hstr, SString str); + +#endif diff --git a/VisualC++/ExerciseBook/05.33.2/SString.c b/VisualC++/ExerciseBook/05.33.2/SString.c new file mode 100644 index 0000000..7a96fcf --- /dev/null +++ b/VisualC++/ExerciseBook/05.33.2/SString.c @@ -0,0 +1,195 @@ +/*============================= + * Ķ˳洢ʾ˳򴮣 + * + * 㷨: 4.14.24.34.5 + ==============================*/ + +#include "SString.h" //**04 **// + +/* + * ʼ + * + * һֵΪcharsĴT + * + *ע + * òСӼ + */ +Status StrAssign(SString T, const char* chars) { + int i, len; + + len = (int) strlen(chars); + + // chars + if(len > MAXSTRLEN) { + return ERROR; + } + + T[0] = len; + for(i = 1; i <= len; i++) { + T[i] = chars[i - 1]; + } + + return OK; +} + +/* + * + * + * Sա + */ +Status ClearString(SString S) { + // ֻҪΪ0Ϳ + S[0] = 0; + return OK; +} + +/* + * п + * + * жϴSǷЧݡ + * + * ֵ + * TRUE : SΪ + * FALSE: SΪ + */ +Status StrEmpty(SString S) { + return S[0] == 0 ? TRUE : FALSE; +} + +/* + * + * + * شSԪصĸ + * + *ע + * òСӼ + */ +int StrLength(SString S) { + return S[0]; +} + +/* + * 㷨4.3 + * + * Ӵ + * + * SubS[pos, pos+len-1] + * ֵָʾǷȡɹ + * + *ע + * òСӼ + */ +Status SubString(SString Sub, SString S, int pos, int len) { + int i; + + if(pos < 1 || pos > S[0] || len < 0 || pos + len - 1 > S[0]) { + return ERROR; + } + + // Ԫ + for(i = 1; i <= len; i++) { + Sub[i] = S[pos + i - 1]; + } + + // ȷ³ + Sub[0] = len; + + return OK; +} + +/* + * ɾ + * + * ɾS[pos, pos+len-1] + */ +Status StrDelete(SString S, int pos, int len) { + int i; + + if(pos < 1 || pos + len - 1 > S[0] || len < 0) { + return ERROR; + } + + // ɾijΪ0ǰ + if(len == 0) { + return OK; + } + + // ѺԪŲǰ棬ǵɾԪ + for(i = pos + len; i <= S[0]; i++) { + S[i - len] = S[i]; + } + + // ȼ + S[0] -= len; + + return OK; +} + +/* + * Ƚ + * + * ȽϴSʹTرȽϽ + * + *ע + * òСӼ + */ +int StrCompare(SString S, SString T) { + int i = 1; + + while(i <= S[0] && i <= T[0]) { + // ַͬʱȽС + if(S[i] != T[i]) { + return S[i] - T[i]; + } + + i++; + } + + return S[0] - T[0]; +} + +/* + * + * + * SƵT + */ +Status StrCopy(SString T, SString S) { + int i; + + // ͬϢһ + for(i = 0; i <= S[0]; i++) { + T[i] = S[i]; + } + + return OK; +} + +/* + * ַSеĿհףɴӡַո + * + *ע + * úڱġ + */ +Status ClearBlank(SString S) { + int i, j; + + // ǿմ + if(S[0] == 0) { + return ERROR; + } + + for(i = 1, j = 0; i <= S[0]; i++) { + // հףԹ + if(S[i] == ' ' || !isprint(S[i])) { + continue; + } + + j++; + + S[j] = S[i]; + } + + S[0] = j; + + return OK; +} diff --git a/VisualC++/ExerciseBook/05.33.2/SString.h b/VisualC++/ExerciseBook/05.33.2/SString.h new file mode 100644 index 0000000..0632f18 --- /dev/null +++ b/VisualC++/ExerciseBook/05.33.2/SString.h @@ -0,0 +1,117 @@ +/*============================= + * Ķ˳洢ʾ˳򴮣 + * + * 㷨: 4.14.24.34.5 + ==============================*/ + +#ifndef SSTRING_H +#define SSTRING_H + +#include +#include // ṩ strlen ԭ +#include // ṩ isprint ԭ +#include "Status.h" //**01 **// + +/* 궨 */ +#define MAXSTRLEN 255 // ˳򴮵󴮳 + +/* + * ˳洢Ͷ + * + * עЧԪشSString1ŵԪʼ洢 + * SString0ŵԪ洢䳤 + */ +typedef unsigned char SString[MAXSTRLEN + 1]; // 0ŵԪŴij + + +/* + * ʾ + * + * ѭ̲ĵдϰߣposָʾַλ()1ʼ + */ + + +/* + * ʼ + * + * һֵΪcharsĴT + * + *ע + * òСӼ + */ +Status StrAssign(SString T, const char* chars); + +/* + * + * + * Sա + */ +Status ClearString(SString S); + +/* + * п + * + * жϴSǷЧݡ + * + * ֵ + * TRUE : SΪ + * FALSE: SΪ + */ +Status StrEmpty(SString S); + +/* + * + * + * شSԪصĸ + * + *ע + * òСӼ + */ +int StrLength(SString S); + +/* + * 㷨4.3 + * + * Ӵ + * + * SubS[pos, pos+len-1] + * ֵָʾǷȡɹ + * + *ע + * òСӼ + */ +Status SubString(SString Sub, SString S, int pos, int len); + +/* + * ɾ + * + * ɾS[pos, pos+len-1] + */ +Status StrDelete(SString S, int pos, int len); + +/* + * Ƚ + * + * ȽϴSʹTرȽϽ + * + *ע + * òСӼ + */ +int StrCompare(SString S, SString T); + +/* + * + * + * SƵT + */ +Status StrCopy(SString T, SString S); + +/* + * ַSеĿհףɴӡַո + * + *ע + * úڱġ + */ +Status ClearBlank(SString S); + +#endif diff --git a/VisualC++/ExerciseBook/05.34.1/05.34.1.c b/VisualC++/ExerciseBook/05.34.1/05.34.1.c new file mode 100644 index 0000000..b3a2013 --- /dev/null +++ b/VisualC++/ExerciseBook/05.34.1/05.34.1.c @@ -0,0 +1,62 @@ +#include +#include "Status.h" //**01 **// +#include "SString.h" //**04 **// +#include "GList-HT.h" //**05 ͹**// + +/* + * ùͷβ洢ʾ + */ +Status Algo_5_34_1(GList* L); + + +int main(int argc, char* argv[]) { + GList L; + char* s = "(a,((b,c),()),(((d),e),f))"; + SString S; + + printf(" L ...\n"); + StrAssign(S, s); + CreateGList(&L, S); + printf("L = "); + PrintGraph(L); + + printf("ù...\n"); + Algo_5_34_1(&L); + printf("L = "); + PrintGraph(L); + + return 0; +} + + +/* + * ùͷβ洢ʾ + */ +Status Algo_5_34_1(GList* L) { + GList head, tail; + + if(L == NULL || *L == NULL) { + return ERROR; + } + + // Ӻǰﵽ + head = *L; + tail = (*L)->Node.ptr.tp; + + // Աͷ + if(head->Node.ptr.hp != NULL && head->Node.ptr.hp->tag == List) { + Algo_5_34_1(&(head->Node.ptr.hp)); + } + + // Աβ + if(tail != NULL) { + Algo_5_34_1(&((*L)->Node.ptr.tp)); + + // ͷβ + *L = (*L)->Node.ptr.tp; + tail->Node.ptr.tp = head; + head->Node.ptr.tp = NULL; + } + + return OK; +} diff --git a/VisualC++/ExerciseBook/05.34.1/05.34.1.vcxproj b/VisualC++/ExerciseBook/05.34.1/05.34.1.vcxproj new file mode 100644 index 0000000..f564b02 --- /dev/null +++ b/VisualC++/ExerciseBook/05.34.1/05.34.1.vcxproj @@ -0,0 +1,78 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {0E9C5F8C-656A-4535-A61F-53E62C8F005A} + My05341 + + + + 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/05.34.1/05.34.1.vcxproj.filters b/VisualC++/ExerciseBook/05.34.1/05.34.1.vcxproj.filters new file mode 100644 index 0000000..f0dbd95 --- /dev/null +++ b/VisualC++/ExerciseBook/05.34.1/05.34.1.vcxproj.filters @@ -0,0 +1,36 @@ + + + + + {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/05.34.1/05.34.1.vcxproj.user b/VisualC++/ExerciseBook/05.34.1/05.34.1.vcxproj.user new file mode 100644 index 0000000..ace9a86 --- /dev/null +++ b/VisualC++/ExerciseBook/05.34.1/05.34.1.vcxproj.user @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/05.34.1/GList-HT.c b/VisualC++/ExerciseBook/05.34.1/GList-HT.c new file mode 100644 index 0000000..bad30df --- /dev/null +++ b/VisualC++/ExerciseBook/05.34.1/GList-HT.c @@ -0,0 +1,418 @@ +/*============================ + * ͷβ洢ʾ + * + * 㷨: 5.55.65.75.8 + =============================*/ + +#include "GList-HT.h" //**05 ͹**// + +/* + * ʼ + * + * ʼյĹΪ0Ϊ1 + * + *ע + * Ҫÿһȥſ + */ +Status InitGList(GList* L) { + if(L == NULL) { + return ERROR; + } + + *L = NULL; + + return OK; +} + +/* + * 㷨5.7 + * + * + * + * ַSL + */ +Status CreateGList(GList* L, SString S) { + SString emp; // չַ + SString hsub, sub; + GList p, q; + + if(L == NULL) { + return ERROR; + } + + // ַSеĿհףɴӡַո + ClearBlank(S); + + if(StrEmpty(S)) { + return ERROR; + } + + StrAssign(emp, "()"); + + /* + * 봮Ϊ()ҪյĹ + * + *ע + * ̲Ĵġ + * StrCompareķֵָʾַĴСָʾַǷȡ + * S()ȣֵӦ0 + */ + if(!StrCompare(S, emp)) { + *L = NULL; + } else { + *L = (GList) malloc(sizeof(GLNode)); + if(*L == NULL) { + exit(OVERFLOW); + } + + // ԭ + if(StrLength(S) == 1) { + (*L)->tag = Atom; + (*L)->Node.atom = S[1]; + } else { + (*L)->tag = List; + + p = *L; + + // ȥ + SubString(sub, S, 2, StrLength(S) - 2); + + // ظnӱ + do { + // subзͷhsubɺsubҲᷢ仯 + sever(hsub, sub); + + // ݹ鴴 + CreateGList(&(p->Node.ptr.hp), hsub); + + q = p; + + // βΪգҪβ + if(!StrEmpty(sub)) { + p = (GList) malloc(sizeof(GLNode)); + if(p == NULL) { + exit(OVERFLOW); + } + + p->tag = List; + + q->Node.ptr.tp = p; + } + } while(!StrEmpty(sub)); + + q->Node.ptr.tp = NULL; + } + } + + return OK; +} + +/* + * + * + * ͷŹռڴ档 + */ +Status DestroyGList(GList* L) { + GList head, tail; + + if(L == NULL || *L == NULL) { + return ERROR; + } + + // ɾԭӽ + if((*L)->tag == Atom) { + free(*L); + *L = NULL; + + // ɾӱ + } else { + head = (*L)->Node.ptr.hp; + tail = (*L)->Node.ptr.tp; + free(*L); + *L = NULL; + DestroyGList(&head); + DestroyGList(&tail); + } + + return OK; +} + +/* + * 㷨5.6 + * + * + * + * ɹLƵõT + */ +Status CopyGList(GList* T, GList L) { + if(T == NULL) { + return ERROR; + } + + if(L == NULL) { + *T = NULL; + } else { + // ½ + *T = (GList) malloc(sizeof(GLNode)); + if(*T == NULL) { + exit(OVERFLOW); + } + + (*T)->tag = L->tag; + + // Ƶԭ + if(L->tag == Atom) { + (*T)->Node.atom = L->Node.atom; + + // Ʊͷͱβ + } else { + CopyGList(&((*T)->Node.ptr.hp), L->Node.ptr.hp); + CopyGList(&((*T)->Node.ptr.tp), L->Node.ptr.tp); + } + } + + return OK; +} + +/* + * + * + * عijȡ + */ +int GListLength(GList L) { + int count; + + for(count = 0; L != NULL; count++, L = L->Node.ptr.tp) { + } + + return count; +} + +/* + * 㷨5.5 + * + * + * + * ع + */ +int GListDepth(GList L) { + int max, deep; + GList p; + + // ձΪ1 + if(L == NULL) { + return 1; + } + + // ԭΪ0 + if(L->tag == Atom) { + return 0; + } + + // ݹӱ + for(max = 0, p = L; p != NULL; p = p->Node.ptr.tp) { + deep = GListDepth(p->Node.ptr.hp); + if(deep > max) { + max = deep; + } + } + + // ǿձǸԪȼһ + return max + 1; +} + +/* + * п + * + * жϹǷΪա + */ +Status GListEmpty(GList L) { + return L == NULL ? TRUE : FALSE; +} + +/* + * ͷ + */ +GList GetHead(GList L) { + GList p; + + // ձޱͷﲻܷNULLȻֲʧ˻Ƿ˿ձ + if(L == NULL) { + exit(ERROR); + } + + CopyGList(&p, L->Node.ptr.hp); + + return p; +} + +/* + * β + */ +GList GetTail(GList L) { + GList p; + + // ձޱβﲻܷNULLȻֲʧ˻Ƿ˿ձ + if(L == NULL) { + exit(ERROR); + } + + CopyGList(&p, L->Node.ptr.tp); + + return p; +} + +/* + * + * + * ԪeΪLĵһԪء + */ +Status InsertFirst(GList* L, GList e) { + GList g; + + if(L == NULL) { + return ERROR; + } + + g = (GList) malloc(sizeof(GLNode)); + if(g == NULL) { + exit(OVERFLOW); + } + + g->tag = List; + g->Node.ptr.hp = e; + g->Node.ptr.tp = *L; + *L = g; + + return OK; +} + +/* + * ɾ + * + * LĵһԪɾeء + */ +Status DeleteFirst(GList* L, GList* e) { + GList p; + + // ձ޷ɾ + if(L == NULL || *L == NULL) { + return ERROR; + } + + p = *L; + *L = (*L)->Node.ptr.tp; + + CopyGList(e, p->Node.ptr.hp); + + free(p); + + return OK; +} + +/* + * + * + * visitʹL + */ +void Traverse(GList L, void(Visit)(AtomType)) { + + if(L == NULL) { + return; + } + + if(L->tag == Atom) { + Visit(L->Node.atom); + } else { + Traverse(L->Node.ptr.hp, Visit); + Traverse(L->Node.ptr.tp, Visit); + } + +} + +/* + * ͼλ + * + * L + */ +void PrintGraph(GList L) { + Print(L, Head); + printf("\n"); +} + +/* + * ͼλڲʵ֣markͼλǡ + */ +static void Print(GList L, Mark mark) { + // LΪ + if(L == NULL) { + if(mark == Head) { + printf("("); + } + + printf(")"); + + // LΪʱ + } else { + // ԭӽ㣬ԭ + if(L->tag == Atom) { + printf("%c", L->Node.atom); + + // ӱ㣬ҪԱͷβֱ + } else { + if(mark == Head) { + printf("("); + } else { + printf(","); + } + + Print(L->Node.ptr.hp, Head); + Print(L->Node.ptr.tp, Tail); + } + } +} + +/* + * 㷨5.8 + * + * ǿմstrָ֣hsubΪһ','֮ǰӴstrΪһ','֮Ӵ + * + *ע + * 1.ַstrȷ޿հ׷ţstrѾȥš + * 2.ɺstrҲᷢ仯 + */ +static void sever(SString hstr, SString str) { + int i, k, n; + SString ch; + + n = StrLength(str); + + i = 0; // ַʱα + k = 0; // δ + + do { + ++i; + + // ȡstrһַ + SubString(ch, str, i, 1); + + if(ch[1] == '(') { + ++k; + } + + if(ch[1] == ')') { + --k; + } + } while(i < n && (ch[1] != ',' || k != 0)); + + // ڶ + if(i < n) { + SubString(hstr, str, 1, i - 1); + SubString(str, str, i + 1, n - i); + + // ֻһ + } else { + StrCopy(hstr, str); + ClearString(str); + } +} diff --git a/VisualC++/ExerciseBook/05.34.1/GList-HT.h b/VisualC++/ExerciseBook/05.34.1/GList-HT.h new file mode 100644 index 0000000..508b96f --- /dev/null +++ b/VisualC++/ExerciseBook/05.34.1/GList-HT.h @@ -0,0 +1,164 @@ +/*============================ + * ͷβ洢ʾ + * + * 㷨: 5.55.65.75.8 + =============================*/ + +#ifndef GLIST_HT_H +#define GLIST_HT_H + +#include +#include // ṩ mallocreallocfreeexit ԭ +#include "Status.h" //**01 **// +#include "SString.h" //**04 **// + +/* ԭԪ */ +typedef char AtomType; + +/* + * + * + * Atom-0ԭӽ + * List-1 + */ +typedef enum { Atom, List } ElemTag; + +/* ͷβ洢ʾͶ */ +typedef struct GLNode { + ElemTag tag; // ǣԭӽͱ + + // ԭӽͱϲ + union { + AtomType atom; // atomԭӽֵAtomTypeû + struct { + struct GLNode* hp; // ָͷ + struct GLNode* tp; // ָβ + } ptr; // ָ + } Node; +} GLNode; + +/* */ +typedef GLNode* GList; + +/* + * ͼλ + * + * HeadָԱͷ + * TailָԱβ + */ +typedef enum { Head, Tail } Mark; + + +/* + * ʼ + * + * ʼյĹΪ0Ϊ1 + * + *ע + * Ҫÿһȥſ + */ +Status InitGList(GList* L); + +/* + * 㷨5.7 + * + * + * + * ַSL + */ +Status CreateGList(GList* L, SString S); + +/* + * + * + * ͷŹռڴ档 + */ +Status DestroyGList(GList* L); + +/* + * 㷨5.6 + * + * + * + * ɹLƵõT + */ +Status CopyGList(GList* T, GList L); + +/* + * + * + * عijȡ + */ +int GListLength(GList L); + +/* + * 㷨5.5 + * + * + * + * ع + */ +int GListDepth(GList L); + +/* + * п + * + * жϹǷΪա + */ +Status GListEmpty(GList L); + +/* + * ͷ + */ +GList GetHead(GList L); + +/* + * β + */ +GList GetTail(GList L); + +/* + * + * + * ԪeΪLĵһԪء + */ +Status InsertFirst(GList* L, GList e); + +/* + * ɾ + * + * LĵһԪɾeء + */ +Status DeleteFirst(GList* L, GList* e); + +/* + * + * + * visitʹL + */ +void Traverse(GList L, void (Visit)(AtomType)); + +/* + * ͼλ + * + * L + */ +void PrintGraph(GList L); + +/* + * ͼλڲʵ֣markͼλǡ + */ +static void Print(GList L, Mark mark); + +/* + * 㷨5.8 + * + * ǿմstrָ֣hsubΪһ','֮ǰӴstrΪһ','֮Ӵ + * + *ע + * 1.ַstrȷ޿հ׷ţstrѾȥš + * 2.ɺstrҲᷢ仯 + */ +static void sever(SString hstr, SString str); + +#endif diff --git a/VisualC++/ExerciseBook/05.34.1/SString.c b/VisualC++/ExerciseBook/05.34.1/SString.c new file mode 100644 index 0000000..7a96fcf --- /dev/null +++ b/VisualC++/ExerciseBook/05.34.1/SString.c @@ -0,0 +1,195 @@ +/*============================= + * Ķ˳洢ʾ˳򴮣 + * + * 㷨: 4.14.24.34.5 + ==============================*/ + +#include "SString.h" //**04 **// + +/* + * ʼ + * + * һֵΪcharsĴT + * + *ע + * òСӼ + */ +Status StrAssign(SString T, const char* chars) { + int i, len; + + len = (int) strlen(chars); + + // chars + if(len > MAXSTRLEN) { + return ERROR; + } + + T[0] = len; + for(i = 1; i <= len; i++) { + T[i] = chars[i - 1]; + } + + return OK; +} + +/* + * + * + * Sա + */ +Status ClearString(SString S) { + // ֻҪΪ0Ϳ + S[0] = 0; + return OK; +} + +/* + * п + * + * жϴSǷЧݡ + * + * ֵ + * TRUE : SΪ + * FALSE: SΪ + */ +Status StrEmpty(SString S) { + return S[0] == 0 ? TRUE : FALSE; +} + +/* + * + * + * شSԪصĸ + * + *ע + * òСӼ + */ +int StrLength(SString S) { + return S[0]; +} + +/* + * 㷨4.3 + * + * Ӵ + * + * SubS[pos, pos+len-1] + * ֵָʾǷȡɹ + * + *ע + * òСӼ + */ +Status SubString(SString Sub, SString S, int pos, int len) { + int i; + + if(pos < 1 || pos > S[0] || len < 0 || pos + len - 1 > S[0]) { + return ERROR; + } + + // Ԫ + for(i = 1; i <= len; i++) { + Sub[i] = S[pos + i - 1]; + } + + // ȷ³ + Sub[0] = len; + + return OK; +} + +/* + * ɾ + * + * ɾS[pos, pos+len-1] + */ +Status StrDelete(SString S, int pos, int len) { + int i; + + if(pos < 1 || pos + len - 1 > S[0] || len < 0) { + return ERROR; + } + + // ɾijΪ0ǰ + if(len == 0) { + return OK; + } + + // ѺԪŲǰ棬ǵɾԪ + for(i = pos + len; i <= S[0]; i++) { + S[i - len] = S[i]; + } + + // ȼ + S[0] -= len; + + return OK; +} + +/* + * Ƚ + * + * ȽϴSʹTرȽϽ + * + *ע + * òСӼ + */ +int StrCompare(SString S, SString T) { + int i = 1; + + while(i <= S[0] && i <= T[0]) { + // ַͬʱȽС + if(S[i] != T[i]) { + return S[i] - T[i]; + } + + i++; + } + + return S[0] - T[0]; +} + +/* + * + * + * SƵT + */ +Status StrCopy(SString T, SString S) { + int i; + + // ͬϢһ + for(i = 0; i <= S[0]; i++) { + T[i] = S[i]; + } + + return OK; +} + +/* + * ַSеĿհףɴӡַո + * + *ע + * úڱġ + */ +Status ClearBlank(SString S) { + int i, j; + + // ǿմ + if(S[0] == 0) { + return ERROR; + } + + for(i = 1, j = 0; i <= S[0]; i++) { + // հףԹ + if(S[i] == ' ' || !isprint(S[i])) { + continue; + } + + j++; + + S[j] = S[i]; + } + + S[0] = j; + + return OK; +} diff --git a/VisualC++/ExerciseBook/05.34.1/SString.h b/VisualC++/ExerciseBook/05.34.1/SString.h new file mode 100644 index 0000000..0632f18 --- /dev/null +++ b/VisualC++/ExerciseBook/05.34.1/SString.h @@ -0,0 +1,117 @@ +/*============================= + * Ķ˳洢ʾ˳򴮣 + * + * 㷨: 4.14.24.34.5 + ==============================*/ + +#ifndef SSTRING_H +#define SSTRING_H + +#include +#include // ṩ strlen ԭ +#include // ṩ isprint ԭ +#include "Status.h" //**01 **// + +/* 궨 */ +#define MAXSTRLEN 255 // ˳򴮵󴮳 + +/* + * ˳洢Ͷ + * + * עЧԪشSString1ŵԪʼ洢 + * SString0ŵԪ洢䳤 + */ +typedef unsigned char SString[MAXSTRLEN + 1]; // 0ŵԪŴij + + +/* + * ʾ + * + * ѭ̲ĵдϰߣposָʾַλ()1ʼ + */ + + +/* + * ʼ + * + * һֵΪcharsĴT + * + *ע + * òСӼ + */ +Status StrAssign(SString T, const char* chars); + +/* + * + * + * Sա + */ +Status ClearString(SString S); + +/* + * п + * + * жϴSǷЧݡ + * + * ֵ + * TRUE : SΪ + * FALSE: SΪ + */ +Status StrEmpty(SString S); + +/* + * + * + * شSԪصĸ + * + *ע + * òСӼ + */ +int StrLength(SString S); + +/* + * 㷨4.3 + * + * Ӵ + * + * SubS[pos, pos+len-1] + * ֵָʾǷȡɹ + * + *ע + * òСӼ + */ +Status SubString(SString Sub, SString S, int pos, int len); + +/* + * ɾ + * + * ɾS[pos, pos+len-1] + */ +Status StrDelete(SString S, int pos, int len); + +/* + * Ƚ + * + * ȽϴSʹTرȽϽ + * + *ע + * òСӼ + */ +int StrCompare(SString S, SString T); + +/* + * + * + * SƵT + */ +Status StrCopy(SString T, SString S); + +/* + * ַSеĿհףɴӡַո + * + *ע + * úڱġ + */ +Status ClearBlank(SString S); + +#endif diff --git a/VisualC++/ExerciseBook/05.34.2/05.34.2.c b/VisualC++/ExerciseBook/05.34.2/05.34.2.c new file mode 100644 index 0000000..c72e80d --- /dev/null +++ b/VisualC++/ExerciseBook/05.34.2/05.34.2.c @@ -0,0 +1,61 @@ +#include +#include "Status.h" //**01 **// +#include "SString.h" //**04 **// +#include "GList-E.h" //**05 ͹**// + +/* + * ùչ洢ʾ + */ +Status Algo_5_34_2(GList* L); + + +int main(int argc, char* argv[]) { + GList L; + char* s = "(a,((b,c),()),(((d),e),f))"; + SString S; + + printf(" L ...\n"); + StrAssign(S, s); + CreateGList(&L, S); + printf("L = "); + PrintGraph(L); + + printf("ù...\n"); + Algo_5_34_2(&L); + printf("L = "); + PrintGraph(L); + + return 0; +} + + +/* + * ùչ洢ʾ + */ +Status Algo_5_34_2(GList* L) { + GList head, tail; + + if(L == NULL || *L == NULL) { + return ERROR; + } + + // Ӻǰﵽ + head = *L; + tail = (*L)->tp; + + if(head->tag == List && head->Node.hp != NULL) { + Algo_5_34_2(&(head->Node.hp)); + } + + // Աβ + if(tail != NULL) { + Algo_5_34_2(&((*L)->tp)); + + // ͷβ + *L = (*L)->tp; + tail->tp = head; + head->tp = NULL; + } + + return OK; +} diff --git a/VisualC++/ExerciseBook/05.34.2/05.34.2.vcxproj b/VisualC++/ExerciseBook/05.34.2/05.34.2.vcxproj new file mode 100644 index 0000000..f7738af --- /dev/null +++ b/VisualC++/ExerciseBook/05.34.2/05.34.2.vcxproj @@ -0,0 +1,78 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {D367E1DB-CCB7-4911-8805-1C25A41543FD} + My05342 + + + + 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/05.34.2/05.34.2.vcxproj.filters b/VisualC++/ExerciseBook/05.34.2/05.34.2.vcxproj.filters new file mode 100644 index 0000000..faa4912 --- /dev/null +++ b/VisualC++/ExerciseBook/05.34.2/05.34.2.vcxproj.filters @@ -0,0 +1,36 @@ + + + + + {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/05.34.2/05.34.2.vcxproj.user b/VisualC++/ExerciseBook/05.34.2/05.34.2.vcxproj.user new file mode 100644 index 0000000..ace9a86 --- /dev/null +++ b/VisualC++/ExerciseBook/05.34.2/05.34.2.vcxproj.user @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/05.34.2/GList-E.c b/VisualC++/ExerciseBook/05.34.2/GList-E.c new file mode 100644 index 0000000..3fc0ad9 --- /dev/null +++ b/VisualC++/ExerciseBook/05.34.2/GList-E.c @@ -0,0 +1,449 @@ +/*=========================== + * չ洢ʾ + ============================*/ + +#include "GList-E.h" //**05 ͹**// + +/* + * ʼ + * + * ʼյĹΪ0Ϊ1 + * + *ע + * Ҫÿһſ + */ +Status InitGList(GList* L) { + if(L == NULL) { + return ERROR; + } + + *L = (GList) malloc(sizeof(GLNode)); + if(!*L) { + exit(OVERFLOW); + } + + (*L)->tag = List; + (*L)->Node.hp = NULL; + (*L)->tp = NULL; + + return OK; +} + +/* + * + * + * ַSL + */ +Status CreateGList(GList* L, SString S) { + SString emp, hsub, sub, tmp; + + if(L == NULL) { + return ERROR; + } + + // ַSеĿհףɴӡַո + ClearBlank(S); + + if(StrEmpty(S)) { + return ERROR; + } + + // Ϊ˲ƻS + StrCopy(sub, S); + + /* + * ִеʱ + * ٴִеʱѾȥ + */ + sever(hsub, sub); + + *L = (GList) malloc(sizeof(GLNode)); + if(*L == NULL) { + exit(OVERFLOW); + } + + StrAssign(emp, "()"); + + if(!StrCompare(hsub, emp)) { + (*L)->tag = List; + (*L)->Node.hp = NULL; + } else { + if(StrLength(hsub) == 1) { + (*L)->tag = Atom; + (*L)->Node.atom = hsub[1]; + } else { + (*L)->tag = List; + + SubString(tmp, hsub, 2, StrLength(hsub) - 2); + + CreateGList(&((*L)->Node.hp), tmp); + } + } + + // ڶβ˳ݹ + if(StrEmpty(sub)) { + (*L)->tp = NULL; + } else { + // ݹβ + CreateGList(&((*L)->tp), sub); + } + + return OK; +} + +/* + * + * + * ͷŹռڴ档 + */ +Status DestroyGList(GList* L) { + GList head, tail; + + if(L == NULL || *L == NULL) { + return ERROR; + } + + // ӱ + if((*L)->tag == List) { + head = (*L)->Node.hp; // ͷ + tail = (*L)->tp; // β + + free(*L); + *L = NULL; + + // ݹ鴦ͷ + if(head != NULL) { + DestroyGList(&head); + } + + // ݹ鴦β + if(tail != NULL) { + DestroyGList(&tail); + } + + // ԭӽ + } else { + tail = (*L)->tp; // β + + free(*L); + *L = NULL; + + if(tail != NULL) { + DestroyGList(&tail); + } + } + + return OK; +} + +/* + * + * + * ɹLƵõT + */ +Status CopyGList(GList* T, GList L) { + + if(L == NULL) { + return ERROR; + } + + *T = (GList) malloc(sizeof(GLNode)); + if(*T == NULL) { + exit(OVERFLOW); + } + + // ԭ + if(L->tag == Atom) { + (*T)->tag = Atom; + (*T)->Node.atom = L->Node.atom; + + // ӱ + } else { + (*T)->tag = List; + + // Ʊͷ + if(L->Node.hp != NULL) { + CopyGList(&((*T)->Node.hp), L->Node.hp); + } else { + (*T)->Node.hp = NULL; + } + } + + // Ʊβ + if(L->tp != NULL) { + CopyGList(&((*T)->tp), L->tp); + } else { + (*T)->tp = NULL; + } + + return OK; +} + +/* + * + * + * عijȡ + */ +int GListLength(GList L) { + int count = 0; + GList p; + + // + if(L == NULL) { + return -1; + } + + p = L->Node.hp; + + while(p != NULL) { + ++count; + p = p->tp; + } + + return count; +} + +/* + * + * + * ع + */ +int GListDepth(GList L) { + int max, deep; + GList p; + + max = 0; + + // + if(L == NULL) { + return -1; + } + + // ձΪ1 + if(L->tag == List && !L->Node.hp) { + return 1; + } + + // ԭΪ0 + if(L->tag == Atom) { + return 0; + } + + // ݹӱ + for(p = L->Node.hp; p != NULL; p = p->tp) { + // pΪͷָӱ + deep = GListDepth(p); + if(deep > max) { + max = deep; + } + } + + return max + 1; +} + +/* + * п + * + * жϹǷΪա + */ +Status GListEmpty(GList L) { + // + if(L == NULL) { + return ERROR; + } + + if(L->tag == List && L->Node.hp == NULL && L->tp == NULL) { + return TRUE; + } else { + return ERROR; + } +} + +/* + * ͷ + */ +GList GetHead(GList L) { + GList p, q; + + // ڻΪձ޷ȡͷ + if(L == NULL || L->Node.hp == NULL) { + return NULL; + } + + q = L->Node.hp->tp; // ʱLıβϢ + L->Node.hp->tp = NULL; // ȥLıβ + + CopyGList(&p, L->Node.hp); // ƱͷϢαβ + + L->Node.hp->tp = q; // ָLıβϢ + + return p; +} + +/* + * β + */ +GList GetTail(GList L) { + GList p, q; + + // ڻΪձ޷ȡβ + if(L == NULL || L->Node.hp == NULL) { + return NULL; + } + + q = L->Node.hp; // ʱLıͷϢ + L->Node.hp = q->tp; // ժLıͷ + + CopyGList(&p, L); // ƱβϢαͷ + + q->tp = L->Node.hp; // ָLıͷϢ + L->Node.hp = q; + + return p; +} + +/* + * + * + * ԪeΪLĵһԪء + */ +Status InsertFirst(GList* L, GList e) { + + // + if(L == NULL || *L == NULL) { + return ERROR; + } + + if(e == NULL) { + return ERROR; + } + + e->tp = (*L)->Node.hp; + (*L)->Node.hp = e; + + return OK; +} + +/* + * ɾ + * + * LĵһԪɾeء + */ +Status DeleteFirst(GList* L, GList* e) { + GList p; + + // ڻΪձ޷ɾͷ + if(*L == NULL || (*L)->Node.hp == NULL) { + return ERROR; + } + + p = (*L)->Node.hp; + (*L)->Node.hp = p->tp; + p->tp = NULL; + + *e = p; + + return OK; +} + +/* + * + * + * visitʹL + */ +void Traverse(GList L, void(Visit)(AtomType)) { + if(L == NULL) { + return; + } + + if(L->tag == List) { + Traverse(L->Node.hp, Visit); + } else { + Visit(L->Node.atom); + } + + Traverse(L->tp, Visit); +} + +/* + * ͼλ + * + * L + */ +void PrintGraph(GList L) { + Print(L); + printf("\n"); +} + +/* + * ͼλڲʵ֡ + */ +static void Print(GList L) { + if(L == NULL) { + return; + } + + // + if(L->tag == List) { + printf("("); + + if(L->Node.hp) { + Print(L->Node.hp); + } + + if(L->tp) { + printf("),"); + Print(L->tp); + } else { + printf(")"); + } + + // ԭӽ + } else { + printf("%c", L->Node.atom); + if(L->tp) { + printf(","); + Print(L->tp); + } + } +} + +/* + * ǿմstrָ֣hsubΪһ','֮ǰӴstrΪһ','֮Ӵ + * + *ע + * 1.ַstrȷ޿հ׷ţ + * strſȥҲδȥ + * 2.ɺstrҲᷢ仯 + */ +static void sever(SString hstr, SString str) { + int i, k, n; + SString ch; + + n = StrLength(str); + + i = 0; // ַʱα + k = 0; // δ + + do { + ++i; + + // ȡstrһַ + SubString(ch, str, i, 1); + + if(ch[1] == '(') { + ++k; + } + if(ch[1] == ')') { + --k; + } + } while(i < n && (ch[1] != ',' || k != 0)); + + if(i < n) { + SubString(hstr, str, 1, i - 1); + SubString(str, str, i + 1, n - i); + } else { + StrCopy(hstr, str); + ClearString(str); + } +} diff --git a/VisualC++/ExerciseBook/05.34.2/GList-E.h b/VisualC++/ExerciseBook/05.34.2/GList-E.h new file mode 100644 index 0000000..fa9af82 --- /dev/null +++ b/VisualC++/ExerciseBook/05.34.2/GList-E.h @@ -0,0 +1,146 @@ +/*=========================== + * չ洢ʾ + ============================*/ + +#ifndef GLIST_E_H +#define GLIST_E_H + +#include +#include // ṩ mallocreallocfreeexit ԭ +#include "Status.h" //**01 **// +#include "SString.h" //**04 **// + +/* ԭԪ */ +typedef char AtomType; //ԭ + +/* + * + * + * Atom-0ԭӽ + * List-1 + */ +typedef enum { Atom, List } ElemTag; + +/* չ洢ʾͶ */ +typedef struct GLNode { + ElemTag tag; // ǣԭӽͱ + + // ԭӽͱϲ + union + { + AtomType atom; // atomԭӽֵAtomTypeû + struct GLNode* hp; // ָͷ + } Node; + struct GLNode* tp; // ָβ +} GLNode; + +/* */ +typedef GLNode* GList; + + +/* + * ʼ + * + * ʼյĹΪ0Ϊ1 + * + *ע + * Ҫÿһſ + */ +Status InitGList(GList* L); + +/* + * + * + * ַSL + */ +Status CreateGList(GList* L, SString S); + +/* + * + * + * ͷŹռڴ档 + */ +Status DestroyGList(GList* L); + +/* + * + * + * ɹLƵõT + */ +Status CopyGList(GList* T, GList L); + +/* + * + * + * عijȡ + */ +int GListLength(GList L); + +/* + * + * + * ع + */ +int GListDepth(GList L); + +/* + * п + * + * жϹǷΪա + */ +Status GListEmpty(GList L); + +/* + * ͷ + */ +GList GetHead(GList L); + +/* + * β + */ +GList GetTail(GList L); + +/* + * + * + * ԪeΪLĵһԪء + */ +Status InsertFirst(GList* L, GList e); + +/* + * ɾ + * + * LĵһԪɾeء + */ +Status DeleteFirst(GList* L, GList* e); + +/* + * + * + * visitʹL + */ +void Traverse(GList L, void(Visit)(AtomType)); + +/* + * ͼλ + * + * L + */ +void PrintGraph(GList L); + +/* + * ͼλڲʵ֡ + */ +static void Print(GList L); + +/* + * ǿմstrָ֣hsubΪһ','֮ǰӴstrΪһ','֮Ӵ + * + *ע + * 1.ַstrȷ޿հ׷ţ + * strſȥҲδȥ + * 2.ɺstrҲᷢ仯 + */ +static void sever(SString hstr, SString str); + +#endif diff --git a/VisualC++/ExerciseBook/05.34.2/SString.c b/VisualC++/ExerciseBook/05.34.2/SString.c new file mode 100644 index 0000000..7a96fcf --- /dev/null +++ b/VisualC++/ExerciseBook/05.34.2/SString.c @@ -0,0 +1,195 @@ +/*============================= + * Ķ˳洢ʾ˳򴮣 + * + * 㷨: 4.14.24.34.5 + ==============================*/ + +#include "SString.h" //**04 **// + +/* + * ʼ + * + * һֵΪcharsĴT + * + *ע + * òСӼ + */ +Status StrAssign(SString T, const char* chars) { + int i, len; + + len = (int) strlen(chars); + + // chars + if(len > MAXSTRLEN) { + return ERROR; + } + + T[0] = len; + for(i = 1; i <= len; i++) { + T[i] = chars[i - 1]; + } + + return OK; +} + +/* + * + * + * Sա + */ +Status ClearString(SString S) { + // ֻҪΪ0Ϳ + S[0] = 0; + return OK; +} + +/* + * п + * + * жϴSǷЧݡ + * + * ֵ + * TRUE : SΪ + * FALSE: SΪ + */ +Status StrEmpty(SString S) { + return S[0] == 0 ? TRUE : FALSE; +} + +/* + * + * + * شSԪصĸ + * + *ע + * òСӼ + */ +int StrLength(SString S) { + return S[0]; +} + +/* + * 㷨4.3 + * + * Ӵ + * + * SubS[pos, pos+len-1] + * ֵָʾǷȡɹ + * + *ע + * òСӼ + */ +Status SubString(SString Sub, SString S, int pos, int len) { + int i; + + if(pos < 1 || pos > S[0] || len < 0 || pos + len - 1 > S[0]) { + return ERROR; + } + + // Ԫ + for(i = 1; i <= len; i++) { + Sub[i] = S[pos + i - 1]; + } + + // ȷ³ + Sub[0] = len; + + return OK; +} + +/* + * ɾ + * + * ɾS[pos, pos+len-1] + */ +Status StrDelete(SString S, int pos, int len) { + int i; + + if(pos < 1 || pos + len - 1 > S[0] || len < 0) { + return ERROR; + } + + // ɾijΪ0ǰ + if(len == 0) { + return OK; + } + + // ѺԪŲǰ棬ǵɾԪ + for(i = pos + len; i <= S[0]; i++) { + S[i - len] = S[i]; + } + + // ȼ + S[0] -= len; + + return OK; +} + +/* + * Ƚ + * + * ȽϴSʹTرȽϽ + * + *ע + * òСӼ + */ +int StrCompare(SString S, SString T) { + int i = 1; + + while(i <= S[0] && i <= T[0]) { + // ַͬʱȽС + if(S[i] != T[i]) { + return S[i] - T[i]; + } + + i++; + } + + return S[0] - T[0]; +} + +/* + * + * + * SƵT + */ +Status StrCopy(SString T, SString S) { + int i; + + // ͬϢһ + for(i = 0; i <= S[0]; i++) { + T[i] = S[i]; + } + + return OK; +} + +/* + * ַSеĿհףɴӡַո + * + *ע + * úڱġ + */ +Status ClearBlank(SString S) { + int i, j; + + // ǿմ + if(S[0] == 0) { + return ERROR; + } + + for(i = 1, j = 0; i <= S[0]; i++) { + // հףԹ + if(S[i] == ' ' || !isprint(S[i])) { + continue; + } + + j++; + + S[j] = S[i]; + } + + S[0] = j; + + return OK; +} diff --git a/VisualC++/ExerciseBook/05.34.2/SString.h b/VisualC++/ExerciseBook/05.34.2/SString.h new file mode 100644 index 0000000..0632f18 --- /dev/null +++ b/VisualC++/ExerciseBook/05.34.2/SString.h @@ -0,0 +1,117 @@ +/*============================= + * Ķ˳洢ʾ˳򴮣 + * + * 㷨: 4.14.24.34.5 + ==============================*/ + +#ifndef SSTRING_H +#define SSTRING_H + +#include +#include // ṩ strlen ԭ +#include // ṩ isprint ԭ +#include "Status.h" //**01 **// + +/* 궨 */ +#define MAXSTRLEN 255 // ˳򴮵󴮳 + +/* + * ˳洢Ͷ + * + * עЧԪشSString1ŵԪʼ洢 + * SString0ŵԪ洢䳤 + */ +typedef unsigned char SString[MAXSTRLEN + 1]; // 0ŵԪŴij + + +/* + * ʾ + * + * ѭ̲ĵдϰߣposָʾַλ()1ʼ + */ + + +/* + * ʼ + * + * һֵΪcharsĴT + * + *ע + * òСӼ + */ +Status StrAssign(SString T, const char* chars); + +/* + * + * + * Sա + */ +Status ClearString(SString S); + +/* + * п + * + * жϴSǷЧݡ + * + * ֵ + * TRUE : SΪ + * FALSE: SΪ + */ +Status StrEmpty(SString S); + +/* + * + * + * شSԪصĸ + * + *ע + * òСӼ + */ +int StrLength(SString S); + +/* + * 㷨4.3 + * + * Ӵ + * + * SubS[pos, pos+len-1] + * ֵָʾǷȡɹ + * + *ע + * òСӼ + */ +Status SubString(SString Sub, SString S, int pos, int len); + +/* + * ɾ + * + * ɾS[pos, pos+len-1] + */ +Status StrDelete(SString S, int pos, int len); + +/* + * Ƚ + * + * ȽϴSʹTرȽϽ + * + *ע + * òСӼ + */ +int StrCompare(SString S, SString T); + +/* + * + * + * SƵT + */ +Status StrCopy(SString T, SString S); + +/* + * ַSеĿհףɴӡַո + * + *ע + * úڱġ + */ +Status ClearBlank(SString S); + +#endif diff --git a/VisualC++/ExerciseBook/05.35-05.36/05.35-05.36.c b/VisualC++/ExerciseBook/05.35-05.36/05.35-05.36.c new file mode 100644 index 0000000..615ee5e --- /dev/null +++ b/VisualC++/ExerciseBook/05.35-05.36/05.35-05.36.c @@ -0,0 +1,45 @@ +#include +#include "Status.h" //**01 **// +#include "SString.h" //**04 **// +#include "GList.h" //**05 ͹**// + +/* + * Lォ"( )"ΪΪյ״̬ + */ +Status Algo_5_35(GList* L, SString S); + +/* + * Lォ"( )"ΪΪյ״̬ + */ +void Algo_5_36(GList L); + + +int main(int argc, char* argv[]) { + GList L; + char* s = "(( ),(e),(a,(b,c,d)))"; + SString S; + + printf(" L ...\n"); + StrAssign(S, s); + Algo_5_35(&L, S); + + printf("L = "); + Algo_5_36(L); + + return 0; +} + + +/* + * Lォ"( )"ΪΪյ״̬ + */ +Status Algo_5_35(GList* L, SString S) { + return CreateGList(L, S); +} + +/* + * Lォ"( )"ΪΪյ״̬ + */ +void Algo_5_36(GList L) { + PrintGraph(L); +} diff --git a/VisualC++/ExerciseBook/05.35-05.36/05.35-05.36.vcxproj b/VisualC++/ExerciseBook/05.35-05.36/05.35-05.36.vcxproj new file mode 100644 index 0000000..a06397d --- /dev/null +++ b/VisualC++/ExerciseBook/05.35-05.36/05.35-05.36.vcxproj @@ -0,0 +1,78 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {5F387672-C799-4368-9203-BA5CBAB5387D} + My05350536 + + + + 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/05.35-05.36/05.35-05.36.vcxproj.filters b/VisualC++/ExerciseBook/05.35-05.36/05.35-05.36.vcxproj.filters new file mode 100644 index 0000000..155ecf5 --- /dev/null +++ b/VisualC++/ExerciseBook/05.35-05.36/05.35-05.36.vcxproj.filters @@ -0,0 +1,36 @@ + + + + + {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/05.35-05.36/05.35-05.36.vcxproj.user b/VisualC++/ExerciseBook/05.35-05.36/05.35-05.36.vcxproj.user new file mode 100644 index 0000000..ace9a86 --- /dev/null +++ b/VisualC++/ExerciseBook/05.35-05.36/05.35-05.36.vcxproj.user @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/05.35-05.36/GList.c b/VisualC++/ExerciseBook/05.35-05.36/GList.c new file mode 100644 index 0000000..3956155 --- /dev/null +++ b/VisualC++/ExerciseBook/05.35-05.36/GList.c @@ -0,0 +1,179 @@ +/*============================ + * ͷβ洢ʾ + =============================*/ + +#include "GList.h" + +/* + * + * + * ַSL + * + *ע + * ォ"( )"ΪΪյ״̬ + */ +Status CreateGList(GList* L, SString S) { + SString emp; // չַ + SString hsub, sub; + GList p, q; + + if(L == NULL) { + return ERROR; + } + + // ַSеĿհףɴӡַո + ClearBlank(S); + + if(StrEmpty(S)) { + return ERROR; + } + + StrAssign(emp, "( )"); + + /* + * 봮Ϊ()ҪյĹ + * + *ע + * ̲Ĵġ + * StrCompareķֵָʾַĴСָʾַǷȡ + * S()ȣֵӦ0 + */ + if(!StrCompare(S, emp)) { + *L = NULL; + } else { + *L = (GList) malloc(sizeof(GLNode)); + if(*L == NULL) { + exit(OVERFLOW); + } + + // ԭ + if(StrLength(S) == 1) { + (*L)->tag = Atom; + (*L)->Node.atom = S[1]; + } else { + (*L)->tag = List; + + p = *L; + + // ȥ + SubString(sub, S, 2, StrLength(S) - 2); + + // ظnӱ + do { + // subзͷhsubɺsubҲᷢ仯 + sever(hsub, sub); + + // ݹ鴴 + CreateGList(&(p->Node.ptr.hp), hsub); + + q = p; + + // βΪգҪβ + if(!StrEmpty(sub)) { + p = (GList) malloc(sizeof(GLNode)); + if(p == NULL) { + exit(OVERFLOW); + } + + p->tag = List; + + q->Node.ptr.tp = p; + } + } while(!StrEmpty(sub)); + + q->Node.ptr.tp = NULL; + } + } + + return OK; +} + +/* + * ͼλ + * + * L + * + *ע + * ォ"( )"ΪΪյ״̬ + */ +void PrintGraph(GList L) { + Print(L, Head); + printf("\n"); +} + +/* + * ͼλڲʵ֣markͼλǡ + */ +static void Print(GList L, Mark mark) { + // LΪ + if(L == NULL) { + if(mark == Head) { + printf("( "); + } + + printf(")"); + + // LΪʱ + } else { + // ԭӽ㣬ԭ + if(L->tag == Atom) { + printf("%c", L->Node.atom); + + // ӱ㣬ҪԱͷβֱ + } else { + if(mark == Head) { + printf("("); + } else { + printf(","); + } + + Print(L->Node.ptr.hp, Head); + Print(L->Node.ptr.tp, Tail); + } + } +} + +/* + * 㷨5.8 + * + * ǿմstrָ֣hsubΪһ','֮ǰӴstrΪһ','֮Ӵ + * + *ע + * 1.ַstrȷ޿հ׷ţstrѾȥš + * 2.ɺstrҲᷢ仯 + */ +static void sever(SString hstr, SString str) { + int i, k, n; + SString ch; + + n = StrLength(str); + + i = 0; // ַʱα + k = 0; // δ + + do { + ++i; + + // ȡstrһַ + SubString(ch, str, i, 1); + + if(ch[1] == '(') { + ++k; + } + + if(ch[1] == ')') { + --k; + } + } while(i < n && (ch[1] != ',' || k != 0)); + + // ڶ + if(i < n) { + SubString(hstr, str, 1, i - 1); + SubString(str, str, i + 1, n - i); + + // ֻһ + } else { + StrCopy(hstr, str); + ClearString(str); + } +} diff --git a/VisualC++/ExerciseBook/05.35-05.36/GList.h b/VisualC++/ExerciseBook/05.35-05.36/GList.h new file mode 100644 index 0000000..c9837e7 --- /dev/null +++ b/VisualC++/ExerciseBook/05.35-05.36/GList.h @@ -0,0 +1,82 @@ +/*============================ + * ͷβ洢ʾ + =============================*/ + +#ifndef GLIST_H +#define GLIST_H + +#include +#include // ṩ mallocreallocfreeexit ԭ +#include "Status.h" //**01 **// +#include "SString.h" //**04 **// + +/* ԭԪ */ +typedef char AtomType; + +/* + * + * + * Atom-0ԭӽ + * List-1 + */ +typedef enum { Atom, List } ElemTag; + +/* ͷβ洢ʾͶ */ +typedef struct GLNode { + ElemTag tag; // ǣԭӽͱ + + // ԭӽͱϲ + union { + AtomType atom; // atomԭӽֵAtomTypeû + struct { + struct GLNode* hp; // ָͷ + struct GLNode* tp; // ָβ + } ptr; // ָ + } Node; +} GLNode; + +/* */ +typedef GLNode* GList; + +/* + * ͼλ + * + * HeadָԱͷ + * TailָԱβ + */ +typedef enum { Head, Tail } Mark; + + +/* + * 㷨5.7 + * + * + * + * ַSL + */ +Status CreateGList(GList* L, SString S); + +/* + * ͼλ + * + * L + */ +void PrintGraph(GList L); + +/* + * ͼλڲʵ֣markͼλǡ + */ +static void Print(GList L, Mark mark); + +/* + * 㷨5.8 + * + * ǿմstrָ֣hsubΪһ','֮ǰӴstrΪһ','֮Ӵ + * + *ע + * 1.ַstrȷ޿հ׷ţstrѾȥš + * 2.ɺstrҲᷢ仯 + */ +static void sever(SString hstr, SString str); + +#endif diff --git a/VisualC++/ExerciseBook/05.35-05.36/SString.c b/VisualC++/ExerciseBook/05.35-05.36/SString.c new file mode 100644 index 0000000..b8bb831 --- /dev/null +++ b/VisualC++/ExerciseBook/05.35-05.36/SString.c @@ -0,0 +1,195 @@ +/*============================= + * Ķ˳洢ʾ˳򴮣 + * + * 㷨: 4.14.24.34.5 + ==============================*/ + +#include "SString.h" //**04 **// + +/* + * ʼ + * + * һֵΪcharsĴT + * + *ע + * òСӼ + */ +Status StrAssign(SString T, const char* chars) { + int i, len; + + len = (int) strlen(chars); + + // chars + if(len > MAXSTRLEN) { + return ERROR; + } + + T[0] = len; + for(i = 1; i <= len; i++) { + T[i] = chars[i - 1]; + } + + return OK; +} + +/* + * + * + * Sա + */ +Status ClearString(SString S) { + // ֻҪΪ0Ϳ + S[0] = 0; + return OK; +} + +/* + * п + * + * жϴSǷЧݡ + * + * ֵ + * TRUE : SΪ + * FALSE: SΪ + */ +Status StrEmpty(SString S) { + return S[0] == 0 ? TRUE : FALSE; +} + +/* + * + * + * شSԪصĸ + * + *ע + * òСӼ + */ +int StrLength(SString S) { + return S[0]; +} + +/* + * 㷨4.3 + * + * Ӵ + * + * SubS[pos, pos+len-1] + * ֵָʾǷȡɹ + * + *ע + * òСӼ + */ +Status SubString(SString Sub, SString S, int pos, int len) { + int i; + + if(pos < 1 || pos > S[0] || len < 0 || pos + len - 1 > S[0]) { + return ERROR; + } + + // Ԫ + for(i = 1; i <= len; i++) { + Sub[i] = S[pos + i - 1]; + } + + // ȷ³ + Sub[0] = len; + + return OK; +} + +/* + * ɾ + * + * ɾS[pos, pos+len-1] + */ +Status StrDelete(SString S, int pos, int len) { + int i; + + if(pos < 1 || pos + len - 1 > S[0] || len < 0) { + return ERROR; + } + + // ɾijΪ0ǰ + if(len == 0) { + return OK; + } + + // ѺԪŲǰ棬ǵɾԪ + for(i = pos + len; i <= S[0]; i++) { + S[i - len] = S[i]; + } + + // ȼ + S[0] -= len; + + return OK; +} + +/* + * Ƚ + * + * ȽϴSʹTرȽϽ + * + *ע + * òСӼ + */ +int StrCompare(SString S, SString T) { + int i = 1; + + while(i <= S[0] && i <= T[0]) { + // ַͬʱȽС + if(S[i] != T[i]) { + return S[i] - T[i]; + } + + i++; + } + + return S[0] - T[0]; +} + +/* + * + * + * SƵT + */ +Status StrCopy(SString T, SString S) { + int i; + + // ͬϢһ + for(i = 0; i <= S[0]; i++) { + T[i] = S[i]; + } + + return OK; +} + +/* + * ַSеIJɴӡַո + * + *ע + * úڱġ + */ +Status ClearBlank(SString S) { + int i, j; + + // ǿմ + if(S[0] == 0) { + return ERROR; + } + + for(i = 1, j = 0; i <= S[0]; i++) { + // հףԹ + if(!isprint(S[i])) { + continue; + } + + j++; + + S[j] = S[i]; + } + + S[0] = j; + + return OK; +} diff --git a/VisualC++/ExerciseBook/05.35-05.36/SString.h b/VisualC++/ExerciseBook/05.35-05.36/SString.h new file mode 100644 index 0000000..3635a16 --- /dev/null +++ b/VisualC++/ExerciseBook/05.35-05.36/SString.h @@ -0,0 +1,117 @@ +/*============================= + * Ķ˳洢ʾ˳򴮣 + * + * 㷨: 4.14.24.34.5 + ==============================*/ + +#ifndef SSTRING_H +#define SSTRING_H + +#include +#include // ṩ strlen ԭ +#include // ṩ isprint ԭ +#include "Status.h" //**01 **// + +/* 궨 */ +#define MAXSTRLEN 255 // ˳򴮵󴮳 + +/* + * ˳洢Ͷ + * + * עЧԪشSString1ŵԪʼ洢 + * SString0ŵԪ洢䳤 + */ +typedef unsigned char SString[MAXSTRLEN + 1]; // 0ŵԪŴij + + +/* + * ʾ + * + * ѭ̲ĵдϰߣposָʾַλ()1ʼ + */ + + +/* + * ʼ + * + * һֵΪcharsĴT + * + *ע + * òСӼ + */ +Status StrAssign(SString T, const char* chars); + +/* + * + * + * Sա + */ +Status ClearString(SString S); + +/* + * п + * + * жϴSǷЧݡ + * + * ֵ + * TRUE : SΪ + * FALSE: SΪ + */ +Status StrEmpty(SString S); + +/* + * + * + * شSԪصĸ + * + *ע + * òСӼ + */ +int StrLength(SString S); + +/* + * 㷨4.3 + * + * Ӵ + * + * SubS[pos, pos+len-1] + * ֵָʾǷȡɹ + * + *ע + * òСӼ + */ +Status SubString(SString Sub, SString S, int pos, int len); + +/* + * ɾ + * + * ɾS[pos, pos+len-1] + */ +Status StrDelete(SString S, int pos, int len); + +/* + * Ƚ + * + * ȽϴSʹTرȽϽ + * + *ע + * òСӼ + */ +int StrCompare(SString S, SString T); + +/* + * + * + * SƵT + */ +Status StrCopy(SString T, SString S); + +/* + * ַSеIJɴӡַո + * + *ע + * úڱġ + */ +Status ClearBlank(SString S); + +#endif diff --git a/VisualC++/ExerciseBook/05.37.1/05.37.1.c b/VisualC++/ExerciseBook/05.37.1/05.37.1.c new file mode 100644 index 0000000..11b37d6 --- /dev/null +++ b/VisualC++/ExerciseBook/05.37.1/05.37.1.c @@ -0,0 +1,63 @@ +#include +#include "SString.h" //**04 **// +#include "GList-HT.h" //**05 ͹**// + +/* + * ɾֵΪxԭͷβ洢ʾ + */ +void Algo_5_37_1(GList* L, AtomType x); + + +int main(int argc, char* argv[]) { + GList L; + char* s = "((b),(e),(a,(b,c,d)),(b,((b),b)),x,b,(y))"; + SString S; + + printf(" L ...\n"); + StrAssign(S, s); + CreateGList(&L, S); + printf("L = "); + PrintGraph(L); + + printf("ɾ L еԪ 'b' ...\n"); + Algo_5_37_1(&L, 'b'); + printf("L = "); + PrintGraph(L); + + return 0; +} + + +/* + * ɾֵΪxԭͷβ洢ʾ + */ +void Algo_5_37_1(GList* L, AtomType x) { + GList h, p; + + if(L == NULL || *L == NULL || (*L)->tag == Atom) { + return; + } + + h = (*L)->Node.ptr.hp; + + if(h != NULL) { + if(h->tag == List) { + Algo_5_37_1(&((*L)->Node.ptr.hp), x); + Algo_5_37_1(&((*L)->Node.ptr.tp), x); + } else { + if(h->Node.atom == x) { + p = *L; + *L = (*L)->Node.ptr.tp; + p->Node.ptr.tp = NULL; + DestroyGList(&p); + Algo_5_37_1(L, x); + } else { + Algo_5_37_1(&((*L)->Node.ptr.tp), x); + } + } + } else { + if((*L)->Node.ptr.tp != NULL) { + Algo_5_37_1(&((*L)->Node.ptr.tp), x); + } + } +} diff --git a/VisualC++/ExerciseBook/05.37.1/05.37.1.vcxproj b/VisualC++/ExerciseBook/05.37.1/05.37.1.vcxproj new file mode 100644 index 0000000..d769f95 --- /dev/null +++ b/VisualC++/ExerciseBook/05.37.1/05.37.1.vcxproj @@ -0,0 +1,78 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {C034ACF3-B096-4A56-975A-A8497FC86E14} + My05371 + + + + 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/05.37.1/05.37.1.vcxproj.filters b/VisualC++/ExerciseBook/05.37.1/05.37.1.vcxproj.filters new file mode 100644 index 0000000..87c449a --- /dev/null +++ b/VisualC++/ExerciseBook/05.37.1/05.37.1.vcxproj.filters @@ -0,0 +1,36 @@ + + + + + {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/05.37.1/05.37.1.vcxproj.user b/VisualC++/ExerciseBook/05.37.1/05.37.1.vcxproj.user new file mode 100644 index 0000000..ace9a86 --- /dev/null +++ b/VisualC++/ExerciseBook/05.37.1/05.37.1.vcxproj.user @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/05.37.1/GList-HT.c b/VisualC++/ExerciseBook/05.37.1/GList-HT.c new file mode 100644 index 0000000..bad30df --- /dev/null +++ b/VisualC++/ExerciseBook/05.37.1/GList-HT.c @@ -0,0 +1,418 @@ +/*============================ + * ͷβ洢ʾ + * + * 㷨: 5.55.65.75.8 + =============================*/ + +#include "GList-HT.h" //**05 ͹**// + +/* + * ʼ + * + * ʼյĹΪ0Ϊ1 + * + *ע + * Ҫÿһȥſ + */ +Status InitGList(GList* L) { + if(L == NULL) { + return ERROR; + } + + *L = NULL; + + return OK; +} + +/* + * 㷨5.7 + * + * + * + * ַSL + */ +Status CreateGList(GList* L, SString S) { + SString emp; // չַ + SString hsub, sub; + GList p, q; + + if(L == NULL) { + return ERROR; + } + + // ַSеĿհףɴӡַո + ClearBlank(S); + + if(StrEmpty(S)) { + return ERROR; + } + + StrAssign(emp, "()"); + + /* + * 봮Ϊ()ҪյĹ + * + *ע + * ̲Ĵġ + * StrCompareķֵָʾַĴСָʾַǷȡ + * S()ȣֵӦ0 + */ + if(!StrCompare(S, emp)) { + *L = NULL; + } else { + *L = (GList) malloc(sizeof(GLNode)); + if(*L == NULL) { + exit(OVERFLOW); + } + + // ԭ + if(StrLength(S) == 1) { + (*L)->tag = Atom; + (*L)->Node.atom = S[1]; + } else { + (*L)->tag = List; + + p = *L; + + // ȥ + SubString(sub, S, 2, StrLength(S) - 2); + + // ظnӱ + do { + // subзͷhsubɺsubҲᷢ仯 + sever(hsub, sub); + + // ݹ鴴 + CreateGList(&(p->Node.ptr.hp), hsub); + + q = p; + + // βΪգҪβ + if(!StrEmpty(sub)) { + p = (GList) malloc(sizeof(GLNode)); + if(p == NULL) { + exit(OVERFLOW); + } + + p->tag = List; + + q->Node.ptr.tp = p; + } + } while(!StrEmpty(sub)); + + q->Node.ptr.tp = NULL; + } + } + + return OK; +} + +/* + * + * + * ͷŹռڴ档 + */ +Status DestroyGList(GList* L) { + GList head, tail; + + if(L == NULL || *L == NULL) { + return ERROR; + } + + // ɾԭӽ + if((*L)->tag == Atom) { + free(*L); + *L = NULL; + + // ɾӱ + } else { + head = (*L)->Node.ptr.hp; + tail = (*L)->Node.ptr.tp; + free(*L); + *L = NULL; + DestroyGList(&head); + DestroyGList(&tail); + } + + return OK; +} + +/* + * 㷨5.6 + * + * + * + * ɹLƵõT + */ +Status CopyGList(GList* T, GList L) { + if(T == NULL) { + return ERROR; + } + + if(L == NULL) { + *T = NULL; + } else { + // ½ + *T = (GList) malloc(sizeof(GLNode)); + if(*T == NULL) { + exit(OVERFLOW); + } + + (*T)->tag = L->tag; + + // Ƶԭ + if(L->tag == Atom) { + (*T)->Node.atom = L->Node.atom; + + // Ʊͷͱβ + } else { + CopyGList(&((*T)->Node.ptr.hp), L->Node.ptr.hp); + CopyGList(&((*T)->Node.ptr.tp), L->Node.ptr.tp); + } + } + + return OK; +} + +/* + * + * + * عijȡ + */ +int GListLength(GList L) { + int count; + + for(count = 0; L != NULL; count++, L = L->Node.ptr.tp) { + } + + return count; +} + +/* + * 㷨5.5 + * + * + * + * ع + */ +int GListDepth(GList L) { + int max, deep; + GList p; + + // ձΪ1 + if(L == NULL) { + return 1; + } + + // ԭΪ0 + if(L->tag == Atom) { + return 0; + } + + // ݹӱ + for(max = 0, p = L; p != NULL; p = p->Node.ptr.tp) { + deep = GListDepth(p->Node.ptr.hp); + if(deep > max) { + max = deep; + } + } + + // ǿձǸԪȼһ + return max + 1; +} + +/* + * п + * + * жϹǷΪա + */ +Status GListEmpty(GList L) { + return L == NULL ? TRUE : FALSE; +} + +/* + * ͷ + */ +GList GetHead(GList L) { + GList p; + + // ձޱͷﲻܷNULLȻֲʧ˻Ƿ˿ձ + if(L == NULL) { + exit(ERROR); + } + + CopyGList(&p, L->Node.ptr.hp); + + return p; +} + +/* + * β + */ +GList GetTail(GList L) { + GList p; + + // ձޱβﲻܷNULLȻֲʧ˻Ƿ˿ձ + if(L == NULL) { + exit(ERROR); + } + + CopyGList(&p, L->Node.ptr.tp); + + return p; +} + +/* + * + * + * ԪeΪLĵһԪء + */ +Status InsertFirst(GList* L, GList e) { + GList g; + + if(L == NULL) { + return ERROR; + } + + g = (GList) malloc(sizeof(GLNode)); + if(g == NULL) { + exit(OVERFLOW); + } + + g->tag = List; + g->Node.ptr.hp = e; + g->Node.ptr.tp = *L; + *L = g; + + return OK; +} + +/* + * ɾ + * + * LĵһԪɾeء + */ +Status DeleteFirst(GList* L, GList* e) { + GList p; + + // ձ޷ɾ + if(L == NULL || *L == NULL) { + return ERROR; + } + + p = *L; + *L = (*L)->Node.ptr.tp; + + CopyGList(e, p->Node.ptr.hp); + + free(p); + + return OK; +} + +/* + * + * + * visitʹL + */ +void Traverse(GList L, void(Visit)(AtomType)) { + + if(L == NULL) { + return; + } + + if(L->tag == Atom) { + Visit(L->Node.atom); + } else { + Traverse(L->Node.ptr.hp, Visit); + Traverse(L->Node.ptr.tp, Visit); + } + +} + +/* + * ͼλ + * + * L + */ +void PrintGraph(GList L) { + Print(L, Head); + printf("\n"); +} + +/* + * ͼλڲʵ֣markͼλǡ + */ +static void Print(GList L, Mark mark) { + // LΪ + if(L == NULL) { + if(mark == Head) { + printf("("); + } + + printf(")"); + + // LΪʱ + } else { + // ԭӽ㣬ԭ + if(L->tag == Atom) { + printf("%c", L->Node.atom); + + // ӱ㣬ҪԱͷβֱ + } else { + if(mark == Head) { + printf("("); + } else { + printf(","); + } + + Print(L->Node.ptr.hp, Head); + Print(L->Node.ptr.tp, Tail); + } + } +} + +/* + * 㷨5.8 + * + * ǿմstrָ֣hsubΪһ','֮ǰӴstrΪһ','֮Ӵ + * + *ע + * 1.ַstrȷ޿հ׷ţstrѾȥš + * 2.ɺstrҲᷢ仯 + */ +static void sever(SString hstr, SString str) { + int i, k, n; + SString ch; + + n = StrLength(str); + + i = 0; // ַʱα + k = 0; // δ + + do { + ++i; + + // ȡstrһַ + SubString(ch, str, i, 1); + + if(ch[1] == '(') { + ++k; + } + + if(ch[1] == ')') { + --k; + } + } while(i < n && (ch[1] != ',' || k != 0)); + + // ڶ + if(i < n) { + SubString(hstr, str, 1, i - 1); + SubString(str, str, i + 1, n - i); + + // ֻһ + } else { + StrCopy(hstr, str); + ClearString(str); + } +} diff --git a/VisualC++/ExerciseBook/05.37.1/GList-HT.h b/VisualC++/ExerciseBook/05.37.1/GList-HT.h new file mode 100644 index 0000000..508b96f --- /dev/null +++ b/VisualC++/ExerciseBook/05.37.1/GList-HT.h @@ -0,0 +1,164 @@ +/*============================ + * ͷβ洢ʾ + * + * 㷨: 5.55.65.75.8 + =============================*/ + +#ifndef GLIST_HT_H +#define GLIST_HT_H + +#include +#include // ṩ mallocreallocfreeexit ԭ +#include "Status.h" //**01 **// +#include "SString.h" //**04 **// + +/* ԭԪ */ +typedef char AtomType; + +/* + * + * + * Atom-0ԭӽ + * List-1 + */ +typedef enum { Atom, List } ElemTag; + +/* ͷβ洢ʾͶ */ +typedef struct GLNode { + ElemTag tag; // ǣԭӽͱ + + // ԭӽͱϲ + union { + AtomType atom; // atomԭӽֵAtomTypeû + struct { + struct GLNode* hp; // ָͷ + struct GLNode* tp; // ָβ + } ptr; // ָ + } Node; +} GLNode; + +/* */ +typedef GLNode* GList; + +/* + * ͼλ + * + * HeadָԱͷ + * TailָԱβ + */ +typedef enum { Head, Tail } Mark; + + +/* + * ʼ + * + * ʼյĹΪ0Ϊ1 + * + *ע + * Ҫÿһȥſ + */ +Status InitGList(GList* L); + +/* + * 㷨5.7 + * + * + * + * ַSL + */ +Status CreateGList(GList* L, SString S); + +/* + * + * + * ͷŹռڴ档 + */ +Status DestroyGList(GList* L); + +/* + * 㷨5.6 + * + * + * + * ɹLƵõT + */ +Status CopyGList(GList* T, GList L); + +/* + * + * + * عijȡ + */ +int GListLength(GList L); + +/* + * 㷨5.5 + * + * + * + * ع + */ +int GListDepth(GList L); + +/* + * п + * + * жϹǷΪա + */ +Status GListEmpty(GList L); + +/* + * ͷ + */ +GList GetHead(GList L); + +/* + * β + */ +GList GetTail(GList L); + +/* + * + * + * ԪeΪLĵһԪء + */ +Status InsertFirst(GList* L, GList e); + +/* + * ɾ + * + * LĵһԪɾeء + */ +Status DeleteFirst(GList* L, GList* e); + +/* + * + * + * visitʹL + */ +void Traverse(GList L, void (Visit)(AtomType)); + +/* + * ͼλ + * + * L + */ +void PrintGraph(GList L); + +/* + * ͼλڲʵ֣markͼλǡ + */ +static void Print(GList L, Mark mark); + +/* + * 㷨5.8 + * + * ǿմstrָ֣hsubΪһ','֮ǰӴstrΪһ','֮Ӵ + * + *ע + * 1.ַstrȷ޿հ׷ţstrѾȥš + * 2.ɺstrҲᷢ仯 + */ +static void sever(SString hstr, SString str); + +#endif diff --git a/VisualC++/ExerciseBook/05.37.1/SString.c b/VisualC++/ExerciseBook/05.37.1/SString.c new file mode 100644 index 0000000..7a96fcf --- /dev/null +++ b/VisualC++/ExerciseBook/05.37.1/SString.c @@ -0,0 +1,195 @@ +/*============================= + * Ķ˳洢ʾ˳򴮣 + * + * 㷨: 4.14.24.34.5 + ==============================*/ + +#include "SString.h" //**04 **// + +/* + * ʼ + * + * һֵΪcharsĴT + * + *ע + * òСӼ + */ +Status StrAssign(SString T, const char* chars) { + int i, len; + + len = (int) strlen(chars); + + // chars + if(len > MAXSTRLEN) { + return ERROR; + } + + T[0] = len; + for(i = 1; i <= len; i++) { + T[i] = chars[i - 1]; + } + + return OK; +} + +/* + * + * + * Sա + */ +Status ClearString(SString S) { + // ֻҪΪ0Ϳ + S[0] = 0; + return OK; +} + +/* + * п + * + * жϴSǷЧݡ + * + * ֵ + * TRUE : SΪ + * FALSE: SΪ + */ +Status StrEmpty(SString S) { + return S[0] == 0 ? TRUE : FALSE; +} + +/* + * + * + * شSԪصĸ + * + *ע + * òСӼ + */ +int StrLength(SString S) { + return S[0]; +} + +/* + * 㷨4.3 + * + * Ӵ + * + * SubS[pos, pos+len-1] + * ֵָʾǷȡɹ + * + *ע + * òСӼ + */ +Status SubString(SString Sub, SString S, int pos, int len) { + int i; + + if(pos < 1 || pos > S[0] || len < 0 || pos + len - 1 > S[0]) { + return ERROR; + } + + // Ԫ + for(i = 1; i <= len; i++) { + Sub[i] = S[pos + i - 1]; + } + + // ȷ³ + Sub[0] = len; + + return OK; +} + +/* + * ɾ + * + * ɾS[pos, pos+len-1] + */ +Status StrDelete(SString S, int pos, int len) { + int i; + + if(pos < 1 || pos + len - 1 > S[0] || len < 0) { + return ERROR; + } + + // ɾijΪ0ǰ + if(len == 0) { + return OK; + } + + // ѺԪŲǰ棬ǵɾԪ + for(i = pos + len; i <= S[0]; i++) { + S[i - len] = S[i]; + } + + // ȼ + S[0] -= len; + + return OK; +} + +/* + * Ƚ + * + * ȽϴSʹTرȽϽ + * + *ע + * òСӼ + */ +int StrCompare(SString S, SString T) { + int i = 1; + + while(i <= S[0] && i <= T[0]) { + // ַͬʱȽС + if(S[i] != T[i]) { + return S[i] - T[i]; + } + + i++; + } + + return S[0] - T[0]; +} + +/* + * + * + * SƵT + */ +Status StrCopy(SString T, SString S) { + int i; + + // ͬϢһ + for(i = 0; i <= S[0]; i++) { + T[i] = S[i]; + } + + return OK; +} + +/* + * ַSеĿհףɴӡַո + * + *ע + * úڱġ + */ +Status ClearBlank(SString S) { + int i, j; + + // ǿմ + if(S[0] == 0) { + return ERROR; + } + + for(i = 1, j = 0; i <= S[0]; i++) { + // հףԹ + if(S[i] == ' ' || !isprint(S[i])) { + continue; + } + + j++; + + S[j] = S[i]; + } + + S[0] = j; + + return OK; +} diff --git a/VisualC++/ExerciseBook/05.37.1/SString.h b/VisualC++/ExerciseBook/05.37.1/SString.h new file mode 100644 index 0000000..0632f18 --- /dev/null +++ b/VisualC++/ExerciseBook/05.37.1/SString.h @@ -0,0 +1,117 @@ +/*============================= + * Ķ˳洢ʾ˳򴮣 + * + * 㷨: 4.14.24.34.5 + ==============================*/ + +#ifndef SSTRING_H +#define SSTRING_H + +#include +#include // ṩ strlen ԭ +#include // ṩ isprint ԭ +#include "Status.h" //**01 **// + +/* 궨 */ +#define MAXSTRLEN 255 // ˳򴮵󴮳 + +/* + * ˳洢Ͷ + * + * עЧԪشSString1ŵԪʼ洢 + * SString0ŵԪ洢䳤 + */ +typedef unsigned char SString[MAXSTRLEN + 1]; // 0ŵԪŴij + + +/* + * ʾ + * + * ѭ̲ĵдϰߣposָʾַλ()1ʼ + */ + + +/* + * ʼ + * + * һֵΪcharsĴT + * + *ע + * òСӼ + */ +Status StrAssign(SString T, const char* chars); + +/* + * + * + * Sա + */ +Status ClearString(SString S); + +/* + * п + * + * жϴSǷЧݡ + * + * ֵ + * TRUE : SΪ + * FALSE: SΪ + */ +Status StrEmpty(SString S); + +/* + * + * + * شSԪصĸ + * + *ע + * òСӼ + */ +int StrLength(SString S); + +/* + * 㷨4.3 + * + * Ӵ + * + * SubS[pos, pos+len-1] + * ֵָʾǷȡɹ + * + *ע + * òСӼ + */ +Status SubString(SString Sub, SString S, int pos, int len); + +/* + * ɾ + * + * ɾS[pos, pos+len-1] + */ +Status StrDelete(SString S, int pos, int len); + +/* + * Ƚ + * + * ȽϴSʹTرȽϽ + * + *ע + * òСӼ + */ +int StrCompare(SString S, SString T); + +/* + * + * + * SƵT + */ +Status StrCopy(SString T, SString S); + +/* + * ַSеĿհףɴӡַո + * + *ע + * úڱġ + */ +Status ClearBlank(SString S); + +#endif diff --git a/VisualC++/ExerciseBook/05.37.2/05.37.2.c b/VisualC++/ExerciseBook/05.37.2/05.37.2.c new file mode 100644 index 0000000..9e5afb1 --- /dev/null +++ b/VisualC++/ExerciseBook/05.37.2/05.37.2.c @@ -0,0 +1,56 @@ +#include +#include // ṩmallocreallocfreeexitԭ +#include "SString.h" //**04 **// +#include "GList-E.h" //**05 ͹**// + +/* + * ɾֵΪxԭչ洢ʾ + */ +void Algo_5_37_2(GList* L, AtomType x); + + +int main(int argc, char* argv[]) { + GList L; + char* s = "((b),(e),(a,(b,c,d)),(b,((b),b)),x,b,(y))"; + SString S; + + printf(" L ...\n"); + StrAssign(S, s); + CreateGList(&L, S); + printf("L = "); + PrintGraph(L); + + printf("ɾ L еԪ 'b' ...\n"); + Algo_5_37_2(&L, 'b'); + printf("L = "); + PrintGraph(L); + + return 0; +} + + +/* + * ɾֵΪxԭչ洢ʾ + */ +void Algo_5_37_2(GList* L, AtomType x) { + GList p; + + if(L == NULL || *L == NULL) { + return; + } + + if((*L)->tag == List) { + Algo_5_37_2(&((*L)->Node.hp), x); + Algo_5_37_2(&((*L)->tp), x); + } else { + if((*L)->Node.atom == x) { + p = *L; + *L = (*L)->tp; + free(p); + + Algo_5_37_2(L, x); + } else { + Algo_5_37_2(&((*L)->tp), x); + } + } +} diff --git a/VisualC++/ExerciseBook/05.37.2/05.37.2.vcxproj b/VisualC++/ExerciseBook/05.37.2/05.37.2.vcxproj new file mode 100644 index 0000000..f1fdcae --- /dev/null +++ b/VisualC++/ExerciseBook/05.37.2/05.37.2.vcxproj @@ -0,0 +1,78 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {960F0527-2A12-49C5-B79C-21EBF9528B6C} + My05372 + + + + 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/05.37.2/05.37.2.vcxproj.filters b/VisualC++/ExerciseBook/05.37.2/05.37.2.vcxproj.filters new file mode 100644 index 0000000..5decfe3 --- /dev/null +++ b/VisualC++/ExerciseBook/05.37.2/05.37.2.vcxproj.filters @@ -0,0 +1,36 @@ + + + + + {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/05.37.2/05.37.2.vcxproj.user b/VisualC++/ExerciseBook/05.37.2/05.37.2.vcxproj.user new file mode 100644 index 0000000..ace9a86 --- /dev/null +++ b/VisualC++/ExerciseBook/05.37.2/05.37.2.vcxproj.user @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/05.37.2/GList-E.c b/VisualC++/ExerciseBook/05.37.2/GList-E.c new file mode 100644 index 0000000..3fc0ad9 --- /dev/null +++ b/VisualC++/ExerciseBook/05.37.2/GList-E.c @@ -0,0 +1,449 @@ +/*=========================== + * չ洢ʾ + ============================*/ + +#include "GList-E.h" //**05 ͹**// + +/* + * ʼ + * + * ʼյĹΪ0Ϊ1 + * + *ע + * Ҫÿһſ + */ +Status InitGList(GList* L) { + if(L == NULL) { + return ERROR; + } + + *L = (GList) malloc(sizeof(GLNode)); + if(!*L) { + exit(OVERFLOW); + } + + (*L)->tag = List; + (*L)->Node.hp = NULL; + (*L)->tp = NULL; + + return OK; +} + +/* + * + * + * ַSL + */ +Status CreateGList(GList* L, SString S) { + SString emp, hsub, sub, tmp; + + if(L == NULL) { + return ERROR; + } + + // ַSеĿհףɴӡַո + ClearBlank(S); + + if(StrEmpty(S)) { + return ERROR; + } + + // Ϊ˲ƻS + StrCopy(sub, S); + + /* + * ִеʱ + * ٴִеʱѾȥ + */ + sever(hsub, sub); + + *L = (GList) malloc(sizeof(GLNode)); + if(*L == NULL) { + exit(OVERFLOW); + } + + StrAssign(emp, "()"); + + if(!StrCompare(hsub, emp)) { + (*L)->tag = List; + (*L)->Node.hp = NULL; + } else { + if(StrLength(hsub) == 1) { + (*L)->tag = Atom; + (*L)->Node.atom = hsub[1]; + } else { + (*L)->tag = List; + + SubString(tmp, hsub, 2, StrLength(hsub) - 2); + + CreateGList(&((*L)->Node.hp), tmp); + } + } + + // ڶβ˳ݹ + if(StrEmpty(sub)) { + (*L)->tp = NULL; + } else { + // ݹβ + CreateGList(&((*L)->tp), sub); + } + + return OK; +} + +/* + * + * + * ͷŹռڴ档 + */ +Status DestroyGList(GList* L) { + GList head, tail; + + if(L == NULL || *L == NULL) { + return ERROR; + } + + // ӱ + if((*L)->tag == List) { + head = (*L)->Node.hp; // ͷ + tail = (*L)->tp; // β + + free(*L); + *L = NULL; + + // ݹ鴦ͷ + if(head != NULL) { + DestroyGList(&head); + } + + // ݹ鴦β + if(tail != NULL) { + DestroyGList(&tail); + } + + // ԭӽ + } else { + tail = (*L)->tp; // β + + free(*L); + *L = NULL; + + if(tail != NULL) { + DestroyGList(&tail); + } + } + + return OK; +} + +/* + * + * + * ɹLƵõT + */ +Status CopyGList(GList* T, GList L) { + + if(L == NULL) { + return ERROR; + } + + *T = (GList) malloc(sizeof(GLNode)); + if(*T == NULL) { + exit(OVERFLOW); + } + + // ԭ + if(L->tag == Atom) { + (*T)->tag = Atom; + (*T)->Node.atom = L->Node.atom; + + // ӱ + } else { + (*T)->tag = List; + + // Ʊͷ + if(L->Node.hp != NULL) { + CopyGList(&((*T)->Node.hp), L->Node.hp); + } else { + (*T)->Node.hp = NULL; + } + } + + // Ʊβ + if(L->tp != NULL) { + CopyGList(&((*T)->tp), L->tp); + } else { + (*T)->tp = NULL; + } + + return OK; +} + +/* + * + * + * عijȡ + */ +int GListLength(GList L) { + int count = 0; + GList p; + + // + if(L == NULL) { + return -1; + } + + p = L->Node.hp; + + while(p != NULL) { + ++count; + p = p->tp; + } + + return count; +} + +/* + * + * + * ع + */ +int GListDepth(GList L) { + int max, deep; + GList p; + + max = 0; + + // + if(L == NULL) { + return -1; + } + + // ձΪ1 + if(L->tag == List && !L->Node.hp) { + return 1; + } + + // ԭΪ0 + if(L->tag == Atom) { + return 0; + } + + // ݹӱ + for(p = L->Node.hp; p != NULL; p = p->tp) { + // pΪͷָӱ + deep = GListDepth(p); + if(deep > max) { + max = deep; + } + } + + return max + 1; +} + +/* + * п + * + * жϹǷΪա + */ +Status GListEmpty(GList L) { + // + if(L == NULL) { + return ERROR; + } + + if(L->tag == List && L->Node.hp == NULL && L->tp == NULL) { + return TRUE; + } else { + return ERROR; + } +} + +/* + * ͷ + */ +GList GetHead(GList L) { + GList p, q; + + // ڻΪձ޷ȡͷ + if(L == NULL || L->Node.hp == NULL) { + return NULL; + } + + q = L->Node.hp->tp; // ʱLıβϢ + L->Node.hp->tp = NULL; // ȥLıβ + + CopyGList(&p, L->Node.hp); // ƱͷϢαβ + + L->Node.hp->tp = q; // ָLıβϢ + + return p; +} + +/* + * β + */ +GList GetTail(GList L) { + GList p, q; + + // ڻΪձ޷ȡβ + if(L == NULL || L->Node.hp == NULL) { + return NULL; + } + + q = L->Node.hp; // ʱLıͷϢ + L->Node.hp = q->tp; // ժLıͷ + + CopyGList(&p, L); // ƱβϢαͷ + + q->tp = L->Node.hp; // ָLıͷϢ + L->Node.hp = q; + + return p; +} + +/* + * + * + * ԪeΪLĵһԪء + */ +Status InsertFirst(GList* L, GList e) { + + // + if(L == NULL || *L == NULL) { + return ERROR; + } + + if(e == NULL) { + return ERROR; + } + + e->tp = (*L)->Node.hp; + (*L)->Node.hp = e; + + return OK; +} + +/* + * ɾ + * + * LĵһԪɾeء + */ +Status DeleteFirst(GList* L, GList* e) { + GList p; + + // ڻΪձ޷ɾͷ + if(*L == NULL || (*L)->Node.hp == NULL) { + return ERROR; + } + + p = (*L)->Node.hp; + (*L)->Node.hp = p->tp; + p->tp = NULL; + + *e = p; + + return OK; +} + +/* + * + * + * visitʹL + */ +void Traverse(GList L, void(Visit)(AtomType)) { + if(L == NULL) { + return; + } + + if(L->tag == List) { + Traverse(L->Node.hp, Visit); + } else { + Visit(L->Node.atom); + } + + Traverse(L->tp, Visit); +} + +/* + * ͼλ + * + * L + */ +void PrintGraph(GList L) { + Print(L); + printf("\n"); +} + +/* + * ͼλڲʵ֡ + */ +static void Print(GList L) { + if(L == NULL) { + return; + } + + // + if(L->tag == List) { + printf("("); + + if(L->Node.hp) { + Print(L->Node.hp); + } + + if(L->tp) { + printf("),"); + Print(L->tp); + } else { + printf(")"); + } + + // ԭӽ + } else { + printf("%c", L->Node.atom); + if(L->tp) { + printf(","); + Print(L->tp); + } + } +} + +/* + * ǿմstrָ֣hsubΪһ','֮ǰӴstrΪһ','֮Ӵ + * + *ע + * 1.ַstrȷ޿հ׷ţ + * strſȥҲδȥ + * 2.ɺstrҲᷢ仯 + */ +static void sever(SString hstr, SString str) { + int i, k, n; + SString ch; + + n = StrLength(str); + + i = 0; // ַʱα + k = 0; // δ + + do { + ++i; + + // ȡstrһַ + SubString(ch, str, i, 1); + + if(ch[1] == '(') { + ++k; + } + if(ch[1] == ')') { + --k; + } + } while(i < n && (ch[1] != ',' || k != 0)); + + if(i < n) { + SubString(hstr, str, 1, i - 1); + SubString(str, str, i + 1, n - i); + } else { + StrCopy(hstr, str); + ClearString(str); + } +} diff --git a/VisualC++/ExerciseBook/05.37.2/GList-E.h b/VisualC++/ExerciseBook/05.37.2/GList-E.h new file mode 100644 index 0000000..fa9af82 --- /dev/null +++ b/VisualC++/ExerciseBook/05.37.2/GList-E.h @@ -0,0 +1,146 @@ +/*=========================== + * չ洢ʾ + ============================*/ + +#ifndef GLIST_E_H +#define GLIST_E_H + +#include +#include // ṩ mallocreallocfreeexit ԭ +#include "Status.h" //**01 **// +#include "SString.h" //**04 **// + +/* ԭԪ */ +typedef char AtomType; //ԭ + +/* + * + * + * Atom-0ԭӽ + * List-1 + */ +typedef enum { Atom, List } ElemTag; + +/* չ洢ʾͶ */ +typedef struct GLNode { + ElemTag tag; // ǣԭӽͱ + + // ԭӽͱϲ + union + { + AtomType atom; // atomԭӽֵAtomTypeû + struct GLNode* hp; // ָͷ + } Node; + struct GLNode* tp; // ָβ +} GLNode; + +/* */ +typedef GLNode* GList; + + +/* + * ʼ + * + * ʼյĹΪ0Ϊ1 + * + *ע + * Ҫÿһſ + */ +Status InitGList(GList* L); + +/* + * + * + * ַSL + */ +Status CreateGList(GList* L, SString S); + +/* + * + * + * ͷŹռڴ档 + */ +Status DestroyGList(GList* L); + +/* + * + * + * ɹLƵõT + */ +Status CopyGList(GList* T, GList L); + +/* + * + * + * عijȡ + */ +int GListLength(GList L); + +/* + * + * + * ع + */ +int GListDepth(GList L); + +/* + * п + * + * жϹǷΪա + */ +Status GListEmpty(GList L); + +/* + * ͷ + */ +GList GetHead(GList L); + +/* + * β + */ +GList GetTail(GList L); + +/* + * + * + * ԪeΪLĵһԪء + */ +Status InsertFirst(GList* L, GList e); + +/* + * ɾ + * + * LĵһԪɾeء + */ +Status DeleteFirst(GList* L, GList* e); + +/* + * + * + * visitʹL + */ +void Traverse(GList L, void(Visit)(AtomType)); + +/* + * ͼλ + * + * L + */ +void PrintGraph(GList L); + +/* + * ͼλڲʵ֡ + */ +static void Print(GList L); + +/* + * ǿմstrָ֣hsubΪһ','֮ǰӴstrΪһ','֮Ӵ + * + *ע + * 1.ַstrȷ޿հ׷ţ + * strſȥҲδȥ + * 2.ɺstrҲᷢ仯 + */ +static void sever(SString hstr, SString str); + +#endif diff --git a/VisualC++/ExerciseBook/05.37.2/SString.c b/VisualC++/ExerciseBook/05.37.2/SString.c new file mode 100644 index 0000000..7a96fcf --- /dev/null +++ b/VisualC++/ExerciseBook/05.37.2/SString.c @@ -0,0 +1,195 @@ +/*============================= + * Ķ˳洢ʾ˳򴮣 + * + * 㷨: 4.14.24.34.5 + ==============================*/ + +#include "SString.h" //**04 **// + +/* + * ʼ + * + * һֵΪcharsĴT + * + *ע + * òСӼ + */ +Status StrAssign(SString T, const char* chars) { + int i, len; + + len = (int) strlen(chars); + + // chars + if(len > MAXSTRLEN) { + return ERROR; + } + + T[0] = len; + for(i = 1; i <= len; i++) { + T[i] = chars[i - 1]; + } + + return OK; +} + +/* + * + * + * Sա + */ +Status ClearString(SString S) { + // ֻҪΪ0Ϳ + S[0] = 0; + return OK; +} + +/* + * п + * + * жϴSǷЧݡ + * + * ֵ + * TRUE : SΪ + * FALSE: SΪ + */ +Status StrEmpty(SString S) { + return S[0] == 0 ? TRUE : FALSE; +} + +/* + * + * + * شSԪصĸ + * + *ע + * òСӼ + */ +int StrLength(SString S) { + return S[0]; +} + +/* + * 㷨4.3 + * + * Ӵ + * + * SubS[pos, pos+len-1] + * ֵָʾǷȡɹ + * + *ע + * òСӼ + */ +Status SubString(SString Sub, SString S, int pos, int len) { + int i; + + if(pos < 1 || pos > S[0] || len < 0 || pos + len - 1 > S[0]) { + return ERROR; + } + + // Ԫ + for(i = 1; i <= len; i++) { + Sub[i] = S[pos + i - 1]; + } + + // ȷ³ + Sub[0] = len; + + return OK; +} + +/* + * ɾ + * + * ɾS[pos, pos+len-1] + */ +Status StrDelete(SString S, int pos, int len) { + int i; + + if(pos < 1 || pos + len - 1 > S[0] || len < 0) { + return ERROR; + } + + // ɾijΪ0ǰ + if(len == 0) { + return OK; + } + + // ѺԪŲǰ棬ǵɾԪ + for(i = pos + len; i <= S[0]; i++) { + S[i - len] = S[i]; + } + + // ȼ + S[0] -= len; + + return OK; +} + +/* + * Ƚ + * + * ȽϴSʹTرȽϽ + * + *ע + * òСӼ + */ +int StrCompare(SString S, SString T) { + int i = 1; + + while(i <= S[0] && i <= T[0]) { + // ַͬʱȽС + if(S[i] != T[i]) { + return S[i] - T[i]; + } + + i++; + } + + return S[0] - T[0]; +} + +/* + * + * + * SƵT + */ +Status StrCopy(SString T, SString S) { + int i; + + // ͬϢһ + for(i = 0; i <= S[0]; i++) { + T[i] = S[i]; + } + + return OK; +} + +/* + * ַSеĿհףɴӡַո + * + *ע + * úڱġ + */ +Status ClearBlank(SString S) { + int i, j; + + // ǿմ + if(S[0] == 0) { + return ERROR; + } + + for(i = 1, j = 0; i <= S[0]; i++) { + // հףԹ + if(S[i] == ' ' || !isprint(S[i])) { + continue; + } + + j++; + + S[j] = S[i]; + } + + S[0] = j; + + return OK; +} diff --git a/VisualC++/ExerciseBook/05.37.2/SString.h b/VisualC++/ExerciseBook/05.37.2/SString.h new file mode 100644 index 0000000..0632f18 --- /dev/null +++ b/VisualC++/ExerciseBook/05.37.2/SString.h @@ -0,0 +1,117 @@ +/*============================= + * Ķ˳洢ʾ˳򴮣 + * + * 㷨: 4.14.24.34.5 + ==============================*/ + +#ifndef SSTRING_H +#define SSTRING_H + +#include +#include // ṩ strlen ԭ +#include // ṩ isprint ԭ +#include "Status.h" //**01 **// + +/* 궨 */ +#define MAXSTRLEN 255 // ˳򴮵󴮳 + +/* + * ˳洢Ͷ + * + * עЧԪشSString1ŵԪʼ洢 + * SString0ŵԪ洢䳤 + */ +typedef unsigned char SString[MAXSTRLEN + 1]; // 0ŵԪŴij + + +/* + * ʾ + * + * ѭ̲ĵдϰߣposָʾַλ()1ʼ + */ + + +/* + * ʼ + * + * һֵΪcharsĴT + * + *ע + * òСӼ + */ +Status StrAssign(SString T, const char* chars); + +/* + * + * + * Sա + */ +Status ClearString(SString S); + +/* + * п + * + * жϴSǷЧݡ + * + * ֵ + * TRUE : SΪ + * FALSE: SΪ + */ +Status StrEmpty(SString S); + +/* + * + * + * شSԪصĸ + * + *ע + * òСӼ + */ +int StrLength(SString S); + +/* + * 㷨4.3 + * + * Ӵ + * + * SubS[pos, pos+len-1] + * ֵָʾǷȡɹ + * + *ע + * òСӼ + */ +Status SubString(SString Sub, SString S, int pos, int len); + +/* + * ɾ + * + * ɾS[pos, pos+len-1] + */ +Status StrDelete(SString S, int pos, int len); + +/* + * Ƚ + * + * ȽϴSʹTرȽϽ + * + *ע + * òСӼ + */ +int StrCompare(SString S, SString T); + +/* + * + * + * SƵT + */ +Status StrCopy(SString T, SString S); + +/* + * ַSеĿհףɴӡַո + * + *ע + * úڱġ + */ +Status ClearBlank(SString S); + +#endif diff --git a/VisualC++/ExerciseBook/05.38.1/05.38.1.c b/VisualC++/ExerciseBook/05.38.1/05.38.1.c new file mode 100644 index 0000000..c41ea76 --- /dev/null +++ b/VisualC++/ExerciseBook/05.38.1/05.38.1.c @@ -0,0 +1,47 @@ +#include +#include "SString.h" //**04 **// +#include "GList-HT.h" //**05 ͹**// + +/* + * еlԭ(ͷβ洢ʾ) + */ +void Algo_5_38_1(GList L, int d, int l); + + +int main(int argc, char* argv[]) { + GList L; + char* s = "((a),(b),(c,(d,e,f)),(g,((h),i)))"; + SString S; + + printf(" L ...\n"); + StrAssign(S, s); + CreateGList(&L, S); + printf("L = "); + PrintGraph(L); + + printf(" 2 ԭΪ"); + Algo_5_38_1(L, 0, 2); + printf("\n"); + + return 0; +} + + +/* + * еlԭ(ͷβ洢ʾ) + */ +void Algo_5_38_1(GList L, int d, int l) { + int i = d; // dijֵֵΪ0 + + if(L && l >= i) { + if(L->tag == Atom) { + // + if(l == i) { + printf("%c ", L->Node.atom); + } + } else { + Algo_5_38_1(L->Node.ptr.hp, i + 1, l); // ͷָָĻһ + Algo_5_38_1(L->Node.ptr.tp, i, l); + } + } +} diff --git a/VisualC++/ExerciseBook/05.38.1/05.38.1.vcxproj b/VisualC++/ExerciseBook/05.38.1/05.38.1.vcxproj new file mode 100644 index 0000000..db01959 --- /dev/null +++ b/VisualC++/ExerciseBook/05.38.1/05.38.1.vcxproj @@ -0,0 +1,78 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {679BE61B-60DE-4BC3-B8B0-B414175A376C} + My05381 + + + + 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/05.38.1/05.38.1.vcxproj.filters b/VisualC++/ExerciseBook/05.38.1/05.38.1.vcxproj.filters new file mode 100644 index 0000000..ca246ce --- /dev/null +++ b/VisualC++/ExerciseBook/05.38.1/05.38.1.vcxproj.filters @@ -0,0 +1,36 @@ + + + + + {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/05.38.1/05.38.1.vcxproj.user b/VisualC++/ExerciseBook/05.38.1/05.38.1.vcxproj.user new file mode 100644 index 0000000..ace9a86 --- /dev/null +++ b/VisualC++/ExerciseBook/05.38.1/05.38.1.vcxproj.user @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/05.38.1/GList-HT.c b/VisualC++/ExerciseBook/05.38.1/GList-HT.c new file mode 100644 index 0000000..bad30df --- /dev/null +++ b/VisualC++/ExerciseBook/05.38.1/GList-HT.c @@ -0,0 +1,418 @@ +/*============================ + * ͷβ洢ʾ + * + * 㷨: 5.55.65.75.8 + =============================*/ + +#include "GList-HT.h" //**05 ͹**// + +/* + * ʼ + * + * ʼյĹΪ0Ϊ1 + * + *ע + * Ҫÿһȥſ + */ +Status InitGList(GList* L) { + if(L == NULL) { + return ERROR; + } + + *L = NULL; + + return OK; +} + +/* + * 㷨5.7 + * + * + * + * ַSL + */ +Status CreateGList(GList* L, SString S) { + SString emp; // չַ + SString hsub, sub; + GList p, q; + + if(L == NULL) { + return ERROR; + } + + // ַSеĿհףɴӡַո + ClearBlank(S); + + if(StrEmpty(S)) { + return ERROR; + } + + StrAssign(emp, "()"); + + /* + * 봮Ϊ()ҪյĹ + * + *ע + * ̲Ĵġ + * StrCompareķֵָʾַĴСָʾַǷȡ + * S()ȣֵӦ0 + */ + if(!StrCompare(S, emp)) { + *L = NULL; + } else { + *L = (GList) malloc(sizeof(GLNode)); + if(*L == NULL) { + exit(OVERFLOW); + } + + // ԭ + if(StrLength(S) == 1) { + (*L)->tag = Atom; + (*L)->Node.atom = S[1]; + } else { + (*L)->tag = List; + + p = *L; + + // ȥ + SubString(sub, S, 2, StrLength(S) - 2); + + // ظnӱ + do { + // subзͷhsubɺsubҲᷢ仯 + sever(hsub, sub); + + // ݹ鴴 + CreateGList(&(p->Node.ptr.hp), hsub); + + q = p; + + // βΪգҪβ + if(!StrEmpty(sub)) { + p = (GList) malloc(sizeof(GLNode)); + if(p == NULL) { + exit(OVERFLOW); + } + + p->tag = List; + + q->Node.ptr.tp = p; + } + } while(!StrEmpty(sub)); + + q->Node.ptr.tp = NULL; + } + } + + return OK; +} + +/* + * + * + * ͷŹռڴ档 + */ +Status DestroyGList(GList* L) { + GList head, tail; + + if(L == NULL || *L == NULL) { + return ERROR; + } + + // ɾԭӽ + if((*L)->tag == Atom) { + free(*L); + *L = NULL; + + // ɾӱ + } else { + head = (*L)->Node.ptr.hp; + tail = (*L)->Node.ptr.tp; + free(*L); + *L = NULL; + DestroyGList(&head); + DestroyGList(&tail); + } + + return OK; +} + +/* + * 㷨5.6 + * + * + * + * ɹLƵõT + */ +Status CopyGList(GList* T, GList L) { + if(T == NULL) { + return ERROR; + } + + if(L == NULL) { + *T = NULL; + } else { + // ½ + *T = (GList) malloc(sizeof(GLNode)); + if(*T == NULL) { + exit(OVERFLOW); + } + + (*T)->tag = L->tag; + + // Ƶԭ + if(L->tag == Atom) { + (*T)->Node.atom = L->Node.atom; + + // Ʊͷͱβ + } else { + CopyGList(&((*T)->Node.ptr.hp), L->Node.ptr.hp); + CopyGList(&((*T)->Node.ptr.tp), L->Node.ptr.tp); + } + } + + return OK; +} + +/* + * + * + * عijȡ + */ +int GListLength(GList L) { + int count; + + for(count = 0; L != NULL; count++, L = L->Node.ptr.tp) { + } + + return count; +} + +/* + * 㷨5.5 + * + * + * + * ع + */ +int GListDepth(GList L) { + int max, deep; + GList p; + + // ձΪ1 + if(L == NULL) { + return 1; + } + + // ԭΪ0 + if(L->tag == Atom) { + return 0; + } + + // ݹӱ + for(max = 0, p = L; p != NULL; p = p->Node.ptr.tp) { + deep = GListDepth(p->Node.ptr.hp); + if(deep > max) { + max = deep; + } + } + + // ǿձǸԪȼһ + return max + 1; +} + +/* + * п + * + * жϹǷΪա + */ +Status GListEmpty(GList L) { + return L == NULL ? TRUE : FALSE; +} + +/* + * ͷ + */ +GList GetHead(GList L) { + GList p; + + // ձޱͷﲻܷNULLȻֲʧ˻Ƿ˿ձ + if(L == NULL) { + exit(ERROR); + } + + CopyGList(&p, L->Node.ptr.hp); + + return p; +} + +/* + * β + */ +GList GetTail(GList L) { + GList p; + + // ձޱβﲻܷNULLȻֲʧ˻Ƿ˿ձ + if(L == NULL) { + exit(ERROR); + } + + CopyGList(&p, L->Node.ptr.tp); + + return p; +} + +/* + * + * + * ԪeΪLĵһԪء + */ +Status InsertFirst(GList* L, GList e) { + GList g; + + if(L == NULL) { + return ERROR; + } + + g = (GList) malloc(sizeof(GLNode)); + if(g == NULL) { + exit(OVERFLOW); + } + + g->tag = List; + g->Node.ptr.hp = e; + g->Node.ptr.tp = *L; + *L = g; + + return OK; +} + +/* + * ɾ + * + * LĵһԪɾeء + */ +Status DeleteFirst(GList* L, GList* e) { + GList p; + + // ձ޷ɾ + if(L == NULL || *L == NULL) { + return ERROR; + } + + p = *L; + *L = (*L)->Node.ptr.tp; + + CopyGList(e, p->Node.ptr.hp); + + free(p); + + return OK; +} + +/* + * + * + * visitʹL + */ +void Traverse(GList L, void(Visit)(AtomType)) { + + if(L == NULL) { + return; + } + + if(L->tag == Atom) { + Visit(L->Node.atom); + } else { + Traverse(L->Node.ptr.hp, Visit); + Traverse(L->Node.ptr.tp, Visit); + } + +} + +/* + * ͼλ + * + * L + */ +void PrintGraph(GList L) { + Print(L, Head); + printf("\n"); +} + +/* + * ͼλڲʵ֣markͼλǡ + */ +static void Print(GList L, Mark mark) { + // LΪ + if(L == NULL) { + if(mark == Head) { + printf("("); + } + + printf(")"); + + // LΪʱ + } else { + // ԭӽ㣬ԭ + if(L->tag == Atom) { + printf("%c", L->Node.atom); + + // ӱ㣬ҪԱͷβֱ + } else { + if(mark == Head) { + printf("("); + } else { + printf(","); + } + + Print(L->Node.ptr.hp, Head); + Print(L->Node.ptr.tp, Tail); + } + } +} + +/* + * 㷨5.8 + * + * ǿմstrָ֣hsubΪһ','֮ǰӴstrΪһ','֮Ӵ + * + *ע + * 1.ַstrȷ޿հ׷ţstrѾȥš + * 2.ɺstrҲᷢ仯 + */ +static void sever(SString hstr, SString str) { + int i, k, n; + SString ch; + + n = StrLength(str); + + i = 0; // ַʱα + k = 0; // δ + + do { + ++i; + + // ȡstrһַ + SubString(ch, str, i, 1); + + if(ch[1] == '(') { + ++k; + } + + if(ch[1] == ')') { + --k; + } + } while(i < n && (ch[1] != ',' || k != 0)); + + // ڶ + if(i < n) { + SubString(hstr, str, 1, i - 1); + SubString(str, str, i + 1, n - i); + + // ֻһ + } else { + StrCopy(hstr, str); + ClearString(str); + } +} diff --git a/VisualC++/ExerciseBook/05.38.1/GList-HT.h b/VisualC++/ExerciseBook/05.38.1/GList-HT.h new file mode 100644 index 0000000..508b96f --- /dev/null +++ b/VisualC++/ExerciseBook/05.38.1/GList-HT.h @@ -0,0 +1,164 @@ +/*============================ + * ͷβ洢ʾ + * + * 㷨: 5.55.65.75.8 + =============================*/ + +#ifndef GLIST_HT_H +#define GLIST_HT_H + +#include +#include // ṩ mallocreallocfreeexit ԭ +#include "Status.h" //**01 **// +#include "SString.h" //**04 **// + +/* ԭԪ */ +typedef char AtomType; + +/* + * + * + * Atom-0ԭӽ + * List-1 + */ +typedef enum { Atom, List } ElemTag; + +/* ͷβ洢ʾͶ */ +typedef struct GLNode { + ElemTag tag; // ǣԭӽͱ + + // ԭӽͱϲ + union { + AtomType atom; // atomԭӽֵAtomTypeû + struct { + struct GLNode* hp; // ָͷ + struct GLNode* tp; // ָβ + } ptr; // ָ + } Node; +} GLNode; + +/* */ +typedef GLNode* GList; + +/* + * ͼλ + * + * HeadָԱͷ + * TailָԱβ + */ +typedef enum { Head, Tail } Mark; + + +/* + * ʼ + * + * ʼյĹΪ0Ϊ1 + * + *ע + * Ҫÿһȥſ + */ +Status InitGList(GList* L); + +/* + * 㷨5.7 + * + * + * + * ַSL + */ +Status CreateGList(GList* L, SString S); + +/* + * + * + * ͷŹռڴ档 + */ +Status DestroyGList(GList* L); + +/* + * 㷨5.6 + * + * + * + * ɹLƵõT + */ +Status CopyGList(GList* T, GList L); + +/* + * + * + * عijȡ + */ +int GListLength(GList L); + +/* + * 㷨5.5 + * + * + * + * ع + */ +int GListDepth(GList L); + +/* + * п + * + * жϹǷΪա + */ +Status GListEmpty(GList L); + +/* + * ͷ + */ +GList GetHead(GList L); + +/* + * β + */ +GList GetTail(GList L); + +/* + * + * + * ԪeΪLĵһԪء + */ +Status InsertFirst(GList* L, GList e); + +/* + * ɾ + * + * LĵһԪɾeء + */ +Status DeleteFirst(GList* L, GList* e); + +/* + * + * + * visitʹL + */ +void Traverse(GList L, void (Visit)(AtomType)); + +/* + * ͼλ + * + * L + */ +void PrintGraph(GList L); + +/* + * ͼλڲʵ֣markͼλǡ + */ +static void Print(GList L, Mark mark); + +/* + * 㷨5.8 + * + * ǿմstrָ֣hsubΪһ','֮ǰӴstrΪһ','֮Ӵ + * + *ע + * 1.ַstrȷ޿հ׷ţstrѾȥš + * 2.ɺstrҲᷢ仯 + */ +static void sever(SString hstr, SString str); + +#endif diff --git a/VisualC++/ExerciseBook/05.38.1/SString.c b/VisualC++/ExerciseBook/05.38.1/SString.c new file mode 100644 index 0000000..7a96fcf --- /dev/null +++ b/VisualC++/ExerciseBook/05.38.1/SString.c @@ -0,0 +1,195 @@ +/*============================= + * Ķ˳洢ʾ˳򴮣 + * + * 㷨: 4.14.24.34.5 + ==============================*/ + +#include "SString.h" //**04 **// + +/* + * ʼ + * + * һֵΪcharsĴT + * + *ע + * òСӼ + */ +Status StrAssign(SString T, const char* chars) { + int i, len; + + len = (int) strlen(chars); + + // chars + if(len > MAXSTRLEN) { + return ERROR; + } + + T[0] = len; + for(i = 1; i <= len; i++) { + T[i] = chars[i - 1]; + } + + return OK; +} + +/* + * + * + * Sա + */ +Status ClearString(SString S) { + // ֻҪΪ0Ϳ + S[0] = 0; + return OK; +} + +/* + * п + * + * жϴSǷЧݡ + * + * ֵ + * TRUE : SΪ + * FALSE: SΪ + */ +Status StrEmpty(SString S) { + return S[0] == 0 ? TRUE : FALSE; +} + +/* + * + * + * شSԪصĸ + * + *ע + * òСӼ + */ +int StrLength(SString S) { + return S[0]; +} + +/* + * 㷨4.3 + * + * Ӵ + * + * SubS[pos, pos+len-1] + * ֵָʾǷȡɹ + * + *ע + * òСӼ + */ +Status SubString(SString Sub, SString S, int pos, int len) { + int i; + + if(pos < 1 || pos > S[0] || len < 0 || pos + len - 1 > S[0]) { + return ERROR; + } + + // Ԫ + for(i = 1; i <= len; i++) { + Sub[i] = S[pos + i - 1]; + } + + // ȷ³ + Sub[0] = len; + + return OK; +} + +/* + * ɾ + * + * ɾS[pos, pos+len-1] + */ +Status StrDelete(SString S, int pos, int len) { + int i; + + if(pos < 1 || pos + len - 1 > S[0] || len < 0) { + return ERROR; + } + + // ɾijΪ0ǰ + if(len == 0) { + return OK; + } + + // ѺԪŲǰ棬ǵɾԪ + for(i = pos + len; i <= S[0]; i++) { + S[i - len] = S[i]; + } + + // ȼ + S[0] -= len; + + return OK; +} + +/* + * Ƚ + * + * ȽϴSʹTرȽϽ + * + *ע + * òСӼ + */ +int StrCompare(SString S, SString T) { + int i = 1; + + while(i <= S[0] && i <= T[0]) { + // ַͬʱȽС + if(S[i] != T[i]) { + return S[i] - T[i]; + } + + i++; + } + + return S[0] - T[0]; +} + +/* + * + * + * SƵT + */ +Status StrCopy(SString T, SString S) { + int i; + + // ͬϢһ + for(i = 0; i <= S[0]; i++) { + T[i] = S[i]; + } + + return OK; +} + +/* + * ַSеĿհףɴӡַո + * + *ע + * úڱġ + */ +Status ClearBlank(SString S) { + int i, j; + + // ǿմ + if(S[0] == 0) { + return ERROR; + } + + for(i = 1, j = 0; i <= S[0]; i++) { + // հףԹ + if(S[i] == ' ' || !isprint(S[i])) { + continue; + } + + j++; + + S[j] = S[i]; + } + + S[0] = j; + + return OK; +} diff --git a/VisualC++/ExerciseBook/05.38.1/SString.h b/VisualC++/ExerciseBook/05.38.1/SString.h new file mode 100644 index 0000000..0632f18 --- /dev/null +++ b/VisualC++/ExerciseBook/05.38.1/SString.h @@ -0,0 +1,117 @@ +/*============================= + * Ķ˳洢ʾ˳򴮣 + * + * 㷨: 4.14.24.34.5 + ==============================*/ + +#ifndef SSTRING_H +#define SSTRING_H + +#include +#include // ṩ strlen ԭ +#include // ṩ isprint ԭ +#include "Status.h" //**01 **// + +/* 궨 */ +#define MAXSTRLEN 255 // ˳򴮵󴮳 + +/* + * ˳洢Ͷ + * + * עЧԪشSString1ŵԪʼ洢 + * SString0ŵԪ洢䳤 + */ +typedef unsigned char SString[MAXSTRLEN + 1]; // 0ŵԪŴij + + +/* + * ʾ + * + * ѭ̲ĵдϰߣposָʾַλ()1ʼ + */ + + +/* + * ʼ + * + * һֵΪcharsĴT + * + *ע + * òСӼ + */ +Status StrAssign(SString T, const char* chars); + +/* + * + * + * Sա + */ +Status ClearString(SString S); + +/* + * п + * + * жϴSǷЧݡ + * + * ֵ + * TRUE : SΪ + * FALSE: SΪ + */ +Status StrEmpty(SString S); + +/* + * + * + * شSԪصĸ + * + *ע + * òСӼ + */ +int StrLength(SString S); + +/* + * 㷨4.3 + * + * Ӵ + * + * SubS[pos, pos+len-1] + * ֵָʾǷȡɹ + * + *ע + * òСӼ + */ +Status SubString(SString Sub, SString S, int pos, int len); + +/* + * ɾ + * + * ɾS[pos, pos+len-1] + */ +Status StrDelete(SString S, int pos, int len); + +/* + * Ƚ + * + * ȽϴSʹTرȽϽ + * + *ע + * òСӼ + */ +int StrCompare(SString S, SString T); + +/* + * + * + * SƵT + */ +Status StrCopy(SString T, SString S); + +/* + * ַSеĿհףɴӡַո + * + *ע + * úڱġ + */ +Status ClearBlank(SString S); + +#endif diff --git a/VisualC++/ExerciseBook/05.38.2/05.38.2.c b/VisualC++/ExerciseBook/05.38.2/05.38.2.c new file mode 100644 index 0000000..ed3096f --- /dev/null +++ b/VisualC++/ExerciseBook/05.38.2/05.38.2.c @@ -0,0 +1,48 @@ +#include +#include "SString.h" //**04 **// +#include "GList-E.h" //**05 ͹**// + +/* + * еlԭ(չ洢ʾ) + */ +void Algo_5_38_2(GList L, int d, int l); + + +int main(int argc, char* argv[]) { + GList L; + char* s = "((a),(b),(c,(d,e,f)),(g,((h),i)))"; + SString S; + + printf(" L ...\n"); + StrAssign(S, s); + CreateGList(&L, S); + printf("L = "); + PrintGraph(L); + + printf(" 2 ԭΪ"); + Algo_5_38_2(L, 0, 2); + printf("\n"); + + return 0; +} + + +/* + * еlԭ(չ洢ʾ) + */ +void Algo_5_38_2(GList L, int d, int l) { + int i = d; // dijֵֵΪ0 + + if(L && l >= i) { + if(L->tag == Atom) { + // + if(l == i) { + printf("%c ", L->Node.atom); + } + } else { + Algo_5_38_2(L->Node.hp, i + 1, l); // ͷָָĻһ + } + + Algo_5_38_2(L->tp, i, l); + } +} diff --git a/VisualC++/ExerciseBook/05.38.2/05.38.2.vcxproj b/VisualC++/ExerciseBook/05.38.2/05.38.2.vcxproj new file mode 100644 index 0000000..7c21ba8 --- /dev/null +++ b/VisualC++/ExerciseBook/05.38.2/05.38.2.vcxproj @@ -0,0 +1,78 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + + {564E9CB9-3C86-4823-98A5-777D1B0A3104} + My05382 + + + + 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/05.38.2/05.38.2.vcxproj.filters b/VisualC++/ExerciseBook/05.38.2/05.38.2.vcxproj.filters new file mode 100644 index 0000000..d067555 --- /dev/null +++ b/VisualC++/ExerciseBook/05.38.2/05.38.2.vcxproj.filters @@ -0,0 +1,36 @@ + + + + + {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/05.38.2/05.38.2.vcxproj.user b/VisualC++/ExerciseBook/05.38.2/05.38.2.vcxproj.user new file mode 100644 index 0000000..ace9a86 --- /dev/null +++ b/VisualC++/ExerciseBook/05.38.2/05.38.2.vcxproj.user @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/VisualC++/ExerciseBook/05.38.2/GList-E.c b/VisualC++/ExerciseBook/05.38.2/GList-E.c new file mode 100644 index 0000000..3fc0ad9 --- /dev/null +++ b/VisualC++/ExerciseBook/05.38.2/GList-E.c @@ -0,0 +1,449 @@ +/*=========================== + * չ洢ʾ + ============================*/ + +#include "GList-E.h" //**05 ͹**// + +/* + * ʼ + * + * ʼյĹΪ0Ϊ1 + * + *ע + * Ҫÿһſ + */ +Status InitGList(GList* L) { + if(L == NULL) { + return ERROR; + } + + *L = (GList) malloc(sizeof(GLNode)); + if(!*L) { + exit(OVERFLOW); + } + + (*L)->tag = List; + (*L)->Node.hp = NULL; + (*L)->tp = NULL; + + return OK; +} + +/* + * + * + * ַSL + */ +Status CreateGList(GList* L, SString S) { + SString emp, hsub, sub, tmp; + + if(L == NULL) { + return ERROR; + } + + // ַSеĿհףɴӡַո + ClearBlank(S); + + if(StrEmpty(S)) { + return ERROR; + } + + // Ϊ˲ƻS + StrCopy(sub, S); + + /* + * ִеʱ + * ٴִеʱѾȥ + */ + sever(hsub, sub); + + *L = (GList) malloc(sizeof(GLNode)); + if(*L == NULL) { + exit(OVERFLOW); + } + + StrAssign(emp, "()"); + + if(!StrCompare(hsub, emp)) { + (*L)->tag = List; + (*L)->Node.hp = NULL; + } else { + if(StrLength(hsub) == 1) { + (*L)->tag = Atom; + (*L)->Node.atom = hsub[1]; + } else { + (*L)->tag = List; + + SubString(tmp, hsub, 2, StrLength(hsub) - 2); + + CreateGList(&((*L)->Node.hp), tmp); + } + } + + // ڶβ˳ݹ + if(StrEmpty(sub)) { + (*L)->tp = NULL; + } else { + // ݹβ + CreateGList(&((*L)->tp), sub); + } + + return OK; +} + +/* + * + * + * ͷŹռڴ档 + */ +Status DestroyGList(GList* L) { + GList head, tail; + + if(L == NULL || *L == NULL) { + return ERROR; + } + + // ӱ + if((*L)->tag == List) { + head = (*L)->Node.hp; // ͷ + tail = (*L)->tp; // β + + free(*L); + *L = NULL; + + // ݹ鴦ͷ + if(head != NULL) { + DestroyGList(&head); + } + + // ݹ鴦β + if(tail != NULL) { + DestroyGList(&tail); + } + + // ԭӽ + } else { + tail = (*L)->tp; // β + + free(*L); + *L = NULL; + + if(tail != NULL) { + DestroyGList(&tail); + } + } + + return OK; +} + +/* + * + * + * ɹLƵõT + */ +Status CopyGList(GList* T, GList L) { + + if(L == NULL) { + return ERROR; + } + + *T = (GList) malloc(sizeof(GLNode)); + if(*T == NULL) { + exit(OVERFLOW); + } + + // ԭ + if(L->tag == Atom) { + (*T)->tag = Atom; + (*T)->Node.atom = L->Node.atom; + + // ӱ + } else { + (*T)->tag = List; + + // Ʊͷ + if(L->Node.hp != NULL) { + CopyGList(&((*T)->Node.hp), L->Node.hp); + } else { + (*T)->Node.hp = NULL; + } + } + + // Ʊβ + if(L->tp != NULL) { + CopyGList(&((*T)->tp), L->tp); + } else { + (*T)->tp = NULL; + } + + return OK; +} + +/* + * + * + * عijȡ + */ +int GListLength(GList L) { + int count = 0; + GList p; + + // + if(L == NULL) { + return -1; + } + + p = L->Node.hp; + + while(p != NULL) { + ++count; + p = p->tp; + } + + return count; +} + +/* + * + * + * ع + */ +int GListDepth(GList L) { + int max, deep; + GList p; + + max = 0; + + // + if(L == NULL) { + return -1; + } + + // ձΪ1 + if(L->tag == List && !L->Node.hp) { + return 1; + } + + // ԭΪ0 + if(L->tag == Atom) { + return 0; + } + + // ݹӱ + for(p = L->Node.hp; p != NULL; p = p->tp) { + // pΪͷָӱ + deep = GListDepth(p); + if(deep > max) { + max = deep; + } + } + + return max + 1; +} + +/* + * п + * + * жϹǷΪա + */ +Status GListEmpty(GList L) { + // + if(L == NULL) { + return ERROR; + } + + if(L->tag == List && L->Node.hp == NULL && L->tp == NULL) { + return TRUE; + } else { + return ERROR; + } +} + +/* + * ͷ + */ +GList GetHead(GList L) { + GList p, q; + + // ڻΪձ޷ȡͷ + if(L == NULL || L->Node.hp == NULL) { + return NULL; + } + + q = L->Node.hp->tp; // ʱLıβϢ + L->Node.hp->tp = NULL; // ȥLıβ + + CopyGList(&p, L->Node.hp); // ƱͷϢαβ + + L->Node.hp->tp = q; // ָLıβϢ + + return p; +} + +/* + * β + */ +GList GetTail(GList L) { + GList p, q; + + // ڻΪձ޷ȡβ + if(L == NULL || L->Node.hp == NULL) { + return NULL; + } + + q = L->Node.hp; // ʱLıͷϢ + L->Node.hp = q->tp; // ժLıͷ + + CopyGList(&p, L); // ƱβϢαͷ + + q->tp = L->Node.hp; // ָLıͷϢ + L->Node.hp = q; + + return p; +} + +/* + * + * + * ԪeΪLĵһԪء + */ +Status InsertFirst(GList* L, GList e) { + + // + if(L == NULL || *L == NULL) { + return ERROR; + } + + if(e == NULL) { + return ERROR; + } + + e->tp = (*L)->Node.hp; + (*L)->Node.hp = e; + + return OK; +} + +/* + * ɾ + * + * LĵһԪɾeء + */ +Status DeleteFirst(GList* L, GList* e) { + GList p; + + // ڻΪձ޷ɾͷ + if(*L == NULL || (*L)->Node.hp == NULL) { + return ERROR; + } + + p = (*L)->Node.hp; + (*L)->Node.hp = p->tp; + p->tp = NULL; + + *e = p; + + return OK; +} + +/* + * + * + * visitʹL + */ +void Traverse(GList L, void(Visit)(AtomType)) { + if(L == NULL) { + return; + } + + if(L->tag == List) { + Traverse(L->Node.hp, Visit); + } else { + Visit(L->Node.atom); + } + + Traverse(L->tp, Visit); +} + +/* + * ͼλ + * + * L + */ +void PrintGraph(GList L) { + Print(L); + printf("\n"); +} + +/* + * ͼλڲʵ֡ + */ +static void Print(GList L) { + if(L == NULL) { + return; + } + + // + if(L->tag == List) { + printf("("); + + if(L->Node.hp) { + Print(L->Node.hp); + } + + if(L->tp) { + printf("),"); + Print(L->tp); + } else { + printf(")"); + } + + // ԭӽ + } else { + printf("%c", L->Node.atom); + if(L->tp) { + printf(","); + Print(L->tp); + } + } +} + +/* + * ǿմstrָ֣hsubΪһ','֮ǰӴstrΪһ','֮Ӵ + * + *ע + * 1.ַstrȷ޿հ׷ţ + * strſȥҲδȥ + * 2.ɺstrҲᷢ仯 + */ +static void sever(SString hstr, SString str) { + int i, k, n; + SString ch; + + n = StrLength(str); + + i = 0; // ַʱα + k = 0; // δ + + do { + ++i; + + // ȡstrһַ + SubString(ch, str, i, 1); + + if(ch[1] == '(') { + ++k; + } + if(ch[1] == ')') { + --k; + } + } while(i < n && (ch[1] != ',' || k != 0)); + + if(i < n) { + SubString(hstr, str, 1, i - 1); + SubString(str, str, i + 1, n - i); + } else { + StrCopy(hstr, str); + ClearString(str); + } +} diff --git a/VisualC++/ExerciseBook/05.38.2/GList-E.h b/VisualC++/ExerciseBook/05.38.2/GList-E.h new file mode 100644 index 0000000..fa9af82 --- /dev/null +++ b/VisualC++/ExerciseBook/05.38.2/GList-E.h @@ -0,0 +1,146 @@ +/*=========================== + * չ洢ʾ + ============================*/ + +#ifndef GLIST_E_H +#define GLIST_E_H + +#include +#include // ṩ mallocreallocfreeexit ԭ +#include "Status.h" //**01 **// +#include "SString.h" //**04 **// + +/* ԭԪ */ +typedef char AtomType; //ԭ + +/* + * + * + * Atom-0ԭӽ + * List-1 + */ +typedef enum { Atom, List } ElemTag; + +/* չ洢ʾͶ */ +typedef struct GLNode { + ElemTag tag; // ǣԭӽͱ + + // ԭӽͱϲ + union + { + AtomType atom; // atomԭӽֵAtomTypeû + struct GLNode* hp; // ָͷ + } Node; + struct GLNode* tp; // ָβ +} GLNode; + +/* */ +typedef GLNode* GList; + + +/* + * ʼ + * + * ʼյĹΪ0Ϊ1 + * + *ע + * Ҫÿһſ + */ +Status InitGList(GList* L); + +/* + * + * + * ַSL + */ +Status CreateGList(GList* L, SString S); + +/* + * + * + * ͷŹռڴ档 + */ +Status DestroyGList(GList* L); + +/* + * + * + * ɹLƵõT + */ +Status CopyGList(GList* T, GList L); + +/* + * + * + * عijȡ + */ +int GListLength(GList L); + +/* + * + * + * ع + */ +int GListDepth(GList L); + +/* + * п + * + * жϹǷΪա + */ +Status GListEmpty(GList L); + +/* + * ͷ + */ +GList GetHead(GList L); + +/* + * β + */ +GList GetTail(GList L); + +/* + * + * + * ԪeΪLĵһԪء + */ +Status InsertFirst(GList* L, GList e); + +/* + * ɾ + * + * LĵһԪɾeء + */ +Status DeleteFirst(GList* L, GList* e); + +/* + * + * + * visitʹL + */ +void Traverse(GList L, void(Visit)(AtomType)); + +/* + * ͼλ + * + * L + */ +void PrintGraph(GList L); + +/* + * ͼλڲʵ֡ + */ +static void Print(GList L); + +/* + * ǿմstrָ֣hsubΪһ','֮ǰӴstrΪһ','֮Ӵ + * + *ע + * 1.ַstrȷ޿հ׷ţ + * strſȥҲδȥ + * 2.ɺstrҲᷢ仯 + */ +static void sever(SString hstr, SString str); + +#endif diff --git a/VisualC++/ExerciseBook/05.38.2/SString.c b/VisualC++/ExerciseBook/05.38.2/SString.c new file mode 100644 index 0000000..7a96fcf --- /dev/null +++ b/VisualC++/ExerciseBook/05.38.2/SString.c @@ -0,0 +1,195 @@ +/*============================= + * Ķ˳洢ʾ˳򴮣 + * + * 㷨: 4.14.24.34.5 + ==============================*/ + +#include "SString.h" //**04 **// + +/* + * ʼ + * + * һֵΪcharsĴT + * + *ע + * òСӼ + */ +Status StrAssign(SString T, const char* chars) { + int i, len; + + len = (int) strlen(chars); + + // chars + if(len > MAXSTRLEN) { + return ERROR; + } + + T[0] = len; + for(i = 1; i <= len; i++) { + T[i] = chars[i - 1]; + } + + return OK; +} + +/* + * + * + * Sա + */ +Status ClearString(SString S) { + // ֻҪΪ0Ϳ + S[0] = 0; + return OK; +} + +/* + * п + * + * жϴSǷЧݡ + * + * ֵ + * TRUE : SΪ + * FALSE: SΪ + */ +Status StrEmpty(SString S) { + return S[0] == 0 ? TRUE : FALSE; +} + +/* + * + * + * شSԪصĸ + * + *ע + * òСӼ + */ +int StrLength(SString S) { + return S[0]; +} + +/* + * 㷨4.3 + * + * Ӵ + * + * SubS[pos, pos+len-1] + * ֵָʾǷȡɹ + * + *ע + * òСӼ + */ +Status SubString(SString Sub, SString S, int pos, int len) { + int i; + + if(pos < 1 || pos > S[0] || len < 0 || pos + len - 1 > S[0]) { + return ERROR; + } + + // Ԫ + for(i = 1; i <= len; i++) { + Sub[i] = S[pos + i - 1]; + } + + // ȷ³ + Sub[0] = len; + + return OK; +} + +/* + * ɾ + * + * ɾS[pos, pos+len-1] + */ +Status StrDelete(SString S, int pos, int len) { + int i; + + if(pos < 1 || pos + len - 1 > S[0] || len < 0) { + return ERROR; + } + + // ɾijΪ0ǰ + if(len == 0) { + return OK; + } + + // ѺԪŲǰ棬ǵɾԪ + for(i = pos + len; i <= S[0]; i++) { + S[i - len] = S[i]; + } + + // ȼ + S[0] -= len; + + return OK; +} + +/* + * Ƚ + * + * ȽϴSʹTرȽϽ + * + *ע + * òСӼ + */ +int StrCompare(SString S, SString T) { + int i = 1; + + while(i <= S[0] && i <= T[0]) { + // ַͬʱȽС + if(S[i] != T[i]) { + return S[i] - T[i]; + } + + i++; + } + + return S[0] - T[0]; +} + +/* + * + * + * SƵT + */ +Status StrCopy(SString T, SString S) { + int i; + + // ͬϢһ + for(i = 0; i <= S[0]; i++) { + T[i] = S[i]; + } + + return OK; +} + +/* + * ַSеĿհףɴӡַո + * + *ע + * úڱġ + */ +Status ClearBlank(SString S) { + int i, j; + + // ǿմ + if(S[0] == 0) { + return ERROR; + } + + for(i = 1, j = 0; i <= S[0]; i++) { + // հףԹ + if(S[i] == ' ' || !isprint(S[i])) { + continue; + } + + j++; + + S[j] = S[i]; + } + + S[0] = j; + + return OK; +} diff --git a/VisualC++/ExerciseBook/05.38.2/SString.h b/VisualC++/ExerciseBook/05.38.2/SString.h new file mode 100644 index 0000000..0632f18 --- /dev/null +++ b/VisualC++/ExerciseBook/05.38.2/SString.h @@ -0,0 +1,117 @@ +/*============================= + * Ķ˳洢ʾ˳򴮣 + * + * 㷨: 4.14.24.34.5 + ==============================*/ + +#ifndef SSTRING_H +#define SSTRING_H + +#include +#include // ṩ strlen ԭ +#include // ṩ isprint ԭ +#include "Status.h" //**01 **// + +/* 궨 */ +#define MAXSTRLEN 255 // ˳򴮵󴮳 + +/* + * ˳洢Ͷ + * + * עЧԪشSString1ŵԪʼ洢 + * SString0ŵԪ洢䳤 + */ +typedef unsigned char SString[MAXSTRLEN + 1]; // 0ŵԪŴij + + +/* + * ʾ + * + * ѭ̲ĵдϰߣposָʾַλ()1ʼ + */ + + +/* + * ʼ + * + * һֵΪcharsĴT + * + *ע + * òСӼ + */ +Status StrAssign(SString T, const char* chars); + +/* + * + * + * Sա + */ +Status ClearString(SString S); + +/* + * п + * + * жϴSǷЧݡ + * + * ֵ + * TRUE : SΪ + * FALSE: SΪ + */ +Status StrEmpty(SString S); + +/* + * + * + * شSԪصĸ + * + *ע + * òСӼ + */ +int StrLength(SString S); + +/* + * 㷨4.3 + * + * Ӵ + * + * SubS[pos, pos+len-1] + * ֵָʾǷȡɹ + * + *ע + * òСӼ + */ +Status SubString(SString Sub, SString S, int pos, int len); + +/* + * ɾ + * + * ɾS[pos, pos+len-1] + */ +Status StrDelete(SString S, int pos, int len); + +/* + * Ƚ + * + * ȽϴSʹTرȽϽ + * + *ע + * òСӼ + */ +int StrCompare(SString S, SString T); + +/* + * + * + * SƵT + */ +Status StrCopy(SString T, SString S); + +/* + * ַSеĿհףɴӡַո + * + *ע + * úڱġ + */ +Status ClearBlank(SString S); + +#endif diff --git a/VisualC++/ExerciseBook/ExerciseBook.sdf b/VisualC++/ExerciseBook/ExerciseBook.sdf index 67505ba73cfbd9e621e24704ee5683e4c3663bdb..4eadf33d9a770b1948f4cd2c07aeaa83ef4663f2 100644 GIT binary patch delta 819057 zcmd44cYGUF);B&g>RqyWZ+4m;AtiAVr&&rPJyJqXlM_-XNh}g-iljgwJrW_g1VWH0 zfrS9}LNE{(B>L`BY|2s>WMKE9Eo*OOcY(a;%pEy$mfhd)`RDz-cam_Po#Ve@BEzhJ-zfOuWrIwf)iccRR19MV`a{z8 zuG-THW$qB!jY1$R1bX}@11(YBmC<{aM?GRSY5ctTR%%QHVY%^Xv(C-?Kr zf1GAE?N<2mOj!>(8KLJ*%kV;tzpC@W=UB6b6z8*1``7DlX%2wsHwhhsiO->;ciMf@ zZ`m{w-qT4kuiA?{_yBvWm}QpP%`-cyn19oR_wvklPBU4ly=x!y<&URM{jrK^(X{Vp zu9ja-)nSb(zRxz789}Gw<1zJ=4V^a_cw7*iIFfGuKPJ2;0 zofgP{I&+56cHP8_NvfGT-!7h6tY)gpdwAw&)l4z7pJz%=3k0p*n`2B+pt@?NOFx@2 zb|yQdb?i!vA~~H*NEGO$QfxcTj3k3eTCJU@nWMh26!!5Metnubc9*I>&sU4XH7v_;Oe^y?@V`TuQd&;COIxSC zi-n8PhR6`!965KdPd8Za1VY@qGM$C zw7+XRa}pvvO(Tqe;20Rw-vxLdMBq3MC8#Z4%s?RKD^Ot|L8C^*=k6)&X8KN@I`u3~ zUF!Zz1+OGTRu?K|7Y!lE<<9M8{si251qqLpt>>=&k+hAKnIqP&wamxBx6yLtwL7&l zpu+On!?KYmat&WqLElP74C#xY5fg8E9m?o#<_C!NJ81LNJ6;QU;R$(N&n|X?nLZUg+3EXby)dSKWFp<0XzJ*&vgzcpmdGB<809_=sd;lWa(*a=h#cak}tu z{CN3+@cmuK!uR^_*0*&XZ9P)FO@FxSmevFMo0*(%Py4R;&gf0??aAxQnM_*0wRKbG zTIOos#$qbmnpx+&Ja;LxCcLtDd2VUzh0OWMh4FZKPV3C#^scGC$>C=GMBljZ*yQNm z5t*}c_4+|fZEL{ii@TDJUQ1ll%1O$dKX_S@-v082r4I~-2clHb6FI6UBB1!Vi`gWU zfw5xwGfGh=ixhJcB~8g4Jox}6we3_@yg^Bwpd`MbBnSEqFBR5DMky)g`1%{BAlLi3 z6(iBh$cMC8qcoR?C}}FwWIv^(IJ%FIXi<=F{M;1|jCi38(+pa><}m?ilkI%Svq<|I z!@|x5L2j1X)H|FRu5a+whlfRn#)l*aw+_nGk@mB=xP8cjBfEw`@q?A(w^MyEtka%U zzRNBK6+Me~TaNFlrsP_F%9FuNDo?nQ_wwm4=2iOlG`tcz_y{dLY0#C~cq_w!Xg|YAIwHjT1rA4xmIJ6T6hJlZ(b$bW)8&zXced3>oJpkC*CZOEv0T8W^P}i#e_F z72#f92GBs2Y3vAW6hMPelL7D`IC2170U*#0peX_7U=XEHiN(mgCa=F0CHv< zqp=~Vd;nSm1A+;`nnrXZ_z;2!tZzG`5d)w~M@`MwqO-V*(HNn*G*$$C62OGOl>wv( zK?IS04`f&Xa3Pr5kwh>g_c9tYg0>Z)20@f=2b3W&MF25^U%wAXcuqBL1V4fS9)FD) zK@0N)O$~w~4xmAhCif2%RtXG^y9nS17*GyJxtfuNuHzZN0fsu78yH7_CPSV)BZT@) zh8Sip1M-!h$zYj0Gc8?R#S-LHGaT_V7@jj3*48sZIL~C5%V&hJS2Jw*?9}w05yaA) zC*QuQd`GX-hqp62UHgrUP7KpK9ohUson0jDy{Yrdx0HQcS`EEKr$z7~)FOy6iV8uE zU_h`VI1vCePV)p-txqTuKWy_o*w+4UEb_r`lt(&??2CL2ugAwW~nx{AT=L$>eXREtO{%Mi%xg$S)vzk2*w>+6lG8 zBU61-^plxbZ*zH4*Tmw4_VI;rxu(q6)-lP^@y6(=@JQbXeS`^joYitxob)_X-^}Jn zWPM#T+eKQM<%tPdRkt#$%qwDw7P&!QlBHyRS+_JRjYt!cl(-~HiTt8&F3WYZSvCU0 zNlV=~A8W)(=1mw^NO5qZ>4cBHNR;-#3VK?Gjy2Q0Rm9o8Dq@DeikKOwB4!1vh}pGO z#2hxftv~6xToo}-)K9=Nb-uWtVwkw3ibzPShy}7LVxhc>I7d-MoU5!N&Qnzp=c}uT z3pA9th%fnt+A6P$^i{-SLlv>4rixfxt|N;35m_UZa-&MoG& z&;no3+Gd#OHvSIB`uXs~0^*)g9Zcuh(d;^VKsHk2(TD(DvY1As>8HuEQLL3@Mzhw= za+qyXvKz>?o9c%U*97(vxSuqU4b))6uEiJ*%^(_^=*O{6J+|?NA^qt&NNFT%Rbyjs z7$$^U3gK$7#ZxZGy^^zw7$8?QHvR^O5b|LNsm30#L6DHd#sCMq!3K{I=6ei-ePM%7 z;P^*^9M~Z?1gcUmHbUyyGd9!;;nqVq*!BTVr3Af`SmzMzA{&NCw+S`k(g<>6J!z`= zq&Li39oUCbv=#-aE4516N3d2C*80^yS-;skV$=UW+MxL^t&&cGVg1<1D}9&_3-`sZ z^k1;QGxW559Qmm9e&XGpw^MJjU8&dDU*}&by_k5u_+&T9HnW@bIVEiM9b52>PUsx` z<4Jr`_RTck&rRC~N$qcJ`|CgEy*=p5Y}4QP-s-Bm$2{eS9TLOL&R0L|S^XCOw0SJ| z`kQt?{94;L*63wB@LdE~{JHNyr=bcZ--ooTh%$xr^_)V@ItbKV#- zX~?O|_(yGs>igw4{BX2k+Vq;*C52g0j_=9!FRWa7+t@qSZJfXNCQZ$DEs@38=5zQ* zt8uJF@`oQES;5U2F}GQ|dZ#U zPF{THXQBtb{(`V=Fy^U9Jn?JtpkH=Mq z*sZbe^rt>sw1%8Nnf-;C*G~uEb`!P=PPV?Uh&|^+#~z${ zWwTdH_JLP3ubp2#dEGSSsDqDAoZ?@1_b+C9+?akB`M~tipCA76hxz*)f4jHt6<*oC zIe7W#&t@Gu|D3Zw-@W1w-@Z#eoyu-C^VQEttxkFM*zyl`3kQs$EO)yY-*mBkgU%Y7|f%Q8#D zOUjFK7ez1ZJ)c}RpS{ulcw_Em18fx^5w^?3yozO*S>o_&X1t6UB2ws7>&26F;hl_xZXWG|N!~HobHQyQb95(THG`jC*xW&;8)&B!e4Ks+F1(X;A5$77 zGN1yTJMXDev7(yrcETM~E|tq+)#Q-)wv(mDlvarhrn%lu$+0>Q7qD{4-Hy*u z16gZf`D3-fa>uHJRgJZ_Yai*pUuiSBU=?Fk!#c$3g{6ko3Tp)`8FznOJna<0{)N*3 zGi0YE3gCeRow5RetsOuMt1YJ+X3b6|thSs%$i%6K8IMy0IXT^}0P-Awy#Sys0(i>+ zMp$AwWk~=lOuL*SSXepT%zog(JlpAu0+^Ek!KMPBt_UFM1*k>v!wlSMfd!9~g?YEr zSp?8Cd58ydZl^j9;A-8%*B3c?f1P`5zz32CbY%br1PpjUwtyaLA)tU-2zVg(fCXwG zAT0yfp#}m5sDVJ|>klY9S<>-9-4yc7aizn8Eu)LBU~CfDdW%2DKG#ty6+vsyH93dG zo=QFGf3o|D>=ThEdOGu+vCh87drqVt^FP-8X!g;_qdh;*|2+2dz7A4wT6{*s&r0{F z?)Tr{eP8yz$bCJ>^2bWVyIJFvvPV1aXt{&5?yYl>)(Q0^Nbltyo2p}X%WlK&(yr95 zBI&zhl*4{~N47iDmd*Zb6NJ%$fZ4(CUf)ruq!94Y|P5w1&dDI4q$=T6*_M(fYP^<(bd57p|kM-PlT=(!Ir_h z0)Uu-Rh>=`K$hIBxw1y)+r>y6!t>?=LPOrXS@UOBOWr!5Ibqglaf74=!Hi%>=37|l56#;w*_A-DQK?RSYMwdpEB>_|j zB6ut{G6V)5_yOsP&t%v^5ex|7K9gZ-JtKtUOonM@`HUd8GZ}{7GeVfpWJsa0l{KBe zy-lNH?M~RDki(k^KR-JZ!ybe|3~y5;yU4QJHFhF9qPaO;X;;2lsvDZGqG|?TUDXV} z>Z%!hHC8ipSfkYpzILk_O?*{XbNFhnX7Ei=&G=uIF|#6ftnJ>OyYqLa?(*N&-PU)s z?P%gC>b~slk=qluWe-OVXK#(%+C%cB`%v~!-|+kYoLlq1*?cFYO9D1bydX1K~=<+O!D;N z{VKMKxSFE`T{&MPs`9#4QblZ%RuP+JRm2u~6|q%OMWiV~^6?24oMhc5C-P6Y?+mkF zX&GvPN!_o6NgbF}v~yN@lRUSRc@Z>9tzO%04T%$D1{P?Ik3|aiki9QTtAciP6Sbc-MeJAsxocUH>&gByg zq_s<>5Ud?y+#GX*3f|?xuU1B5Jpr#WE+M7kYTn%76_FXReN2 z|0$jR_vg`sdBiS+JZ1_(ae4HeerxOyOBYR*JVt~uj}hU2%VU-h5m#)mZkw|IX}XT< zj~L-2M*b}#eZ9pnxIolhKWEl`!|AfIKjH{J;)wo;u%PElMPCat3@*Ix{$SOd9kfIpclsD`>U#pb~lFM+F@Okp&lX;5OT2?Q6fQh(k4q!?cL? zI>gy}#5o4UxiyIMjEM71h;cJw!h*QKin!2*c#a+MTnFNLPQ>$Fh!?QTI!1mWhnT)d zgw7%{;$jKn5-H+R8R9ZIVp4(FqC{M-0<1L13N^AW)*!CbBCgUQuGS;2F(6)2gLtVC z@iG(Q(m274sBfpA6yjp~KjTrG-3F389 z#7#29&2q#o3dF5S#Iy=AqejeX5VvUor@?DM{<>a=yc_h0+YN{})*#+wMBHIQ+-XMK zWkK9+MciXU+-pbN=Rn-=M9jGm^Gxs6jQnO6@c@T-iwNkbz2s1or`74i#e#5N7$U0T3OgWRn{);)T}dku)kY7p-;BHnL8{Fxc? z0Sn@TX)8L%ZHN!q5g&FSKH@}dcOiDLzO9V>=N#grBE-kUh$ke7k4q6dWr$D65ua2b zKBYuFsX}~Ojra=<;xk&rXLX20eHxvT0r9ySz)C@$HzMl=6XJ_z#Fs3HFIy2`u_6A_ zj`%AF;;)^EueuOlV{+Fs^4D3!H#o#D5n{I(@l6ThTT;ZgWodNYkt6;_f%vWx@jVsd z`)b4wG>9K+5kJx){#K9pu>tXu8pN^@vB!k?sTr_Rj?XN}`rL~6I~(Hf?TG*5K>WhV z=l`V(iLV$Kh~;0ih~IFCe-I&lD@OdI1hH3&*e65$6As++KPwRbqD1_w3h{4h#J_70 zztbZALx=cJJ>tI%h~L*B{$R|d!THgI#3?hN4D4@^V6BLp4NxcvE3zX?>_C(_5v5FV z4=7(2QO+SMM2Jc;qDq3OmLh6oh*~+KPJyUbA{ta_bZXRyMh&7#i)hv%TJ(rk1EQ@4 z(QZU^m=K+2M3)88ZAJ9h5WRLpp99hFL<}$tylJF^2peR9kk@jEb)qyngT#n~C5S_$ zh(l$F!{mtd3d9B_;&2sWNR4=w1~IG!tfU>$RS_ffRm4a`6)~!&pGY%oqp_c2*wLmc zVvMh*Ls%(kUT4 z@RSgqdrAn8KP3b$KnXz^P(siNJdtJu-9Wtr6+sC>Q&2)s7?ddL@i{M1LeL(R_$ehq zeFR-X2|=YW46pwM)k3`l4MPb*(NIFrH$7 z>rp~bev}Y&ASDDU zpVIu)M;HJoQ5gr2Vuj&=`Us-}C4|9&62cfk31ym&6_gT&3`z(i2PK37gc8CyLJ46w zp@cB1P{N=>-CsiqVThrGFw!6a`d1insFyJCP(m1gC?O0(ln_QEN(h4zC4{kw62cHg z31Ot7gfL)H{lf|a7xfaxFG>i*7$y2gGa%WY8q{boVQiyBod`w>`5;ON105y!@h&YN zLMdU~ql7U0Q9>96DIpAoln};5N(e(EC4>=@5_F(UrgE*t^}XwS>*8xOm$zS5zEpo{ z^b+#<5=j!ya5O*TZtC2+Prr?IdMD_+UWOH+8f}9sS9A_zOyoM9Vg2uPbqmhB;IRmV zXwnMay{q^eHQ+7qTNquFX~oCEmb!3}`#9=r{3`@xcEBYT*PW<_(^+sF;9 zC@^nj`%dOC#Criv6EkqbFpZZAH_R24o7Rct90S`FOprHb<%3OVulS~g8+L5xUs%zf zG`6U_%aOG8nlnbdp`Z<`i;B3cEN{uh^or+K-SeRl%5WZ0lvyY1@2o4cAL^VB zWGD2Vf}Q@-mn@$F54n9zZ)Sg|Q?G?12?i}}dmFs4<86>fcQXb_62J*>l?*o6o;GL- zdl-WP_M;6_*oroYU=!NlDgfAF|Jh)HU1viLY&aXFu-6Rxyh^ahMtgF)B`#w4ZRdf^ zV6>W<7J_!unk8W2cLUvMb@yX2KV^50SlwC2~)KKI{3`6@l@ zzXfvBmmU9EDDp^?tX`yqm(y()tx0Lcm(yGU-mj7FkwYzqMh=}nKd6ponVjW#upcEj78x_Ulwk-XpROBR&KmSf#d8IZuIdy4WnrlZd7IAMh=e~ zW=hr@wI7Ql?YqcqlXkV-3a@%BweXU@-K3qzn#iukp#gA;jYG$)Oa>^aDadSNOr&}A zP=`v#`QXK+DhxmtyS2j?)t2D__4AE=7#`CgSPX!2L+euh5#^szr*Ah?>&O78pr&fo z$vsT1KLZdb0|b40nObKCKn*ojt0@CWpr&fcPPaBiK5}b46Bywv3DfmT_siLr+g?h% z6nUZN`TX;-=S!tj$zSR&W{Z(x&$IbwW6$e zbU&PZxci~(L)qhz<2?`NAMALb<$?Uqx=G*HZ+S|ER3U$7?9Ry1o;&h) z#O~-j(sm?qq;y;Aw!T~2ZcW_E-dZ}8I@ESc;uiLnjsvlq`|@r1M4rCwG33b6%Uv#U zen)HvX>Z^h!@D!tOeE8jZrhsJ%5Lr0(z3;{rL;M<*}plmspq=Lbv@TcuI;%de@*U* z*b{xEt-f~r*`?$82V)QRJ<#?*;sN%7(*5lHvHKFoTJCMTCvgvZPvq{>(bUoGk)Ffs zVZ*JdL(DC?yl;Q|p6ITwo08jmw`DT=t%XhDYl~$4#|uVqNnvy=U7J4rk%9ZK%^YA-mJ z7X!@ZnKg?nnqJqRyJA`{pv z$l|N(9V*{FC7N!GskTO9k8oGu7o;h zTmzJvIvVO|siP|JeohA7y+ei>-q94P!|X;TTA6^uCV59x;2pF&0j7yM_GEewl4ynk zj)XdRz!E4lO93ZH9dVAQ&`brGX6iWM83qc?R>09x$C%+MG-JW&)DeYY2+R1jg zT!0@A2pK;~Jf&UG`S29o?IJR9Ox^pP##y>YIkrHS&26}!%>P6ECK7)}AvN|c&n(w3 zFSVpv{4L$dY%-E8k~j9&Ck$N+k_&nhnS?%3h==3F`Eg=?IO<&zpHV)$^=#(s+;rdc z_G!^+T~m`&d#7Zk=%*AWhbI?f@mM+98fBunW?ysrq$t=@Cnxq!$V|{rD2xw}FOG|k zD>t<^F-^I#zOn6NqGP&7Cr9@-W*YU4g;C+oo_RVi>wL|t%Dn?Uxb0+B4{qJXl*>Da zGirKZg0hA;+``_9uk!m(F~U6_f=r;H2^`VG3lSz>*j+=|OGD(HXyYY*1&*ooT#L1k zW%R_3lTCI%)4G)jDB%cTzy<5JfT2ADcfKqWaKfk*fDTMrCYypH z=(O|(`YFAEzDaMOKhhiMgMt@~ynHO^YxD-X7rlWlMQ@-R(HrPG^ai>Mf79un(%8x^ zR)c*DOokI++|qv>fYzYc2g6}Mw_+)Wbt}VXaX_4EU;atueMvc|HKqA+lRceH)k#l2 zvH$3!{Et4W|LDW!b}*7VS-2QIw1`UV^X+6*YG@Kw4K#_$14>1u(C-2ska84&?48y) zVzv_6RXI@m(s7?!3_`Ln@d03Z0Tj^AK^vqT}nI=k^owgt}Ms*DKuYkkGf zPjezK_q>#UDfUv|i)}9^USwbFc%kJ5!waS7Q_uUK?|v@(T;#c)Qoa-`^%dKSi6UF< zc(&zP!?UGlQqTCG>HbCb7m;7|Je_|!_H^ILwv%M>(@L8N?EOgF?H;?b^mBhlcYDVp zEsv1)-P%FE(tWA>{P%Sq%N~my%ibHgH+Fa5U5Pff&3|Y2(d^O4QS#$Noo75486Ijo zm^j#WOUKPU`BW~pzi(gLzQjIuU&r2-y@tKryR*9!yHY#-JG*yecSLsd+{E70aU*+U z$MznQ{lf&4CzDUd(tTSib0Kz1&!(1Z4cC^gPF>Aj)j|69P8|#fM%uoqA1W*D?%n0v z6(^<3U1QcnGS$&4Q>grPvFrM-ZM!ycEqiUpH7(bquI{-ie^u{ws>iN-#q`k?z!yTj@fOq60=G(y3fu}&rXd@?U_=VY>1Vj z*=FCw;<)5kW^`d>G*S*_8hpcwgOhbku;5GhSYL;?#cS}EJUy!yg$k~2f=U$O4$tX4nHbK~q@qLUVo9}dXjbph6n*+u+ zn-b=mHX97wHU$jHHXnjLyo0eBk^m0SaJE2h2Put(j}}NlkJ&V!$81i}UN&(Uz=fa! z#bXnL;<2d_bOiug5x~prVr-raKur-q&+KMwwNU_R0l)}zK$}Lt2U3BBnoSIoKU)An z2lGE$0H%F5S1W)l2ViQ~1A1V-XVbtm&t}Q&V4OwqL@s7Oy^)568wZTMyq75{ z+yn~3jj}Awe7D!Zfy;+=!{E%{Fd5;-45Kv9@%r-gMh3$*&oQEpJ2pY(&h6Xa*pn>2Z0e}-h9z_z` z#;ih67XYk909O)P$Sm>!IH8%$T4*LSSH?SND>GviLy}fIq-Iq_0W=WP>SlH^Ru=@f z>L9pP2O+HzXi%#Yn$fC-#quuLZC{ zJTL(UQ2M}%Rt+g=M34d;TLy4IGMXCwK9c;+xLXr$57d`i76nkl?9lCo`f^JlJ+~+c zV2AYFmNI|}(sRq8JGsTlyDZl+ zj@<_7*p-luT?XmceUOgb1?kxBkdEB~>DX0}j$IDv*zr3Ec2fSxJ2J%hl4&OB)GuLF zTebJWB${rF`ha2OZ}lfjPjx)m@+5CokHhRxFrxQsrKN{Dj<*~q4}Yv(;OINT9*Nza zy3K!E0+#P3k|GhX8ST5J?G{q}RyLOGJ1%h%<X_dH!%=o_WNy#w{H(4S`m^KHa#Olu`e=MoZbH{MeN%i)uCZ&RendQ+ z3w4p6N%AH(PGX;oZzfwm@orOp_r=b*8HR$@bSN;N@N-U1jK-lP@+n&@#$kZo;TS;g zZ~&lpsQu|3s(yNhdY|5*(x-Q*@#!6^dwPeep5CFJr+292iT`W1PSnpr?M^*Wwc}lt zC+c+Si3*+cd=8%dtkZX>#c429;q(smH!1z0Is)oy-jj4GxCXL@ zOjOw5BZ+ykF-=`7vnxx>qsiiu=%V5U(esK6qlx0Y=$zur=-I`o(aFW;D9iz(V~dT^ zk;QN{RIHBgS#s@?$cjCEtAR zQIbPF9t(VKXKtX;OVqyuucJL4Eou0jN6F2YOp>vXiKquP0=o?CIe51;(5NMs^LIhG z+tcrRd{Cp3jQ*X+LK@(ERAedo&cVBnTOhZ~2RAAe@feI}_#<}?ZnToCrh!24@v3SM z?+}oL=5a2oq(Sx!siblo?|9!=`8&+x8@zkwQ;<(RwBp-oDg?jucUrftGZn}P$o-|ybDLv%S4(Lr7Uvd}L3dufHYbCAUa$@dHhStkl40)y|;8DMg z{`~bg&HKQ?yp=j`TZ=Is9^=UgQ6De!(Z)G<>hn8a;KPMqN#8FegS+;ij{;WY2MDCwb&HperK)Ui+p zKBUDbLmeq~%+wLL-m&nG~j7ZPdg^1&eE%Nf^73uggiKKiXL^57pk%AXZB;th;x%hlVW|KyqpkGi(gcHR$d`)bA>wIQ@Zk}&m``qZX5`NHo!ve?I=yRJa$4`y%vAlf5B>ctZ{^M^z1q~L= zz<4cGp3k(kfubr%e%I{yEc1rP0U?%h{ThnDv9XS)^tqSnpLhuRSdZ@g#K?7*j zkp6c#X#K1j)=#48vjRWwPzjEf&nibhi6+o0S3imN&nizpiAIbnAI+8=yqGoWRfGCH z(b`!>@|)^iC@#yV__^`Rcy2nu8NH&!Ppj6A$S|#RR8Bk(DQT|(JmeKlTW`9sT3CN(#>d!Zk~r$ z>$(PhQylHo&1j|$=D|A|5q?$<&OXB5>8~BqH;!mN?nZlZD~*VT3ICJ?em6Ij?5SjDau!Knwb^zWi!3M(Ew zvBL2OvU4?ir__$eI;ix^@jQnek8s%W)P@}oS=jMJ1st;lz=H#JJRe}kLjZO(^0%Wc zza35X?P!>9NBes_n%Ubqs53hn%iGZ=-i}u8b}&>YEo)fET0BD{NQj3=?08i7 zc%s9O$2aVFV#AK76zpiU3WWl|69slWIABK;PCK3gu%ofR9c}vUXwYa!%X~W;;M>ub z-VWyQr1UeTl{6oT$;e;+Au_7*fJbF_jr{lz(fLs;9t{&30T0ty@%)Sx&&pWwc#IVf z!C3K7g%-Z}iQi3g~D<-|+=7yF)XdoEH+{>N7}&WDF0CGp}ym><9!ddJ(zfq<;_qG50rkE07H+&ee8Yt zdt>+Z-9wE%I__?{+i-WwU52|#ZK*bYTX!K_h!lG6OdV~zJ#l;6ZHe1Tx8_ODp*}cq z+@^)%w_M$ERe586V{BvJhPDlf4Q;8u)}D3wwf@VyFY{m4eQD2{ z{F>OB{OZ{1zE#PUxfLzTQ!TM%erem1)Z*--#6>L^MlOh*pE!>_H?go~K`N0Q63@?X zo7XY7G^b;BX;$~l?2P=`%=E<6mMIPeUehu>mr0n~ck+wGyHDGdGV42+6{LrC_Fhqei^B@?RqGx6 zht9X+N2}oaUwr6%CG5;x48MQTWo-Xf&EZ4m|2%_rlhSGnWnq|qi?i6C z{KEBMA5;V@7S_O+WN|msPVBwXVA@;W#VGJQ#r%g*!SD*-h+1I2Z8v8Cq_F#HmnGp* zc4YwEWdM&4H#;)`vI1^)mH~n=;kL6d-L{(x2)_OB$VU+h0DhQq+x4xe3yJ_rm|fdF zuo$rW>kEK3m|xqS%*~*fqOcahLBJ0W^_fzU3Ax~f=^(Qk%{qlo2=Z@>t%cq2*>I50 z7=Xoq(FRKaqZ$Mxsiozjc!vs*guup7Ly%xC>@o*czP(I3s4Id!pdG=(?1wkvJ^*Vn2QSE>WblGK zkG6yW(%$_H4w!s?kd6sxs|cz}4I9w#nQZC-wg(*j*s>j3Ie<1f0W`M>fF%u@OyuDc zGEhYUG@-!(H_aPh@V!LC(6mtK>eOg*X!28s);x7+s8fg5Hg#x7Q)h?rsPWs=U;@E^ z1%)pwmQ?Qp3tSykIam(?upp4%0?q2TmH})~dcQuM0b~mR9Hi}cGhm17g=X;U3J6dc zV4#Zt;`^QL07}T&&q2TQi=i}rTNJ_<75W!~FNUu@|6N zH7J$=#p2p`ry0Kp<+7n%c9hG3a@C+%A{0xEVtG+4KZ<2Qu?#4d0>x6GSZ)+cjbe#W zEGdfRK(X8?mI=kOqF8betGWY0l_k=At>NdyE8hZvSjU3hpN@sxbsp%EIydx4 zou-InFMt<>8Kd*J!n(j-1aSEB@Fk@NxRep(>y+k$9qh~+ zFlSZ-5IEQeRd^9puobG%A$VZNQ=x>7PK5zp$SUjzK0U08ePIA`6rcw7F%%e0rwk4#OQ}UP!mk+OeJ89=joOeLfq@ z8ZxDH2|luw-5e)h7jN-93L-uT&U*m@d&LZSYfM)BIyOaH#+@H?!U zH2k^Ie`rztII=>k4k(U{ed|w@-}l{cKk2;?JigSbYYlh5_p@)&LkjaEoGeO7?1K7* zB&AdDpS6C;OG|4hySk#Fl%_|$*b+1D)k@=N^JCO1~H5&pG_=l_X+ZNkDosu}pNO~}?7 z%UPW-2Bbfz$#c(2CmrjO>dpK9boQS%h%?Of(;zrp>)3O}oA{3pqB+qr@_?SZPMtY* z>W5RO{`|?Q&ra!1+ZyE+{;n;DJ0(#@)v3to{;s=67Iw~C@S9tHBTF)ChC}66u5yOC zII)j7yBe0VZgQxr;X<1`h^7M~v>GtOgW&dpvT+-WyGWuG^Q29naNLF@fT#>mi(m(Z z<2J*L%3T8*(yeO+5Vr%cMSuVr5_qBjHK1_ZI%YrPR>lEjNdONh9JjL!po!)fw;~B3 z=>_1JJa~Ydhd#vj${$ia~ZK1F}2)MF9LKFwPo~-KhiFof;4q zBZ!nBF5VEwn++Gi!HykoHf%~;9X_z(wL^Vd?Vu8^5>Sa&2Pi_T5_F(d3p&v1VZe;U zodM88VXOftjMV@|uyP>1)d$jBYd~hJ3dFVgKwPU0B(=&xHmeh4gGD}o1cb5Hg5s{! zCd~R<$w7d|T0R6@LcEg2ww-@T% zU5lnB2JA27@wXdhfv5YOh6~q#1qt>e^yJV}1CqOyNdO--1K6ej)L{3~V)s!&LELg^ z2DcxY!R>(}xt-7qZYy>l6_gA9nG$pr5q2LY31BS(n7~x&)Y}ann0I2wfo5 z>_;YO2Dbr9?$$vwU@(yyngMUfWA8Nh_3j~jIdOp3LrVPx$*jXEW}p{|L42n^ z17I!#hBjEt14Glk z8x1%5w;OIKUEj0Ku&tEs%e29W*s--|OMXk+=EUZ1_&RI*RV`N;t}0!by3&7T_r@Yg z{MKnCz8`}Dk{r%?$mX>oCFfs3a&CW!w0`WBlHOk^754LE=k=W%Ij3h~eqn53-+~qx z%u4Z8+#e^t*L4<=e|9U0ZPg|Q_l)lzmmSyEl;;o2L`M4?!(a;97j6qD;5%*jMRdbi zC2ET^L*t8iBkmqB1TEXUtYqu6$}pQDC2wdVSbE;{W3#OD$7VSfPOg6ZtA}2b#F?gh z=(>N>qLchf{y>;vD!*4?oVpBXxMIDJUDt$sykOwse^Kx0H|LVgd+5h2FhJ(MDWv0< z@G^U=FEk|dMeM-`Zi@mNfBc0BEMsb!wG15}DYqOu_gr(7%<+c;iel`x!}cg|?com% zCi92tm83W(BqneBL*pd3#->|;OU4I6vn5@S_%8BjAhbc5i9tFLCp?*igQ4kMCPoUu z&^$#i@C(4dhIng3UZQc0=o0WAUoKcPpu7IA^jpY^X40(L|qpOka@w7 zoOt|7KG4UaVRqsi+NdGXx{!smURNU_zpe>rSULGNV{qW8{3%&h7xGHOkX1NJZm0`g zA&EkkMe?t@&;n?Hd4oc)z&~TN4i0%GU&KBiJCE!h99oD50l?vy*r6ezK_vZElZ4Fn z!#CTy{2?j3hV(5SY9b%jLdIi+HVp{{rE$opD@yJe5}GwU7hAHiyBSP< zAVYf5`n`nNz^tgSz|F+!X4a4?LqkCYUx5&11R+C1UPS>U(ncBPCGtN*LuX6NQNAHY z4GRUNMX29lP$Im?itLS&?}vqENne3`AJ~x9LuJJWd#mJ@w8B4=x;mdQl9%d3zTw|N z!0#aK4E*RtrE6t2GFMbs;64GZehFoz$dL!guZM>=skVZR4ZY;V@GHF;y2FQ$uO$aUp?a=$GAV{a9`eRYZIyKFMq;?w zVuF<*(*@ZGk-=F8@~kCoBSL2K`%uV7jx|D4-@Q&>V?@dR3YFD*Iy~vQ*X)f+Iztwp1=W&)>Utnb-aaeTK=k2|N5Kmlg)icfWnt*ZU{|ChxiB;)O8N)#Rv09O z=8u4&>jpue8x#q}+4soRk¹2R4Vah+4hE0NGV_6BnG`?Z6KCjiD$_rG6jk;M7V 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 z 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%0AMEc+$PfqnZ&5_are^6^AILTr%nYCSK=#|HTb zu~L4YO$PP1N(iyUwSgJ>r={0m>6(E4bLlZSzY=tN4z@17^1QOsuTo#~dJepg5-)66 zm1+$9BNS}(^)5?=*3+^gKl{lLtg%5JH;nv;V{Qg{ylv#(_CX#uj%?UI$m4rQHf$f{ z@qMigy(;?|y;HJHkjMA8&DbW$W22SPd!wEsJDxnqCc+rz{` z9v6LM@&2I?wlaEqI8O3U80GQq)`s35{EYt7M#c%FJbtKc#&%I2huY?B6Xo%qwi(+* zdHirIqxWc>A_p~Ll*f;>HuN5i4=-%=e|7Omb3eM<{oen*N2yJe$B(tm*e1&3$6Fb_ zDxV`eoTAWjjVc+V+gd5{6RoYidilA%`n8Gj_{rTeP8Q|yQ>`uAM|u2oYdfzhem=h{ zyq8Z9<#GSHpJ|)1%@?Q7wlaDT)$97=bZ;xOS6#m_uezhZIDM|Ur40FXzc}4Da$CMQ z<=t6W@*Qc@$ld-|Cx04N^?+rWs=O6?ldzVJ`C7DjB-{2+&&&t+b_a^e#H;B`YmM(e z*d0DVKK0H&bKl*+aD2X%(>nscB<~24jhWwA+zf!lN8KYQ7_jz*wj~tYnv{3*oQ<1T z6t#02b8Zdg>OVh2Mq|s{t5FK-citS(=gRMs7X|cl-_8FF=!eU< z^=IX+b>L-*;`vsI;wj(K7u+sEkYrf+8hM-jr+iD_AaAi#AC$LW84kWezNtU+n}Ggi zd7HJ&pnjLUz3wwNsBh^B>PO2r^5w zLFP$s+MfIP?6^r)*In->)2pwSUb9fA{4p}n1vw}{Hx!`)Rj7d)6f`iv9IT5L$spL^ zKo~k80x^g~5>n6!f%QTV90)@PL?H%oNJ0wIkb$gFH@ZmXp#ViFK?Sr;f(|BF5Cj{- z&;e11LjqEehEB*r7v!J--B7G!87j~NHPE&SosfYp$U^~&P=Yd4p$BT9?GSV@z=8nS z;6NDSJ7m2YBSA6=Dd>a@bU_aCP=FGYp$aun@f&1!V1Nk$2!ahE2tx-%AqMpXCLs+O za4JFwIv@%$NI()&&1@df?$IKVd#Je#2^j{NI@DhP=IbILK!O112yOcL)|F5R5!}` z7a(ba17YZZ2*e-`2}nU2Iw1>PkcVhoh(Q8UkcJFop$qa*fO$S+4DfB=M)S#e&4klO-fDnYC1ELUv1f-x7 zGSCG%K`z$OO_Gj59FmY?y%@Pf30cTN9=f3j6{tcF^n%(dXrO}$0k9ziVd#J~bV3HY zAP0G&E@zA+i-Od#Ou7m+=ml+92!IU^gdqxXNI(iYAp>2Ihi)iA1$v+cN;)>`h9=7C zD40N>hn$Uq17YX@tHSCZp`iRRYzRRIL?8wUNI@rLAqRQrh9Z=qBGl!Hm!#?!G%&z~ zAlMLs4v0b=5|D%xbV5duDrQONAP?P8gff_`1q*^g-Ec^TAp%i|K^&5hf;40x3pvO` zH&mepy`T*WCIlb|4ul1%Vh8D{P&eWvlaPiCbU_XZ&YC&;b#M2~x*6=_I5f16jyJ0g6zDD%3y?3mWKPf&~Gv!GSPz)G-QK z=z=_SLkTKSg&wGZCea_Iin{!fH(kMk0NCI_7!r_#G;~51x}Z?UB9x#4Jx~KB@g)r% zObCDtAqYbRq7a7!q@YvaWF*}M;Xxq+QHVpbjw$GbEaad7MJPiBdY}f{kf4JJ0kFY= z4v0Vu5|DyU$UqjlhHk1;$2>O*&>oS?Gd16rczt zsBF3^&1oV@11ty(-?ZhtgY4VQQ{GwL>(>=&=$ienQ4L-FWBSbQZ~FzL$NlOtbvG|+ zXg7v(8`r7TluByXk&uJN%q+57(;?w=Jy4EoSO&PW}W8?)q}GM43G5woe|@xiHg= z|J?3t@FOGH{4SF~xFipm?e<{A8$0$36dOZN&kRXaECyN4d9;cz*5L|NE+BH|K_4Zrd+REeY z*Du4{Z@RJQiD}u!5zK`1cjb;kd#r7?lC<&ATQf$lx90Iy#!CXmH9+UDh@M_+^{Is*fE$2j1Fb-tyX^7SbqHSykknZxwB&(c}efy<*0UjyH%i9 zp{Jx!O%Z0ua>K+$UA^v;omMhuyA4T8*A6sRU36$_?sr<*sf|*8abA7mZsyEb+t=s2 ztpdIJyex%!6P;~EI^o)?&+fr2o@f<7eU$PG^lFrHv**UzzD7^B3iN8^$RG<%<;0*w zN2DhW$Az;v`mnWE5Hr6S3qhwQ&A}SqYn8{HO8Mn`6^yy1b&hjn^5;a);rCl5x;0Ff z+!_)qEvQIG#K!9F8M!P((*df+2;T{+wyjl=S2e$2ziJfL=@vO+`>JhkmFQM2M?^7A zEfZ};I_cUjro|6hC3to6OZ4iLcJmj;>D6iUHE`ZjZHpq{9Bw zxa)_l0^K9au5gd+RQJe8Cl!tawQyQNEgGvHw=(m7)XMK2mtUTLT;wjeWsEq%as9Y$ zF*0UYikUJ_@3`EDN8VZFQk!;KrFiG~S&~armxuvHI^sHRN_qYG%hp`E_Oi>@`t8Fq ze!h8*|D;u(cW_TPZ~G?_Wp=t{j`ku|i63L?AC?JM3+@i++a%P-=@RPW#j9imdTGu?qmN5=%+}-?jM6PbW0j_^U`nnDd{uq zmxkRZmId{*rBU~v(x7|Yyr5o^zxSqs`m%ROOp#*)`hUxB`ZDR4O$7D*w+Hm^NvMyt z(sim<2K4(5DDSsf+H@b7o$?L`SKeG#Gk)MT>heW+*`W8o7j?Pe7+``00SE%$j~%`r zJ0ajpveN;K6|`T9l8iwdh+*#}Aq8n*RG^a)>Q0tq7vvxh1?Yw%l%Nb1s0w~fU+UqW z8mNk(fer?kU_k(az_)kD0r?6q5s1Si`6BN`APO;vLjsb(_j)G{osa>(;X7TBgFFzHr`UMSiFu(*$u>TPt83Y>~2tgP+AOcZ{0nG#w4O&P7 z%>)t+TA;1K$$+#J$nkfP%n5!~|B>gO0?>FML7{~bl%XQnFIP$SKn;39TP^5dfC&}^ zAP6=%5Q1Z0uTfn90)-eXwq;Z5QP}T1^+?)SAu(zkb*RH4)XkG zNM@l6a*&4tbVCtJP=*Rrp$BT9h6D|CFa-PGCP@nd5Cj_>2o1UCKgkZkuj;=e+!KWu z#32DmNI@DpAp=?Hf*jq1xy=`tcfkSs{+%IBdZz+?)t#A<;bcA0u4HjyHIe31|V71Kww!7 z`xST5U|M)&Jp;jAKA2`6$6Z61wjOUGVH$kA)r4vFan!J&fer?kf?v~DEba+F5NvRS zx)UN9h7O286k>w?YMf*Ol8}NlbV3HQ&;>cjLjk&>2qh>(1**^k^&0jHepO$kamk@+ z$)RbUkjVU{OdfNr39%AtA6DFba(&AMu;$~`n#IW$-~y+Es#T#5vmuH;fA z(0(PCB7sIMxfBVsWI1&QY0q+K&yq`#K%w9SktRf&c`;1_wew^O{_Q1lri- zA|%9shBhYwNuaS!EWf;J@RV1Nl0&`u}UAc4j@xdz?D`7hdfm^)~=b7;7ei;qC-om_kbn(*Y}BhZfL z*Hlk)4~=?q5fW(BlZ%j$1Df^ZA|%kPCl?`swmrEB2^FXg)x{o?HRuJFqOqm9Sduyz zV1fk!2mW~{w1fmdwI3yqmDM&*nWFQM&kb^uFpc{%%f-+Q~3iTeWfs*BmWI+!>2Lnv7 zAOJzZfA%e#dmIQs7&_dWa!ht0%#n3K1fmdwI3yrB%bpD$26X!p6-n#Ru z=WTCnzt<`>9=~`>m&`p`_o%Z^W8cqN8QIUeXtdne_mU|U+0U9s7a!cXs??EgTziQj zfw@Z^-Hl`{nr{5{)g_A?d*2s`HV!Fwgc>J5TPrnIe?{wRTz%j4vl_$YOr?I&!@vDrCTU>6( z5i$awL=8147{JF(gAbVopD(4;M2G>OA*H)S=mb798hlceo)Vz~d>}N`kif?=gHK`x zpTDF>L+AlMYRRA$`RFC1T7&@D5C%RwNtcGehb8GA7Wh~sox%d2gQVv|=mBF`;3JK} z=NN-eF9sh<*{mI~6$>0si;JwJ;?Z@D)Mjl{+cNC)rygNv*qQKjMJfH#> ze|angF6{DH%B4s84kf7#3tXY)aTK_2$>S(+p)%weCHa7Bl02*eS0Z^>1+G8RFDP)W zF}T7QTwDyUC1dfD%-p z2HJWd2L&iW1!|xT-7M#yA z3KrOP3_~1JkbyjOLm8^j3;M8NLI7+CK?LHEf==jygt|rUgA8;*0gCDt&Oee>sDUo4 z14>u2U_%%p5Qj8mAqNF0LJw&Dw{WpG<&P1BIHaHxvXFxk^z^fTZM7s#aG(QXkb+L= zf;<$V3{|LsHYgYn00%lC3UM%o1Pg3Isu&_28Djr2k_kvbCuAWHMW{dzsBMA?L2w`p z5lBJ?a?lN$x>a&O0Bi_B4C*P&Kn}`K6{L>6q>YMTfej&uKnxO)f=7wJ571FIa$8=JtghDMzw4drSquy&zz%nPho zD5E(9)+sdft%3zCL};)Ep~3Ql2Fne~OIBcAL4zd)jU2FWpwR=Y4=ArzfyMsh3&&!OkR~j1!|yH3p%ifo56x@Qbm?% zGgz3-U^zB zCIkd|6m8NW=zv&dm6#;i30cTNN52q-1f(DXU66-vC_x2kps(D}SoEjZL0hgob-x?U znGf9%S}Lz=wc$XoJHrhKJUDvv$gUM5)4%2%vNSKDI-ApU<%KyA`c zokxunedU+p$kRl>IHjaqN2gm=>c1u%SWK13 z?H=Rcu4CF3nQ;rtxwg_H;W~5U!ga1}73MAJO?`UZ%thCl9O2G)h6<73U`=MGFS}^% z#mBEX*I(CLj&)R5+u*KMBc)yQj097k{gIi06tjWj(tpq6jnXCDc29&*K+bDK3CQ@!IR zDcTR%S(KtJRr8+GS5GbmPMKf{`gvmlb{;>jNPibzZ5^3%#=K%ox=MGfq+8GL@Pghz z{~CFI{nKtteNULAa6e#YS&DL4iu|er4|UJHxpIg9IG#8zvtO7W53?ehmK1io7G2L% z1C0&6@;I(u9yX2h1`cbmqWyxCCMnF1hdEMM+ASvMx`$`_<#D8tq}%i0gp5qA{>{HG57oV&}+7 zBqML$eD)P*_HmUM8@}_@aeEqn)^loxv2MnT5Ti%#6Z> zYp1J}sm^D(OoufXlOZ(j$Oi8e3!O1if_r_PEqM!S_Soy|8+hd05F*Ws;hC*mvbp^D zrTEuZN=Zqm7p@s2>GRZDxn693)lN0sD=Y&*$lWY-b=yKSZb3QMR(d2TTW(xXwl%H7 zyellVsJfYpt`#}PzZ?}U+7)@t9JS`M3r8-lW5cqYHBu0hZ5ykfKfsLbtrkdmwrf%? zm}EHG*{!S`rBZ%T%^?hpi>{B%89Nf~oVGbi?*68Z)f(}C zzsA4;Z)%k!+2qGB*{gKIEiF6Nk?}zjOxoXd?zjTIVn<@nER#E?DvY=$BvRbE#rqT* zgPW%Y8r2m`vvbcISA<`rSErPlEjQM-b$a#uwgq;(MfJK?{q#s6fukn~ByhpF0>>ZZ zO1WdE!ia0a^|b{SxNuzA{=WR9r__>LUcuE%PaIg_qPAsK-Tc#C_ZgL*FtEVBOVgo? zo5fAh8f$u%pAoub*4@9p`R4fQrLBK^kIy9sHvT)Z_^|p5M+fwG$SlQz z1O?dih|J4>QbGVr5P$(0)#AwLmb)Jg=m*HimT!iF`WZ4)@$WKI@!ACvPWa`ZJ~Uqz zvXS3!OBmr(e;?3)zdWd4^k7im`9M&==>(a0_&`Aa^6?Ub=zf{&e|Av6V6s;lu>Wyvb% z+pX=~7>v{8f3w|{>}=P#n$~#k7mE*>`yGEf*?=EEpLZU#na%&*wizd%&F?(nXY>ME zwV%xYq`$FOJLPBgsyAvfzw><#)FE8ND4$I+cIB zzg=?&em-vplTYP$e&A>Hc5s~JpKvDsQ~q|%9r*eDr;Lmf&gB1L+l=jI^8cu9&Nego zf7~|X%+(}WZGf8uY~d@!D#=S}4Q>2CLX8+Z>=n~D5CYnyTMiTuvb z{fu6X+t1_wg}-sL+J0uQdTr+M|8lpClg#6Hp7FQz>T{v&X^KMIH7cQX)*QBU;oN8a z?V45b^Z8XF%Y^gzhudbHd>+5^oS)IF+2yi>*Bt-sSAO1RZT+&m+K!sW@BF&CmY8RsY}@=q}hZ*`lfk?CWpV+^?U_+i#mSRsYyF<78{9&Lx_7 z^XI3}1oU%xG3o5T&MNDP53@@{;z{5~sj1Fn>J z<%s;=EyGL?kYT3VWQggxGQ{*n8De^?#1Gh8e!n6^Oplj$!IMc0~`qOVef4eE|PERlQo*4IC zdGLSTDxZJJxud^ry*jY_M~%Ox7q1SjYu)dT_7p~@t)`s35{EYso z#l|@`MsE*qZe?sdW-X~WmRcg4M%0qV_NmJk`T_6!rQ`jry<%hTw%M_I#lB@!vGepy z>R2gMQ)h{`A{|%9Ha1+l~6f* zSow;x-@I4f);8xfH&37IEI-}Y`JJWn=KgovjC0+M7q}karyGxMSvoItRV$TW#4b()`UJodBc^Fo8IjNUO_FICgj`$S8Tj;iZN1+lrNwYB_9e*E0t zfyLb%U1RkQ?Ao>&3vQO$SR2p%bjkjqceFBk^}9>cX@Ay?`&--_sWl- z(XSdCcezfTACfzG|Im07lw zAHOiKx+%AS!dM&Cp5^<6U%9@SbE*U!TOf1SF4=F{($EbfcW!t`?X=L1Be&;-m!BSb z&&cg@QOa%_`Ol~*WjBx9+dfL!Eh8JYk5YE)$cF8sl&x=V=shxiM*qdb7oxoTRj8%+ zL~dxCaq{mqq1##+z1EWUUu-tEw)X1h=l1H?{9+?Db;pftCrwXhd~=^K$`{(3ZcMoc;da>!FpbUsl(Xwk{)Yzd zLka6-PP(A_WS^A&?3dvdtdw7-_fRF|YaY8B<48lz?xDp8cm1VV;J+H$tfezYO;(-k z^WI-u8QfLXCA{Yz=Bob9&(N&0Ux0u1#pM1y%vE)E_+_{cU1QsKrv+ZqeAS(PzUIFD za{M!ElKHC7x6L;Bd{yUv{fu5c-Qc1($i8iLwmA88)ffDH&3gLfc=ddZ(^Z|n`=z*h zf4#F+U-WY~>)@B>KTqrB{?Pv0&?|HWB?q{dk^$)*H?}(V7`g$g-zU*gj z9+F?2cSw7ftU6JB{^=L!)#oXc9Nl&Fc82dDYp&T-AxH^KZXEuR1Tg)nQHE z*Em)66+eHoLVkH(h4wI2b)pKr>KEu$$dRi2e`c!g@{4QM&oADq-=1cwPE)>?m9g5P z{5;3c**p%vB>#k=sL@kVNqe(xCtLV9)V9PfcXI0t*P?6Hb@al=?2|1fU-&re@56h! zu&A)6{!0uf(lPNhE_~eKm()Cdzhv+D6K-+YagH4SL@$_#U!uS8@!Q?n-62L4>4Z3b z;p3>EsaXxb5U(03H(zd?Bh|3nIFb_lF*UEg_3D6r!lMEGuhMvPwKU#1vQ)!|r7LCL zp9A`LrSax0`Td(L&v3nb5-m#u&S#}NW!YN;`qQ#R!+mTGuhK7k%5 zpG5yGpF*#ar5ZZr?`Ng)<{)Xr`GI^2Jwuji_`7@py-9v^(tfjPL!e(jR2pxdmPx_` z1JZb-g8EBu|Ld-*vs!&2NXK{cXJDhX`->yRXHlgvc7b89OP_0r|q3}wfv`I(~3pF*UBwCeVtQR_lgd*6R zgzQ$KcZU!jyherM!$Oa`R#N>ps8DY8T4hFcw;F2wS`|)jdbbJ$mqzvIjnOIY-JNoe zQ;iNp^O{L*8@Im{sijifyCHgqyWt(~hK+|`iWDS%&$}BtPMZ3wwc#DtDd$7cs{6mV zthwaf;IMLAuT;qz7*b5K2%+KYBn3|2^(twu7HoMif;Va!c`A~Q60FURZt#kf5Nff; z_x=&Ncv`A*qq6pu8s8z0sUAICDtlEl&#sfY`$GYSlHZa!ks;cE`tzU;9j z>y~U@yk_w|i&ibt7H#fd)1T;n?9g?GRu5ft$hw282k$)ao&&F$KWF};{dexSbM8HJ zH_ur!XWi`T?CrDG&0I8N=k$A~ubQ5iR^3P2d$a5#FteVhJXT&;u9i2H7L|4u?t)t`3G9lEd-;2>lE&xuI@m61>Lcz2nKLEWn7c4ovvfX zDjqw@SVgs~vWLPeQg~irm#a5IaFXGM)kzBT2J^|3!&YH&H{I#l8nHIfBPhYJ1pMkCdNr2Mc;DoOinENrpD|PEwfnXjpDm zudog`op2rVXykVrW;?|%)LX;b8w1GcZ@421ZP!*Ai~-!^8s1aK6j_++9wR1XSQVez zagrf`i9-TuXRlTPZWk$yp|UEgXuHPMoG}ZJ?(J_bTkzv&_ufj9Zl2s&y*55S-jKWS z=stcaUdQr$DQItnwrf(&pLkGRa+;r!eap{2`!#0$Zb@$=kPMFt>o$G2ExjCGMN95} zrjFHZ=XYlK8NIq4D%na3ZP%1Kbds=cGyRO-j+9@Jx5rL5clTH)cxYz%rMSB)@B>KRp!Wt!vS8OgmX$+x*?`&U`gi3^(W%j({(^iddXF^C=cQ?W zvy3r2ctueEp?o2_P=5a*Uy5#(FGQuhe36lL>lPj%-(yY==ofu4pzquwP5CFun6fRh zXw8phsrnNo-va^t(i5afzt`4poEOmdlHV`L7oz1)Nff4QWkH+EqzgcPKfNY!u)g>j z`GzIE*%xk=FGccq;oZMk_pp2>{PxhKp9$ys2k$+0$IJ0|DYRUpuI^*km>~Y#JU=&& zoBa5tc@JIO&72wQ$U`^LQ@NjCpjVw!rObjt+cn|Zs?KiV=jQD1=chLEfGchuyu=jQvxNeTS;#e21jxutcEwf)1j zz%S6PUuvzCnUzt{)DI(SZR5=CGM%2lbJS~+z;g%s#Yi50{9^rjQC6p0V$1gRI>;~3 ztyhjUZl}s9ah^s@y0!^BH+P|5fNaf=U!Yf`w41*$RyMP;c^We6nl-&HiV{PpG z*0f?{_@(*Q1dVxz_~p5WmAzalwwFS0xyGcMo;2oM@=!lJMo zy`_J*ExjDx;g{U~Oc|?J@ljFbQqCg36z}YPo0Kt2VZb%wIxec5+g>+!v7gi1t@2Cq zPY4R>bhEb{IU!EleZ7%um$WUg%Pne#YtgmpI=Z=zUCI`XYt9OEO}ISjQhyiTYvCH% zKBq9?8dKN2#v$s<{DLGeKYqd9!6)3(vSS@N_=$$7FCSN+SM10T^>@o1h2~m!q!a4h zRBXv4@_a|i6;o}M%UnlyzW-5%hCR|@zYrqlX%J%o=SC&#s zZg~Y)FFkQ#gss=E27yY4e8Jz;Brj3{^B&@Aqi#yu;Ro$0J--E_NiWjy(+fe;+=o4j>|6k;jSN$&mJtKcV-VxLf zmQP^ckyV3FmhpstlTTh(%O|gl42<~9m*f-Hw*&eQ<&)RNG)c=}nxv;o_{s<6lh-lQ zEdAVXWe~*s0(wk-?~<^U`^mtFC!|UGjj|Te^YW?doiZq*D1YyJE>PDGmnHvxECV7g zrAc~6Kp(vI@3tjP(q|p+eN}glYUORJH0KsKX)2~sH;w?>kK2cbLBKFn!-)`o6>TeTV7$P7x|l1!nL&%;0yJ!S67GU&3*bWD38-6n=*( z{7we4&;>cjLjk&hS^f^Q{2gZbJ8HGSEPp2mO!Ak2Y66q|ofM>@6EeWWe=oZkYW3mifhID{^cQ(GW(fs+Oz7dSb{Ljjn@ zBqzC0f-(@?z^MVj4dk2@2yWmI+`u8UfkS8mIVXkAI%XgXggS5tbs(psP=y|$b-^L- zfkWH_hqwn0aSt5g9yr83aEN>05cj|#?tw$x1E&iJd*BfEz#;5`Q-fZpt3go%9SjIS z5R#CBG-RO*2%O*$IKd%sf`sN1YC@}`1W<4Ypx_WdLC#Ep016HP6y&572%k`QI!Sgx z0SKbt5JbVL0zniUf+)!OBRD_|1vzPi1SBB^Y3PIuWPvaX4q+DLL=p(IASY6*qB6Rj zcnc2k798R&IK*3Uq7Z{Pu;Q;n3uQVsHq=;1GyG zF6IJZ7#zYdI58j!gIvdjI$;j5|2RTUvqBztY3F9CSE(F1W4v0V;l8}ZB6rc<}pbZFy(5k4( zJr)EY2sStnf(XP0HpulaK{5qh&<$ni0W~COpo0NH2tgELkbpE~AO{5~LK&)16IvCO zm}GL7wMnoc1QCcs0+Nt|G;~4+a*zkLP0&CG3j$z67$OjdB%~oD)SWJpc_=~!YM>2| zs;MbA^@GD8wKMDd>hGl%N7N z(E3MLRBku{z5li?mHPwtYg;yaCU~jY{rpv@PwSD{B#$=-Brqh_8K4PTsm2^FQaFA0 zZ)Mm1bfNcg@Bq#GJ2r6p>mJoo@&i!pLvhUxqo1|*;SMuT|38Mc{Jd3^S6#no|Jw#d zPd=<=qO}x$(JIkhF+KfSMz#F1mB*`vUxrtUJ&kIas20z(O7zxk|NnH2KiewHtDRrA zU%S`SH9p+7tk=^uK700Ii?(drkg_`J-7?5~)8i7?|MSwKEMH+R-z@W{>KA4Kcn}p^n9t!gp+Sh^|$k$Kjr81zm<})HSNYrdvjDyYn!pnREHgj)Qx6L^D+#6?&pV6z{U9#f|r{0|9Z`Z7u zpUC!c!boa1NoYQ}7v*F5uPt)I79TfZ#-1x{fT&AbV{@}_3a zSDEPFsA!JqPQG!@_3xLa8S8ZCyw=U?{>#pA&TrjxN2I*^&3Tzd`Q}KUbHT_zWEe{0 z)T5U!5501se`ot(0vGw4?ID=J#jWky2NSr&->&(f`1$-7%`~~cHQmNbdr#q|Z8J_j z>BbrGGkVRx?dROA^EYl*&(G{tZ*(w$%ls|9Vz~fM7);=Df4gRhem<|nHo*k0@H2Wl z80kN?++NU#THbJ5-`?zR*W7`h&)Y$pU;CL-O~dZ<7AlcL(&Rq$zRDl%W0(8R2@X{8nBF=vy|{WuCLND?aY~|8i1q zCbaoWNB#TDWBzSPW^MkK$2O!6jc(b|Yn`rThm9Tb@$JwbJn&;(Rn%9fx;s#fjfs`n zx}#QWJdiT#M~0SiUi9m%kGQYerpd-?x*FI=ouQ;Fb7fRrpwuVyl~dLJO8r#d8c=5# z>NmQ4sMuTPjTx##J)&eiu;H-!ijt1mZI=3%Qoq&L&r(O}>ht;zcVV{qYQ3Qj@38%Qbb85wEH%WMgepnrXL3X~SuCjHXsNsuN6m^28PSgfE z)ybNAqc+s3WQnQMv~8X03|XMbkl{Xe%28-Ctmpwlt<@?a^(h|7^%-@6rY_XBX4K&< zZ_A#FHP;O4NOtfGS!5JU~K&7342ee9H@qLb&p<|rnYP9qx#Be z>f^dvr)}L&&Cu0H3^|bdjE#q#SUR*}sI)H6`%F1A^i6xI&ndM*?_Z*BHq=#WtEDy@ z>T^cl{^}h{eN~tF>m~W5srLoc=M6Pm?>}hcM^D@toTb!lYKOM*u9LbmZ#OG5)P;t+ zPYoTU?l9D?sz0nA+4#MaW-olyP~X*dEKncU)O&R~RemJnI8;2WKB=qQjjdtzQ&aug z+`2&h##HwhTj!~dN;S>(3zcQ6EgKh{e38D!*!YQ)XI1CQDX&&8R~MM-CcQtZ9@5qC z)cP4JWU4RgD;KKx#urcSt;Y{n@~Zf&zG@epAwMq6LPG&%tigAq3$%cg(Q}zvaI0+>eGgL%IpiP_ZjL+qq0yvW~hf$ zpRQgs)Q{CrNc}-qf7EwG)UZ;|sY+D+Ua9}7tD&g+U!`79+hR)7WK45^TAi(_-)Y;* z>R??h*5gyuak@HQUp+;gtgAEi{=L+Vy84hVuguN5+M*B6P*3XW2m0WC>T8Djkv=$6 zJ*%rf=@O!5&`=*Y)I#-yyf)3@el^8ZtIUgVs$igB3xs&mc0#cGDB z-eL|fQ*SlZ(MDylnq#Vc&A7uW`fcWpWoo&p4loCos0F5)X~vIIvrW}!Zd;@dHtXsT zbM+E+qp1!vJ%2dah z{mayOn)-k_uuLs6)n^U4YCLSHv&>D))m^5#+}yfcb(-oDbH{RZx2e{dmBZ9GOm&6X zw?w_eR6kWa_E!USLv@+!7b*Ep-)jymR(qRjA9HB2nq{i}Ot}^W`-SlR12hdY7r*ZLU66)#q4hja4~Ooo%Uetd%FKH(BajYtssKo~6#W zhE7x$TIwQe+llHDOI>QIlhis(U1s&2q^_{klV<;s>Pkz!#TqKeY-BN>A{A6{lrQTunpRB%YsB6vs!__uZeau{aGNXciXs$oHt`5~z-5g%QVuZ(- zJ65P4o9by(9iu*Os^6OHPgcJ-)gR2kqtpit^?qa1$;!0U^XAr*)eELdo0TKfCrovV zHF%7A&Q$+0D@UtOnsVWezfnCP=aSifgqm)uq_y%G^`fb+GdHbN8!Z*F`d6u#r9NeD zljsDWF;&(YI8Nm(^;vV%D%EYNd(Gh^RoPPanLCbFKa&FWO>b12I4HQ!o)oI21_2U%N>Q~j3uh*ddW zeNCQMYvu8((^3huUO7sA$yCQ%+m2EvTIwNl@C5aeslIM*Izc^Qs$ZDHr>HNRYLgW| zRej!4hns!JsPjzqh*>#Sy<)0eW_+dkim3vYTBWv{>Tz?^bd|AGm({mI{o7Q!HLy}W zBi9XU+tKP`Lp`GpAFZx1)P7dqEOoG@c1|~U9H$mp>YwJeS<1FlhqZctwZEmJR^RdJ zErv>1eXCU7QYA|r%lw9gdcDd!y!?FW#v3kr*_QX^FEY%!`O~*S{b}dT?hOK1H$NFH zcu!t#*f$mMX1ccQTZ(uqJzVyBy148O6}*j}E_-7SzPE<&qua}VzcwT`^dae;v2QoH zafgW?pfAk6Gk|x|C1!un#=Gemvp*EVAv(zHdphvL^pn{iiQ-4;F0(%t$B!rQ6ZD()nh8iQYH+A-dn}hc*1Nj*m!RoU$LKFV6mogifrKYxzmU+7%4|4Q$o{kH_} zNa9Yq8tv!P_`mcx+An1A?{qxcFLvQe^gr7F$m7ce{AV}*tBC)mW72-5EY|H;E8N&s z6@v$=9&Ttg)YY))#yq!8owQ|Oz{H@1b^sl^Gwl%lnau+^FigLu-9g8u9ieB_j?%Sh z$LQO%<55h+hI#&z^mN*(1g7cmv^!Inq2JTac48OZpLQ;b`7SKvuse@M`bF(hHV*%A$WD7go6I zqAFfY*Rp*{4KLOD#R2-6?R5rTMt8G)xrJ8*@XbNIlFn!QEe_WIE5x6-hVgA3_}_F( z+gC;L?J>MMj&*vf?ZG5olfrB1wzl8ViSNwdyXeEV-`$1R(UomqPhYlu1D)CSjr3;w z$MGI|we9*%^lRHU)3I&eQo&oRxV{HB(9Lb%){7g}YVo}qzK>3C`~3zsOuXH~I|BHD zAl_-?U37}u9}MB$Vf;`B4$)6;-&2qB=fg4l2)*X^M-%w5Bz~MObo&!&{A4G7ik@`) z({!c#2l5%Z)a}pa@ZLOrj{bG~zHZ!9#LaZJ+n+Dv7b2LHr7R^Y&H;9}D5*Vf-pR_4d~y_;ot$?Qg{JoAle;-%8-O z>AttWld8)f|3JQ*=DsKB)3=|@;Pk1|^tXRh!XKCM zX+{9pKdItRd+=v9{5j(R>|dxs@s|t;u%FTE{CU>EVH2OT@K*u+br64J<8K}OT?l_4 z#y@o6|3vVQQPDq+KgGD~&vE=q0{_Y=1N(0bGq86s&cNQ;iO*-;{r@kc4(t~gc3}UV zaR>H`d3=fC2lhX@@#P}^vxNUDeugFQ8@^CG060PStTQ1NSy@9}A}iME^LZ z2f1s8jWZcxVb2QT>~NhweT=uT=R|PdD9&Z@g*`8h`!NQ?-k(7j_5qB-u;()j!(PBR z4EsO^V%P^U62o4|Pz?Lv93GO#Lm8K0_jltWhG*D|OSptl8uro(D`wcs7_DJ1@4>@r zc(}Aj$h(M!M>2ZDKae*V+_l2Qqbxj{aUJ$CL0oC$Dh7Gj$A<8@Fdol{5Br1&p2)xt z`y@tw*eA!8j1I8h$lwqA6h?p8r>5|^XgmcYGS|H!7JUb1qaEWgDz`KInDZ8W9u(!)3zLPapA{WBYmm;=fvNB_cdvVVt9-9 zQ{6J>hGkD$G$ZCi8@Af@+KNv;B7>IHcR%B`y}FyNzfDd5Fe8EGXRvh&Y5Q=&aC9($ zi-p6rV$@h7E))*e35Uys!&SoJBH?h2aJWP`TpAp%3{GNDp8N5`kGLv08Q_xOxG$1v z-CHHeOT^(7;td_*_2G>l;?>~}B5FRi+B9Ax-iRVzAu<|5;PoM+Ap~9>GD=OT^Qw?> z5dyCX85|*mf!Bk>%Rz=o2<}KEUJH)kU z3^`F|Of<@g)4c9*n#*7ffs2BSw)iW_^W!EWCg0w12yOc)h}qEg8?R35P%@q z;6Mn%;11P_kcvVK;*b#hn$~9}xhn-}=!6Vpp$l@5hXQm%5lT>o3RIy7YM@pM8t7nv z3GO(s0I6UdZE%N#g-C^g!D04nMu+)TogL-=7`Wrb5~Pxl0(azCCnV91?4H$jpycXel?L3dgH-324V?+V=P zh9Z=p3>Byf{)0NVhkI(!3u>F7fer?kU~OY$T!3T{+<|-!sSt#r1Ke?aQBpB*NBAX3 zB_RdwSieqE4ES@h;12rBk#a}=6-adpt%?@6asHLKzYGMfAPxyg4s-k|l4-%!RAU#Z9OR(@-B5&j z3Cn`Le}!ZfdY}fqKrffP5eqsP;EsT_NChAW42ZN3a7RRjxa|&$>>w2ZcYtI}Qhrqr zkk6iSe}aD|!5ui6CgqNv%#d=2P<9u?U9gHY1}hw=An(Niye03`lEyS#)mIXlp2o~JMxWz zXUc)bjz>b##`8x9lg{ArbB=%RxDCfGYHT=TS!ZMGE$N=dA*GJRjms`E4q;92p2qMY znPlXi8LMV!Gd53OGd(fAzcJ_817+&?v$egAYbu)>i_SbO+c@_7*}WTA|7}{naoeHx z)W)Ni8u7*tjtS1FSGDc(SnT)X74Hu76=ut*uP{Tmsp@0iTrOP}O@m<1ZAi~4SGTA6Lcs;6?#DH7Yr~V0CpWi&;e11 zLjqEeh74pO2Ljphw3j2z7%F9is?ks6Z8JpoRq<=(I5`px4EaP8TU3QqT$Xs~B{v z7&*v8H_(}4l%N7tp!38~^&KLeCI;Ohvi7P#H;6(1he7v;LBEGVw}(N0hd~dAK?jFH z&xS0_D$t{0(3K&pvkG(!81xGm^amJp1QWwP&Krd*k1p_PyKoD#QK|PE#r5jO*0Zr#}q6##b8#IZ_ z*(%T!E+?x%6S$nQLJhP5K?fSSjQ|9JR&9gkY=d@eg9dDamTMygX?Lkz+Ncehs14et z4VtD6+N2E{qYc`kjVkm2ExHCxxkeFa!ZoVU1KL)>5V%;ArhQgUO@RhkgN9f+HH8=? zwzAYNEw6Hd3beHvG_@MEvC3I0&|+lJVkD=gKs%8^(~vBPEYK=s&?;omD)fJ>oe5wY z#ns1GD@$6*mL>U+Y|DpaJ0W-CI43! z$qpeW`-5;f0qhFGw6rr>0@`TnFJK zatIgUAq>Jt8z?3sLI03Z3C1w;|S=X__F;B!8%T!4@G&L~kq@af(e17KpDX+G6E`2g>9 z5pE#id-?&RY-zSw~Rf{*7;KAAiDQ10YIxs%W1&T@iJ;Z8n(JNfAC zk*oqq)fKRMWKCI%N z2H+#AlTW8kKA1ZBOzJErDhWP?I{5(VtS0#E>EvT4zQ6%KaXR_L>EvUk)0ZImi0S0h zr87w2nG#1L_(Qqe6s};Pac4&u{op z^2Xf9$2KRQ*zk!2_^{^WXZUOad?<7BdCXasAo&>P(Rf+c^1HgI^SY4>9;q3KRM8f{!Ioz=szn zpIh*`1o+5;pAvu%Do#G5;Ij$v!33X8fX^iOlmL7Z!S_ADXAgYo1AO*y^0C9o#}0gk z06uZxGXw;Q5K%~!x8CgHXXWPYXU{Uek&}Cxe$c$7#uBaLKTb1ui{9^;Y6e2}(d{Lj z`k(Vpc;KC7TV635w9CIJ6i+YoxXW--+M1m74et)|x-XfxX6e6x(ukJER2Y@wfew3n zyQZ3Tv0&JIeTr^G--NW7w2NtSOy>)#XjP?#SV3&TidM5})gguT_h%T>m1fL70^$#5 z%ma2~J{QL1prXSJhyTqCa~?=DXCLA42Q%kEyE*9FK--jp9`tPI{BLDdv#&t-MdC__ZvbBMfqCz@ZPnVJF!)VBaD}Hlo?*?mGb%OAIQUOwRWsZ; z`1+H!szgsmB{{{Pai*B|3l0`lYs$8a!#|l;i+~W^zbN?KSvBsrzi@akf8nQWwf!p2 z!cS+|`czu&_Z0(wuut$aNy`FjDvV)y3V$cVglE!B*q5j9U?x0kGa>qbxD*g*f+gJ4L8tXDX5KY3?KQ|OT(#o7r7dSASEOfM)7t2VDQz9^ zjt>tbgmxkshqzri*ZoN8z~S+-bnY{RwiZ~Pqd#^UR`Z--=r7N~LK67<2jZu8{0@sh zV0F-^E^+He;_rPdZ?+Lpyb7L2w6BK{#%mVBdHoV$yjH^RPRI6Ugz>645uv;g#_O;@ z!L<&4cN_5MoC+U4gz>6}@7)fB@j7XpTmKMYysm`HT^QRZ;rc!YD}??UE_Y|`hT9#s zElqzs=V!RHtg0vy)ycTC%*PCtFa6WRTeuy!Eu)v8Diq7;1yXsjj9xI6&sat;lzPXu zj9x*iG}|(IGrg((vah07l-e=-Dtg6gM_Elv(DDu)gW^FPdZ$m$DmS!0uP>qmhqH)Y ziP~G5XGu%*Y!1D?QnjblJETW%nc7jRv;?hZ1qznJPs&EQ$Z1pw$|Jxn5j&C@F1_Vy zN4$rZB`A+Dv`eqALJ7(v90%b+eR?a^j^Y5CC1{;B3J&ViTa{HXn@?{nt7I0R-gs8Q zA$@wM_^OqlY>fe~yxPfP8P$RswWDl}>S=O?@Y(_8@_pG#Syl)ikyUW$6~cWZm7p~F zOdN28M#7;B%-0Y__L5N4+_rQUC3jSXH4;J!-6Zyw*Aiwep#F4xh zi*;g&q@&DCY4?$&>bb*`Ilck3S^CgpYbAuGjFN!#!vHV1Jj ze^%qsPlx|_e}P9oZ=Rv+Pq`=Qcj1?8YKvQc4ZmP#H{+KK%O!p7rI()g34Y0*a}D?< zGkXpl6EU|uRg^P#eal(Nn}oDGgO`W+Ro{=*D|l;VU%ld$43*X){wJ$f{CFSAW4I`W zy?Vt@hEVpER}h*n-N&)2(Hg^Ez2av>DBF+KD-d7%=rw1q z;0H6=MeuW_RNTjwGRA=yH>_EfuNWhhtXseK{4>_aWG1cFzev})|La%yUQ1~Zw@7uc zC))xRudDsBBVLxg{LUHX0v5iVN{js38~zFwy-HFZf9H@ZSiCV{PbncS9eM=|-0}J_0dmxKL^eH{kFiWpx81<@UA!Ir=W-^#z|EClR!wz6|h(9U~ z(j-fxG-b2j?L;Oj}%UZoZS94aHCuCIc|7ygS*J^=zlnA>iJLPVVenAr=7IwS!`*ynZ zF^pKaRo7nX%bV%8B7T;?1Xqo}oG9AHED>tHQS%oQ`K>@f>y4q!n=5Oj-fwf}|C2Hb`0l=XInNaAt=p zNZ`O4rzWTp7I11pS^;Mnq!nLxK!N$sH+&KE%Y(z`F#^cb zZpRk0@9(pt=GMnu`SJLw;JMm4yU*Tr*3Pf*Sh4NQt!HdGy}hNixq11L(;7~lbV|%@ zoH+g%bL+h|bIm22^T(K*SC>zi*FDWKt$S+sl-~OO$z7BC>$>Wi>N+PiPU@f7KOr=s zWqkLzmT{qRJ(yza7~Mazv$nCev8FTL6YH<)sti?hMLRKlcTIV@dHF=Ww%C#1?Qiji z{5^SXdGWm7+)yr7H8o$ani?_RebSRZKIH7t9lEBiJ#qRkU&Rw^#8V_bxT5cM+sDZ- zpLU}?fCawfsx^O6-(m7y>pRW*rQ&y*TCYZ?Q@>P$ty=TftP1yc)tW)0@qVZdA%CSi zVAp{yTk|)iN!H%dENg!N%hvooL!nf=U(43~BSVFyQrdI?%hvoeLt&;(bSNFKk$%CD z;P95M*`1-=I+kTDwN?s!Q9+p=uxw4^nEAyAXH^v!;$sCz+tNd=TBCn7)ogreYS>&; zy=aO4aWcaxC#G1j=9A>n^yK&y_7E%9{A*x2SFF)LwQC4`;&c1Qp=t&L@?mMNQD$Rc z(L{4|cwVUf-x(S{P3C2j482~B{+aC%L$6lzd4~GW($t5v=`aW@)YvJy*!3?g^{)8^ zUY9l>d-%2aGEnA!GL(LirgZ3KYV`kFO3|=|LoQPDWrq6yrl}utk(wFxd$I}+8X%eL zMNXZvXKz-?EU}Rpa*;3V!brDu=-9}*16`WD;CPJ{u7rj`BO~h>>K)0vygCXr3Jw|> z*_l-^OJwAntb#*FM%G>S3SBEIbQ|c>n9kR(we_~UGmha(t5ue`$eyf%L&rtd4ZCr7 z3*#OH4UOr1?QXN>&;_&Wtua08WEvTEapys!BKtDzN*5eDDzctyx9f3X*AInVOoz0` z`9%>m+dnhh-ubImw5*-Cs%5p=*E6cPJ}={txoNf*YE+OJ6S@EGu@lW>CN3&YynzRa z<_RAC-{>*ljK8Wc@t}YQilgxNE_%%`z{5lke-ESQd>U4BdL0iFXX9`0H{ANI-*xLX z=skZP4-<<&z_SA$Cf1Fful&<^cK9J4Qt&KsFou9% z@5V|_XQSu*GlW0C0uK}A=snkVI5d6N+DN{)K`Z&L?5&)XqiIVUSP^zlYT9T2I#{H& zOXWrzo%}XtR_qX+mA=E+%pIo79dzwdGt?F+@y@UW%(mZ;De=x!+4vdbOS}iGY}-rz znB!8jal607+_T+pB-7p#lY4BG>b|D3@u&SI^(R@`q`i|e%{e(^hY1cd^vf|3$3`A0 zhD}R!l-Rr=a-nVALkBDE5~yq>}&XQoI5mL5GWaQ=70kvO|e?+ zdTR$+flVsQ3V3f&Su{XN!Hrf{)yHi5Z#B(jV~+X3fVVRa_O7*qJlG#pRy6)Dl@*QO zr?R5)la&*VFVo&V$vrL;>gxAe+2m2DX12B%NyeLqLn~hO$=1G1w)SOg?PU92CfoNi zQ?&18W_(>B=D>bz)4bVIJf$Y74;yh6)>}KsYEDsE(WX;XR;=qIgg@~8)AHuScP9cCmOIw2c6VQc7wZ0Lk+=!9%&?8k_td(&dE`ZO7cnlTzld>3fV`A$BgRJhjTn~|kcmRFo&F<6M=^Oh z-AIfpB4EO}lI|qNRi)(B^eQo~p<9V@Z8>>e1$liXxv7f0Ax7R9CpTA(Pab(MeO!$D^2x1q zbuqevJHBaHE_GVE*+j|<436p}wJ zB44G`jq$TE`SS?*3p(EzuhIL)c%5A?#?C0&OD`Pb4Z7hNZ?fmb_+=IOD|+KBY?qh( ztY61j_M2+*ts3%etrdL7LH<@Jf9E8BpF_UuBLCnfcX`M@gZw`)`9~l59^HD3_vzPT z{K-##K=&Tw&jIo;^zt$Onh0_8VFCHKLh|o)`Z4}NuOH)|VRAS7hm8Ib@*}$c7$4LB z$M}TZM8?0$LFkC9)*$^TT7|E(dv)V6|q5)N+m>Y!(~=48f^ zL+W%KGKA-lk>g?7MgJk(p^+XRY0!_z5OF^YA3ceT+F!cWaNj)0KJQhAl-|M zP!U-`FC(Kc5$2{SLKf5AC|Q%);Zhbw=zL_9M9EV6AQ@#9WR$K*MtK!k5hE+(WECBg zj93jBuO+J;+rS!~tfillF(QW?=^_tGxVahSAx9hJ7%w^2M~z@lgJ7M&O(zg9q=R7jp&L@uMNmT^j$JT*d|RzfZ>C7a907W!`) zr_+JUIHQ6*vr-&?MHMq&kCA7^$+N4;l{Mr!bnG(Db&#uc@;o|t8LM;1H7>H%O}2T+ zwFbG4USGy~A9;Q*Xw_o_eZY(h{N#oC32rV5kQdV>%(x^(UP{j}VS4*G~0m(xYexPl$A#+7B{Rdf|IuBNY;aZLqzEnUWp>#E4>W8|hdc|$dMW6dsx zbK6|Y%uSBn;1-?ibdopckhi$VTixVs9?+`D?FNfXFZm50c?Vt4j63tlyZq$c`Q$wT z^4=hMUx?gVKz0@G=JD?@V&;Kj@|$7u!3gn|X9d|ypE=_VI?Wkx z#>ijNch2}#HE5lXU)QkcH*}>l-g3miw{`LzC;8hP@^|#CGk)(T--Ux6j{gU`*crP- zER#OQGBN%ym;7TM`JSJAKcD5G5%Ie{+;nmjDIko ziSbWHG%uR7rN5u??-==6ocz3+{Gx{Z58eNa z|2i7LFLiQ{liZsFdgf?!2Q(aRQm0p-;bfE(BZtm`hKq4d3^#oQ4G$unp#BDZ1q~7G z#PHE!(8#67pph3M{fu{Fg##j!p7~>cW#TZZDL}LP-6OD-hauR(M z6Gk1q6phIRWIde~jVVRs)MC)8$h0tvrboybCFIOf^58OZR+O9#CrA8bohs>%5^244|S4<<&cNF$Rph3ksfj}M}v%`yr5;*(LP(| zm|R{F3L|zq`#m<`mam+y8os|1*cDV|sjg&$O29e>n{gptbk@qq6Na11r*< zU=0gR(njq3L?{H5(`Au4ah2N@5kubN4_i9nZ0;d@aQ03{{}$(bPCVOf6narU0@Kad z??x7AUb8OXjo$ubf!k~y>viQ!U0y%gY^e2y>+6%c7_3cZX6Tub%v)_j z=`x{1ai}&qIIF4(p`<3AsWzz?&?fDBXC)Q79VXl`no80ygW0Kf#RNY-ird%t3Tm^> zuHftujzi5Ik9kY#=cxU$BVLxg)$L9BOvixu%dQG@N#pn&eet1Y=oj8X-(00d4*V^I z)F_QK1Pio`cRrnVD-Yl7?5!Q)E2ajfX^kgC;4Log_KhPFm)HDia?6x|-pb?2;UO&+j*ffDE8G|f_H zohd3R6)F_D3SBkMG}~zU!mRS;Lb7@QSKZRRxKw;T2b=x0Na>VSIz`w(x->E%D89dL z>1-@CcefY1UE*VIHoYB;)E}zku`^zlK3S)bkdCA?HOM`fL5C@Y(x4SkTB4CI!F)mW zg_`Nbez+2+HJWCrllBCKa5$aW?Kwgzl=iHG(x^rnf+0a=4+44p+?A7Tq4+CfO6!kQ z3TO|O_e$oaMTJ7VG@aQkTC5aGi`t+xqLCg!zhH(h`%y#tvLB`N(L7DF^h*N+LR)b< zvm1D{QYZ{8+yJE!F-^-O=+`!w%X`C7b4h-Yn}#iIS-C3t(}5`#)(_&IW0W2iYMQ0j zGK_kQg+|5fhAmMF&AvDsH%Dq4p~4U>5L~IPHn-%AE9Os%_wd#0R;*pWXysayUf)$s zN}9%Knx##eQ)KR3upnaAzU(SfUmE<>792Z3%$%@rK?#Bd^WdP_|C2El=B|Iwa1Anx z?>Hqb+A?w_WDe3uL$E*)?m1h=M1;``R;*gFeuZUp{Zb_l5xgvYNuz~yG@Y^y)4rXL z&#I+T$d5>;tQEB+Y%~0%5$|C{?GpSMb3J+&rsvJTsM^bzo_89i=k3Pyyz4NU7RB}% zOwXH#g$#d-(X>^Vp69~$HcZc(fN6R!V?=E!rssW#k+cgiJ1-yG2QfQuGDg*YiV?N1 zVMOhpXSnri*I_ZkIJ_#KnC#IT-*D@1cewS|PE6m!sM`G)O`A9gQ}lN0+BsX_ekkm1 z){4j3`jEGtq1_pmG4*mVH*8^h*nU05MCme@Dl-| zfG7rFVhPh_L^;9LnVejY$;l;{oLqa!$>o-uQ4uqb3oJRgvXYZaDml59l2hLSxCn#r z5qU(AC?txB2vJH@64iub7m!2vi6Bux6cJ$nCPtaA+Qs@;Gsz`?5b6lv`aMoA+=D1b z0GH=MR3m_E@Hn~nj+5){IKz_=R;-lZ8Z|i6KsBK^06B!4FbF>pBDg>dK9oQVNH}Yl z)S3aE$RWG{Z1gi7BnpWVB1&-S6lXP2OE_Br7s2IE5G@GEBe>ED0tEqF+XQj8fD$4~ zQ~-$C#UxkwaB^u6Cs*@u#)uk1-vQ(hZo(kAD2LMzz(lUPfzttSg$-v3!NmcbTrFl;d2O-5gbZ# zatsM452zvZC4dXSu{?6)l^eg@1m&hcZi?iF13M5%MCGGL;)KPBVgm+DK_kkM~)rvd{1uJ(~evL18!r> z4t8wVw~h_F)v;lZIyUS^$A(?!*s#AG8^<-69_JN1l?~NRLys=?tH#Y3m z#)h5P*s$js8+2DExMlw{HtcQ2h8@k=u#XuVb}wU7C^zgiMvh&@*sy;X8+HU^F;U2V zR=me9R%~RyW;iBu?7&2!qe1Q|H|(lJA$uvYVFx8P=$pjUZ`dZY?2AMxJ0P)PuOl|> zaKwh4jM%VG5gYa+V#6*(Y}k8<4Lc68VGkiT>=49;y@1%T=MNk9;bFs$J8alzx3K*n zT&yC?t~!*mOAZ^^0~eM(Y+-buZEp-O`mNKk19R=X#feEb?zmye4ZAkAZqhbwxjuIN zw(A@*miltl@bZT-UsA_uBTg!L?hrFaL5ump=Ezn!l|q!A;qZ=i6?|CbepRZJ=8{o)mVT z$I0iN`PX4K{bX$K@YLszgU^HxuL;eZ^N_E`FyLHJ=89cqp7xM0;_^(oN~_xLdT2zY zULDb!H)&Yv4sgS5AW{pDfk+r00+B$&W@LA6HhUlOl|;&y+@wYF@DmoPYS^Mhxav;? zW3=K;C&pJ~0==jrVIKU*h$V@rbJz7+G^B0PqOJy@5{HUVyr^idMkb0+enA^5Lowt=a_?1~)@XGZ1M9oVXKb=|yXa_@pgbG~5h0+5s*z6Afyekc$C%O8^Yynmv#D%5fKwOkgxjmS9{) zCNP#D6X*pO2{Zbbugd(cB2QLzSv4QJd-@TD01W7Ok#?z13l~X0>}4 zP>R;94xu%xooLPFkNIkFqmWFX`&yK2f9)~fc8A&h*ogV&8}k~gxQ znp@8s5sNmS-rv&I($wN;>27Xm4mI~I??0t)S^G(`6L*+hn~Q4vp`&AqCmqpn*pfxf z3tG+I@6A6W6rbEWX~%@%_?~fX4;EGU9}?)&w{F^Do0g! zWlLqKvZtc0!fakMqV|mL;+Eo2aZgcOQM{J4@T>w}qtnymcDTE9T5>`;J}oziJq)OO^FdP9?=cTru@fKA2a-*Rm=s5vs-uRti=NZoqWjb@`j zWAys48g9?YN)rn;&C)Du&*4Jun#NS^7Y!1zaao2!p%n;g4$SDpR~XVG1^t2{&6K9L zcaLTO1iGNkRK~J+Lj*5Pr}!dROfP-@%f|6%!Uag3X9y@(PU{DL$hXAV1P`gX}Epgcf7$otRW%NvmKL0b7n8~9QRzupM$*xVN z3$*IN`}_-5C`oz1GpCu8XD_H7*!xxg^#OZI329m-ekOQ*r&0FnpQQw)aqF<7L%SX{ z@WI!#LT%mP{rdH1D@p8zm!(M_vRFu$r!&3FOEk_(r9~V+dJ8l;v?oDBV>&1}WMBU| zN*w#*WvNS^5+Pig&a}S%bF<2q3(4vM%-+|(O6e3;GI#!czPtD(80XTS1p|UZclDpA z#91Ny0wwdZN+BT~NoVSNX0WdQ)k>jk;#Z*5p}h;bG^Xn)q12&$02&(8AwgwN@qn)WHl+Z2<7Fw778MHd(sX9GXsuEx&)DXC zoUwmHvq$?I=ocJ*Pyaflj@D_KrC!<>5Za2CKU@zem47KRo)~ z7kEAT@6qqR9$qa@c(mM!{`ZlGdi0mj@4gg&edu?;5dH6-Vvl|=`rqrHaqB;ZC(9}D zX!-bNw|)b>S>jK*_2=8%XX{5eJo>NT&9a)_EW6-R)BNx|Z{n8qg7a**tUEptEidmO z_FSy$EzgJ54%Yc#t)rsuDGqWzF3GB zjcLE&U^mcHHY!nB5lfYIty8>Mh^Htk!Z{YF4!noF{IaYXON6d*f)#>s!PFgejoQNu zJ>iWEdJCOU#}E}RI#yKpcu`@d1KP28NSop=6ZgeWoh*zyAM|TXhd^nZx@(?txss7qSURK?g+i`0gDEQx9e5h{T#;2{ zxzJTB7*}btWqMV)xNoi)KKbgby5d59tl(%{deHl1M)bWVsSfjD5Jt4j-1_I4dASAnrpCP+Zbw&|;%<5Q zh`0-P%ZDGgbopWU&svDDhW5SJ+T<^EpX$3Vm5)C+69Ij%PZcnFsmBl5B1FgNDV*2n z+hlw5)!cAt5O0QYd&m0^vRJT1TW@y$xVG5*!!;rI&=GxaNGW4PUl)6=5H|6}F{90$ zf2wic{a3*<_1s&Z;sj z)RYRU^w9BqZ&J!+JYU*SD}*ZqYqXLq@qAI&7%nYk+Ln|y#`7(W;w=Xr0a!bxiv@As z&AyW>i_L}$BJLvwgl6khN+5xkrPK=OTaL0ILW%MVfD8z(*IM=+Rq*B^R9jI6tDw%M zjgT>#_k69wee&|<=dWJfa^8wFv0b@l_3}wP!IQC@JR92HTQXEyhp?gw#;|KxBMStJ z1=R`OHM7>;(1H`plf3kz))i^(dFv3$b=-n6UR_+Umi8VZF1>mbSeD(EA#5p=mifhV znS4eo7wHPYvoXD?vlh`An-}HgIL~f9)a+Z~E}D7!5Xxi_KD)9ap{7)DA7|PeLaAk8 z4JuP9g7TFMRtT<7vv9p-;Wvg*W?7h0RwUGv3hu+gJ2I4Jo?V`Re0*RuEmzPl*oyCy z)=}{Y)=)3kTGy{lT|_c?puCFeZKqn>duPUxGOv1Gnz>>kqDRmtxLR9d_UA^5r{}cu zSPXKQI+*>6O*__I>R2-PAwQa4@iBD@8iJ~6wmg22d!NA%?@rel9SxmfjSLAE3qq&1 zl5@@ST$4)?+*!OMG;p&vH`b5f?e^-FQD z8~6>pysvia4I40x4tPg#&_?y4>KF&i?EnUm`_kMEuuy`{A^C#OA#z#E~z=tbtP-%fRzPrtdS zva{JRgMslOGj`H~JbjwOth>lnjuJf9Fgxbvj_TYIHJe@2yyi*&n3rb;D;skr z7+O2`&B0#-6XJy&3)-1!#$OD7djr1RIptpG}IO~m30P1of~4-yJDwyaZH+_i@XGPk$E(Bat{YSE-b6H3~NBfI#f`4 z1m>`aubgBvxAVS(FB~5KlP{yeE6;*XmB9r$sbe=Z=y}LBs9jMn`C>i9p<}p&q^=yH z1?iZE#tPv{0TjLCeAMbKo?9x3CNT!J3e)qZ^fJN1h@$3J=u5 zHf=^NW2|YrbxqgHh?lrNWmu zr*cP0oKsCVy8_V?oWmH(VnH)-U!eG4*`l&q?G4;{9wA;dqa794V#FZ8qF7LVcOZ%W z<;B6mM$}!lF^Z6Az$SH)l2@?K8p*wK+F7{<&C#CJXqa^yDvC}OP_C<csmuVD;#z5KZE!U`p)aJhb3bb3AE#$!)JkbS)oA|CG+x`F-!3LBeDu+ z37&tX5|kr#9Oa*&k%nN<3ZB1M?MMSP?Z{a&c>YlX%H{jgG}7 zCJs1s@cboeZ)uk$E$zz^Jilpx;84Nyk5zkS51xOV+E1Ed$yuhHi{e3p=P%7Fm?e1r z@k&rO6~}Rg9X$U8B`nRglu2`K!Sj7qpqX(Fv*X3`Q+!sW8RY9;8Fi}93N?c~x&zQ- z_164(dF^|x05h^UEMw;{e{GR9W*48nFdWBkqa3kYnC82+ENL8M>9mvUg^dScU-So> z8&9dNF<*bSJoiYrY)xN2dElt>DN0&a&C({T2G=hXm!?y8f7`p7>rc(9rCi8Mmoi1O zr@f}SYLMqjZSQGHo9OT}h3{4ceYfTnELZPIdrzAsowu3?mcw~#nXg5aOI>@89Pf6` z5RLQC{0XvgrVrIPrz>H3FiTmoam?M5Yg2AIV#fU$10>9&>T7GwAGOz14OZFqy;kU- z@#2aIo5vK-4yP8D8uF~KNFE4cVwkpl!UA`0CCoJN+=Aa=bN5ttg}L=N<9$hIt-7x( z30WCSgLS4URw{&(G@GZntCT~5=zBg(=`edgnO^QcMI3MhSipXX!JM?J&Q>z=xRwri z+#<8_=XjhyoZYu+m(M?+QoiOwauuwZ=h{4-)m7p}# zQX~y6)+k+`&h(FhXrfh0i#U9A3#1&{GoYa{jr%AteegCxM=dU8b=>-v_2;kSybnx^ zlE006&Ql5@hnIB#>%382sZeU?dfX=QU+#T5`kj>?y$(JPFX0(TSd%z7B&g7;rh_5e%?kz@-%q55_faeJdV9XW}9B z%@uC_96W@6R_oDk!l27Y{B8f(tsjjC(f4mg4C9a7dH~O%kKp<95coX27WC+6am)pO zd;aq4!=w29-*mIQkBo{NfZ)GG{Uq8Q?LN(?!AFpvt0^_JW$|R*WZ@N0=4B%sz*ttT zQYcQ-KF6}WYAj25ohK#b3%MuX(|P--w@urZ<0SvCG|#)QVGV~7fWl`)~QN|kH?OSNo(0~r$< zr!)?KOlZ84kycnbq!kA;CNv?d#se7>ny55>^)aDIN|&s!rQ51+J3i>c8xtx%IIF6- zZ5U`+Lqe02>JWDBfQE#uuyT+WE8SUf<*1KCL{?xqx=nbzg0W zXhure&_hJ^^=U&yGnI@yQI?LcFhpdXu=?bedAdq9EQI5!^w2{@vy^=YFhs<<#)K8g z(W}`hZ3jL?G)F0sO=c;<>VYbhN#TGLDpa)n^|fN@N=%;uR~7_3Q6>^kw+_^i;RL=_TBBV*3I{ zQWmcA=x_ZNH?Ye*`e)C(^;=GM>!C4*{=`hgx5eLY4#OzSTUZYDTDN}J1z2?sf3JNV zi*R7}&=(j*+59p*b!(7#9(S?Ft#|8x#?+yXbx`8ODjdgp^r^U${c#_LSa2u%FN~sG z4$s{v?`F3-w7Gw~_t@>|&0c#$AsRFJ+O}ECslHZZYMM7`3)@9<%AaeI@jBW!A>2_8 z`42a_+mpb?>t*`mT=HLeEXZf_vmp6J0r}q|a!(laOw~%5(Mv&Zlu1`Pla)*wRZPa2 z%&j4@N(LCvL9dU=l3XV9nJf=%O(0#!f+C`r2=cAU5SX-nYGnb-OIdzUlpI~of=VXG z#mEV97Su3V=YX?`QST(Dy2$Asa;BG@iv`uLBM>#w9xF<+31N7xM`>lLnKQdzs8-@~RNI zselDVOl~e_G7?N6-C4qPl*PAIfR^QECCg(hzq6XWyM_fCTzHK8bh0ale85dUXpj&4 z$VYQQub;_p=Q9~(^2rdBg-kwGOg+_!g#|htd20r z1!8a&BR?|AWCfF>E168hm>#F^0w+5`uZzj4ZYB*TXLy<9YMaLFd~$Ap1tBII3(5IK zpk?~}FpCzIkcX9#N0gI`E6Jl{9~b(CzaAlFur>*M5xYS62}^US!&0jEEFdH~D* zOLJJ_=DP`l?C`Q6m&q&hm@H)Sh9V{-Ol~P*GDeg#e{&g=RYa8eTg#cOASwy18HM*a zK(DJgf%N@urVSQ9=p!G_BOlEtzZC%S`2o1Z4?aF9+*ZUSSNpNd-WFl`GbJo9V{&_x z$qFW)*IU6KIzg|C$yYq&PrP8lcr}-qpXY&IKf(2byg?TBhM2@sLb#-u|5Y)Q5hmX% zVX}~=q=pa7CNPg%c|8B6r2T02k+O*wyeB&cO-v}`IuMqj~ zLh|!s@;?#s%TjW08R#tsJk#|GrmI-&iZNNuBs#o6pHAjEL2oXT#d%Bym@Ex4Sp+1! z#Y~2Y5MV?Lm@Fj9n6E7-M^><)ipkM&Fxl+W$5yjk+lulDIyotaoa`p2800h`IU^VJ z`k9=S&t#CvxuFEpg-kaVlk+3w!V(ronLNCl$x0>{$H=3r$tBu0@K^`v)d?>3qvQZ zz_`%KB$t%(x|zS!!=#tVgpbKQCNB?>*A%dzh{@}VnT#-bW62IIQss>@-C052Qpq=C zOx|8iexrs3j$KIJ8lm8AgS;FKOW#oU$$vu^zXNFdVO#;8~*oTXPd20Z}Rm-H-0O)|> zb%IIjXLwyK%5(EwgULXMEGb|?5tGp{Sy4h(m67o%=q)F>;F!0Hg(G83V(l@U{~8vI z(V9`91IBnKlP)GF`N*lcEbucqBcI72le0oh7BP89m~4!&pp?l4QF2i^XqmpKl0}Ed z$Rn%CqiVr~ag5%MOj8bdoD0OA29hTjO!}BSDVIq8%!7%d$93(S+X&gOysd3AFyn{Jjn7Z3&^XB$ZNwS zUBfhO#`W#mwilPY*#AQ33w19vKOcI&`?;p)9M5%qxAD9E+q)EDf9nW@s zr|CQW&vZT0_)Oo^9Z%Oi-TPEW;;Hykz1?lyq3-T&P22jP?0j;^6D?0Tp6GtO>GA$= zcYV9@+x_3_{8r<)`X1|etnRViM>`&kKid09$0PAadLQn1xbETJhuR(rJ=FbR%Y%*w zyS~}<&He{s5A@vMc7Oc-p02j8cvtV%maUGhUH3KK*MD#4y^Z(w-P3tb-95c`cibJn zyZ5fPyAtucdhTqw({X3l9gTPNeWUXmb>C<I7CxV8J1 zrdu4hbl==`v*YHj&Zf@(EnQn0xAfiAc~jj@eVaQr*KO{-vF*mtjoonI@7PqgsrUM} z>*Lq=T-S14=(_G}Tds9n+kH*bHT_q2UEO$f|5cq=HD1+!W#^TRi7WfB=(?iuioVM` zE{|W{+tJn$>S$>1OLQjc5`C9-URHNm-^R|3jT`$e?YK04Y0o8XmxM0qxwz$G$HiS2 zHC@zyVb_I?7xrJ!c|qL;y&Kv#gf?`a-*Wzz^>yp})^)6luj^ggu{OT8x2>bCuC1@N zqqVNJcTLBd_?n*8EvrMTyU%MmFVVlMYgOZ_zH>X^soir<%Q>NQx>xQxyYuY2vwP3# zI4gcu@7LSD9{+mJik20j72RjHoas2T`;3+|9A|W&-g0{A^lo@`_cwPoH#YYz?^s^9 zy!W(@)8eNsIn{A$*C|b>I8Nza*0ikuv7<5G*xS(75O3%`r0tOSA&K6(9dqMzd*-yvam?wS z-88#@R@bb?S*-_$4(^%RHq$Y)dq&HQ(2VZsP1F0Qbxv!X);G0tYTeY{DQ#2YQ+n## z>O=KClUpV`CU?~}*7Z&5z)a-ciER_NPH3FaH@s=Oy`)! zF@2*uM#o3@j%phfAJvmMsO_N8LER&pM)r^B98ou-uePH$UfWxv)pS)iRrklc;*IhC zSZAy*)>qY0Raezp*-=?n*;~<3QCHDd-ccSe?}@fVL(%TCrZPuaS7}pee@RzKQ%QTI zF47n74A+Hwi`#@Jd`nTNsJpPKu)m||B>2JDzOA*4|;*vxh$P@^PE=ya#q0#Au?WYw3Rmd{fiFq zy`lu=912c>t<*?E5G#78R!pnSafgJ?v-z zVMqJg=g+DCsoGJhv;?KfkXSe-Gu~+9EAyuLUR8qf2#X*uSG0C%O#8J(a>=xxsU77J zEJ1mMfY>>bPO%P~@8?QT9^p91&(cUkFsL18c3wVzZv8LRj`9eWpmo|PQZ7Ww1d%rD z-fNsu|5{eTDzWoH=}fMg_Ig&yEOV)LW);jbm#S9@%GMZiF4Y@qN7)*^)8t&LHwTo< z_hl;$F_+3ef9m9{a#^NQ{YnW+i?dIq`nB3ynq^5#^Ri5(`pp2rp{7#3rS{A|mFjJ^ zpESjivrHLsD%Cq#1+z@0`mGX_O|=dO9`;nK-zi~fuBA+xYoAK>`{bV9C|V&E>o*5fgh}!TahxY4>}{pxA#JSdMvBOEJls zuiwAx*3aLJb>lF*N03p@3eFKXC);nuUT5GbIW;9Dx|ke4;9$^FIiO`Kw$5`CKdYjZyMQ$DY0Qr zBm0|@kd2@;Xbuz<*e8(5^dQs7{;qTkYZ_VbI)7=U5|M{hD#T$2n?=@foxjNXIq=ao zywatzOd{K@4kteEG()N7ETlvGVRwY9cFWH7;{Sz@0+F#5$}7C zQY1}Nij$^MSuvE^nccL#N~18XbQ)wG+CtFKm@W{^76wEt_Y8BaFE6E0*iGl#U7= zDGpMvoUCfF4g=JT$e^s3n1N}9({L#@@*+PSVh(LJ=+>C_3l17i!>vSRMU*O0k$?~^ z&Y-NwP~kK@Sv8gjUE>5R1mlACa2hn3dkh^;!%)YNpBcugaA+5b3Nszh&L3_#4X;uq z8$hWR4G@ANx_hTH)c}KipnXcCoI1Ht7J{t0ztv4dP`#YEvvW^o&FhQhx)vRmZ#*JvhuWdJ?v5!StMFjWcs`|mO@ORq{l%jtxOs$bVnqs%CJyVDyY&! z&&w=P%H+IE+E6QmD+Fs$!~QFMQNO1hoxIw@RV&V0+H#ip&(1N$<)W@JTwKX$5$$_R zQ`$H$)13Igcy}Qu#0Alh$Mz<1ZublMDEb`R_sH03~I|X zvP7^{aERa=l|v|#^A^2AR4NOKbg|$*PF7Wh(#(^^7R?nAMm&N(K`Y?I*R#zg#0N>v zCbUA4#P)G4P7Mufq?{UBEYd>+`iKvqOtywgh)QL7A{`P;YmMlDpflA!LSlsGx{G|ZDGj2hj3WUEi6QJEgBTC6 zFBdjK?TD?uS}Be*GM&=-Y_t-T#vKB=N{uuG3$;Ur@ID)(B;}zjP4bY% zLb^PigEY=qr9~V+%E66VFht2jjEKmy3f} z4`B9=g9%EftkO}!2GXUG0YO~*@;VhA2f4zVZt;rMXRSZmoV2%ST;d1$m^qA_!;kJk z4`c;84YB>^VvjxxH-~TF=5RS~4nM_>;Z{hfaXpv*?LD9`Of97<&H{%pk^J*#h)ZzKPk$SGe_eF=6-u{Dn@(&0&Z8 zEPZY_4z$CqpS4Z;z%~Ep(@pQ-=J3Tn+s)xFc0X7llJ-ngH5a9t)e`b-ghag~>CFB> zKS?Q+O}P|$OEl6Ym@g=rafL4%P?vz78(_^8#Y5J6o!>D zlJiJ>BzY#u0>Lc39rZJn2JDWPrBRwxB;@7dcZ$*^yFX?9!CAFb3N5wi%(@2JETvD> zE3yuj9fYSR){86<9I~&YV78LS&Unq5Zk}u`8Z27%oB?}E30eP2ahwt9Os#XKTfG@` zl@@sgUkoJ^G}0~T7aXiNqy7*jDi3U_vaSg#DHh_2scT}e==u#=6_yB9;{+=N{s+Q5`~l9y%aUs*!HNfYve0==$@NCJ5tYX_mDQ32l*drfNS}bp81m3Z+`! zVmS~8#-Uw}f~cThFr;0b8C`!th6+oiw5d>tm8LUg)6oONgzjCKp)k`Xjth(z{rY~v zkl^t83KnJPwvJ^POWl=1UsO=02k$F5G^?(-kRK~J+Lj))uVC_mBHv+2b$Jf6rFzk6 zzQa>_E5v#oTZvmV9ow5d9=+m3kNzzB?GF2sTmJ+4>^9)fiSW>OuSZyD z^xf^K_vk0Vuj|AAbL&^)_AHF;lWn*?n}b2*U!&jdtljeV>^n#Fzx7+(p1uBe+wIwo ze$faK!9B;R8j8GT)mS!7fv9DwQG9jX9_P;%Lx^>Hz=NL?`LP*pI#;vs3J7eaQ`jfLBaHQCIoZuKMZT7q~cB<8B zjc)_7^aP#s9NKN5OJh1;yVi_f5<=+QBMyz%pOSHuWy!p(R!~Tkq?6T}R)1<%!Ke_a zNvGNO_WWtS)0CjJ?`~n=gP@@?ov+<(wj8=(cKvd-BTDhI1TE9JbBPd9loJ4(vkFFq zNKHC<{Y}qoxyNw;hxS9z(3lQskMlb(YPNr7xV`gNt!P<0Z&k}`v#)1VasBBT2W?5_ zrL~1ZK{TCayn4~p+%L~a?&(iDh&yS~s z&8i#ylYD2T-eJG4x$Ni#i*mm_J5>s=|8QXt^%;e$oBb?g2qASk#vVGuw=%UO9r6nq z!DKwznK$Aj0u!4(vH4BDb5c8s-jOkQbI^&L=c*mC2VRz-^~s^&pc6S)Wfjaak@Gwy zC~uqC@iO#8&edvfTBm82w6xDYk#mjOQ|cXZB4?}GQL3~ArOGT5Iop(=JVL5NB4Z-w zTD7A*f+Z-AkYyt0IwdHNa2(_ZoyfUf?I@3630kL(f`d-vJU^>owuzh@vPupt%f_U&#dk2QdCgG=cN3KUd5kIrzK5>^%I${_ZTy_rma409!_*oqIcm)<$5y7k*~Hz|ZTZPuzMnw$EXB z?1+!u`XBKVdnx`3Z^nYhA}Z;p8$IbG zv*mBWVzbpb-(xL6zj~HP9a4zWK|Qd*U~w9V3IUB%S5 zUsF=rltO9Ho5G-BPf1y;#HBr!I%&@VOi5X%6iRzO7xv`f6by4p%6g?hT4X7d79GHp zl=GEBY0+1mlCnYRlLlJ)rGW=BCFKI8QCN83Q&KKeilk|lV#~Dj$tZj_$6S~AYp(Jk zySFY<8ii>GFeT+;r9s+cX_Ph%drHbBS=AiCl$1-ALQ%8*o|3Xr$;*0K`mA~lb4to( zS=9`CN=ibhkr(-XOi5{1qOu~ED(j-5s{Nai(vel;|7J?ckur zs%yWebzGNJH(|KbI<8L%h-n?0Qh710JmHVy7g1>_ZI|_y!7{Oz34`_ z{`jSCeG&e4VT%8SnC|a?!L4__>ei>Bhvs$6t~wJvG+*Mj@kRp!ZeR20-MDp}{{bdR z;kL02e|yj~W1bHe0o*>mFa(K**DgFuc(1fsk47ZLmsy%vdn>(SO-VdJw+&Uui zjb4kb)}U*@h(3E+xwl!{bc?)wlx?PIk8Im4lDXTscDG2*9+zj&1iQ6(~RogQOZC9$|=jgV~DyKc;vSrq|?HR8vv(9JFPC@@<(5gDR8IW?x*O za@y=m3+(*_V?>Oxlmo4*MuDxu@eAi>o_-vV%@=}?^?C<+ix!K>x zy3I<%54iZUrS3-s_Dqp2^W(5B^V1Sr=4WNL%rDAqnb#|m8J_>yy;ZiidgHdtFRSgD zT3hBfj#$dL-#BfVcU-p2?>x55yM{dzWG0b3{U3yEZ+%c?%Y0aD&y?CTW%f+eo(bDB ze~;KRCH72JERm|jr*Yd`pH1Cb*y9j|DAHi5EHm$i2 zUzw>#U(>)80Q| zPbncS%`%(z0VODnI|OpWn@#&oB`FVOX_AK=?rhozl@@XQ{hdwwkP??hSn8}Zlp4Gm zd^YXFS>+FGHti!yr>qiZ(3Xlhq(jf9b&1)uX4BijNd2QqUe?LdC+l9`T@H0F2i5$G>?8i zy7TIaJ^BydbL+<}@FeuV9)~`?r`>wa(;of4V-bG)DMZumb?e7sebNsw3Vitzbmzqk zg#UQl|2s^&n(%pQ($$Ex8{s_{OqZv^FYagI$e7H_Q<5bl(S=G-UZy8Q&!Ee@U8HuD zN4jvj3`unHfO7f1Jn|4Bi8xW|lB|MRViH}d1f|K@V-jstdrP}4X=z`Um_(Ni5F9Ed zQ9|vRJtk4R+E1Ed$yufh8I!0Zt6-LxM3*Z;*;JgHJ?xl7S14g=uBA+xYmZ5EWpdB_ zWK5!~QhCHADl;e6FW_=+SEq_G#$Y+8ilyWyu5xoJd336eKWu5*I&RmbgnAzvU*?Hp zkR9`w&APD*Qp=QKy^4WrxLvCxrTvyBX@7w^{*`$Vv-V|InHU*9V&KH!J=bN`5EYhG z4d9u#bT6)mp1E@M`m_gt>yqx)_s_K5omp+yY9+18t|WtTm9R0kagkiX7$eyR3}#&0~by zxvHi-lqX3ZGARNrs)ka2DTXx8XOt9i{Pa$7{BMinV>wFTnBjJJsOnsb|9RrPZzd{N z2oZ`y!tFj=w0@PSSvP{Ch1+qy<&;q2(C3s)aZ2vKmlyhSkMTZ>9$-cUMM#!t9Z`v) z&A0T=a$f@T%=NKn*;(va_6LryyOur6V*Ga($Jd>}-euoqC+@ZES@!zbKK)kiN7S%~ z+3sKa^iz0dj(+Y-eBdlLEwY*Li<|{)Huoof_EApGkmI@L4DM9y;JN0;vwPVSJGs;G znos{TyOmwXf00+^JaaAVUH0p4cH%}RFg6i>V8u`GN%FwjMO2s**-75n;(XP0IdY2!w(oNe_wDRG`>^!KXh-X(CQ7?xXv-6OuDz*1SN$n#d zphiXOa1mY}ytR!Mv-5CKf$vGo&Lip&@=?8=^*Xwkokx`U0z_J5LM~I9w;h)f{ciPTw%u-myGoA^UJ+cJ>yPb;L0{Pv*r<&ByFK zHMs6Q?AqerRU2iiJav+c*?D^8b`i7ljM^^mZAD{tzNZRH;a+9gI7MQ1zOO3EhZ1h6 zqsHv~Koyin@G5%WUsP1lI&xXY*8EUa95rU=M{2i}>lK%Bi^S~wSXGpoj}f!ONo-X? zc?7SbJVKGsm!B4`SSKAHmtU&V^1Qs-^1O<~zWl0a#UimUzg88ceq+YI z{6-a&s(BSX)y9Z@nd;7&x^()Eb}M%;_fr|2Q=f59uKjoY> z$NclS$4&fK&;6ALAM)u-xv%m(k9%}-vM4`)x*Tveh5Iaz@R-Lb$N2Sr?xI}H;~swQ zv)p+fd)0rJGoSLX$N8Im`fEJoanmNBUd4$^zuM-Xr#Ew7rn!@H2?DiN{tetdc{x{*Jzg#C^T|!2`}^|-(bmp`WrJOc=!ndzM#ZGJ0efK z)Gs2WC5N)OeqU4qIol9B_ph&;KTVvv;-5*3Rp_GKkd zC{__>l{CsQ1BB(cV37m?)4!r52#v^-C{-#I_0z*B{oxDy?9;zmRLoJ#B>i7Xpg6N5 zo=N&^s=hogPo8&P$8zhWhs`HF%6Z*WRLo(|B>iRMSVZV6{Bx+g^cTc&L&B=+F~Nm~^s&J`G+_FE7_~Xzv&)3#}%c ztJ`#SJe&K@lz`qk&!@jU*QdXqz2!@O (3A^u$MTKS&oey)bkGtKfl9W%Xys3;8$C@hse1Mh=;;l?p`*q$NXdLCBK?S!47aP zgKN2KS;C(3U*@jmiJZ$|-$vg8{d~@4@CFZmeSE;DXZe$&I*q@t_sMD=3Jcv`Fcg-b zgeHIbOXr{!h%gU1z8`5`wnY*+Lonbagp)}Y4=c&s$wOtPk7Jo-1jYoDf}#hvb4N>} z#OjLh5ToehE_DxV;3RXW3`!7T6o^&kBy&TvW1iZ?Qv^@vJ@Qg^9a^SpVIz?z#rvv3 zNdX6OeAG#FvQJypuGftcW`Wa{6gi5wm?e!TFd!JG#iN@ArnRb? zI69FhNglsc)J_kj>{@!q7elXYMWxh;`o|2VG#RW^6{X_KSp|;FV+I5hw0v}vLG3D4 z6KWHAlBD8Ecir_))6hm*t!l`T-7~mW1Azg-sNk69fiqNf9FE8n=UpiXst_U+hnNS> zELy)x)T|r9(aZyUp!`kZEG1K((z!wh&>}D*sD98R()h1Y^|>(r^W@2Miiz5(p)CGl zakdgD723c;%SGxkOE4^`-Vuktv!0`>3w6j7C-sSn%4I`YT%WZ{pwtJyd6}_HWJ;O(bmIyX>C_>q+*_2Pcg_!3W!yO<1>H)fR1;`UoHU zSONoraltVY)=k@>>Pw|Pd3mKp?etK}HXL$yzNn~_8c~1TP>zz!?qVfHesMp^DorKO zCm0eO?Ok-*C90}C4NsK!Re+GBsIEBpRT#}Mc4<+84CGs9 zu`J(vl@Qqyo=`6?p^7(0IWY@vD_}(Mu(EtVIfiI2E}@piSv0O_mT!JdIG&4nkJG1y ziS!QP#U*68Xc>0^F+c{&+}Y}t2wA?H$H?;Cb?Cce2-o?(imrWDumSqcKLsx^(|CiY z+0(-+d%~noZ7Ju|Ara<$+XDZ-x_Lzr~qFBB#-Y*z?j?{KBRH-=D8!+JiM8j%>g zO0ZgRjI`a~A48a@;h?ZmA*Mp`9W?yGFrmY*E-pZrdxS`34u%9fX^Y!AKAT!!#b3?N zEt}S@yXLB^Ipk&js=R0!^6JY+=;6L6{#;3s54FWC?C{1~a_rzbRno@C3l2m-O_rzbT8nUB<7rP^PPyCIl zE)VF5^RCo8y(j**X#JymPyBBsQ=ZbftXhS5uRFZ=#NVm<@|-+*@|=$1J@NNSpj2oB z%RPek#OGCYsgEa4>T?wDi7zODQlBG!PwZC$q(+`VsnJoqCmv7&rAF`eJ@G{)Pb%oi zmkJ*Cdt&q!uS@a=B~U0>{5>(}P4;&1Iv!T#zp7V!`u*G+UO3sW|Bi=Zul$cs_wncL zocC@j_lTciEB_hno%lB%ihUnv|BvwJS3bkNHiJDB`LAcO zUqAkj+^gn}@WT82`u91w;lfou{Y|#??_9|VOUCoUy&Zmi@qQkcZRPHGFZYC7dED2$ zdCmdu314~YU{82l->agLFe07NbS$UDhPPi*CoR^=YXq+qM|r8`f>)4x%+pr+n5n@2 zsH7gvo9&-eZK;zdP3kn}o9&-RR6CM4+rOyV;_4sqo9+Lo`ci36US8>;@3dTm-*QKJ zv;AvPDTn)J`@c$x{HYzmo9*9JRe2hoDDV4l#Ba7Q7Zv!PyxG2@4k3TIc$*#b&Gz(B z-)vLjY~TL7k|fXGlPu33c{uRH8N$K$`q9#~4-6A1#iD1Xneb3>dBZV+A;B2A!_%}M z945jODRoMSY869SRHwIJEh?}|h-whbddqJ6iM7>kG;I4;Y`PrQf+1bM*Mb>O*=+?Ur)A;!05<&DD!czy9nhzkUgutN+Dj>K(VSEdIN{$-hWn!Jd$R?DpxKc*@Km%+gVcfqJ8Oks!+Sok@!~hVKsB8vmm`z5fX9)2d4|H5W*FU!k{(7i5a?y3`WOuZj9}Mx za-#i=I=Y^hnm<8KMf(Oa!@5v|x;Id;wD$(``4@%t@QvYdVsnzW*x7JrxKcBrt^1ib zLiLFRw(bbuAqw6h3c8QH5lS2J-W%M3vyORjLvY|@WZxamihWUjd6FwQt%|;_6t4#i z789=qoc@pT5@0ueoZ@CXBfyQ}zfsdrC&SC(5=J1rLyGLZks|I--wa(jA(6R}tm9eZ zJGf2t@X4&~2g8*(bX*tzAi&_d2@CRCmOFf zaCzHh+GW{GcU-*tqK*x;zQ>JCot$%{-}0GfH=TB1`Hp3~PiZ;1W9k0Idlzn8xO+jz zf?X|bEn3U&=8ooA^WOOz=V#})%-c9OJNMx1U9-2(Y?|3J6VJ7@&l<@YH!)bS)Kb#o9Q5z#>YbC@yEQ?ybOb< zC%!L~;)8WOA~cBY79TBpLgf=)9Z^^vnP)rXGYrp=8#c>BN7U-Z-%lvFqiQvK;pB2V zrdC-Kae90V_w79)Gy{%jPsx|qBE?Nrt5AJfqqmw@A~3umnuZnd@wxqCLQ2~L=^6g$ zNRKa2}`xe>myoPq)BHNvdbGx5<(gB9;n^9{XCHuScFhTbL{dYf$MZL*=c92$Dw2r zbG=uK;u- z@!u(lho4dW_o|N6!jmDjIGT*&&nt=VKBM>xN|w~llkI7DBpJo~i^@9UjN%9K;$|Lh zM)4O1D~OEZe;8aB8O2{3T$dTe|2Vi|)QsYP8r=WxGK&9sP*Aaq;?rgh@w)ztswJymht8zoGAW(ii%WO#96Rf9^32suS%FSa6+HMo+uvYni2Pr6wa>e(EkofJL=Sy ze^W9blgN|lxsX)ywxgUV{^c=5doCnM#Q07V#q&8I54FS@)1g;}iS!QPxsbs0f7BDj z|NR|=XIS`Qr?wmzL)g1YZFz8*(BT*BU8J@|Ll=Cx=+LY0aI8Af)Zk%E6#v>7!roPC z%YP`L(l-O6C+~Km`2QO!^C(hVzCI}7uu@yTp~|!R{LiZ|A18;K+VV{$MOq!ut2w;X zmj6^W#o_7AIb)@^{MU$*vWC>ONNUS}tBO*&qNy$0*zxD;_lu~ARa-i?T(cP_!sgpN z6XAc9EO~HGwp3#5WS2RIoY!Bm^y^pn^$H#V>}4Opxts^?7d-lRVU=J1KOXhlek!~4 zt@Y`nB8v-ibCvCy7@2J3Py*P3ikbjG?O-JzafuifY0XZ0Hc z8pozY@A=@ffp+@US*5ZX*mnzMcikw~!#tR{xXX#~hY zfhZ6I5hOP0BUAvfB~3*9|!;rPy&R3TojA}aUcOCfifTk zQ~;Gg6;KV-0%kkI0{nmt1c49`1|mQdhyw|r6et5y?Kx%z7At`&APdw34S?3gFaaOn z2W%h+lmKBM3dDg@pbRJnDu6Ul1=Ii-v^KJgoKcTOt%sol6+jxO0&0K^kOk@ijR(68 z1F!%;U;_?N0)&7FfRS30Qy+2mm$^1WJG~ zkOInqN}vj;0Wv@qr~~Q&EqW7w|Mcihd^&&y_<#Ul13@4L#DP*E38a8>APrOlH9!Wa z1L^@{tAL>cCg1}CfCJ=$USn{;DvNKnf@af?bRd5C)<^97q63AO%zaX`mXY z1u{S#P!DK54814EG_mLd0)P#a03jd(#DD~l1j>LEP!3cAX`l+I0cwFPPzN*sfnJ6U z1c4AE$KMiOi~(^V0h9t|Knf@aDuFam4b%V`K<{T5fCcz~0AK?pK$wA>HI`#Q0w`tV z`1Zz&dm9Rt=K!vuVQAFu%j2muiw3dDg@APJ;^3Lp(s=fGMZ z%U~VruuN<^GBm&dU`aB3Kmf3TAW#BW?F=6f034tM2m=uy3dDc}Pzof0R1Pc$DuFam z4d|T=1F!%;U^7_7AeKvj5D*5UKn#cjr9cu$0p&m?kO8tlJfDZ@& z4iE%FKp2Puu=4S5gpmYNKsk^Gs(>0G!@z~cGUa-i8lVFPU;#eB57>YMlmHN5!pah5kaR%#HisdAb0?L6jPz}@o8K4fR z2ef{M0a$<^uz?^@0)&AG5bMYBVHh<^fifTkQ~;GgoNnR0KoUp+6+k6}Rjk5t4Uhrq z0FAAzd`D-PfDiBkHUJx}Q38acxA5^JSd0O2APJNKpt0nob`CSU=6AOJW3Y}fo_WJG`%5C_a2h7a%qHV_0#fG`jR z;y@`-2BgZt3Lp(s0X03h?78Hmz-P?b$U{3m(ZB=l&z8zJBQfB?md}2r3CuB~PMM>2PN)C@CuC$Y(7GDS6_& z-f`9fTg_VFwmoT;#lxz;Jgd-L_ng3z(XvTLMwHCA1Mx5h`=Y|9W!zAX5_}w0Qsg)I z2(t3VR8@IkPn7qafT$zN${Q~#@IA@On^1?4zlZItug6C@SlS^YB*Y#m&n5P^Smi2Yslk)JEA5>A5lwZ}rIS!iTy>Z5P)0 z;y%>1s<0I9RhErY#D_YgDoWp5_?L|0Lp{Tt`^2${+)p@QemxI@ALIe>9ES*%@nHCu zc@TUqXKwo0BRuH+Bc6Vk2f;setxrFWKc9R*&tJlmq5Pf)!MDDTgX1|V=-nJ9G=u-1 z;)I~*Zsnw(>;~J#8JjBD753{q8OkCa2>&H#Yr2}*uA;UD_yHRz0YX3& zhy$gJoLz>+G*AoF0a_=+U?@#ZY_R|z;0FSL4LCpuhyXDl0h9w(KrK)QP!B@`^d7Xo zfki*y0AU~k#DG$u45$FoKs8VcWPy5yQdIBdEfx>}93TWlffx`65a19ZRwd_VvQ0wEv@#DP+v3@8UGfodQF)B{?7fubg_*!~H)NWEfzCC7N`R>jwMn}YVwL50Bj%# zgn=lK0FnR#kZi;^@ehen4P=0NK+iBtzz5iXgZXXkAQnr25D*3;KpaQ_RX{aR17v`D zKx-~klvivY5GdU26t0vMu7sNh=hx-Xjlx}}g)6DTm5RcZbm2-(;Yw}cN?qYfL%~Xp zw86<+*@LriB~Z9hQn(T+T!|O1loqZe3s=etS5n>z+XDFo&RfGuMd3-McpTMt~b;x4s6-JCA($+=8c=PoA+ z>e$u0uWGyM;FY_sY`gN{6}zrzVPE*|muD~Eds)Y2vCDQ}+Ht9N>8?v!E;(@V_KTY? zK5)_Yi<&OlzhV1^?1sJTJJxIKcU{=B=E8#)?7E=s0_}p`9UUF9j@|7Y?XmXV>pIqH z>vo^talUqb<9Y4pcCYO_XW;D2*{y53&gwn0|BUDv&8s_C^{m|2Ms1C)?WcFI=sRs- zd1iU*sa?x@Pw787dUErgi_c$rhn73LYuub;_-XfO;nS{XEjcYWdfdO+)Bn1CP1*1xvJ0y~ zEl>w&eGCJz06$;@K_CpofKs50k>gt^-*PK}YM>UV1GEgo04%@{*gy~nF_fZFY)JrR zKsgX7ZqnEe%02>I3N3ee%)`1cr0>pp>kOWdd1&{`6fGj}$3>~N+z$)?m-vThfy^V?O zZA@rya~>&H8NlrHb{T-#=yNuvp|>&pye+1k_kL6fK~qk6lK6Eec|*iq`-5XM8GmQ^ zZn3Ql+x!gw2NCAOAt@Zu0TkXDhUj206#^t+CZ9CQ7H*ezj)UJhX3%4(5TF}uFYiViT zF@O8Krg=?s+uiKn7uRdeZqvHSX?Ne01r1uC8+mrpd~CYfn9pk)Ys==lkDorNIoGFc z)Uw)sz7d}L`I}ch$G#ZH%tJXn+nFjDX+7q6PQ>KLF#LZ8JPg{jk*8 zK>+4DI|RUHXTxS^=U}w6VYIX304#SlEO$06cXk<&0${!4TO9)?JR2rFy9%fVY8Zh) zEfzCC7N`U2fd)Y9WWeCZeSd}tSg_1_ss?=61REfC{uwX?a_64`Tc8bFAm2k7um$ps zlmUYvzYs8B5ae4a16DyBRzbe0GGH3CVH)JyD+BgHJIx62o%Uw_c~)aX4NwcfbZEnL z$gdL&*bnUnfVu`XwKZO`b--W*921Kc-~(V=v|(GcZ2$&FI|#taXv4~Ahk-~Ju74DZ zFgV(A09Hr46oBc`E(2hHw9A1Cpb|&}uteIhL)tX}jFEPR;kBug#g;mt9)Nk$)&STj zZ3C7`+hhcS78ZSg9|!<8-~d6O1PB3PAOb{z7!U^%Kq-&}%77G54pacJiP~wPs+-T> zQ#A+!sa*rWN@`~Sm`ZJ!O6_`pdKem@0|sCM769|9?FV2(wQT@~RDQBBN&r|>xkJH- z0MQ%>n<_tU7%;5br2wp}+|^*f#LADL0!1r$B~Vg{?P&m3SGyX3>D8_UGC&rn1L^_l zWoUp7zzmzSO)OdfjIp*K2mr9i+OWv-Q;Y$#EWc|q!T@Zuc9ana#jqF$5@q1?qr$paIbO89HD9W)8FfAK(W9fDJf65P(hD(=-yomM{F8R&yIx^ToOR12t-46Kv=9rFu%_D~fKBSGHxLD2R<~hR zw-by&tQ3o|u-mY(+bIBMcDn+At=&!oY;foEuf`(G?l#QsHq7oe%7M zF>2;58lVFPU;?nl+pxylegFn}+hzpf4inC|Ta0QS`@dZRga9}J*bxAp05&`U>^LJ(n!qBQ0_-GE2Ea4GE(hQqU{?b05m48^6wU&6 zHBbZ80vR9+)B*JXya#Npivbq`+W<_!0(^iU2mm(V0PrZ_r!OM}gnh`&xYd}4`IU@HJweJsyJ#on|ifd%Jqs%xkb|1G^mQw zh%{z8n{le3Jc3tI9-&A&n`4SrESApZ*rGLyq_Y`cv|^ETHpi)ovNbN{a~(CE%>-3Y zwuV>HYYkK!HJ#1Gq7}zXXES};q@opz%!xQzRg~xSadA$cW?F>hFn!$3ejvuL=gXF6 zr%h3%c^CilYReNVGAH8Hq7{qGiRgLeumx5mRJxOos?nF30m5>a?sPkrE}Ao~Y1k3G zik@mHTrR38!f$KFG|xOfOXCv!Z)nA|s8TWEUcZ*pago?-?F%Q5<<+Y(ul zcDvpT`0RyOZ0Oju;EIl`+yi^ZC#OwUmANGU^Mpxt6GA|GDBWz`k`sb&osh3NJ3p<` zRVOT7N2oUdMSwD^`mtlLe3SmfeG) zCG(y6s-krMXyPN(h*@X?f*f&&>p0cDrEEd0wpo>ic0^unsb8u4=1U8k+5uTdnK-a>#(-x?LLLzw;rO4Q*bJDatvtWj^P*s#i81zlFgp*^4mblv| zFFtA7B2`cx!K)~b5D|q_Ly7!aQ{B_2E~(zpUY2{1eFK(p3ef}X7qBtp*8}|dX-=kJ zKgq8@%qg-?;Z#{qFAM1Buy4R?>>F_Nr9S-_{_MNNr?273&Hv7R0UtWnub1-Y*Khaf zb6)r9KWG1d%lPl#|6soY_6?ZKf8X8d(^n-p4JrEue3bvHZsXv)-M;yHbBw2hV&8yE zkx-vMWB+$!+jzU3Cgq=|;=DLLR>OfVu^1Y-4uj44gh+dGzn%1$mdo^U8mrI%BLI$r1tb_br=*(~(?AUn z>t$qsdLZ4$@C`6*fTEn>D+0vDQihjmfGkkm#R&8;tUg95VAGA{lmn$vMm>O_F$bYs zjz8DTMC6o%$SKEcXQTjxJaKw424agG!~*eYV;g`V9tUwa4&rbeMBg|Fw{Z|v;~?OL zbCxj>W5TV|0N$J&ybU<$ayvP6h@DD6 zr(3x)kOG1khSAKZ1EQ^rI8XzG+8GhR=wYOK8L>VF^)qxJ3}k_NfyQn=?Pf+2$O4h} z95dF=@Uhj32OJsIeT?7$BLq|c0os9|0HXmYZDxd98Cjqn2zD}RfDDl8VTAWF?0!ZS zPy_e|7!^R8k>lT#Fni>Gl{yUq+2M2m%vcC@m301+^8X6V>g8Y+%6%#c?X5k zy^PY#Z4^QVwa@z59`WqW6Ki8l=d_;Pxu%=#yZg@Aen!(7t?rI_6W?;@+&%qvw>xs& zGPnPQDN*;Ak-+%e0lpcX5&6ygj^kU^qlLFB-afutx-o?YE#=xQ(Gv0&rp+oa@N2U~ zt9W~2g>?!{|JtlX;htQ9BY-x$z!5;3UEm0y%~p;8+=H22;0K`1F7N};W*7JYXtN9a z0JPcSBIT8vU9D7LzlPZbE&|%@TD6P!6!;5hv$KVJ3Y-VD+4Y5c3Oot4*%~gtcT~M_ z#gHq)uR)t_7Vau=KhS3T3itR6R|17A(o2ExPn+!&?h)TdPlW>a1#LFIn~h4laA76( zY#7u#TDY=j?~cR`A@^GmZDp?iD=%L(fxkDGPbqMJYd?*q?3Ujf7?u}z@olLaQ9BHn zmN{yN5e6avjLaOr!+@pPfTfwEcNi5wC4hSXNAEB)KpoJ~*Uhmg8s82K9WVeB@Bw}x z05||{AO>zAMi__!xRtPWl~}Fa|3rV12%L6Hgp3vbOSbY12%M45ms~qR&*l_z=UqZ zGB`dA=?3yH8nC7t zEdZwjqYi-QfdS70j&x&KfDgdK&~ShfAPhu-IFJBJfh3S(u!`kat^jgr5YJMh2B-zH zfNy}|2W%h+gn$ST1!6!PC0C1f!bYh=4{#7#IMPc{= zxKgl=aHcTeOu@fM20SVZJlPGnRq$_<0k;YRZWa8qWWcL}!}1ul09-2gx5~1F2CBxL_D?!7!?TY5@HZ{%tbq0qVr@b$;|1CSUGb{jB z3kM_d4#u(vHN|+glfziHgMn)YBh?OurkylU4OqmTWVZTrqqL7v29yJ7pcbeHjDCg% z#DD~l1j>ObAOp|ic z9X$S>41njYg9jnEHUker2hTtUPrgA-@!)eP*U7~5j^8pEc*;3=%JF+215Y&v&ocgH zGVuIz@HBGpgm7@*=65Rw?%UkZ4BV(4+?yTTk@=;If%`DOMlo<7<}+g8#_RCymd_t| zSw1-iZkQa@&%j+~P*vhv1S`qFjmE+4#lcO*!L7u>t;E3%MBF~)%|rcQ#mz&liJOL6 z!`&i1cocD;P&@f{;r`BC`cbn)%Utiia>sGo0;N2zP@-q9-*e$-kGn$K^Fja83w&_) z8mEoxyeNCojtjFF>~G(`Zufb+);67!J$uKQ+u3N+wo+TUyRD-w*0$F@G&j&>9ay?! zX^Y$Tt%Vb_2jY3d(TbsRmR>!Q^ti3Zg&dko-f8v09+Wd+0wRU&o z3zI5tUsr#Ow$E*Op&lM!8{q-g>+b%xe|}3w->+@gnl!vl?Rb0HReuU_*3Ao(;`UXT zbyNBgzdZ@buK1sqtaZXnS9@qexxb#)^VWK|?e9D)+x~J(wKG|jbhTR&sW|T*N0&1L zf?>K`jxJA8<#-?e^Xka~w5TXtK9q7)a%$0vX;GzqDCOvKqpB#!_7JyME#me9f-&L@ z&SQ)&*EXrjLR<2LNp%zM{zn!yx&79H3dhUBn$X0TpFXy8ZG*XNWTMr# zPb?}SEi|be!Sy?LFRxCo=h;OwTEU6TRKmnq|Lv0&`Lqi6u4fi3h|f~Hq^2`xx@#vb zIx{|daHM{v~E>N@1**ew;`mNNJB%i4SbY0h!MZRDS zpJ0IJDdm=N2Tt%+yFI^}>}X5fzI*KQre;+`HiIX@YX(%S5S8qfBnOzx*Bnevn#VI4I3G1DR}M+C(kZs(4c#E6;Pm#O+(nE!e5iKg|KN=YNQeT>tUu zAOE0FFE8=yyFb9QN3&rp_bZ-M@2b!8#4kLl-i|wX;urqApC{E@&XdRdH&3d!nJ144 zpXJlP$`P|O%KZ8dp7ZG)oI3K&Pw_;0t9|+;wu(K%7O_>FKJtIBXRFu+(kgaO)~~nh z;7Mv=6dRC6u>--it0vjav@8Fn$6cdJigj%i=a+vZFIJ{N*{@i|J5M4oAQ+`p?vCph z&YQMG6_m~6Rg}#W7lo??E4^j6>7|yL)0P&kSSt!2JCwM~oiP3FlZ)1zAnG&^_eo;}Qd?>}tO7Yea702pBx2clF`_L;@IjM?Q&r=26 z?os>DtBO`E(uZEHDjr22`V3WBs_O}p>JIjy<;nBT3$@ci z#vn&IuQf%*)Cd9NhEblEXddp=ieBE?N{oEIUcg7!=qjdj;bn8#1rLxX;3{Wst;102;SaCnko(!qQ(M*%kt|Y$uX)-#LEUBF*+tcog{3WR&FfAyT zN1rS6f}*mHc$$n0^Wu0;nZ3&=Pa1qzO=U2!amuRI>lUv&8ET7Pe%B#yk{GTarpeea zC_qe;anazqoF?Pq!40EMlX1!5{&zP`#-)RTicOQzbi$BnGA>iK_KC%~e-*T)AOAe_nd^RqGm?(9i{6E;_X39gbDUM=2w4%xN-m zTRN96$Kf&)q-ZY8|6X|9r>}q9uOB*(9VQ>+q~jA(ihkI^!AAX{jJ$P z{j>ac%rd|J&~JQt+b4YbUpYb3hxxCXoiXp{*Ue>neERb|SLx;lc=7>$?c8<0PoI5_ zPyZp$Q+mc~zy8V`?xl8drlu5oV}6T!swW-KJzDOiUe52EZ}L2)J34uK12|$f>NIP? z%kS4ILlcgbO1e8^t*IP`FL8i6`ty7O?7mV(&0L!3c-p6NVVX#t$I0W(6jMvPhZi8my zO}1w`tv4pq24i0dH50W^#-xQri>TFvgX>Zn(CHMSWz?=C4d$iP>)ZK@){FFh-_AL0 zkLx|5o&Ra83GCy-8l6Qu>sHR2)PW23IYR%%q5BQmpk*BT8lSG#T}GE_bh*}7Mkk}I zl<|G%rj@3qpQG=*ZPh&ONq7I|C7-gsg0KJ1%T_n88Sv2zolex-V;I>vM7{MiN2fZi zznT*q3<>qSq8N{0qimE)G>T~bQ7YBw6>aCM ztEZJ_b=s-7$LUy&#%rD9Xo5x`+&SxvtlnL}^V~D$={@y3?>u8kd0z`#+-b4i)j(?v zTCQhi(h8k=jh+8GWBj_ zMPJeAQ#xPe=ZL-?+Q&8Mt) zO`@OZ^fOMrM&C8)IlXH#y`aiecsmqA}K*rEK#29=oo%{0!WHnVjxtug6rvu81_ z(y3A%hP74%n={@3h3ojz*P4QBgF$~9TkVP(#w3wb=pYCV%Kvgl%~cR5{R(WO?;nRK~D zS6KVbq^m5t+TwfEMvFFCjc3soi+*BeX3ev{^fYdKiwQyPQNtiS0*@5mNgp$NTWP1o{k zqbiH;=C1+OTC~d?SV6xv=?iA>*|giFrB>%k`X^r^t8p1kv}nB5IEU`GXo}Udn(i^F z*UYSRZKZyb zd=|CAyW~l;cOsQpRBmw!sQ;LxTb-@cU~v>?>q@%Ppb1vrO4?%330C72nrqSI1=heS zYO!dlwQmYFS~T5ipFuM$nrAhxrfmkrtj0E4!UwjxSJSB$Ew}cqrqeBIwW4RxN{d!m z?2o)FdMrky-qzMnu=qj6|0*B9E&W#>Rl4c^!BM4#0oWH*xA>YddM@v3POhy==zBLO z*S4WDk77=)_YF!otU0;fugZ%CBd@-EcRk!Wxvo`GNKK2($@L*sQ7Si|>(%fB6T@_1g65B5WV}w*l!x*p$wQ7k1D7(6is7f6k|K_u z=FS=&LEiQ*Rb49KiSw=y#1+fizP)Juqs!ZVy^<+U=`^7OXb~6@9NWnFVO5_C^FL3X zJg1|`+x`(HP%5;Vg&slP_K&LSLLKtNNqvqYZ~F~OpwwqA%RSt@?b&B0R5X1|36L6j z0;NVroVfktN}SZEou$5;#Ov5-1cqip1?VD+y91Poh-ma1*!RQdG*3CvLx0$rI;w z#EILxRegC@x6T|Zar=%DC1nkH{)d~m{Wc{E;1&N?1l;`ZB>Bzg9pWO?>Sk+|I*CQyn!g2e5qX`dM; z!V@WVdWX#Imhg#ln{G`^%6*@`6wc$(qu1F>;RX)hjh*M$?_p1cIe+6YT=r79jQ`%4 z?bo}npuM-JYw__%dc1S z=Y4G6Tv+PYf6D_#7cKPbZ}Fhfr}!_+14j?;@YU%{IehmwJYuw=nNxeW`gGst|IGs& z$Q&&HowcXw6N`Uhq0d_B?C1;RzVO`jzxZ3Aoxb;g?5>Jp?WfU_gExsqOy0$z2t%ju zGTyV!Cg1}CfDHtJ z5&-e3hOZqHAqBAL03|>ehyYO_1|)z|APJ-Z1h*OpZZ*3?<2T(Ud2MhqI>WnG?(F_Li(!HzMyK=D}mXH9DV9r2pISxx=ATpSv zk{F1TFc2w$D~)BOjWZB1VdwzT#u*5m;NT<%62@_G5(9C?9Gt{J6or8(is7?&8bNDcX#30D0MrY5>6*Mg~A|vyrO@ zwSI;HAoH4mq-z}1#0UaNwPql@nt|+U1`?}rWD}zlKsq%JYGPCX$fRb(iKlZa1rP>e zqyU6b8)moMllfE&4ES?gr%^K z2uv{$=gpBt41}l{2vIQ*qGD76h*L4D0Ob2J5V2xpfGmL66$3Hih7KT#g@5)8WbZPN zy~_x-Fz{u>as!}uF-*V$`~VVe@sE*# zTwDBOWFW&9{}>s_t!0=KGdklM;X9J_(6Rt6GU8BqXftPEtXGLW>&K)xyi z`Kk14*ikS_UhI3|0Jr^i=$T+*JI5>{R@L2zmZMS}Oj?i9nt%j=~VD2;t$a zG8dJI<>57?q2doDqT&z4_V5StQ1J&cQSk?2efR@$_xyp#d;UP|4}T!~hd&UB&mS0Y z<_|;z@rVCB`H7GqUJc3*#0K$NNPdLn2V#YIV@!U;(_r3tynDU z*Vl^HERyx>o}v|tWc~WOswi9IQqdaMiPpe!lr9x6qSL;i3d+{-DtfJf!lP#W`exCJ zMY4WD_XHg*01|jMXB01g=$YR41FEuA*AphyEtd6bPrhcV zFzeTYgBwNGuZITLIqTPX&clQ2!_s~|GPtK8?boA&TZ^Urnwq%P^MHJ8umpPM>-PEV$ zbW;oXo%CmhU%!;!Nnhvp(2wwxQ)zxDy@y{#7i{*ETo%olv=bQU0{Ixf>q~mB&5ju5F?M4;gB1?7mP++vavW z63XyLOKLnmnx1PBYkNZF6TBzeV4Zwr{t$=sF77rrwlPv}d)Jl^`TGgwws&b+p$jLM z+urpQ3VFwH-`*1n@L~6UDp|It`4fvD7w^~A0k`k(*+%z@>mq^N(=UGPrN8rQw)IrO zYc^|eOzX`;9c1rZ+$9#ZGTDF1ugG3hex<6gnCw{P_tX^ZN!1pvWOya#$xdYpchwcH z)EBNa6s~BZLnRNClKr^+itNqhSJ)1#&LJf`c=;}}CHs&0U9uOMUy*&u{7Pc5l9rO)%lsbM$;_{m6&92I z&io$P`^>LYVz2(Hk zOP$9DfBMBU`aPivildWP(R(gV;LR$RpInx)vwcM?7Rl(hS5=gwg2glXJ*i4d{k+;z zzru`uPpOhp?i{W#YDT~Bs)ACaS5b;AlF{#JRZ$*c&}ua-qu(>Cpge+CQ66FRjD8|# z;P+HTd4w_Jf4;8@$|HCcy~~D*qsIUIplHQn@jpK-TC+&}&yR{$EE50oV^vYM#yNaa zqsIUIL=}{+@#C2?{^zG7w#)spm5RjwJX^G4k@%l|s-jeRJs)uF_@Di%wA9P1E%hrB z|MRmE6~~JI`MD}tJpShws+?5CtLLdQX8g}{MJpDG|M{h=D4S|CANa6i=zpauOLaYA zQr*$we;Uo)liXWro#5C1%srOt_%Fh}malMcWiJ2y^bMbWG51)A|6J~|9K+FmPw?RR z8vgq`cUC@fAIAjoAo@MrVVT3;mp|vu%7waL{}+2*eyqu_CpqHp8{O=UiRm$W+0(2` zOY4-OU3F4Hm)dtGT9ZY5FWIruk9+L^Zd>ev+N(?7%K-zvm+X$|qbtx`>lD71JE(K~ zXug+i+Ccs2zL$ODXoEhPZqvu|z3jH$+4s`lRR-V7yWH%iCD~={jCY1cXKI~ETBFg~ zT2GQVzUEwQUy{z(;D2|Ro|(-j6nbXr8;qSlTeTCOnHL#DJTuva?bSig%uNP+X0mh6 z(RyaS-w>XepEAbq%xs_Ko_o!b`PyuFW~Tb`o|%oa3q3RMcmH|Kk_ip$**dmk=3@q5 z)os!-^KnBuX8yn!-7zz0vXj#&j+td9J7)H@2**tJbMzcDQ-h9~txJ?+=KIZ^&z?19 z&SmBZ&&;RI;+~l=oBb>3pqcl~JRhE!Gb&zVpSjUIGT+$w`kIDZ&*?)QGW$-4qm^*T zJYg-tc|EEJH`oZ;m3Y-(Uag={2hb6|11-3gr~6|D*NSiE`>MYjb`u3bdpJP%&tZBJe>7t z1#Y4D8Qmw*XH51o>^X%#XVRVKzEkKfQ+gW;hs@|Q%6-A4FPhEE=*uR%Kz1&p|1#-o zCOc%Zd*Rp3zGd`HlfGpREMs3o_DIZ}3h%-D%+^!kEyxa;E9n9Lwwqn2(nBUaZ1$c? zkDBzD*?%fMVN#zNUCu6o^px4WywD-D-imU#k>`-f?t-H_WRA1gA+vK>X&k#SWslZm z{W}~vY0dZh)^LGqF-}0_?&{M&wCASI8P`OdKYcZDHt+dRqbY?3Rb6V@v;VcmV}n6^ z_m#cpaG8!vM~dGL@fUsh{(r9J0_!g=6yJLii=XxBmUDT}#g~p0e|%p2#roIjd@ggx zLqo(*Q`$fI`m3j`;{tc`_i<4B%!w@i#(g{5dC%Ps4HeIImG;X&x^-d)muY`#qC%5cRqR{@4D!vk@7wD{~vpA0^de;_6yI*T1JZ{jVinV zmhN_G`?hqmyFyFhKF>Kb(vc0c_q*SH?{~jnC-Hyg|D1i9qqEI(zW&V(=XZjgNQ;Hf z{Aro!KlWn!o4dfm{1(ed|Ceq^mhT3mMJ<+`+y}>*_}_H&!1H^+PTR53{?qvXa>LV> zy}tIK;<(6elj4~)wk)hs7Uw;hoDj> z(EJfp4ZC8n8A1dTDnnzl0Ajp|w=hycw)BT>qKSlT6=kG#f)~EMjd?8Mw@66wf_@2{ z92FEIdg}e6M!EwoYN?d;d@t-Go7WdQ$v4-|FDFA|MH{Sl!9GItSR-vjRp1?gz)1Yn zaD`bDG?ldPR0}UYdqV;F{!FJ^l*sVwEybxGC;4T-;dZwuU>hz4K_ZTWYQ@+fKI<1I z5Zh@Lxk?kmh=~N2dkaa|BjcQ;FW6*dQPZ6DmW#0%rYsq5nndo4d2HgVn5d$Q*NlM# zf-mqzX0WNqtO-JZ42%V(OVz|ArvS-h#Yxite9^>+CheQ7nYE@vz!HWYAb#Y#V%#M zU_4TR#!6KrkyVkR3NTWknBayZ1h{~)OCs`@!jyV!k0(Z%O( za4iVZr0b^2O;ECiH+m#cQlp!*n+i9@sJWOd6X{=9S4@VQo2ua$0ak0jL*fTiKS@t@ znz4Y)z`Yqio1vHCQIJtUMZ}jw0|S-Gm`zoKNtFMGum5-H>yMdW zC7+$<^b)V99;?>}HUL2`iYjmQfABaH-Xo>XHACz5lQM|1wqI`*)?sYX84b z>1Dh3Cbly2ebV1LUm?GLBJ3f*wKq8=n4K2kB^JrOjZQy#@s)4^`+b=_Z65q^iA|oi zG4I+0B&e5>!dJW2pc6YhW#8-BR|;OJgd&GLEm{NrWd$ zc+$#~D|xa(Ckc#=WhZa6n^+#1j`!N_kSolM0R`EL9w{OytQV zo=o9Mm?txMGM^`lc(Q^gD-D9>Z@JQ7NVf1K%9GtZ*~61-c;alujkUB?1xr3p3VGtA zgw{U@wTw3!!;^75sprWQo=oM*T%JUDvWO>(TR)OHl~%AU=Z)6!WFt?aJZb02E}rBK zWY#?ei8|?+?(^QK-W$6oeRtno!d<~j(K|ax&mBXzE4R1a zrd{m%*g(ol=DuLBCmsIc!wK@@$FZKHLr0V&t%tRES8U*r_mFxpb|8IC-+p0# z@apKkj=ep5hIT8vTX$(YyLJq0_ik6)W6|`szOBO6;Fjp-j!iuqhc+l1TGwlErpv$@ z?;7>0*y{9^eQiQpur<1>V`a~Zq27A)w5u1^2?jxNC^FB(ZysJ(jQIAwbI^G@QAlj2Q&H3{?Pc$BY zq2&2D*f3OP^8{hoJrNY>^JOuT_eYov$ou2zgJAI^Z;Tp_7FzH9!XYra^$mSES~$uR zq3QDAtF~&V^VjFco{E9pcS2TvSUo*6tX>(t`lUEn5F4%d^6PUNblCnW$4bXxFfun< zbB5L6I5Vui`sRg?9|1e%yGHv@ht+Kx&;R)-Sg71J%Kv$egR_r;k+N&F|HibyOUhT=^n=|o$*!J65C&0qBkB{>I?#tgecM^;ekLUUijx+H;^wyOvr@&6t-$(mT z)4;>a)MDt=6D(@s0Cb=c4D3u)1?6ZEJne z1E>z%p2EHx1&?>=#*r4QM~h0M@XMI%of(e! z8X+ozW4=a+1QmWOIfn^|h*is#fk+-Ls)iH5c$Z+SRJkxxB*AfDBW%@1ZyqV~dErNh z#$tUYJ1qFc2NyH&zcvOt+jB*@%YB3>KMHMmuB{s3R&w_E#NUv_ccw*%_K16Y!c(q6 zK38F8mt$u8FtcSoXCI)YqKp=m@tMtRS@_ImqGCR?nMllLc4Ca1$*Qt4LsYuJ^va z8wA@0w~6H_5Kp4G>%)S_ftl_{$QuACMzCcw+;CAcT4V}lsm=zgJDm=*a(i^@lfr1U6(a?&yht7`QsCo~5!q8ST9hZ~RWs{7 z9uYpmVflv9GG(+#3hI?Q>zQM;$eSY~?o$&tC5l+3vD1R}^TgCe>o7Bscp|e#ftlp7 zcasr2PXaNT56lF=!Gg3g;uts};L&&~HyQV+yJfu}-?=(`(JEQBwo}6Zjg%MUmH;%o z>^&$)YgORDa;^J*y~c|8MpPS4vvRWUQFpMQ5L!`NqkA#+&C~@=D*4p+rj0LzGv;Xu z+3#B=lFOSv3C#eRa%Q3x582xwCO+T&LhtkO=L668KbL$i^xWXHsb_mX7yn$~bN$aG zp9wuPcsX@Ba(Vc(ou6&{Z1(tY@u}|5w0|c4>APemV>AMgES z{F8xC_CJ<Gx;^rqfn8lYwH>Y7 z#qHhg?d_>(Bs#pUb6eXsaa;G+_O0^Pz?S~a$<3)vy&F3=MArw`32XbV!lO0@SEp7- zRu5kpxN@kq2l}Pa6~X1gvc4th#j!=|Lhpisd0j19q*Ybs4$bZ%o%hYUaZF&`(3qaO zj@oEVFd!&>Rq4u@U#;+#50rM5XvM8Xif^c(hon4<_U8-2Dc_jSC1LU6(qkUt3_5Eq zCQX1D>DC0y!=9e(@{-tVVKaPS9+t?%FyRP2p`@UxcQp8mNpQK>iu12#@{Ny&EuI?M zt1*BsBhaZ_s}-j}YgUqufY-MX=TB9`5PeF zu!`VilHfs@zgNciEoO`a`F(e|glI((32iBEIFbN@gd~wq4#0Xz)NY1UR*~K@-ih!v zE7@CREhOIvHRbEZGEUkSlh~Xl3-J#6EaYeF=X)0^7;|6~oihgnV+m%;*o3!9Gzq4~)QFBu1am;i6qR7YTry&>p%+jly>py}349b3 zh%bFWg8s4#GL2qnq)HkikW69x!4e=r!=jn_jA6i~-&lAmCV^g%Qkgwb5%?{^1V5Q} zywXcPu_)r&qkw{5)v$qgumT}a&%LN%j$XR&7>ha@aV7@4Dm*Fhhj(zs(j#VKqnFu_ za6Y@jO6{9)jjoFHd^7B@QdcTT-{vWS#V!X~b-dD|uX9lUz+Z@gM%tgkwUd%mkF^Lm z_^#)F0fq;Z3|s4q$<1O#KDqamu>0biKRC!oo1HeZ0tvd9>@38&(0q@Pn*yXm*Zx!gK!Dddb^{+Fs_fF}4ZqXQUJwVoG>Q~38y9COeKNsHi0-d$Qp)a_jY>{7 z$~6B#W?XPq%$4(t#UJC0IpiDEGNFe2#NJd-wq2*XNm_9^@b#fNR$x+1M0PYO_@fSuONc%`@RUaI&&26@_ojtz^z3)#lS6kz)_i zIOtvoW>{mYfY;YTD>La0HB}JLBySP;mr`6lT)8CU<^{a)V3idk`rwZW&kC%g!6Fwd z(~kLxZp11G{!*7)ss-j}_;1mEid_Hw^G(+Q`p&~@W{*s`d*l}xZ~ zn|Z4TEluUdk1y;mfRpOs=a{|EA$Xt7%82(FYMS1ZX?nzU3eoqH!0Y*iME&$QGx>U` z$wPWxZ?O|~tlzy%g*MST#c%rknSklFQvp-&iGb;`V*%5}BLUO3aacU+DG?65^b^kw zFu$|*i`@JU1hPAIj0RQGw-Tn+8_16)Dr<=HgMjDq!SEPwo|s3H&0`KH^2|ySKGH_0 zL@=cRtO!m7{{TRK@CNwe8lfCI<9P}~4fM_PaIBo?8Um=m9=X;)hq+pVUt^5j%pH_T zJ@l5(ZiVcYsKQ~Z)=hVmCUj)f$QuIC9k*YS^uo-SQMFG)3u+j%2}MnzCYcD`B^y z0VFl-}ytjSfe(hWrjH zEMd1&b}R0pLOSl$8tQPY2}#58CB%^3yzJ&tsgMpdu|y~n)AVLyH~6Nh79G+dCAh~i zqt;N$Ze{FN8NBuKrbpEiq9xBO9EaK2@4Bk!krNg%O#&-zw1Z(8v#oX8z}6T{ zYL*TU|npTu&!gRvbJlDx~A`{=v70jwbfpj z@D5(t)7IKH&Z<7F^b|v~}sglGqYqNylPkan~Ys zQQyMo!XfyqeSvpDdVX+z&%D;lZF8h2#p(Bd@J8JAc;+P&gw_MXl(rr8jj#%b zaD2Mh9fN6(ayJY;3-J6=@}t|`=f*i!+KrDo8lZpyTS+I%3DkU%E79Z0iEINb>YS)13O~${VVtOtE$#3kGn>QYMKv+_Ni`fcuvzlL z9!|zYt|Av=$tU7&+9W#N%W=(1& zL)TPIOGIuAeYpKx{6lTmN0Oq}cDDUG`P#sl&?)E=A6Jh>k7`HKhkN1!F(IbFB7F3K zc1?PJ&(#C_gni0hbx(A+wky4}2bSQ4?Mk~Ejc(JnrnmHL9@r#oQZ}kE)v2vZukBd_ zUj|&ItX8j#wrQ>DRXr;QRtPJU!{N?wTUZQtPivnhPYc5Ai@QG2J1IUXFsXlHa$;!W;DpqK$b{kXk@0Qg z#BrTt+Tf()?z-;U_S)eGoj!Hi9?(>CNBV^bi)svzDm z!H-iyR+4@pY_7;8z^g$3itZ3^xN{j!VVmH^=_*knk*|ee54r^ z{sEg;)iVRy1(k#z43|vwidZ?AmufbvFnb}@F!QX^N60)P&x4N#UVIRy8#S~qUfedO zm^?bi>CQ8QY2-dnF-~U9a?(2HaOo8aty;<1kh6>^EviM9^l1Q;!>MK_m~xv2qw`xo z8@7;D-*y$HqArZS4F=J}UkQ&VePO4Cys%4^i0SnzKk@Dx>%FK2U1aO)RrY*Mp*ap7 zNx~u$%daS^)S`k}Wtob}5miw$VMr)aa2I$niCUT*g$j!wBy2nyt2BiZy~UO2r+%@j z1Oyz@LeNO+l`u|cn|;VxzCm6xE3nCYy`uzuX0zIQwn7Gy-j~CLWYL@^SoJtnX@NO? zwtf9)+`OcT)L#Labk{l9capmmm!0lZhB(CgAnT)J;3JvXE8*f&Oa@#EMF1linOSA= zzcR%KGvuV(7pWufJ`jdRMIyGlJsxuCl*N`O!dElBGo3Kg?ZQ{cMO?+Q16K~$7TIPlg?45OGzJy!7ob6ugbqMZ2q>)eV7eD}iGLV&i64Sp z;u~Ohcl&TaK)~t{_A#_(s*ZMW?_l?aH{88diM;0j-OfL;meyzWP^FKcH?B) z?G!pbBpj%*P0cUQA8U)`=j9vEQ}vx*V#kMw`e#!~!UQ(88iiPyM!>%ECFm_Tx*rD91lt(kL0`_ZWO&gRKj(`-d6I|hJwh<&WR24rwIMInMI};{ZTl7l#D+mP=sQWcrbxw>(2*Eqf*EG zD@FhGicyCC)o}iSW4%h0gVFK#@uGtB!jE3mWxYt`*Jb<=I?jV14#?hX!KW0Yu@Uf6 z##{t*BWWghK9a4SeyFKNRPz3bH)hToO9K5FZ@pfx<^KF^74+xl$_@Xm=>B@B3TH>f z(1u1SmiZDse+c4Ft4j>Fr`!+Eu*)P9Q9Ib!tX*Q(9YEq$SZDLImC)cu&`z*)8hp}o z#(KSbGM7It4DqAPyL@;)L)zcWD_-wLv0fuQ@O&a$J(>U6D(VH}T>k@^*vgzY1@O## zzp9WE`{0>-g{mMWM$C)A=y*=dvpyH27kU*dfoD)d2Jvnz<-}$146jvg-Y{;2P~LH# z*68V2qpR|D%Q->vnN@+l>zO6=e1s*ZWF0&id1Zp+IL6o8f75cm`nqGx&vd_5nbrRQX&N4+86xNcH8l)`9( z=-EkX<@>w^%vbWe>n825-VrM4>$&2rp>Jsdo(cjb`i$Co8X7sC_U+Mi) z>gE0~1YTEtW+o!fC7Ez@{-Mt6JGJ4np|hcDlc#%6i6`5R zr;cffYx=L2ua@_=@9x~yyF=dI)*j#1yG7iR+|<2cczt|b?;3GUa&>>3+!kNezM^ya z;L^~N_~Pz`gY&y1!)j=5w5c=PKeaPB*btZ!pWHoZctT`+YHa@)xh_(Z4D?pZRc)22 ziovo#SzAfK*Iqa*hhXI2n=j_KJGZWQ2-HZT#y{tv!(ZLWfD81%3ftR9ToEV54%6g z;DcGnd6KljE*lusIc+NVhTgRGhYQCklrR97%0KJ2+kc}w5O0sv7h1h}f(mK+)Jhnp zKROLoone<1MMuhw>|&78N|^_W{iW4r8JbGc@3@%6j#4V&O~kjJbr zHiA(?F&)N4$M`3tq7$&{N}_tl$3SfW3^>d-no&>`@hPryI(7uxDv7ktFC}+O@>ZpK z@-31p0%Jl@RN(U~f?3lG1SZu)n9jotrWc*ms34VlRR@ty!T|n>N5)f98l`~7P8`FD%5%_x-*me#CkgngkgrRJQb}% z3s$oGK2HUXDNFHfu47M-8XMU>-Yen9vK4vSn_I{`_rko>*Io{L0#Fi0Jh6Pvsd^$H z=Bgwpl1e;d{AC2@pla1_iWC`*B@LLGX{4tP zCQF~Y-Q&EY5i+313v1=AskSThZ6uXg-VLcJE&P14d9j+UOOW*rG-i85$=P4Glwfwz z7Taqd(8r*^Wew-I9|+gscF|&NGwIA%#j>S`B-3)(6SCvPSyLGHg;e3bkO5h!{_^!_ zF2V1>SHHuCjG$!;KKTDDjWC_idFR*kSrE>@68zJiyT2_uNpI_cgzc;O}T08lYiZFH;G>nu6rN%d$aEMX5If*kHV#&-8E(J z-QZU0W@bt|=#3?)UTh_tvbO%+Xk;c6cXUE7mPyeTJ{=M$Sv7c^ff-t!_H_@QE zh;onFC=BWDP0uVkhEcH5D3E{rDLj2Pc+gyrk)AU?{Bt%If71PV_x4LSfIq3mf9B6#&L1v5f7bmObMVsF zz#pgzMpX)hr%Vk_31N=no#rNc$j0I?y6c2<-Yejm=A`9{Fy{He? zdn*K?J#5% z-Wy4?vgnccpXw{!f77ikKEK?tkEKC>nOF`q>N(J8U2g

@PoQCq=EJ+XwFjp^yy0rrC`^KUViiCyez;{LFX+D$zxmbSE#QC_ zzINrL=?&D?2PGSpHt6;64d0J~OH4Ky?ee{n3_q*%+WltdPH+iH-Xw;}^S87pZuo7c z7y03b_wt^aF*>ZMX~z&Oz44{}w*8}ux>2v}aA!qLAJ9+M>Qc=qz+T(x$p_b1)C4O# zv|m%vZKkHaXJxnQ(R*9^lXpL~U$EYg?+Q>45+gkrQRy)XKmDC#x(fcj@^#5H=TnmD zsmCSLMEFa8QZkkAmrS>OO){C_@Ay|G(;HurOk3gan_rep3*qmXUw~csyYGvVN!n#M z9o}g-{p@wgv=;t8f4$wL27fA<9vGBN{&w(a0A{=4Z^^fh{o`Jk`)n(NE+u!(51gQE zUmqNetTBVjmDY&EB-%+(ifl;O$M&2R>{AhDA}m5!i?9V@FTz=byq+5cdm+LEgeeF! z5f&q?L1;&~2H_Nd5ne1`g{=pA;P811M<%NqIM&1)E#%2so?OF|Yk6Y!!iu{Q5D}jf zue#%{G3J?4;ut2tff1`lkhPQ0-#djuC-Pc^0u&}sqtJ!C4uNd6M?MXDwtS9AXF__m z0!*dn{D{w2BEB#l@$(Z9Uz~{86GrT9LVRgD;ul&FU!I5f#rcR|T7mfG^@v~DfcVvo zh+o@*_#ZnF|8p1O*JFsU#1RwUIE=Tx1Y*C2_{}8Zw@eUK>D2;^@OXrLEp;-3P=7H;K<)=5*&NGmLvbDaU6 zh&YuarfD3>Q#oReWJyA_v}BoRoyQT|e2z%19I>}?#Bn7@oU1wFx{4$DQI5FVb%J{W zM9+54$h(6h@=lHv#5htI=ZNnxM~aScr1&UDN;Hm?CXqC-H(M+dvah*VE^?&8#1TL4 zx=EPHGyVltQS) zsUG;;4YY@u$*t?>>%(Q3f4LYBj^QU z@5jOqNYm_j9>K7#u(z?b167b$N%htj8)-DVGL29OZnZu=TdMj z``>dZtY(OC`|q7gDP-F(hDd0UTH?S40H$(GYMQ`?m!evT4;9ggCaAwa=o}APgA1Nv z!ZGA5h8`(g@J$hU@@!=#c@ky=*;kAbv&KBp4A=TLD&6x|J2M7llPEDM=msw(>dkY} z*(&NiNUSKvOrn5N1)t#opH=vy7ZP&dl*LP%HPn~_A4M}G2mm&KStHxfsmYA-6BRQ^ z6*esfH~3F4meMlaDf*ecAjT4WW62`UFptJbca9tP^hlb^F?K$jAQo`S>3TF#;ZK2y zOLd&L=#J@5E2(kR7hLR!*-||&(lukAMI0vasq@NgU=I=vQ{+n{MRoYqE(=V8i9hgx z5qM%3Ee~-r%(<;x8u6M$h4g+GwoF0m?Zz#O(m~BAJxx%}W)*w@AK^b-%qtdem>kti zAfee!O%+u&`ElM|F!F)AP5v?l>pP;*x$3RozMflk4c9=wb z{K#22F}X~z_sppLIE=p*-BbWycyF3z!_JZ*{4#cu-hExLZCj&{!l5Fb6!WBnC%lfk zL%fc=L*=|RUg6y#f5rsDk5y(E5MC8tjMpp{Q+R6up49N9mM3*Q8N-vYjIi{_#_>ku zc`|_~ylTD}ubMA5nYUKY6JBXwtbsQP0?7;(VjI&lvvPMFDAx{?ZWHC>c@MI}Z zmhogcPgdxJmVZ2>3K6P)d=+Q!a4S#Rc)}}8JiMAWxr!%ic(Rr!>yQ|_FAuNhjW+OP zBTqK*WHV2AosEaL@+RAO!fSIp+}@SQzVL^)^Y(V|WG7E{@nkno_V8pcM~>{{$<-W5 z9NEvYBfJvHBfP@EBVsFlddZrmBPO2Y@x;s%3s0;(u^9x*A2iN!e%pEC;0dqP@`#H! z;Wb zY|{xX|Km~KsGTRQzS37%xSDJca4{vQRPxc`(et%9}%^U6K$u&F?2JoYE z)*77+#Am#-@kSC)>^yPs#K{w0tL_P2sqP6kXYHhiBZ-q< zj-8Zw!fWC^$t#~d>Eo>x@uZk1B|ItRNtr=*K~|nDHyDx%p7?oE$rD~P@X2c41k?m) z^7LeY5;EYNQjA~vPd8nj^2CB~iis_+y0$zBvv0MxvDvo@7_VF({Q)glT$s|{HOD9s z@SL~IHNt2(W55P5+Pi|`%2?1w8zWr7YW3udLuQt7W~@MGory6r{BuV++}eIcZ^H{F zAsbZbt?kleWT_U)BJ=4D4!12Nhi;o}1C#Ez&1gaVJG;$>PmT_LY_cs8*P~#pRcAvq z8%D-Lbk;~PjEq(0tWn05v5uTI%D6HXkHN^U=ZY9-$&0h(0mJ0QS@J-L$&0h(#R*Mb zoFysFk`%|2eD%bFD3iRy7(86YLNq?>9=RbnM!}Tt^QPh)n zgmlW*!VP-GGAtUa!)Vj6sJk_Z`a{MDPA_DavHXinPtXyTpd&1rM_9T*i0L}Q(gi|H z*AbSkBP?A7)cU+HxI~$}?%M2sWC?mlzqO(!D4|?4+jO6!sg&$yL9O;$wI7{AfmM&nJuH!6S zAjEVXXX!f5(si6=#Br9q<6QDUlt~_2oEL<`Y>-Cs3?tttBf&5#8f9cQjEYAYWn7hH zjWVTof+g<+OCB&x-U*gG5MuI9u;jsM>G)G{f+g<+OCCM-TyHBuWF)VSO@4u%s%(%( z@(iOgSbYjzezSg-WU3)&x6FG8emlj73TXc8Us=;+KZOV~PTH*r&)usf6PM>S7_-(fnzNqx&qaIz^tHo>V+2ckWg;Dq^WiS*aN7k}WV zg`Uf!kW>R`#DaaN@)$^w%DmE%&1Ev8!OaQY5ba!(Zw?STd&$fIb7wCVUG8Obop8fT zqbR^9$I$4~1EwVU9#c7dX&i9D-fcJ@376(z$8;^7xt|C<0D7_f)-cT)lK>*aiDI}w z4`|v`QB2kZydIY>Lt``S(ShG_IL^vOzTD{aUOX_y4{LkUB+Zx;hGd^JQqDrrvkjfY z1uB9fYNU9aVMm{)r_qQ|b7~EyRWSoisqRv`9URixy+D7wQ@VIdoS*HTE9jPuI&Ke3>2 zc?}c-63?KIZa$`4)9LnNdJvn3C6|8jT0Jk4pNdw~ZN51FjNhad(hvM;QvwmvlL=+p z-3^;|@9z%7)VhS_0Sl{HWu#tM#g|CrL?!c!?uI5SW;@}_Ol)q(ewmDOrfB$9>A$lxO|33x21Y2 zu!hL!v%LVal@%9S1ucHCzd8w7X;Gp=o`jX58aLRQ$t$6GR`RooNHuwAsn@^^!fX_R7_NYa;6W2?(^`EJm25ohR;#>Q{WFT z_!Pa#S!679=<7~@!7mB?3CNfpY6%jnu?H4+eZ>RP0n_|YIErQ%qb(>LKr_}Vr23`7 zopB8^5^SiD5eg{r0C}Ae9gv}WdU@H*0s2KRTn@rZV=1B8h&f5?sUWF#FExk04lI() z&p3mCRFexrQNb>~BwFC~5#1~JSISm_z-#IW$Q1#?Hwp{wX)1uwqM-%QP3gsc%sJI7 zbiitZplBdXZ>#{Mt1comuQUp`L`teRbBuSmTEGx)EhF)iqEEioo{U-Z(dOYS6L`-E?F{YVP zhGzkzh?keN1zg4SJ;#mx`Bio=`^}-n$m}qLVuW_4(^FCIQ9z=24GoyEpa0i^(uAg> zy%q#|LEsRGQ9dYAyim;Sf={1~N4#SaRLBC%UU28a2UVAYyEHrsm;?l)9-1|H#NyGw z1}$}HeU4Z9Hh>3a5M)Y3&@WbYNWg}o3n3m@BHX3YXQM=D)L4nUN!K39#{O_Vv3_$Q z924oOuo7QI1dgnn392dJ=g^kb7l4hap&8OmhBnN%I921=J@{<^EiDRpYj+_k!j)(b zS_NGe$!YVd@t1Deyb8%mGs~oqxmA&|5Mx-1i=qY$X#K5ZO?SA$j<2`|UtF=)KTiQ0 z-QQa1!?rjdTmRC0OzF@C7X7!d74_5KN+Nx8AvA}eRhJCdDk@S@stiJpJZt(Lq;#q3 zA{!Lfco+08X!ux_FyiCk;{@D1(;A%TB?Aq9B{66FM=w1B@8JzEvdTlVaA=e8M^L1P zmpM(fHG%3Q)Egv$o+gJ2!HeKWsHHOD0>}`22qmC$%29z(jUdH#Q04G#sBaIv$xk1E zqc0H1iwnc4`5qyf5IpuC0JowE9+Lva5ep2Id@cOro@%0fSi+yVHGFhKQ;nM@{( zl?BZF^DxnLPut3O*k!NPve57n~cpUk}r|atzZqRFJcGtRVsaJWR%PYTV z03Z)^dFA_pHwpP3Q0SFk+!q6Dpgf8yNJN#J7W`m2mJy+*%|aREwrs?y-C~dxmm;9P z&f)+Rez6Fai}MgHsHn4;Bo>D+SNkljF~Mi)IRT0m5zGSsGJ*+|+55V#vAcqMW@6M6K+&N4Jwly0>X^x@0 zi}$7=hZW_pk{ssGVI;QH*C_ffPgoW{CgLW)h!y9du5;fwu6I{pXaA1w?d{u#quyw6 zTkF=?mX6I`oBH4cDes2h`qp)^wH<4^Nc9u$F-me}XyxFF)QZT8;pLI#!^=e2rg zT{H;W`XUR4=M(QwCYO?fQ%u&Gy|d%9apzw9%=nDX=FoJpsXN>rmczZ%;?n}t`lqHE zBaLz>1fQg)8X^tDQ#z;g*2n96C&wpulHqq|`a)ydV1Uv+rhSY&rnfF$*IV0J6AdWJ z04V&A`jv`-vUF**WYCxLMGA)tlJLPQNxwJ=j=8-*zqF-a3fTs&DQkpo{%f6n zNocg~?tjP$$NY+m{AK4Opn)Od zddC#FsIdN6rpuy&ki`*V_Wm7HA6gS2SM-blf*n&TH9Dr*u;0I9O6RQ~LL#p*rwP!({1BEE-8j{=YAol-RXmpi2pn%*ge>X+@4f)D?4pHw(U zLo`684@O~debRsYU)LukE4M(K`Og22&S=g5+b#RMc=$>azRzAVI2Jx8hLbDci)DRl zF3c^k#+zz?m&iR8F#9s8ab78Tw;R4&e#}z=TCU(Hiu|N)ej}Ygu;9zmO8Q$OR8N6} zEVR{^P?d9_3eijE%z>}FpZC-k(WBNi6IfR8Pd@~LZbz5M_@A}Ncrrw1enrLq%oG9m zl)3)h5@Yi-YKq|ho|afIN%D^?n#RKr%&XMbjDI`w85n~7eg^CEP#dkggjLD2^wF8t zu*Z9e_TkB5Yx89C&4*gn;MZ>tx7?qwdxYx+yAPoPp%Nj0P=_FDHwktxLLq_+Mi%x8 zgenBN3qV1rMX2Zjunqy(5d`mf!R|pQpic@sRUrfrDxr67mlA0}OAmk#!7f~Yld2JX zUVvJJq5%MxaV|1sYrp2$2Y;Yp1*!8s~mBS_|hE6tfy^CZ9%sf)8#!IMg!6b^9Kd`zb>4JRR3 zqI5jULM`PV#FG-9xHQhU02}HuHx+5l#L=Y_*o_XOPlF*T<%z9_b7bd9 z4NuD0_*st}(|pWGo=OMNj97RgQh2K?#!-QJlzbWL(z&%Cufb zIFVkZIfq4hUFJjq$YnT=kre?R{Nky_qZmA*cMInJ{rVi952l$s1yLvws+W=GPZdy4 zF}U~O@iCrS1UnXx3BAG7V?22v(FU`}@sz^4KzP;^cw6qr+j8AZ#3?iBUd zLGE`nU%vd)I?GSRK;P5Jr$bK12G8UdE=oNbd35*_ zou6p?g!qYWdW2*9!}7zu55*q}Jk&%56g*>q&KVM9KY?;UfR=1>u7CymC|UM)kw3H$>0L=XyUB|4{GsGH5m@1J}BJ z&BNCQuI)cFcsg}@@Kowl|Hc z9P}t2BI<0ZJkh>S-q*V~zBjP9f6w6V6lfxA+a>O5+bQns-qF58-qE`~zCEzLzdg|2 zA5BI>(fGE&w*IYwtwWo8Hg#-_Y#iPY*dVVL)(wF+^uE0^PNLUnH7+uf-hp!B^C@rlKP3^jB?!X-H9CdbVR(fXN6~Yz48PVpB z={-$DVI|x;O`F=)I1uuN)L^V3J*BT+s1Ht#PU@K0Ght}FGQM@3HnwZbK%KWvt&P>B z1AU611goP}9b|<^3S|#5um8aV8>T-EU8C0)a9yLm%nE=Lnl8JC0<>TDLIedt=m9Vz zSP>)yN6&=>c7))u451RC8X#gffIm-mID@wkYSy zt`pYmIC&#CPYQTa%#(7S_<3T}xPbg=j#RQHj}<^Q66lXH7T}G90nU+`ClXIwJaO}+ zoF{&sRPiJ*kl+FmSyzq4$HEgkPnBMG6HV?sGks(4bv zlRBO_ySRYzdE((o0Z)nzLVxzk4Te8KRXkC6;u+uq^0MC`mOLp+e?%B@@WjOv4^Ijy zN$AC2!W&iaq>?9=7#EO@Cw88=c;e-Wk0+(EkJ1x>SiH-5BT3@|s_fuMRhlCTPilA~ zc5&7$JhAg6kq>?8Vf%fNFpzzfs$Lu_D@x;p$A5ThoQqB{b!g*c8db%uB zfek5;tcDrZEE5GYPi#DK^2EcFLY@@C2xavz)w4v~FwbIjitwZ8B=>Kachc%K;q&Ft z#(6i1B)p{M>iu6De!27I;V(qKF#J;IOKmTSFSYfGz1=-xPxp)MFUl|Wem?&Bz~}p4 zNWKtyVet9X^O5I=pNl*<{A}de;m>t`ZuptbXWE|W)Q{foe7f!F&ZmYy)A^abf*=r}s{k#O_Gn z-gldDTkvA^V;!lUj-gwXTU&3@KHBw>ft$TIs~2MD(>K9j<;LKLqc?P%>-o^o^~&|F zaKv_3V&JUzta@GS+Vq*e)57WCsp!d$6FtX=jw#1l;p~~N!vk?|T#dyJr4RNU5Do;d ziSF-6T-~#8Xs@!jb&s~YYuCU|?@o0`Y)AZCN!ir8QQOc3hvRwI zscU0v($MJ=RtMn-nhrQ=duXMyvUP>FyldIOQtwiANo;W%4!#o>1{Xxd@BLHe!enaO{nO^clKnmD8PS0%n&cSj z5t31lP(qNYA|d%}yFn!F%=onrZCI{Gv|fW~JAf!1M6@45bnHQN???2Y)+afJ+K6PT zjYy{2h~%#y0g1FLkUIfi zldPd4Cpn1ROV&lR#xl@^>o%rM(${6%<+mh}JQPwy}uPI7E9DqPqssgNn7}7^MEfd4$4W$ZE23vHVhoj1 z$y6zo{L_W_{Q6aZ(ly|%zCyYdrIvMw*7bpK(y{cwCzTe_8{7$h>mTD?wyF9cEE%jLv2_x)rKWgZCLWJ_Jc$^nDO@j zTCf~Mv>rmV#So=9qWuV><1nK8D5B>Y#28hnmGOk?){?1iE%`Sm!Gd&%`j6>1pGF6k zGlDlk<0hv2>h;1ohv%8y#8pAX@h#+V&wzS0maFB03Hsy7nWw z4*(kR)V&b|&oyWkivoH@ssK%ftmXCWMR^u^3qPid6NQOm(iwRN0zLwXDe{ zd0yxa>s^hL#)H}NUQ&zoy`)y#Xes2sO&TqR?Ev=olG+{bC3QRBOX}fuJ7yvr)3_`- zX?%1mGJSC)QkSDQPB6U4Q6QI<@|xtbQa`k>nM!S8)fq$?DYn0Q{if2aWxc+Skm~h+ zgj9bYMo9JdV}w+HUvz2aqjUWQ8ev&~p+-oJ7mSLH)EVzvu3b@o|3*ml_fcTKzZoy| z7j%T>oEH|}S7xlgwv1$6L;W=#A=O{&5mJ23q5aV}zGS@6-}@1k^>$!{RBsnXNcDDN zg!Dbz4VblO4aW$}MngiyM%0XUCD$%fu&8gi7czGBc4vfLy&cL(vHrmd|Hy`knM3;o z&5(tWOgo`BS0ki)^EE=MH)kWHdh>=-2tVVoU2lM>Z9{6bN4Z{zdiyj&s<&5Es@&Ie zPxNl#t~88K2X5DHQ!e(Tq8-Am>5r-(8Mu(V5V+8LzWw~%;hQ>OSlV|k_95@}-O0A( zu$Iz7S|l-eHhDI1w)eWW>xQrGI1@V4e>#3zKHYt)?bPte)XB~hkrRW*lg9(3^Xp4{a4bqn4XOQe<8$S?-E-RJ49`x@?wl2wH8?XlGXR<< z+piF>=$sLm(bhaXJvBWvy}v2mB*Pxow(#(@)U*)nU>$5sHU=7dL+v3k)ESJxPS#{Y zprLn4`;>UST;DypZSwG>)T9s`%o?94Pwbx12FJ3B<2w`MBI5?fCdUTG_QK{?aZG1j zq;9Y_SsSSBt!b}`2joDv(xwbor>aBM{Z;WQxvIOet#a5e`a3HkaB^$1JW$?S)?Ox- zb(Tip?ABySprp6By*OSZ7j^sEe8YvQ!cbv58}p;V{>Lv)9pYkK1K?w?w{wtEeP;#dc8;E*&U-{&^U@ezzN2;;q+IJAFi#mVNJKgbuCLgzfG6JyW*~r!zI> z1MN8m{xy3hZ>F%Be~I_W^gL~Z#rLsSlC3=-7{QWk70R&}8d=&NHB*mrEN1LoKJ}LM zmwA(_VPzf^i~|%50hA*Ia4%Q@*5BOIts|h}42u$%5 zB|7i#zOVg0`M%zJ;`apZ>Ax#^SLiPBQum$hcZSH|9jQB#w});Yysi6U`$hTUU@Dc0 zq~wm?TjRGzZV7#K@FS^@wBIb>+XrI!VhEnDS7p&!4s(y{qVb(IuETP8ZbsW64-37CAJ0 zu=8O1f&Tr;{h|HwJ%K$bSUyi}_eMLmcsF&d_pa?&?QQE=>0REj#Ji|tzPF_p^dghk z!Mr+OvN_Z&Pw#E&g^Aa}si~=vsl$zTcxEjp%9C!_)=158Ag-uYUjIN@SBX~CTByiF z?jBc%BPs>0gO(KNKjuGwfCB>V{Y&i&(7w-lfNS5OWnUG!j<)YB`c4>Qoe5<4p-4|c zda$D7T0#1xAMx=@#7|WrJ~0;Y>2ZiJjYs^#1jLsoB7U&}@q0nUH$#YTH6s3PDxhsr z`7|UIVMPBN#8q<Ns{n12ookS| z)*|Ld5i8meS8PXIxdU<4Zp07mK|Hq?@dmS+5Ts`;h`+KTzF|ZBwFH=u{%l9`7YE{B zorrIi0NUysN|6Ms5oalgR|gRH*C1X~i+ErH;zJV=9}Xct(TMoNsfa(ChWO(!;!kD* z+NPAwLQ*yxv3!o2fLp~I}uBFA(rh&Y`O+wq-Hzfeh1<`PQ-g%tw}I`G#|-hZp2S|5Fal`{80s< zE$Hzh@m3rl$BK~6$;ya5G-(3!93l*$DQn(V)w+gXn6Jl^P;=C=0^S2@{ z*oL?;inzKR@v7~JYjz;6&4X~I#BMX*PFoPqSP`$aAztS|ywizz$%S~A5Aoq5#FvW^ zzgU9!rBcK%S0WBqA^xEn@sHyW|1loW)>ttCiGLzuKe-(7`4xyStwj97D#Vvt5x>=j`0AC2-(HRQoo$G}h$8-` z9q|v_5&xLjfw#ZyMEv_M#J7bm_&#r{S%jNZZ9-J?5Cdk!8av`j2jVIxVrwDdW>oAd zoj{GQ(n(b1DxE?duF`2##40_E3RtB_>JYy%2J!W=h(Al9T2$%hs1H^8#RSCvLItL_ zX%19fDpjM(Qb|EwrBVQulu9+Iom8qtO{CIvR6!~=qwY~@25JeFBB&lz+KYNYrG2On zRJs~9flB*Po2T^162vboMSK|*cS>JOpvq3^OQ?`jdL1=!NDaC#=gx7k{u`=rs~6jdEUX17qa>z6GHe8oC3)vH>W_d$-@*# zQoozLoc_orxhU&h(-cliWK#pDC9)~VX^CtKahe>PX6l+8={UWqom1u5bW<(o_jyj0 zW7CE4oJr>dj=V6DBcJC~G&a4+sc3BK;q)*z{Rs6i8uLU=KjsuMHvNQC#Mm^zDNAg6 zgHx6`-ODLUoGx?95~mk%$`Yp+q83EGh^8-|$B~`$Ipu`YcX3(}r|;&pAWq-2gmZLm zDMxPLbRACrFsGbwdIzVRaQbCVIpOqYc;$rCKgTI2oc=7QXmI*pI7Nfa1)QS6=0Z-< zV6)FqGzj&ixroyy*xa}y8`I{goHoJcX@>egEdS;?oc_P&ox%WgW;I&rns;&f|C)Dm z`v02u*f?wVaH{;8pW#&bHGhs%<=6Zyr^>JSIjXQPp$GIDr?Id3dz`|)=I?U~`nygsMC{|~2l_gN&R{xv zf5&}2|J@rAnsav|eBefe{;lz?;?~YBku8Iplce*V8AatIr*1|ZAd+ZXHM}wfpBVSA zXkQ`1F}DAMy*GicqbmRZXSvJFBzMhSa`$_4)4jAw)4iqKbfuIfVc)d5Km`Qaq?ER7 zy*Fj2P!bSEL?l7L1(gJsswgC&xZ&4C6mf$@#pSC)1$7JbrBVu{rwSxVTB&)W5NH z`&>x=8f_5JHw*Nw03TKm@eo#vxQS9j4j$%CufS52(!UD>>HbVb*Sz>2}; zOv@8kmZKqdaj8hF<+d&vCpC}m-w}_La!tbviwnht{j_e@D1D^-R?403*}2)nvx>9C zS^YCxXO7S4o{^(Zmy3;JV}HImKibgM5NH_8wdW?Xz1imMXr?O@$PA|2)8nb`R4z4~ zEFM|Mj-^*~Qo-a%((-^vFXfsH zH~}}H0=0k-2m&Ft=f6$R>VX81DuG!b4+!+)u1SCcZ~+RS0Up2))B$0jrcCevexMEr z6DlQ*;!q4o04X2?G!ROf*hjk#zy;Kf5xhVE2mukG9*6@;APr=JJRs7Gzvcj3fCuma zK_Co7ff$egQb49etQ0keV?q-_23&vwILib#paCAh2LymRAPhu-7?1=qKm#E35aK`* z$N&w5k|y-gt^_y$7oY$d-~s$V9idXvFb)NV2vHybq<}1t2gEUg3^)NdpaM037YK}% zh#~AofS_=YL?8;pfh3RyvOohMk`_ag0T-YGwSX7UI+*IhXsCXYv=9&hVn7l|1Enn3 z05k$pncx82fChK~AK>UCxBwNX1-yVC2m&D>0@MQuAPwYzJdhRcK!YJTvL&YMFpBEJ zF%_rz($p5%JasRb~M}K+t z%9Q?@;Tc;>p4y(0;86w$As{;hag5+0!+H-b6(V@V0>J|W%Y-x#?;%KigoXivXNaI3 zCd7eAfzB+J0hA_zg1E*A3K`YYCr*SKG92`HOJD#90Z||YWPv;&k`~kB01`v=eN

m&g!9z*5t2Y?03s0RxShP80NzeQu=DnJQtScRbpyf>!2#r` zd3%HcAw|G#B;6tZekg~dfe}I&@CtWOMu6JJZ@3lHLspZoep{=j?>r-yp+XB(Gyn1$ zL>2u568M0Y1y)UVLbnReSEDx3j_l?q=TK_c@SNC7tes%9v ztyfLZoLXRSanIoH;_d+Z97nu-qO*5<>-N^mdM_D%_XJIz1upF0)_Z~8bCi_SpT5@9 z7#7bQJfnC<;EZ8fjV*Wj=xKq|T2GzO@7Onc#;gF%f{DimwhYqTSB_R+8{OEoVQ^h> zU0`h!S#@?E)3ava=#kZj^}&Pl=IBqZiIl16ty?#((6=9>xWp{kZ*DwB?9qpP%F(59 z8YXP~eaq<6G>A|?Ya2wA_X#JBbKju#1^y8P>H2T=YV32U1Re5)I|%iFdyJp~4*I?L z+yrXqG$mjqNYSrn(xEIJDor{Tqo3BKL&>R!BJ{JH6e~9MP#yg)C&h|PK2#C~g?_G+ zqSZ`2?tGkOqg`a*wjOH^t_l9D>C(v zmp@SK*#~e)KjyoIkCc2eJx_gMfj+v-(6>lr%}EFq=ynEhcV*nzMj&Rti*eQx!uH$4 z4+ZV_f*k z%_Se!nIiL8y38a{gKJfAt!WzY`VzQSzx`Ts>{@H>*UAs6_G{&bT=r|_hcbP()|2Dk zk|wR|r_1NjV)kq0hr;%2<%d-JwemwQ`?c~zqWzBZL+QRNXlg|i#Y00c6iyIDpPqcN zFu&w$q%PGLLlX#~T4H7TO42z*i2LaaR*hz5d|sNB@udZ-s#KYf0n%tH9#o$nXh0nX zP;-*KnikRdMDkx`s{no|Xk34eJtg?D8vE56DMt?Ki ziv3RULvq_4htBGutIZJkb;C`AZ({oARX8q3NBlS`7wvk)=Zt1+a zaFhSWvFit}EAMaX&Xy1BTQ5tW;3@7L>?(J*?Z|FFeCd$hnqF{;q2`{Zj)hGN zgri30_35vzQMMF|>86yB9EtbEI_nEje`G8)P*)DN1+spc$MW>lcGNU!f;!^vb9Fik z4u6#!FG09yjsqZEV(zQg;cDPEB2d-K8On)K`;_RjmZCnDxfsmeX(R8K@_JGiOY zzuXg%Bl|_`dfT^_DEd<$pyI7sv(%@5vSn#F zLQPF5BU*v}W$7ROxL-Mx-=V*j^(QT`zp4g9u)ZYZ;3g7wKvXVv_#8C>}&rfNobN^s}9 zZL2FTxn**=C|6AzPYD*QCX%NHS4}NX4knL~ZS>A=OrR}!VoJETYW{gjaA(zw^yFYs zuFO%>6!p|#bJ7|Uh)cbb!^w+03dd`Esc%ZKRyDIdCAhX~u6s&wr)~DTv~+WjH$tfaR$5p%Y&1{1xJ;=#*|>K%7SA`aBY=M$CTjCij_x6SiZ;%H@|HW z994!NlY_-*l_|)S;IL^NLQQx1nyJB6)*@#8S3b9KR2h&=PA+)GF;Xn@R=WIMQ-V9I zj7%m6i_t2x6AEVaZ=GC>R#~D{oa&o!_eVPOt6KUNn=N z-}ecQDjSz6!JU3v>K{xF7L!$WFjlZx|6;t#G{y=ycEosfg6Ud z8|fY^9lln$#(!0IZ`1C=uC|>Wot@jum-f87@1lWs4P7vD-dM-scM4?fojt4RjKXPc zr*yP;o>V@eXG`DaflWiCEgNe+e2lQhzdF0JX?bC3+v1KzolWHhJ@fnK4$K~!Inp@R za5yXIFTb`vmw#?n&+4zyc=EH(5X#Q~vRj2)o6ctYA^#P6;6P)&?%AXGF7oEw>pfh_ z9jE0V<|UaHG)HRMMsMDev;ymd1H!DCmMCNo2=lTmuG)7%nCYbzGK_389k&VjxJUNH ztwX`4+pSa91`yV0h2@VJ#mLZM*yi%p;V)hm@ z$kjwal^d>+Xe9E{48gp))~ORTS75I}m;Y8_UcM4cO>j=$gOc+Lk2hg%z`dRpXL*1= z66*BonFEb+t9|iE4&D}K<94#5^TPptJ7>3>chZPWQxj2Sw#a*px0B8!dt~Ex!0SDR zLZAp-^ikuV&2BoE#qw>e1!b!9pfj_d1CLa1H2EV$LN)P7exvPAjl>!Rk0coleM%&L zsXS7~Xz@pgghs(5`Hbd0>Eg}WNgmR#Ql6C#E#AB~;V3=Y{E_hw_kOtb!xJCs|4{pf za*vEY-2G7VL&FbtJ(%ks?JGVIcwqefz3=b7ulc_5dwcKg*W2~>yT!Zv@9gev?k)BN zdIEP0A8fsCg1)NhzNPsV@#evsx^Ki6HSO0IuM3cG%C7yn{iEHj<%xaetNnZXb~SYk zUDo#Q_KS-bwZCiVyi(KFzH@rd?mw%arn<#50;d;G>pFG#l);n5lg0J`IgV^TvGs)J zK(6^j{6@lfsWz9=-OPUvV zw{$P+ZSHRBUf8vucvNwI*SsQqpDE61pWRQUdtLc#b|hJjHEoKF1$%sj+QZ7Qd)O6l z<(#6Uom8RUty}TNb2Q!Xk@ft^3-x707-mmh6@0@jGC>%BV<3FVeR|i*C5_?+J*U<# zbuL-ZvS@++3LB!qbTS2{&oVT-nz&tikbStOE12B*HPORoNw(^Qr8%%PyGCa z?bR1DIrT+m>WeC=YmL;IudO(ZQunu5CFd8oNPp_!+LYI0L_7IUPo8&|?JQos88QD)2I zRk`R~^KKrgQG|`upFQ!z&sJ)}XyB7GI8wWa7#Zwyob>g|y)ZK1muWPOs1fs5-}vh{ zsi14N&NB;YMq^FGTrKs5B?ntBt%`=?EH;`3ZFz05ol0%QjFTwWH7vW7HI0eakK%WB zjgfr%rV%$XcwcVeN@PIK0|84HI`1B?P3Z2GOO~LCp%_*^M{FSpBcGwIGuH5epo!U@ z9E*)ck~AWAzH-q*x?bD!1=T_)LL-Ul9e1pqj}Ii<*DAKX??+Z^WQWO1qXjqZz z>ECTbw5B2boAq?y*>BRbu>A!7EM!x!w0;u*Gm42xqowQI|KdeAB=xOky2R`C;`f&< zPz@0&2v=>$LG2D%t7`D^IZBR<7+kfAD`mtZJ#p174J#~;!rZ9Rg`h+0{zR< zKm1Lan#zrS767@#d;jf5sOU6UaxuEUIA5u zRjrIES!&H@8+5QXUYNXc(!b4Kq4qy-Qj6Owc>W!;S^si-1uuV!>su}?(8_kMrLM}F z%?f?uK&_xmu>NQg*S=;mUsuUkv$+Nf)7Ciu&RWgvaUPgU77Mg0y3@W$9-X9Y{G$#1 zi2Wx|TEkfkVBPAtxq$Nmg(YA=_W~the^>&Q{%0Y0Dp(JIBQ2CC`TqImeVOt!|M>I% zZA%7JxInhL#M$((qq0)o|8YwOl$-u4>ob+siVL@nkYexUGi-`Iin6}2hed@8!VP7% zE9`}gRtP*6S^|6pn!*+BB$$d?;fj;(L8sV-Q|$sA7g{;M0ih+p zhoL3F_nRfaqoF0hv7sfLV|VX&1$-M?L2z+s3Gjeu32=mH32;GZ3cHJT;XJ!=zFoMW zB9w&PaFA%_0Pl#F04Ir-0AGog0GElD0MCh*0H=wT0B2{GP~}JweijkJMqaz&Z_$be zzhI`Yr^_zvv^21o=ezD5wqTSbG zXm6E|MebTrAFEjqIW*E+_k4|`u&i^bew9zWan3d0I^$EL^h^DE(e_KtZWk7I71_@- z-n1L0_cOfuBaPm9bxQVD!9_Ypu7*#Mxdh-5KU72JtOXkV~H${VD7P9HX*p|>q{*xakp8kpF5f29B$zVQJKtD6C)mU6 zuIGD8`;sY`fGjD{)hy}8RR?Ls)gbA@)dt~K{fU|0cb0rU`eM%KZzFg+37$Se0Emwe z(ty~pkF4*3U?(90)Qk~)K=Lpl3usxkyg4D-L`VQCeRb!{(e#ARE6^R1=>GZYaMu#J zYxz|JI5FE}53!TI0|&Iey`KKO$3!55qle&2j>`{sk&H~OZ4+5{ZC(Nz)b&e@Em z*BoVbj}50}tm#$zUgK-hR6AQ^(W-r`u|w6q)Yu`pk2QLG{?)$HSgdN-XzY;b^^Bh% z9?pF5aOQ)DGauZS`N%gJeH=m8MUMr;KN(9|?P81_s(2Hl-$jlcs`eYk4pqAdV}~UF zJFN1XDP`W^?We5v@x@YByYpg)svUQ+L;A1hdQZd*!GvS&ErFYdZ|b_K|Hk$kTW^@S zK6m}${X^Y7<&IL*KH=JttNX6%yt1%&Vo(2`_B|qf-Zp;40Ih1!wlmvxc*oH8p36Ee zZPJS$cc=8ilWLEncv9dbea*pntM&4eYtx?QLhCUTYx>DIqqt^J?>{kcf}VX~@!A|; z7aVJX=Nbd~vD`qmoM}sEQ->2n@t#;meUskxt!T6~8XOB8_6vT$FY6ukbbFfV8~I*x zdN`n!)iy;`2Hiz>mn-M$a^{>}j+~=ap0HL17le7wAN{NE(4&3k_7ERwfqmx)`*Zxe zdEdYe+(Z6>Mvw$G0;GT(P*O&SwSXU}10p~i$N>(a6DwE}Y5*S)1R4OLKyUzVAPU5R zG>``*TH{`I0a;qvUTpxR>|RQdEfH1hdH^j;OG|kGKTromfFzIs8h{yqjOUpfP=Ol2 z1NeXd5C&pE3djK>{oYk45F*gJSlF!x;y@Be0}X&Q!aPXw3Ura6YJe9A0xo(ss5O8W z@B?)~1gHn%KoUp;S)c(BgahO-N)~82D;J;u&Md(VXn+Us0Rf;62m?_d1|)$D!Mf88 zI3g4XxekI@CO7~WpaQjkw@m9osebGRfe;V@>VX81268|ii1iT?0DLm2IRLI0RJdYL z;fg_pD+U#=7*x1oP~nO}g)0UXt{7CfVz3GtgbxN4J{eT_WKdH8Tr$uSsRX!WP~nn6 zg-Zq%E*Vq>fJ+7yE*Vs~WKiLfL4`{OT9=Ffmke}O1h`~S;gUgxCk7Rs80e}9@Wh~! zCkCp2xMEP@i9v-Y1{Izd)Y>ruJTX`$g+~Sz9vSGy65x@6ZY%*F8R*6m;E_RvM+Oxh z8EBm}0z5L%JtV**g9?ufbo&VK$UwJ`d=RK`$v_R1kOAO`L4_j*6^3b36$DQXmH>|qmH^KVmH-bAmHdnfF}qDybpp)2rCG#AuK`YvkCANVTHhBgeAD_0z61qA@C$&3GgUk3Ggg| zb=mlDyW(PkKD&d52`e5vO;`dvPFMmwPgnvxP*_6NF68ZkIA)6`!v}?x2(BtD0WK>n z0j?`70WK^o0j?}8Az&Ba*}@8ehYL%9rwdakk)pgJ2~oQM7Z_$d0j@AC0WL8t0j@DD zp}{V|RfZJ;ml>7-*BMN}{iolmEeO6eta$LLVF_A?O@M0+Dh{rC#m4_8VEMz}!tUx2R>D+oSEECIepECD`9ECIeqECD`AECIerECD`BECIes zECD`CNGS2Thw~CE2u@5a0nSV;0ZvUU0nSY<0ZvXV0nSb=q2lxemue4z$CHz-comN) z6tCj&goKK}6A~)!PDpTe><}DeZ=`wWvoUX&WS@S{*Jfq2?oRIm>{tZH+ywVE#*0am z#d_vzv(9R)k=nKkHI6c&7V!2EqCjGZAdC?7_9cdF*Sq~%; zU1ZUFzcFjIzb1yGDIAq>^pNwpS$VOyBOe-~)y{g^I%nfgG(R!^`CeM*OdmLRep0{j zfOoNT;?dlrqx!_J=gwJ}`{3w<;)8?mPSH0^Mm*vN2Jaty|JZ&0`wH*tytnVYBf6kB z-P3V*&wGaMI(%nV|K>MmJvygweCL+F<3=_Mo15t4-kyy^8xF6}u5VjcUOUh_R`3@J z$8@ggBexQQ{@97W7JcXwiwokIE-nllBX;PmZ>~CqqytZBE&Asl+oKFx>egT1MUi@YodvZD9-5*a=F0UtMP z_@`&WLXvRAS+Fe1RRGwZR$qPYhLS#wYjMWO$w=@{#(xTtQ+B%?l!J8L-xpm;3s|EtwQ_-(5P zs@?x1Ru7T?yazq|l(+LB|CBfS?|9xDpYnFT^6B|6lXCF<0w1^FuHo-XUAM6G`Gsbc;{3esRcje0Y8ivPvs*%@S}e4QM`RB9}9vX zuOpU}Pv9L?c`OVL;1yIEjDnBXgP+7Ci1Mj8_~``rnIw291%5USel7!kJ_|lU-&l~7 z@CNXUdGN_b@F_u{7Zu|=hC~vSVX{Q0^FJ*^c!q55$w4-zjFd0Cz-QgyR}}E8D)==G z{CW-ejau+I`f7um(_=Q=OgI2y12EQ8tU%+d$QuO5xAEm$_<5gODDFeRD-lUBS8O!0&INqm~pX9-x;&od28CKCy zUcuY6@^c6H3n%zXyizN_a)bY^fTdsKy;}K=2L84Nd=)R(%4;6*Fy5_|2_N`7Klpo0 zK`DO-f`6<7{}clM90p&Hfd3N(|AGaxmA}Hzlk&GX_`mQZq`ZOUvXwVe#0_O`o3~s@ z0rAimMTH3k9Mgf~o{+GDvfo#9Allae-bp=)>CDieCi- z8W^kr>uSMJ$%9SU3r2ik)DPANz*rEB*MSKv%dI5CU@8KpqhO|5*%%Jx;$Q<7 z=vMMcun|uClo@d5rOeELv$EjqQVyFr4dC27I8W#x&KJR>ByfQYE_8rRPO#YpE^>n{ z3b0y!6W}H&Oq63&;AZGcl;bksmMnOD4m_a&JTVWR1YL>JCYFiqQVE-r zW$+XSc&ZaT%>|zB2G3ByGga^`C{2{JYru1A!E-&}JG|gKec)C<(YzrY0URm@!Sm|C z^F!bTVQ^c7o&Q}?2p86a7sbGf7(%GFn*&DCxQ*C^n%D!5MrOEpCELdvx`)a?QHd%^2`;Prm+ zh5&eD5WJ}lycxP3<(4pbYXm$H1#hbdZ;ycojXBxaK1HLB<-kk&Q zX#n*+_+DXzcrT`!mG?>DeKPod2Y9~|{D2F5z)du-qYq2VEB)~6raY*P;QBuZ*I~*- zSXo|q*aJS|1wVx4<&_Wn!H>YFrSeg@zEd8p13wl5KMvQH$|oY=V^MIR9vp=CK;`i` z_(`lkuY4*Aej3ZqE1yY&hcY9iT2nroh48r?`1uC#i9Gm)M(~TGa0hiF68Mx%G%sYx zfkVSs!CrY9KIxQa+~Aks^-TFPmakWy)xfXRfM3NL_R7~h;Md`QQ~3sY?W6NQhxP20 zZwA2sf*(%hTkvzJj9_VdWi$+a8*UDj=cC|vu*$vi-5B@+7P(ixmjGW(g5OVpKS+Z= z%z!_FCQkWr4t%Krd^u0#*Fm2$k2T`hI8=1XPbBcCm?Bnw20fkfiWB@f)O5-(+~6-2 z@K?~)DgUj3zpep)1BIRPTMzgu)OE^hKJYNKb;?8l{2i2a%J1vIKR{PUYte)u{0X`` z<t=mG1zV2D0MqdvqB zM(86w>O){$qSV)cu@D#!gNX>3jDo3pu#}Erlc7&FtqaM*97f3{!G;u=#{|972nD1v zBMZ)i{!y9L0M5>XbHoC1t_04L!THccDn~iN1yDpP3*BH7^pHxk3YHc@52>`&fQzAq zRF-(arO-ku%P?oIEQbLIN#DuIU>b-@Lr zO1NOu3>S=MRE*Q1P1)~zVVALfSj4I`VQL|hyDwqrB@M`9Q zQQJ%?tuShx2fcG-P#A0)=y6GI;_eq8)`|HoQCHvVWg>3fGiTKuT^(f*IL(s!KQ zAI^Pv_(R1Hi682Jr1g>Uhr1unJv{tS@geb{{tvc(aQwmU2M7Aw$xCE!UvuB+16`yR z9{fQ22PW?Cy}$YXQCd$e@czO3+V7iqU+?=$&F>q%x9i>jEv(l5-U+=|Z`Mce>AELy zPk|O!>wZt}J;SuXns`_Lovn9{_jdQ@dWU<8Jz`J)9j$kaAM8GuJ2-rM@pkd{{@Yq_ z8$Zx}AV*8C6>k-9?Z0K@=B}Fq^pR-$O%pfv(ubm>H+0<)xMA@6_Uk9E>%Fe|x>5RI zG_Zg0Y-^d)(Nb3_Kn|7L_f1^edu{Wz9oLB0^k3ad>#=oTmAh(~)?^c}?BCnEcYIIx zp4^^ca<44z?x&^M#&>n^%IzAa<=Mo``**hP9PjGx%5@EQ9@Ycf_ z9S{Lvye21s43GmF0kMN115UsVz#@$5m*4|}KnREcFoBb60Ur}3)&p@M3Ba&S z&H;^p+(&Q{sEBUt*8pAsZi{7j#Faw;JT_A$6X0%J&I9fNf(FzA@Rck3fiO^l4{oYZ zLIx1W2oAsvz-o``lHdn|Kp2PuF(3h?0A>nTjx=Cj$lgu`2b_Qc)B;{00Mr4c2v`rq zfh3RyvOpe?ng~w74QPO)10n#Q%re~l${rvHz-71$C*g7u5IYGDfO%^!N8k!r)_@Xx zRm*T5F2h~890M{y10a+M4!{MdKn>sp{6G*00TBR}esTgx134fMh&=?DHp&Sg4P<-B zvO&&cSL`FmfRn)PH0{GkP_6}hKoAH45g-nvfDDiW@&LST(+`ON=jL?J2~i*pz!x?B zdLn}r{>j)NBaQb5XM) z)C15B$#pKocXXG0t4X=no#4Q-&8p$*h9w1Mu0 zHq5VpdS?%q4yvO$`0B<&p{igIA{~&n>61v@C{TH z6z1R?C?H6J)`2!qHP8l%1=>KFK%08Lf%1SPXbk8BjR>>_w1J|4HhI1g%S@8_2HF4$ zg9?B)c<-kTUioRm-}WPTxh4tk)wIF8G;Q!2O&h#4(+2O$w85(~ZSa;%9|%P7hD;(} zj%gF;8@vURgjZkM;H{T7c;TfD-fwBcUuq-FK{?$Keh_c36vjNXmm_#9C5bt*FGukH zNs=gFL`i-Yuqn|*78CK(NJsI$NE>=F#0IZ{w86U{ZScZJ8@$ueCdW5;cOwZeY_!3< z8g1}`MjO1F(FQMMw86U=ZSWdK8@z$hri7O-+Ty*7Hh9^h4c@S5ljR${N|A*3C)zMm zVG83C-aP0aUOH%lHx1h0C4)A2zn~4?ENFw53fka(f;M=GpiTI6zQv0IiFik#4PFdr zgVzAsVC+vD4Et$=5kGA(*ryFf^|WCQ|LM}WL<93ft&xoZhnUsJUv-B|J-23W9k``H zL$Z#W58qV2$$wMdjZHTW-OzT!*!7*)3)lBtm%VOae_{VfcSrZ(a=Gj;_m!GTL;KqH zja^HY>(};Nlf7o(>cZ6{S9M%<_{#E?{ww?THtikS)3#@9cjse8o9jV z^20mJJN-NRy2$%SXItmkj?Nvzp-cXE{oPV&ar^O2Kc$h@D`(h7TAjxWkBeN<&KCDB zvq6_2pwA&QQ3CoL6@8A1K1W5LqoU7I(dVe>bI44TfF4Ihk3+VhumuEa0CYR5m)Q`a z-y!2r0=gX)-HwWGhm1oBX#m}hif)HK0wAECEs07AM1UO7 z0FbLB7-y2AUzLeuqDgQADu9lQOf(7TxKwmpDmpGT38aAxkOgu;1CR$A0rYJu`Zg7P zn~I)IMbD<9V^h(wsp#0$SP4u3NgxHJ0rYk%dOKAp6J!8g9+|-s(B+Z6D8UP$%OfjT z0=hi1f+e8KBYRN-x;(OiCFB8gd8z|&_S{Z3q%Q2b0R>P2au-Dv0C<5YP!FK1RMAzc z=qlALfSytn`v~YMRrHjq8$ds)qMuZK0QyN4{iKS1QjGznIEda-MQ=$qxdil(f(po>+}#i||vU95^OmVPCKdLRK{ zo=8mrX+nv9E3}&hazG;>2nVTzKrP?_`~W&>6`iyi0nkUQ=%ZEi(JK0A6@9ddK3YW| zt)hok(Lbx`omKSBDtcxWlO$@W1fp+N(KC}FGXcG_iauFIkE~LEO!pH|0S&-hg^H;P z)dP3|AAsIkMPIF=rzVSf0(xl`eYA=mT1Ed%KRAM`gL-=U+0m{7ps!YWPi;JK&|lMU zkbo{*MTf1TyH?RztLUm#^wabkB%qI0(L>X(g@E2!Mc=HVXQm$t0ll&ceLMY72;nk~ zbm-?ofUaGw2cT(JlK^z<)UXK>fWDksHv#>)%6oD1$%rH9$yM~@Dtd7hUAT%4Tt)Xy zjhuk4TSdpMqT5#G5{Rx_MaQk8+orFZ2_36&uOT&1X}N!jzHU~LfNT8ze!Je0yLB=^ph&olPXk^D*Au==8M4le&cHS2*42d zIKUA2Xh7f-eF7g87(sk!U1|x)z9t?qxAq)X(Me9>w zfsZSUAU?V<1U|+v1U}L*1U}v{1U~981U~jK1e@xRoQt&CN-7;{_xyV0h=Zn!D18*d7%0hj`72&TXqgeg$Npr?Q-u@+(qtfiO&YcZxE<5rsj zROOby8j=|@wLzI7tYMi#iM23OVlB-SSc@|S*78h&wLnu~EzuNMi!=q+GEITCP*ae` z)(eUx6Ayjh)J@ljCI5Se^)5Z250k1dchBhEU3cg19%bsj(Yw0t3fwh(XYtO!ox{Dw z-T+hh1$u_>DBcmcWAI@6LGfV!?X91|b@uucV@Ga`G5W15WxB zGa3e>^l4?Zp1wVeI_TTeXpFu%jjHsqY1Bg>n?_Rtxjsym3BDmfI6!IXnxYB1k|+kM zQ4G4G7zISbWqSYO3$?{*UBX5B|Gto^A;roa`r#Kc_4=CcWiq6WqLmWk^qsG#mh$pA z3IvHV^h8O?=BcM#J!&68%hFIt$~}#sT^v zRUN?m$A+#N+h@c2JHD4WO+WO)%GOg;>1?-p8ISdvZ^gZ4ItHTGgqV#c7Gj6stZgMuy=qf^B& zn2%wc8pGf+h9Ogo#yNWL_gBVc>bv<4^|gG59>~}^0nTnaoPqKU%{Sz(AHA-9f4Mxc zZ|oYs{&H%;D&Ius_>SHkf$d|L3|w5kuuWh1Qf8BW_=}pBE1uDH`rv8fr}mPs#;#ME zPabdYZ)iS#(Fbu0)^Y+Crt zFUWH7`SF7mH-JXSC2%~v`@^6RwI?@6SW6zD0T;87t6O?<;h zf+v1 zthd8~rM8qrs<*?f_jUT5Qp~I?+M&8il*lpO5G9~LKTl43$X8H!brG4Vb0J$U=a?*uY)-4H2MP$gr1tUNSo05%Xty?CGPh*U#yrGyoo zgf~(0P=$p8R8Juv)suJfbr>~;sqh(?SDu0S;2D@)oq=i58PNC6@KR09fYxya^nNp- z3Y!5H)C_22WI8h~fuf?I{z8LD6}tKCVJYZi;DcaBEYJ10cdJ10feJ4d1Fo#Q7DGIJsf1=?!> zB4zCL5hSYeIUcI=Ir;}8-j4HfbdbJM?4|#znxce~)Ka{Rhth`JE%@9KZIlIs=@{Ks zf=K!0YbcZOdKQB&f&H;)2@0I8zY+01xH>R&s}Rl?=-ntdMv!R;8qRglI}enhVW{N7 zPzka6yO&z-K3bN5os){8_eH%ckB^fl3B|qMaCnj?DIn9&F5m`yLuC3#S70uW9?F)5 zx**+hnY&b~r(Ly%ZoC=*^zL`1uhNf6d3~XLnY_*Ts0w{jmKLh5p^EeA=cc?zm0*YA z%&|<-Jo5BQy_KrT_^tAaNMsKPjj&c|gpolbrtBMY)C3zbi_nYW8=+ur zgkrN1IzGD8IAx16A2It9?f{!W`#TX?JW_i6y$lhLDS!Tf{9HYI^=&KWY(I3tMe9#? z>h!q$X`-#vzE9kjyLR-N!K;c_1;~h|b??v>h0BLJ3wrS=S5)o2sP)2$clE!kT_3z` z#;VN3IsNCfpCg{rezthFc-G*V#WMqEHlHzmdf@c-Q+rPl^xl`W@Uh~FgC`VEz_R3n zTZ&t{k83_Iw|Vr~?qi#e9pBWusddxfhT?|tb-n9a*G;S)Y%R9-9>ZO~G#@>_x_5Q! z>WNkTtJ+tItMtB4c#}2VEzK>h%>xUv^Lunp$s0Q>&^Vm$%IEUqx!zoBZX(;CZO@9? z!AvpJmCmKRQn^%DGM5}pbSH-6UGZGJE0&9m)_2zrN4uiAXjdc`84Y)bo5SNFS~)W` zQP*GB8|d&gc?A8b2RyM-zq6frh#8f;rDkcI2B^ztbf5HV>N=kPjIHaSF5{Zc1L!$~ zNFUw#GTU8#D~yLt;kKAvfDN%3a!1lGq-{d!PS_Ni@$Q6Cu_@f0w+TATip`LFVO?wq zFf2BO`(a;f39u|Sg+9$DJP6Zb7DD>BX`drpA^4i(^ZG$+0Os3d>_l zfB~{4zyjG69)lsWCBPEd`rP4hSR|W4kHaL{6h18p^t&*s`$^d@IBmkP+a^4t+JrCH z*o3dt+652Hjm^Bj;8pmF&hHHsNP3oA7hDU4TKdS%hD~BH0vvU26$s?)+=7B?-%4g>AAK?{Ls2 z{0`R1X2>64ooot!f_btjydJX)37ha&SSy>+{+i|j)Bi4i!)CU;{Eb{C-U=~q6XZs_ z0Lx_~yA>|UF2Fe1459A8Ccr$|45@>avZ)1MQ3o4jD+s2`rVxe&vn9Y_*%E>_AqwMW zGb9QdXG?&ovn4Rse!M-e$RCM@;agyjLd0BdJ6yHz2(5U~ks?8eV)Vz!W0*gYcy-2WBp zVE=4pw=QiHHZnD!Q6(E2Y$3ML3m^OuTVK{9Gc9ZF?c9ZF?;kKGeyz`)wd!M4aUY7n+ zI-ni6VY_r z08)U|Nss|2;09Cz6|n~UwSWik0{%{%KY-mJ5CXzL6sQN{Ko-aWd7u#x%LEB<0&YM7 zG@usn06ri9)B#~23dDd?9840Zj4AAAfGp4e2t5P|fWBRZmna$Dq2v?*&ros>XaIyh zf&@4K7oY$dPy=`XFW?7C0k94T15p4JAL=FmMzZe3-Kop1paRL=FiTyM{ z!vbOhAo>aTa8-5yF2D`oJ5?Efl(0RS^qvZD{@cl8n6fC}K-LmA&3($9q82ZBHdz)OLQmjM|s z0Wt>v^eZ7?urKp5zQ#xQ8Xwndd_=GDvAo7d@fsh$Yvf>(T?!wxYkat_@o~DwN9Y#z*2BAA@Ur^sVu6x5h`@8XszFe2}g2;kCvG)*2sDYwnVOeo5owXpN7c zH9mIMXw-}_K3vxLKw0BMWQ`AwH9joX_<&gBLt%{%f;B$;)%dtq<0D>;k99RZ%GDfM z<|kU?LtBjxYBfHb)%ZYG<3m`Dk6krBYSs97RpTR7jgL_^K04L-xK!gKQjL#AH9iW} z`0!KX15b^HoOmtJ_-Iq(<4lc@Ff~3#)A;C2kj95W8Xo{@Z0JM3Wj0FD_-IGt;~b5RaAub^KDg2Nutwtp8jTNSG(L#Y=p(N~ z9j9+R%OQ8(oICXUFKqP4bDzk4+WXvl7)VV*!gdzvNKww&z?d-U8V zJ@x9lEV1j0p8DX0rpO}+QBe0L|CBUFV%o4% ze%6ej2fBRq>gO!6>&J8J)z4dE?);WfBOb>Zd}X`YDe=wn04v zHcyWH$*v}6jow%Ct=0!#^JMksUduJ=m+tc^r8Ay>diQHIob7$aHk_q%Jl=LYI}?n| zjPbG<;m;{{T#VQh1EOIuZiLvh1Y!iXX=Vmd*r-_oY}L%SJTb~Nlx3bnw80(^Mr>9h z7_(V|$R2n`8veXA1pd@C1cyBue~=m>F8(+*B%7v!RtmN!vZ*b^sAdnb=`h5oO@|>y z`P10Q+NQz~$@l{g9u`s(qc(+x80AlEBauy^Ax7&eiNvT)yCISnH!C|aO7;Y1-eT0I z>JXzgRfiaj8PV{TCq`|G4>3xHFjfxrNxP7;3u(KMu?xHd;nz@~vxo3L#Ry?Ni@82~ zeWN`d?`@2DQnpf_m~0mucEM>EY^oPAW>dY0F_^QN?I))4?u?%(#wKsdhQK>BL#SwF z1Tp5Z=U~&&h%ui%gm-*K1_65r?+bZIDOP6>;{BtMC~Ob0sddCy)E>fnQ6r5_$0Nq# z_GmVRj~L^fETy6QFUH8)u2Ltw<2AD5-LD~J?a_FTY=kt}L#UIkkyBO0vrth(o& zH`*VHVAB$bF&Ofh@!~M#vjiCOS%S@wPmIGd)Cz$ipC!PK&k}43C^1e7C`-#I#$n=T z#e<2TCD?RRVjQ|DE5xRa65}>)lo+=upv1UM0VT$53MesNvT2~ixJ`v6#%*dZF%Bz3 z>#VRcv;^Dd_+s3q!V=^7D&L9*`$J3MU&f&3OM)1;DYwKpn`kQ|h(h>S$`EXtE-{|B zXD1eHc}sRdwhJ~Lm>75R5O)8?I3JN2Cvw{p@j;pqqS`}jx-zVM*V#AgKYai1Xs?K$wFpb=uzuZi)nJsKY(8qxSb(GcqG(PAaL6t@d}JZU82 zqe??a*`wKXa&#x{Az7P{$k~O4ick_0`HCba8tsBjcPA#qw#rRT@Ubf|PeQhb*tB|L z!e)ysCTuD`F~P^V?D->z37d*fOxRR>V!~#?EGBIFJ~3g__lXIczE4cp?3~4fP5CD# zY|1||!7QLxmyL_CsRG4>O%*66Y{t=I!sb0eOh7Hz>D2e#KL1^hyex?|`OQx~eV9hr z_kT02*OY@P{efj0mTFHL<3JiP=Pq(Z>gLiJ7Yd-l=ojYd<3C!vrsXLsA}f<%Ce)ar zR**%GS5qIKziDa9(6k9tEXh%fbIg5x!n5%hZP-f4i`GmhP79#I7!;cIR^P^j`oYNB zK;~&HHZPxx1i7uL*wBipXo@x#fD{nYCxM{MVG@Je=23ie-{#%$fW8=<*edTfQ}I!kH}c ze8#!vzCQeed5g6XDo7S&x z`HmHj7sX6x76p;(SrUuCx?X5Aox1uMNIzh4C}Iv|Qiu&c@S&V^fcRFM{mq_(+k=@<99qL+V}2q}KIpBmUJArVWp&K^!M}S`l8kA8>`PT@o;Tj%P*(Ip}5rD;IYD#9i$CkFoP(-!FjY3p<2PJ-aC%x+hWNa_s0d3-KE(ImMzsGdts! zu*9)yqW5T^TZ(#H_S4sz!dh&K3S5 z70xMqhUjBt&+)r@TkG`0wQIfo`~GOlYgTexkRX`Z@k}`V=ce8GN9P>XJ*JtRL7FXsyTg${$ORu@7O^v z-LXGY&Tip1L=WSI!Zu---oG(lr?+`St`jzG+jZ==;syMPRP~Jeqm>;>CkSTtynH^E zTezCjm+wzjhOB&bSiM3N+|=mY0`@(^-}J4ck%U#SQ;Qd0dW3@g*~$mS5(G0}vtY<8 z%yP6ieZgM0GGqmdd8tUEkR>Vt_JfQU3)}S`$NVsc8|vommv7s-YvaW`_4cQok;VUG z<-kfLm^tzyg;@H;B2yjLh1y|qrxLx*Z)qN zO`2seV-opwvEdkXBy2eLhLsJwn#3A9yC`fSx&-Wd7qi5Pm|6KXWwx@*T}r(W5)Z4NRsZl7qKgI#dwWJ)0lrx9HO_I*Tsa4|;QV_{cY z+s=!(@7lDp*m=?J9T#7at@<@fR#wQLvN2>{0Rfg>bP_8SaHI}GwsO?P9jQp@Y*x4{ zh#mp^0U|G4d2psn&mF%$y4Yc*;iWM1;H9Wz>0*;uDaEF#x8V)vv^geOUX6_Oj!LD% zzFu6GN$P&D>T>P8kROZ4U)!J|q;A8<)$?Q==5evt;b*Se&r$1Od0u3K7ljZ6CG zuU*mw_qn9M(y038m2N3_l}q|8jjA`Sa7!=kbxEDSbV(|0@B4*IT1=zrr)RpQb9TF= z-~7=f-9V%2u+uGlVi(1y(e-!g+|ng9vi|d0w{(yO)-&ke5Dr{=@dtlTL(A}BS@BKzT zd~&T&D_p*9_qLr=n~B@Xi{BtKZ}SErr!>ni!N~V7(nn7V#PqRsUWel%8eQqdpSOlq zDbwbaW9jEH&av%ZF3=BHA73Pe^`6H=4jI|?-nlNMsYZ4*!`r`tntb0cSJc)7=@Bgm zRxcaUx6a7nb#n75r*1u#{>N3YYAU~JPTf-a-s|$`YUbQ6^4sfrhh|RRlAQb8igRn; zG^cOr0KL^l+#bp+BzW}Uy0xvEw^Ew+uh)=2GzyH+I1d96Fw9t_zP9%(jbZ)en*y%9 z`4d0?qTxJ}2OxZ{Ftbl7~HhOA6*kgCU!6&iqG7?~vc z89j_X#$D)5HqDK)=D228@j|1hRpkr6Mb@&Bb%vc_hCX`D%31mwXQo_dZ{2#u_U*;X zwp~Emi+60_+JuWGg>!zY(=B1P^24dwz{hFM&BZH ziIrCsa+J9$G@`u6u%_2S2h5VyPfBcN#!Kd5FKGN_Ey?y%j2F?nPj4gDW5>oChkQ}z zCVhOHE3_i^7MV$OL(rAr-I8Y(V*4@1zjLSKZ;`24LcE!$+535tF~zv6s)W1D5+>dv zGqZ%1%t9=i7~|h5VRBNYlkYBWfR}zS0h0&^-o{!IR&E-E+Uj8f>s`AWK=b69&DI$OY#xNu0DO`*<(OPHOM*|}^ z7UoS%%T{v0F`L`xj9+ zThs^NQ0mxIaV=i1klJ{}HcXpogk=MFxMTv4O zaf&fZ*ZA8LyeTD1j|Mi*v7WArtE#xMk`dFiuBMFab3cBX`?0BzT4q@BQ5t%#8!{gy z1gj^1D4eE)_#0T2c6Fwe3)k;%pqR4-P+<%T8;-0|YMEuFq{#GV=ETn*VyP3=tUf=} zHqD+kmo!U1vzpL0&BqKfyPd+DbF3`*B^*zMNeiIDSSK7`(L0r>jg#I9{Up=n{?hA~ zN;Kw-(7z8J?Uq(Tlbdu)$Ni18wyQ`BOaJ^^Xbk$_E@{DWZt0Vsb4$zV-}7g>q>Dc5 zl4RPx_mE3!xX>+q`URI%INdFM_tP{MJ&ne&jf!+&u}hjw|30$VX^M_)p_QH@)1R3izor079j)f{ii{>J zLtdb5lxaOZkWe7d%g73Z$(PAGvSuqe#ic(pJ6;|?OB|`@^yOJ(Wys5ehgZVT8Dl@d z_O0?v)seMW8K69ZU}nfmRL7FXsyTg$7F!we5_M6gQ2}%_dKmw4CD{@yKNL?8%=~!) zeJry%dC7*EI}~yH4BCu!z@RO(-&;Hm7zYK zTOSY46t1N#6viOqGzzlJ3M(}VL!ZeSGA~X@A6dVC(xd|((ZQ8dlIaUJtgk08hB!G< zpZMzB)LUu4R#~Z8T}H2`G_wRyVGJ_9rS_|3wUwTd(4U!~QD~MrQB7WlW;e&WnWLx8 zCC$>$s3yOvD&5x_D;M5y4^Vj)3ZRS8!+0d!SIaS0Qe1=}m|2-k0hxqZa*LIwaPCx{ z%l^W&8P>C`j$%wRHZWFHUyWuAz56^@{Sh@^t=1{{&)`lfV@v>Dj6UH`y=(291XFyS zG@asWt(6lcrav=he)R#CTeO;$tKT^F>fc;9DMOwu#-ySHFQqyin8`?A#nXO3(0NfU zHCW5~Nm-a#@-o%2WU*>aTc$TQOq*enW!1=-Gxzn5WtkLHf}O~fU{xc+jgvB*e31{* zfujV_!x&)v$8=1aCgp9O%e;Eznr8VW82SE@bxg-jn^%sdpT{`Iwtqw&)1vhu%{0O% z$3De|jqlWsGqNYyoLX%UZm|yXS~+foezj-q8NuVH9)C5ownIC?I?glk{Xuhi=2KdQ zhP%+g&$bMSVN=01#W4aMueRyx1`+elJ5V4OKN`3B|ZCuOL_-sBL74h z$OE5uNsYAqlOHYy(@-&*`|H%@!bTw%rJ+F`* z0BItZ|I8(gUha~%=H1fkG$6d?cQlfu?c<{R5@|~pB_IuC7il9EXd=sk@Zw+Y`OqI} zbokXXDx<@QAM={V+l}zXiPn{}qk?(m{LY5h{KfvKZBW&pCQO1CmG}BJ~uf#ZQ6tx7I{`R4U@Ce zr%gGRrD*YQbIpBjlXk9^kYCfyR47rn zo9Gmf_&Ew^Z9|CFJFMKb=(+ z9wsUR_PxUUxs6(f6_Jk8pPA4s8Y0)TBo?`iT5;Nh36>;ZO>UNPo|W+b)pn*qQWj?% z|8@8CEV|1vBphN48Lo)13j@N!ZUASG*#)x4z%IM9Y)l3rCd!c^C`Jq1QKA?Nb>Kxe zMk$AcfCtBT1tTU-%9JscP#F@yLO*0I6XOxBQ4=l7RGA(~Qk4(+n6B!snVOk*y5H{i z-%mf!zyE!{YKQzk7+&z@1(aWp0^y%LhJ73+;p1Z*3{<|#S$(e(l zGh04i7BpK_G4mx4ggsM-*mpe`e%I&GA6M9e9t@j&KKb_wyWRt0h0l9@Sf+Z^kinNf zZM|g zzRX_@5A`g78pfEyP@>*|AuMGiY9=ma5^O6OWeF@LX<3LLyt#_tWc+GdtOyn?`?<{y z3;wZe{E+k*S_~6|3CkxeP1Tfxh&?7XnuMXxWJl9)_=@qOD_=FdXS^-*fUlA9zQCs) zUpL`O9`QHAWX5o-@A%lBQr ziZjCNlCR@W!d{o3!#>BmHamwt$I+lJvCgh?!GT2W#aB6Y*ywPcwY)*5no8k08(+X0 z7kr$UG?1$0wBKGxa>| z@CUJ0`aR&N7VCJ_@dt@iaj#>u3oqaoj%SHjK60EUTgjW2w{2+{MR<+y@G?Q>tpT#b z`Oq^;D2%{(5iaAYf~yU0n8FuWXlb;eDRf!7ZE^|;%hzo5Qtq@oWSP$6mZLUZ&2h`` zZF(-hbeyv38vbZ`#}?+0cI4BKQ*uVbrNY}n{b9wEvW&=MUrVK(;FvCs*$O}Ws+@VhA>w=uEc~6$+WOuNJ+ev z&BAvi*UA>(Vqr0N2s@;(n7jQZP4UpPQwSu!g!_a+@n_DwB>Y;kZJZKbm1GBR3-3s= zliP&bCApk|S;{I6_psWtx;5Uz)yg+C*Ty%MYc$)#T4kLUdf1?ROX+2!@@PdbFX?S@l+S%l>0Qdj7yY3 zP4{_;Ywp)l2d@Y}&|Du6Dy^DY&RO3@TIgfCGF6LxJfzIfY&U+6*{k6$E?0i2#coCj z^EJ~&z49f^cM(;7q~UJ%Da{)1=Eur@of&TDfYPn$mGmf&XnF;YDvxPy1qYQwT3pEy zC8wc&o=~1VI_rC}qjubfetCN?O>C<$-juujUvHl(e|}ucQ|`r;kLMfAc~Zc4#)-@Bpc^6@&>Qh_O7&hcdyq`+P%B$yTSgdsuj95Ql*tE;=KPMtb(dJ~M(>tp(Ue{t9efYTzf!|9`4g8;<;-y=JmlK+4x2LKfa^!)%1 z0+$(ZK@EYa2!K6Uq~hHGSReu5#n%Ef3pu`C4#2&bdISIW1b^)omlov4AyZ`%Gav++(;A)X zms1UD257+PGA@r4sg%>y4h1PIE>SViKu`ieHHbn`3$UP{0et}I2jT#X0AMnRia`Yc zl^`w#eF3lljRdR)U<0r*pa%eTz#<1P0WcFpbHQx@=7J6}_&WdyxaGhKfF5`ypc#N6 zz|Df80JH*sF8C!r!|y;x9xwo41R4<-3BV{|5`i%Qj0H*n#se?`SQu~@03o2sLqAnc zTgoUIG)y(^7Naad|4>b0N_K@EE>35Xix40G2?59Gt_~ z4c(<+B?PNrs1%HYU@dgl2Olh)CW6dzh>jLb8xBXH$jG@5i^nlw4ue(}Pt(nG7l394 z3}!-&;Ew=&5B&9D7z5@r(R#3i0R~3d0B%Acf*ndAhCl+n4PY_@rZT!d;5Q8TE#p)I z87>F(D?uIv1u&`v#Sq+w5~Jo0EI!HrH)AOT-67}!ZH=G_g0E0Z$uupa>xt%-OdHPF zdZNcmrj04n3<4(@Fq(<>1anz1iO~!JQy6fQL4PZm)}ztZ1iTFJF`6b2f#57-Y69&H zu*1+G(3=5IGx*k>VbIvpX*DB0Wj>x zgS`N}!hjY~!+>WQodkTufPRd3AUaz*Eg`*|1xJC2L657aRh8~!G`+zp7F+|G7I19$`V5NHYwCSX z9k|Nbj=^9z3tX&o2sp?B59=HR?y%rt*3tqH3!Y#@LxG`TXF-s4 zwt^Q}aD(-?f)`ofc#XC60y!dZg$eZmzhXeS$Y2D=Sa6%w8No{oSOYaiP$2?+nUE1w zihxQK?G0)~pjKpP16mR2CepQm-XhRl$aNH-D;6oJ7a z=Sa{Z0)0fLk)WRl=tLbxaF@sdhKnpCL8}Oi6-C>?coCQ&vWy08A}~w@MuVXuFijL6 z2}X&4L8Kf7MvK5iQD_vHECSO-hS6Y*2#gciMuU;~#N_dxDgui{?lEAc2&@u?#(*^< zuvQcw18gE-7iq?V4I;2nWEu-Li@3KLKnHEIvB7wQ_%V?LmlmgIzFWvBWhW=Czr>1k z;1H78WUnLTozXey7dDv={iZ>@F}Tw%+ow3~RH~PL`^N{#8};5U-l(Gfy1|2k0e?YZ zLEa_)Th(i*{9ugc*Lhg|7s+BU$^YX;He?(jF21|GL{G637{r6w2$QN0_brijsqYi2;a1M(G4PaG4&Gejaa?$p6@PPF4 zOWObhO6303SQ3oCH7&#vZdD$>#C8o-%7%Y9vYP@cc{Qmd-fYc9%x1U--CEfyK__=W z1)8$Br2<{t0k2VpL?a!LUz3mK?1Xj5VQDF4s`Al$+u?ZRf`cb;+5Ws8T2VkUxIagZ zy|+by?z$Ii*}4H1qI-70?rGstv}y+|kbZzW8E%|9QE(HlaH)J)d%o5 z$c}d<)r8-Hep&pA8ZQZ78RGF?ML8&+RuZ(e^G^- z;eRCWak5R|XHd5cwBj3XCasVh+ygZz;)a(>mg8naHVfB$=)Ub4m+xa1efhdE50c|A zSkfdPm*hQN+OfX^*Wn*VavMRrytEfqY@knlwYnQhgn%9lj!Q#17!sqfrL6~&el8x0#(XaBQGtu&Q5;l^!$rnLPs_si z7PRGa@u}J*pIjD$E1)?oQ96=>m?;wiMU@g12U!&j@~>OzhW)%mo%UDmD= zv(!aoSJssf`sz#Zc(n8@@j!?#acQf1z7&fUak>vGPARlxOIM5>Gt0SJ?aZtMYk`zs zncQ>0?V)oc&WZH*w&Ggk9ZPw~3f{4bcU;UnW@!mHJtdiAM-@JKve^70a2LW*1++1A zW{Uq6Gv{A13o=YgXT60PZf9o6zha6qwVck0n!Xfk)bzcA@3^!Ax9Oef+k#eqDK1C5 zz7$vIakZU?HK_5Ei5rWgfOlM&Id$-`&inlPqkENm49!`xttz}{^2Z*kt z2h6c@Q_n%);NyK#07g4Gt|@hJ48K)m1s!-VSCW0MitO_kyw5?s<1KxkIcJ()P>u&K zY!rVH7yfPGpK5XWU!BeAS#(TgTL#OJ)(xj3T)O4QboNQwj(&JRg}3|gM$!emUCaaE z?{YHw2EZ4Dv**0emTyn;&tvR7=Kqb){~7%vw@U`Kl-&7aHNLVzsSdDi3zp{$4+C&7 zpqFVA?y3Q>k#~LLf`e>B?#>M!yd<%UTD8!G1uCE1JE8{b!M$`YDKmO%F~7fM85ypE z^*lYY;2`fv1_lS)n_f}Wa(c`ckFZ*-2lh|uiBF^lWzUpHzlJI=Rw2nrS9M=muwhi8N*b{=ioR~d-HZ^7iqM#s*Q#}`!FnP zePQj#MObbqk{OsvC=E6mn2!tc4&QjxP>f+?D*JO97U!nDSe&~rmpiZbt4~ZW!D17W zVkJSXhOJ~!M^Cml+S-l1f#!5)YsAIgQJ?`Ov}}Wj9vR0l_2N?QuucG$QP3jjjM*9)@Oa5{r|U;_p1La0)q_ z`ZjK^xA1l|S*Sz!WK(dvH0-M`Cyg=07Tid(4rZ}d%hiAHb@lZRB?fTyz2wP6UP+Cm zBdCtUJ8YSb1Hq&>-l?>g?;ZE}QN@*?-SzFGD3*XN;sLsOx&g?zf+-Gu{3rNnPVjdP z;-$=h$1h8m{&;(Fm6VxwNy2=xQp&8qC}DE&_T*C%W+2|)x*%aJc>8>rlyRPypy2ng znrT>!e)&D@)^1@;s)?bM*Gq9F+)9oVBuLc()j>QO&Vfi5fseO5v8RZfzOYVTFqmXmGOx3avo7p!6Pawc|=tekEn)VX}WOO6qg}t zSssB+9!r5EbrD)Ik5wn(5%p3Y(U8L<8f849o18~<&*c$4@_0ngd>+xHaPX*J1w3M+ zl1EHZ@rcQVJYq@_kC*kx z!6TLy5WJlEYrj$plRr82-Wjw-G4jh>}u~+a| z>&bv9)iyVf0ZNM4Sj{6gk)ctFvzZK4Qp6UPM{FgdrW9uz8MLGb$94&i+CfHCDb`Lh zen}C#WISTGoJTlvd4!Yn#8Y`(`8;9|8K9*&d&%gB66F5xQ>G|P>?eb_l-vO_4oVUC z74eAs$+#}XIY>rCDdJEmk9a`MBOWZ{5f7D9f_wjf!xcQ%kxCxnuHq3MfX6_o6CK62 zfHZN8;Smp$fo4kV5i%l65y!cb1p}Qp7nGk7y^u!W8E`8LOp; z3&lL*DKg$paW0mo30(h|)M*NU%hb}4EYFp49_K1GtRy+tuyG`<&QHx~NlpL~6H1bJ z8rx0M#52^WmgGE3tuao(-T&vXO(iXNo!Z!vazSdTNfOUvb4yz61!{3ia&E|ZoSV5k z;zeq|N{YQijc`fg7O``szdyIBDJ#heQJY+n2vdt%l6aXK)RM$2)LfS&?oc~Yl6Vyx zgVH5^jT-NgoY&Pn&KqSdJnBtsHA-iCtAazoo<~87f9!dQr zxG%ME4O<1@Bv${g*Rl&nSIL*dzh4C4X!p#<;=$d+n8wLiBYA%a;gOUa1Op2`h6G6R z0fL|AsgJEbCu4`zj6s&QY%z1RJ9;m{))X8|<|V?K-;P2dTWc|^?ihK@`A{(f1Ico9 zz#?>e9c%2>&e@BW>x*4uTC;Utmik++Lm^)D`vzpKYO-%JfD;!CjxfM;(3*oL?1hGpP>)Tm*) z!OdtA`R7C%$iFk_B>A@rg*D7ZxCu3DnaOyPVV{<%!+mu;=2XU);PHFv8IsfyGA~UI zAY^`;G!RmeCZ`dyAV~)QL(BXze?TNJmTM`CmpF@*Dz8G97m}HzQ4yX42cvrDJT(Ac z!!9W~F;3oP^dF1LHN6I@aL)q#6tj}*>Q0~)hSt5o-)MRj7c7auIO}D|c)b0Kq34I< z{`sRxiv^x?r)iQ%GaAemgSlecT)^O|bct>Wz|~^#J?8&O#&uJHJiaI zDcCACZ3Ty<;9aS67x+R7{wB4d#I9;Q0SJJUKh*IJoFvCnz~BnrE&vpMrw@G)I#@K% zIW-4e=sqkD#hZ;H@^tK!=hffi_O;@x#50E6OaRgtnoHA9zKC2NBr|)->jYwoh>PBH7@LL++u7n1{@yh=hmCqKK43xbx4Z5HMtV<8vqidB|LfFg#=) zMOYp(pCTe2vVbCD9$EAb!D<1Cs0%VJMPpE$b=7@`N@}M8rcjQbf!{Hc>>vLpD=H%0sqL1b8#Uj;$1d z9KxM{8-*C2&~}QjJY)w&L_B0CMZ`R07eypIWH&{mJcPaMhoA>T)GK+*w?E?5f3>;5ivnht>pm< zNq9mJQbfu_9-;_zW_tgJDZ=oOBNSnIh?^oJ9^#>hm?Fv6a+E?6p3pIhNO{P^6v^Qs zk5B~So&z}`={Q9g9)c*s@{mUIK|0$IX(3JUJ5Zuh^Y2agykWpIYm6=3`N8|T3xLoQQ9!b7f5M4CqM`L9w4;(i}FAn6)K z7#`xM2+KnP6cO=|rzs-lAblm%h^I^*|!%>X~xTA+d4|yMSK43XyIHKo1z;+>%DfT&9ct0RccF8EWxipaW-gc$ofVqty~jDja<^f+W*RU@r-r6@Cp#xu zCK@Ja#)EOuF`?1kQO=Q;HiJ=P03)Jzg@$=sokJ}xh9R24pgB4)G{D>6ski71{WRvj zpii_{sL9*Y*~8M^&`r|_8lrU}tykl$wbU4@HC3Q8S{^F%s-2~l5<{`32oy$@p#rbM znQzH6C2si@IZ)+>9}O4{}{Zlf%qN_^5-_8 z38r2Hg1h{=I|_2_Fge1rvCh1l+HG@*L)Di=lFXg_f6k$*ye93rRg+(VJv2Cnj32$M z(w;17ua*BUFDnVPY;hi1|1BO@#9Ip+$f&p0{~_ z^CRbDQJQj?!ix{Gz^(H3sK_mQWczCmHDR0gnV`&F@Jj`Jn^=IEQw86(JH^U8RX(feBDx{Sz4e7+%+2CNTF=OP`Y~bY8~BhkLyFj3#68 zQwU6Z0;`_DpeL~9ab`SDcagw=C$QZK%yvnO9UXB1wZK{@Fw`Y&bX0kTz&a-|%n59A z0&|?e5+^Xi5&K)Zv#AxB-uPCx`W&7Kt^x9_VvPdho51cSFu4h=Z307^)WK8Ni`v(c z_h_QPvL-O93G8VCQ<}hvCNQ9JwlnS)P2*Y3@T|YUVkR(_3G8G76Pds|mNbk}<+BAQ zF@ZHqU{0@gRMHwnb#LR_p&Z)Rr2*gpfelGuKH@A#-1`R{7Fdl01|xy3h%*y$x{nGB zL;~B8z$_%N2nmcq*bbB#RzI4w0a4{A1lAvc;YVQe5tw@fmL7qT2c`@xSh-hV*>MQ0 zIwGFj8G$WFV8#(xaMH#btoyvcY$LGP2#hruI}NV?O9C5>z&w+&%wWTez$POw#|SJj z0wavT{vt5FB&{yo{eMnia1q#A1ZEb2g+*Xo5!hAuCY2Wj#uR}ag_uy%-=Et8^NGN6 zA~2c=>?M$A!MGzZln87j0`rK#G9oGDX?T+}h#-5U7oElYtC*X|uXJ@tZvPzjTC{)Q zT0Y%Jrvjhd6|D4%e>bB1$bTHAuHqZJbQS*x&hX#iD*ohn)nAFL_(yZNax6nCQ@7=r z`B>^Hz6!gC4#Ha<-blKHx1VAM0Xd!>FUH5`lAhvUCOyTmZvc2To1gL&FW&?H79yV6 zPh@#!mp@Y;Wf_$TXRgL>uEctTQ@{TR_W7Xb_ZiRZykqZtGf?*Om6^Bu<33@3Bf3L&kbCRiPl1!86KkPXk{~Fd}0|}_jln=ZkD^q5^I3lDdEIk!` z^<~LF^YRihpUfm-))+kaU1C!*ewrCyEIe*^~-^(;^QZ6GVg`eh|# zS4wtjviqTPD){GAr1A+@HD%9al*;&y_T7?S_qG2GRX^nXO)d~E!Q?VPuLWU{CmWfIYwmNss zLY3yhgOTl?!FQp^J%byTV6om<1EZ**YibHLPLh)kG0r5!TkC_*M9x!V=$chX66VX@ z93Oe`0=JwJFOLdpdq}oIG;-5K9cpTlU_S{vT{c*O3)7C(X}o+jvovfi#xd9*83 z1ZX{wB||*DN>dl811M}=z(D55U-3?b(1yA~6@Xq~*6A3olCsbur%=|xU2`Q@V_Cwv zN@3BYqw?|XB6XDS{UJ_8#}9F!1y48dE{SS$P<4g2E?AV48~q_pRs4rIa%}YObRw!v zt;^;(Qdd;(7gkK>T65z+#8DeuKX9Ug&NWxX)tpLLbB=a=q9m)PbJZm|;?7l<9kF=2F^HHK$5GBAFr}TW?7t z>b`#Vr&Y?@~7dSsD7gTAQEv!^c}JHJ?|UeOT6oQ*Zz+7oygn1 zx6E(Bw-Rso-Y~zReLeD;>oxPM@YTQ_*DLy0VlM~6zK}TtLy=pqTl!ntmm)8^Ui92F z-b~!^y3cGE(sL4?2qSnrdMxCz zd$b;aT$e|dcMl)5A2i<&?}zsV4rupB_PO@y_XYM?_o()SU3Qn&6>++pdZ!K6W?|#}}Eb{)Nf~ws{?MbhF(v<1AHiL46|1Q(8_)vF?Zb(P7ZIE_QWME)`b%1I>xWB!>wm;HcYpO$r zQv;`rw%3MhU`?XRTnQ^9F@Efe@bL=CE zWd`MA7gF*8!EcMUHDTS71s@E(5 zD$QALdKerv9q~WpeZX?ie;+sya#@_F z-L~yuTYNLvIAW z&6a`g{+fRNUZL)WI-SN_W2&-L#7j;2HgOc(_uU97p3=)qU%Dxl*8 zgtUvKa?b7e3H%@su|`ypaEHA^+mU$B_n!G(_^#(|gZUb~7PzXtqQ4xw#*k`--Esf0*8DD1NVpT3m=H=kL`=> zjqTCz(YuUJy+glSyGylGwL`mIwavOUumx^0Z#HkzuD9Fm=&p70SK6I9y7CzxU7A6j zsSR1r)PVof&r}(lUGaPTOby^3!b7-i)2B*0N`WgKtt^L2|DQi|-HN!cO&xx~Y9QX> z$DBb|XAY_Szx5o-m&A{H-SLM^4;l`E`%MSD`~F9s!r(t|=dh;olG$^Qufh*t`E=d` zsKf>iJQ&FPeVN9;4#;-WmrHKPI#5svY@ndPU_-qc^K?P)tAj5=RR6}{r%Q3Qaql3p zoA$ss0>L*2zbqp>+zZ*QK%e)_>q$D~9LcS=*Kj=&K9pnPbkIzkRHeTYR1ob1X#nl1 z@O2d%vLGwIP_8q~7n6Cj#PFLW)CtmZ{T+VB94GA}@*&jkt-%fXxt57QdREb&Rvx-gzJ7i}Ez+MDR~x)`V%&WYc`GO9RC6&#G%u-M z4Bu4UwBAtN2)|%|LHmOJdF}HN^v?%|R8O`(t$NxTPzAz%l|OvVel2`ebv1m&ekFX_ zemQ(ebt!yNbus)@;)3x);=Jm7xZU2aZI7IDoeP|`o>iR0#>V4Wer>G7Of?+(6unKz_q|LKRhooH#R3R zTRYo43(gA6jNRj(;k?^~eMsV_&{X#n3+^I-i5=s;N zxCZJ6#s(z%`}&*v!~O}KPiNLy`>Fbc``Y_z`=VbB&zV-1sP)yFYhi7m##$4ohSlaO zSQV(WRwCQ4TYIQIMaCj~p|&uha;YLpm(o*UEJ!GP=-O?$xm_bOsB^zM|6Z%q06zMJ zdn!~Suc_4e3#3*y_biN0rG1OcPKVxe8XHw9SY7W-{?TF zAIOPspv=3on1i@-r{F&S_-)CI6|M9Yn>Jk7eo_>8PP%`{Jb3a&d)yYN#qsjzug zVf>yf(ZQVh6g;`QX+2Rtm{b2ts(xlxo*`VG6kPV&%Dp7d5H63Qh!km7R-P8FNGbTt zUs@mj6zwi*p2fsxADjPb8Tz@?SglG1iU3c2t~p0k4n?7l*#?wXOjIUKgK5RBTrpDc zfa_nqMDnz9#aK`C%uP#k2gA5xq~L-7JpS&d$X`rqW?q))U7Y$9tol~}Yoh)xPW|u_ zQl$A=d4_Z9Q}C3rhWMvwX9-ciAWL)vr#=O*?|23N3acN%sh5{F>zMdLq`#V*teS<% z{OvcsP!T}`CupOB78KDZ1@kRQL3w;q-LKHqQc}fM65}hW$eQHOD*kpLQPjpM8m1-} zv?$3;{Ts=ZG6mN*FB?ztjO6aiX`DwKzZVN1pFXC9-okuBkyLc&%G_U}sJeNUIKCLu zNRtv#5t5{L-}}`{qHQ!+g0*GMy@Ovg;Al!K>efh@1FP|J{Z$fX3f`VxDPc(}uV9WfDe?x3xx2iRH|!P|QxuE0m}+kw15?jkY9K4ewzc7^Yiw>xFtX0yKG_1}w3 z;P#)nysOtQrK{D9-SN`1ls3^`4$-I$Rh zQTXqYQuL&0j2vz2fcYZ-v!emBf7(=pzBILN6I-4gh3i-)t0+bb-Zje6{pQxYSWR>k zvduJ>G7W7=^~kJJcGgIMjQ=Jt!o9`r!GdY6iTrk*TxnVPMAPe^;j)UpC8fYi%aUc? zj?0$XZs4+#W1Nh#6_%FdF-Uhj)tQxbIq%(Rp^{{0TR+-kR--K%d9Cah#&_SjJOW=W z8nLleExTY;&;JihI?<_3t!jCP@#E`j3^#5oT&mo^S->v!XROndQ`NyBj);F8~X>EcTCm{#7}7&ZRngAYiN z3@Il0kHc^#6De|U^f4Ai*Zay#9p9%pQRDimu?8$gwsh*2su0kl4Nq(vvJ0^=&9~t~ zdpq&Br1^1t(FZXgAY+>qEJssI>80} zNLCY?+bFLzrm9IN5M7!Ujbfb0*aUocn(s!zMtN`6oLG z{4*th`Jeve{!aW>MXCVbwQ)<5=M|u}e`IU=JzkLFjKh~kPisga(tPry{GtOF;JNLtSQ+mRL+(l%hgF~T%(9B!XT^S?Dd{9#8Yez)S3wA(oTXamlBKfaJm zG8Ut&aTdQ1ddi!IfVRf*g;>Oiw@gwdyCncO4E6khm?yjmh7z>ksJy1%hP2#g#(pb_2^Bd@y)ID{VVbUE8{ zv?6?6!UycS27PxNcPrlMCvPev9cc0vGT<$f)@ad!V_2lhjYYbC0o_}N4)?<%^W1Vd zYCkG3ZTqAyrQl8*J~Cu0JzJmRlXrxo6F*vyp2Tl%v=g5+C^;_wo2*>&$M%suL>3Zr zo=g6T^nYEj+yFm>rP!E00oM>QbyMr4M!6V#@jd=E2ON^m+y-lVeT*g4oCKad#+F;o zoLlQ%0LYX68;(Un8#5@{1|O6tAOHy|x^E=3^!hW-ycTz6v3fFFi^IjzlhlFT;A@=u zvlQ!;LWcT?@-&Y;nKP(HjZN>;amn(?i2sj=<|@VWSF%&+KiHfr!PBBVd9GHk1bC^K zK@rV&=4wv@C5lz;*EkQ2#Es+v{37KHq3Ml*8^(B&X$InE@74j*YVCN z;^90PDbK-QqHoT@c_l^BEudf&nVY1pJcV@146SR2e=eiV%`OR*?fE+dQgVXLk@xq_nU%H zm2Bh;p3=aRQKY!)`%G?V8;!XG_d?WC>^>yWI;aBai zYF~}qaoy41iM`@^#rTT-Wnb7FhT%ZS8d8PAx9zvJw^g@%FPdM3F9vQ}@iajAhW&>2 z2GV?mgZo&jCWsao0|~#+Z}vlf;F|TC3QqwfF2yc7FKF6BXDmLIFK{aKM8{*%6LB1- zSoyH#sLmZb;yGeGVm$1|3vP5cSh4;-=YH2--yXZm>Qp(y4!c9^i0pRl*6)t(LjIRV zHVo5lwxlByN7lR6>(@tYE?Z=sYn^^wY^`=}WQ}W$XSH#4Y^7(Vab;pfY`JH-ad~2y zXQ_D!GToAC`WP1^=KJQG=fnAddDeNVd4W0BIgwe38LAoKyX|-TOuDI|$)-us2{ydY z)E(S%6&{4`ez~Ud)@vPYH*m}U!ozF%P6yCx*P==j{_%n}AGOw@-6nXs1>c2nc(TYw z?*I#Sf&2oplXFfw8CFF$fJT_%axx>8k;!w@2PXsMa8pkipg0@QgtD_lvw(a+=aMoy z%6R~G(IOA5Axk7b8z^*UNz`Nm749qv#+wDy`Llrhkdsb&W{M_{XNgo~1EmJ~TF7L9 z_{nkqzE2rib2ogcAXS};MtWgr_Yzfk@bM+8Zy02s2X~-ftWasuZl$(ydr@keRB^DiSljTsoH7W;o7d>Zrz47)w1G&v5kohaD!@n7|*Y3?PeRa znb*N}fwk7PzBT4Ga7|z}Ub412yvn{xyUMy!wKBXywF3E{99t~*EjBN)U%?uIsMAFzYbYFl}obd3HAqK%wC|r9H!a{Jp)s+)d7& zHoOGe)XmVSYtYmy>wq?18?EW64psRpy%p|qCvq)>J!LwTMj0t^71+@Gr%}pVM`RRPSr-$5F6{q`!)8V0p>pYt-*5c_KckC(&U;4vQ^7;n zNubUqnm^hu9YyBplYIb%VH55a2q2lW6I2^rkeYNBxfg;0g=H>~ou_Rnk1vg$Ew0ny zhnMO*m3;cuh9#*}q#%X66I2q#0g!|lp%+I55<=q6kgOw13OlaIqFEROY7-8JBUB~} zb%JW+oggWmaL>w^YqDiS1sTYZy2=7uCo$;90cM1ys1J35ik0a*kkVDr8LI6JNh~<} zidLw<+Kn+Ggr=0#sk3iWjTeVt5z3W^Izbh2mcWI<;9f(>P1 z)LAGyC-xD_hOlc;HiSKbf+y8=aR$HaaQh~o|D?ym0~K}S=O#hyJWX3|y=4(qfaOvU zYwH9_J3}%*4u{5_Ae9mQp`vaW{&^96RvFgE^^!$+b}b2^UX^td@D~LrLKaXU%v&4n z1Zg`%6}Yrn8LK-(rMSZ`;uWDdbvjZi2Uo00KE^?s&XA}hS*pzS6g#b45i(F^XGqf- z61i!{8L7&N-b}h)-XN}3ffuYVc@|jO!WwGcoLd>BkW|Ojk8m z;+K4v%-HubaM6lgD6CImH!JKy;X7|b`IAcZNRc;Gm-dv%Q^2DEPr~hUo88cDK7zc} zGM&bEzB0sRzxy7_uvnh^)b-0nS zW>9N+WQuEweoAbzXL5Lwdtz*YXF_bef1GoyDY(C;ZUU9JTCGNyk@0qIDOa;VbzZYWq!$D3l8Y=+I9Js z$`L!Oj@-syp~gpeU!l-0(8IhYSm}pt47&6*j#SzI8Tcm!?wssSu4y2h^ls0>=N2U~ zu7xVNJ|Yp~fWmB`BpWEt28vA7M?Rwi{e5p~9qDIgpki;9j5-^r%m&Ijva(cX1KMn$ zfd_E?Og5gSqyZ1i1tk-4&ghw<=41o8*+4-ypyb@vGdfCayJ?>|gOq2BRAmF2Y(N&x zDykwID9i>*GC=aJRGvY&8(b03(psAh)Mo<>$hsIwHjtyqlE~LMvJh3aNO3k$mJO8X zvUF5r12x%zHVrtE4H}rTl$2VsfLwPLAoXVfdD%cgHc*re)H*_0N*b~OHku_N%?9!S z9h_uZkt!P~&IZa-fFt!p14EV)aW;^X4di75Drc6C(rlnS8*o%-Bjwz9Eps(B*?=}1 zfZnY0YO;Y`f0l$c2{_WPG#JVf5oZHA*+5=4Ad6?|P-FvzS%3qSWFeqD8^{H8Xql;z z!fc={8>r0&N(@;#DmcKL(OQ!&qRj??GfRm&8>qp9Ue|r4WoXJx_#ImKB0Pm|HWd~Y zW5X5xvdC~pUfdtAqU%k)ln<^NQ;%-08dK+>hA)O&$EJA~zO8*r^=1OEA_?OaB-T5s zJK>k@FKb_pgnhR?w~Q|(Ui7_~xaqr@asZ7G2hd>nI>c*7j8E$WcE8pi!G<6ERqfTt zmDnZX^BKF~Ne*j0=ZxnPXMJbQXU(VK>44AbQz6-v`T*MeR+28&>Le3SY*!|r3wqc)GlZOS`hIIMd} z^Putpa43$dcN_c7w5_wOHLWqM)~(X4RIUKa<4dDUIu?iS^)K>T-4^FU8;)3JnrE1+ zo1>YnoCWY=l<3_Z(?iqzX0HjaLP++VjFS_Se7OJQ#3m&RUY=sWovYG*D(i67@bEDE zFzv8NtE*Mtszjc(z10n|L7qX80j>f10TI1Q7w8-AZSSq^rD}pb!`+7>F5+b~-qtbkS%h2}8{byIf2WK`-6cL1fp@<*`3`IyF7;?~q z6kAInK{ObO@I%7<7>GI3T7C?~44@z|4Q(y_=rlhDV$QUd9|JK198W(JGTB923qMfK zkAavot>wo+%(%69v8@w-oJjIINXc9DjL-| zx{HKx8kE%hd72xgGn{!eNueWUCDclrr0X@*9F?SUO?;|`GjAn%g`Ax#l@CzUNRm<; z_!R5rQ+ZxKRZXaAc11E{j-Ss|hxk+jXE;ep=5n@)Bvo!%f~RH}S}6d}edeO@X>&bZ zC|y#C4waWg%amXqcB-PTLbyiCLz_WiJ=vl6D@xX&rIjV8$-Ov@?*v(Djs03^mCCA0 z`Xfubc}?CVP>iRaIO8c1*E%{$SK{*)c0!@QD^wZn3Kc1rcA=rVOVpvzbR{e?bcI%Q zi55G%lC9|y&5vfuazSqDvSC_prM6{VT!+}QrYqFh6QQjpgbCXH%?A8YHYXf8@fVs-CMhmRd+^f@MBct?@CyOC!Gt?)OPa{MYP@14)OBq$Qk2ls}J@4 zvauApk@m8<#S!pC+*Ta8A@N}Bkmr!`koBPIVC;bBfPJ5KpMFow6?1qTzFp>B)*Y%H zfo;}ps%_z|t}Xg4_Ra21{*4_Q;_H>`b#{}@w$8oQzouh#e3f#QZe?tRXN7S^V!3a* zdAV(wdnsHRSYlnGS`uDtU#wkhzt?OvS`rJj3nP;kxaJ3D2WDDl8fTdAHcx}5z*Os0 z)l}*yWNiC-L=&d?eKWpDaZ&fdCld31|q3UkzW^c4M=<5?&pVq8}+JMHYQE9@p zBqWTr+E|sS^i`TGwH3B9kJ_kCl)}Om={-jno| zNjxVDh@WJE&?}N-YN%N_=_pAdzBgnt+L_Q1l1fz?W&`m~{ITNv1oH4JxS*KqO3|)Z z&9lMLzo}_~#C6J}piYo96LS2v=0P%T=%Id*TvqJzNFEqIgq<3*A?)6m4Pn>CYzTWz zW<%H=QV5A5D8i=hul5i5Ggm(Hk(Sf)1p~jY`D?P&1Wmd?etiFsYOd57P_9W9F$2{Z zIzh$WPLMKnxtWaG)U{=x%G8CVAO;5qnty1>P>96$54jhApt#6UTnSkdc0(0HWt|~l z=_IA-3^jCyO1;?`9iTLnje*i=C#X=fHM?LX*t;dGtc8|NP)%p362GTX86C-6Q_sVa zP#u16rNoj@dAt);rQ4A$RfxM(Ss80OLj{^$SPD-)(!L#6{aO>j1W>K56I2?fJvDyD z2Fvd3j50hmo29D~;AdB;zFQIQyk%k9&Jbxa_+5@?2EOdIsoIF$Vhv8EBf87K)49X6 zU9&B+)wNZ>HMYgG1$*W78TXuIDls-R z#y#4CgJXfV4uf}u4S8%-0YdIac3>Zcb;$qv-Ma?&#V*%t|!v(fWEe&)`DlN9!BV_>=X&LcJfW zUxFTctbS54e!Ix=T%nBy#Y%PmK6|Xbu4_*2M2w^&!W$lW!bk6&?J z$(Mz?#__LJy1LAOaP5{1)Zj=|RjC+27X9YfCeJ40ro_hB2G54T zdh2?#9ohpnt4(DKud}ad6t>8IzIY)V~g~QVphF1 zX7N~z7S}@k!q@`+g4le|eB*pqA^m*_J&tSRnWLH=o@JjIN3oZ3)#HIVV6vK2rtnnz zRP9vnWb!Pj7JfDM8AKpp82`D#r#GM*oq3t&%lVIecC zT=KW39cqaMM8D%bkYxLy!Aa<5^E{xb=~V^&)#U{+4>=9>bd$R z^!@0T262UMGY~)0b7C(Vqjdom<_Bc$B1Wq)5G(!W3&XZjC>4&CzR|f(3XaJdG#1X8 zNmoep=cMqrO{UOnMaE4N7m)5jG8idk3gc-~h=fxuAi+}$guzHDQy68FLc+kL6cPs9 zq);+Qse^xVVf0NZCJb0gAz>s=3JHUkQb-t;lS0BkrWDdRIFBNJDTGl?shBWYCxwI& zPAMde+({u}bXf`sL(6i$V8Xz%RE)u|v#fg~3@OW<62IKCq=fNRIbHabmL-*nwK@ua zUFc#ZJaQ_CcM=l@Ugb{7^-K9RhIU9M{+0Ae2}lhUSQ|2LnfM^e-!XBDVvVx z;NR0TCD(1J)`r*E*J#)1SI1U)RvA|%R{B;(R=8H^S6EQs$+0t0bc(dlVV|j;8M!Am z!!yG;Lw`4z-hsVTY*P(Wl-RqMd^A)O!xIwYedEaxn+&h*W3^)=V_ah*qg|u*I7XU& zRBWVvWUS58W^79seMYmZ!v0tLEudlhUuTP@4uXm!CuUDeU*JN&jcyu1_Veg^s z5$W!tjxU}@@^Ml%gzN3~+IoAPwl1P|B}ePp+DMJ7Mqd-F_Ea0I6IDJOUoBi=uh3RR z%3bC9@>tnoPnogItcL19skPKzqAf8O!{R`ZwMbPIE+paC^s1OLQQ#|xC|n9pzA@jN z=gQUR#^jM?KzUV8SZbGQr4hUaMJtYopeVpvSrr>*?2I5hKTsKaoUg;m4myBDJvK$Dc^TweaIlB$2jo;K!dx!nJVn$Dc^TweaIl zB#|fLWvLg>?mEdK0I&SN|B0j)8y?d*sWy=Oi6oAAi+U*}Id2R66FAodWa>4RF0Xn^ zEQue|95Nl`eo(31qEJ@kKR@J=0oV}mNjaX^NG0WN0ACJP=#)k#_)UN1Mpj%096%oI zt85v|B29}@k&nknc)FHM<5po)e$yYuJM##XvKygzi*h4}B!9mlSUqUQN{H@io-v`{ zJdlec%!i)0KOcJzFPVEL5`g~171w3^rPzf?yQ`h}m&3DxGi2ek_Ou3>tNZq3wI?;m z`p)EPQGuMdWJ`k@MXLxR-3VnzyHla8{K-9qx3>Kl2&IWBT#h>l0|xJd{;RNfgX!`1!8vI&#WyayXbIC$A> zxv>yGdk!}i;zLDoIu_zXrJN<650!CdcRr*Bba=#vw7}5`tHU;SJc{CrDFHR8^Py6A zC#Z}wp7W(DEOfxfhf1(LlBZruM!(fj2ePi>YD9tB)=V%A;#wxRSKtN8{^U<%_?|W= zSMf)12z+iOKfKy;*?Y-$(SY86K(VdD{sueC?;O8h{2L`PQQn^(itfmPO3zLn;c zaHV!dWVvg3WLbEreW`Y7WQl5V7@H0~i(FRMLS!1=>z;gQ@=fvKkz8bgYl0nxhfBv6 z`-Yi^!C`?`Ypbd?Jk*ZoLsfW2bazt&S()FX&ef!EiuLsLH1k0X2CP+RcT`k{YfCgNty;HKZ0T$`NBO`QEN z_TD_ci7QJRu9Cb--c;V@RkCHk3s_>a!7M5pFxX%u_8pbkcZoG&lLTQ25F(Ml4M_+R zA%?I@grFoqkkZ{ry3U|(<|`#IgY@LA_sYz4g>)&5L`A4P{?*tl?p5^uG zwMMlDZv+EPDn3fSehrnM9v7eF3sWhqL&Zx=#=;6zA_{9yi72c(6{kQoh(9k@oQiXC zYaFT+3TsS>VqtYD5ruW7L=;w(5>Z%7YAP(=#dL%CTwoO`Q8cU{C8Dr$l$Zh?C=rF# zqC^zdi4sv(tPmyQur`#4!m3ar3hP0MD69k}qOb;(h{D=W3Cb!IKh}LpZ~`@0@rf@U zto0;{Rgy~Ofnt*=7S?qVQCQIlsHtS}V>KsHG_2z!qOgLKh(du^HKpji*EGkZ5aR3Z z*IcCKaC8}3Bv_zFlkUr}%gQPK>A#%kyKq%An@0QobNorv^_TH^!eWD*H*Esu5NEg8>{i1;`e1ZF?sU-mjCYbJy>K({+Aic!u-fH9x0=YMv!4QyTqdGRF9FAGkQm?bD<<@9dhgU`W z+lUq+YtmpYc17HeT^JxOzAPyC5SCe$YgqtJ>YQ z##*}8s}8C{HIZsnwV}!eCWJ!eigLZuT;?hrD4|NU#ik-hp}!!)s2GF7mhS-*eTrN? z`q6DogYxAaA2qCnrm1EZ(KI=BQS*Ju0ZFIS*Y~aZKS)vTXX;vX>aY1f^7TdQg0!#j zr;;}$$n{4_22$N@1TPRn!#t@Ijttmw|L*Q^)za(Zok$Ve$IG?b6OnsXPu|r&v;J-P6khe zVKtjOW;tp<;(W?|*b5%kaNjcuj{*bzPu)ItuK`V+oL4i-xRcvq*>1Nu&2BIPrG`ZW zc9U@fKx=N0E0!Ag|{bP1ii-MhRy{V4y7@k-9Q*}cgNW~hSe!|S53dd{p-uhy+%`-~iC zvaH08U);;QO9M-Si^Gee3+aW-0yQjfuyc)bIAd^jxHk$bc85FSSCAF4F)aSuhQrjs-{NY?1phG=uBw@3`wSahFadt9)=V%yPrU} zrnQIBAE&qfE!||YP+)UX(RK_;>zXF{o@Uy*Y4mnoQTmx>!Y#tG&1~MvlW>?u3t-=5I4N_Bc$5K4nz9tl4Z0XxmPrm z`hIvYy^-z*eTd@x@3+hdr`f2l|0JAm9k_$7g#&pcc2Eg6ANe2#Y(DY_l`1=b z;G3jrFiX(Gp$#Ktv@4czGaGNDAp zkM>9k&GYIz(0h0E1?W$GJ#0EJ7Y)=dZq6%#?4{+6jZdK1>K6NOabR87^I-1=zJ-x} zy1`5prTh7kNeL|YZ}_y(8y95FSSrag%HV_p|}@y7H#boyl8$b9-b z_j-tT!-aLgIZy;t6(UvTxHK#0a$NMk61kwd5PVtva`2__dFS~k0t16*EoaqdgU_?z z(^K#8pVmL)KWRA`dD{K7@o5@7`*Ft^@a|_ns^eXIVnuPz9<>I*a;Nh^c)xRhV4q_z zyEpoz`$^-I^poBvxF?t=0#MDXcYqyFP!?Bhi)`_4hCa}wOm(e$4ZYgCid)633iMg} z)O~8sY4Wd(tWd2mEVnK5EajFWf0cUJ=qOlQu*^}<2^#H2oiS{18r-vuv)#SMUb@%I z+g&iut(8U-Tn(@MX2%Qg$#n}ol^xLdUV;Q>sCS?)%ME9uwO4byVSWPa1**YvnP5@S=e?Ty4h;`1 zwjv1k*T}zFRoa#C7!9KG4JI+gq*CQzt58S?@2T*XSEf>>wzw=jR|01QD}rTWjs}fG zQ8b!Tr&6`9`BXZ#K_|TR<*Fs|9LQp7+S%q5sxX-;8Fa>ZRTX(?F_jrF7X^UWg~X|H z1tCT#Jyj~jBqf8|rch6jl;D@NHc`N!OV~`yARa{hulNvVc>z~f%-x4K7AkQZ`Cic+8(JM`QNp?i+yO?AL<^4ALt%X_Xpm# zzpVpbn#^0Fd!9FKcMWf-?nFHP+tFM8n~oc%>y~SJ=;Vj`J+Ij=8(vjiin#n29WXg$ zxuCvae3^b(_Y(Ia^CElR{(|m>Fmi%3R^2(_g|t5(e9rz{@QnS8?o8O}T;gP*E2xGE zNcFS9)ArN4)8S{BX9A}zr_`q`C)Fpp6HIIh$#PtMJb280EO->Zwc#VqBkYmrQ*Q9h zX+NwxOdayV%pzkC*etObrl4=-&0M$SsH(VMRidb9n4oF?Ei|$E3Tg8BHmsudGP6;| zK>K3foq_gw5l#(&j zVnQxVI`J`t(PlZp@DE`{L?k3rn43yUl?l^RNkSh{zKYvXCf7v6$ekRg+i8Tds}~%lRia-vG9( z$tV?KBG)X6p%fE2E>Vn1*8yy@c`EHf`KQ_%=Id^%ZYZu(*CJO#R|fk1uX!%JUUgiu zxy>%qMZ+ul3)+`eFDYK6z?OLE+`w7?^PcBiXB}6I)!=p*IwN}mpw_K}4hduNf;D7r zix-r)nT>(1l! z-6Ta-nSG{irlrTut6@94*e-Tjc#0ZSu+h%y?(ZOnb!-}%RMR#G&#n(cKfO4%5)G_u zRur@8(KL6OF`-<>N!)bQ_xH&qQoZt%>p%V8T-aLi(F8hK;d+)*7oa~;-=68SU8&z8 zMUSr4kM_B`GmB}T;zs=)Nss5I`5Jwdxx&E8s25zd+ucr=^CJ6-5!w~!i`;q33l?zI z&Vak-@R=wW4~>FuJpBxNk~v{Ju05hVtgv|wIQI_hQS4$-?(O_ zk2=baIx3DjD*GK(0~G`8^W0a^B0Mq?ErJ3}dAe7_psS%9?8NfTD{fsidj7q{tu2OV zQ>ftt?xzD0>x9r$x-A|jLFGD9sA5kFrS_*#S;8QK6rV4q+G$E9=0Igu&ksMylo~2Q z!4?DI0`~o)K{Y*g0dd2{Il^EDCyi72sgxp>Lf3!MFjFWFT+s-psEEf)Qdzdxg(fLQ zyo8ceS-gajl*XTuur7Y-@mR3a4sXf1_^%BcQ0}i9y3mSWHH^j!YO&oo!gZ^E)!r@S zl;5JmlXw$~C?4K_BBJot6A^`XorowZUe-zRIks5w$0;RE@jFRCiJL!vCf>G92wxiC+g8{2Tgi^IE2_+0V3 zOz;kqOIg)0yPSCi*5xbzqvs8L{h&UM=brflN+AJBW!QKbB$X!=2}zX*cZ#HHg(4v- zwQ#4B6x=B}+^Hddf%%~Rzx1p?C13V*A@!cI4ZZ`%W(=j#TPJ3WKv^ee{0Ut;(=gX) zTLfE5L-3`BZJ_!21F?Rp^8x$72>n=N%s8?8E#q7CTV5aM^WNj`G56GO2JhPM>h9X# z2;Q;Zaq^1I+-+>@4|(>b7ZuuH*9}_rboUz(vw5ZxseWHS3{~$>FVD~+_M8sZGrv2w zTbM+$9Y~)v)#WrgX{Xo0IT+Y@%sd-7Z8@!mtvT!|<4GDk$A@8Nn|(S8{Z->J`j{F# z$lH$upK={GAJW?uw$MS(0o#59idN>A<}gr;TXw5=2Y12Pl6={JKCFE_@67#&@{mWDOtV{#-?IS{M zocnMC@0WEm!1#XyMN?xl`PPK};1@4Wz&!rM>u*(h($}fxt!F2oWm;(?dS!?_4^?d_ z%t!aX!7}KEW7bG?Fu>-a@0!~S(CK5d^U#g_iURa*M4E?AMWh8n=#7X}g*H29#o%{w z059qW=J;frE$wpI-41Yx&cZ*ks^q1pSdBZ?L84 zhYO}bz&F^KDR8RkJqN2uKORk~5HpuUYa%q)tG_zb<%O6Se;L^CZ9+k8P^2;AcU9p2a$R^KJ zL}CXLD4X!^B`lgVzDJ3^Dwj^=kEB(U4H?JxluH?X?4Z^bJIHXwgZ#0BYLLc9P6uiD z01dqW`_s%%EXhKa@jazz=)|5ptM=3IC&7>HAJgB}e#i8o<9+`(Bk!pKhDSDjxR0yR zC>Tk_RcZ8X6&Of0-c#L;c>T8>H%-^IuTxjN{aioOAK-m_L@v268Dr*9wHL#$V2zOI z1@{Hx1^R;XCHITr^UV3c3wQ>OJI9<0g5Mmo28Q-LBDIrp*qqI*Ng{*W%s4eqeR{94$eHQTlhAmc=OI5JIY>@LUs-ck)lP{TcZd;t&#kM zi_jmz)hJp9G0-GSdmh@a>&-@Ox3Y^Ri>u4LN3FNAOC;H9K9`cx*sn${oNtJL z(Sy

;#LmaTJ{SBtoY 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 literal 0 HcmV?d00001 diff --git a/习题解析/05 数组和广义表/_v_images/20181128025918606_14220.png b/习题解析/05 数组和广义表/_v_images/20181128025918606_14220.png new file mode 100644 index 0000000000000000000000000000000000000000..fcc68c5539e924707fcda94c680760236c2dc440 GIT binary patch literal 12217 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 literal 0 HcmV?d00001 diff --git a/习题解析/05 数组和广义表/_v_images/20181128030200899_4388.png b/习题解析/05 数组和广义表/_v_images/20181128030200899_4388.png new file mode 100644 index 0000000000000000000000000000000000000000..cb072c8127ef566410f0bb24a085402e9225e2d4 GIT binary patch literal 1667 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 QkShZUGOE($l5Ye53o(g6asU7T literal 0 HcmV?d00001 diff --git a/习题解析/05 数组和广义表/_v_images/20181128032203810_17392.png b/习题解析/05 数组和广义表/_v_images/20181128032203810_17392.png new file mode 100644 index 0000000000000000000000000000000000000000..25f3692d1cd3a508dfe422ec5b1d29ca265357f8 GIT binary patch literal 5492 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 X>R>hrPkB>p#S~Ci(NV5evZ7Hl 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 literal 0 HcmV?d00001 diff --git a/习题解析/05 数组和广义表/_v_images/20181128102824060_18222.png b/习题解析/05 数组和广义表/_v_images/20181128102824060_18222.png new file mode 100644 index 0000000000000000000000000000000000000000..4d2112263bc571ec8609e4b82ac6572f7dc78cab GIT binary patch literal 1692 zcmZWqc~lbU7N^wIW-zy$)D%<4bWF__MaZ5e=4fSZXQ3&hP$y_rv>mdjNMD z>;wP+K+o@CehSQ2M4;LZMSk0#wx|I0xbK4#0RWBOt=Lv#tzoDr>Z9F*(EcbSI{8vU z7~o6LnyUlfqq@`pziuO8xsZ=elqyZs zLaFKo+wbj}OaL6y*RC$W9vu62nIav0&Qyg9bRW$2mdBLvo<=+ zCQZ`UVgb9)UcH@*FrIJ14kA|l4(QFZXvgkH$}7*e z`*NG7NmHO3Eb4kQXMXhQ6^MM~$BMvPtohYg3A46oG4C#_Z3Gtt-b?JO3hMmnlT=3T zDo!3HY$H9@!e^B4c!~_uZ=l!2P z1g`j!iH!Wk%AL{Ke3z?jl4NX7X&qECO_RUW@=p>%v-p6mLH|z+FIiTAQni zQY}9an^K1${Ac5BI>xxsGecm7SjzA9f(w1}&5PQ@f|DLPB`(lg9t~|)KCwM*vxizK z()s~Mot&b3bc%hd=c`TBUF8Ga34D)xv0LGxB$SzGw|IINf+dvn}a{!_P=f?sv+ z@077;XikF;5Z~>4z7#HK9cO<%Wm?qawbZ?< zA;kAB9-J=>5u19^ps+&MiB#{=YaOYo{VV5e*=af{$Z_eU&dTzG#f2A=1F~Hs{LvZ5 z;m-(&8;4PIT892FUl5`6hZI9cOW zguQ*c3>)T+3eMDKm6skKyaBX!b0=-Tj7Ik?0AFABG+&`_+$`0A*IlEgZ4SM_&e0vl z>V^=mBvz$YJN=Ydp~f9FHC|dp@r1$7wpBe(sHLoikl`_?^jSV^BR6QCp8pZkKqvf= zW^660H=rn7hqHZ5GVg9bvh*pQQ2Q|kffO;>!LVHGq=vY`s0IwQ<6|vURABU7fBCN~R&E21cJD-Ysl+0F9O=e{N<&XcDhLFey?@e}?HRf`DK6J2gSdx~xqxE;g zT@vTi_LM|kJtTx0o5ttK`UWyfN<2O!OmsqhW>+^`Q#NWa1H|>2T&2|ix-aytW3hk@ zho`Uixm+>RqHhGN7=t(h2y<#}5Bkaf&jWeXeO5 zLNYt$XQ~}o<6rEVV>_x>D(Z0fErgP-7drRG@&b^2h`X$VsC=9^`PrD# (1)V = 6×8×6 = 288 Byte +> (2)Loc(5,7) = 1000+(6×8-1)×6 = 1282 +> (3)Loc(1,4)(行) = 1000+(1×8+4)×6 = 1072 +> (4)Loc(4,7)(列) = 1000+(6×7+4)×6 = 1276 + +### 5.2 假设按低下标优先存储整数数组A9×3×5×8时,第一个元素的字节地址是100,每个整数占四个字节。问下列元素的存储地址是什么? +###### (1) a0000 +###### (2) a1111 +###### (3) a3125 +###### (4) a8247 + +> (1)Loc(0,0,0,0) = 100 +> (2)Loc(1,1,1,1) = 100+(1×3×5×8+1×5×8+1×8+1)×4 = 776 +> (3)Loc(3,1,2,5) = 100+(3×3×5×8+1×5×8+2×8+5)×4 = 1784 +> (4)Loc(8,2,4,7) = 100+(8×3×5×8+2×5×8+4×8+7)×4 = 4416 + +### 5.3 按高下标优先存储方式(以最右的下标为主序),顺序列出数组A2×2×3×3中所有元素aijkl,为了简化表达,可以只列出(i,j,k,l)的序列。 + +> (0,0,0,0) (1,0,0,0) (0,1,0,0) (1,1,0,0) +> (0,0,1,0) (1,0,1,0) (0,1,1,0) (1,1,1,0) +> (0,0,2,0) (1,0,2,0) (0,1,2,0) (1,1,2,0) +> +> (0,0,0,1) (1,0,0,1) (0,1,0,1) (1,1,0,1) +> (0,0,1,1) (1,0,1,1) (0,1,1,1) (1,1,1,1) +> (0,0,2,1) (1,0,2,1) (0,1,2,1) (1,1,2,1) +> +> (0,0,0,2) (1,0,0,2) (0,1,0,2) (1,1,0,2) +> (0,0,1,2) (1,0,1,2) (0,1,1,2) (1,1,1,2) +> (0,0,2,2) (1,0,2,2) (0,1,2,2) (1,1,2,2) +> +> 思路: +> +> ![5.3](_v_images/20181128024131486_26584.png) + +### 5.4 将教科书5.3.1节中的式(5-3)改写为一个等式的形式。 + +> ![5.4](_v_images/20181128024617431_31991.png) ,其中a=Max{i,j},b=Min{i,j}。 + +### 5.5 设有上三角矩阵(aij)n×n,将其上三角元素逐行存于数组B[m]中(m充分大),使得B[k]=aij,且k=f1(i)+f2(j)+c。试推导出函数f1,f2和常数c(要求f1和f2中不含常数项)。 + +> 根据题意得: +> ![5.5.1](_v_images/20181128024818024_1955.png)(1≤i≤j≤n,k≥0) +> 故: +> ![5.5.2](_v_images/20181128024844354_32694.png),![5.5.3](_v_images/20181128024901661_11428.png),![5.5.4](_v_images/20181128024915115_3609.png) + +### 5.6 设有三对角矩阵(aij)n×n,将其三条对角线上的元素存于数组B[3][n]中,使得元素B[u][v]=aij,试推导出从(i,j)到(u,v)的下标变换公式。 + +> 行:u = i – j + 1。 +> 列:v = j - 1。 +> 图示: +![5.6](_v_images/20181128025105462_31218.png) + +### 5.7 设有三对角矩阵(aij)n×n,将其三条对角线上的元素逐行地存于数组B[3n-2]中,使得B[k]=aij,求: +##### (1) 用i,j表示k的下标变换公式; +##### (2) 用k表示i,j的下标变换公式。 + +> (1) +> +> 逐行累加考虑:(|i-j|≤1) +![5.7.1](_v_images/20181128025241824_32225.png) +> +> 用“补缺法”考虑:(|i-j|≤1) +> ![5.7.2](_v_images/20181128025435346_25694.png) +> +> (2) i = (k+1)/3 + 1, (0≤k≤3n-1); j = k+3-2i = k+1-2[(k+1)/3]. + + +### 5.8 假设一个准对角矩阵 + +![5.8.1](_v_images/20181128025526044_25756.png) + +##### 按以下方式存于一维数组B[4m]中: +![5.8.2](_v_images/20181128025550464_16430.png) + +##### 写出由一对下标(i,j)求k的转换公式。 + +> k = 2i - j%2 - 1. +> +> **思路:** +> +>![5.8.3](_v_images/20181128025752290_16510.png) + +### 5.9 已知A为稀疏矩阵,试从空间和时间角度比较采用两种不同的存储结构(二维数组和三元组表)完成求运算![5.9](_v_images/20181128030200899_4388.png)的优缺点。 + +> (1)空间与时间复杂度分析: +> +> 用二维数组存储时,空间与时间复杂度均为O(n×n);设非零元个数为t,则用三元组存储时,空间与时间复杂度为O(t)。 +> +> (2)优缺点分析: +> +> 当非零元个数t< (1) = p +> (2) = (k, p, h) +> (3) = (a, b) +> (4) = ((c, d)) +> (5) = GetHead【((c, d))】=(c, d) +> (6) = GetTail【(a, b)】=(b) +> (7) = GetHead【GetTail【(a, b)】】=GetHead【(b)】=b +> (8) = GetTail【GetHead【((c, d))】】=GetTail【(c, d)】=(d) + +### 5.11 利用广义表的GetHead和GetTail操作写出如上题的函数表达式,把原子banana分别从下列广义表中分离出来。 +###### (1) L1 = (apple, pear, banana, orange); +###### (2) L2 = ((apple, pear), (banana, orange)); +###### (3) L3 = (((apple), (pear), (banana), (orange))); +###### (4) L4 = (apple, (pear), ((banana)), (((orange)))); +###### (5) L5 = ((((apple))), ((pear)), (banana), orange); +###### (6) L6 = ((((apple), pear), banana), orange); +###### (7) L7 = (apple, (pear, (banana), orange)); + +> (1) GetHead【GetTail【GetTail【L1】】】 +> (2) GetHead【GetHead【GetTail【L2】】】 +> (3) GetHead【GetHead【GetTail【GetTail【GetHead【L3】】】】】 +> (4) GetHead【GetHead【GetHead【GetTail【GetTail【L4】】】】】 +> (5) GetHead【GetHead【GetTail【GetTail【L5】】】】 +> (6) GetHead【GetTail【GetHead【L6】】】 +> (7) GetHead【GetHead【GetTail【GetHead【GetTail【L7】】】】】 + +### 5.12 按教科书5.5节中图5.8所示结点结构,画出下列广义表的存储结构图,并求它的深度。 +##### (1) ((()),a,((b,c),(),d),(((e)))) +##### (2) ((((a),b)),(((),(d)),(e,f))) + +> (1) deep = 4. +> +> ![5.12.1](_v_images/20181128025833026_20359.png) +> +> (2) deep = 4. +> +> ![5.12.2](_v_images/20181128025848038_32716.png) + +### 5.13 已知以下各图为广义表的存储结构图,其结点结构和5.12题相同。写出各图表示的广义表。 + +(1) ![5.13.1](_v_images/20181128025918606_14220.png) + +> 广义表:((x,(y)),(((())),(),(z))) + +(2) ![5.13.2](_v_images/20181128025944030_21649.png) + +> 广义表:(((a,b,()),()),(a,(b)),()) + +### 5.14 已知等差数列的第一项为a1,公差为d,试写出该数列前n项的和S(n)(n≥1)的递归定义。 + +> ![5.14](_v_images/20181128030006944_5864.png) + +### 5.15 写出求给定集合的幂集的递归定义。 + +> (1) 幂集递归定义的文字表述:(假设集合A中并无重复元素) +>> ① 若A为Ø,则其幂集B为{Ø}。 +>> ② 若A不为Ø。取出A中第一个元素记作a,求取A\{a}的幂集C。对于C中的每个元素x{此处元素必为集合},求集合{a}与集合x的并集,并将求得的各个并集暂时存放到集合D(D初始化为空集)中。最后,求取C与D的并集即可得到A的幂集B。 +> +> 标记求取集合A的幂集的函数为P【A】,获取集合A的元素的函数为I【A】,加号“+”代表取并集,箭头“←”代表将右边的元素添加到左边的集合中,则求幂集的过程可简化为三步: +> ❶ C = P【A\{a}】; +> ❷ ∑(D←(I【C】+{a})); +> ❸ B = C + D。 +> +> 例:集合 A={a,b,c} 的幂集为:B={Ø,{a},{b},{c},{a,b},{a,c},{b,c},{a,b,c}} +> 求取过程:(递归) +> ⒈ P【Ø】 = {Ø}; +> ⒉ P【{c}】: +>> ❶ C = P【{c}\{c}】 = P【Ø】 = {Ø}; +>> +>> ❷ ∑(D←(I【C】+{c})) (C中有1个元素,故需累计添加1次元素到D) +>>> Ⅰ. D←(Ø+{c})= D←{c},此时:D={{c}} +>> +>> ❸ B = C + D = {Ø,{c}},即P【{c}】 = {Ø,{c}}。 +>> +> ⒊ P【{b,c}】: +>> ❶ C = P【{b,c}\{b}】 = P【{c}】 = {Ø,{c}}; +>> +>> ❷ ∑(D←(I【C】+{b})) (C中有2个元素,故需累计添加2次元素到D) +>>> Ⅰ. D←(Ø+{b})= D←{b},此时:D={{b}} +>>> Ⅱ. D←({c}+{b})= D←{b,c},此时:D={{b},{b,c}} +>> +>> ❸ B = C + D = {Ø,{b},{c},{b,c}},即P【{b,c}】 = {Ø,{b},{c},{b,c}}。 +>> +> ⒋ P【{a,b,c}】: +>> ❶ C = P【{a,b,c}\{a}】 = P【{b,c}】 = {Ø,{b},{c},{b,c}}; +>> +>> ❷ ∑(D←(I【C】+{a})) (C中有4个元素,故需累计添加4次元素到D) +>>> Ⅰ.D←(Ø+{a}) = D←{a},此时:D={{a}} +>>> Ⅱ.D←({b}+{a}) = D←{a,b},此时:D={{a},{a,b}} +>>> Ⅲ.D←({c}+{a}) = D←{a,c},此时:D={{a},{a,b},{a,c}} +>>> Ⅳ.D←({b,c}+{a}) = D←{a,b,c},此时:D={{a},{a,b},{a,c},{a,b,c}} +>> +>> ❸ B = C + D = {Ø,{a},{b},{c},{a,b},{a,c},{b,c},{a,b,c}} +>>> 即P【{a,b,c}】 = {Ø,{a},{b},{c},{a,b},{a,c},{b,c},{a,b,c}}。 +> +> (2) 幂集递归定义的函数表示:(假设集合A中并无重复元素) +> ![5.15](_v_images/20181128032123139_30296.png) +> 其中,P【】、I【】、“+”、“←”的含义同上。 + +### 5.16 试利用C语言中的增量运算“++”和减量运算“--”写出两个非负整数a和b相加的递归定义。 + +> ![5.16](_v_images/20181128032203810_17392.png) + +### 5.17 已知顺序表L含有n个整数,试分别以函数形式写出下列运算的递归算法: +###### (1) 求表中的最大整数; +###### (2) 求表中的最小整数; +###### (3) 求表中n个整数之和; +###### (4) 求表中n个整数之积; +###### (5) 求表中n个整数的平均值。 + +---------- + +## 二、算法设计题 + +### 5.18 设计一个算法,将数组An中的元素A[0]至A[n-1]循环右移k位,并要求只用一个元素大小的附加存储,元素移动或交换次数为O(n)。 + +---------- + +### 5.19 若矩阵Am×n中的某个元素aij是第i行中的最小值,同时又是第j列中的最大值,则称此元素为该矩阵中的一个马鞍点。假设二维数组存储矩阵Am×n,试编写求出矩阵中所有马鞍点的算法,并分析你的算法在最坏情况下的时间复杂度。 + +---------- + +### 5.20 类似于以一维数组表示一元多项式,以m维数组:(aj1j2…jm),0≤ji≤n,i=1,2,…,m,表示m元多项式,数组元素ae1e2…em表示多项式中x1e1x2e2…xmem的系数。例如,和二元多项式x2+3xy+4y2-x+2相应的二维数组为: + +![5.20](_v_images/20181128102525149_11720.png) + +### 试编写一个算法将m维数组表示的m元多项式以常规表示的形式(按降幂顺序)输出。可将其中一项ckx1e1x2e2…xmem印成ckx1Ee1x2Ee2…xmEem(其中m,ck和ej(j=1,2,…,m)印出它们具体的值),当ck或ej(j=1,2,…,m)为1时,ck的值或“E”和ej的值可省略不印。 + +---------- + +### 5.21 假设稀疏矩阵A和B均以三元组顺序表作为存储结构。试写出矩阵相加的算法,另设三元组表C存放结果矩阵。 + +---------- + +### 5.22 假设稀疏矩阵A和B均以三元组顺序表作为存储结构。试写出满足以下条件的矩阵相加的算法:假设三元组顺序表A的空间足够大,将矩阵B加到矩阵A上,不增加A,B之外的附加空间,你的算法能否达到O(m+n)的时间复杂度?其中m和n分别为A,B矩阵中非零元的数目。 + +---------- + +### 5.23 三元组顺序表的一种变型是,从三元组顺序表中去掉行下标域得到二元组顺序表,另设一个行起始向量,其每个分量是二元组顺序表的一个下标值,指示该行中第一个非零元素在二元组顺序表中的起始位置。试编写一个算法,由矩阵元素的下标值i,j求矩阵元素。试讨论这种方法和三元组顺序表相比有什么优缺点。 + +---------- + +### 5.24 三元组顺序表的另一种变型是,不存矩阵元素的行、列下标,而存非零元在矩阵中以行为主序时排列的顺序号,即在LOC(0, 0)=1,l=1时按教科书5.2节中公式(5-2)计算出的值。试写一算法,由矩阵元素的下标值i,j求元素的值。 + +---------- + +### 5.25 若将稀疏矩阵A的非零元素以行序为主序的顺序存于一维数组V中,并用二维数组B表示A中的相应元素是否为零元素(以0和1分别表示零元素和非零元素)。 +### 例如,![5.25.1](_v_images/20181128102751394_22422.png)可用V=(15, 22, -6, 9)和![5.25.2](_v_images/20181128102824060_18222.png)表示。 +### 试写一算法,实现在上述表示法中实现矩阵相加的运算。并分析你算法的时间复杂度。 + +---------- + +### 5.26 试编写一个以三元组形式输出用十字链表表示的稀疏矩阵中非零元素及其下标的算法。 + +---------- + +### 5.27 试按教科书5.3.2节中定义的十字链表存储表示编写将稀疏矩阵B加到稀疏矩阵A上的算法。 + +---------- + +### 5.28 采用教科书5.6节中给出的m元多项式的表示方法,写一个求m元多项式中第一变元的偏导数的算法。 +### 5.29 采用教科书5.6节中给出的m元多项式的表示方法,写一个m元多项式相加的算法。 + +---------- + +### 5.30 试按表头、表尾的分析方法重写求广义表的深度的递归算法。 + +---------- + +### 5.31 试按教科书5.5节图5.10所示结点结构编写复制广义表的递归算法。 + +---------- + +### 5.32 试编写判别两个广义表是否相等的递归算法。 + +---------- + +### 5.33 试编写递归算法,输出广义表中所有原子项及其所在层次。 + +---------- + +### 5.34 试编写递归算法,逆转广义表中的数据元素。例如:将广义表(a, ((b, c), ()), (((d), e), f))逆转为:((f, (e, (d))), ((), (c, b)), a)。 + +---------- + +### 5.35 假设广义表按如下形式的字符串表示:(a1, a2, …, an), n≥0,其中ai或为单字母表示的原子,或为广义表;n=0时为只含空格字符的空表( )。试按教科书5.5节图5.8所示链表结点结构编写,按照读入的一个广义表字符串建立其存储结构的递归算法。 + +### 5.36 试按教科书5.5节图5.8所示存储结构,编写按上题描述的格式输出广义表的递归算法。 + +---------- + +### 5.37 试编写递归算法,删除广义表中所有值等于x的原子项。 + +---------- + +### 5.38 试编写算法,依次从左至右输出广义表中第l层的原子项。例如:广义表(a, (b, (c)), (d))中的a为第一层的原子项;b和d为第二层的原子项;c为第三层的原子项。 + +----------

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 W21zo5VH3v$oBtR5PoDi>ivI?qa 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 delta 3991 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 z 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 literal 0 HcmV?d00001 diff --git a/习题解析/05 数组和广义表/_v_images/20181128024844354_32694.png b/习题解析/05 数组和广义表/_v_images/20181128024844354_32694.png new file mode 100644 index 0000000000000000000000000000000000000000..6c37700ce5954363bbcfad9dd1ac03b068eac520 GIT binary patch literal 2110 zcmV-E2*LM>P)y*Qb<~o#gm)e2k?V=$J3X;``z8|en> zgEedPpEJyq4AvoWZ_ zoQ**Zwi{*i3|*CTISdj2+K8vqCys^vi;d-MW@GdOtE5ULLDm#S@ufxIbWtl#mQ6F% zScf?qqbK;IDJ>QCYXAT!K6Zg8hVRb6K(MJ!yN#JbuClC^$lP1+ra-A7AzfKD#50O6k(XUq86>hhIMb+#jD9{J|%G2q-qh7qIhTVZC@CT7 zR?jM_l2U}s$ycQltzLakU27$xDHlHiNj_VjetS(Pdio6wd(gltsnVZ_D4b4&Gp%L2 zE~AywrHLFyV{vhG+Vw}Qm58R{DLyV`+UZ!o|M03L@n^B7O|4i~WViaA(y5+)z}f|H)6=R)G*saK9XI|#Sni|c=v zi+N+5AW=W{%8_S>1A%qBcHKtqUU9RBn;mImr=^lVpUD;s832PU!&a>fjyB%sIJ4Cb zXO*K#9yH*SnxZH^Cr2~QatQ0jaX{Q!YbOaQB`HgM5)ij~aC5V14G#o{*Es}hhK`T- zGI)2>Q-7|s$SHuhwL!QAOP8-rlA+%%rX_v?h%Vf`J;3)$ODDM5!_AJgvC|SxoX#kU z;@kO4MOp`hYf{%V%OQin2qz59yVV=GeUsM-2)x5myR2ggQ1qUT2LKr2I1E@HyLmg# z4+o$r3Ai(YT;P*hYb?2&9?M#Z6bi=p&!i#ci+|+h!9;TUsjy$KFkVLPiKc5ZM%2)=H#=A;wFiXYFo9Xh;XZK|){z z!p&tuN=bJ0p`nYOTKU%_1P~y-a2!XIS}N?<0RXCo!2{xJqcsq4y4zEn?6I32Y0|A0 z_v0%3$fo>R8-mVRf8^XGp&)DUUYQpQC+#8(q z0KoPVFxoJKHSS&?Tv~dmpLs4jd$eOmTI@xOb5ge+M7Obo1_HzDyui%^F-DrU?Bwea z0ubEN@zehk<63J>v$Naf=X*I~9rZvxUPI6r8q_yJP%R1n;p6}8R}Rb39=q6)Dtpl4 zcwAM_2HV9$c5zEL$1PS#l@tx8ya=wpkHicDMB#miX_iAvm#<9@iqiB`VZUxwZV1}!Tn-y(#O@va`(0zl&cpqq*=+HOPfSmH@#aXU(A3DjuJRCn_}JpH){E%TTEe*>f^49vk$vz&8=Iu^ zzQZGp%-JZjTqvILiPDAr5U)Aml}6@l6tOA`u{;rjFC014cK(t!UTS2{MhVj_hl(1O zc`2^!hnFAi@LD5tHcEVXd2Z4W)BAe)^jafxHVTx~b2GY-zFI#WFwJu4^Y`AH+E1q% zG&Hh2o5z&Yb2AzyR07*qoM6N<$g1cP)2mk;8 literal 0 HcmV?d00001 diff --git a/习题解析/05 数组和广义表/_v_images/20181128024901661_11428.png b/习题解析/05 数组和广义表/_v_images/20181128024901661_11428.png new file mode 100644 index 0000000000000000000000000000000000000000..59f4cd97d3328620293735b42f4bd0707b58b777 GIT binary patch literal 1285 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 literal 0 HcmV?d00001 diff --git a/习题解析/05 数组和广义表/_v_images/20181128025105462_31218.png b/习题解析/05 数组和广义表/_v_images/20181128025105462_31218.png new file mode 100644 index 0000000000000000000000000000000000000000..e933260147fc4734bb5b27dac83da4f32bf24916 GIT binary patch literal 13834 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 literal 0 HcmV?d00001 diff --git a/习题解析/05 数组和广义表/_v_images/20181128025241824_32225.png b/习题解析/05 数组和广义表/_v_images/20181128025241824_32225.png new file mode 100644 index 0000000000000000000000000000000000000000..205d50e9fcabfa8474cd5df756e6c79443dcdd3d GIT binary patch literal 8536 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 lI$q_ee}l}V+;oW4qrM z`}2LjdkcaffQN^Nv!Hn!;NkHx;!Qjck2!z<0QA;LEJHH&la?Nvw?Rf|TGL<5kTS^> z%S}!5_uJ=b_b8j}!tFV-0w;WQOB@#jK>)pV63b?l0>kqgNg7q0G@w;H+|NpFa^8U1 z%FgEM4?&9R3_T+=>lfSY#!Ot~JSj*4UU{@e?>l9e)i{}dGx@%%Oyk=pj#_pBO>6qA z@)DCK4{wGMs%u))|L2R`tK9E_Uxid;0{}qRYs-=ZT!K$*1u5i6a(V-?^jZb*0pRYq zXII$7fs~b=*Am=sVT9_F`~EBPH+%!PX(U@`@oY@vrxlpV_cXXEmH+_l)@MGmz8RkJ zdfPGS92Q&qb{a}i!4A8d+UO5hiVAj^NZ=UMcIaHbDR1s5nCX1Ec%~TJX}xSfbh5H5 z2!6sR;uv7;fJAh%!ZM2dMu9t4+Av6~c(_jpc}Ga5W2LXt_-O@`@@=;av@4E%zP^9| zr?F#sfDa~Ke-*?W*_wxZdfRR@fCG*G_FR<}E)Zdk-7G~`B8;fWRnD&d>9t4uPE8J{ zxtMP|aWamY*7PfKdwrB|!%|aMLgKU1Q_PXAR1}GmIvq~e!Xvq|dlMzn(YE{mS@@?ifcE-|*I8s!wv$iY5*WmwR%L{mA zRA3p}@xJ2t?a!s`W^Tm8cG0T_Ej>sRK04?WMFl$ntaeXT2mw7^pMwFICn%Z{g(xia zKig3daEq^I8I|uz*d0r&ZQ-bFrqX1E?2z-M zP*B;>&d;mSATq96zE#x-06p`LU^}WBQgO6<-DM`g<#TQ(-&YY`uPuw&#*^~;v>jCF246`%zL~Aw_lRh_1dy1{P7y|54W6txo-x&brSm}t3Lmpm^-V?Dv#!Q z$-%A65=*zl(e-yV5enB?7Q~WRdg8>@tZAuAr9EI-(d=0T(YNK9&LpZDQUSxw8469; zm6>Ack~q%w=89PsSARTU<=nc{MW1n;SHOUUoqLOhC1Wd)^Q2HvfCK2Ao$Ri{URT@} zN7qYD50C4J>!qfL$92S;cpe^ez?*m;9&_M7E_f!3SfS`t00000NkvXXu0mjfv_fdw literal 0 HcmV?d00001 diff --git a/习题解析/05 数组和广义表/_v_images/20181128025526044_25756.png b/习题解析/05 数组和广义表/_v_images/20181128025526044_25756.png new file mode 100644 index 0000000000000000000000000000000000000000..1c24b9afd1ec971f97aa87d550f9092580d829d6 GIT binary patch literal 6168 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 S8v^^{fTo(BYPs^A@c#ku+M-SX literal 0 HcmV?d00001 diff --git a/习题解析/05 数组和广义表/_v_images/20181128025550464_16430.png b/习题解析/05 数组和广义表/_v_images/20181128025550464_16430.png new file mode 100644 index 0000000000000000000000000000000000000000..522446a35f0db949bb36908eb7ef4965a333be4f GIT binary patch literal 6127 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