C语言实现带计时功能红黑树运行触发段错误问题求助
问题原因与修复方案
核心错误点
- NIL节点实现完全错误:每次调用
NIL()都会分配新的内存地址,所有判断指针 == NIL的逻辑完全失效,且新建节点的指针成员初始值为NULL而非NIL,遍历到叶子节点时直接访问空指针触发段错误。 - 所有声明返回
struct nodo_alberoRBT*的函数(LeftRotate/RightRotate/FixUpLeft/FixUpRight/RBT_Insert_Fixup/insertRBT)均未返回有效值,外层调用拿到的是野指针,访问时直接触发非法内存访问。 - 函数参数传递的root是局部值,函数内修改root不会同步到外层,导致树的根节点更新完全失效,后续操作全部访问错误地址。
FixUpRight函数内存在错误逻辑z->padre->padre->figlio_sinistro = t_nil;,直接破坏树结构,将祖父节点的左子树强制置空,后续遍历直接访问野指针。- 代码调用了未定义的
singolo_esperimentoBST函数,编译阶段就存在未定义符号,运行直接崩溃。 struct alberoRBT结构体的root成员类型错误,写为不存在的struct nodo_alberoBST*,虽当前未使用但后续调用会触发类型不匹配错误。searchRBT内每次调用生成新的NIL节点,和树内存储的NIL地址不匹配,递归终止条件永远不成立,最终访问NULL指针的chiave成员触发段错误。
核心修复代码
1. 全局唯一NIL节点初始化
// 替换原有的NIL()函数实现 static nodo_alberoRBT* NIL = NULL; void init_NIL() { if (NIL != NULL) return; NIL = malloc(sizeof(nodo_alberoRBT)); NIL->color = BLACK; NIL->padre = NIL; NIL->figlio_sinistro = NIL; NIL->figlio_destro = NIL; }
程序启动后先调用init_NIL()初始化全局唯一的NIL节点,所有节点的空指针成员都赋值为NIL,不要使用NULL。
2. 修复函数返回与参数传递
所有修改树结构的函数最后返回新的根节点,外层调用时接收返回值更新本地root变量,比如:
// insertRBT最后添加返回语句 return root;
外层调用修改为:
t_root = insertRBT(t_root, nuovoNodoRBT(rand()));
3. 删除错误逻辑
删除FixUpRight函数里的z->padre->padre->figlio_sinistro = t_nil;这行错误代码。
4. 补全缺失函数
要么实现singolo_esperimentoBST函数,要么暂时注释掉esperimentoRBT内调用该函数的行,先验证RBT逻辑是否正常。
内容的提问来源于stack exchange,提问作者barioOX
相关产品推荐
相关产品推荐

