Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 二叉树的故障标记化_C_Binary Tree_Tokenize - Fatal编程技术网

C 二叉树的故障标记化

C 二叉树的故障标记化,c,binary-tree,tokenize,C,Binary Tree,Tokenize,我试图将一个文本文件标记化,然后将标记放入二叉树中,其中具有较低值的标记位于树的左分支上,具有较高值的标记位于树的右分支上,重复的值具有更新的计数。我遇到的问题是,每当fgets从textfile获取新的字符串行时,它就会将二叉树的顶部更改为新字符串的第一个标记。它基本上创建了一个新的二叉树,而不是继续使用我想要的原始二叉树。我相信问题在于我标记文本文件的方式 函数insert执行二叉树的所有计算。 函数addNode将文本文件的第一个标记添加到二叉树的顶部 示例文本文件: 二七八一零 九五零

我试图将一个文本文件标记化,然后将标记放入二叉树中,其中具有较低值的标记位于树的左分支上,具有较高值的标记位于树的右分支上,重复的值具有更新的计数。我遇到的问题是,每当fgets从textfile获取新的字符串行时,它就会将二叉树的顶部更改为新字符串的第一个标记。它基本上创建了一个新的二叉树,而不是继续使用我想要的原始二叉树。我相信问题在于我标记文本文件的方式

函数insert执行二叉树的所有计算。 函数addNode将文本文件的第一个标记添加到二叉树的顶部

示例文本文件:

二七八一零

九五零

十一

    int main(void)
    {
        char buffer[100];
        char *del = " ";
        char *token;
        struct node* root = NULL;
        int i = 0;

        while (fgets(buffer, sizeof(buffer), stdin) != NULL)
        {
            token = strtok(buffer, del);

            if(root == NULL)
            {   
                printf("add: %s\n", token);
                root = addNode(token);    
            }

            else
            {
                insert(root, token);
            }


            while(token != NULL)
            {   
                token = strtok(NULL, del);

                if(token != NULL)
                    insert(root, token);
            }

        }

    }

void insert(struct node* root, char *token)
{


    if(strcmp(token, root->word) < 0)
    {
        printf("%s\n", root->word);
        if(root->left == NULL)
        {
            root->left = addNode(token);
            printf("left add: %s\n", token);

        }

        else
        {
            printf("going left\n");
            insert(root->left, token);
        }
    }

    else if(strcmp(token, root->word) > 0)
    {
        if(root->right == NULL)
        {
            root->right = addNode(token);
            printf("right add: %s\n", token);
        }
        else
        {
            printf("going right\n");
            insert(root->right, token);
        }
    }
    else
    {
        printf("updating count: %s\n", token);
        root->count = root->count + 1;
    }
}

struct node* addNode(char *token)
{
    struct node* temp = malloc(sizeof(struct node));

    temp->word = token;
    temp->left = NULL;
    temp->right = NULL;

    return temp;
}

这里的问题是,变量root作为值而不是引用传递给函数insert。作为一个值,它不能被修改

修正:


以多个重写子指针为代价编写insert函数的最简单方法可能是:

    struct node* insert(struct node* nd, const char* token)
    {
        int cmp;

        if(nd == NULL)
        {
            printf("add: %s\n", token);
            return addNode(token);
        }

        cmp = strcmp(token, nd->word);
        if(cmp < 0)
            nd->left = insert(nd->left, token);
        else if(cmp > 0)
            nd->right = insert(nd->right, token);
        else
        {
            printf("updating count: %s\n", token);
            nd->count ++;
        }

        return nd;
    }

程序正确率为90%。以下是您的问题:

strtok使用一些静态缓冲区。它将始终返回指向同一内存区域的指针。这就是为什么你觉得你的顶部节点每次都在变化。只需复制已解析的字符串即可。 您忘记初始化每个节点的计数!你迟早会遇到麻烦的,除非你也把它修好

struct node* addNode(char *token)
{
    struct node* temp = malloc(sizeof(struct node));

    temp->word = strdup(token);
    temp->left = NULL;
    temp->right = NULL;
    temp->count = 0;

    return temp;
}

如果没有看到代码的其余部分,任何人都无法帮助您。特别是addNode和insert函数。请看,如果没有其余的代码,情况会更好。我已得到更正,并且自发表评论时起,问题也已添加到中。忘记提及我的结构是结构节点{char*word;int count;结构节点*左;结构节点*右;};这种情况下的解决办法是什么?谢谢!这修复了它,但我得到的错误分配使指针从整数没有强制转换你知道如何摆脱它吗?首先,尝试移动文件底部的int main
    while (fgets(buffer, sizeof(buffer), stdin) != NULL)
    {
        for( token = strtok(buffer, del); token != NULL;
            token = strtok(NULL, del))
        {   
            root = insert(root, token);
        }
    }
struct node* addNode(char *token)
{
    struct node* temp = malloc(sizeof(struct node));

    temp->word = strdup(token);
    temp->left = NULL;
    temp->right = NULL;
    temp->count = 0;

    return temp;
}