Conversation
okuroshi
left a comment
There was a problem hiding this comment.
Исправь stylecode. Найди какой тебе больше нравится и используй его, также приложи ссылку на него. Добавь тесты на кейсы, когда передается null и другие случаи, с этим кейсом. И другие замечания тоже
| * @brief Освобождает память узла и его ключа/значения | ||
| * @param map указатель на структуру Map | ||
| * @param node узел для освобождения */ | ||
| static void free_node(Map *map, Node *node) { |
There was a problem hiding this comment.
проверки на null от map нет
|
|
||
| clean: | ||
| rm -f *.o $(LIB_NAME) $(TEST_EXEC) | ||
| touch clean No newline at end of file |
| * @brief Возвращает количество элементов в Map | ||
| * @param map указатель на структуру Map | ||
| * @return количество элементов в Map */ | ||
| size_t map_size(const Map *map) { return map->size; } No newline at end of file |
|
|
||
| #ifdef __cplusplus | ||
| } | ||
| #endif No newline at end of file |
| RUN_TEST(test_map_with_string_keys); | ||
|
|
||
| return UNITY_END(); | ||
| } No newline at end of file |
| * @brief Освобождает ресурсы, занятые Map | ||
| * @param map указатель на структуру Map | ||
| * @note Удаляет все узлы и освобождает память ключей/значений, если указаны соответствующие функции */ | ||
| void map_free(Map *map) { |
| * @param free_key функция освобождения памяти ключа (может быть NULL) | ||
| * @param free_value функция освобождения памяти значения (может быть NULL) | ||
| * @note Перед использованием Map должна быть инициализирована этой функцией */ | ||
| void map_init(Map *map, |
| * @brief Восстанавливает свойства красно-черного дерева после удаления | ||
| * @param map указатель на структуру Map | ||
| * @param node узел, с которого начинается восстановление */ | ||
| static void fix_delete(Map *map, Node *node) { |
| * @brief Выполняет левый поворот вокруг узла | ||
| * @param map указатель на структуру Map | ||
| * @param node узел, вокруг которого выполняется поворот */ | ||
| static void rotate_left(Map *map, Node *node) { |
| * @param color цвет узла | ||
| * @param parent родительский узел | ||
| * @return указатель на созданный узел или NULL при ошибке выделения памяти */ | ||
| static Node *create_node(void *key, void *value, Color color, Node *parent) { |
| while (node != map->root && node->parent->color == RED) { | ||
| Node *uncle; | ||
| if (node->parent == node->parent->parent->left) { | ||
| uncle = node->parent->parent->right; |
There was a problem hiding this comment.
Название uncle переменной выглядит логично, если воспринимать дерево, как мама, папа, ребенок, однако это просто способ понятней объяснить работу этой структуры. Попробуй придумать другое понятное название
| successor->color = node->color; | ||
| } | ||
|
|
||
| if (original_color == BLACK) { fix_delete(map, child ? child : (node->parent ? node->parent : NULL)); } |
| node->right->parent = successor; | ||
| } | ||
|
|
||
| if (!node->parent) { map->root = successor; } |
| } | ||
|
|
||
| if (!node->parent) { map->root = successor; } | ||
| else if (node == node->parent->left) { node->parent->left = successor; } |
|
|
||
| if (!node->parent) { map->root = successor; } | ||
| else if (node == node->parent->left) { node->parent->left = successor; } | ||
| else { node->parent->right = successor; } |
| else if (node == node->parent->left) { node->parent->left = child; } | ||
| else { node->parent->right = child; } | ||
|
|
||
| if (child) { child->parent = node->parent; } |
| if (child) { child->parent = node->parent; } | ||
| } else if (!node->right) { | ||
| child = node->left; | ||
| if (!node->parent) { map->root = child; } |
| #endif | ||
| #include <stdbool.h> | ||
|
|
||
| typedef enum { RED, BLACK } Color; |
| #endif | ||
| #include <stdbool.h> | ||
|
|
||
| typedef enum { RED, BLACK } Color; |
There was a problem hiding this comment.
У тебя есть enum для цветой. Т.к были замечание по null, то добавь еще обработку других ошибок и также, чтобы код ошибки не был магическим числом
| @@ -0,0 +1,43 @@ | |||
| #pragma once | |||
| #ifdef __cplusplus | |||
| extern "C" { | |||
There was a problem hiding this comment.
Для чего здесь это, если ты и так собираешь под C ?
Радионова ИВТ-23