我正在从事这个课堂项目。第一步是从txt文件获取输入并将其存储在树中。第二点是允许用户在该树中按每列的第一个元素(即日期)搜索存储的值。第三点是允许用户从特定日期删除值。
首先这是输入文件格式,如您所见,其中有一个日期(年,月,日,小时),值#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;
主要功能基本上是一个函数,它获取我的txt文件第一行中的所有三个值,这就是我开始的地方:
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 =(value
警告:来自不兼容指针类型[-Wincompatible-pointer-types]的赋值 Father_P-> left_p = new_p; ^
如果我可以使这两个功能“协作”,那么我可以重申它们来填充树(如果确实可行)。指针和类型有问题,但是我觉得我走了错误的道路来解决问题并误入歧途,所以我真的对新观点或新解决方案持开放态度。我知道有很多东西,但是人们告诉我要非常具体!
谢谢大家!