我正在尝试根据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;
}
理论上,每当打印根节点时,它都是相同的,但实际上,我的结果是我按顺序添加的每个节点。
谢谢!
答案 0 :(得分:0)
正如其他专家指出的那样,您的代码段存在多个问题。我将列出一些:
strtok
的错误用法:strtok将 pointer 返回到发现的令牌的开头,同时还修改输入字符在您的情况下为buff
的数组。我准备了一个小的代码段,它将帮助您更好地了解函数https://ideone.com/6NCcrR的行为。考虑使用strcpy
创建返回的字符串的副本,而不是直接分配它。
比起fgets(...) != NULL
更喜欢fgets(...) > 0
,您可以进一步了解here的fgets
的返回值。
您对函数addNode
的逻辑不正确。尽管这不是最整洁的方式,但是将函数中的break;
更改为return newNode;
应该会有所帮助。这样可以避免在每次调用函数时都执行行currentNode = newNode;
,这是您遇到的问题。
如果我错了,请随时向我提问或纠正我。