Я работаю над этим проектом класса.Первым делом нужно получить входные данные из текстового файла и сохранить их в дереве.Второй момент - позволить пользователю искать в этом дереве сохраненные значения по первому элементу каждого столбца (который является датой).Третий пункт - позволить пользователю удалять значения с определенной даты.
Прежде всего, вот формат входного файла, как вы можете видеть, есть дата (год, месяц, день, час), значение # 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);
Если бы я мог сделать эти две функции "совместными", то я мог бы повторить их, чтобы заполнить дерево (если это имеет смысл).Что-то не так с указателями и типами, но я чувствую, что выбрал неправильный путь для решения проблемы и сбился с пути, поэтому я действительно открыт для новой точки зрения или нового решения.Я знаю, что есть много вещей, но люди сказали мне быть очень очень конкретным!
Спасибо всем!