﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-那谁的技术博客-随笔分类-算法与数据结构</title><link>http://www.cppblog.com/converse/category/974.html</link><description /><language>zh-cn</language><lastBuildDate>Sat, 18 Apr 2009 05:58:11 GMT</lastBuildDate><pubDate>Sat, 18 Apr 2009 05:58:11 GMT</pubDate><ttl>60</ttl><item><title>自己实现的memcpy</title><link>http://www.cppblog.com/converse/archive/2009/04/18/80316.html</link><dc:creator>那谁</dc:creator><author>那谁</author><pubDate>Sat, 18 Apr 2009 01:30:00 GMT</pubDate><guid>http://www.cppblog.com/converse/archive/2009/04/18/80316.html</guid><wfw:comment>http://www.cppblog.com/converse/comments/80316.html</wfw:comment><comments>http://www.cppblog.com/converse/archive/2009/04/18/80316.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/converse/comments/commentRss/80316.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/converse/services/trackbacks/80316.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 没有考虑目标和源地址可能重复的情况,不知道除了这个方法之外不用汇编等方式还有没有更快的方法?至少我目前是想不出来:)<br>&nbsp;&nbsp;<a href='http://www.cppblog.com/converse/archive/2009/04/18/80316.html'>阅读全文</a><img src ="http://www.cppblog.com/converse/aggbug/80316.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/converse/" target="_blank">那谁</a> 2009-04-18 09:30 <a href="http://www.cppblog.com/converse/archive/2009/04/18/80316.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>另类的链表数据结构以及算法</title><link>http://www.cppblog.com/converse/archive/2009/03/22/77499.html</link><dc:creator>那谁</dc:creator><author>那谁</author><pubDate>Sun, 22 Mar 2009 11:14:00 GMT</pubDate><guid>http://www.cppblog.com/converse/archive/2009/03/22/77499.html</guid><wfw:comment>http://www.cppblog.com/converse/comments/77499.html</wfw:comment><comments>http://www.cppblog.com/converse/archive/2009/03/22/77499.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cppblog.com/converse/comments/commentRss/77499.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/converse/services/trackbacks/77499.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 另类的链表数据结构以及算法&nbsp;&nbsp;<a href='http://www.cppblog.com/converse/archive/2009/03/22/77499.html'>阅读全文</a><img src ="http://www.cppblog.com/converse/aggbug/77499.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/converse/" target="_blank">那谁</a> 2009-03-22 19:14 <a href="http://www.cppblog.com/converse/archive/2009/03/22/77499.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>memcached内存管理算法</title><link>http://www.cppblog.com/converse/archive/2009/03/09/76037.html</link><dc:creator>那谁</dc:creator><author>那谁</author><pubDate>Mon, 09 Mar 2009 14:24:00 GMT</pubDate><guid>http://www.cppblog.com/converse/archive/2009/03/09/76037.html</guid><wfw:comment>http://www.cppblog.com/converse/comments/76037.html</wfw:comment><comments>http://www.cppblog.com/converse/archive/2009/03/09/76037.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/converse/comments/commentRss/76037.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/converse/services/trackbacks/76037.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/converse/archive/2009/03/09/76037.html'>阅读全文</a><img src ="http://www.cppblog.com/converse/aggbug/76037.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/converse/" target="_blank">那谁</a> 2009-03-09 22:24 <a href="http://www.cppblog.com/converse/archive/2009/03/09/76037.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>二分查找算法(迭代和递归版本)</title><link>http://www.cppblog.com/converse/archive/2009/02/28/75190.html</link><dc:creator>那谁</dc:creator><author>那谁</author><pubDate>Sat, 28 Feb 2009 11:36:00 GMT</pubDate><guid>http://www.cppblog.com/converse/archive/2009/02/28/75190.html</guid><wfw:comment>http://www.cppblog.com/converse/comments/75190.html</wfw:comment><comments>http://www.cppblog.com/converse/archive/2009/02/28/75190.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cppblog.com/converse/comments/commentRss/75190.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/converse/services/trackbacks/75190.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/converse/archive/2009/02/28/75190.html'>阅读全文</a><img src ="http://www.cppblog.com/converse/aggbug/75190.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/converse/" target="_blank">那谁</a> 2009-02-28 19:36 <a href="http://www.cppblog.com/converse/archive/2009/02/28/75190.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ccache发布0.5版本</title><link>http://www.cppblog.com/converse/archive/2008/11/14/66929.html</link><dc:creator>那谁</dc:creator><author>那谁</author><pubDate>Fri, 14 Nov 2008 08:54:00 GMT</pubDate><guid>http://www.cppblog.com/converse/archive/2008/11/14/66929.html</guid><wfw:comment>http://www.cppblog.com/converse/comments/66929.html</wfw:comment><comments>http://www.cppblog.com/converse/archive/2008/11/14/66929.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cppblog.com/converse/comments/commentRss/66929.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/converse/services/trackbacks/66929.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/converse/archive/2008/11/14/66929.html'>阅读全文</a><img src ="http://www.cppblog.com/converse/aggbug/66929.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/converse/" target="_blank">那谁</a> 2008-11-14 16:54 <a href="http://www.cppblog.com/converse/archive/2008/11/14/66929.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>红黑树的实现源码(第二次修订版)</title><link>http://www.cppblog.com/converse/archive/2008/11/10/66530.html</link><dc:creator>那谁</dc:creator><author>那谁</author><pubDate>Mon, 10 Nov 2008 09:50:00 GMT</pubDate><guid>http://www.cppblog.com/converse/archive/2008/11/10/66530.html</guid><wfw:comment>http://www.cppblog.com/converse/comments/66530.html</wfw:comment><comments>http://www.cppblog.com/converse/archive/2008/11/10/66530.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.cppblog.com/converse/comments/commentRss/66530.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/converse/services/trackbacks/66530.html</trackback:ping><description><![CDATA[我曾经写过两个两个红黑树的实现, 分别在:<br>http://www.cppblog.com/converse/archive/2006/10/07/13413.html<br>http://www.cppblog.com/converse/archive/2007/11/28/37430.html<br><br>最近因为要给<a href="http://code.google.com/p/commoncache/">ccache</a>加入红黑树的支持, 找出来曾经实现的代码作为参考, 这才发现原来的实现都是有问题的,也怪我的测试用例写的不好, 仅仅对插入操作进行了测试, 我向所有因为阅读了这份代码而造成困惑的朋友表示道歉.<br><br>这次重新实现, 所有的代码推倒重新编写, 参考了<a href="http://lxr.linux.no/linux/lib/rbtree.c">linux内核中红黑树的实现算法</a>, 并且对测试用例进行了加强,希望这是最后一个对红黑树算法的修订版本.<br><br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008000;">/*-----------------------------------------------------------<br>&nbsp;&nbsp;&nbsp; RB-Tree的插入和删除操作的实现算法<br>&nbsp;&nbsp;&nbsp; 参考资料:<br>&nbsp;&nbsp;&nbsp; 1) &lt;&lt;Introduction to algorithm&gt;&gt;<br>&nbsp;&nbsp;&nbsp; 2) http://lxr.linux.no/linux/lib/rbtree.c<br><br>&nbsp;&nbsp;&nbsp; 作者：http://www.cppblog.com/converse/<br>&nbsp;&nbsp;&nbsp; 您可以自由的传播，修改这份代码，转载处请注明原作者<br><br>&nbsp;&nbsp;&nbsp; 红黑树的几个性质:<br>&nbsp;&nbsp;&nbsp; 1) 每个结点只有红和黑两种颜色<br>&nbsp;&nbsp;&nbsp; 2) 根结点是黑色的<br>&nbsp;&nbsp;&nbsp; 3)空节点是黑色的（红黑树中，根节点的parent以及所有叶节点lchild、rchild都不指向NULL，而是指向一个定义好的空节点）。 <br>&nbsp;&nbsp;&nbsp; 4) 如果一个结点是红色的,那么它的左右两个子结点的颜色是黑色的<br>&nbsp;&nbsp;&nbsp; 5) 对于每个结点而言,从这个结点到叶子结点的任何路径上的黑色结点<br>&nbsp;&nbsp;&nbsp; 的数目相同<br>-------------------------------------------------------------*/<br>&nbsp;<br>#include &lt;stdio.h&gt;<br>#include &lt;stdlib.h&gt;<br>#include &lt;string.h&gt;<br><br>typedef int key_t;<br>typedef int data_t;<br><br>typedef enum color_t<br>{<br>&nbsp;&nbsp;&nbsp; RED = 0,<br>&nbsp;&nbsp;&nbsp; BLACK = 1<br>}color_t;<br><br>typedef struct rb_node_t<br>{<br>&nbsp;&nbsp;&nbsp; struct rb_node_t *left, *right, *parent;<br>&nbsp;&nbsp;&nbsp; key_t key;<br>&nbsp;&nbsp;&nbsp; data_t data;<br>&nbsp;&nbsp;&nbsp; color_t color;<br>}rb_node_t;<br><br>/* forward declaration */<br>rb_node_t* rb_insert(key_t key, data_t data, rb_node_t* root);<br>rb_node_t* rb_search(key_t key, rb_node_t* root);<br>rb_node_t* rb_erase(key_t key, rb_node_t* root);<br><br>int main()<br>{<br>&nbsp;&nbsp;&nbsp; int i, count = 900000;<br>&nbsp;&nbsp;&nbsp; key_t key;<br>&nbsp;&nbsp;&nbsp; rb_node_t* root = NULL, *node = NULL;<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; srand(time(NULL));<br>&nbsp;&nbsp;&nbsp; for (i = 1; i &lt; count; ++i)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; key = rand() % count;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ((root = rb_insert(key, i, root)))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("[i = %d] insert key %d success!\n", i, key);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("[i = %d] insert key %d error!\n", i, key);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exit(-1);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ((node = rb_search(key, root)))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("[i = %d] search key %d success!\n", i, key);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("[i = %d] search key %d error!\n", i, key);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exit(-1);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!(i % 10))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ((root = rb_erase(key, root)))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("[i = %d] erase key %d success\n", i, key);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("[i = %d] erase key %d error\n", i, key);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; return 0;<br>}<br><br>static rb_node_t* rb_new_node(key_t key, data_t data)<br>{<br>&nbsp;&nbsp;&nbsp; rb_node_t *node = (rb_node_t*)malloc(sizeof(struct rb_node_t));<br><br>&nbsp;&nbsp;&nbsp; if (!node)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("malloc error!\n");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exit(-1);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; node-&gt;key = key, node-&gt;data = data;<br><br>&nbsp;&nbsp;&nbsp; return node;<br>}<br><br>/*-----------------------------------------------------------<br>|&nbsp;&nbsp; node&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; right<br>|&nbsp;&nbsp; / \&nbsp;&nbsp;&nbsp; ==&gt;&nbsp;&nbsp;&nbsp;&nbsp; / \<br>|&nbsp;&nbsp; a&nbsp; right&nbsp;&nbsp;&nbsp;&nbsp; node&nbsp; y<br>|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; / \&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; / \<br>|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b&nbsp; y&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a&nbsp;&nbsp; b<br>&nbsp;-----------------------------------------------------------*/<br>static rb_node_t* rb_rotate_left(rb_node_t* node, rb_node_t* root)<br>{<br>&nbsp;&nbsp;&nbsp; rb_node_t* right = node-&gt;right;<br><br>&nbsp;&nbsp;&nbsp; if ((node-&gt;right = right-&gt;left))<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; right-&gt;left-&gt;parent = node;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; right-&gt;left = node;<br><br>&nbsp;&nbsp;&nbsp; if ((right-&gt;parent = node-&gt;parent))<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (node == node-&gt;parent-&gt;right)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; node-&gt;parent-&gt;right = right;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; node-&gt;parent-&gt;left = right;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; root = right;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; node-&gt;parent = right;<br><br>&nbsp;&nbsp;&nbsp; return root;<br>}<br><br>/*-----------------------------------------------------------<br>|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; node&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; left<br>|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; / \&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; / \<br>|&nbsp;&nbsp;&nbsp; left&nbsp; y&nbsp;&nbsp; ==&gt;&nbsp;&nbsp;&nbsp; a&nbsp;&nbsp; node<br>|&nbsp;&nbsp; / \&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; / \<br>|&nbsp; a&nbsp;&nbsp; b&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b&nbsp;&nbsp; y<br>-----------------------------------------------------------*/<br>static rb_node_t* rb_rotate_right(rb_node_t* node, rb_node_t* root)<br>{<br>&nbsp;&nbsp;&nbsp; rb_node_t* left = node-&gt;left;<br><br>&nbsp;&nbsp;&nbsp; if ((node-&gt;left = left-&gt;right))<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; left-&gt;right-&gt;parent = node;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; left-&gt;right = node;<br><br>&nbsp;&nbsp;&nbsp; if ((left-&gt;parent = node-&gt;parent))<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (node == node-&gt;parent-&gt;right)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; node-&gt;parent-&gt;right = left;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; node-&gt;parent-&gt;left = left;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; root = left;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; node-&gt;parent = left;<br><br>&nbsp;&nbsp;&nbsp; return root;<br>}<br><br>static rb_node_t* rb_insert_rebalance(rb_node_t *node, rb_node_t *root)<br>{<br>&nbsp;&nbsp;&nbsp; rb_node_t *parent, *gparent, *uncle, *tmp;<br><br>&nbsp;&nbsp;&nbsp; while ((parent = node-&gt;parent) &amp;&amp; parent-&gt;color == RED)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gparent = parent-&gt;parent;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (parent == gparent-&gt;left)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uncle = gparent-&gt;right;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (uncle &amp;&amp; uncle-&gt;color == RED)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uncle-&gt;color = BLACK;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; parent-&gt;color = BLACK;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gparent-&gt;color = RED;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; node = gparent;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (parent-&gt;right == node)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; root = rb_rotate_left(parent, root);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tmp = parent;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; parent = node;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; node = tmp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; parent-&gt;color = BLACK;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gparent-&gt;color = RED;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; root = rb_rotate_right(gparent, root);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uncle = gparent-&gt;left;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (uncle &amp;&amp; uncle-&gt;color == RED)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; uncle-&gt;color = BLACK;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; parent-&gt;color = BLACK;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gparent-&gt;color = RED;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; node = gparent;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (parent-&gt;left == node)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; root = rb_rotate_right(parent, root);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tmp = parent;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; parent = node;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; node = tmp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; parent-&gt;color = BLACK;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gparent-&gt;color = RED;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; root = rb_rotate_left(gparent, root);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; root-&gt;color = BLACK;<br><br>&nbsp;&nbsp;&nbsp; return root;<br>}<br><br>static rb_node_t* rb_erase_rebalance(rb_node_t *node, rb_node_t *parent, rb_node_t *root)<br>{<br>&nbsp;&nbsp;&nbsp; rb_node_t *other, *o_left, *o_right;<br><br>&nbsp;&nbsp;&nbsp; while ((!node || node-&gt;color == BLACK) &amp;&amp; node != root)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (parent-&gt;left == node)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; other = parent-&gt;right;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (other-&gt;color == RED)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; other-&gt;color = BLACK;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; parent-&gt;color = RED;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; root = rb_rotate_left(parent, root);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; other = parent-&gt;right;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ((!other-&gt;left || other-&gt;left-&gt;color == BLACK) &amp;&amp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (!other-&gt;right || other-&gt;right-&gt;color == BLACK))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; other-&gt;color = RED;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; node = parent;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; parent = node-&gt;parent;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!other-&gt;right || other-&gt;right-&gt;color == BLACK)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ((o_left = other-&gt;left))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; o_left-&gt;color = BLACK;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; other-&gt;color = RED;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; root = rb_rotate_right(other, root);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; other = parent-&gt;right;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; other-&gt;color = parent-&gt;color;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; parent-&gt;color = BLACK;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (other-&gt;right)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; other-&gt;right-&gt;color = BLACK;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; root = rb_rotate_left(parent, root);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; node = root;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; other = parent-&gt;left;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (other-&gt;color == RED)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; other-&gt;color = BLACK;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; parent-&gt;color = RED;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; root = rb_rotate_right(parent, root);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; other = parent-&gt;left;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ((!other-&gt;left || other-&gt;left-&gt;color == BLACK) &amp;&amp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (!other-&gt;right || other-&gt;right-&gt;color == BLACK))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; other-&gt;color = RED;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; node = parent;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; parent = node-&gt;parent;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!other-&gt;left || other-&gt;left-&gt;color == BLACK)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ((o_right = other-&gt;right))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; o_right-&gt;color = BLACK;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; other-&gt;color = RED;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; root = rb_rotate_left(other, root);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; other = parent-&gt;left;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; other-&gt;color = parent-&gt;color;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; parent-&gt;color = BLACK;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (other-&gt;left)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; other-&gt;left-&gt;color = BLACK;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; root = rb_rotate_right(parent, root);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; node = root;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; if (node)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; node-&gt;color = BLACK;<br>&nbsp;&nbsp;&nbsp; } <br><br>&nbsp;&nbsp;&nbsp; return root;<br>}<br><br>static rb_node_t* rb_search_auxiliary(key_t key, rb_node_t* root, rb_node_t** save)<br>{<br>&nbsp;&nbsp;&nbsp; rb_node_t *node = root, *parent = NULL;<br>&nbsp;&nbsp;&nbsp; int ret;<br><br>&nbsp;&nbsp;&nbsp; while (node)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; parent = node;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ret = node-&gt;key - key;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (0 &lt; ret)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; node = node-&gt;left;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if (0 &gt; ret)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; node = node-&gt;right;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return node;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; if (save)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *save = parent;<br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; return NULL;<br>}<br><br>rb_node_t* rb_insert(key_t key, data_t data, rb_node_t* root)<br>{<br>&nbsp;&nbsp;&nbsp; rb_node_t *parent = NULL, *node;<br><br>&nbsp;&nbsp;&nbsp; parent = NULL;<br>&nbsp;&nbsp;&nbsp; if ((node = rb_search_auxiliary(key, root, &amp;parent)))<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return root;<br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; node = rb_new_node(key, data);<br>&nbsp;&nbsp;&nbsp; node-&gt;parent = parent; <br>&nbsp;&nbsp;&nbsp; node-&gt;left = node-&gt;right = NULL;<br>&nbsp;&nbsp;&nbsp; node-&gt;color = RED;<br><br>&nbsp;&nbsp;&nbsp; if (parent)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (parent-&gt;key &gt; key)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; parent-&gt;left = node;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; parent-&gt;right = node;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; root = node;<br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; return rb_insert_rebalance(node, root);<br>}<br><br>rb_node_t* rb_search(key_t key, rb_node_t* root)<br>{<br>&nbsp;&nbsp;&nbsp; return rb_search_auxiliary(key, root, NULL);<br>}<br><br>rb_node_t* rb_erase(key_t key, rb_node_t *root)<br>{<br>&nbsp;&nbsp;&nbsp; rb_node_t *child, *parent, *old, *left, *node;<br>&nbsp;&nbsp;&nbsp; color_t color;<br><br>&nbsp;&nbsp;&nbsp; if (!(node = rb_search_auxiliary(key, root, NULL)))<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("key %d is not exist!\n");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return root;<br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; old = node;<br><br>&nbsp;&nbsp;&nbsp; if (node-&gt;left &amp;&amp; node-&gt;right)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; node = node-&gt;right;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while ((left = node-&gt;left) != NULL)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; node = left;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; child = node-&gt;right;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; parent = node-&gt;parent;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; color = node-&gt;color;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (child)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; child-&gt;parent = parent;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (parent)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (parent-&gt;left == node)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; parent-&gt;left = child;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; parent-&gt;right = child;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; root = child;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (node-&gt;parent == old)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; parent = node;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; node-&gt;parent = old-&gt;parent;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; node-&gt;color = old-&gt;color;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; node-&gt;right = old-&gt;right;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; node-&gt;left = old-&gt;left;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (old-&gt;parent)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (old-&gt;parent-&gt;left == old)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; old-&gt;parent-&gt;left = node;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; old-&gt;parent-&gt;right = node;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; root = node;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; old-&gt;left-&gt;parent = node;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (old-&gt;right)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; old-&gt;right-&gt;parent = node;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!node-&gt;left)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; child = node-&gt;right;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if (!node-&gt;right)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; child = node-&gt;left;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; parent = node-&gt;parent;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; color = node-&gt;color;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (child)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; child-&gt;parent = parent;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (parent)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (parent-&gt;left == node)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; parent-&gt;left = child;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; parent-&gt;right = child;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; root = child;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; free(old);<br><br>&nbsp;&nbsp;&nbsp; if (color == BLACK)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; root = rb_erase_rebalance(child, parent, root);<br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; return root;<br>}<br><br></span><span style="color: #000000;"><br><br></span></div>
<br><br>     <img src ="http://www.cppblog.com/converse/aggbug/66530.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/converse/" target="_blank">那谁</a> 2008-11-10 17:50 <a href="http://www.cppblog.com/converse/archive/2008/11/10/66530.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ccache发布0.4版本</title><link>http://www.cppblog.com/converse/archive/2008/10/31/65656.html</link><dc:creator>那谁</dc:creator><author>那谁</author><pubDate>Fri, 31 Oct 2008 15:59:00 GMT</pubDate><guid>http://www.cppblog.com/converse/archive/2008/10/31/65656.html</guid><wfw:comment>http://www.cppblog.com/converse/comments/65656.html</wfw:comment><comments>http://www.cppblog.com/converse/archive/2008/10/31/65656.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/converse/comments/commentRss/65656.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/converse/services/trackbacks/65656.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/converse/archive/2008/10/31/65656.html'>阅读全文</a><img src ="http://www.cppblog.com/converse/aggbug/65656.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/converse/" target="_blank">那谁</a> 2008-10-31 23:59 <a href="http://www.cppblog.com/converse/archive/2008/10/31/65656.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>(算法导论习题解exercise2.3-4)递归版插入排序</title><link>http://www.cppblog.com/converse/archive/2008/09/29/63068.html</link><dc:creator>那谁</dc:creator><author>那谁</author><pubDate>Mon, 29 Sep 2008 15:27:00 GMT</pubDate><guid>http://www.cppblog.com/converse/archive/2008/09/29/63068.html</guid><wfw:comment>http://www.cppblog.com/converse/comments/63068.html</wfw:comment><comments>http://www.cppblog.com/converse/archive/2008/09/29/63068.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/converse/comments/commentRss/63068.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/converse/services/trackbacks/63068.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/converse/archive/2008/09/29/63068.html'>阅读全文</a><img src ="http://www.cppblog.com/converse/aggbug/63068.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/converse/" target="_blank">那谁</a> 2008-09-29 23:27 <a href="http://www.cppblog.com/converse/archive/2008/09/29/63068.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>(算法导论习题解problem2.4)寻找一个序列中逆序对的数量</title><link>http://www.cppblog.com/converse/archive/2008/09/29/63058.html</link><dc:creator>那谁</dc:creator><author>那谁</author><pubDate>Mon, 29 Sep 2008 12:32:00 GMT</pubDate><guid>http://www.cppblog.com/converse/archive/2008/09/29/63058.html</guid><wfw:comment>http://www.cppblog.com/converse/comments/63058.html</wfw:comment><comments>http://www.cppblog.com/converse/archive/2008/09/29/63058.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/converse/comments/commentRss/63058.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/converse/services/trackbacks/63058.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/converse/archive/2008/09/29/63058.html'>阅读全文</a><img src ="http://www.cppblog.com/converse/aggbug/63058.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/converse/" target="_blank">那谁</a> 2008-09-29 20:32 <a href="http://www.cppblog.com/converse/archive/2008/09/29/63058.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>(算法导论习题解exercise2.3-7)给定一个整数序列以及一个数X,确定该序列中是否有两个数的和为X</title><link>http://www.cppblog.com/converse/archive/2008/09/29/63024.html</link><dc:creator>那谁</dc:creator><author>那谁</author><pubDate>Mon, 29 Sep 2008 02:40:00 GMT</pubDate><guid>http://www.cppblog.com/converse/archive/2008/09/29/63024.html</guid><wfw:comment>http://www.cppblog.com/converse/comments/63024.html</wfw:comment><comments>http://www.cppblog.com/converse/archive/2008/09/29/63024.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cppblog.com/converse/comments/commentRss/63024.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/converse/services/trackbacks/63024.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/converse/archive/2008/09/29/63024.html'>阅读全文</a><img src ="http://www.cppblog.com/converse/aggbug/63024.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/converse/" target="_blank">那谁</a> 2008-09-29 10:40 <a href="http://www.cppblog.com/converse/archive/2008/09/29/63024.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>原地归并算法</title><link>http://www.cppblog.com/converse/archive/2008/09/28/63008.html</link><dc:creator>那谁</dc:creator><author>那谁</author><pubDate>Sun, 28 Sep 2008 11:51:00 GMT</pubDate><guid>http://www.cppblog.com/converse/archive/2008/09/28/63008.html</guid><wfw:comment>http://www.cppblog.com/converse/comments/63008.html</wfw:comment><comments>http://www.cppblog.com/converse/archive/2008/09/28/63008.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cppblog.com/converse/comments/commentRss/63008.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/converse/services/trackbacks/63008.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/converse/archive/2008/09/28/63008.html'>阅读全文</a><img src ="http://www.cppblog.com/converse/aggbug/63008.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/converse/" target="_blank">那谁</a> 2008-09-28 19:51 <a href="http://www.cppblog.com/converse/archive/2008/09/28/63008.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>AVL树删除节点算法</title><link>http://www.cppblog.com/converse/archive/2008/09/17/62069.html</link><dc:creator>那谁</dc:creator><author>那谁</author><pubDate>Wed, 17 Sep 2008 04:38:00 GMT</pubDate><guid>http://www.cppblog.com/converse/archive/2008/09/17/62069.html</guid><wfw:comment>http://www.cppblog.com/converse/comments/62069.html</wfw:comment><comments>http://www.cppblog.com/converse/archive/2008/09/17/62069.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.cppblog.com/converse/comments/commentRss/62069.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/converse/services/trackbacks/62069.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/converse/archive/2008/09/17/62069.html'>阅读全文</a><img src ="http://www.cppblog.com/converse/aggbug/62069.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/converse/" target="_blank">那谁</a> 2008-09-17 12:38 <a href="http://www.cppblog.com/converse/archive/2008/09/17/62069.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>AVL树中单,双旋转的解释</title><link>http://www.cppblog.com/converse/archive/2008/09/08/61266.html</link><dc:creator>那谁</dc:creator><author>那谁</author><pubDate>Sun, 07 Sep 2008 16:23:00 GMT</pubDate><guid>http://www.cppblog.com/converse/archive/2008/09/08/61266.html</guid><wfw:comment>http://www.cppblog.com/converse/comments/61266.html</wfw:comment><comments>http://www.cppblog.com/converse/archive/2008/09/08/61266.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/converse/comments/commentRss/61266.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/converse/services/trackbacks/61266.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/converse/archive/2008/09/08/61266.html'>阅读全文</a><img src ="http://www.cppblog.com/converse/aggbug/61266.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/converse/" target="_blank">那谁</a> 2008-09-08 00:23 <a href="http://www.cppblog.com/converse/archive/2008/09/08/61266.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>前缀匹配问题与trie树</title><link>http://www.cppblog.com/converse/archive/2008/08/19/59393.html</link><dc:creator>那谁</dc:creator><author>那谁</author><pubDate>Tue, 19 Aug 2008 15:41:00 GMT</pubDate><guid>http://www.cppblog.com/converse/archive/2008/08/19/59393.html</guid><wfw:comment>http://www.cppblog.com/converse/comments/59393.html</wfw:comment><comments>http://www.cppblog.com/converse/archive/2008/08/19/59393.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/converse/comments/commentRss/59393.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/converse/services/trackbacks/59393.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/converse/archive/2008/08/19/59393.html'>阅读全文</a><img src ="http://www.cppblog.com/converse/aggbug/59393.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/converse/" target="_blank">那谁</a> 2008-08-19 23:41 <a href="http://www.cppblog.com/converse/archive/2008/08/19/59393.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>服务器公共库开发-内存池管理模块</title><link>http://www.cppblog.com/converse/archive/2008/08/11/58563.html</link><dc:creator>那谁</dc:creator><author>那谁</author><pubDate>Mon, 11 Aug 2008 15:30:00 GMT</pubDate><guid>http://www.cppblog.com/converse/archive/2008/08/11/58563.html</guid><wfw:comment>http://www.cppblog.com/converse/comments/58563.html</wfw:comment><comments>http://www.cppblog.com/converse/archive/2008/08/11/58563.html#Feedback</comments><slash:comments>14</slash:comments><wfw:commentRss>http://www.cppblog.com/converse/comments/commentRss/58563.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/converse/services/trackbacks/58563.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/converse/archive/2008/08/11/58563.html'>阅读全文</a><img src ="http://www.cppblog.com/converse/aggbug/58563.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/converse/" target="_blank">那谁</a> 2008-08-11 23:30 <a href="http://www.cppblog.com/converse/archive/2008/08/11/58563.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ccache发布0.3版本</title><link>http://www.cppblog.com/converse/archive/2008/08/07/58253.html</link><dc:creator>那谁</dc:creator><author>那谁</author><pubDate>Thu, 07 Aug 2008 09:27:00 GMT</pubDate><guid>http://www.cppblog.com/converse/archive/2008/08/07/58253.html</guid><wfw:comment>http://www.cppblog.com/converse/comments/58253.html</wfw:comment><comments>http://www.cppblog.com/converse/archive/2008/08/07/58253.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/converse/comments/commentRss/58253.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/converse/services/trackbacks/58253.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.cppblog.com/converse/archive/2008/08/07/58253.html'>阅读全文</a><img src ="http://www.cppblog.com/converse/aggbug/58253.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/converse/" target="_blank">那谁</a> 2008-08-07 17:27 <a href="http://www.cppblog.com/converse/archive/2008/08/07/58253.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何使用位操作得到大于N且为2的次方的最小的数</title><link>http://www.cppblog.com/converse/archive/2008/06/21/54225.html</link><dc:creator>那谁</dc:creator><author>那谁</author><pubDate>Sat, 21 Jun 2008 07:36:00 GMT</pubDate><guid>http://www.cppblog.com/converse/archive/2008/06/21/54225.html</guid><wfw:comment>http://www.cppblog.com/converse/comments/54225.html</wfw:comment><comments>http://www.cppblog.com/converse/archive/2008/06/21/54225.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.cppblog.com/converse/comments/commentRss/54225.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/converse/services/trackbacks/54225.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 如何使用位操作得到大于N且为2的次方的最小的数&nbsp;&nbsp;<a href='http://www.cppblog.com/converse/archive/2008/06/21/54225.html'>阅读全文</a><img src ="http://www.cppblog.com/converse/aggbug/54225.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/converse/" target="_blank">那谁</a> 2008-06-21 15:36 <a href="http://www.cppblog.com/converse/archive/2008/06/21/54225.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ccache发布0.2版本</title><link>http://www.cppblog.com/converse/archive/2008/04/02/46016.html</link><dc:creator>那谁</dc:creator><author>那谁</author><pubDate>Wed, 02 Apr 2008 04:00:00 GMT</pubDate><guid>http://www.cppblog.com/converse/archive/2008/04/02/46016.html</guid><wfw:comment>http://www.cppblog.com/converse/comments/46016.html</wfw:comment><comments>http://www.cppblog.com/converse/archive/2008/04/02/46016.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/converse/comments/commentRss/46016.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/converse/services/trackbacks/46016.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: ccache发布0.2版本&nbsp;&nbsp;<a href='http://www.cppblog.com/converse/archive/2008/04/02/46016.html'>阅读全文</a><img src ="http://www.cppblog.com/converse/aggbug/46016.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/converse/" target="_blank">那谁</a> 2008-04-02 12:00 <a href="http://www.cppblog.com/converse/archive/2008/04/02/46016.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>研究了一下SGI STL的内存算法</title><link>http://www.cppblog.com/converse/archive/2008/04/01/45947.html</link><dc:creator>那谁</dc:creator><author>那谁</author><pubDate>Tue, 01 Apr 2008 11:55:00 GMT</pubDate><guid>http://www.cppblog.com/converse/archive/2008/04/01/45947.html</guid><wfw:comment>http://www.cppblog.com/converse/comments/45947.html</wfw:comment><comments>http://www.cppblog.com/converse/archive/2008/04/01/45947.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.cppblog.com/converse/comments/commentRss/45947.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/converse/services/trackbacks/45947.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 仿SGI STL的内存池算法.<br>&nbsp;&nbsp;<a href='http://www.cppblog.com/converse/archive/2008/04/01/45947.html'>阅读全文</a><img src ="http://www.cppblog.com/converse/aggbug/45947.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/converse/" target="_blank">那谁</a> 2008-04-01 19:55 <a href="http://www.cppblog.com/converse/archive/2008/04/01/45947.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>memcache内存池的设计原理</title><link>http://www.cppblog.com/converse/archive/2008/01/21/41592.html</link><dc:creator>那谁</dc:creator><author>那谁</author><pubDate>Mon, 21 Jan 2008 15:34:00 GMT</pubDate><guid>http://www.cppblog.com/converse/archive/2008/01/21/41592.html</guid><wfw:comment>http://www.cppblog.com/converse/comments/41592.html</wfw:comment><comments>http://www.cppblog.com/converse/archive/2008/01/21/41592.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/converse/comments/commentRss/41592.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/converse/services/trackbacks/41592.html</trackback:ping><description><![CDATA[memcache中管理内存的数据结构如下:<br><br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">typedef&nbsp;struct&nbsp;{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;size;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">/*</span><span style="COLOR: #000000">&nbsp;sizes&nbsp;of&nbsp;items&nbsp;</span><span style="COLOR: #000000">*/</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;perslab;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">/*</span><span style="COLOR: #000000">&nbsp;how&nbsp;many&nbsp;items&nbsp;per&nbsp;slab&nbsp;</span><span style="COLOR: #000000">*/</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;</span><span style="COLOR: #000000">**</span><span style="COLOR: #000000">slots;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">/*</span><span style="COLOR: #000000">&nbsp;list&nbsp;of&nbsp;item&nbsp;ptrs&nbsp;</span><span style="COLOR: #000000">*/</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;sl_total;&nbsp;&nbsp;</span><span style="COLOR: #000000">/*</span><span style="COLOR: #000000">&nbsp;size&nbsp;of&nbsp;previous&nbsp;</span><span style="COLOR: #0000ff">array</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*/</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;sl_curr;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">/*</span><span style="COLOR: #000000">&nbsp;first&nbsp;free&nbsp;slot&nbsp;</span><span style="COLOR: #000000">*/</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">end_page_ptr;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">/*</span><span style="COLOR: #000000">&nbsp;pointer&nbsp;</span><span style="COLOR: #0000ff">to</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">next</span><span style="COLOR: #000000">&nbsp;free&nbsp;item&nbsp;at&nbsp;</span><span style="COLOR: #0000ff">end</span><span style="COLOR: #000000">&nbsp;of&nbsp;page,&nbsp;</span><span style="COLOR: #0000ff">or</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*/</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;end_page_free;&nbsp;</span><span style="COLOR: #000000">/*</span><span style="COLOR: #000000">&nbsp;number&nbsp;of&nbsp;items&nbsp;remaining&nbsp;at&nbsp;</span><span style="COLOR: #0000ff">end</span><span style="COLOR: #000000">&nbsp;of&nbsp;last&nbsp;alloced&nbsp;page&nbsp;</span><span style="COLOR: #000000">*/</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;slabs;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">/*</span><span style="COLOR: #000000">&nbsp;how&nbsp;many&nbsp;slabs&nbsp;were&nbsp;allocated&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;this&nbsp;class&nbsp;</span><span style="COLOR: #000000">*/</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;</span><span style="COLOR: #000000">**</span><span style="COLOR: #000000">slab_list;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">/*</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">array</span><span style="COLOR: #000000">&nbsp;of&nbsp;slab&nbsp;pointers&nbsp;</span><span style="COLOR: #000000">*/</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;list_size;&nbsp;</span><span style="COLOR: #000000">/*</span><span style="COLOR: #000000">&nbsp;size&nbsp;of&nbsp;prev&nbsp;</span><span style="COLOR: #0000ff">array</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*/</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;killing;&nbsp;&nbsp;</span><span style="COLOR: #000000">/*</span><span style="COLOR: #000000">&nbsp;index</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">&nbsp;of&nbsp;dying&nbsp;slab,&nbsp;</span><span style="COLOR: #0000ff">or</span><span style="COLOR: #000000">&nbsp;zero&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;none&nbsp;</span><span style="COLOR: #000000">*/</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>}&nbsp;slabclass_t;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span></div>
<br>程序中有一个全局的数组<br>static slabclass_t slabclass[POWER_LARGEST + 1]用于保存slab,预分配内存池时调用的是void slabs_init(const size_t limit, const double factor) 函数,其中limit是内存池的最大容量,factor是分配时的增长因子.<br>比方说,加入factor是2,第一个在slabclass数组中的slab的每个item大小是128字节,那么下一个slab每个item的大小就是128*2,再下一个就是128*2*2(注意,为了简化问题的说明,上面没有考虑地址对齐的因素).<br><br>在预分配内存池时,最多给每个slab保存item的容量是1M内存,这个数值由#define POWER_BLOCK 1048576决定.<br>因此,slab中的几个元素在预分配内存时是这么定的:<br>size有一个起始值,这个值以后的增长由factor决定,增长的过程前面已经阐述过了;<br>perslab保存的是一个slab存放的item数量,因此perslab = POWER_BLOCK / slabclass[i].size;<br>如果预先分配一段内存供使用的话,也就是没有定义DONT_PREALLOC_SLABS宏,那么就调用slabs_preallocate进行预分配内存.<br>其中,end_page_ptr指向这个预分配好的指针,end_page_free表示的是目前空闲可用item的数量,在预分配时,这个值与perslab相同.<br>在这个内存池模型中,每个page实际上是一个数组,数组中每个元素的大小就是这个slab中item的大小.<br><br>另外,slots保存的是释放出来的item指针,sl_total表示总的数量,sl_curr表示的是目前可用的已经释放出来的item数量.<br><br>每一次要分配内存的时候,首先根据需要分配的内存大小在slabclass数组中查找索引最小的一个大于所要求内存的slab,如果slots不为空,那么就从这里返回内存,否则去查找end_page_ptr,如果也没有,那么就只能返回NULL了.<br>每一次释放内存的时候,同样的找到应该返回内存的slab元素,改写前面提到的slot指针和sl_curr数.<br><br>有点仓促,以后再完善~~<br><br><br>
<img src ="http://www.cppblog.com/converse/aggbug/41592.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/converse/" target="_blank">那谁</a> 2008-01-21 23:34 <a href="http://www.cppblog.com/converse/archive/2008/01/21/41592.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[算法]红黑树的实现代码(修订版)</title><link>http://www.cppblog.com/converse/archive/2007/11/28/37430.html</link><dc:creator>那谁</dc:creator><author>那谁</author><pubDate>Wed, 28 Nov 2007 06:29:00 GMT</pubDate><guid>http://www.cppblog.com/converse/archive/2007/11/28/37430.html</guid><wfw:comment>http://www.cppblog.com/converse/comments/37430.html</wfw:comment><comments>http://www.cppblog.com/converse/archive/2007/11/28/37430.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.cppblog.com/converse/comments/commentRss/37430.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/converse/services/trackbacks/37430.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: [算法]红黑树的实现代码(修订版)&nbsp;&nbsp;<a href='http://www.cppblog.com/converse/archive/2007/11/28/37430.html'>阅读全文</a><img src ="http://www.cppblog.com/converse/aggbug/37430.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/converse/" target="_blank">那谁</a> 2007-11-28 14:29 <a href="http://www.cppblog.com/converse/archive/2007/11/28/37430.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[算法]找出m个数中最小的n个数</title><link>http://www.cppblog.com/converse/archive/2007/11/26/37333.html</link><dc:creator>那谁</dc:creator><author>那谁</author><pubDate>Mon, 26 Nov 2007 10:54:00 GMT</pubDate><guid>http://www.cppblog.com/converse/archive/2007/11/26/37333.html</guid><wfw:comment>http://www.cppblog.com/converse/comments/37333.html</wfw:comment><comments>http://www.cppblog.com/converse/archive/2007/11/26/37333.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/converse/comments/commentRss/37333.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/converse/services/trackbacks/37333.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 找出n个数中最大的m个数。&nbsp;&nbsp;<a href='http://www.cppblog.com/converse/archive/2007/11/26/37333.html'>阅读全文</a><img src ="http://www.cppblog.com/converse/aggbug/37333.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/converse/" target="_blank">那谁</a> 2007-11-26 18:54 <a href="http://www.cppblog.com/converse/archive/2007/11/26/37333.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>AVL树的实现代码</title><link>http://www.cppblog.com/converse/archive/2007/08/29/31179.html</link><dc:creator>那谁</dc:creator><author>那谁</author><pubDate>Wed, 29 Aug 2007 14:06:00 GMT</pubDate><guid>http://www.cppblog.com/converse/archive/2007/08/29/31179.html</guid><wfw:comment>http://www.cppblog.com/converse/comments/31179.html</wfw:comment><comments>http://www.cppblog.com/converse/archive/2007/08/29/31179.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/converse/comments/commentRss/31179.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/converse/services/trackbacks/31179.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: AVL树的实现代码&nbsp;&nbsp;<a href='http://www.cppblog.com/converse/archive/2007/08/29/31179.html'>阅读全文</a><img src ="http://www.cppblog.com/converse/aggbug/31179.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/converse/" target="_blank">那谁</a> 2007-08-29 22:06 <a href="http://www.cppblog.com/converse/archive/2007/08/29/31179.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>仿STL中的堆算法的一个实现</title><link>http://www.cppblog.com/converse/archive/2007/03/20/20175.html</link><dc:creator>那谁</dc:creator><author>那谁</author><pubDate>Mon, 19 Mar 2007 16:28:00 GMT</pubDate><guid>http://www.cppblog.com/converse/archive/2007/03/20/20175.html</guid><wfw:comment>http://www.cppblog.com/converse/comments/20175.html</wfw:comment><comments>http://www.cppblog.com/converse/archive/2007/03/20/20175.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/converse/comments/commentRss/20175.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/converse/services/trackbacks/20175.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 仿STL中的堆算法的一个实现&nbsp;&nbsp;<a href='http://www.cppblog.com/converse/archive/2007/03/20/20175.html'>阅读全文</a><img src ="http://www.cppblog.com/converse/aggbug/20175.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/converse/" target="_blank">那谁</a> 2007-03-20 00:28 <a href="http://www.cppblog.com/converse/archive/2007/03/20/20175.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[数据结构]红黑树的实现源码</title><link>http://www.cppblog.com/converse/archive/2006/10/07/13413.html</link><dc:creator>那谁</dc:creator><author>那谁</author><pubDate>Sat, 07 Oct 2006 06:32:00 GMT</pubDate><guid>http://www.cppblog.com/converse/archive/2006/10/07/13413.html</guid><wfw:comment>http://www.cppblog.com/converse/comments/13413.html</wfw:comment><comments>http://www.cppblog.com/converse/archive/2006/10/07/13413.html#Feedback</comments><slash:comments>12</slash:comments><wfw:commentRss>http://www.cppblog.com/converse/comments/commentRss/13413.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/converse/services/trackbacks/13413.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 半年之前写的一个红黑树的实现算法了,当时有点忙没有写相应的文档,一下子几乎全都忘记了,作一个记录,改天有空了来补充说明文档.&nbsp;&nbsp;<a href='http://www.cppblog.com/converse/archive/2006/10/07/13413.html'>阅读全文</a><img src ="http://www.cppblog.com/converse/aggbug/13413.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/converse/" target="_blank">那谁</a> 2006-10-07 14:32 <a href="http://www.cppblog.com/converse/archive/2006/10/07/13413.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[算法问题]合并两个已经排序的数组为另一个数组</title><link>http://www.cppblog.com/converse/archive/2006/09/26/13006.html</link><dc:creator>那谁</dc:creator><author>那谁</author><pubDate>Tue, 26 Sep 2006 15:27:00 GMT</pubDate><guid>http://www.cppblog.com/converse/archive/2006/09/26/13006.html</guid><wfw:comment>http://www.cppblog.com/converse/comments/13006.html</wfw:comment><comments>http://www.cppblog.com/converse/archive/2006/09/26/13006.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cppblog.com/converse/comments/commentRss/13006.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/converse/services/trackbacks/13006.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 设子数组a[0:k]和a[k+1:n-1]已排好序（0<=k<=n-1).试设计一个合并这两个子数组为排好序的数组a[0:n-1]的算法．要求算法在最坏的情况下所用的计算时间为O(n), 且只用到O(1)的辅助空间．&nbsp;&nbsp;<a href='http://www.cppblog.com/converse/archive/2006/09/26/13006.html'>阅读全文</a><img src ="http://www.cppblog.com/converse/aggbug/13006.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/converse/" target="_blank">那谁</a> 2006-09-26 23:27 <a href="http://www.cppblog.com/converse/archive/2006/09/26/13006.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[算法问题]交换两个子数组的元素值</title><link>http://www.cppblog.com/converse/archive/2006/09/26/13005.html</link><dc:creator>那谁</dc:creator><author>那谁</author><pubDate>Tue, 26 Sep 2006 15:21:00 GMT</pubDate><guid>http://www.cppblog.com/converse/archive/2006/09/26/13005.html</guid><wfw:comment>http://www.cppblog.com/converse/comments/13005.html</wfw:comment><comments>http://www.cppblog.com/converse/archive/2006/09/26/13005.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/converse/comments/commentRss/13005.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/converse/services/trackbacks/13005.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 设a[0:n-1]是一个有n个元素的数组，k(0<=k<=n-1)是一个非负整数．试设计一个算法将子数组a[0:k]与a[k+1:n-1]换位．要求算法在最坏情况下耗时O(n), 且只用到O(1)的辅助空间．&nbsp;&nbsp;<a href='http://www.cppblog.com/converse/archive/2006/09/26/13005.html'>阅读全文</a><img src ="http://www.cppblog.com/converse/aggbug/13005.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/converse/" target="_blank">那谁</a> 2006-09-26 23:21 <a href="http://www.cppblog.com/converse/archive/2006/09/26/13005.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>二叉查找树的解析与实现</title><link>http://www.cppblog.com/converse/archive/2006/07/29/10665.html</link><dc:creator>那谁</dc:creator><author>那谁</author><pubDate>Fri, 28 Jul 2006 16:33:00 GMT</pubDate><guid>http://www.cppblog.com/converse/archive/2006/07/29/10665.html</guid><wfw:comment>http://www.cppblog.com/converse/comments/10665.html</wfw:comment><comments>http://www.cppblog.com/converse/archive/2006/07/29/10665.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/converse/comments/commentRss/10665.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/converse/services/trackbacks/10665.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 二叉查找树的解析与实现&nbsp;&nbsp;<a href='http://www.cppblog.com/converse/archive/2006/07/29/10665.html'>阅读全文</a><img src ="http://www.cppblog.com/converse/aggbug/10665.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/converse/" target="_blank">那谁</a> 2006-07-29 00:33 <a href="http://www.cppblog.com/converse/archive/2006/07/29/10665.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[算法问题]判断一个数是不是2的幂?</title><link>http://www.cppblog.com/converse/archive/2006/07/10/9664.html</link><dc:creator>那谁</dc:creator><author>那谁</author><pubDate>Mon, 10 Jul 2006 15:25:00 GMT</pubDate><guid>http://www.cppblog.com/converse/archive/2006/07/10/9664.html</guid><wfw:comment>http://www.cppblog.com/converse/comments/9664.html</wfw:comment><comments>http://www.cppblog.com/converse/archive/2006/07/10/9664.html#Feedback</comments><slash:comments>13</slash:comments><wfw:commentRss>http://www.cppblog.com/converse/comments/commentRss/9664.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/converse/services/trackbacks/9664.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: [算法问题]判断一个数是不是2的幂?&nbsp;&nbsp;<a href='http://www.cppblog.com/converse/archive/2006/07/10/9664.html'>阅读全文</a><img src ="http://www.cppblog.com/converse/aggbug/9664.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/converse/" target="_blank">那谁</a> 2006-07-10 23:25 <a href="http://www.cppblog.com/converse/archive/2006/07/10/9664.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>递归和递推的非严格概念解释</title><link>http://www.cppblog.com/converse/archive/2006/07/09/9615.html</link><dc:creator>那谁</dc:creator><author>那谁</author><pubDate>Sun, 09 Jul 2006 13:43:00 GMT</pubDate><guid>http://www.cppblog.com/converse/archive/2006/07/09/9615.html</guid><wfw:comment>http://www.cppblog.com/converse/comments/9615.html</wfw:comment><comments>http://www.cppblog.com/converse/archive/2006/07/09/9615.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/converse/comments/commentRss/9615.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/converse/services/trackbacks/9615.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 时常看到这两个词,有时分不清区别,想了一想,写了这篇非严格的概念分析&nbsp;&nbsp;<a href='http://www.cppblog.com/converse/archive/2006/07/09/9615.html'>阅读全文</a><img src ="http://www.cppblog.com/converse/aggbug/9615.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/converse/" target="_blank">那谁</a> 2006-07-09 21:43 <a href="http://www.cppblog.com/converse/archive/2006/07/09/9615.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>