我正在尝试从 csv 文件中的数据构建 BST。当我使用硬编码输入对其进行测试时,我的代码工作正常,但是当我从 csv 文件中读取时,根节点由于某种原因不断更改为新添加的节点,所以我认为我的 addNode() 函数没有任何问题但是我的主要有问题。我的代码有什么问题?请帮忙。
int main()
{
char buff[512];
Node* root = makeNode("CC","ID 100985");
FILE* fp= fopen("athlete_test.csv","r");
int i = 0;
while(fgets(buff, 512, (FILE*)fp)>0){
Data* data = malloc(sizeof(Data));
data->ID = strtok(buff,",");
char* Name = strtok(NULL,",");
data->Sex = strtok(NULL,",");
data->Age = strtok(NULL,",");
data->Height = strtok(NULL,",");
data->Weight = strtok(NULL,",");
data->Team = strtok(NULL,",");
data->NOC = strtok(NULL,",");
data->Games = strtok(NULL,",");
data->Year = strtok(NULL,",");
data->Season = strtok(NULL,",");
data->City = strtok(NULL,",");
data->Sport = strtok(NULL,",");
data->Event = strtok(NULL,",");
data->Medal = strtok(NULL,",");;
if (i==0)
{
root = makeNode(Name,data);
i++;
printNode(root);
}else
{
addNode(root,Name,data);
printNode(root);
}
}
return 0;
}
Node* makeNode(char* key,Data* data)
{
Node* newNode = malloc(sizeof(Node));
newNode->key = key;
newNode->data = data;
newNode->leftNode = NULL;
newNode->rightNode = NULL;
return newNode;
}
Node* addNode(Node* root,char* key,Data* data)
{
Node* newNode = makeNode(key,data);
Node* currentNode = root;
while(currentNode != NULL)
{
if (strcmp(currentNode->key,newNode->key)>=0)
{
if(currentNode->leftNode == NULL)
{
currentNode->leftNode = newNode;
break;
}
currentNode = currentNode->leftNode;
}
else
{
if(currentNode->rightNode == NULL)
{
currentNode->rightNode = newNode;
break;
}
currentNode = currentNode->rightNode;
}
}
currentNode = newNode;
return newNode;
}
理论上,每当我打印 root 时,它都是相同的,但实际上我的结果是我按顺序添加的每个节点。
谢谢!
最佳答案
正如其他专家所指出的,您的代码片段存在多个问题。我将列出一些:
错误使用
strtok
: strtok 返回一个指向已发现标记开头的指针,同时还修改输入字符数组,在您的例子中是buff
.我准备了一个小代码片段,可以帮助您更好地理解函数的行为,https://ideone.com/6NCcrR .考虑使用strcpy
创建返回字符串的副本而不是直接分配它。首选
fgets(...) != NULL
在fgets(...) > 0
, 你可以进一步了解fgets
的返回值来自 here .函数的逻辑
addNode
是不正确的。虽然这不是最简洁的方法,但是改变了break;
在你的函数中return newNode;
应该有点帮助。这将避免行currentNode = newNode;
每次调用函数时都要执行,这就是您的问题。
如果我错了,请随时交叉提问或纠正我。
关于c - 为什么我在 BST 中插入项目时,我的根节点会发生变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52082359/