Как заполнить двоичное дерево в C из текста входного файла - PullRequest
0 голосов
/ 10 июня 2019

Я работаю над этим проектом класса.Первым делом нужно получить входные данные из текстового файла и сохранить их в дереве.Второй момент - позволить пользователю искать в этом дереве сохраненные значения по первому элементу каждого столбца (который является датой).Третий пункт - позволить пользователю удалять значения с определенной даты.

Прежде всего, вот формат входного файла, как вы можете видеть, есть дата (год, месяц, день, час), значение # 1 и # 2:

  • 2019060908 1,2 3,4

  • 2019060909 5,6 7,8

  • ....

Мне нужна помощь на самом первом этапе.Что означает получение входных данных из этого txt-файла и сохранение их в дереве. Давайте начнем с того, что я не уверен, какое дерево мне следует использовать.

Вот моя попытка структуры дерева

    typedef struct my_bt
 {
       char value;                  
       struct my_bt  *left_p, *right_p;     
   } my_bt_t;

Основная функция - это, по сути, функция, которая получает все три значения в первой строке моего текстового файла, вот где я начал:

int main (void) {

   int value;
   char str1[10], str2[10];

   FILE *file_input;

   file_input = fopen ("file_input", "r+");

   fscanf(file_input, "%d %s %s", &value, str1, str2);

   printf("Read String1 %d \n", value );
   printf("Read String2 %s \n", str1 );
   printf("Read String3 %s \n", str2 );

   fclose(file_input);

   /* function call */

   insert_in_bt(**root_p, value);

   return(0);
}

Затем я попытался реализовать функцию для вставки значения в дерево, вот оно:

int insert_in_bt(my_bt_t **root_p,
                    int value)
{
    int insert;
    my_bt_t *node_p,
              *father_p,
              *new_p;


    for (node_p = father_p = *root_p;
        ((node_p != NULL) && (node_p -> value != value ));
        father_p = node_p, node_p = (value < node_p->value)?
                    node_p ->left_p:
                    node_p ->right_p);

    if (node_p != NULL)
        insert = 0;
    else
    {
        insert = 1;
        new_p = (my_bt_t *)malloc(sizeof(my_bt_t));
        new_p -> value = value;
        new_p -> left_p = new_p -> right_p = NULL;
        if (node_p == *root_p)
            *root_p = new_p;
        else
            if (value < father_p -> value)
            father_p -> left_p = new_p;
           else
            father_p -> right_p = new_p;
    }
    return(insert);
}

Я знаю, что это немного грязно, и я знаю, что есть несколько ошибок, вызывающих , вот что говорит компилятор:

  • ошибка : «root_p» необъявлено (первое использование в этой функции) insert_in_bt (** root_p, value);^

  • примечание : каждый необъявленный идентификатор сообщается только один раз для каждой функции, указанной в предупреждении

  • : назначение из несовместимого типа указателя [-Wincompatible-pointer-types] Father_p = node_p, node_p = (значение значение)?

  • предупреждение : присваивание из несовместимого типа указателя [-Wincompatible-pointer-types] Father_p -> left_p = new_p;^

  • предупреждение : назначение из несовместимого типа указателя [-Wincompatible-pointer-types] Father_p -> right_p = new_p;^
  • предупреждение : игнорирование возвращаемого значения 'fscanf', объявленного с атрибутом warn_unused_result [-Wunused-result] fscanf (file_input, "% d% s% s", & value, str1,str2);

Если бы я мог сделать эти две функции "совместными", то я мог бы повторить их, чтобы заполнить дерево (если это имеет смысл).Что-то не так с указателями и типами, но я чувствую, что выбрал неправильный путь для решения проблемы и сбился с пути, поэтому я действительно открыт для новой точки зрения или нового решения.Я знаю, что есть много вещей, но люди сказали мне быть очень очень конкретным!

Спасибо всем!

...