为什么同类型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
相关产品推荐
相关产品推荐

