Я пытаюсь рекурсивно вставить данные, хранящиеся в каждом узле моего двоичного дерева поиска, в массив, отсортированный с помощью логики кода InOrder.
Это фрагмент двух функций, которые я использую. Параметры и тип "bst_getordered" не могут быть изменены, только его содержимое. «node_getordered» можно изменить любым необходимым образом.
void bst_getordered(bst* b, void* v)
{
int i = 0;
if (b == NULL || v == NULL) {
return;
}
node_getordered(b->top, (char*) v, i);
}
int node_getordered(bstnode* node, char* v, int i)
{
if (node == NULL) {
return i;
}
node_getordered(node->left, v, i);
v[i] = (char) node->data;
i++;
node_getordered(node->right, v, i);
return i;
}
Он должен хранить все данные в дереве, отсортированные, в массив. Однако он этого не делает, и я не могу понять, почему... Я думаю, что должен использовать двойной указатель для увеличения адреса, но я не могу понять, как это сделать... мне не хватает знаний синтаксиса в то поле...
[EDIT 1] Это фрагмент тестовой программы, которую я использую, чтобы убедиться, что код работает:
void test_getordered(void)
{
int i, sc;
char words1[WORDS][STRSIZE] = {"it", "is", "a", "truth",
"universally", "acknowledged", "that", "a", "single", "man", "in",
"possession", "of", "a", "good", "fortune", "must", "be", "in",
"want",
"of", "a", "wife"};
char words2[WORDS][STRSIZE];
bst* b = bst_init(STRSIZE, mystrcmp, myprintstr);
bst_insertarray(b, words1, WORDS);
assert(bst_size(b)==18);
bst_getordered(b, words2);
printf("%lu %s\n", sizeof(words2), words2[0]);
for(i=0; i<17; i++){
sc = strcmp(words2[i], words2[i+1]);
assert(sc<0);
}
bst_free(&b);
assert(b==NULL);
}
[РЕДАКТИРОВАТЬ 2] Это структуры моего узла и дерева. Я подозреваю, что мне нужно каким-то образом увеличить счетчик с помощью tree->elsz, чтобы правильно пройти через массив:
struct bstnode {
void* data;
struct bstnode* left;
struct bstnode* right;
};
typedef struct bstnode bstnode;
struct bst {
bstnode* top;
/* Data element size, in bytes */
int elsz;
};
typedef struct bst bst;