📄 lib0037.html
字号:
<span style="background-color:d9d9d9">else if( val < (*(*link)).value)</span>
<span style="background-color:d9d9d9">{</span>
<span style="background-color:d9d9d9">PRINT("insertNode(): moving left\n",val);</span>
<span style="background-color:d9d9d9">insertNode(&((*(*link)).left),val);</span>
<span style="background-color:d9d9d9">}</span>
<span style="background-color:d9d9d9">else</span>
<span style="background-color:d9d9d9">{</span>
<span style="background-color:d9d9d9">PRINT("insertNode(): moving right\n",val);</span>
<span style="background-color:d9d9d9">insertNode(&((*(*link)).right),val);</span>
<span style="background-color:d9d9d9">}</span>
<span style="background-color:d9d9d9">return;</span>
<span style="background-color:d9d9d9">}/*end insertNode---------------------------------------------*/</span>
<span style="background-color:d9d9d9">void BinarySearchTree::insertNode(struct BiNode **link, struct</span>
<span style="background-color:d9d9d9">BiNode *ptr)</span>
<span style="background-color:d9d9d9">{</span>
<span style="background-color:d9d9d9">if( *link==NULL )</span>
<span style="background-color:d9d9d9">{</span>
<span style="background-color:d9d9d9">(*link) = (struct BiNode*)malloc(sizeof(struct BiNode));</span>
<span style="background-color:d9d9d9">(*(*link)).value = (*ptr).value;</span>
<span style="background-color:d9d9d9">(*(*link)).index = (*ptr).index;</span>
<span style="background-color:d9d9d9">(*(*link)).nreserved = (*ptr).nreserved;</span>
<span style="background-color:d9d9d9">(*(*link)).left = NULL;</span>
<span style="background-color:d9d9d9">(*(*link)).right = NULL;</span>
<span style="background-color:d9d9d9">PRINT("insertNode(): inserting %d\n",(*ptr).value);</span>
<span style="background-color:d9d9d9">}</span>
<span style="background-color:d9d9d9">else if( (*ptr).value < (*(*link)).value)</span>
<span style="background-color:d9d9d9">{</span>
<span style="background-color:d9d9d9">PRINT("insertNode(): moving left\n",(*ptr).value);</span>
<span style="background-color:d9d9d9">insertNode(&((*(*link)).left),ptr);</span>
<span style="background-color:d9d9d9">}</span><a name="460"></a><a name="IDX-229"></a>
<span style="background-color:d9d9d9">else</span>
<span style="background-color:d9d9d9">{</span>
<span style="background-color:d9d9d9">PRINT("insertNode(): moving right\n", (*ptr).value);</span>
<span style="background-color:d9d9d9">insertNode(&((*(*link)).right),ptr);</span>
<span style="background-color:d9d9d9">}</span>
<span style="background-color:d9d9d9">return;</span>
<span style="background-color:d9d9d9">}/*end insertNode---------------------------------------------*/</span>
<span style="background-color:d9d9d9">struct BiNode* BinarySearchTree::findNode</span>
<span style="background-color:d9d9d9">(</span>
<span style="background-color:d9d9d9">struct BiNode *link,</span>
<span style="background-color:d9d9d9">unsigned long val )</span>
<span style="background-color:d9d9d9">}</span>
<span style="background-color:d9d9d9">{</span>
<span style="background-color:d9d9d9">if(link==NULL)</span>
<span style="background-color:d9d9d9">{</span>
<span style="background-color:d9d9d9">return(NULL);</span>
<span style="background-color:d9d9d9">}</span>
<span style="background-color:d9d9d9">else if((*link).value == val)</span>
<span style="background-color:d9d9d9">{</span>
<span style="background-color:d9d9d9">return(link);</span>
<span style="background-color:d9d9d9">}</span>
<span style="background-color:d9d9d9">else if(val >= (*link).value)</span>
<span style="background-color:d9d9d9">{</span>
<span style="background-color:d9d9d9">return(findNode((*link).right,val));</span>
<span style="background-color:d9d9d9">}</span>
<span style="background-color:d9d9d9">else</span>
<span style="background-color:d9d9d9">{</span>
<span style="background-color:d9d9d9">return(findNode((*link).left,val));</span>
<span style="background-color:d9d9d9">}</span>
<span style="background-color:d9d9d9">}/*end findNode---------------------------------------------*/</span>
<span style="background-color:d9d9d9">struct BiNode* BinarySearchTree::deleteSmallestNode(struct</span>
<span style="background-color:d9d9d9">BiNode **link)</span>
<span style="background-color:d9d9d9">{</span>
<span style="background-color:d9d9d9">if((*(*link)).left != NULL)</span>
<span style="background-color:d9d9d9">{</span>
<span style="background-color:d9d9d9">return(deleteSmallestNode(&((*(*link)).left)));</span>
<span style="background-color:d9d9d9">}</span>
<span style="background-color:d9d9d9">else</span>
<span style="background-color:d9d9d9">{</span>
<span style="background-color:d9d9d9">struct BiNode *temp;</span>
<span style="background-color:d9d9d9">temp = *link;</span>
<span style="background-color:d9d9d9">(*link) = (*(*link)).right;</span>
<span style="background-color:d9d9d9">return(temp);</span>
<span style="background-color:d9d9d9">}</span>
<span style="background-color:d9d9d9">}/*end deleteSmallestNode------------------------------------*/</span><a name="461"></a><a name="IDX-230"></a>
<span style="background-color:d9d9d9">void BinarySearchTree::deleteNode</span>
<span style="background-color:d9d9d9">(</span>
<span style="background-color:d9d9d9">struct BiNode **link,</span>
<span style="background-color:d9d9d9">unsigned long val )</span>
<span style="background-color:d9d9d9">}</span>
<span style="background-color:d9d9d9">{</span>
<span style="background-color:d9d9d9">if( (*link)==NULL )</span>
<span style="background-color:d9d9d9">{</span>
<span style="background-color:d9d9d9">PRINT("deleteNode(): %d does not exist\n",val);</span>
<span style="background-color:d9d9d9">return;</span>
<span style="background-color:d9d9d9">}</span>
<span style="background-color:d9d9d9">if(val < (*(*link)).value)</span>
<span style="background-color:d9d9d9">{</span>
<span style="background-color:d9d9d9">deleteNode(&((*(*link)).left),val);</span>
<span style="background-color:d9d9d9">}</span>
<span style="background-color:d9d9d9">else if(val > (*(*link)).value)</span>
<span style="background-color:d9d9d9">{</span>
<span style="background-color:d9d9d9">deleteNode(&((*(*link)).right),val);</span>
<span style="background-color:d9d9d9">}</span>
<span style="background-color:d9d9d9">else</span>
<span style="background-color:d9d9d9">{</span>
<span style="background-color:d9d9d9">/*</span>
<span style="background-color:d9d9d9">have equality</span>
<span style="background-color:d9d9d9">3 cases</span>
<span style="background-color:d9d9d9">i) node has no children (just delete it)</span>
<span style="background-color:d9d9d9">ii) node has one child</span>
<span style="background-color:d9d9d9">(set parent of current node</span>
<span style="background-color:d9d9d9">to child of current node, delete current node)</span>
<span style="background-color:d9d9d9">iii) node has two children/subtrees</span>
<span style="background-color:d9d9d9">In the third case, get smallest/leftmost node in</span>
<span style="background-color:d9d9d9">right subtree of current node. Then delete the</span>
<span style="background-color:d9d9d9">leftmost node and place its value in the current</span>
<span style="background-color:d9d9d9">node (retain binary tree properties)</span>
<span style="background-color:d9d9d9">*/</span>
<span style="background-color:d9d9d9">struct BiNode *temp;</span>
<span style="background-color:d9d9d9">temp = *link;</span>
<span style="background-color:d9d9d9">if((*(*link)).right==NULL)</span>
<span style="background-color:d9d9d9">{</span>
<span style="background-color:d9d9d9">(*link) = (*(*link)).left;</span>
<span style="background-color:d9d9d9">}</span>
<span style="background-color:d9d9d9">else if((*(*link)).left==NULL)</span>
<span style="background-color:d9d9d9">{</span>
<span style="background-color:d9d9d9">(*link) = (*(*link)).right;</span>
<span style="background-color:d9d9d9">}</span>
<span style="background-color:d9d9d9">else</span>
<span style="background-color:d9d9d9">{</span>
<span style="background-color:d9d9d9">temp = deleteSmallestNode(&((*(*link)).right));</span><a name="462"></a><a name="IDX-231"></a>
<span style="background-color:d9d9d9">(*(*link)).value = (*temp).value;</span>
<span style="background-color:d9d9d9">}</span>
<span style="background-color:d9d9d9">PRINT("deleteNode(): freeing %d\n",val);</span>
<span style="background-color:d9d9d9">free(temp);</span>
<span style="background-color:d9d9d9">}</span>
<span style="background-color:d9d9d9">return;</span>
<span style="background-color:d9d9d9">}/*end deleteNode ---------------------------------------------------*/</span>
<span style="background-color:d9d9d9">void BinarySearchTree::deleteAll(struct BiNode **link)</span>
<span style="background-color:d9d9d9">{</span>
<span style="background-color:d9d9d9">if((*link)==NULL)</span>
<span style="background-color:d9d9d9">{</span>
<span style="background-color:d9d9d9">return;</span>
<span style="background-color:d9d9d9">}</span>
<span style="background-color:d9d9d9">deleteAll(&((*(*link)).left));</span>
<span style="background-color:d9d9d9">deleteAll(&((*(*link)).right));</span>
<span style="background-color:d9d9d9">PRINT("deleteAll(): freeing %d\n",(*(*link)).value);</span>
<span style="background-color:d9d9d9">free((*link));</span>
<span style="background-color:d9d9d9">*link=NULL;</span>
<span style="background-color:d9d9d9">return;</span>
<span style="background-color:d9d9d9">}/*end deleteAll-------------------------------------------*/</span>
<span style="background-color:d9d9d9">void BinarySearchTree::printTree(struct BiNode *link, int level)</span>
<span style="background-color:d9d9d9">{</span>
<span style="background-color:d9d9d9">int i;</span>
<span style="background-color:d9d9d9">if(link==NULL)</span>
<span style="background-color:d9d9d9">{</span>
<span style="background-color:d9d9d9">return;</span>
<span style="background-color:d9d9d9">}</span>
<span style="background-color:d9d9d9">printTree((*link).right,level+1);</span>
<span style="background-color:d9d9d9">for(i=0;i<level;i++){ printf ("-");}</span>
<span style="background-color:d9d9d9">printf("(%d)\n",(*link).value);</span>
<span style="background-color:d9d9d9">printTree((*link).left,level+1);</span>
<span style="background-color:d9d9d9">return;</span>
<span style="background-color:d9d9d9">}/*end printTree-----------------------------------------------------------------*/</span>
<span style="background-color:d9d9d9">unsigned long BinarySearchTree::getHeight(struct BiNode *link)</span>
<span style="background-color:d9d9d9">{</span>
<span style="background-color:d9d9d9">unsigned long u;</span>
<span style="background-color:d9d9d9">unsigned long v;</span>
<span style="background-color:d9d9d9">if(link==NULL) { return(-1); }</span><a name="463"></a><a name="IDX-232"></a>
<span style="background-color:d9d9d9">u = getHeight((*link).left);</span>
<span style="background-color:d9d9d9">v = getHeight((*link).right);</span>
<span style="background-color:d9d9d9">if(u > v){ return(u+1); }</span>
<span style="background-color:d9d9d9">else{ return(v+1); }</span>
<span style="background-color:d9d9d9">}/*end getHeight----------------------------------------------------------*/</span>
</pre>
</div>
<a></a>
</div>
<div class="section">
<h4 class="sect4-title">bitmap.cpp</h4>
<p class="first-para">The <span class="fixed">BitMap</span> class is also fairly straightforward in its implementation and could be reused for something else:</p>
<div class="informalexample">
<pre class="literallayout">
<span style="background-color:d9d9d9">/*</span>
<span style="background-color:d9d9d9">1 bitmap bit = 16-byte block of memory</span>
<span style="background-color:d9d9d9">1 bitmap byte (i.e., block) = 128-byte block of memory</span>
<span style="background-color:d9d9d9">*/</span>
<span style="background-color:d9d9d9">#define BYTES_PER_BITMAP_BIT 16</span>
<span style="background-color:d9d9d9">#define BYTES_PER_BITMAP_BYTE 128</span>
<span style="background-color:d9d9d9">/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++</span>
<span style="background-color:d9d9d9">+ declarations</span>
<span style="background-color:d9d9d9">+</span>
<span style="background-color:d9d9d9">++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/</span>
<span style="background-color:d9d9d9">class BitMap</span>
<span style="background-color:d9d9d9">{</span>
<span style="background-color:d9d9d9">private:</span>
<span style="background-color:d9d9d9">unsigned char *map;</span>
<span style="background-color:d9d9d9">unsigned long nbytes;</span>
<span style="background-color:d9d9d9">unsigned long nbits;</span>
<span style="background-color:d9d9d9">public:</span>
<span style="background-color:d9d9d9">BitMap(unsigned long nblocks);</span>
<span style="background-color:d9d9d9">~BitMap();</span>
<span style="background-color:d9d9d9">unsigned long getByteSize();</span>
<span style="background-color:d9d9d9">void setBits(int val,unsigned long nbits,unsigned long</span>
<span style="background-color:d9d9d9">index);</span>
<span style="background-color:d9d9d9">int getBit(unsigned long index);</span>
<span style="background-color:d9d9d9">long getBitRun(unsigned long size);</span>
<span style="background-color:d9d9d9">void printMap();</span>
<span style="background-color:d9d9d9">};</span>
<span style="background-color:d9d9d9">/*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++</span>
<span style="background-color:d9d9d9">+ definitions</span>
<span style="background-color:d9d9d9">+</span>
<span style="background-color:d9d9d9">++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/</span><a name="464"></a><a name="IDX-233"></a>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -