From 824e07604b023a70c19cae50d8659bb523f97d85 Mon Sep 17 00:00:00 2001 From: Artem Date: Tue, 22 Nov 2022 23:37:46 +0300 Subject: [PATCH 01/17] =?UTF-8?q?=D0=A3=D0=B4=D0=B0=D0=BB=D0=B8=D0=BB=20?= =?UTF-8?q?=D0=BF=D1=80=D0=B5=D0=B4=D1=8B=D0=B4=D1=83=D1=89=D1=83=D1=8E=20?= =?UTF-8?q?=D0=B2=D0=B5=D1=82=D0=BA=D1=83,=20=D1=81=D1=8E=D0=B4=D0=B0=20?= =?UTF-8?q?=D0=BF=D0=B5=D1=80=D0=B5=D0=BD=D0=B5=D1=81=20c=20=D0=B8=20h,=20?= =?UTF-8?q?=D0=BD=D0=B0=D0=B4=D0=BE=20=D1=81=D0=B4=D0=B5=D0=BB=D0=B0=D1=82?= =?UTF-8?q?=D1=8C=20=D1=83=D0=B4=D0=B0=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- avlTreeNew/AVLTree/AVLTree.sln | 31 +++ avlTreeNew/AVLTree/AVLTree/AVLTree.vcxproj | 150 ++++++++++++ .../AVLTree/AVLTree/AVLTree.vcxproj.filters | 17 ++ avlTreeNew/AVLTree/AVLTree/avlTree.c | 227 ++++++++++++++++++ avlTreeNew/AVLTree/AVLTree/avlTree.h | 24 ++ 5 files changed, 449 insertions(+) create mode 100644 avlTreeNew/AVLTree/AVLTree.sln create mode 100644 avlTreeNew/AVLTree/AVLTree/AVLTree.vcxproj create mode 100644 avlTreeNew/AVLTree/AVLTree/AVLTree.vcxproj.filters create mode 100644 avlTreeNew/AVLTree/AVLTree/avlTree.c create mode 100644 avlTreeNew/AVLTree/AVLTree/avlTree.h diff --git a/avlTreeNew/AVLTree/AVLTree.sln b/avlTreeNew/AVLTree/AVLTree.sln new file mode 100644 index 0000000..1d6c315 --- /dev/null +++ b/avlTreeNew/AVLTree/AVLTree.sln @@ -0,0 +1,31 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.0.31903.59 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "AVLTree", "AVLTree\AVLTree.vcxproj", "{4324245A-4186-4376-87B3-D0293B15F24B}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {4324245A-4186-4376-87B3-D0293B15F24B}.Debug|x64.ActiveCfg = Debug|x64 + {4324245A-4186-4376-87B3-D0293B15F24B}.Debug|x64.Build.0 = Debug|x64 + {4324245A-4186-4376-87B3-D0293B15F24B}.Debug|x86.ActiveCfg = Debug|Win32 + {4324245A-4186-4376-87B3-D0293B15F24B}.Debug|x86.Build.0 = Debug|Win32 + {4324245A-4186-4376-87B3-D0293B15F24B}.Release|x64.ActiveCfg = Release|x64 + {4324245A-4186-4376-87B3-D0293B15F24B}.Release|x64.Build.0 = Release|x64 + {4324245A-4186-4376-87B3-D0293B15F24B}.Release|x86.ActiveCfg = Release|Win32 + {4324245A-4186-4376-87B3-D0293B15F24B}.Release|x86.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {4226DC63-DC3D-43E1-9341-646B92A145E2} + EndGlobalSection +EndGlobal diff --git a/avlTreeNew/AVLTree/AVLTree/AVLTree.vcxproj b/avlTreeNew/AVLTree/AVLTree/AVLTree.vcxproj new file mode 100644 index 0000000..f2b10c1 --- /dev/null +++ b/avlTreeNew/AVLTree/AVLTree/AVLTree.vcxproj @@ -0,0 +1,150 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + + 16.0 + Win32Proj + {4324245a-4186-4376-87b3-d0293b15f24b} + AVLTree + 10.0 + + + + Application + true + v143 + Unicode + + + Application + false + v143 + true + Unicode + + + Application + true + v143 + Unicode + + + Application + false + v143 + true + Unicode + + + + + + + + + + + + + + + + + + + + + + + true + + + false + + + true + + + false + + + + + Level3 + true + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + + + + + Level3 + true + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + true + true + + + + + Level3 + true + _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + + + + + Level3 + true + true + true + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + true + true + + + + + + + + diff --git a/avlTreeNew/AVLTree/AVLTree/AVLTree.vcxproj.filters b/avlTreeNew/AVLTree/AVLTree/AVLTree.vcxproj.filters new file mode 100644 index 0000000..153170c --- /dev/null +++ b/avlTreeNew/AVLTree/AVLTree/AVLTree.vcxproj.filters @@ -0,0 +1,17 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;h++;hm;inl;inc;ipp;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/avlTreeNew/AVLTree/AVLTree/avlTree.c b/avlTreeNew/AVLTree/AVLTree/avlTree.c new file mode 100644 index 0000000..92a5a22 --- /dev/null +++ b/avlTreeNew/AVLTree/AVLTree/avlTree.c @@ -0,0 +1,227 @@ +#include "avlTree.h" +#include +#include + +typedef struct Value { + int key; + char* value; + int balance; +} Value; + +typedef struct Node { + Value data; + Node* left; + Node* right; +} Node; + +typedef struct Tree { + Node* root +} Tree; + +Tree* createTree(void) { + Tree* tree = calloc(1, sizeof(Tree)); + return tree; +} + +Node* createElementTree(void) { + Node* temp = calloc(1, sizeof(Node)); + return temp; +} + +void helpedClearTree(Node* root) { + if (root != NULL) { + helpedClearTree(root->left); + helpedClearTree(root->right); + free(root->data.value); + free(root); + root = NULL; + } +} + +void clearTree(Tree* tree) { + if (tree == NULL) { + return; + } + helpedClearTree(tree->root); + free(tree); + tree = NULL; +} + +Node* rotateLeft(Node* a) +{ + Node* b = a->right; + Node* c = b->left; + b->left = a; + a->right = c; + return b; +} + +Node* bigRotateLeft(Node* a) { + Node* b = a->right; + Node* c = b->left; + a->right = c->left; + b->left = c->right; + c->left = a; + c->right = b; + return c; +} + +Node* bigRotateRight(Node* a) { + Node* b = a->left; + Node* c = b->right; + a->left = c->right; + b->right = c->left; + c->left = b; + c->right = a; + return c; +} + +Node* rotateLeft(Node* a) { + Node* b = a->right; + Node* c = b->left; + b->left = a; + a->right = c; + return b; +} + +Node* rotateRight(Node* a) { + Node* b = a->left; + Node* c = b->right; + b->right = a; + a->left = c; + return b; +} + +Node* balance(Node* node) { + if (node->data.balance == 2) { + if (node->right->data.balance >= 0) + return rotateLeft(node); + return bigRotateLeft(node); + } + if (node->data.balance == -2) { + if (node->left->data.balance <= 0) + return rotateRight(node); + return bigRotateRight(node); + } + return node; +} + +Node* helpedToInsert(Node* root, int key, char* string) { + if (root == NULL) { + Node* newNode = createElementTree(); + newNode->data.value = string; + newNode->data.key = key; + return newNode; + } + if (root->data.key == key) { + root->data.value = string; + return root; + } + if (key < root->data.key) { + root->left = helpedToInsert(root->left, key, string); + --root->data.balance; + } + else { + root->right = helpedToInsert(root->right, key, string); + ++root->data.balance; + } + return balance(root); +} + +void addToTree(Tree* tree, int key, char* string) { + tree->root = helpedToInsert(tree->root, key, string); +} + +char* returnValueByKey(Tree* tree, int key) { + if (tree == NULL) { + return NULL; + } + Node* walker = tree->root; + + while (walker != NULL) { + if (walker->data.key == key) { + return walker->data.value; + } + if (walker->data.key < key) { + walker = walker->right; + } + else { + walker = walker->left; + } + } + return NULL; +} + +bool isKeyInTree(Tree* tree, int key) { + if (tree == NULL) { + return false; + } + Node* walker = tree->root; + + while (walker != NULL) { + if (walker->data.key == key) { + return true; + } + if (walker->data.key < key) { + walker = walker->right; + } + else { + walker = walker->left; + } + } + return false; +} + +Node* deleteNode(Node* root, int key, Tree* tree, Node* previousRoot) { + +} + +Node* helpDeleteNodeInTreeByKey(Node* root, int key, Tree* tree, Node* previousRoot) { + if (root == NULL) { + return NULL; + } + if (root->data.key == key) { + if (previousRoot == NULL) { + if (root->right == NULL) { + Node* temp = root->left; + free(root->data.value); + free(root); + return temp; + } + else { + if (root->right->left == NULL) { + Node* temp = root->left; + free(root->data.value); + free(root); + root->left = temp; + root->data.balance = root->right - root->left; + return root; + } + else { + deleteNode(root, key, tree, previousRoot); + } + } + } + else { + if (previousRoot->data.key < key) { + previousRoot->right = deleteNode(root, key, tree, previousRoot); + } + else { + previousRoot->left = deleteNode(root, key, tree, previousRoot); + } + } + } + if (key < root->data.key) { + root->left = helpDeleteNodeInTreeByKey(root->left, key, tree, root); + ++root->data.balance; + } + else { + root->right = helpDeleteNodeInTreeByKey(root->right, key, tree, root); + --root->data.balance; + } + return balance(root); +} + +void deleteNodeInTreeByKey(Tree* tree, int key) { + tree->root = helpedDeleteNodeInTreeByKey(tree->root, key, tree, NULL); +} \ No newline at end of file diff --git a/avlTreeNew/AVLTree/AVLTree/avlTree.h b/avlTreeNew/AVLTree/AVLTree/avlTree.h new file mode 100644 index 0000000..88b9639 --- /dev/null +++ b/avlTreeNew/AVLTree/AVLTree/avlTree.h @@ -0,0 +1,24 @@ +#ifndef AVL_TREE_H +#define AVL_TREE_H +#include + +typedef struct Tree Tree; + +// +Tree* createTree(void); + +// +void clearTree(Tree* tree); + +// +void addToTree(Tree* tree, int key, char* string); + +// +char* returnValueByKey(Tree* tree, int key); + +// +bool isKeyInTree(Tree* tree, int key); + +// +bool deleteNodeInTreeByKey(Tree* tree, int key); +#endif \ No newline at end of file From e1960544597af6bef8864796f080903e29a31def Mon Sep 17 00:00:00 2001 From: Artem Date: Wed, 23 Nov 2022 00:54:52 +0300 Subject: [PATCH 02/17] =?UTF-8?q?=D0=A1=D0=B4=D0=B5=D0=BB=D0=B0=D0=BB=20?= =?UTF-8?q?=D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D1=8E=20=D1=83=D0=B4=D0=B0?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BD=D0=BE=D0=B4=D0=B0=20?= =?UTF-8?q?=D0=BF=D1=80=D0=B8=20=D0=BE=D0=BF=D1=82=D0=B8=D0=BC=D0=B0=D0=BB?= =?UTF-8?q?=D1=8C=D0=BD=D0=BE=D0=BC=20=D1=81=D0=BB=D1=83=D1=87=D0=B8=D0=B5?= =?UTF-8?q?,=20=D0=BD=D1=83=D0=B6=D0=BD=D0=B0=20=D0=BF=D1=80=D0=BE=D0=B2?= =?UTF-8?q?=D0=B5=D1=80=D0=BA=D0=B0=20=D0=B8=20=D0=B4=D0=BE=D0=B1=D0=B0?= =?UTF-8?q?=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BD=D0=B5=D0=BE=D0=BF?= =?UTF-8?q?=D1=82=D0=B8=D0=BC=D0=B0=D0=BB=D1=8C=D0=BD=D1=8B=D1=85=20=D1=81?= =?UTF-8?q?=D0=BB=D1=83=D1=87=D0=B8=D0=B5=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- avlTreeNew/AVLTree/AVLTree/avlTree.c | 57 +++++++++++++--------------- 1 file changed, 26 insertions(+), 31 deletions(-) diff --git a/avlTreeNew/AVLTree/AVLTree/avlTree.c b/avlTreeNew/AVLTree/AVLTree/avlTree.c index 92a5a22..3da0777 100644 --- a/avlTreeNew/AVLTree/AVLTree/avlTree.c +++ b/avlTreeNew/AVLTree/AVLTree/avlTree.c @@ -172,8 +172,31 @@ bool isKeyInTree(Tree* tree, int key) { return false; } -Node* deleteNode(Node* root, int key, Tree* tree, Node* previousRoot) { - +Node* deleteNode(Node* root, int key, Tree* tree, Node* previousRoot, Node* theMostBigLeft, bool firstLeft) { + if (!firstLeft && theMostBigLeft->right == NULL) { + Node* tempLeft = root->left; + free(root->data.value); + root->data.value = theMostBigLeft->data.value; + root->data.key = theMostBigLeft->data.key; + if (theMostBigLeft->left != NULL) { + root->left = theMostBigLeft->left; + root->left->left = tempLeft; + root->left->data.balance = -1 + root->left->left->data.balance; + } + root->data.balance = root->right->data.balance - root->left->data.balance - 1; + free(theMostBigLeft); + return NULL; + } else { + if (firstLeft) { + root->left = deleteNode(root, key, tree, previousRoot, root->left, false); +/// ++theMostBigLeft->data.balance; + } + else { + theMostBigLeft->right = deleteNode(root, key, tree, previousRoot, theMostBigLeft->right, false); + --theMostBigLeft->data.balance; + } + } + return balance(theMostBigLeft); } Node* helpDeleteNodeInTreeByKey(Node* root, int key, Tree* tree, Node* previousRoot) { @@ -181,35 +204,7 @@ Node* helpDeleteNodeInTreeByKey(Node* root, int key, Tree* tree, Node* previousR return NULL; } if (root->data.key == key) { - if (previousRoot == NULL) { - if (root->right == NULL) { - Node* temp = root->left; - free(root->data.value); - free(root); - return temp; - } - else { - if (root->right->left == NULL) { - Node* temp = root->left; - free(root->data.value); - free(root); - root->left = temp; - root->data.balance = root->right - root->left; - return root; - } - else { - deleteNode(root, key, tree, previousRoot); - } - } - } - else { - if (previousRoot->data.key < key) { - previousRoot->right = deleteNode(root, key, tree, previousRoot); - } - else { - previousRoot->left = deleteNode(root, key, tree, previousRoot); - } - } + deleteNode(root, key, tree, previousRoot, NULL, true); } if (key < root->data.key) { root->left = helpDeleteNodeInTreeByKey(root->left, key, tree, root); From 7177741e5058a9b393889532e2d984a6b73cf4a9 Mon Sep 17 00:00:00 2001 From: Artem Date: Wed, 23 Nov 2022 10:01:57 +0300 Subject: [PATCH 03/17] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D0=BD=D0=B5?= =?UTF-8?q?=D1=81=20main,=20=D1=81=20=D0=BF=D1=80=D0=BE=D1=88=D0=BB=D0=BE?= =?UTF-8?q?=D0=B3=D0=BE=20=D1=80=D0=B0=D0=B7=D0=B0=20=D0=B8=20=D0=BD=D0=B0?= =?UTF-8?q?=D0=BF=D0=B8=D1=81=D0=B0=D0=BB=20=D1=83=D0=B4=D0=B0=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5,=20=D0=BA=D0=BE=D1=82=D0=BE=D1=80=D0=BE?= =?UTF-8?q?=D0=B5=20=D0=BD=D1=83=D0=B6=D0=BD=D0=BE=20=D0=BE=D1=82=D1=82?= =?UTF-8?q?=D1=82=D0=B5=D1=81=D1=82=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D1=82?= =?UTF-8?q?=D1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- avlTreeNew/AVLTree/AVLTree/avlTree.c | 29 ++++++- avlTreeNew/AVLTree/AVLTree/main.c | 121 +++++++++++++++++++++++++++ 2 files changed, 148 insertions(+), 2 deletions(-) create mode 100644 avlTreeNew/AVLTree/AVLTree/main.c diff --git a/avlTreeNew/AVLTree/AVLTree/avlTree.c b/avlTreeNew/AVLTree/AVLTree/avlTree.c index 3da0777..7dd9f18 100644 --- a/avlTreeNew/AVLTree/AVLTree/avlTree.c +++ b/avlTreeNew/AVLTree/AVLTree/avlTree.c @@ -173,7 +173,7 @@ bool isKeyInTree(Tree* tree, int key) { } Node* deleteNode(Node* root, int key, Tree* tree, Node* previousRoot, Node* theMostBigLeft, bool firstLeft) { - if (!firstLeft && theMostBigLeft->right == NULL) { + if (!firstLeft && theMostBigLeft->right == NULL || root->left->right == NULL) { Node* tempLeft = root->left; free(root->data.value); root->data.value = theMostBigLeft->data.value; @@ -204,7 +204,32 @@ Node* helpDeleteNodeInTreeByKey(Node* root, int key, Tree* tree, Node* previousR return NULL; } if (root->data.key == key) { - deleteNode(root, key, tree, previousRoot, NULL, true); + if (root->left == NULL) { + Node* temp = root->right; + free(root->data.value); + free(root); + if (previousRoot == NULL) { + tree->root = temp; + } else { + if (previousRoot->data.key < key) { + previousRoot->right = temp; + } else { + previousRoot->left = temp; + } + } + return root; + } + root = deleteNode(root, key, tree, previousRoot, NULL, true); + if (previousRoot == NULL) { + tree->root = root; + } else { + if (previousRoot->data.key < key) { + previousRoot->right = root; + } + else { + previousRoot->left = root; + } + } } if (key < root->data.key) { root->left = helpDeleteNodeInTreeByKey(root->left, key, tree, root); diff --git a/avlTreeNew/AVLTree/AVLTree/main.c b/avlTreeNew/AVLTree/AVLTree/main.c new file mode 100644 index 0000000..ddda0ea --- /dev/null +++ b/avlTreeNew/AVLTree/AVLTree/main.c @@ -0,0 +1,121 @@ +#include "avlTree.h" +#include +#include +#include +#include +#include + +int scanOne(); + +bool talkWithUser(void) { + printf(" :\n0 - \n1 - . , .\n2 - . , NULL.\n3 - .\n4- . , ."); + int command = scanOne(); + + while (command > 4 || command < 0) { + printf(" . !\n"); + command = scanOne(); + } + + Tree* tree = createTree(); + char* stringCopy = NULL; + + while (command != 0) { + printf(" \n"); + int key = scanOne(); + + switch (command) { + case 1: + printf(" . 100 \n"); + int size = scanOne(); + while (size < 0 || size > 100) { + while (getchar() != '\n') { + } + printf("...\n"); + size = scanOne(); + } + char buffer[101] = { '\0' }; + int checkScanf = scanf("%s", buffer); + + while (checkScanf != 1) { + while (getchar() != '\n') { + } + printf("...\n"); + checkScanf = scanf("%s", buffer); + } + size_t sizeBuffer = strlen(buffer); + char* string = calloc(sizeBuffer + 1, sizeof(char)); + if (string == NULL) { + return false; + } + for (size_t i = 0; i < sizeBuffer; ++i) { + string[i] = buffer[i]; + } + addToTree(tree, key, string); + break; + case 2: + stringCopy = NULL; + stringCopy = returnValueByKey(tree, key); + if (string != NULL) { + printf("%s\n", string); + } + printf(" !\n"); + break; + case 3: + if (isKeyInTree(tree, key)) { + printf(", !\n"); + } + else { + printf(", !\n"); + } + printf(" !\n"); + break; + case 4: + tree = deleteNodeInTreeByKey(tree, key); + printf(" !\n"); + break; + } + + command = scanOne(); + + while (command > 4 || command < 0) { + printf(" . !\n"); + command = scanOne(); + } + } + + clearTree(tree); +} + +bool test() { + return true; +} + +int main() { + setlocale(LC_ALL, "RUS"); + if (test()) { + printf(" !\n"); + } + else { + printf("...\n"); + return -1; + } + if (!talkWithUser()) { + printf("...\n"); + return -1; + } +} + +int scanOne() { + int number = 0; + int checkScanf = scanf("%d", &number); + + while (checkScanf != 1) { + while (getchar() != '\n') { + } + + printf("...\n"); + checkScanf = scanf("%d", &number); + } + + return number; +} \ No newline at end of file From 3e05573f14219887e2b28e13efc8d12e19e7245f Mon Sep 17 00:00:00 2001 From: Artem Date: Wed, 23 Nov 2022 15:23:05 +0300 Subject: [PATCH 04/17] =?UTF-8?q?=D0=9C=D0=BE=D0=B4=D0=B8=D1=84=D0=B8?= =?UTF-8?q?=D1=86=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BB=20=D1=83=D0=B4=D0=B0?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5,=20=D0=BD=D0=B0=D1=87=D0=B0?= =?UTF-8?q?=D0=BB=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D1=83=20=D1=81=20=D1=82?= =?UTF-8?q?=D0=B5=D1=81=D1=82=D0=BE=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- avlTreeNew/AVLTree/AVLTree/avlTree.c | 33 ++++++++++++++-------------- avlTreeNew/AVLTree/AVLTree/avlTree.h | 2 +- avlTreeNew/AVLTree/AVLTree/main.c | 24 +++++++++++++------- 3 files changed, 34 insertions(+), 25 deletions(-) diff --git a/avlTreeNew/AVLTree/AVLTree/avlTree.c b/avlTreeNew/AVLTree/AVLTree/avlTree.c index 7dd9f18..d1d745d 100644 --- a/avlTreeNew/AVLTree/AVLTree/avlTree.c +++ b/avlTreeNew/AVLTree/AVLTree/avlTree.c @@ -10,12 +10,12 @@ typedef struct Value { typedef struct Node { Value data; - Node* left; - Node* right; + struct Node* left; + struct Node* right; } Node; typedef struct Tree { - Node* root + struct Node* root; } Tree; Tree* createTree(void) { @@ -76,14 +76,6 @@ Node* bigRotateRight(Node* a) { return c; } -Node* rotateLeft(Node* a) { - Node* b = a->right; - Node* c = b->left; - b->left = a; - a->right = c; - return b; -} - Node* rotateRight(Node* a) { Node* b = a->left; Node* c = b->right; @@ -173,7 +165,7 @@ bool isKeyInTree(Tree* tree, int key) { } Node* deleteNode(Node* root, int key, Tree* tree, Node* previousRoot, Node* theMostBigLeft, bool firstLeft) { - if (!firstLeft && theMostBigLeft->right == NULL || root->left->right == NULL) { + if (!firstLeft && theMostBigLeft->right == NULL) {//!firstLeft && theMostBigLeft->right == NULL || root->left->right == NULL Node* tempLeft = root->left; free(root->data.value); root->data.value = theMostBigLeft->data.value; @@ -183,17 +175,24 @@ Node* deleteNode(Node* root, int key, Tree* tree, Node* previousRoot, Node* theM root->left->left = tempLeft; root->left->data.balance = -1 + root->left->left->data.balance; } - root->data.balance = root->right->data.balance - root->left->data.balance - 1; + root->data.balance = root->right->data.balance - root->left->data.balance + 1; free(theMostBigLeft); return NULL; } else { if (firstLeft) { root->left = deleteNode(root, key, tree, previousRoot, root->left, false); -/// ++theMostBigLeft->data.balance; +/// ++theMostBigLeft->data.balance;// + return + if (root->left == NULL) { + return root; + } } else { theMostBigLeft->right = deleteNode(root, key, tree, previousRoot, theMostBigLeft->right, false); --theMostBigLeft->data.balance; + if (theMostBigLeft->right == NULL) { + return theMostBigLeft; + } + // return } } return balance(theMostBigLeft); @@ -217,7 +216,7 @@ Node* helpDeleteNodeInTreeByKey(Node* root, int key, Tree* tree, Node* previousR previousRoot->left = temp; } } - return root; + return temp; } root = deleteNode(root, key, tree, previousRoot, NULL, true); if (previousRoot == NULL) { @@ -243,5 +242,7 @@ Node* helpDeleteNodeInTreeByKey(Node* root, int key, Tree* tree, Node* previousR } void deleteNodeInTreeByKey(Tree* tree, int key) { - tree->root = helpedDeleteNodeInTreeByKey(tree->root, key, tree, NULL); + if (isKeyInTree(tree, key)) { + tree->root = helpDeleteNodeInTreeByKey(tree->root, key, tree, NULL); + } } \ No newline at end of file diff --git a/avlTreeNew/AVLTree/AVLTree/avlTree.h b/avlTreeNew/AVLTree/AVLTree/avlTree.h index 88b9639..c7a1207 100644 --- a/avlTreeNew/AVLTree/AVLTree/avlTree.h +++ b/avlTreeNew/AVLTree/AVLTree/avlTree.h @@ -20,5 +20,5 @@ char* returnValueByKey(Tree* tree, int key); bool isKeyInTree(Tree* tree, int key); // -bool deleteNodeInTreeByKey(Tree* tree, int key); +void deleteNodeInTreeByKey(Tree* tree, int key); #endif \ No newline at end of file diff --git a/avlTreeNew/AVLTree/AVLTree/main.c b/avlTreeNew/AVLTree/AVLTree/main.c index ddda0ea..42115f3 100644 --- a/avlTreeNew/AVLTree/AVLTree/main.c +++ b/avlTreeNew/AVLTree/AVLTree/main.c @@ -8,7 +8,7 @@ int scanOne(); bool talkWithUser(void) { - printf(" :\n0 - \n1 - . , .\n2 - . , NULL.\n3 - .\n4- . , ."); + printf(" :\n0 - \n1 - . , .\n2 - . , NULL.\n3 - .\n4- . , .\n"); int command = scanOne(); while (command > 4 || command < 0) { @@ -25,7 +25,7 @@ bool talkWithUser(void) { switch (command) { case 1: - printf(" . 100 \n"); + printf(" . 100 , \n"); int size = scanOne(); while (size < 0 || size > 100) { while (getchar() != '\n') { @@ -58,7 +58,6 @@ bool talkWithUser(void) { if (string != NULL) { printf("%s\n", string); } - printf(" !\n"); break; case 3: if (isKeyInTree(tree, key)) { @@ -67,14 +66,12 @@ bool talkWithUser(void) { else { printf(", !\n"); } - printf(" !\n"); break; case 4: - tree = deleteNodeInTreeByKey(tree, key); - printf(" !\n"); + deleteNodeInTreeByKey(tree, key); break; } - + printf(" !\n"); command = scanOne(); while (command > 4 || command < 0) { @@ -87,7 +84,18 @@ bool talkWithUser(void) { } bool test() { - return true; + FILE* file = fopen("test.txt", "r"); + if (file == NULL) { + return false; + } + char number = 0; + while (fscanf(file, "%c", &number) == 1) { + if (number >= '0' && number <= '9') { + + } else { + + } + } } int main() { From 83c3b491eab2bb47f369d2c6fc0240d87991b295 Mon Sep 17 00:00:00 2001 From: Artem Date: Wed, 23 Nov 2022 15:26:50 +0300 Subject: [PATCH 05/17] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BE=D0=B1=D0=B5=D1=80=D1=82=D0=BE?= =?UTF-8?q?=D0=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- avlTreeNew/AVLTree/AVLTree/AVLTree.vcxproj | 43 ++++++++++--------- .../AVLTree/AVLTree/AVLTree.vcxproj.filters | 13 ++++++ 2 files changed, 35 insertions(+), 21 deletions(-) diff --git a/avlTreeNew/AVLTree/AVLTree/AVLTree.vcxproj b/avlTreeNew/AVLTree/AVLTree/AVLTree.vcxproj index f2b10c1..f0960d1 100644 --- a/avlTreeNew/AVLTree/AVLTree/AVLTree.vcxproj +++ b/avlTreeNew/AVLTree/AVLTree/AVLTree.vcxproj @@ -17,7 +17,6 @@ Release x64 - 16.0 @@ -53,25 +52,23 @@ true Unicode - - + + + + + + + + + + + + + - - - - - - - - - - - - - true @@ -85,7 +82,6 @@ false - Level3 @@ -117,7 +113,7 @@ Level3 - true + false _DEBUG;_CONSOLE;%(PreprocessorDefinitions) true @@ -142,9 +138,14 @@ true - - + + + + + + + - + \ No newline at end of file diff --git a/avlTreeNew/AVLTree/AVLTree/AVLTree.vcxproj.filters b/avlTreeNew/AVLTree/AVLTree/AVLTree.vcxproj.filters index 153170c..52ac932 100644 --- a/avlTreeNew/AVLTree/AVLTree/AVLTree.vcxproj.filters +++ b/avlTreeNew/AVLTree/AVLTree/AVLTree.vcxproj.filters @@ -14,4 +14,17 @@ 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 From 491762c99040ae601ca3d171f399b30c612cfd48 Mon Sep 17 00:00:00 2001 From: Artem Date: Mon, 28 Nov 2022 22:19:37 +0300 Subject: [PATCH 06/17] =?UTF-8?q?=D0=A1=D0=B4=D0=B5=D0=BB=D0=B0=D0=BB=20?= =?UTF-8?q?=D0=B0=D0=B2=D1=82=D0=BE=D0=BC=D0=B0=D1=82=D0=B8=D1=87=D0=B5?= =?UTF-8?q?=D1=81=D0=BA=D0=B8=D0=B9=20=D0=B2=D0=B2=D0=BE=D0=B4=20=D1=87?= =?UTF-8?q?=D0=B5=D1=80=D0=B5=D0=B7=20=D1=84=D0=B0=D0=B9=D0=BB,=20=D1=87?= =?UTF-8?q?=D1=82=D0=BE=D0=B1=D1=8B=20=D0=BB=D0=B5=D0=B3=D1=87=D0=B5=20?= =?UTF-8?q?=D0=B1=D1=8B=D0=BB=D0=BE=20=D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80?= =?UTF-8?q?=D1=8F=D1=82=D1=8C=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D1=83=20?= =?UTF-8?q?=D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- avlTreeNew/AVLTree/AVLTree/AVLTree.vcxproj | 3 +++ .../AVLTree/AVLTree/AVLTree.vcxproj.filters | 5 +++++ avlTreeNew/AVLTree/AVLTree/main.c | 15 ++++++++------- 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/avlTreeNew/AVLTree/AVLTree/AVLTree.vcxproj b/avlTreeNew/AVLTree/AVLTree/AVLTree.vcxproj index f0960d1..37f8f2d 100644 --- a/avlTreeNew/AVLTree/AVLTree/AVLTree.vcxproj +++ b/avlTreeNew/AVLTree/AVLTree/AVLTree.vcxproj @@ -145,6 +145,9 @@ + + + diff --git a/avlTreeNew/AVLTree/AVLTree/AVLTree.vcxproj.filters b/avlTreeNew/AVLTree/AVLTree/AVLTree.vcxproj.filters index 52ac932..6c249d4 100644 --- a/avlTreeNew/AVLTree/AVLTree/AVLTree.vcxproj.filters +++ b/avlTreeNew/AVLTree/AVLTree/AVLTree.vcxproj.filters @@ -27,4 +27,9 @@ Исходные файлы + + + Исходные файлы + + \ No newline at end of file diff --git a/avlTreeNew/AVLTree/AVLTree/main.c b/avlTreeNew/AVLTree/AVLTree/main.c index 42115f3..b2ae24d 100644 --- a/avlTreeNew/AVLTree/AVLTree/main.c +++ b/avlTreeNew/AVLTree/AVLTree/main.c @@ -88,14 +88,15 @@ bool test() { if (file == NULL) { return false; } - char number = 0; - while (fscanf(file, "%c", &number) == 1) { - if (number >= '0' && number <= '9') { - - } else { - - } + int key = 0; + char string[2] = { 'a', '\0' }; + Tree* tree = createTree(); + while (fscanf(file, "%d", &key) == 1) { + addToTree(tree, key, string); } + + deleteNodeInTreeByKey(tree, 100); + fclose(file); } int main() { From 37e1e830ccb79fe189079df124455b09156ef83b Mon Sep 17 00:00:00 2001 From: Artem Date: Tue, 29 Nov 2022 20:11:23 +0300 Subject: [PATCH 07/17] =?UTF-8?q?=D0=A1=D0=B4=D0=B5=D0=BB=D0=B0=D0=BB=20?= =?UTF-8?q?=D1=83=D0=B4=D0=B0=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B8=20?= =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB=20=D1=82=D0=B5=D1=81?= =?UTF-8?q?=D1=82=20=D1=81=20=D0=BF=D0=BE=D0=BC=D0=BE=D1=89=D1=8C=D1=8E=20?= =?UTF-8?q?=D1=84=D0=B0=D0=B9=D0=BB=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- avlTreeNew/AVLTree/AVLTree/avlTree.c | 107 +++++++++++++++------------ avlTreeNew/AVLTree/AVLTree/avlTree.h | 2 +- avlTreeNew/AVLTree/AVLTree/main.c | 26 +++++-- avlTreeNew/AVLTree/AVLTree/test.txt | 1 + 4 files changed, 81 insertions(+), 55 deletions(-) create mode 100644 avlTreeNew/AVLTree/AVLTree/test.txt diff --git a/avlTreeNew/AVLTree/AVLTree/avlTree.c b/avlTreeNew/AVLTree/AVLTree/avlTree.c index d1d745d..6c9b207 100644 --- a/avlTreeNew/AVLTree/AVLTree/avlTree.c +++ b/avlTreeNew/AVLTree/AVLTree/avlTree.c @@ -1,4 +1,5 @@ #include "avlTree.h" +#include #include #include @@ -51,34 +52,34 @@ Node* rotateLeft(Node* a) { Node* b = a->right; Node* c = b->left; + if (a->left == NULL) { + if (b->left == NULL) { + a->data.balance = 0; + } else { + a->data.balance = b->left->data.balance + 1; + } + } else { + a->data.balance = b->left->data.balance - a->left->data.balance; + } + b->data.balance = b->right->data.balance - a->data.balance; b->left = a; a->right = c; return b; } - -Node* bigRotateLeft(Node* a) { - Node* b = a->right; - Node* c = b->left; - a->right = c->left; - b->left = c->right; - c->left = a; - c->right = b; - return c; -} - -Node* bigRotateRight(Node* a) { - Node* b = a->left; - Node* c = b->right; - a->left = c->right; - b->right = c->left; - c->left = b; - c->right = a; - return c; -} - + Node* rotateRight(Node* a) { Node* b = a->left; Node* c = b->right; + if (a->right == NULL) { + if (b->right == NULL) { + a->data.balance = 0; + } else { + a->data.balance = b->right->data.balance + 1; + } + } else { + a->data.balance = b->right->data.balance - a->right->data.balance; + } + b->data.balance = b->left->data.balance - a->data.balance; b->right = a; a->left = c; return b; @@ -86,19 +87,19 @@ Node* rotateRight(Node* a) { Node* balance(Node* node) { if (node->data.balance == 2) { - if (node->right->data.balance >= 0) - return rotateLeft(node); - return bigRotateLeft(node); + if (node->right->data.balance < 0) + node->right = rotateLeft(node->right); + return rotateLeft(node); } if (node->data.balance == -2) { - if (node->left->data.balance <= 0) - return rotateRight(node); - return bigRotateRight(node); + if (node->left->data.balance > 0) + node->left = rotateRight(node->left); + return rotateRight(node); } return node; } -Node* helpedToInsert(Node* root, int key, char* string) { +Node* helpedToInsert(Node* root, int key, char* string, const bool isKeyInTree) { if (root == NULL) { Node* newNode = createElementTree(); newNode->data.value = string; @@ -110,18 +111,22 @@ Node* helpedToInsert(Node* root, int key, char* string) { return root; } if (key < root->data.key) { - root->left = helpedToInsert(root->left, key, string); - --root->data.balance; + root->left = helpedToInsert(root->left, key, string, isKeyInTree); + if (!isKeyInTree) { + --root->data.balance; + } } else { - root->right = helpedToInsert(root->right, key, string); - ++root->data.balance; + root->right = helpedToInsert(root->right, key, string, isKeyInTree); + if (!isKeyInTree) { + ++root->data.balance; + } } return balance(root); } void addToTree(Tree* tree, int key, char* string) { - tree->root = helpedToInsert(tree->root, key, string); + tree->root = helpedToInsert(tree->root, key, string, isKeyInTree(tree, key)); } char* returnValueByKey(Tree* tree, int key) { @@ -164,11 +169,13 @@ bool isKeyInTree(Tree* tree, int key) { return false; } -Node* deleteNode(Node* root, int key, Tree* tree, Node* previousRoot, Node* theMostBigLeft, bool firstLeft) { - if (!firstLeft && theMostBigLeft->right == NULL) {//!firstLeft && theMostBigLeft->right == NULL || root->left->right == NULL +Node* deleteNode(Node* root, int key, Tree* tree, Node* previousRoot, Node* theMostBigLeft, bool firstLeft, const bool ifUseFile) { + if (!firstLeft && theMostBigLeft->right == NULL) { Node* tempLeft = root->left; - free(root->data.value); - root->data.value = theMostBigLeft->data.value; + if (!ifUseFile) { + free(root->data.value); + root->data.value = theMostBigLeft->data.value; + } root->data.key = theMostBigLeft->data.key; if (theMostBigLeft->left != NULL) { root->left = theMostBigLeft->left; @@ -180,32 +187,33 @@ Node* deleteNode(Node* root, int key, Tree* tree, Node* previousRoot, Node* theM return NULL; } else { if (firstLeft) { - root->left = deleteNode(root, key, tree, previousRoot, root->left, false); -/// ++theMostBigLeft->data.balance;// + return + root->left = deleteNode(root, key, tree, previousRoot, root->left, false, ifUseFile); if (root->left == NULL) { - return root; + return balance(root); } + return balance(root); } else { - theMostBigLeft->right = deleteNode(root, key, tree, previousRoot, theMostBigLeft->right, false); + theMostBigLeft->right = deleteNode(root, key, tree, previousRoot, theMostBigLeft->right, false, ifUseFile); --theMostBigLeft->data.balance; if (theMostBigLeft->right == NULL) { return theMostBigLeft; } - // return } } return balance(theMostBigLeft); } -Node* helpDeleteNodeInTreeByKey(Node* root, int key, Tree* tree, Node* previousRoot) { +Node* helpDeleteNodeInTreeByKey(Node* root, int key, Tree* tree, Node* previousRoot, const bool ifUseFile) { if (root == NULL) { return NULL; } if (root->data.key == key) { if (root->left == NULL) { Node* temp = root->right; - free(root->data.value); + if (!ifUseFile) { + free(root->data.value); + } free(root); if (previousRoot == NULL) { tree->root = temp; @@ -218,7 +226,7 @@ Node* helpDeleteNodeInTreeByKey(Node* root, int key, Tree* tree, Node* previousR } return temp; } - root = deleteNode(root, key, tree, previousRoot, NULL, true); + root = deleteNode(root, key, tree, previousRoot, NULL, true, ifUseFile); if (previousRoot == NULL) { tree->root = root; } else { @@ -229,20 +237,21 @@ Node* helpDeleteNodeInTreeByKey(Node* root, int key, Tree* tree, Node* previousR previousRoot->left = root; } } + return root; } if (key < root->data.key) { - root->left = helpDeleteNodeInTreeByKey(root->left, key, tree, root); + root->left = helpDeleteNodeInTreeByKey(root->left, key, tree, root, ifUseFile); ++root->data.balance; } else { - root->right = helpDeleteNodeInTreeByKey(root->right, key, tree, root); + root->right = helpDeleteNodeInTreeByKey(root->right, key, tree, root, ifUseFile); --root->data.balance; } return balance(root); } -void deleteNodeInTreeByKey(Tree* tree, int key) { +void deleteNodeInTreeByKey(Tree* tree, int key, const bool ifUseFile) { if (isKeyInTree(tree, key)) { - tree->root = helpDeleteNodeInTreeByKey(tree->root, key, tree, NULL); + tree->root = helpDeleteNodeInTreeByKey(tree->root, key, tree, NULL, ifUseFile); } } \ No newline at end of file diff --git a/avlTreeNew/AVLTree/AVLTree/avlTree.h b/avlTreeNew/AVLTree/AVLTree/avlTree.h index c7a1207..cb9077b 100644 --- a/avlTreeNew/AVLTree/AVLTree/avlTree.h +++ b/avlTreeNew/AVLTree/AVLTree/avlTree.h @@ -20,5 +20,5 @@ char* returnValueByKey(Tree* tree, int key); bool isKeyInTree(Tree* tree, int key); // -void deleteNodeInTreeByKey(Tree* tree, int key); +void deleteNodeInTreeByKey(Tree* tree, int key, const bool ifUseFile); #endif \ No newline at end of file diff --git a/avlTreeNew/AVLTree/AVLTree/main.c b/avlTreeNew/AVLTree/AVLTree/main.c index b2ae24d..5b067db 100644 --- a/avlTreeNew/AVLTree/AVLTree/main.c +++ b/avlTreeNew/AVLTree/AVLTree/main.c @@ -68,7 +68,7 @@ bool talkWithUser(void) { } break; case 4: - deleteNodeInTreeByKey(tree, key); + deleteNodeInTreeByKey(tree, key, false); break; } printf(" !\n"); @@ -88,15 +88,31 @@ bool test() { if (file == NULL) { return false; } - int key = 0; - char string[2] = { 'a', '\0' }; Tree* tree = createTree(); + int key = 0; + char string[2] = {'\0'}; + string[0] = 'a'; while (fscanf(file, "%d", &key) == 1) { addToTree(tree, key, string); } - - deleteNodeInTreeByKey(tree, 100); fclose(file); + + if (!isKeyInTree(tree, 100)) { + return false; + } + deleteNodeInTreeByKey(tree, 100, true); + if (isKeyInTree(tree, 100)) { + return false; + } + deleteNodeInTreeByKey(tree, 80, true); + char stringForCheck[2] = { '\0' }; + stringForCheck[0] = 'a'; + if (strcmp(returnValueByKey(tree, 120), stringForCheck) != 0) { + return false; + } + deleteNodeInTreeByKey(tree, 120, true); + clearTree(tree); + return true; } int main() { diff --git a/avlTreeNew/AVLTree/AVLTree/test.txt b/avlTreeNew/AVLTree/AVLTree/test.txt new file mode 100644 index 0000000..8158173 --- /dev/null +++ b/avlTreeNew/AVLTree/AVLTree/test.txt @@ -0,0 +1 @@ +120 100 80 \ No newline at end of file From 12fc418e7d6a79f92ef545af7482aa6460b8149a Mon Sep 17 00:00:00 2001 From: Artem Date: Tue, 29 Nov 2022 20:21:53 +0300 Subject: [PATCH 08/17] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D0=BD=D0=B5?= =?UTF-8?q?=D1=81=20=D1=82=D0=B5=D1=81=D1=82=20=D0=B2=20=D0=BE=D1=82=D0=B4?= =?UTF-8?q?=D0=B5=D0=BB=D1=8C=D0=BD=D1=8B=D0=B9=20=D1=84=D0=B0=D0=B9=D0=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- avlTreeNew/AVLTree/AVLTree/AVLTree.vcxproj | 2 + .../AVLTree/AVLTree/AVLTree.vcxproj.filters | 6 +++ avlTreeNew/AVLTree/AVLTree/main.c | 35 +----------------- avlTreeNew/AVLTree/AVLTree/test.c | 37 +++++++++++++++++++ avlTreeNew/AVLTree/AVLTree/test.h | 8 ++++ 5 files changed, 55 insertions(+), 33 deletions(-) create mode 100644 avlTreeNew/AVLTree/AVLTree/test.c create mode 100644 avlTreeNew/AVLTree/AVLTree/test.h diff --git a/avlTreeNew/AVLTree/AVLTree/AVLTree.vcxproj b/avlTreeNew/AVLTree/AVLTree/AVLTree.vcxproj index 37f8f2d..b30403d 100644 --- a/avlTreeNew/AVLTree/AVLTree/AVLTree.vcxproj +++ b/avlTreeNew/AVLTree/AVLTree/AVLTree.vcxproj @@ -141,9 +141,11 @@ + + diff --git a/avlTreeNew/AVLTree/AVLTree/AVLTree.vcxproj.filters b/avlTreeNew/AVLTree/AVLTree/AVLTree.vcxproj.filters index 6c249d4..aae4fd1 100644 --- a/avlTreeNew/AVLTree/AVLTree/AVLTree.vcxproj.filters +++ b/avlTreeNew/AVLTree/AVLTree/AVLTree.vcxproj.filters @@ -21,11 +21,17 @@ Исходные файлы + + Исходные файлы + Исходные файлы + + Исходные файлы + diff --git a/avlTreeNew/AVLTree/AVLTree/main.c b/avlTreeNew/AVLTree/AVLTree/main.c index 5b067db..ffcd8be 100644 --- a/avlTreeNew/AVLTree/AVLTree/main.c +++ b/avlTreeNew/AVLTree/AVLTree/main.c @@ -1,4 +1,5 @@ #include "avlTree.h" +#include "test.h" #include #include #include @@ -83,41 +84,9 @@ bool talkWithUser(void) { clearTree(tree); } -bool test() { - FILE* file = fopen("test.txt", "r"); - if (file == NULL) { - return false; - } - Tree* tree = createTree(); - int key = 0; - char string[2] = {'\0'}; - string[0] = 'a'; - while (fscanf(file, "%d", &key) == 1) { - addToTree(tree, key, string); - } - fclose(file); - - if (!isKeyInTree(tree, 100)) { - return false; - } - deleteNodeInTreeByKey(tree, 100, true); - if (isKeyInTree(tree, 100)) { - return false; - } - deleteNodeInTreeByKey(tree, 80, true); - char stringForCheck[2] = { '\0' }; - stringForCheck[0] = 'a'; - if (strcmp(returnValueByKey(tree, 120), stringForCheck) != 0) { - return false; - } - deleteNodeInTreeByKey(tree, 120, true); - clearTree(tree); - return true; -} - int main() { setlocale(LC_ALL, "RUS"); - if (test()) { + if (testForAvlTree()) { printf(" !\n"); } else { diff --git a/avlTreeNew/AVLTree/AVLTree/test.c b/avlTreeNew/AVLTree/AVLTree/test.c new file mode 100644 index 0000000..741ae5c --- /dev/null +++ b/avlTreeNew/AVLTree/AVLTree/test.c @@ -0,0 +1,37 @@ +#include "avlTree.h" +#include "test.h" +#include +#include +#include + +bool testForAvlTree() { + FILE* file = fopen("test.txt", "r"); + if (file == NULL) { + return false; + } + Tree* tree = createTree(); + int key = 0; + char string[2] = { '\0' }; + string[0] = 'a'; + while (fscanf(file, "%d", &key) == 1) { + addToTree(tree, key, string); + } + fclose(file); + + if (!isKeyInTree(tree, 100)) { + return false; + } + deleteNodeInTreeByKey(tree, 100, true); + if (isKeyInTree(tree, 100)) { + return false; + } + deleteNodeInTreeByKey(tree, 80, true); + char stringForCheck[2] = { '\0' }; + stringForCheck[0] = 'a'; + if (strcmp(returnValueByKey(tree, 120), stringForCheck) != 0) { + return false; + } + deleteNodeInTreeByKey(tree, 120, true); + clearTree(tree); + return true; +} \ No newline at end of file diff --git a/avlTreeNew/AVLTree/AVLTree/test.h b/avlTreeNew/AVLTree/AVLTree/test.h new file mode 100644 index 0000000..6a9d474 --- /dev/null +++ b/avlTreeNew/AVLTree/AVLTree/test.h @@ -0,0 +1,8 @@ +#ifndef TEST_H +#define TEST_H +#include + +//Tests for tree +bool testForAvlTree(); + +#endif \ No newline at end of file From 36634a5634accd691a63f0ea500fe074fd4e9f05 Mon Sep 17 00:00:00 2001 From: Artem Date: Tue, 13 Dec 2022 15:43:53 +0300 Subject: [PATCH 09/17] =?UTF-8?q?=D0=98=D0=B7=D0=BC=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- avlTreeNew/AVLTree/AVLTree/avlTree.c | 44 +++++++++++++++------------- 1 file changed, 24 insertions(+), 20 deletions(-) diff --git a/avlTreeNew/AVLTree/AVLTree/avlTree.c b/avlTreeNew/AVLTree/AVLTree/avlTree.c index 6c9b207..75acb2e 100644 --- a/avlTreeNew/AVLTree/AVLTree/avlTree.c +++ b/avlTreeNew/AVLTree/AVLTree/avlTree.c @@ -85,21 +85,23 @@ Node* rotateRight(Node* a) { return b; } -Node* balance(Node* node) { +Node* balance(Node* node, bool* wasBalance) { if (node->data.balance == 2) { if (node->right->data.balance < 0) node->right = rotateLeft(node->right); + *wasBalance = true; return rotateLeft(node); } if (node->data.balance == -2) { if (node->left->data.balance > 0) node->left = rotateRight(node->left); + *wasBalance = true; return rotateRight(node); } return node; } -Node* helpedToInsert(Node* root, int key, char* string, const bool isKeyInTree) { +Node* helpedToInsert(Node* root, int key, char* string, const bool isKeyInTree, bool* wasBalance) { if (root == NULL) { Node* newNode = createElementTree(); newNode->data.value = string; @@ -111,22 +113,23 @@ Node* helpedToInsert(Node* root, int key, char* string, const bool isKeyInTree) return root; } if (key < root->data.key) { - root->left = helpedToInsert(root->left, key, string, isKeyInTree); - if (!isKeyInTree) { + root->left = helpedToInsert(root->left, key, string, isKeyInTree, wasBalance); + if (!isKeyInTree && !*wasBalance) { --root->data.balance; } } else { - root->right = helpedToInsert(root->right, key, string, isKeyInTree); - if (!isKeyInTree) { + root->right = helpedToInsert(root->right, key, string, isKeyInTree, wasBalance); + if (!isKeyInTree && !*wasBalance) { ++root->data.balance; } } - return balance(root); + return balance(root, wasBalance); } void addToTree(Tree* tree, int key, char* string) { - tree->root = helpedToInsert(tree->root, key, string, isKeyInTree(tree, key)); + bool wasBalance = false; + tree->root = helpedToInsert(tree->root, key, string, isKeyInTree(tree, key), &wasBalance); } char* returnValueByKey(Tree* tree, int key) { @@ -169,7 +172,7 @@ bool isKeyInTree(Tree* tree, int key) { return false; } -Node* deleteNode(Node* root, int key, Tree* tree, Node* previousRoot, Node* theMostBigLeft, bool firstLeft, const bool ifUseFile) { +Node* deleteNode(Node* root, int key, Tree* tree, Node* previousRoot, Node* theMostBigLeft, bool firstLeft, const bool ifUseFile, bool* wasBalance) { if (!firstLeft && theMostBigLeft->right == NULL) { Node* tempLeft = root->left; if (!ifUseFile) { @@ -187,24 +190,24 @@ Node* deleteNode(Node* root, int key, Tree* tree, Node* previousRoot, Node* theM return NULL; } else { if (firstLeft) { - root->left = deleteNode(root, key, tree, previousRoot, root->left, false, ifUseFile); + root->left = deleteNode(root, key, tree, previousRoot, root->left, false, ifUseFile, wasBalance); if (root->left == NULL) { - return balance(root); + return balance(root, wasBalance); } - return balance(root); + return balance(root, wasBalance); } else { - theMostBigLeft->right = deleteNode(root, key, tree, previousRoot, theMostBigLeft->right, false, ifUseFile); + theMostBigLeft->right = deleteNode(root, key, tree, previousRoot, theMostBigLeft->right, false, ifUseFile, wasBalance); --theMostBigLeft->data.balance; if (theMostBigLeft->right == NULL) { return theMostBigLeft; } } } - return balance(theMostBigLeft); + return balance(theMostBigLeft, wasBalance); } -Node* helpDeleteNodeInTreeByKey(Node* root, int key, Tree* tree, Node* previousRoot, const bool ifUseFile) { +Node* helpDeleteNodeInTreeByKey(Node* root, int key, Tree* tree, Node* previousRoot, const bool ifUseFile, bool* wasBalance) { if (root == NULL) { return NULL; } @@ -226,7 +229,7 @@ Node* helpDeleteNodeInTreeByKey(Node* root, int key, Tree* tree, Node* previousR } return temp; } - root = deleteNode(root, key, tree, previousRoot, NULL, true, ifUseFile); + root = deleteNode(root, key, tree, previousRoot, NULL, true, ifUseFile, wasBalance); if (previousRoot == NULL) { tree->root = root; } else { @@ -240,18 +243,19 @@ Node* helpDeleteNodeInTreeByKey(Node* root, int key, Tree* tree, Node* previousR return root; } if (key < root->data.key) { - root->left = helpDeleteNodeInTreeByKey(root->left, key, tree, root, ifUseFile); + root->left = helpDeleteNodeInTreeByKey(root->left, key, tree, root, ifUseFile, wasBalance); ++root->data.balance; } else { - root->right = helpDeleteNodeInTreeByKey(root->right, key, tree, root, ifUseFile); + root->right = helpDeleteNodeInTreeByKey(root->right, key, tree, root, ifUseFile, wasBalance); --root->data.balance; } - return balance(root); + return balance(root, wasBalance); } void deleteNodeInTreeByKey(Tree* tree, int key, const bool ifUseFile) { if (isKeyInTree(tree, key)) { - tree->root = helpDeleteNodeInTreeByKey(tree->root, key, tree, NULL, ifUseFile); + bool wasBalance = false; + tree->root = helpDeleteNodeInTreeByKey(tree->root, key, tree, NULL, ifUseFile, &wasBalance); } } \ No newline at end of file From d3dbad7bfe0013fc77d6c716446052d79776a655 Mon Sep 17 00:00:00 2001 From: Artem Date: Tue, 13 Dec 2022 15:45:42 +0300 Subject: [PATCH 10/17] =?UTF-8?q?=D0=98=D0=B7=D0=BC=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- avlTreeNew/AVLTree/AVLTree/main.c | 1 + avlTreeNew/AVLTree/AVLTree/test.c | 1 + 2 files changed, 2 insertions(+) diff --git a/avlTreeNew/AVLTree/AVLTree/main.c b/avlTreeNew/AVLTree/AVLTree/main.c index ffcd8be..a599c2c 100644 --- a/avlTreeNew/AVLTree/AVLTree/main.c +++ b/avlTreeNew/AVLTree/AVLTree/main.c @@ -93,6 +93,7 @@ int main() { printf("...\n"); return -1; } + if (!talkWithUser()) { printf("...\n"); return -1; diff --git a/avlTreeNew/AVLTree/AVLTree/test.c b/avlTreeNew/AVLTree/AVLTree/test.c index 741ae5c..76e7d57 100644 --- a/avlTreeNew/AVLTree/AVLTree/test.c +++ b/avlTreeNew/AVLTree/AVLTree/test.c @@ -3,6 +3,7 @@ #include #include #include +#include bool testForAvlTree() { FILE* file = fopen("test.txt", "r"); From a34e062f68ac4529843fe6fda07740e7c4ab1e93 Mon Sep 17 00:00:00 2001 From: Artem Date: Wed, 14 Dec 2022 14:54:43 +0300 Subject: [PATCH 11/17] =?UTF-8?q?=D0=98=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=B1=D0=B0=D0=BB=D0=B0=D0=BD=D1=81=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- avlTreeNew/AVLTree/AVLTree/avlTree.c | 26 ++++++++++---------------- 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/avlTreeNew/AVLTree/AVLTree/avlTree.c b/avlTreeNew/AVLTree/AVLTree/avlTree.c index 75acb2e..341eac1 100644 --- a/avlTreeNew/AVLTree/AVLTree/avlTree.c +++ b/avlTreeNew/AVLTree/AVLTree/avlTree.c @@ -52,16 +52,13 @@ Node* rotateLeft(Node* a) { Node* b = a->right; Node* c = b->left; - if (a->left == NULL) { - if (b->left == NULL) { - a->data.balance = 0; - } else { - a->data.balance = b->left->data.balance + 1; - } + if (b->data.balance == 0) { + b->data.balance = 1; + a->data.balance = -1; } else { - a->data.balance = b->left->data.balance - a->left->data.balance; + b->data.balance = 0; + a->data.balance = 0; } - b->data.balance = b->right->data.balance - a->data.balance; b->left = a; a->right = c; return b; @@ -70,16 +67,13 @@ Node* rotateLeft(Node* a) Node* rotateRight(Node* a) { Node* b = a->left; Node* c = b->right; - if (a->right == NULL) { - if (b->right == NULL) { - a->data.balance = 0; - } else { - a->data.balance = b->right->data.balance + 1; - } + if (b->data.balance == 0) { + b->data.balance = -1; + a->data.balance = 1; } else { - a->data.balance = b->right->data.balance - a->right->data.balance; + a->data.balance = 0; + b->data.balance = 0; } - b->data.balance = b->left->data.balance - a->data.balance; b->right = a; a->left = c; return b; From 91f74d88f5430f09304a19428ec4213a09b24698 Mon Sep 17 00:00:00 2001 From: Artem Date: Fri, 16 Dec 2022 19:00:24 +0300 Subject: [PATCH 12/17] =?UTF-8?q?=D0=A3=D0=BB=D1=83=D1=87=D1=88=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=20=D1=8D=D0=BB=D0=B5=D0=BC=D0=B5=D0=BD=D1=82=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- avlTreeNew/AVLTree/AVLTree/avlTree.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/avlTreeNew/AVLTree/AVLTree/avlTree.c b/avlTreeNew/AVLTree/AVLTree/avlTree.c index 341eac1..ec43b6e 100644 --- a/avlTreeNew/AVLTree/AVLTree/avlTree.c +++ b/avlTreeNew/AVLTree/AVLTree/avlTree.c @@ -118,6 +118,9 @@ Node* helpedToInsert(Node* root, int key, char* string, const bool isKeyInTree, ++root->data.balance; } } + if (root->data.balance == 0) { + *wasBalance = true; + } return balance(root, wasBalance); } From df1ca151e5b959e6ddb5346d60128aff1da7b50d Mon Sep 17 00:00:00 2001 From: Artem Date: Thu, 22 Dec 2022 20:38:52 +0300 Subject: [PATCH 13/17] =?UTF-8?q?=D0=98=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20int=20=D0=BA=D0=BB=D1=8E=D1=87=D0=B5=D0=B9?= =?UTF-8?q?=20=D0=BD=D0=B0=20char=20=D0=BA=D0=BB=D1=8E=D1=87=D0=B8=20?= =?UTF-8?q?=D0=B8=20=D0=BA=D0=BE=D1=80=D0=B5=D0=BA=D1=82=D0=B8=D1=80=D0=BE?= =?UTF-8?q?=D0=B2=D0=BA=D0=B8=20=D0=B2=20=D1=84=D1=83=D0=BD=D0=BA=D1=86?= =?UTF-8?q?=D0=B8=D1=8F=D1=85=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F=20=D0=B8=20=D1=83=D0=B4=D0=B0=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- avlTreeNew/AVLTree/AVLTree/avlTree.c | 123 +++++++++++++++------------ avlTreeNew/AVLTree/AVLTree/avlTree.h | 9 +- avlTreeNew/AVLTree/AVLTree/main.c | 13 ++- avlTreeNew/AVLTree/AVLTree/test.c | 44 ++++++---- avlTreeNew/AVLTree/AVLTree/test.txt | 1 - 5 files changed, 111 insertions(+), 79 deletions(-) delete mode 100644 avlTreeNew/AVLTree/AVLTree/test.txt diff --git a/avlTreeNew/AVLTree/AVLTree/avlTree.c b/avlTreeNew/AVLTree/AVLTree/avlTree.c index ec43b6e..a068bac 100644 --- a/avlTreeNew/AVLTree/AVLTree/avlTree.c +++ b/avlTreeNew/AVLTree/AVLTree/avlTree.c @@ -2,9 +2,10 @@ #include #include #include +#include typedef struct Value { - int key; + char key[100]; char* value; int balance; } Value; @@ -79,67 +80,69 @@ Node* rotateRight(Node* a) { return b; } -Node* balance(Node* node, bool* wasBalance) { +Node* balance(Node* node) { if (node->data.balance == 2) { if (node->right->data.balance < 0) node->right = rotateLeft(node->right); - *wasBalance = true; - return rotateLeft(node); + return rotateLeft(node); } if (node->data.balance == -2) { if (node->left->data.balance > 0) node->left = rotateRight(node->left); - *wasBalance = true; return rotateRight(node); } return node; } -Node* helpedToInsert(Node* root, int key, char* string, const bool isKeyInTree, bool* wasBalance) { +Node* helpedToInsert(Node* root, const char* key, char* string, const bool isKeyInTree, bool* needToChangeBalance) { if (root == NULL) { Node* newNode = createElementTree(); newNode->data.value = string; - newNode->data.key = key; + strcpy(newNode->data.key, key); return newNode; } - if (root->data.key == key) { + if (strcmp(root->data.key, key) == 0) { root->data.value = string; return root; } - if (key < root->data.key) { - root->left = helpedToInsert(root->left, key, string, isKeyInTree, wasBalance); - if (!isKeyInTree && !*wasBalance) { + if (strcmp(key, root->data.key) == -1) { + root->left = helpedToInsert(root->left, key, string, isKeyInTree, needToChangeBalance); + if (!isKeyInTree && !*needToChangeBalance) { --root->data.balance; } } else { - root->right = helpedToInsert(root->right, key, string, isKeyInTree, wasBalance); - if (!isKeyInTree && !*wasBalance) { + root->right = helpedToInsert(root->right, key, string, isKeyInTree, needToChangeBalance); + if (!isKeyInTree && !*needToChangeBalance) { ++root->data.balance; } } if (root->data.balance == 0) { - *wasBalance = true; + *needToChangeBalance = true; } - return balance(root, wasBalance); + Node* temp = balance(root); + if (temp->data.balance == 0) { + *needToChangeBalance = true; + } + return temp; } -void addToTree(Tree* tree, int key, char* string) { - bool wasBalance = false; - tree->root = helpedToInsert(tree->root, key, string, isKeyInTree(tree, key), &wasBalance); +void addToTree(Tree* tree, const char* key, char* string) { + bool needToChangeBalance = false; + tree->root = helpedToInsert(tree->root, key, string, isKeyInTree(tree, key), &needToChangeBalance); } -char* returnValueByKey(Tree* tree, int key) { +char* returnValueByKey(Tree* tree, const char* key) { if (tree == NULL) { return NULL; } Node* walker = tree->root; while (walker != NULL) { - if (walker->data.key == key) { + if (strcmp(walker->data.key, key) == 0) { return walker->data.value; } - if (walker->data.key < key) { + if (strcmp(walker->data.key, key) == -1) { walker = walker->right; } else { @@ -149,17 +152,17 @@ char* returnValueByKey(Tree* tree, int key) { return NULL; } -bool isKeyInTree(Tree* tree, int key) { +bool isKeyInTree(Tree* tree, const char* key) { if (tree == NULL) { return false; } Node* walker = tree->root; while (walker != NULL) { - if (walker->data.key == key) { + if (strcmp(walker->data.key, key) == 0) { return true; } - if (walker->data.key < key) { + if (strcmp(walker->data.key, key) == -1) { walker = walker->right; } else { @@ -169,14 +172,12 @@ bool isKeyInTree(Tree* tree, int key) { return false; } -Node* deleteNode(Node* root, int key, Tree* tree, Node* previousRoot, Node* theMostBigLeft, bool firstLeft, const bool ifUseFile, bool* wasBalance) { +Node* deleteNode(Node* root, const char* key, Tree* tree, Node* previousRoot, Node* theMostBigLeft, bool firstLeft, bool* needToChangeBalance) { if (!firstLeft && theMostBigLeft->right == NULL) { Node* tempLeft = root->left; - if (!ifUseFile) { - free(root->data.value); - root->data.value = theMostBigLeft->data.value; - } - root->data.key = theMostBigLeft->data.key; + free(root->data.value); + root->data.value = theMostBigLeft->data.value; + strcpy(root->data.key, theMostBigLeft->data.key); if (theMostBigLeft->left != NULL) { root->left = theMostBigLeft->left; root->left->left = tempLeft; @@ -187,50 +188,51 @@ Node* deleteNode(Node* root, int key, Tree* tree, Node* previousRoot, Node* theM return NULL; } else { if (firstLeft) { - root->left = deleteNode(root, key, tree, previousRoot, root->left, false, ifUseFile, wasBalance); + root->left = deleteNode(root, key, tree, previousRoot, root->left, false, needToChangeBalance); if (root->left == NULL) { - return balance(root, wasBalance); + return balance(root); } - return balance(root, wasBalance); + return balance(root); } else { - theMostBigLeft->right = deleteNode(root, key, tree, previousRoot, theMostBigLeft->right, false, ifUseFile, wasBalance); + theMostBigLeft->right = deleteNode(root, key, tree, previousRoot, theMostBigLeft->right, false, needToChangeBalance); --theMostBigLeft->data.balance; if (theMostBigLeft->right == NULL) { return theMostBigLeft; } } } - return balance(theMostBigLeft, wasBalance); + return balance(theMostBigLeft); } -Node* helpDeleteNodeInTreeByKey(Node* root, int key, Tree* tree, Node* previousRoot, const bool ifUseFile, bool* wasBalance) { +Node* helpDeleteNodeInTreeByKey(Node* root, const char* key, Tree* tree, Node* previousRoot, bool* needToChangeBalance) { if (root == NULL) { return NULL; } - if (root->data.key == key) { + if (strcmp(root->data.key, key) == 0) { if (root->left == NULL) { Node* temp = root->right; - if (!ifUseFile) { - free(root->data.value); - } + free(root->data.value); free(root); if (previousRoot == NULL) { tree->root = temp; - } else { - if (previousRoot->data.key < key) { + } + else { + if (strcmp(previousRoot->data.key, key) == -1) { previousRoot->right = temp; - } else { + } + else { previousRoot->left = temp; } } return temp; } - root = deleteNode(root, key, tree, previousRoot, NULL, true, ifUseFile, wasBalance); + root = deleteNode(root, key, tree, previousRoot, NULL, true, needToChangeBalance); if (previousRoot == NULL) { tree->root = root; - } else { - if (previousRoot->data.key < key) { + } + else { + if (strcmp(previousRoot->data.key, key) == -1) { previousRoot->right = root; } else { @@ -239,20 +241,31 @@ Node* helpDeleteNodeInTreeByKey(Node* root, int key, Tree* tree, Node* previousR } return root; } - if (key < root->data.key) { - root->left = helpDeleteNodeInTreeByKey(root->left, key, tree, root, ifUseFile, wasBalance); - ++root->data.balance; + if (strcmp(key, root->data.key) == -1) { + root->left = helpDeleteNodeInTreeByKey(root->left, key, tree, root, needToChangeBalance); + if (!*needToChangeBalance) { + ++root->data.balance; + } } else { - root->right = helpDeleteNodeInTreeByKey(root->right, key, tree, root, ifUseFile, wasBalance); - --root->data.balance; + root->right = helpDeleteNodeInTreeByKey(root->right, key, tree, root, needToChangeBalance); + if (!*needToChangeBalance) { + --root->data.balance; + } + } + if (root->data.balance == -1 || root->data.balance == 1) { + *needToChangeBalance = true; } - return balance(root, wasBalance); + Node* temp = balance(root); + if (temp->data.balance == -1 || temp->data.balance == 1) { + *needToChangeBalance = true; + } + return temp; } -void deleteNodeInTreeByKey(Tree* tree, int key, const bool ifUseFile) { +void deleteNodeInTreeByKey(Tree* tree, const char* key) { if (isKeyInTree(tree, key)) { - bool wasBalance = false; - tree->root = helpDeleteNodeInTreeByKey(tree->root, key, tree, NULL, ifUseFile, &wasBalance); + bool needToChangeBalance = false; + tree->root = helpDeleteNodeInTreeByKey(tree->root, key, tree, NULL, &needToChangeBalance); } } \ No newline at end of file diff --git a/avlTreeNew/AVLTree/AVLTree/avlTree.h b/avlTreeNew/AVLTree/AVLTree/avlTree.h index cb9077b..2f53d48 100644 --- a/avlTreeNew/AVLTree/AVLTree/avlTree.h +++ b/avlTreeNew/AVLTree/AVLTree/avlTree.h @@ -11,14 +11,15 @@ Tree* createTree(void); void clearTree(Tree* tree); // -void addToTree(Tree* tree, int key, char* string); +void addToTree(Tree* tree, const char* key, char* string); // -char* returnValueByKey(Tree* tree, int key); +char* returnValueByKey(Tree* tree, const char* key); // -bool isKeyInTree(Tree* tree, int key); +bool isKeyInTree(Tree* tree, const char* key); // -void deleteNodeInTreeByKey(Tree* tree, int key, const bool ifUseFile); +void deleteNodeInTreeByKey(Tree* tree, const char* key); + #endif \ No newline at end of file diff --git a/avlTreeNew/AVLTree/AVLTree/main.c b/avlTreeNew/AVLTree/AVLTree/main.c index a599c2c..46cd4e1 100644 --- a/avlTreeNew/AVLTree/AVLTree/main.c +++ b/avlTreeNew/AVLTree/AVLTree/main.c @@ -21,8 +21,15 @@ bool talkWithUser(void) { char* stringCopy = NULL; while (command != 0) { - printf(" \n"); - int key = scanOne(); + printf(" . , 100 \n"); + char key[100] = { '\0' }; + int checkScanfKey = scanf("%s", key); + while (checkScanfKey != 1) { + while (getchar() != '\n') { + } + printf("...\n"); + checkScanfKey = scanf("%s", key); + } switch (command) { case 1: @@ -69,7 +76,7 @@ bool talkWithUser(void) { } break; case 4: - deleteNodeInTreeByKey(tree, key, false); + deleteNodeInTreeByKey(tree, key); break; } printf(" !\n"); diff --git a/avlTreeNew/AVLTree/AVLTree/test.c b/avlTreeNew/AVLTree/AVLTree/test.c index 76e7d57..f34426b 100644 --- a/avlTreeNew/AVLTree/AVLTree/test.c +++ b/avlTreeNew/AVLTree/AVLTree/test.c @@ -6,33 +6,45 @@ #include bool testForAvlTree() { - FILE* file = fopen("test.txt", "r"); - if (file == NULL) { + Tree* tree = createTree(); + char* string1 = calloc(2, sizeof(char)); + if (string1 == NULL) { return false; } - Tree* tree = createTree(); - int key = 0; - char string[2] = { '\0' }; - string[0] = 'a'; - while (fscanf(file, "%d", &key) == 1) { - addToTree(tree, key, string); + string1[0] = 'a'; + char key1[] = "320"; + addToTree(tree, key1, string1); + char* string2 = calloc(2, sizeof(char)); + if (string2 == NULL) { + free(string1); + return false; } - fclose(file); - - if (!isKeyInTree(tree, 100)) { + string2[0] = 'b'; + char key2[] = "200"; + addToTree(tree, key2, string2); + char* string3 = calloc(2, sizeof(char)); + if (string3 == NULL) { + free(string1); + free(string2); + return false; + } + string3[0] = 'c'; + char key3[] = "100"; + addToTree(tree, key3, string3); + if (!isKeyInTree(tree, "100")) { return false; } - deleteNodeInTreeByKey(tree, 100, true); - if (isKeyInTree(tree, 100)) { + deleteNodeInTreeByKey(tree, "100", true); + if (isKeyInTree(tree, "100")) { return false; } - deleteNodeInTreeByKey(tree, 80, true); + deleteNodeInTreeByKey(tree, "200", true); char stringForCheck[2] = { '\0' }; stringForCheck[0] = 'a'; - if (strcmp(returnValueByKey(tree, 120), stringForCheck) != 0) { + if (strcmp(returnValueByKey(tree, "320"), stringForCheck) != 0) { return false; } - deleteNodeInTreeByKey(tree, 120, true); + deleteNodeInTreeByKey(tree, "320", true); clearTree(tree); return true; } \ No newline at end of file diff --git a/avlTreeNew/AVLTree/AVLTree/test.txt b/avlTreeNew/AVLTree/AVLTree/test.txt deleted file mode 100644 index 8158173..0000000 --- a/avlTreeNew/AVLTree/AVLTree/test.txt +++ /dev/null @@ -1 +0,0 @@ -120 100 80 \ No newline at end of file From b85013ea46500e94a4e7922313566ca4fe2f847b Mon Sep 17 00:00:00 2001 From: Artem Date: Thu, 22 Dec 2022 21:47:11 +0300 Subject: [PATCH 14/17] =?UTF-8?q?=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=BD=D0=B5=D0=BC=D0=BD=D0=BE=D0=B3=D0=BE=20=D1=84?= =?UTF-8?q?=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D1=8E=20=D1=83=D0=B4=D0=B0=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- avlTreeNew/AVLTree/AVLTree/AVLTree.vcxproj | 3 --- .../AVLTree/AVLTree/AVLTree.vcxproj.filters | 5 ----- avlTreeNew/AVLTree/AVLTree/avlTree.c | 18 +++++++++++++----- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/avlTreeNew/AVLTree/AVLTree/AVLTree.vcxproj b/avlTreeNew/AVLTree/AVLTree/AVLTree.vcxproj index b30403d..fca2ebb 100644 --- a/avlTreeNew/AVLTree/AVLTree/AVLTree.vcxproj +++ b/avlTreeNew/AVLTree/AVLTree/AVLTree.vcxproj @@ -147,9 +147,6 @@ - - - diff --git a/avlTreeNew/AVLTree/AVLTree/AVLTree.vcxproj.filters b/avlTreeNew/AVLTree/AVLTree/AVLTree.vcxproj.filters index aae4fd1..3ef73b8 100644 --- a/avlTreeNew/AVLTree/AVLTree/AVLTree.vcxproj.filters +++ b/avlTreeNew/AVLTree/AVLTree/AVLTree.vcxproj.filters @@ -33,9 +33,4 @@ Исходные файлы - - - Исходные файлы - - \ No newline at end of file diff --git a/avlTreeNew/AVLTree/AVLTree/avlTree.c b/avlTreeNew/AVLTree/AVLTree/avlTree.c index a068bac..5335994 100644 --- a/avlTreeNew/AVLTree/AVLTree/avlTree.c +++ b/avlTreeNew/AVLTree/AVLTree/avlTree.c @@ -189,20 +189,28 @@ Node* deleteNode(Node* root, const char* key, Tree* tree, Node* previousRoot, No } else { if (firstLeft) { root->left = deleteNode(root, key, tree, previousRoot, root->left, false, needToChangeBalance); - if (root->left == NULL) { - return balance(root); + if (!*needToChangeBalance) { + ++root->data.balance; } - return balance(root); } else { theMostBigLeft->right = deleteNode(root, key, tree, previousRoot, theMostBigLeft->right, false, needToChangeBalance); - --theMostBigLeft->data.balance; + if (!*needToChangeBalance) { + --theMostBigLeft->data.balance; + } if (theMostBigLeft->right == NULL) { return theMostBigLeft; } } } - return balance(theMostBigLeft); + if (root->data.balance == -1 || root->data.balance == 1) { + *needToChangeBalance = true; + } + Node* temp = balance(theMostBigLeft); + if (temp->data.balance == -1 || temp->data.balance == 1) { + *needToChangeBalance = true; + } + return temp; } Node* helpDeleteNodeInTreeByKey(Node* root, const char* key, Tree* tree, Node* previousRoot, bool* needToChangeBalance) { From 8b904fc87c717cd3e9e127f1a4a9ed322577ac61 Mon Sep 17 00:00:00 2001 From: Artem Date: Fri, 23 Dec 2022 00:13:29 +0300 Subject: [PATCH 15/17] =?UTF-8?q?=D0=98=D0=B7=D0=BC=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=BB=20=D1=83=D0=B4=D0=B0=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- avlTreeNew/AVLTree/AVLTree/avlTree.c | 43 ++++++++++++++++------------ 1 file changed, 25 insertions(+), 18 deletions(-) diff --git a/avlTreeNew/AVLTree/AVLTree/avlTree.c b/avlTreeNew/AVLTree/AVLTree/avlTree.c index 5335994..1888296 100644 --- a/avlTreeNew/AVLTree/AVLTree/avlTree.c +++ b/avlTreeNew/AVLTree/AVLTree/avlTree.c @@ -54,8 +54,8 @@ Node* rotateLeft(Node* a) Node* b = a->right; Node* c = b->left; if (b->data.balance == 0) { - b->data.balance = 1; - a->data.balance = -1; + b->data.balance += 1; + a->data.balance += -1; } else { b->data.balance = 0; a->data.balance = 0; @@ -69,8 +69,8 @@ Node* rotateRight(Node* a) { Node* b = a->left; Node* c = b->right; if (b->data.balance == 0) { - b->data.balance = -1; - a->data.balance = 1; + b->data.balance += -1; + a->data.balance += 1; } else { a->data.balance = 0; b->data.balance = 0; @@ -82,13 +82,15 @@ Node* rotateRight(Node* a) { Node* balance(Node* node) { if (node->data.balance == 2) { - if (node->right->data.balance < 0) - node->right = rotateLeft(node->right); - return rotateLeft(node); + if (node->right->data.balance >= 0) + return rotateLeft(node); + node->right = rotateRight(node->right); + return rotateLeft(node); } if (node->data.balance == -2) { - if (node->left->data.balance > 0) - node->left = rotateRight(node->left); + if (node->left->data.balance <= 0) + return rotateRight(node); + node->left = rotateLeft(node->left); return rotateRight(node); } return node; @@ -172,29 +174,34 @@ bool isKeyInTree(Tree* tree, const char* key) { return false; } -Node* deleteNode(Node* root, const char* key, Tree* tree, Node* previousRoot, Node* theMostBigLeft, bool firstLeft, bool* needToChangeBalance) { +Node* deleteNode(Node* root, const char* key, Tree* tree, Node* previousRoot, Node* theMostBigLeft, bool firstLeft, bool* needToChangeBalance, Node* previousMostBigLeft) { if (!firstLeft && theMostBigLeft->right == NULL) { Node* tempLeft = root->left; free(root->data.value); root->data.value = theMostBigLeft->data.value; strcpy(root->data.key, theMostBigLeft->data.key); - if (theMostBigLeft->left != NULL) { - root->left = theMostBigLeft->left; - root->left->left = tempLeft; - root->left->data.balance = -1 + root->left->left->data.balance; + if (theMostBigLeft->left != NULL && previousMostBigLeft != root) { + previousMostBigLeft->right = theMostBigLeft->left; } - root->data.balance = root->right->data.balance - root->left->data.balance + 1; free(theMostBigLeft); return NULL; } else { if (firstLeft) { - root->left = deleteNode(root, key, tree, previousRoot, root->left, false, needToChangeBalance); + root->left = deleteNode(root, key, tree, previousRoot, root->left, false, needToChangeBalance, root); if (!*needToChangeBalance) { ++root->data.balance; } + if (root->data.balance == -1 || root->data.balance == 1) { + *needToChangeBalance = true; + } + Node* temp = balance(root); + if (temp->data.balance == -1 || temp->data.balance == 1) { + *needToChangeBalance = true; + } + return temp; } else { - theMostBigLeft->right = deleteNode(root, key, tree, previousRoot, theMostBigLeft->right, false, needToChangeBalance); + theMostBigLeft->right = deleteNode(root, key, tree, previousRoot, theMostBigLeft->right, false, needToChangeBalance, theMostBigLeft); if (!*needToChangeBalance) { --theMostBigLeft->data.balance; } @@ -235,7 +242,7 @@ Node* helpDeleteNodeInTreeByKey(Node* root, const char* key, Tree* tree, Node* p } return temp; } - root = deleteNode(root, key, tree, previousRoot, NULL, true, needToChangeBalance); + root = deleteNode(root, key, tree, previousRoot, NULL, true, needToChangeBalance, root); if (previousRoot == NULL) { tree->root = root; } From d31b66492f05824de4c8b4ae37b0b326d88c3040 Mon Sep 17 00:00:00 2001 From: Artem Date: Fri, 23 Dec 2022 13:47:08 +0300 Subject: [PATCH 16/17] =?UTF-8?q?=D0=A4=D1=83=D0=BD=D0=BA=D1=86=D0=B8?= =?UTF-8?q?=D1=8F=20=D0=B4=D0=BB=D1=8F=20=D0=BF=D1=80=D0=BE=D0=B2=D0=B5?= =?UTF-8?q?=D1=80=D0=BA=D0=B8=20=D0=B1=D0=B0=D0=BB=D0=B0=D0=BD=D1=81=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- avlTreeNew/AVLTree/AVLTree/avlTree.c | 30 ++++++++++++++++++++++------ avlTreeNew/AVLTree/AVLTree/avlTree.h | 14 +++++++------ avlTreeNew/AVLTree/AVLTree/main.c | 1 - avlTreeNew/AVLTree/AVLTree/test.c | 10 ++++++++-- 4 files changed, 40 insertions(+), 15 deletions(-) diff --git a/avlTreeNew/AVLTree/AVLTree/avlTree.c b/avlTreeNew/AVLTree/AVLTree/avlTree.c index 1888296..1db868c 100644 --- a/avlTreeNew/AVLTree/AVLTree/avlTree.c +++ b/avlTreeNew/AVLTree/AVLTree/avlTree.c @@ -20,6 +20,22 @@ typedef struct Tree { struct Node* root; } Tree; +int orderForBalance(Node* root, bool* isBalanced, int height) { + if (root != NULL) { + if (orderForBalance(root->right, isBalanced, height) - orderForBalance(root->left, isBalanced != root->data.balance, height)) { + *isBalanced = false; + } + return height + 1; + } + return 0; +} + +bool checkBalance(Tree* tree) { + bool isBalanced = true; + orderForBalance(tree->root, &isBalanced, 0); + return isBalanced; +} + Tree* createTree(void) { Tree* tree = calloc(1, sizeof(Tree)); return tree; @@ -36,7 +52,6 @@ void helpedClearTree(Node* root) { helpedClearTree(root->right); free(root->data.value); free(root); - root = NULL; } } @@ -46,11 +61,9 @@ void clearTree(Tree* tree) { } helpedClearTree(tree->root); free(tree); - tree = NULL; } -Node* rotateLeft(Node* a) -{ +Node* rotateLeft(Node* a) { Node* b = a->right; Node* c = b->left; if (b->data.balance == 0) { @@ -82,14 +95,18 @@ Node* rotateRight(Node* a) { Node* balance(Node* node) { if (node->data.balance == 2) { - if (node->right->data.balance >= 0) + if (node->right->data.balance >= 0) { return rotateLeft(node); + } + node->right = rotateRight(node->right); return rotateLeft(node); } if (node->data.balance == -2) { - if (node->left->data.balance <= 0) + if (node->left->data.balance <= 0) { return rotateRight(node); + } + node->left = rotateLeft(node->left); return rotateRight(node); } @@ -104,6 +121,7 @@ Node* helpedToInsert(Node* root, const char* key, char* string, const bool isKey return newNode; } if (strcmp(root->data.key, key) == 0) { + free(root->data.value); root->data.value = string; return root; } diff --git a/avlTreeNew/AVLTree/AVLTree/avlTree.h b/avlTreeNew/AVLTree/AVLTree/avlTree.h index 2f53d48..e1148d6 100644 --- a/avlTreeNew/AVLTree/AVLTree/avlTree.h +++ b/avlTreeNew/AVLTree/AVLTree/avlTree.h @@ -4,22 +4,24 @@ typedef struct Tree Tree; -// +// Tree* createTree(void); -// +// void clearTree(Tree* tree); -// +// void addToTree(Tree* tree, const char* key, char* string); -// +// char* returnValueByKey(Tree* tree, const char* key); -// +// bool isKeyInTree(Tree* tree, const char* key); -// +// void deleteNodeInTreeByKey(Tree* tree, const char* key); +// , +bool checkBalance(Tree* tree); #endif \ No newline at end of file diff --git a/avlTreeNew/AVLTree/AVLTree/main.c b/avlTreeNew/AVLTree/AVLTree/main.c index 46cd4e1..afd72ab 100644 --- a/avlTreeNew/AVLTree/AVLTree/main.c +++ b/avlTreeNew/AVLTree/AVLTree/main.c @@ -61,7 +61,6 @@ bool talkWithUser(void) { addToTree(tree, key, string); break; case 2: - stringCopy = NULL; stringCopy = returnValueByKey(tree, key); if (string != NULL) { printf("%s\n", string); diff --git a/avlTreeNew/AVLTree/AVLTree/test.c b/avlTreeNew/AVLTree/AVLTree/test.c index f34426b..ad57eeb 100644 --- a/avlTreeNew/AVLTree/AVLTree/test.c +++ b/avlTreeNew/AVLTree/AVLTree/test.c @@ -24,24 +24,30 @@ bool testForAvlTree() { addToTree(tree, key2, string2); char* string3 = calloc(2, sizeof(char)); if (string3 == NULL) { - free(string1); - free(string2); + clearTree(tree); return false; } string3[0] = 'c'; char key3[] = "100"; addToTree(tree, key3, string3); if (!isKeyInTree(tree, "100")) { + clearTree(tree); + return false; + } + if (!checkBalance(tree)) { + clearTree(tree); return false; } deleteNodeInTreeByKey(tree, "100", true); if (isKeyInTree(tree, "100")) { + clearTree(tree); return false; } deleteNodeInTreeByKey(tree, "200", true); char stringForCheck[2] = { '\0' }; stringForCheck[0] = 'a'; if (strcmp(returnValueByKey(tree, "320"), stringForCheck) != 0) { + clearTree(tree); return false; } deleteNodeInTreeByKey(tree, "320", true); From 1fbc7ef18ea72c0499293313d3e52bdf9dd94a1a Mon Sep 17 00:00:00 2001 From: Artem Date: Fri, 23 Dec 2022 17:42:53 +0300 Subject: [PATCH 17/17] =?UTF-8?q?=D0=A0=D0=B5=D0=B2=D1=8C=D1=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- avlTreeNew/AVLTree/AVLTree/avlTree.c | 6 ++++-- avlTreeNew/AVLTree/AVLTree/test.c | 5 +++++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/avlTreeNew/AVLTree/AVLTree/avlTree.c b/avlTreeNew/AVLTree/AVLTree/avlTree.c index 1db868c..a00a30c 100644 --- a/avlTreeNew/AVLTree/AVLTree/avlTree.c +++ b/avlTreeNew/AVLTree/AVLTree/avlTree.c @@ -22,10 +22,12 @@ typedef struct Tree { int orderForBalance(Node* root, bool* isBalanced, int height) { if (root != NULL) { - if (orderForBalance(root->right, isBalanced, height) - orderForBalance(root->left, isBalanced != root->data.balance, height)) { + int leftHeight = orderForBalance(root->left, isBalanced, height); + int rightHeight = orderForBalance(root->right, isBalanced, height); + if (rightHeight - leftHeight != root->data.balance) { *isBalanced = false; } - return height + 1; + return leftHeight > rightHeight ? leftHeight + 1 : rightHeight + 1; } return 0; } diff --git a/avlTreeNew/AVLTree/AVLTree/test.c b/avlTreeNew/AVLTree/AVLTree/test.c index ad57eeb..2d50511 100644 --- a/avlTreeNew/AVLTree/AVLTree/test.c +++ b/avlTreeNew/AVLTree/AVLTree/test.c @@ -34,6 +34,11 @@ bool testForAvlTree() { clearTree(tree); return false; } + for (int i = 0; i < 1000; ++i) { + char buffer[5] = { '\0' }; + _itoa(i, buffer, 10); + addToTree(tree, buffer, calloc(1, sizeof(char))); + } if (!checkBalance(tree)) { clearTree(tree); return false;