Рекурсивно поместить данные двоичного дерева поиска InOrder в массив в C

Я пытаюсь рекурсивно вставить данные, хранящиеся в каждом узле моего двоичного дерева поиска, в массив, отсортированный с помощью логики кода 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;

person Kalin Delev    schedule 11.12.2017    source источник
comment
v[i] = (char) узел-›данные; я++; бит определенно должен быть заменен правильным кодом, я просто не могу понять это...   -  person Kalin Delev    schedule 11.12.2017


Ответы (1)


Вы можете отправить адрес переменной i и увеличить ее значение после заполнения этого индекса.

void bst_getordered(bst* b, void* v)
{
    if (b == NULL || v == NULL) {
        return;
    }
    int i = 0;
    node_getordered(b->top, (char*) v, &i);
}

void node_getordered(bstnode* node, char* v, int* i)
{
    if (node == NULL) {
        return;
    }
    node_getordered(node->left, v, i);
    v[*i] = (char) node->data;
    (*i)++;
    node_getordered(node->right, v, i);
}
person abdullah    schedule 11.12.2017
comment
Я получаю эту ошибку при компиляции сейчас: bst.c:234:16: ошибка: несовместимый указатель на целочисленное преобразование, возвращающее 'int *' из функции с типом результата 'int'; разыменование с помощью * [-Werror,-Wint-conversion] return i; ^ * bst.c:240:12: ошибка: несовместимый указатель на целочисленное преобразование, возвращающий 'int *' из функции с типом результата 'int'; разыменование с помощью * [-Werror,-Wint-conversion] return i; И когда я исправляю это с помощью return *i, он все равно не работает... - person Kalin Delev; 11.12.2017
comment
Я немного отредактировал свой ответ. Вы не должны ничего возвращать из этой функции. Пожалуйста, проверьте ответ еще раз и дайте мне знать. - person abdullah; 11.12.2017
comment
Это снова не сработало ... Я добавил фрагмент тестовой программы, который я использую для проверки этой функции ... она не работает при утверждении sc‹0. testbst: testbst.c:115: void test_getordered(): Утверждение `sc‹0' не удалось. printf дает 460 и пустое место... Я хотел посмотреть, насколько велик массив и что в нем хранится первое место, чтобы увидеть, действительно ли это проблема с функцией, и это выглядит так... - person Kalin Delev; 11.12.2017
comment
Я также добавил код для своих структур, чтобы сделать его более понятным. Я думаю, мне нужно увеличить не только на i, но и как-то добавить дерево-›elsz... - person Kalin Delev; 11.12.2017
comment
Есть ли способ проверить, если с моей стороны? На данный момент это не полная программа. - person abdullah; 11.12.2017
comment
Есть ли способ отправить файлы? Или просто фрагменты кода? Я попытаюсь загрузить весь код, если я не могу отправить файлы... - person Kalin Delev; 11.12.2017
comment
Вы можете поставить весь код под сомнение или где-то еще, предоставив ссылку здесь. - person abdullah; 11.12.2017
comment
Хорошо, вот ссылка на все файлы для полной программы. вы компилируете в компиляторе C с помощью команды make -f BSTMakefile testbst и запускаете его с помощью ./testbst. Файл .h нельзя изменить. files.fm/u/g9s77rrr - person Kalin Delev; 11.12.2017
comment
Я думаю, вы пытаетесь отсортировать список строк. В void node_getordered(bstnode* node, char* v, int* i) v должно быть array of char*, а не char*. - person abdullah; 11.12.2017
comment
Да, пытаюсь скопировать строки в массив. Я посмотрю, как я могу сделать это, спасибо. - person Kalin Delev; 12.12.2017