diff --git a/HomeworksAccept/homework21.09/read.me b/HomeworksAccept/homework21.09/read.me deleted file mode 100644 index 5e4d090..0000000 --- a/HomeworksAccept/homework21.09/read.me +++ /dev/null @@ -1 +0,0 @@ -3 домашка diff --git a/HomeworksAccept/homework28.09/read.me b/HomeworksAccept/homework28.09/read.me deleted file mode 100644 index 5061ad0..0000000 --- a/HomeworksAccept/homework28.09/read.me +++ /dev/null @@ -1 +0,0 @@ -4 домашка diff --git a/HomeworksAccept/read.me b/HomeworksAccept/read.me deleted file mode 100644 index 1773bf8..0000000 --- a/HomeworksAccept/read.me +++ /dev/null @@ -1 +0,0 @@ -Здесь представлены домашнии работы, прошедшии проверку diff --git a/parsingTree/parsingTree/main.c b/parsingTree/parsingTree/main.c new file mode 100644 index 0000000..77a4409 --- /dev/null +++ b/parsingTree/parsingTree/main.c @@ -0,0 +1,121 @@ +#include "tree.h" +#include +#include +#include +#include + +bool isDigit(char symbol) { + return symbol >= '0' && symbol <= '9'; +} + +bool readFromFileToTree(char fileName[], Tree* tree) { + int errorCode = 0; + FILE* file = fopen(fileName, "rt"); + if (file == NULL) { + printf(" !"); + return false; + } + char letter = 0; + + while (!feof(file)) { + fscanf(file, "%c", &letter); + if (letter == '+' || letter == '*' || letter == '/') { + addToTreeSymbol(tree, letter, &errorCode); + if (errorCode != 0) { + return false; + } + } + if (letter == '-') { + int symbol = getc(file); + if (symbol == ' ') { + addToTreeSymbol(tree, letter, &errorCode); + if (errorCode != 0) { + return false; + } + ungetc(symbol, file); + } else { + ungetc(symbol, file); + fscanf(file, "%c", &letter); + int number = -letter - '0'; + fscanf(file, "%c", &letter); + while (isDigit(letter)) { + number *= 10; + number += letter - '0'; + fscanf(file, "%c", &letter); + } + addToTreeNumber(tree, number, &errorCode); + if (errorCode != 0) { + return false; + } + } + } + if (isDigit(letter)) { + int number = (int)letter - 48; + fscanf(file, "%c", &letter); + while (isDigit(letter)) { + number *= 10; + number += (int)letter - 48; + fscanf(file, "%c", &letter); + } + addToTreeNumber(tree, number, &errorCode); + if (errorCode != 0) { + return false; + } + } + } + return true; +} + +bool connectingFunction(char fileName[]) { + Tree* tree = createTree(); + if (!readFromFileToTree(fileName, tree)) { + return false; + } + printTree(tree); + int errorCode = 0; + int number = postorderCount(tree, &errorCode); + if (errorCode != 0) { + return -1; + } + printf("%d\n", number); + clearTree(tree); + return true; +} + +bool test() { + Tree* tree = createTree(); + if (!readFromFileToTree("test.txt", tree)) { + return false; + } + int errorCode = 0; + int number = postorderCount(tree, &errorCode); + if (errorCode != 0) { + return -1; + } + clearTree(tree); + return number == -4; +} + +int main() { + setlocale(LC_ALL, "RUS"); + if (test()) { + printf(" !\n"); + } else { + printf("...\n"); + return -1; + } + printf(" , 100 \n"); + char fileName[100] = { '\0' }; + int checkScan = scanf("%s", &fileName); + while (checkScan != 1) { + while (getchar() != '\n') { + } + + printf("..."); + checkScan = scanf("%s", &fileName); + } + if (!connectingFunction(fileName)) { + printf("...\n"); + return -1; + } +} \ No newline at end of file diff --git a/parsingTree/parsingTree/stack.c b/parsingTree/parsingTree/stack.c new file mode 100644 index 0000000..81223ce --- /dev/null +++ b/parsingTree/parsingTree/stack.c @@ -0,0 +1,84 @@ +#include "stack.h" +#include +#include + +typedef struct Value { + int number; + char symbol; +} Value; + +typedef struct Node { + Value value; + Node* right; + Node* left; +} Node; + +typedef struct Unit { + Node* value; + Unit* next; +}Unit; + +typedef struct Stack { + Unit* head; +}Stack; + +Stack* createStack(void) { + Stack* stack = calloc(1, sizeof(stack)); + return stack; +} + +int push(Stack* stack, Node* value) { + Unit* temp = calloc(1, sizeof(Unit)); + if (temp == NULL) { + printf(" ..."); + return -1; + } + temp->value = value; + temp->next = stack->head; + + stack->head = temp; + return 0; +} + +Node* pop(Stack* stack, int* errorCode) { + if (stack->head == NULL) { + if (errorCode != NULL) { + *errorCode = -1; + } + return NULL; + } + if (errorCode != NULL) { + *errorCode = 0; + } + + Node* value = stack->head->value; + + Unit* next = stack->head->next; + free(stack->head); + stack->head = next; + + return value; +} + +bool isEmpty(Stack* stack) { + return stack->head == NULL; +} + +void customDelete(Stack* stack) { + while (!isEmpty(stack)) { + int errorCode = 0; + Node* element = pop(stack, &errorCode); + free(element); + } + free(stack); + stack = NULL; +} + +void deleteStack(Stack* stack) { + while (!isEmpty(stack)) { + int errorCode = 0; + pop(stack, &errorCode); + } + free(stack); + stack = NULL; +} \ No newline at end of file diff --git a/parsingTree/parsingTree/stack.h b/parsingTree/parsingTree/stack.h new file mode 100644 index 0000000..49b4f30 --- /dev/null +++ b/parsingTree/parsingTree/stack.h @@ -0,0 +1,30 @@ +#ifndef STACK_H +#define STACK_H +#include + +typedef struct Stack Stack; + +typedef struct Node Node; + +typedef struct Value Value; + +typedef struct Unit Unit; + +// stack'a +Stack* createStack(void); + +// +int push(Stack* stack, Node* value); + +// ( ) +Node* pop(Stack* stack, int* errorCode); + +// +bool isEmpty(Stack* stack); + +// +void deleteStack(Stack* stack); + +// + +void customDelete(Stack* stack); +#endif \ No newline at end of file diff --git a/parsingTree/parsingTree/test.txt b/parsingTree/parsingTree/test.txt new file mode 100644 index 0000000..28906b5 --- /dev/null +++ b/parsingTree/parsingTree/test.txt @@ -0,0 +1 @@ +(- (* (+ 2 2) 2) (* (+ 2 2) 3)) \ No newline at end of file diff --git a/parsingTree/parsingTree/tree.c b/parsingTree/parsingTree/tree.c new file mode 100644 index 0000000..93d4b83 --- /dev/null +++ b/parsingTree/parsingTree/tree.c @@ -0,0 +1,204 @@ +#include "tree.h" +#include "stack.h" +#include +#include +#include + +typedef struct Value { + int number; + char symbol; +} Value; + +typedef struct Node { + Value value; + Node* right; + Node* left; +} Node; + +typedef struct Tree { + Node* root; +} Tree; + +Tree* createTree(void) { + Tree* tree = calloc(1, sizeof(tree)); + return tree; +} + +Node* createNode(void) { + Node* temp = calloc(1, sizeof(Node)); + return temp; +} + +Node* nonRecursivePreorder(Node* root, int* errorCode) { + Stack* stack = createStack(); + Node* current = root; + while (true) { + if (current != NULL) { + if (current->value.symbol == 0 && current->value.number == 0) { + return current; + } + push(stack, current); + current = current->left; + } + else { + if (isEmpty(stack)) { + free(stack); + return NULL; + } + current = pop(stack, errorCode); + if (*errorCode != 0) { + return NULL; + } + current = current->right; + } + } + deleteStack(stack); + return NULL; +} + +void addToTreeSymbol(Tree* tree, char symbol, int* errorCode) { + if (tree == NULL) { + *errorCode = -1; + return; + } + if (tree->root == NULL) { + tree->root = createNode(); + if (tree->root == NULL) { + *errorCode = -1; + return; + } + tree->root->value.symbol = symbol; + tree->root->left = createNode(); + if (tree->root->left == NULL) { + *errorCode = -1; + return; + } + tree->root->right = createNode(); + if (tree->root == NULL) { + *errorCode = -1; + return; + } + return; + } + Node* newRoot = nonRecursivePreorder(tree->root, errorCode); + if (*errorCode != 0 || newRoot == NULL) { + *errorCode = -1; + return; + } + newRoot->value.symbol = symbol; + newRoot->left = createNode(); + if (newRoot->left == NULL) { + *errorCode = -1; + return; + } + newRoot->right = createNode(); + if (newRoot->right == NULL) { + *errorCode = -1; + return; + } +} + +void addToTreeNumber(Tree* tree, int number, int* errorCode) { + + if (tree == NULL || tree->root == NULL) { + *errorCode = -1; + return; + } + Node* newRoot = nonRecursivePreorder(tree->root, errorCode); + if (*errorCode != 0 || newRoot == NULL) { + *errorCode = -1; + return; + } + newRoot->value.number = number; +} + +void postorderHelp(Node* root, Stack* stack, Stack* stackToClear) { + if (root != NULL) { + postorderHelp(root->left, stack, stackToClear); + postorderHelp(root->right, stack, stackToClear); + if (root->value.symbol != 0) { + int errorCode = 0; + Node* element = pop(stack, &errorCode); + int secondNumber = element->value.number; + element = pop(stack, &errorCode); + Node* newElement = createNode(); + int firstNumber = element->value.number; + int newNumber = 0; + if (root->value.symbol == '+') { + newNumber = firstNumber + secondNumber; + } else if (root->value.symbol == '*') { + newNumber = firstNumber * secondNumber; + } else if (root->value.symbol == '-') { + newNumber = firstNumber - secondNumber; + } else { + newNumber = firstNumber / secondNumber; + } + newElement->value.number = newNumber; + push(stack, newElement); + push(stackToClear, newElement); + } else { + push(stack, root); + } + } +} + +void infix(Node* root, int isNeedStample) { + if (root != NULL) { + if (root->value.symbol != 0) { + printf("(%c ", root->value.symbol); + ++isNeedStample; + } else { + if (isNeedStample == 0) { + printf("%d ", root->value.number); + } else { + printf("%d", root->value.number); + while (isNeedStample != 0) { + printf(")"); + --isNeedStample; + } + printf(" "); + } + } + infix(root->left, 0); + infix(root->right, isNeedStample); + } +} + +void printTree(Tree* tree) { + if (tree == NULL) { + return; + } + infix(tree->root, 0); + printf("\n"); +} + +int postorderCount(Tree* tree, int* errorCode) { + Stack* stack = createStack(); + Stack* stackToClear = createStack(); + postorderHelp(tree->root, stack, stackToClear); + Node* newElement = pop(stack, errorCode); + if (*errorCode != 0 || newElement == NULL) { + return 0; + } + int number = newElement->value.number; + customDelete(stackToClear); + return number; +} + +void postorderDelete(Node* root) { + if (root != NULL) { + postorderDelete(root->left); + postorderDelete(root->right); + free(root); + root = NULL; + } +} + +void clearTree(Tree* tree) { + if (tree == NULL) { + return; + } + postorderDelete(tree->root); + free(tree); + tree = NULL; +} \ No newline at end of file diff --git a/parsingTree/parsingTree/tree.h b/parsingTree/parsingTree/tree.h new file mode 100644 index 0000000..efdcba8 --- /dev/null +++ b/parsingTree/parsingTree/tree.h @@ -0,0 +1,23 @@ +#ifndef TREE_H +#define TREE_H + +typedef struct Tree Tree; + +// +Tree* createTree(void); + +// , int' char' +void addToTreeSymbol(Tree* tree, char symbol, int* errorCode); + +// , int' char' +void addToTreeNumber(Tree* tree, int number, int* errorCode); + +// , +int postorderCount(Tree* tree, int* errorCode); + +// +void printTree(Tree* tree); + +// +void clearTree(Tree* tree); +#endif \ No newline at end of file diff --git a/parsingTreeNew/parsingTreeNew.sln b/parsingTreeNew/parsingTreeNew.sln new file mode 100644 index 0000000..f771b6d --- /dev/null +++ b/parsingTreeNew/parsingTreeNew.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}") = "parsingTreeNew", "parsingTreeNew\parsingTreeNew.vcxproj", "{733ABB93-2B1F-48F0-B050-3DB11AF05EA5}" +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 + {733ABB93-2B1F-48F0-B050-3DB11AF05EA5}.Debug|x64.ActiveCfg = Debug|x64 + {733ABB93-2B1F-48F0-B050-3DB11AF05EA5}.Debug|x64.Build.0 = Debug|x64 + {733ABB93-2B1F-48F0-B050-3DB11AF05EA5}.Debug|x86.ActiveCfg = Debug|Win32 + {733ABB93-2B1F-48F0-B050-3DB11AF05EA5}.Debug|x86.Build.0 = Debug|Win32 + {733ABB93-2B1F-48F0-B050-3DB11AF05EA5}.Release|x64.ActiveCfg = Release|x64 + {733ABB93-2B1F-48F0-B050-3DB11AF05EA5}.Release|x64.Build.0 = Release|x64 + {733ABB93-2B1F-48F0-B050-3DB11AF05EA5}.Release|x86.ActiveCfg = Release|Win32 + {733ABB93-2B1F-48F0-B050-3DB11AF05EA5}.Release|x86.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {EA3F37A8-33E7-4249-BFEB-E26D8F0E43D3} + EndGlobalSection +EndGlobal diff --git a/parsingTreeNew/parsingTreeNew/main.c b/parsingTreeNew/parsingTreeNew/main.c new file mode 100644 index 0000000..967163b --- /dev/null +++ b/parsingTreeNew/parsingTreeNew/main.c @@ -0,0 +1,123 @@ +#include "tree.h" +#include +#include +#include +#include + +bool isDigit(char symbol) { + return symbol >= '0' && symbol <= '9'; +} + +bool readFromFileToTree(char fileName[], Tree* tree) { + int errorCode = 0; + FILE* file = fopen(fileName, "rt"); + if (file == NULL) { + printf(" !"); + return false; + } + char letter = 0; + + while (!feof(file)) { + fscanf(file, "%c", &letter); + if (letter == '+' || letter == '*' || letter == '/') { + addToTreeSymbol(tree, letter, &errorCode); + if (errorCode != 0) { + return false; + } + } + if (letter == '-') { + int symbol = getc(file); + if (symbol == ' ') { + addToTreeSymbol(tree, letter, &errorCode); + if (errorCode != 0) { + return false; + } + ungetc(symbol, file); + } + else { + ungetc(symbol, file); + fscanf(file, "%c", &letter); + int number = -letter - '0'; + fscanf(file, "%c", &letter); + while (isDigit(letter)) { + number *= 10; + number += letter - '0'; + fscanf(file, "%c", &letter); + } + addToTreeNumber(tree, number, &errorCode); + if (errorCode != 0) { + return false; + } + } + } + if (isDigit(letter)) { + int number = (int)letter - 48; + fscanf(file, "%c", &letter); + while (isDigit(letter)) { + number *= 10; + number += (int)letter - 48; + fscanf(file, "%c", &letter); + } + addToTreeNumber(tree, number, &errorCode); + if (errorCode != 0) { + return false; + } + } + } + return true; +} + +bool connectingFunction(char fileName[]) { + Tree* tree = createTree(); + if (!readFromFileToTree(fileName, tree)) { + return false; + } + printTree(tree); + int errorCode = 0; + int number = postorderCount(tree, &errorCode); + if (errorCode != 0) { + return -1; + } + printf("%d\n", number); + clearTree(tree); + return true; +} + +bool test() { + Tree* tree = createTree(); + if (!readFromFileToTree("test.txt", tree)) { + return false; + } + int errorCode = 0; + int number = postorderCount(tree, &errorCode); + if (errorCode != 0) { + return -1; + } + clearTree(tree); + return number == -4; +} + +int main() { + setlocale(LC_ALL, "RUS"); + if (test()) { + printf(" !\n"); + } + else { + printf("...\n"); + return -1; + } + printf(" , 100 \n"); + char fileName[100] = { '\0' }; + int checkScan = scanf("%s", &fileName); + while (checkScan != 1) { + while (getchar() != '\n') { + } + + printf("..."); + checkScan = scanf("%s", &fileName); + } + if (!connectingFunction(fileName)) { + printf("...\n"); + return -1; + } +} \ No newline at end of file diff --git a/parsingTreeNew/parsingTreeNew/parsingTreeNew.vcxproj b/parsingTreeNew/parsingTreeNew/parsingTreeNew.vcxproj new file mode 100644 index 0000000..37ddfe4 --- /dev/null +++ b/parsingTreeNew/parsingTreeNew/parsingTreeNew.vcxproj @@ -0,0 +1,156 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + 16.0 + Win32Proj + {733abb93-2b1f-48f0-b050-3db11af05ea5} + parsingTreeNew + 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 + false + _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + + + + + Level3 + true + true + true + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + true + true + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/parsingTreeNew/parsingTreeNew/parsingTreeNew.vcxproj.filters b/parsingTreeNew/parsingTreeNew/parsingTreeNew.vcxproj.filters new file mode 100644 index 0000000..79302ee --- /dev/null +++ b/parsingTreeNew/parsingTreeNew/parsingTreeNew.vcxproj.filters @@ -0,0 +1,41 @@ + + + + + {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/parsingTreeNew/parsingTreeNew/stack.c b/parsingTreeNew/parsingTreeNew/stack.c new file mode 100644 index 0000000..fb9a743 --- /dev/null +++ b/parsingTreeNew/parsingTreeNew/stack.c @@ -0,0 +1,84 @@ +#include "stack.h" +#include +#include + +typedef struct Value { + int number; + char symbol; +} Value; + +typedef struct Node { + Value value; + Node* right; + Node* left; +} Node; + +typedef struct Unit { + Node* value; + Unit* next; +}Unit; + +typedef struct Stack { + Unit* head; +}Stack; + +Stack* createStack(void) { + Stack* stack = calloc(1, sizeof(stack)); + return stack; +} + +int push(Stack* stack, Node* value) { + Unit* temp = calloc(1, sizeof(Unit)); + if (temp == NULL) { + printf(" ..."); + return -1; + } + temp->value = value; + temp->next = stack->head; + + stack->head = temp; + return 0; +} + +Node* pop(Stack* stack, int* errorCode) { + if (stack->head == NULL) { + if (errorCode != NULL) { + *errorCode = -1; + } + return NULL; + } + if (errorCode != NULL) { + *errorCode = 0; + } + + Node* value = stack->head->value; + + Unit* next = stack->head->next; + free(stack->head); + stack->head = next; + + return value; +} + +bool isEmpty(Stack* stack) { + return stack->head == NULL; +} + +void customDelete(Stack* stack) { + while (!isEmpty(stack)) { + int errorCode = 0; + Node* element = pop(stack, &errorCode); + free(element); + } + free(stack); + stack = NULL; +} + +void deleteStack(Stack* stack) { + while (!isEmpty(stack)) { + int errorCode = 0; + pop(stack, &errorCode); + } + free(stack); + stack = NULL; +} \ No newline at end of file diff --git a/parsingTreeNew/parsingTreeNew/stack.h b/parsingTreeNew/parsingTreeNew/stack.h new file mode 100644 index 0000000..49b4f30 --- /dev/null +++ b/parsingTreeNew/parsingTreeNew/stack.h @@ -0,0 +1,30 @@ +#ifndef STACK_H +#define STACK_H +#include + +typedef struct Stack Stack; + +typedef struct Node Node; + +typedef struct Value Value; + +typedef struct Unit Unit; + +// stack'a +Stack* createStack(void); + +// +int push(Stack* stack, Node* value); + +// ( ) +Node* pop(Stack* stack, int* errorCode); + +// +bool isEmpty(Stack* stack); + +// +void deleteStack(Stack* stack); + +// + +void customDelete(Stack* stack); +#endif \ No newline at end of file diff --git a/parsingTreeNew/parsingTreeNew/test.txt b/parsingTreeNew/parsingTreeNew/test.txt new file mode 100644 index 0000000..28906b5 --- /dev/null +++ b/parsingTreeNew/parsingTreeNew/test.txt @@ -0,0 +1 @@ +(- (* (+ 2 2) 2) (* (+ 2 2) 3)) \ No newline at end of file diff --git a/parsingTreeNew/parsingTreeNew/tree.c b/parsingTreeNew/parsingTreeNew/tree.c new file mode 100644 index 0000000..7a2b069 --- /dev/null +++ b/parsingTreeNew/parsingTreeNew/tree.c @@ -0,0 +1,210 @@ +#include "tree.h" +#include "stack.h" +#include +#include +#include + +typedef struct Value { + int number; + char symbol; +} Value; + +typedef struct Node { + Value value; + Node* right; + Node* left; +} Node; + +typedef struct Tree { + Node* root; +} Tree; + +Tree* createTree(void) { + Tree* tree = calloc(1, sizeof(Tree)); + return tree; +} + +Node* createNode(void) { + Node* temp = calloc(1, sizeof(Node)); + return temp; +} + +Node* nonRecursivePreorder(Node* root, int* errorCode) { + Stack* stack = createStack(); + Node* current = root; + while (true) { + if (current != NULL) { + if (current->value.symbol == 0 && current->value.number == 0) { + return current; + } + push(stack, current); + current = current->left; + } + else { + if (isEmpty(stack)) { + free(stack); + return NULL; + } + current = pop(stack, errorCode); + if (*errorCode != 0) { + return NULL; + } + current = current->right; + } + } + deleteStack(stack); + return NULL; +} + +void addToTreeSymbol(Tree* tree, char symbol, int* errorCode) { + if (tree == NULL) { + *errorCode = -1; + return; + } + if (tree->root == NULL) { + tree->root = createNode(); + if (tree->root == NULL) { + *errorCode = -1; + return; + } + tree->root->value.symbol = symbol; + tree->root->left = createNode(); + if (tree->root->left == NULL) { + *errorCode = -1; + return; + } + tree->root->right = createNode(); + if (tree->root == NULL) { + *errorCode = -1; + return; + } + return; + } + Node* newRoot = nonRecursivePreorder(tree->root, errorCode); + if (*errorCode != 0 || newRoot == NULL) { + *errorCode = -1; + return; + } + newRoot->value.symbol = symbol; + newRoot->left = createNode(); + if (newRoot->left == NULL) { + *errorCode = -1; + return; + } + newRoot->right = createNode(); + if (newRoot->right == NULL) { + *errorCode = -1; + return; + } +} + +void addToTreeNumber(Tree* tree, int number, int* errorCode) { + + if (tree == NULL || tree->root == NULL) { + *errorCode = -1; + return; + } + Node* newRoot = nonRecursivePreorder(tree->root, errorCode); + if (*errorCode != 0 || newRoot == NULL) { + *errorCode = -1; + return; + } + newRoot->value.number = number; +} + +void postorderHelp(Node* root, Stack* stack, Stack* stackToClear) { + if (root == NULL) { + return; + } + postorderHelp(root->left, stack, stackToClear); + postorderHelp(root->right, stack, stackToClear); + if (root->value.symbol != 0) { + int errorCode = 0; + Node* element = pop(stack, &errorCode); + int secondNumber = element->value.number; + element = pop(stack, &errorCode); + Node* newElement = createNode(); + int firstNumber = element->value.number; + int newNumber = 0; + if (root->value.symbol == '+') { + newNumber = firstNumber + secondNumber; + } + else if (root->value.symbol == '*') { + newNumber = firstNumber * secondNumber; + } + else if (root->value.symbol == '-') { + newNumber = firstNumber - secondNumber; + } + else { + newNumber = firstNumber / secondNumber; + } + newElement->value.number = newNumber; + push(stack, newElement); + push(stackToClear, newElement); + } + else { + push(stack, root); + } +} + +void infix(Node* root, int isNeedStample) { + if (root != NULL) { + if (root->value.symbol != 0) { + printf("(%c ", root->value.symbol); + ++isNeedStample; + } + else { + if (isNeedStample == 0) { + printf("%d ", root->value.number); + } + else { + printf("%d", root->value.number); + while (isNeedStample != 0) { + printf(")"); + --isNeedStample; + } + printf(" "); + } + } + infix(root->left, 0); + infix(root->right, isNeedStample); + } +} + +void printTree(Tree* tree) { + if (tree == NULL) { + return; + } + infix(tree->root, 0); + printf("\n"); +} + +int postorderCount(Tree* tree, int* errorCode) { + Stack* stack = createStack(); + Stack* stackToClear = createStack(); + postorderHelp(tree->root, stack, stackToClear); + Node* newElement = pop(stack, errorCode); + if (*errorCode != 0 || newElement == NULL) { + return 0; + } + int number = newElement->value.number; + customDelete(stackToClear); + return number; +} + +void postorderDelete(Node* root) { + if (root != NULL) { + postorderDelete(root->left); + postorderDelete(root->right); + free(root); + root = NULL; + } +} + +void clearTree(Tree* tree) { + if (tree == NULL) { + return; + } + postorderDelete(tree->root); + free(tree); +} \ No newline at end of file diff --git a/parsingTreeNew/parsingTreeNew/tree.h b/parsingTreeNew/parsingTreeNew/tree.h new file mode 100644 index 0000000..efdcba8 --- /dev/null +++ b/parsingTreeNew/parsingTreeNew/tree.h @@ -0,0 +1,23 @@ +#ifndef TREE_H +#define TREE_H + +typedef struct Tree Tree; + +// +Tree* createTree(void); + +// , int' char' +void addToTreeSymbol(Tree* tree, char symbol, int* errorCode); + +// , int' char' +void addToTreeNumber(Tree* tree, int number, int* errorCode); + +// , +int postorderCount(Tree* tree, int* errorCode); + +// +void printTree(Tree* tree); + +// +void clearTree(Tree* tree); +#endif \ No newline at end of file