【发布时间】:2017-01-19 10:30:21
【问题描述】:
这是 BST 节点
struct BST_node{
char *name1;
char *data1;
struct BST_node* left;
struct BST_node* right;
};
struct BST_node* Insert(struct BST_node *rootptr, datatype_t *d){
if(rootptr == NULL){
char name[66];
char data[1466];
rootptr = (struct BST_node*)malloc(sizeof(struct BST_node));
rootptr->name1 = d->name;
rootptr->data1 = d->data;
printf("%s 1\n", rootptr->name1);
rootptr->left = rootptr->right = NULL;
}
if(strcmp(rootptr->name1, d->name) < 0){
printf("%s left", rootptr->name1);
rootptr->left = Insert(rootptr -> left, d);
}
else if(strcmp(rootptr->name1, d->name) > 0){
printf("right\n");
rootptr->right = Insert(rootptr -> right, d);
}
else if(strcmp(rootptr->name1, d->name)==0){
printf("duplicate\n");
}
return rootptr;
}
所以我正在使用文件 ptrs 扫描 CSV 文件并从 datatype_d 读取数据。 例如,这是 CSV 文件中数据的样子。 “姓名,资料。”
这就是我读取 csv 文件并从我的主函数调用插入函数的方式。
int main(int argc, char** argv)
{
char* eq_csv_file = NULL;
char* eq_csv_file1 = NULL;
char* read_mode="r";
char* write_mode="w+";
struct BST_node* root = NULL;
int index = 0;
if(argv[1]!=NULL && argv[2] != NULL )
{
eq_csv_file=argv[1];
eq_csv_file1 = argv[2];
}
else
{
return EXIT_FAILURE;
}
FILE* Data_input = safe_open_file(eq_csv_file,read_mode);
FILE* Data_output = safe_open_file(eq_csv_file1, write_mode);
datatype_t **earth = (datatype_t**)malloc(MAX_NUM_LINE*sizeof(datatype_t *));
datatype_t *earth_one = read(Data_input);
while((earth_one) != NULL)
{
earth[index] = earth_one;
if(root != NULL){
printf("%s\n", (root->name1));
}
root = Insert(root, earth[index]);
index++;
earth_one= read(Data_input);
}
现在,当我运行此代码以检查其是否正常工作时,它会打印出 csv 文件中除第一个数据之外的所有数据的 Duplicate。我根本不知道我到底在哪里犯了错误并更改了 rootptr 并使其等于 datatype_d ,它在检查 strcmp 时打印重复。
所以一个例子是我从一个 CSV 文件中读取这个。
“戴夫”、“在加州大学洛杉矶分校学习”
“约翰”、“在 Google 工作”
“迈克”、“学校老师”
所以我想将这些插入 BST,但由于某种原因,它没有跟踪头节点“Dave”。它从不去左子树或右子树,而是说当我使用 strcmp 时它们是重复的。
这是输出:
戴夫 1
约翰
重复
分段错误:11
这是我从主函数调用以读取 csv 文件的读取代码。
read(FILE* fp)
{
char name[65];
char data[1465];
if (fscanf(fp, "%[^,] %[^\n]", name, data) == 2) {
datatype_t *d = (datatype_t*)malloc(sizeof(datatype_t));
d->name = name;
d->data = data;
return d;
}
return NULL;
}
【问题讨论】:
-
请发帖minimal reproducible example。相信我,这将为您和我们节省大量浪费的时间。
-
什么是
BST_node?您可以发布其余代码以提供完整的上下文吗? -
if(rootptr == NULL){ ... return rootptr; } -
就像@BLUEPIXY 说的那样,或者在
if (strcmp(rootptr->name1, d->name) < 0) {代码行前面放一个else。注意else if(strcmp(rootptr->name1, d->name)==0){中的测试是多余的;您之前已确定它既不小于也不大于零,因此它必须等于零而不第三次运行strcmp()。只需使用else(也可以将条件转换为else块内的断言)。 -
@BLUEPIXY :在读取两个值后给出了 mea seg 错误。
标签: c string data-structures binary-search-tree strcmp