c - 为什么我在 BST 中插入项目时,我的根节点会发生变化?

标签 c algorithm binary-search-tree

我正在尝试从 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 时,它都是相同的,但实际上我的结果是我按顺序添加的每个节点。

谢谢!

最佳答案

正如其他专家所指出的,您的代码片段存在多个问题。我将列出一些:

  1. 错误使用 strtok : strtok 返回一个指向已发现标记开头的指针,同时还修改输入字符数组,在您的例子中是buff .我准备了一个小代码片段,可以帮助您更好地理解函数的行为,https://ideone.com/6NCcrR .考虑使用 strcpy创建返回字符串的副本而不是直接分配它。

  2. 首选 fgets(...) != NULLfgets(...) > 0 , 你可以进一步了解fgets的返回值来自 here .

  3. 函数的逻辑 addNode是不正确的。虽然这不是最简洁的方法,但是改变了 break;在你的函数中 return newNode;应该有点帮助。这将避免行 currentNode = newNode;每次调用函数时都要执行,这就是您的问题。

如果我错了,请随时交叉提问或纠正我。

关于c - 为什么我在 BST 中插入项目时,我的根节点会发生变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52082359/

相关文章:

c - SDL 窗口未正确关闭

algorithm - 找到给定 K 个最佳候选者的时间戳

arrays - 算法题: select one number from each of the five arrays, 检查它们的和是否可以是2018?

algorithm - 计算图的最短路径时, "relax"操作的名字应该怎么理解?

c++ - bst 插入递归 C++

c - 无法理解二叉搜索树中插入的逻辑

scanf() 可以存储值吗?

c - 在我的代码中,为什么缺少函数声明对一个函数来说不是问题,但对另一个函数会发出警告?

c - 如何使用可变或重复数量的占位符在 C 中构造格式字符串?

java - 如何输出在 BST 中查找值所需的迭代次数?