红黑树接口使用的一个典型例子如下:
staticinline struct page * rb_search_page_cache(struct inode * inode, unsignedlong offset) { structrb_node * n = inode->i_rb_page_cache.rb_node; structpage * page; while(n) { page= rb_entry(n, struct page, rb_page_cache); if(offset < page->offset) n= n->rb_left; elseif (offset > page->offset) n= n->rb_right; else return page; } returnNULL; } staticinline struct page * __rb_insert_page_cache(struct inode * inode, unsignedlong offset, structrb_node * node) { structrb_node ** p = &inode->i_rb_page_cache.rb_node; structrb_node * parent = NULL; structpage * page; while(*p) { parent= *p; page= rb_entry(parent, struct page, rb_page_cache); if(offset < page->offset) p= &(*p)->rb_left; elseif (offset > page->offset) p= &(*p)->rb_right; else return page; } rb_link_node(node,parent, p); returnNULL; } staticinline struct page * rb_insert_page_cache(struct inode * inode, unsignedlong offset, structrb_node * node) { structpage * ret; if((ret = __rb_insert_page_cache(inode, offset, node))) gotoout; rb_insert_color(node,&inode->i_rb_page_cache); out: returnret; } |
因为红黑树的这些良好性质和实现中接口的简易性,它被广泛应用到内核编程中,大大提高了内核的效率。