Conversation
| assert(tree->root == NULL); | ||
| assert(tree->size == 0); |
There was a problem hiding this comment.
Тесты не должны лезть во внутреннее представление данных — это нарушает принцип сокрытия деталей реализации, и приводит к необходимости переписывать тесты при каждом изменении внутренней структуры данных. Тестировать надо только внешнее наблюдаемое поведение.
| int testsPassed = 0; | ||
| int testsFailed = 0; |
There was a problem hiding this comment.
Глобальные переменные зло, они сильно запутывают поток данных. тут лучше их явно в тесты передавать.
| if (testsFailed > 0) { | ||
| return 1; | ||
| } | ||
| return 0; |
There was a problem hiding this comment.
| if (testsFailed > 0) { | |
| return 1; | |
| } | |
| return 0; | |
| return testsFailed > 0; |
| Tree* tree = malloc(sizeof(Tree)); | ||
| if (tree == NULL) { | ||
| return NULL; | ||
| } | ||
| tree->root = NULL; | ||
| tree->size = 0; | ||
| return tree; |
There was a problem hiding this comment.
| Tree* tree = malloc(sizeof(Tree)); | |
| if (tree == NULL) { | |
| return NULL; | |
| } | |
| tree->root = NULL; | |
| tree->size = 0; | |
| return tree; | |
| return calloc(1, sizeof(Tree)); |
| if (getBalance(node) > 1 && getBalance(node->left) >= 0) { | ||
| node = smallRotateRight(node); | ||
| } else if (getBalance(node) < -1 && getBalance(node->right) <= 0) { | ||
| node = smallRotateLeft(node); | ||
| } else if (getBalance(node) > 1 && getBalance(node->left) < 0) { | ||
| node = bigRotateRight(node); | ||
| } else if (getBalance(node) < -1 && getBalance(node->right) > 0) { | ||
| node = bigRotateLeft(node); | ||
| } |
There was a problem hiding this comment.
Это лучше вынести в отдельную функцию, потому что по смыслу это определение типа вращения, ну и в удалении узла это тоже нужно делать.
| struct Node* left; | ||
| struct Node* right; | ||
| int height; | ||
| } Node; |
There was a problem hiding this comment.
А вообще, этой структуре не место в .h (даже предварительному объявлению — иначе нарушение принципа сокрытия деталей реализации, для внешнего мира АВЛ-дерево — это просто словарь).
| typedef struct Tree { | ||
| Node* root; | ||
| int size; | ||
| } Tree; |
There was a problem hiding this comment.
И это полностью определять в заголовочном файле не надо, достаточно предварительного объявления
|
|
||
| Tree* createTree(void); | ||
| Node* createNode(char* code, char* name); | ||
| Node* insertRecursive(Node* node, char* code, char* name); |
There was a problem hiding this comment.
Хорошая новость, правда, в том, что далеко не все функции должны быть в заголовочном файле, а только интерфейс модуля.
| saveRecursive(tree->root, file); | ||
| fclose(file); | ||
| printf("База сохранена: %d аэропортов.\n", tree->size); | ||
| } |
There was a problem hiding this comment.
Непонятно, как это всё тестировать. Я бы отдельным модулем сделал.
| int size; | ||
| } Tree; | ||
|
|
||
| Tree* createTree(void); |
There was a problem hiding this comment.
А вот комментарии к каждой функции в заголовочном файле — нужны
No description provided.