You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么同类型struct赋值后仍为NULL?C语言字符串二叉树构建问题

问题根因

你的代码核心问题是C语言的传值调用规则:
你定义的placeWordInTree函数接收的wordnode *currNode是传入指针的副本,函数内对currNode本身的赋值操作仅作用于副本,不会修改外部的实参(包括全局根节点head、父节点的left/right指针),所以你每次调用后外部的head永远保持初始的NULL值,所有新生成的节点根本没有挂载到实际的树结构上,自然else分支永远不会触发,树也无法正常打印。

修复方案

有两种常用的修复方式:

方案1:使用二级指针传递参数

修改placeWordInTree的参数为二级指针,直接操作外部指针的地址:

// 修改函数签名为接收二级指针
void placeWordInTree(char *word, wordnode **currNode) {
    // 解引用拿到外部指针本身
    if (*currNode == NULL) {
        *currNode = generateNode(word);
    } else {
        int strComp = strcmp(word, (*currNode)->word);
        if (strComp == 0) {
            (*currNode)->count++;
        } else if (strComp < 0) {
            // 递归时传入左子树指针的地址
            placeWordInTree(word, &((*currNode)->left));
        } else {
            // 递归时传入右子树指针的地址
            placeWordInTree(word, &((*currNode)->right));
        }
    }
}

main函数中调用方式修改为:

placeWordInTree(wordBuffer, &head);

方案2:修改函数返回值为节点指针

让placeWordInTree返回当前节点的地址,调用时赋值回原指针:

wordnode *placeWordInTree(char *word, wordnode *currNode) {
    if (currNode == NULL) {
        return generateNode(word);
    }
    int strComp = strcmp(word, currNode->word);
    if (strComp == 0) {
        currNode->count++;
    } else if (strComp < 0) {
        currNode->left = placeWordInTree(word, currNode->left);
    } else {
        currNode->right = placeWordInTree(word, currNode->right);
    }
    return currNode;
}

main函数中调用方式修改为:

head = placeWordInTree(wordBuffer, head);
额外优化建议

你当前generateNode中strncpy的用法存在潜在问题:strncpy(newNode->word, word, strlen(word))仅拷贝了单词的可见字符,没有手动补充字符串终止符\0,可能会导致后续字符串读取异常,建议直接使用strcpy(newNode->word, word),或者在拷贝后补充newNode->word[strlen(word)] = '\0'。

内容的提问来源于stack exchange,提问作者Kenney

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 13:57:04