免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: Godbach

Linux内核中的红黑树 [复制链接]

论坛徽章:
0
发表于 2009-01-23 19:00 |显示全部楼层
我对这方面还不是弄得很好!
但是还是谢谢了!

论坛徽章:
0
发表于 2009-02-04 13:07 |显示全部楼层
今天也在学习RBTree,根据内核里面的代码(比较懒,结构体和变量名都是内核copy的。:)),写了个测试代码,分享给大家。

#include "rbtree.h"

struct rb_root        key_user_tree;

struct key_user {
    struct rb_node                node;
    int                        key;               
};

struct key_user root_key_user;

struct key_user * RBTreeInsert(INT32 key)
{
    struct key_user *candidate = NULL, *user;
    struct rb_node *parent = NULL;
    struct rb_node **p;
   
    p = &key_user_tree.rb_node;
   
    while (*p) {
        parent = *p;
        user = rb_entry(parent, struct key_user, node);
        
        if (key < user->key)
            p = &(*p)->rb_left;
        else if (key > user->key)
            p = &(*p)->rb_right;
        else
        {
            printf("RBTreeInsert : exist");
            return NULL;
        }
    }   
   
    candidate = (struct key_user *)malloc( sizeof(struct key_user) );
    if ( NULL == candidate )
    {
        return NULL;
    }
   
    candidate->key = key;
    rb_link_node(&candidate->node, parent, p);
    rb_insert_color(&candidate->node, &key_user_tree);   
   
    return candidate;
}


struct key_user * RBTreeSerach(INT32 key)
{
    struct key_user *user;
    struct rb_node *parent = NULL;
    struct rb_node **p;
   
    p = &key_user_tree.rb_node;
   
    while (*p) {
        parent = *p;
        user = rb_entry(parent, struct key_user, node);
        
        if (key < user->key)
            p = &(*p)->rb_left;
        else if (key > user->key)
            p = &(*p)->rb_right;
        else
        {                       
            return user;
        }
    }   
   
    printf("RBTreeSerach : NULL");
    return NULL;
}

void BRTreeErase( struct key_user *user )
{
    rb_erase(&user->node, &key_user_tree);
   
    free (user );
}

void RBTreeTest()
{
    struct key_user *user;
   
    root_key_user.key = 0;
   
    rb_link_node(&root_key_user.node,
        NULL,
        &key_user_tree.rb_node);
   
    rb_insert_color(&root_key_user.node,
        &key_user_tree);   
   
    if ( NULL == RBTreeInsert( 1 ) )
    {
        printf("RBTreeTest : insert 1 ok");
    }
   
    if ( NULL == RBTreeInsert( 2 ) )
    {
        printf("RBTreeTest : insert 2 ok");
    }
   
    if ( NULL == RBTreeInsert( 1 ) )
    {
        printf("RBTreeTest : insert 1 exist");
    }   
   
    user = RBTreeSerach( 1 );
    if ( NULL != user )
    {
        BRTreeErase( user );
        printf("RBTreeTest : 1 find and delete");
    }
   
    user = RBTreeSerach( 1 );
    if ( NULL != user )
    {
        BRTreeErase( user );
    }
    else
    {
        printf("RBTreeTest : can't find");
    }
   
    user = RBTreeSerach( 2 );
    if ( NULL != user )
    {
        BRTreeErase( user );
        printf("RBTreeTest : 2 find and delete");
    }
}

[ 本帖最后由 HbbT 于 2009-2-4 13:09 编辑 ]

论坛徽章:
0
发表于 2011-04-06 15:47 |显示全部楼层
qos的htb也使用了红黑树

论坛徽章:
0
发表于 2011-04-06 21:13 |显示全部楼层
:wink:

论坛徽章:
0
发表于 2011-07-19 00:12 |显示全部楼层
学习学习

论坛徽章:
0
发表于 2011-07-19 14:53 |显示全部楼层
好文啊,要顶

论坛徽章:
1
天蝎座
日期:2013-12-06 18:23:58
发表于 2011-07-20 13:21 |显示全部楼层
不错,又看到了。学习一下。

论坛徽章:
0
发表于 2011-08-05 18:47 |显示全部楼层
这个之前学过。现在忘了。
刚好来复习一下。{:3_193:}

论坛徽章:
0
发表于 2011-09-19 12:33 |显示全部楼层
今天也在学习RBTree,根据内核里面的代码(比较懒,结构体和变量名都是内核copy的。:)),写了个测试代码 ...
HbbT 发表于 2009-02-04 13:07

这段代码是不是判断写错了?赫赫:wink:

  1. if ( NULL == RBTreeInsert( 1 ) )
  2. {
  3.                 printf("RBTreeTest : insert 1 ok\n");
  4. }

  5. if ( NULL == RBTreeInsert( 2 ) )
  6.   {
  7.                 printf("RBTreeTest : insert 2 ok\n");
  8.   }
复制代码
是不是应该这样写:

  1. if ( NULL != RBTreeInsert( 1 ) )
  2.         {
  3.                 printf("RBTreeTest : insert 1 ok\n");
  4.         }

  5.         if ( NULL != RBTreeInsert( 2 ) )
  6.         {
  7.                 printf("RBTreeTest : insert 2 ok\n");
  8.         }
复制代码

论坛徽章:
0
发表于 2012-09-02 17:06 |显示全部楼层
没看明白,要慢慢琢磨了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP