Conversation
hw8/searchTree/main.c
Outdated
| void main(void) { | ||
| setlocale(LC_ALL, "RUS"); | ||
| if (!runTests()) { | ||
| return; |
hw8/searchTree/main.c
Outdated
| if (!runTests()) { | ||
| return; | ||
| } | ||
| Node* root = NULL; |
There was a problem hiding this comment.
Хочется в клиентском коде не использовать такие низкоуровневые термины, как root
hw8/searchTree/main.c
Outdated
| printf("\n\n"); | ||
| switch (choice) | ||
| { | ||
| case(1): |
There was a problem hiding this comment.
| case(1): | |
| case 1: |
И ниже
hw8/searchTree/tests.c
Outdated
|
|
||
| bool testForCreateNode() { | ||
| Node* root = createNode(4, "dq"); | ||
| return root != NULL; |
|
|
||
| #include <stdbool.h> | ||
|
|
||
| bool testForCreateNode(); |
hw8/searchTree/tree.c
Outdated
| newNode->string = malloc(strlen(string) + 1); | ||
| strcpy(newNode->string, string); |
hw8/searchTree/tree.c
Outdated
| Node* add(Node* root, int item, char* string) { | ||
| Node* existingNode = search(root, item); | ||
| if (existingNode != NULL) { | ||
| strcpy(existingNode->string, string); |
There was a problem hiding this comment.
Никто не обещал, что в existingNode->string поместится string
hw8/searchTree/tree.c
Outdated
| } | ||
|
|
||
| Node* add(Node* root, int item, char* string) { | ||
| Node* existingNode = search(root, item); |
There was a problem hiding this comment.
Это делается при каждом рекурсивном вызове add, причём search работает за логарифм, так что суммарная трудоёмкость как-то не очень
hw8/searchTree/tree.h
Outdated
|
|
||
| bool checkTheKey(Node* root, int item); | ||
|
|
||
| Node* findMin(Node* root); |
There was a problem hiding this comment.
Далеко не все функции нужны в хедере
hw8/searchTree/tree.h
Outdated
|
|
||
| typedef Node* Position; | ||
|
|
||
| Node* createNode(int value, const char* string); |
| #include <stdbool.h> | ||
|
|
||
| // test for the node creation function | ||
| bool testForCreateNode(); |
There was a problem hiding this comment.
| bool testForCreateNode(); | |
| bool testForCreateNode(void); |
Тут и ниже
| bool testForAdd() { | ||
| Node* root = createNode(8, "q"); | ||
|
|
||
| root = add(root, 3, "1"); |
There was a problem hiding this comment.
Конкретно у Вас так нельзя. add в случае неудачи выделения памяти вернёт NULL не удалив предыдущее дерево, так что если его перезаписать тут, оно всё потеряется и память утечёт. Так что тут каждый add должен работать как realloc — сначала сохраняем результат во временную переменную, затем проверяем её на NULL, и если что, удаляем дерево, потом присваиваем в root.
Было бы удобнее иметь другой инвариант у add — в случае неуспешной аллокации дерево не меняется и никакая дополнительная память не остаётся выделенной. Но тогда нужен какой-то другой механизм сообщения вызывающему об ошибке — скорее всего, код возврата (его вызывающий тоже должен проверять, но он может это сделать после серии добавлений один раз).
No description provided.