C语言多叉树节点插入后显示异常问题求助
问题描述
我需要实现一棵最多支持26个子节点的多叉树,用来存储从文本文件读取的单词字符(每个节点存单个字符)。已定义以下结构体:
typedef struct s_node { char letter; struct s_node* f_letters[26]; word* flechies; }t_node; typedef struct s_tree { t_node* root; }t_tree; typedef struct { char content[100]; char base_word[100]; int nature; int genre; int nombre; int temps; int personne; }word;
我编写了new_value节点创建函数和display_tree树显示函数,在main函数中读取文本文件并插入节点。但运行时仅能正确显示前两个节点('N'和's'),后续出现乱码且程序终止,期望完整显示单词"stabilimetre"的所有字符。
当前输出:
The letter in this node is N. //This is good The letter in this node is s. //This is good The letter in this node is ▲. //Why is it displaying kind of an adress and why the program is stopping ?
期望输出:
The letter in this node is N. The letter in this node is s. The letter in this node is t. The letter in this node is a. The letter in this node is b. The letter in this node is i. The letter in this node is l. The letter in this node is i. The letter in this node is m. The letter in this node is e. The letter in this node is t. The letter in this node is r. The letter in this node is e.
怀疑new_value函数存在问题但无法定位,请求排查并解决。
问题排查与解决
1. new_value函数常见错误点
- 子节点数组未初始化:如果创建节点时没有将
f_letters的26个指针全部设为NULL,后续遍历或插入会访问野指针,引发乱码和崩溃。 - 字符索引计算错误:插入时字符转索引的逻辑出错(比如大小写未统一、索引超出0-25范围),会导致错误的子节点指针被访问。
- 内存分配后未正确赋值:分配
t_node内存后,未给letter赋值,或flechies指针未初始化为NULL,会输出垃圾值。
2. 修正后的new_value函数
t_node* new_value(char c) { t_node* node = (t_node*)malloc(sizeof(t_node)); if (node == NULL) { perror("malloc failed"); exit(EXIT_FAILURE); } // 初始化节点存储的字符 node->letter = c; // 初始化所有子节点指针为NULL,避免野指针 for (int i = 0; i < 26; i++) { node->f_letters[i] = NULL; } // 初始化flechies指针为NULL node->flechies = NULL; return node; }
3. 插入与遍历函数的配套修正
(1)正确的单词插入逻辑
插入单词时需统一字符大小写,计算合法索引,不存在子节点时调用new_value创建:
#include <ctype.h> // 用于tolower函数 void insert_word(t_tree* tree, const char* word) { t_node* current = tree->root; for (int i = 0; word[i] != '\0'; i++) { char c = tolower(word[i]); int index = c - 'a'; // 跳过非字母字符 if (index < 0 || index >= 26) continue; if (current->f_letters[index] == NULL) { current->f_letters[index] = new_value(word[i]); } current = current->f_letters[index]; } // 若需要关联word结构体,可在此处赋值flechies字段 }
(2)安全的遍历显示函数
遍历仅访问非NULL的子节点,避免野指针访问:
void display_tree(t_node* node) { if (node == NULL) return; printf("The letter in this node is %c.\n", node->letter); // 遍历所有子节点 for (int i = 0; i < 26; i++) { display_tree(node->f_letters[i]); } }
4. 根节点初始化注意
main函数中需正确初始化树的根节点:
int main() { t_tree tree; // 初始化根节点为你输出中的'N' tree.root = new_value('N'); // 插入目标单词 insert_word(&tree, "stabilimetre"); // 遍历显示 display_tree(tree.root); // 记得后续添加内存释放逻辑,避免内存泄漏 return 0; }
内容的提问来源于stack exchange,提问作者Antoine Dupont
相关产品推荐
相关产品推荐

