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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 18:45:05