在BST中插入项目时,为什么根节点会更改?

时间:2018-08-29 16:41:01

标签: 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;

}

理论上,每当打印根节点时,它都是相同的,但实际上,我的结果是我按顺序添加的每个节点。

谢谢!

1 个答案:

答案 0 :(得分:0)

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

  1. strtok的错误用法:strtok将 pointer 返回到发现的令牌的开头,同时还修改输入字符在您的情况下为buff的数组。我准备了一个小的代码段,它将帮助您更好地了解函数https://ideone.com/6NCcrR的行为。考虑使用strcpy创建返回的字符串的副本,而不是直接分配它。

  2. 比起fgets(...) != NULL更喜欢fgets(...) > 0,您可以进一步了解herefgets的返回值。

  3. 您对函数addNode的逻辑不正确。尽管这不是最整洁的方式,但是将函数中的break;更改为return newNode;应该会有所帮助。这样可以避免在每次调用函数时都执行行currentNode = newNode;,这是您遇到的问题。

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