免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1711 | 回复: 1
打印 上一主题 下一主题

关于libevent代码的几点疑问 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-06-13 10:35 |只看该作者 |倒序浏览
关于libevent代码的几点疑问
以下是libevent中红黑树代码中,删除二叉树节点部分的代码。本人对此有几点疑问,故请问下大家。

假设的情况:
                      X
                A           B
           C       D   E      F
树如上图, 要删除的节点是B。

struct {
        struct type *rbe_left;
        struct type *rbe_right;
        struct type *rbe_parent;
        int rbe_color;
}

struct type * \
name##_RB_REMOVE(struct name *head, struct type *elm) \
{ \
        struct type *child, *parent, *old = elm; \
        int color; \
        if (RB_LEFT(elm, field) == NULL) \
                child = RB_RIGHT(elm, field); \
        else if (RB_RIGHT(elm, field) == NULL) \
                child = RB_LEFT(elm, field); \
        else { \
                struct type *left; \
                elm = RB_RIGHT(elm, field); \
                while ((left = RB_LEFT(elm, field))) \
                        elm = left; \
                child = RB_RIGHT(elm, field); \
                parent = RB_PARENT(elm, field); \
                color = RB_COLOR(elm, field); \
                if (child) \
                        RB_PARENT(child, field) = parent; \
                if (parent) { \
                        if (RB_LEFT(parent, field) == elm) \
                                RB_LEFT(parent, field) = child; \
                        else \
                                RB_RIGHT(parent, field) = child; \
                        RB_AUGMENT(parent); \
                } else \
                        RB_ROOT(head) = child; \
                if (RB_PARENT(elm, field) == old) \
                        parent = elm; \
                // 下面这句,把old赋值给elm,那么赋值后,elm->field.right = elm

                (elm)->field = (old)->field; \
                if (RB_PARENT(old, field)) { \
                        if (RB_LEFT(RB_PARENT(old, field), field) == old)\
                                RB_LEFT(RB_PARENT(old, field), field) = elm;\
                        else \
                                RB_RIGHT(RB_PARENT(old, field), field) = elm;\
                        RB_AUGMENT(RB_PARENT(old, field)); \
                } else \
                        RB_ROOT(head) = elm; \
                                
                RB_PARENT(RB_LEFT(old, field), field) = elm; \
                if (RB_RIGHT(old, field)) \
                        RB_PARENT(RB_RIGHT(old, field), field) = elm; \
                // 还是上面的情况,经过上面3行代码之后,那么elm->field.parent = elm.

                // 那么,最后的结果便是 elm->field.parent = elm elm->field.right = elm. 这样岂不是有问题吗??

                if (parent) { \
                        left = parent; \
                        do { \
                                RB_AUGMENT(left); \
                        } while ((left = RB_PARENT(left, field))); \
                } \
                goto color; \
        } \
        ... \
    ... \
color: \
        if (color == RB_BLACK) \
                name##_RB_REMOVE_COLOR(head, parent, child); \
        return (old); \
} \

论坛徽章:
0
2 [报告]
发表于 2008-06-13 10:44 |只看该作者
发错地方了,麻烦斑竹删除
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP