﻿<?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++博客-Jiang's C++ Space-随笔分类-Knowledge</title><link>http://www.cppblog.com/guogangj/category/10326.html</link><description>创作，也是一种学习的过程。</description><language>zh-cn</language><lastBuildDate>Thu, 15 Sep 2011 01:49:22 GMT</lastBuildDate><pubDate>Thu, 15 Sep 2011 01:49:22 GMT</pubDate><ttl>60</ttl><item><title>用VS2010发布ASP.net网站</title><link>http://www.cppblog.com/guogangj/archive/2011/09/13/155703.html</link><dc:creator>Jiang Guogang</dc:creator><author>Jiang Guogang</author><pubDate>Tue, 13 Sep 2011 14:11:00 GMT</pubDate><guid>http://www.cppblog.com/guogangj/archive/2011/09/13/155703.html</guid><wfw:comment>http://www.cppblog.com/guogangj/comments/155703.html</wfw:comment><comments>http://www.cppblog.com/guogangj/archive/2011/09/13/155703.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/guogangj/comments/commentRss/155703.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/guogangj/services/trackbacks/155703.html</trackback:ping><description><![CDATA[<p><span style="color: red">注：本文并不是一篇很全面的介绍网站发布的文章，仅供入门参考。</span><br /><br />发布网站有多种形式，比较传统的方式是使用FTP，或者用Windows远程桌面之类的，将各个aspx和dll复制到对应的服务器目录中去。这样做的缺点显而易见，就是不够方便，另外很难做到只上传更新过的文件。<br /><br />强大的Visual Studio提供了直接的网站发布的功能，其实准确说并不是Visual Studio提供的，而是通过了微软提供的一套工具，Web Deployment Tool，这套工具在你安装Visual Studio的时候也就自动安装了，并且跟Visual Studio很好地整合了起来，当然，光是你自己开发用的电脑上装了还是不行的，服务器也得装，反正我用的Windows Server 2003服务器上默认是没有的。这个工具的介绍及下载地址见：<br /><br /><a href="http://technet.microsoft.com/en-us/library/dd569059(WS.10).aspx">http://technet.microsoft.com/en-us/library/dd569059(WS.10).aspx</a><br /><br />然后&#8230;&#8230;<br /><br />我就偷懒一下，详情直接自己看MSDN，后面我只针对可能出现的问题讲讲：<br /><br /><a href="http://msdn.microsoft.com/zh-cn/library/dd465337.aspx">http://msdn.microsoft.com/zh-cn/library/dd465337.aspx</a><br /><br />在你&#8220;Publish Web&#8221;的时候，会出现这个对话框，注意那个&#8220;Site/application&#8221;的选项：<br /><br /><img border="0" alt="" src="http://www.cppblog.com/images/cppblog_com/guogangj/web_publish_1.png" width="516" height="600" /><br /><br />&#8220;/lm/w3svc/1/ROOT/app1&#8221;，这是我的写法，啥意思呢？&#8220;lm&#8221;大概是Local machine，网站发布位置跟前面指定的服务器一致；&#8220;w3svc&#8221;就是IIS服务了，&#8220;1&#8221;是Site ID，这里的&#8220;1&#8221;指的应该就是默认网站；&#8220;ROOT&#8221;这里指的是默认网站的根目录；最后的&#8220;app1&#8221;就是我建的虚拟目录了。如果是别的情况，请上MSDN查查看。这段讲解其实连我自己都不是很确定，这个选项很晦涩，又很关键，写错了就发布不成功。<br /><br />后面的User name/Passworld自然得要有管理员权限了。<br /><br />如果这里你成功了，你会很快发现一个问题，那就是web.config这个文件，服务器的配置一般跟本地调试的配置是不同的，你发布的时候是直接把本地的这个文件上传到服务器了，肯定是不对的了，怎么改？<br /><br />其实你如果是用向导创建工程的话，你就会发现web.config这个节点打开的话下面有两个文件，如图：<br /><br /><img border="0" alt="" src="http://www.cppblog.com/images/cppblog_com/guogangj/web_publish_2.png" width="188" height="48" /><br /><br />如果没有，你也可以右击web.config，然后在弹出的菜单中选择&#8220;Add Config Transforms&#8221;，&#8220;Web.Debug.Config&#8221;是用来在发布Debug版的网站的时候，用来对web.config做一些修改的，&#8220;Web.Release.Config&#8221;是用来在发布Release网站的时候，用来对web.config做一些修改的，如果你有更多的配置文件，这种&#8220;Config Transforms&#8221;会有更多个。<br /><br />你打开Web.Debug.Config看看，其实上面都已经有注释教你如何来写这个文件的了，只不过如果你需要更详细的信息的话，就不够，你得参看这个链接：<br /><br /><a href="http://msdn.microsoft.com/zh-cn/library/dd465326.aspx">http://msdn.microsoft.com/zh-cn/library/dd465326.aspx</a><br /><br />要全部学会里面的内容，一来很难，二来没必要，我们做项目，不是在做科研，感觉就是掌握原理，然后见招拆招，有需要再打开参考吧。<br /><br />希望本文能帮上你些忙。<br /></p><img src ="http://www.cppblog.com/guogangj/aggbug/155703.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/guogangj/" target="_blank">Jiang Guogang</a> 2011-09-13 22:11 <a href="http://www.cppblog.com/guogangj/archive/2011/09/13/155703.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C#实现类似C++功能的困惑</title><link>http://www.cppblog.com/guogangj/archive/2011/08/18/153813.html</link><dc:creator>Jiang Guogang</dc:creator><author>Jiang Guogang</author><pubDate>Thu, 18 Aug 2011 15:07:00 GMT</pubDate><guid>http://www.cppblog.com/guogangj/archive/2011/08/18/153813.html</guid><wfw:comment>http://www.cppblog.com/guogangj/comments/153813.html</wfw:comment><comments>http://www.cppblog.com/guogangj/archive/2011/08/18/153813.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/guogangj/comments/commentRss/153813.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/guogangj/services/trackbacks/153813.html</trackback:ping><description><![CDATA[<div>我要实现一个功能，用C++表达如下：
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;g_iTest&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;全局变量</span><span style="color: #008000"><br /></span><span style="color: #000000"><br /></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;A<br />{<br />A(</span><span style="color: #0000ff">int</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;pVal){m_pVal&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;pVal;}&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">将指针记录下来</span><span style="color: #008000"><br /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;Increase(){(</span><span style="color: #000000">*</span><span style="color: #000000">m_pVal)</span><span style="color: #000000">++</span><span style="color: #000000">;}<br />}<br /><br /></span><span style="color: #008000">//</span><span style="color: #008000"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span style="color: #008000"><br /></span><span style="color: #000000">A&nbsp;a(</span><span style="color: #000000">&amp;</span><span style="color: #000000">g_iTest);<br />a.Increase();&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">会改变g_iTest的值</span></div>换句话说，我想保存一个int的引用，对这个成员int的操作就是对那个全局int的操作，这样的功能，如何用C#来实现？<br /><br />由于int是值传递，所以没办法保存这个&#8220;引用&#8221;。<br /><br />我开始尝试使用unsafe的指针，但当我对System.Drawing.Color取址的时候，居然出现CS0208编译错误。纳闷。<br /><br />然后尝试使用装箱/拆箱的方法来传递一个object来实现，但A(object val)这样的构造函数确实太不美观，光看这个构造函数，谁知道A想要的是个整型？<br /><br />最后&#8230;&#8230;唉，自己弄了个MyInt。<br /><br />写MyInt的时候，我第一想到的就是类似C++的自动类型转换，使得我可以自由无碍地把整型&#8220;赋值&#8221;给MyInt，反之亦然，但我发觉C#的类型转换运算符重载函数居然必须是static的，完全没用。<br /><br />最最后&#8230;&#8230;先将就着吧。</div><img src ="http://www.cppblog.com/guogangj/aggbug/153813.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/guogangj/" target="_blank">Jiang Guogang</a> 2011-08-18 23:07 <a href="http://www.cppblog.com/guogangj/archive/2011/08/18/153813.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>让wprintf正常打印汉字</title><link>http://www.cppblog.com/guogangj/archive/2011/02/12/139934.html</link><dc:creator>Jiang Guogang</dc:creator><author>Jiang Guogang</author><pubDate>Sat, 12 Feb 2011 06:00:00 GMT</pubDate><guid>http://www.cppblog.com/guogangj/archive/2011/02/12/139934.html</guid><wfw:comment>http://www.cppblog.com/guogangj/comments/139934.html</wfw:comment><comments>http://www.cppblog.com/guogangj/archive/2011/02/12/139934.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/guogangj/comments/commentRss/139934.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/guogangj/services/trackbacks/139934.html</trackback:ping><description><![CDATA[printf可能是很多人接触的第一个C Lib函数，其宽字符版本为wprintf，我很早以前就发现了wprintf不能正常打印汉字，现在才知道应该怎么弄，实在惭愧，直接上代码：<br>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">locale.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;_tmain(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;argc,&nbsp;_TCHAR</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;argv[])<br><img id=Codehighlighter1_58_147_Open_Image onclick="this.style.display='none'; Codehighlighter1_58_147_Open_Text.style.display='none'; Codehighlighter1_58_147_Closed_Image.style.display='inline'; Codehighlighter1_58_147_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_58_147_Closed_Image onclick="this.style.display='none'; Codehighlighter1_58_147_Closed_Text.style.display='none'; Codehighlighter1_58_147_Open_Image.style.display='inline'; Codehighlighter1_58_147_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_58_147_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_58_147_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;setlocale&nbsp;(LC_ALL,&nbsp;</span><span style="COLOR: #000000">""</span><span style="COLOR: #000000">);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;WCHAR&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">pStr&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;L</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">abc中文</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;wprintf(L</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%s\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;pStr);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span></div>
解决方法如上，很简单，但具体原因说起来还蛮复杂的，感兴趣的话可以google一下。<br>
<img src ="http://www.cppblog.com/guogangj/aggbug/139934.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/guogangj/" target="_blank">Jiang Guogang</a> 2011-02-12 14:00 <a href="http://www.cppblog.com/guogangj/archive/2011/02/12/139934.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>根据下标数组重调位置</title><link>http://www.cppblog.com/guogangj/archive/2010/11/27/134843.html</link><dc:creator>Jiang Guogang</dc:creator><author>Jiang Guogang</author><pubDate>Sat, 27 Nov 2010 10:58:00 GMT</pubDate><guid>http://www.cppblog.com/guogangj/archive/2010/11/27/134843.html</guid><wfw:comment>http://www.cppblog.com/guogangj/comments/134843.html</wfw:comment><comments>http://www.cppblog.com/guogangj/archive/2010/11/27/134843.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/guogangj/comments/commentRss/134843.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/guogangj/services/trackbacks/134843.html</trackback:ping><description><![CDATA[最近做东西的时候出现这么一个问题，看起来很简单的：<br>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><span style="COLOR: #0000ff">#define</span><span style="COLOR: #000000">&nbsp;LARGE_SIZE&nbsp;1024</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">#define</span><span style="COLOR: #000000">&nbsp;ELEMENT_NUM&nbsp;5</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;CItem<br>{<br></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br>&nbsp;TCHAR&nbsp;cID;<br>&nbsp;BYTE&nbsp;data[LARGE_SIZE];<br>};<br><br>CItem&nbsp;data[ELEMENT_NUM];<br><br>INT&nbsp;reposition[ELEMENT_NUM]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;{</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">};</span></div>
要求，根据repositon的内容调整data的内容，如上，把原来下标4的元素调到0，把原来下标2的元素调到1。<br><br>写个算法，复杂度为O(n)，还要尽量节省空间，因为LARGE_SIZE可以很大，并且ELEMENT_NUM可能远远不止5个元素。<br><br>马上能想到的方法就是：<br>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;INT&nbsp;i;<br>&nbsp;&nbsp;&nbsp;&nbsp;CItem&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">pToHandle&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;CItem[ELEMENT_NUM];<br>&nbsp;&nbsp;&nbsp;&nbsp;memcpy(pToHandle,&nbsp;data,&nbsp;</span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(data));<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;i</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">ELEMENT_NUM;&nbsp;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data[i]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;pToHandle[reposition[i]];<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;delete[]&nbsp;pToHandle;</span></div>
但这不太符合节省空间的原则，有可能在一个嵌入式平台中，new操作就会失败。<br><br>问题看起来是简单，但却耗费了我不少时间，才写出这么一个算法，我直接贴上全部代码：<br>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><span style="COLOR: #000000">#include&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">stdafx.h</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br>#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">Windows.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><br></span><span style="COLOR: #0000ff">#define</span><span style="COLOR: #000000">&nbsp;LARGE_SIZE&nbsp;1024</span><span style="COLOR: #000000"><br><br></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;CItem<br>{<br></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br>&nbsp;&nbsp;&nbsp;&nbsp;TCHAR&nbsp;cID;<br>&nbsp;&nbsp;&nbsp;&nbsp;BYTE&nbsp;data[LARGE_SIZE];<br>};<br><br></span><span style="COLOR: #0000ff">#define</span><span style="COLOR: #000000">&nbsp;ELEMENT_NUM&nbsp;10</span><span style="COLOR: #000000"><br><br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;_tmain(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;argc,&nbsp;_TCHAR</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;argv[])<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">Data&nbsp;to&nbsp;test</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;CItem&nbsp;allData[ELEMENT_NUM];<br>&nbsp;&nbsp;&nbsp;&nbsp;INT&nbsp;i;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;i</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">ELEMENT_NUM;&nbsp;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;allData[i].cID&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">A</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;i;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;INT&nbsp;position[ELEMENT_NUM]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;{</span><span style="COLOR: #000000">5</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">6</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">9</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">7</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">8</span><span style="COLOR: #000000">};<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">The&nbsp;result&nbsp;be&nbsp;&nbsp;&nbsp;&nbsp;F&nbsp;&nbsp;B&nbsp;&nbsp;E&nbsp;&nbsp;D&nbsp;&nbsp;G&nbsp;&nbsp;J&nbsp;&nbsp;H&nbsp;&nbsp;C&nbsp;&nbsp;A&nbsp;&nbsp;I</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;i</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">ELEMENT_NUM;&nbsp;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CItem&nbsp;swapItem;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(position[i]</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">i)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">continue</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;swapItem&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;allData[i];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;INT&nbsp;iSeek&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;i;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">do</span><span style="COLOR: #000000">&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;INT&nbsp;iToSeekNext&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;position[iSeek];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;allData[iSeek]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;allData[iToSeekNext];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;position[iSeek]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;iSeek;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iSeek&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;iToSeekNext;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">&nbsp;(position[iSeek]</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">i);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;allData[iSeek]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;swapItem;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;position[iSeek]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;iSeek;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;i</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">ELEMENT_NUM;&nbsp;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_tprintf(TEXT(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%c&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">),&nbsp;allData[i].cID);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;_tprintf(TEXT(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">));<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>}</span></div>
看起来写得稍微有些乱，而且明显用了两层迭代，按道理说算法复杂度应该为O(n2)了，但再仔细分析代码后发觉：需要调整位置的元素，只需要移动一次，而整个遍历过程并不会出现重复遍历的情况。因此其实际复杂度应该为O(n)，已经是最高效了，看看还有没别的办法。
<img src ="http://www.cppblog.com/guogangj/aggbug/134843.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/guogangj/" target="_blank">Jiang Guogang</a> 2010-11-27 18:58 <a href="http://www.cppblog.com/guogangj/archive/2010/11/27/134843.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>发现MSDN离线文档的第一个错别字</title><link>http://www.cppblog.com/guogangj/archive/2010/11/19/134085.html</link><dc:creator>Jiang Guogang</dc:creator><author>Jiang Guogang</author><pubDate>Fri, 19 Nov 2010 05:52:00 GMT</pubDate><guid>http://www.cppblog.com/guogangj/archive/2010/11/19/134085.html</guid><wfw:comment>http://www.cppblog.com/guogangj/comments/134085.html</wfw:comment><comments>http://www.cppblog.com/guogangj/archive/2010/11/19/134085.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/guogangj/comments/commentRss/134085.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/guogangj/services/trackbacks/134085.html</trackback:ping><description><![CDATA[上图！发现这个错别字不容易啊，微软实在太牛逼，我天天看MSDN文档，但想找点错漏的东西出来都很费劲。<br><img border=0 alt="" src="http://www.cppblog.com/images/cppblog_com/guogangj/ms_msdn_mistake.png" width=467 height=480><br>
<img src ="http://www.cppblog.com/guogangj/aggbug/134085.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/guogangj/" target="_blank">Jiang Guogang</a> 2010-11-19 13:52 <a href="http://www.cppblog.com/guogangj/archive/2010/11/19/134085.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>保存QQ空间的网页至本地</title><link>http://www.cppblog.com/guogangj/archive/2010/10/28/131606.html</link><dc:creator>Jiang Guogang</dc:creator><author>Jiang Guogang</author><pubDate>Thu, 28 Oct 2010 03:03:00 GMT</pubDate><guid>http://www.cppblog.com/guogangj/archive/2010/10/28/131606.html</guid><wfw:comment>http://www.cppblog.com/guogangj/comments/131606.html</wfw:comment><comments>http://www.cppblog.com/guogangj/archive/2010/10/28/131606.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/guogangj/comments/commentRss/131606.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/guogangj/services/trackbacks/131606.html</trackback:ping><description><![CDATA[&nbsp;我网上其好几个空间，包括旧博客，QQ空间，MSN空间，还有163一个博客（现在不更新了），我一般隔一段时间就要把上面的内容保存到本地作为备份，以防哪天网络或者服务器不可用的时候我没法找回我辛辛苦苦编辑好的文章和内容。但不知道各位发觉没有，QQ空间的内容没法通过IE的另存为保存，你试试看就知道了，当你把它保存为一个mht文件的时候，看起来没什么问题，但打开你就发现了：内容全无。大致现象如下：<br><br>这是正常显示的qq空间的内容：<br><img border=0 alt="" src="http://www.cppblog.com/images/cppblog_com/guogangj/save_qq_space_1.png" width=818 height=480><br>这是保存好之后再打开的内容：<br><img border=0 alt="" src="http://www.cppblog.com/images/cppblog_com/guogangj/save_qq_space_2.png" width=792 height=464><br>为什么呢？如果你要看个究竟，可以这样：<br><img border=0 alt="" src="http://www.cppblog.com/images/cppblog_com/guogangj/save_qq_space_3.png" width=321 height=352><br>这样就能查看这个html到底有些什么了，你会发现，这个&#8220;源文件&#8221;根本没有你看到的那些内容，这是因为QQ空间使用了一些动态脚本技术，页面经过了好几次的生成过程（具体本人也比较外行，不是很懂web），总而言之，你是不能通过一般的方法来保存这种网页的。有人说直接用复制粘贴的方法，呵呵，老兄唉，这样岂不是格式都丢掉了？况且怎么处理带图片的情况？有人说截图，如果网页很长岂不是很累？再说了，你如何能够方便地从截好的图上面复制下一段文字？<br><br>所幸的是我发现了一个免费的工具，可以完成这个任务，这软件叫做SaveAsPlus，看名字就知道它是干嘛的了，安装它很简单，没有太多的选项，它是作为一个浏览器的加载项运行的，所以你得让你的浏览器允许这个加载项，在我的机器上安装好了之后运行不了，我重启了一趟机器就好了。使用起来十分简单，在要保存的网页上右击，呼出菜单，菜单里选择&#8220;加强另存为...&#8221;，这样就弹出另存为的窗口了，保存的过程稍慢，比同IE自带的save as来说，但它保存的内容确实是全的，基本上是完完整整地把你看到的动态页面保存下来了。我还测试了一些其它的网页，发觉用IE保存的网页很多时候缺乏一些如flash的动画，而用SaveAsPlus保存的内容则很完整。但SaveAsPlus也并非完美无缺，我感觉它保存下来的页面比较大，而且打开很慢，不知道是不是我机器比较慢的缘故。 <br><br>最可贵的是：这个软件是免费的。<br><br>它的下载地址是：<a href="http://wizbrother.com/saveasplus/">http://wizbrother.com/saveasplus/</a><br><br>这样无论是QQ空间还是别的网页，我想把它保存下来应该都没太大问题了。
<img src ="http://www.cppblog.com/guogangj/aggbug/131606.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/guogangj/" target="_blank">Jiang Guogang</a> 2010-10-28 11:03 <a href="http://www.cppblog.com/guogangj/archive/2010/10/28/131606.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个"滚动数组"类模板</title><link>http://www.cppblog.com/guogangj/archive/2010/06/18/118167.html</link><dc:creator>Jiang Guogang</dc:creator><author>Jiang Guogang</author><pubDate>Fri, 18 Jun 2010 05:10:00 GMT</pubDate><guid>http://www.cppblog.com/guogangj/archive/2010/06/18/118167.html</guid><wfw:comment>http://www.cppblog.com/guogangj/comments/118167.html</wfw:comment><comments>http://www.cppblog.com/guogangj/archive/2010/06/18/118167.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/guogangj/comments/commentRss/118167.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/guogangj/services/trackbacks/118167.html</trackback:ping><description><![CDATA[数组是最最常用的数据结构之一，我们现在往数组中加入元素，当数组被加满时，我们希望最早加入数组的元素就被冲掉，像一个队列那样，那应该如何实现呢？我写了个类模板，非常简单，初步测试下来还没发现什么问题。<br>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><span style="COLOR: #000000">#pragma&nbsp;once<br><br></span><span style="COLOR: #0000ff">#define</span><span style="COLOR: #000000">&nbsp;DEFAULT_ARRAY_SIZE&nbsp;20</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">#define</span><span style="COLOR: #000000">&nbsp;MINIMUM_ARRAY_SIZE&nbsp;5</span><span style="COLOR: #000000"><br><br>template&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;T</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;CRollArray<br>{<br></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br>&nbsp;&nbsp;&nbsp;&nbsp;CRollArray(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;iArraySize&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;DEFAULT_ARRAY_SIZE);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">~</span><span style="COLOR: #000000">CRollArray();<br>&nbsp;&nbsp;&nbsp;&nbsp;T</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">operator</span><span style="COLOR: #000000">[]&nbsp;(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;iIndex);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;Add(T&nbsp;element);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;GetSize();<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;Reset();<br></span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">:<br>&nbsp;&nbsp;&nbsp;&nbsp;T</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;m_pData;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;m_iBegin;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;m_iEnd;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;m_iArrSize;<br>};<br><br>template&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;T</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br>CRollArray</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">T</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">::CRollArray(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;iArraySize)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(iArraySize</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">MINIMUM_ARRAY_SIZE)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iArraySize</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">MINIMUM_ARRAY_SIZE;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;m_pData&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;T[iArraySize];<br>&nbsp;&nbsp;&nbsp;&nbsp;m_iBegin&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;m_iEnd&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;m_iArrSize&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;iArraySize;<br>}<br><br>template&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;T</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br>CRollArray</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">T</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">::</span><span style="COLOR: #000000">~</span><span style="COLOR: #000000">CRollArray(</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(m_pData</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">NULL)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delete[]&nbsp;m_pData;<br>}<br><br>template&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;T</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br>T</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;CRollArray</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">T</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">::</span><span style="COLOR: #0000ff">operator</span><span style="COLOR: #000000">[]&nbsp;(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;iIndex)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(m_iBegin</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">iIndex</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">m_iArrSize)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;m_pData[m_iBegin</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">iIndex];<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;m_pData[m_iBegin</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">iIndex</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">m_iArrSize];<br>}<br><br>template&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;T</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;CRollArray</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">T</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">::Add(T&nbsp;element)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(m_iEnd</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">m_iBegin</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;xxxxEB</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(m_iBegin</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">m_iArrSize</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_iEnd&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;m_iBegin;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_iBegin&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;xxxEBx</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">m_iEnd;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">m_iBegin;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Null&nbsp;array.</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(m_iBegin</span><span style="COLOR: #000000">==-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000">&nbsp;m_iEnd</span><span style="COLOR: #000000">==-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_iBegin&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_iEnd&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;BxxxxE</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(m_iBegin</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000">&nbsp;m_iEnd</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">m_iArrSize</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)<br>&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;</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">m_iBegin;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_iEnd&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>&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;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;BxxExx</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br>&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;</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">m_iEnd;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;m_pData[m_iEnd]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;element;<br>}<br><br>template&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;T</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;CRollArray</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">T</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">::GetSize()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(m_iEnd</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">m_iBegin</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">||</span><span style="COLOR: #000000">&nbsp;(m_iBegin</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000">&nbsp;m_iEnd</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">m_iArrSize</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;m_iArrSize;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(m_iBegin</span><span style="COLOR: #000000">==-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000">&nbsp;m_iEnd</span><span style="COLOR: #000000">==-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;m_iEnd</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">m_iBegin</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br>}<br><br>template&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;T</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;CRollArray</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">T</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">::Reset()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;m_iBegin&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;m_iEnd&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br>}</span></div>
这是测试代码：<br>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><span style="COLOR: #000000">#include&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">RollArray.h</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br><br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;_tmain(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;argc,&nbsp;_TCHAR</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;argv[])<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;CRollArray</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;arrTest(</span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">size:&nbsp;%d\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;arrTest.GetSize());<br>&nbsp;&nbsp;&nbsp;&nbsp;arrTest.Add(</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">size:&nbsp;%d\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;arrTest.GetSize());<br>&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">idx0:&nbsp;%d\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;arrTest[</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">]);<br>&nbsp;&nbsp;&nbsp;&nbsp;arrTest.Reset();<br>&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">size:&nbsp;%d\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;arrTest.GetSize());<br>&nbsp;&nbsp;&nbsp;&nbsp;arrTest.Add(</span><span style="COLOR: #000000">81</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;arrTest.Add(</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;arrTest.Add(</span><span style="COLOR: #000000">52</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;arrTest.Add(</span><span style="COLOR: #000000">123</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;arrTest.Add(</span><span style="COLOR: #000000">78</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;arrTest.Add(</span><span style="COLOR: #000000">987</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;arrTest.Add(</span><span style="COLOR: #000000">111</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">size:&nbsp;%d\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;arrTest.GetSize());<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;i</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">arrTest.GetSize();&nbsp;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%d&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;arrTest[i]);<br>&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;arrTest.Add(</span><span style="COLOR: #000000">321</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;arrTest.Add(</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;arrTest.Add(</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;arrTest.Add(</span><span style="COLOR: #000000">7</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;arrTest.Add(</span><span style="COLOR: #000000">54</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;arrTest.Add(</span><span style="COLOR: #000000">276</span><span style="COLOR: #000000">);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">size:&nbsp;%d\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;arrTest.GetSize());<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;i</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">arrTest.GetSize();&nbsp;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%d&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;arrTest[i]);<br>&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;arrTest.Add(</span><span style="COLOR: #000000">94</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;arrTest.Add(</span><span style="COLOR: #000000">53</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;arrTest.Add(</span><span style="COLOR: #000000">40</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;arrTest.Add(</span><span style="COLOR: #000000">70</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;arrTest.Add(</span><span style="COLOR: #000000">102</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;arrTest.Add(</span><span style="COLOR: #000000">138</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;arrTest.Add(</span><span style="COLOR: #000000">461</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;arrTest.Add(</span><span style="COLOR: #000000">110</span><span style="COLOR: #000000">);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">size:&nbsp;%d\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;arrTest.GetSize());<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;i</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">arrTest.GetSize();&nbsp;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%d&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;arrTest[i]);<br>&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>}</span></div>
代码执行结果如下：<br>size: 0<br>size: 1<br>idx0: 1<br>size: 0<br>size: 7<br>81 4 52 123 78 987 111<br>size: 10<br>123 78 987 111 321 3 2 7 54 276<br>size: 10<br>54 276 94 53 40 70 102 138 461 110<br>
<img src ="http://www.cppblog.com/guogangj/aggbug/118167.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/guogangj/" target="_blank">Jiang Guogang</a> 2010-06-18 13:10 <a href="http://www.cppblog.com/guogangj/archive/2010/06/18/118167.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>怪异的有符号/无符号转换问题</title><link>http://www.cppblog.com/guogangj/archive/2010/06/12/117685.html</link><dc:creator>Jiang Guogang</dc:creator><author>Jiang Guogang</author><pubDate>Sat, 12 Jun 2010 02:43:00 GMT</pubDate><guid>http://www.cppblog.com/guogangj/archive/2010/06/12/117685.html</guid><wfw:comment>http://www.cppblog.com/guogangj/comments/117685.html</wfw:comment><comments>http://www.cppblog.com/guogangj/archive/2010/06/12/117685.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.cppblog.com/guogangj/comments/commentRss/117685.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/guogangj/services/trackbacks/117685.html</trackback:ping><description><![CDATA[弄C++很多年了，没想到还居然被这种问题所困，其实不光我了，问了几个同道中人，都未能很好解释为什么，不过我还是记录一下，有知情人士看到的话不妨留言告知。<br><br>代码是hello world级别的，很简单：<br>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;_tmain(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;argc,&nbsp;_TCHAR</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;argv[])<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;ni&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">50</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;ui&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">100</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%d\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;ni</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">ui);<br>&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%d\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;(ni</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">ui)</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%d\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;(ni</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">ui)</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%d\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;(ni</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">)ui)</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>}</span></div>
问题：输出结果是什么？<br>我预期的输出结果应该是这样：<br>-50<br>-100<br>-25<br>-25<br>而事实上是：<br>-50<br>-100<br>2147483623<br>-25<br>在VC6，VS2005和VS2008上调试过，结果完全一致，这就表示，(ni-ui)/2的结果被认为是一个无符号整型，为什么会这样呢？我看了一下反汇编&#8230;&#8230;其实，我没看明白。（汇编没学好）<br><br>这种小问题可能会引发大问题，我最近在设计一个程序，把图片贴到窗口上，图片的宽和高被我设计为无符号的，因为宽和高最小为0，不可能是负数，而图片的绘制位置则有可能是负数，这跟坐标系有关，这样有符号和无符号之间就有可能出现了上面的那种操作，导致程序出现了一些怪异的行为，通过调试，发现是这个问题。<br><br>解决方法很简单，只要加上一个强制转换即可，像代码最后一个printf语句那样。但为什么这样我就不太清楚了，是C++的规范，还是编译器的问题，有其它编译器的朋友可以试试看。<br>
<img src ="http://www.cppblog.com/guogangj/aggbug/117685.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/guogangj/" target="_blank">Jiang Guogang</a> 2010-06-12 10:43 <a href="http://www.cppblog.com/guogangj/archive/2010/06/12/117685.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VSS使用手记</title><link>http://www.cppblog.com/guogangj/archive/2010/06/02/117024.html</link><dc:creator>Jiang Guogang</dc:creator><author>Jiang Guogang</author><pubDate>Wed, 02 Jun 2010 08:25:00 GMT</pubDate><guid>http://www.cppblog.com/guogangj/archive/2010/06/02/117024.html</guid><wfw:comment>http://www.cppblog.com/guogangj/comments/117024.html</wfw:comment><comments>http://www.cppblog.com/guogangj/archive/2010/06/02/117024.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/guogangj/comments/commentRss/117024.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/guogangj/services/trackbacks/117024.html</trackback:ping><description><![CDATA[<span style="FONT-FAMILY: 宋体; FONT-SIZE: 12pt">在Google输入VSS和SVN，看看网上对这两者的评价，估计九成以上的人都认为SVN优于VSS，一来SVN免费，二来功能更为强大，而且是跨平台的，不局限于Microsoft的环境，还不说它是开源的。我也是这么认为的，对于版本管理，Visual SVN + Tortoise SVN，太完美了，用起来相当简单，足见开源项目也有精品。<br><br>但VSS用的人还是很多，比如我现在的公司（最近换的工作），虽然我是一个人在战斗，但他们还是有要求说要把代码放到VSS中去，于是花了点时间摆弄了一下。<br><br>首先是安装及版本问题，一开始我以为VS2008会自带VSS2008，但其实没有，我所安装的VS2008为Team Suite版，都没有发现VSS2008，所以只好求其次，找到了VSS2005，安装包400多M，我不知道为什么这么大，但安装好之后我在安装目录下只发现了不到20M的文件，安装后版本号为8.0.50727.42，这样还不行，据说这样跟VS2008存在兼容性问题，毕竟VSS2005的生日早于VS2008，没考虑到VS2008的需要也是正常的，所以得一个补丁，补丁不大，大约3M，到网上搜索一下应该很好找到，补丁打上去之后版本就变成了8.0.50727.1551，这就是我们所要的了。安装过程还是挺快的，也没有太多的option，一路next下去即可。值得说一下的是VSS2005需要.Net Framework 2.0，不过我想现在大多数机器都有这个玩意儿了吧，应该不需要另外再装了。<br><br>安装完之后在开始菜单里有两个图标，一个是Microsoft Visual SourceSafe（简称VSS），一个是Microsoft Visual SourceSafe Administration（简称VSS Admin），名如其实，一个是&#8220;使用&#8221;，一个是&#8220;管理&#8221;。使用VSS Admin可以创建&#8220;数据库&#8221;，相当于SVN的容器，把工程相关文件放入&#8220;数据库&#8221;中，即实现了代码管理。<br><br>运行VSS Admin，点&lt;Cancel&gt;取消登录，然后&lt;File&gt;-&lt;New Database...&gt;即运行了&#8220;数据库&#8221;创建向导，指定一个存放这个&#8220;数据库&#8221;的位置，即可。向导还让你选择模式，模式有两种，一种是经典的Lock-Modify-Unlock模式，令一种是类似SVN的Copy-Modify-Merge模式，前一种不能多人同时修改，后一种不能检出最新版本。通常用VSS的人都会选择前一种模式。<br><br>&#8220;数据库&#8221;创建完后，观察一下指定的那么目录，目录下有个文件叫&#8220;srcsafe.ini&#8221;，可以认为这个文件就是VSS连接的依据，VSS必须能访问到这个文件，才能访问相关的&#8220;数据库&#8221;。我尝试修改&#8220;srcsafe.ini&#8221;的参数并把它放到别的地方去，但没有成功，我也不知道是不是一定要放在&#8220;数据库&#8221;的目录下。&#8220;数据库&#8221;目录下有三个子目录，一个是data，不用说，这就是放代码的地方了，一个temp，临时目录，一个users，关于用户信息。<br><br>关于安全策略，按照微软的说法，VSS的安全策略其实是依赖于Windows系统的，按照Windows的规则，一个用户如果不能访问&#8220;数据库&#8221;目录，那么这个用户用VSS也会遇到问题，而VSS的数据库目录往往需要同时让很多人访问，所以它的共享设置很重要，但又必须考虑到安全问题，最好设置为只让相关人士访问，或者建立一个用户组，这样方便管理。当然这都是IT做的事情了，且不去深究它。<br><br>如果需要修改&#8220;数据库&#8221;的配置，那重新打开VSS Admin，用Admin用户登录，Admin默认密码为空，你可以在登录完之后修改一下，你还可以创建更多的用户，比如创建一个用户叫&#8220;developer1&#8221;，并设置其密码为&#8220;abc123&#8221;。<br><br>&#8220;数据库&#8221;创建好后，打开VSS，连接它，在Open SourceSafe Database对话框中点&#8220;Add&#8221;，打开连接向导，选择&#8220;Connect to an existing database&#8221;，然后Browse，选择前面提到的那个&#8220;srcsafe.ini&#8221;文件，指定一个名字，这样就可以了。回到Open对话框中，点&#8220;Open&#8221;。这时候输入用户名密码，用前面创建的&#8220;developer1&#8221;登录，输入密码&#8220;abc123&#8221;即可。<br><br>好了，现在可以执行一系列的操作了，自己好好玩玩。但我总觉得不是很方便，比如添加文件，用起来就比较繁琐，不像Tortoise SVN那样，指定一个目录，所有文件都列了出来，让我选择哪个需要入库，哪个不要，并且很好的保留了目录结构，而这里不行，试试看就知道了，非常不爽&#8230;&#8230;<br><br>那VSS比SVN到底有什么优势呢？我想唯一的优势是跟Visual Studio的整合，另外就是习惯问题，不少人都习惯于使用Microsoft的东西了&#8230;&#8230;<br><br>比同直接使用VSS的客户端入库，也许用VS2008更好点，如何让一个工程入库？看图：<br><img border=0 alt="" src="http://www.cppblog.com/images/cppblog_com/guogangj/vss_note_1.png" width=364 height=468><br>然后blah blah blah，不必多说了。<br><br>搞定后发觉工程的文件的图标边上多了个小锁头，代表该文件正在被锁着，那如果要编辑这个文件，怎么办呢？很简单，通常跟以前没什么差别，打开，然后编辑，你会发现小锁头变成了一个小红钩，说明此文件已经被检出编辑了，如果其他人这个时候也想动这个文件，那就会得到一个出错提示。当你编辑完后，右击这个文件，Check In即可，小红钩重新变回了小锁头。<br><br>同样是在VS2008的Solution Explorer中，你可以查看某个文件的History，还有执行些别的操作等，这里就不多说了。<br><br>最后我想说，我没发现VSS有像SVN那样的制作Tag的功能，这个功能是十分十分有用的，比如我现在如果需要release一版程序，需要在release note中注明这版程序是用哪个tag的代码生成的，相当于立一个&#8220;里程碑&#8221;，我想你也能想象出这个功能的必要性，而VSS居然没有，只有针对单个文件的history list，还不能像Tortoise SVN那样用形象的Graph来表征版本变更历程，Damn it。<br></span>
<img src ="http://www.cppblog.com/guogangj/aggbug/117024.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/guogangj/" target="_blank">Jiang Guogang</a> 2010-06-02 16:25 <a href="http://www.cppblog.com/guogangj/archive/2010/06/02/117024.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一些可能你不知道的printf的参数</title><link>http://www.cppblog.com/guogangj/archive/2010/04/19/112965.html</link><dc:creator>Jiang Guogang</dc:creator><author>Jiang Guogang</author><pubDate>Mon, 19 Apr 2010 03:38:00 GMT</pubDate><guid>http://www.cppblog.com/guogangj/archive/2010/04/19/112965.html</guid><wfw:comment>http://www.cppblog.com/guogangj/comments/112965.html</wfw:comment><comments>http://www.cppblog.com/guogangj/archive/2010/04/19/112965.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/guogangj/comments/commentRss/112965.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/guogangj/services/trackbacks/112965.html</trackback:ping><description><![CDATA[1，打印指针，我们通常喜欢用%X，来打印一个指针，其实，有一种更正规的方式：<br>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;a;<br>printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%p</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">a);</span></div>
<br>2，设定字符串最多打印的字符：<br>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;FixArray[</span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">];<br>&nbsp;&nbsp;&nbsp;&nbsp;sprintf(FixArray,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%.9s</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">123456789012345678</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%s</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;FixArray);</span></div>
这样打印出来的字符就是&#8220;123456789&#8221;。<br><br>3，打印64位整型，定义64位整型的关键字是__int64，并不是LONGLONG，LONGLONG实质上是个union，当然了，__int64需要你的编译器的支持，现在的编译器应该都是支持的。<br>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><span style="COLOR: #000000">__int64&nbsp;a</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0xFFFFFFFFFFFFFFFF</span><span style="COLOR: #000000">;<br>printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">[%I64X]</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;a);</span></div>
这样打印出来的结果就是&#8220;FFFFFFFFFFFFFFFF&#8221;。
<img src ="http://www.cppblog.com/guogangj/aggbug/112965.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/guogangj/" target="_blank">Jiang Guogang</a> 2010-04-19 11:38 <a href="http://www.cppblog.com/guogangj/archive/2010/04/19/112965.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>调用转换与命名转换</title><link>http://www.cppblog.com/guogangj/archive/2010/04/02/111430.html</link><dc:creator>Jiang Guogang</dc:creator><author>Jiang Guogang</author><pubDate>Fri, 02 Apr 2010 06:06:00 GMT</pubDate><guid>http://www.cppblog.com/guogangj/archive/2010/04/02/111430.html</guid><wfw:comment>http://www.cppblog.com/guogangj/comments/111430.html</wfw:comment><comments>http://www.cppblog.com/guogangj/archive/2010/04/02/111430.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/guogangj/comments/commentRss/111430.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/guogangj/services/trackbacks/111430.html</trackback:ping><description><![CDATA[<span style="FONT-FAMILY: 宋体">&#8220;调用转换&#8221;（calling conversion）和&#8220;命名转换&#8221;（naming conversion）这两个概念对我们来说其实并不陌生，只要你听说过extern "C"，__cdecl，__stdcall和__fastcall这些东西，如果引用的声明和导出的声明不一致，就会出现类似下面这么一个编译错误：<br><br>RealTest.obj : error LNK2001: unresolved external symbol "double __stdcall Fun1(int,double)" (<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#63;&#70;&#117;&#110;&#49;&#64;&#64;&#89;&#71;&#78;&#72;&#78;&#64;&#90;">?Fun1@@YGNHN@Z</a>)<br>Debug/RealTest.exe : fatal error LNK1120: 1 unresolved externals<br><br>解决这个问题很简单，只要使用一致的声明就可以了。我们用C++编程，常接触到的也就两种命名转换，一种是C++的，不需要特别声明，一种是C的，需要加上个extern "C"前缀；而调用转换有三种，__cdecl，__stdcall和__fastcall，调用转换不同，导出的符号也是有差别的。这里我就不深究它们的差别了，我们所要记住的就是：保持一致。<br></span>
<img src ="http://www.cppblog.com/guogangj/aggbug/111430.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/guogangj/" target="_blank">Jiang Guogang</a> 2010-04-02 14:06 <a href="http://www.cppblog.com/guogangj/archive/2010/04/02/111430.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>超线程处理器，多核处理器和多处理器</title><link>http://www.cppblog.com/guogangj/archive/2010/03/29/110801.html</link><dc:creator>Jiang Guogang</dc:creator><author>Jiang Guogang</author><pubDate>Mon, 29 Mar 2010 03:16:00 GMT</pubDate><guid>http://www.cppblog.com/guogangj/archive/2010/03/29/110801.html</guid><wfw:comment>http://www.cppblog.com/guogangj/comments/110801.html</wfw:comment><comments>http://www.cppblog.com/guogangj/archive/2010/03/29/110801.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/guogangj/comments/commentRss/110801.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/guogangj/services/trackbacks/110801.html</trackback:ping><description><![CDATA[<span style="FONT-FAMILY: 宋体">超线程处理器，多核处理器和多处理器，到底有什么关系和区别？如果你能在Windows的设备管理器中看到多个处理器，那么说明你的处理器类型是前面提到的这三种中的一种。<br><br>超线程处理器并不是真正物理上的多核，它只是从逻辑上模拟多个处理器而已；<br>多核处理器是直接提供了多个物理上的处理器，只是这些处理器被封装到同一个芯片里并只占用一个处理器槽上而已；<br>而多处理器则是占用多个处理器插槽。<br><br>那问题来了，我们都知道，Windows 2000 Professional和Windows XP Professional只支持两个处理器，那么如果我的处理器是三核的，岂不是有一个核用不起来了么？事实上是这样的吗？当然不是。Windows从支持单处理器系统到支持多处理器系统，这个应该说是质的飞跃，但从支持两个处理器到支持三个处理器，或者四个，或者更多，其实没什么本质的不同，所以支持多少个处理器，这很大程度上是个License上的问题，而不是技术上的问题，你可以在注册表的HKLM\SYSTEM\CurrentControlSet\Control\Session Manager下边找到LicensedProcessors这个键值，这就是当前系统支持的处理器的个数，但单纯修改这个值来提高支持处理器个数还是不够的，这个涉及到更多的修改，当然了，也涉及到软件使用协议的问题&#8230;&#8230;这个限制，针对的其实是处理器插槽数，多核处理器虽然有多个物理CPU，但只插在一个插槽上，所以在License这一块，还是只算一个CPU。<br></span>
<img src ="http://www.cppblog.com/guogangj/aggbug/110801.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/guogangj/" target="_blank">Jiang Guogang</a> 2010-03-29 11:16 <a href="http://www.cppblog.com/guogangj/archive/2010/03/29/110801.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>工欲善其事，必先利其器</title><link>http://www.cppblog.com/guogangj/archive/2010/03/26/110591.html</link><dc:creator>Jiang Guogang</dc:creator><author>Jiang Guogang</author><pubDate>Fri, 26 Mar 2010 08:08:00 GMT</pubDate><guid>http://www.cppblog.com/guogangj/archive/2010/03/26/110591.html</guid><wfw:comment>http://www.cppblog.com/guogangj/comments/110591.html</wfw:comment><comments>http://www.cppblog.com/guogangj/archive/2010/03/26/110591.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/guogangj/comments/commentRss/110591.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/guogangj/services/trackbacks/110591.html</trackback:ping><description><![CDATA[<span style="FONT-FAMILY: 宋体">&nbsp;这阵子在看《深入解释Windows操作系统》这本书，即《Windows Internals》，可能是功力的问题，看起来好费劲，很多东西不理解，看一遍不够，太粗略，第二遍再看，精读，才觉得有点感觉，里面提到了很多工具，我整理了一下这些工具的来源：<br>① Windows自带，性能工具（perfmon），任务管理器（taskmgr），简单，却很有效。<br>② sysinternals.com，基本都是Mark E. Russinovich这个牛人写的！（崇拜一下）如著名的Process Explorer NT，还有很多很多，这些工具可以免费下载，Mark的公司被微软收购后，访问sysinternals.com，就自动转向微软公司的网站了。<br>③ Windows支持工具箱（Windows Support Tools），这个工具箱的安装包就附带在Windows的安装光盘中，执行&#8220;\SUPPORT\TOOLS&#8221;下的setup来安装。当然了，你得要一张原版的盘，那些所谓&#8220;精简系统&#8221;或者什么电脑城装机版可能没有，如果没有，你也可以直接在微软网站上下载。<br>④ Windows资源工具箱（Windows Resource Kit Tools），可以在Microsoft.com免费下载到&#8220;Windows Server 2003 Resource Kit Tools&#8221;，在微软的主页中用bing搜索一下就能找到，更新版的我是没找到，也不知道有没有。<br>⑤ Platform SDK，装了Visual Studio就有了，但Visual Studio带的不知道是什么版本的，我现在用的是Visual Studio 6.0，支持的最晚的Platform SDK就是Windows Server 2003 Platform SDK了，2005年发行的，微软的网站上也能下载到。<br>在以上几个工具包中，你可能会发现一些重复的工具，这其实也没什么奇怪的。<br>⑥ Windows调试工具箱（Debugging Tools for Windows），照样可以在微软网站上找到，其中包括了最最著名的WinDbg，没有这玩意儿我们很难看到内核啊，Visual Studio是没法进行内核调试的，而WinDbg无论是用户调试，还是内核调试，都是可以的。<br>⑦ SoftICE，来自Compuware公司，我了解不多，只知道是强大的调试工具，但根据David A. Solomon的说法，Mark这个牛人就是用这个工具不断地对Windows进行reverse engineering，了解到windows的内核并写出那么多精彩的工具和文章的。<br>⑧ DDK，貌似不能直接从微软网站上下载，不过我们可以选择从别的网站上下载到，上面也带了一些工具和手册，驱动开发必备。<br></span>
<img src ="http://www.cppblog.com/guogangj/aggbug/110591.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/guogangj/" target="_blank">Jiang Guogang</a> 2010-03-26 16:08 <a href="http://www.cppblog.com/guogangj/archive/2010/03/26/110591.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>图解数据结构（10）——排序</title><link>http://www.cppblog.com/guogangj/archive/2009/11/13/100876.html</link><dc:creator>Jiang Guogang</dc:creator><author>Jiang Guogang</author><pubDate>Fri, 13 Nov 2009 07:27:00 GMT</pubDate><guid>http://www.cppblog.com/guogangj/archive/2009/11/13/100876.html</guid><wfw:comment>http://www.cppblog.com/guogangj/comments/100876.html</wfw:comment><comments>http://www.cppblog.com/guogangj/archive/2009/11/13/100876.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.cppblog.com/guogangj/comments/commentRss/100876.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/guogangj/services/trackbacks/100876.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 十四、排序（Sort）这可能是最有趣的一节。排序的考题，在各大公司的笔试里最喜欢出了，但我看多数考得都很简单，通常懂得冒泡排序就差不多了，确实，我在刚学数据机构时候，觉得冒泡排序真的很&#8220;精妙&#8221;，我怎么就想不出呢？呵呵，其实冒泡通常是效率最差的排序算法，差多少？请看本文，你一定不会后悔的。1、冒泡排序（Bubbler Sort）前面刚说了冒泡排序的坏话，但冒泡排序...&nbsp;&nbsp;<a href='http://www.cppblog.com/guogangj/archive/2009/11/13/100876.html'>阅读全文</a><img src ="http://www.cppblog.com/guogangj/aggbug/100876.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/guogangj/" target="_blank">Jiang Guogang</a> 2009-11-13 15:27 <a href="http://www.cppblog.com/guogangj/archive/2009/11/13/100876.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>图解数据结构（9）——左偏树</title><link>http://www.cppblog.com/guogangj/archive/2009/10/30/99833.html</link><dc:creator>Jiang Guogang</dc:creator><author>Jiang Guogang</author><pubDate>Fri, 30 Oct 2009 07:55:00 GMT</pubDate><guid>http://www.cppblog.com/guogangj/archive/2009/10/30/99833.html</guid><wfw:comment>http://www.cppblog.com/guogangj/comments/99833.html</wfw:comment><comments>http://www.cppblog.com/guogangj/archive/2009/10/30/99833.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/guogangj/comments/commentRss/99833.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/guogangj/services/trackbacks/99833.html</trackback:ping><description><![CDATA[<p><span style="FONT-SIZE: 18pt"><strong>十三、左偏树（Leftist Tree）</strong></span></p>
<p>树这个数据结构内容真的很多，上一节所讲的二叉堆，其实就是一颗二叉树，这次讲的左偏树（又叫&#8220;左翼堆&#8221;），也是树。</p>
<p>二叉堆是个很不错的数据结构，因为它非常便于理解，而且仅仅用了一个数组，不会造成额外空间的浪费，但它有个缺点，那就是很难合并两个二叉堆，对于&#8220;合并&#8221;，&#8220;拆分&#8221;这种操作，我觉得最方面的还是依靠指针，改变一下指针的值就可以实现，要是涉及到元素的移动，那就复杂一些了。</p>
<p>左偏树跟二叉堆比起来，就是一棵真正意义上的树了，具有左右指针，所以空间开销上稍微大一点，但却带来了便于合并的便利。BTW：写了很多很多的程序之后，我发觉&#8220;空间换时间&#8221;始终是个应该考虑的编程方法。:)</p>
<p>左偏左偏，给人感觉就是左子树的比重比较大了，事实上也差不多，可以这么理解：左边分量重，那一直往右，就一定能最快地找到可以插入元素的节点了。所以可以这样下个定义：左偏树就是对其任意子树而言，往右到插入点的距离（下面简称为&#8220;距离&#8221;）始终小于等于往左到插入点的距离，当然了，和二叉堆一样，父节点的值要小于左右子节点的值。<br><img border=0 alt="" src="http://www.cppblog.com/images/cppblog_com/guogangj/ds_leftist_tree1.png" width=406 height=349></p>
<p>如果节点本身不满，可插入，那距离就为0，再把空节点的距离记为-1，这样我们就得出：父节点的距离 = 右子节点距离 + 1，因为右子节点的距离始终是小于等于左子节点距离的。我把距离的值用蓝色字体标在上图中了。</p>
<p>左偏树并一定平衡，甚至它可以很不平衡，因为它其实也不需要平衡，它只需要像二叉堆那样的功能，再加上合并方便，现在来看左偏树的合并算法，如图：<br><img border=0 alt="" src="http://www.cppblog.com/images/cppblog_com/guogangj/ds_leftist_merge_1.png" width=836 height=313><br><img border=0 alt="" src="http://www.cppblog.com/images/cppblog_com/guogangj/ds_leftist_merge_2.png" width=837 height=412><br><img border=0 alt="" src="http://www.cppblog.com/images/cppblog_com/guogangj/ds_leftist_merge_3.png" width=412 height=440></p>
<p>这种算法其实很适合用递归来做，但我还是用了一个循环，其实也差不多。对于左偏树来说，这个合并操作是最重要最基本的了。为什么？你看哦：Enqueue，我能不能看作是这个左偏树的root和一个单节点树的合并？而Dequeue，我能不能看作是把root节点取出来，然后合并root的左右子树？事实上就是这样的，我提供的代码就是这样干的。</p>
<p>Conclusion：左偏树比同二叉堆的优点就是方便合并，缺点是编程复杂度略高（也高不去哪），占用空间稍大（其实也大不去哪）。附上代码，老样子了，单个文件，直接调试的代码，零依赖零配置，一看就懂，代码虽然不算完美，但作为演示和学习，是足够了。</p>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><span style="COLOR: #000000">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">stdio.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><br></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;TreeNode</span><span style="COLOR: #008000"><br></span><span style="COLOR: #808080">////////////////////////////////////////////////////////////////////////</span><span style="COLOR: #008000">//</span><span style="COLOR: #808080"><br></span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;TreeNode&nbsp;<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;TreeNode(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;iVal)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_iData&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;iVal;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_iDistance&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_pLeft&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_pRight&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">~</span><span style="COLOR: #000000">TreeNode()<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br><br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;SwapLeftRight()<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TreeNode&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">pTmp&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;m_pLeft;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_pLeft&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;m_pRight;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_pRight&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;pTmp;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;UpdateDistance()<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_iDistance&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;GetRightDistance()</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;GetLeftDistance()<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;m_pLeft</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">?</span><span style="COLOR: #000000">m_pLeft</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">m_iDistance:</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;GetRightDistance()<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;m_pRight</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">?</span><span style="COLOR: #000000">m_pRight</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">m_iDistance:</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;m_iData;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;m_iDistance;<br>&nbsp;&nbsp;&nbsp;&nbsp;TreeNode</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;m_pLeft;<br>&nbsp;&nbsp;&nbsp;&nbsp;TreeNode</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;m_pRight;<br>};<br><br></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Stack</span><span style="COLOR: #008000"><br></span><span style="COLOR: #808080">////////////////////////////////////////////////////////////////////////</span><span style="COLOR: #008000">//</span><span style="COLOR: #808080"><br></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;Stack<br>{<br></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br>&nbsp;&nbsp;&nbsp;&nbsp;Stack(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;iAmount&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">~</span><span style="COLOR: #000000">Stack();<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">return&nbsp;1&nbsp;means&nbsp;succeeded,&nbsp;0&nbsp;means&nbsp;failed.</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;Pop(TreeNode</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;val);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;Push(TreeNode</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;val);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;Top(TreeNode</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;val);<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">iterator</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;GetTop(TreeNode</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">val);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;GetNext(TreeNode</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">val);<br></span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">:<br>&nbsp;&nbsp;&nbsp;&nbsp;TreeNode</span><span style="COLOR: #000000">**</span><span style="COLOR: #000000">&nbsp;m_pData;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;m_iCount;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;m_iAmount;<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">iterator</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;m_iCurr;<br>};<br><br>Stack::Stack(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;iAmount)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;m_pData&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;TreeNode</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">[iAmount];<br>&nbsp;&nbsp;&nbsp;&nbsp;m_iCount&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;m_iAmount&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;iAmount;<br>&nbsp;&nbsp;&nbsp;&nbsp;m_iCurr&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>}<br><br>Stack::</span><span style="COLOR: #000000">~</span><span style="COLOR: #000000">Stack()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;delete&nbsp;m_pData;<br>}<br><br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;Stack::Pop(TreeNode</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;val)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(m_iCount</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">--</span><span style="COLOR: #000000">m_iCount;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;val&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;m_pData[m_iCount];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>}<br><br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;Stack::Push(TreeNode</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;val)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(m_iCount</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">m_iAmount)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_pData[m_iCount]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;val;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">m_iCount;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>}<br><br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;Stack::Top(TreeNode</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;val)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(m_iCount</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000">&nbsp;m_iCount</span><span style="COLOR: #000000">&lt;=</span><span style="COLOR: #000000">m_iAmount)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;val&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;m_pData[m_iCount</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>}<br><br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;Stack::GetTop(TreeNode</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">val)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(m_iCount</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000">&nbsp;m_iCount</span><span style="COLOR: #000000">&lt;=</span><span style="COLOR: #000000">m_iAmount)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;val&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;m_pData[m_iCount</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_iCurr&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;m_iCount&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>}<br><br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;Stack::GetNext(TreeNode</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">val)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">((m_iCurr</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">(m_iCount</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000">&nbsp;(m_iCurr</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">&gt;=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">--</span><span style="COLOR: #000000">m_iCurr;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;val&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;m_pData[m_iCurr];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>}<br><br></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;LeftistTree</span><span style="COLOR: #008000"><br></span><span style="COLOR: #808080">////////////////////////////////////////////////////////////////////////</span><span style="COLOR: #008000">//</span><span style="COLOR: #808080"><br></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;LeftistTree<br>{<br></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br>&nbsp;&nbsp;&nbsp;&nbsp;LeftistTree();<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">~</span><span style="COLOR: #000000">LeftistTree();<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">return&nbsp;0&nbsp;means&nbsp;failed.</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;Dequeue(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;iVal);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;Enqueue(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;iVal);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">returns&nbsp;the&nbsp;merged&nbsp;root.</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;TreeNode</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;Merge(TreeNode&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">pT1,&nbsp;TreeNode&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">pT2);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;TreeNode</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;GetRoot();<br>#ifdef&nbsp;_DEBUG<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;Print(TreeNode</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;pNode);<br></span><span style="COLOR: #0000ff">#endif</span><span style="COLOR: #000000"><br><br></span><span style="COLOR: #0000ff">protected</span><span style="COLOR: #000000">:<br>&nbsp;&nbsp;&nbsp;&nbsp;TreeNode&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">m_pRoot;<br>};<br><br>LeftistTree::LeftistTree()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;m_pRoot&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;NULL;<br>}<br><br>LeftistTree::</span><span style="COLOR: #000000">~</span><span style="COLOR: #000000">LeftistTree()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;Stack&nbsp;st(</span><span style="COLOR: #000000">40</span><span style="COLOR: #000000">);&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">2^40&nbsp;must&nbsp;be&nbsp;enough.<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">Postorder&nbsp;traverse&nbsp;the&nbsp;tree&nbsp;to&nbsp;release&nbsp;all&nbsp;nodes.</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;TreeNode&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">pNode&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;m_pRoot;<br>&nbsp;&nbsp;&nbsp;&nbsp;TreeNode&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">pTemp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(pNode</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(pNode</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">m_pLeft</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;st.Push(pNode);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pTemp&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;pNode;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pNode&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;pNode</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">m_pLeft;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pTemp</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">m_pLeft&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">continue</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(pNode</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">m_pRight</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;st.Push(pNode);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pTemp&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;pNode;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pNode&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;pNode</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">m_pRight;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pTemp</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">m_pRight&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">continue</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delete&nbsp;pNode;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">st.Pop(pNode))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}<br><br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;LeftistTree::Dequeue(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;iVal)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(m_pRoot</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;iVal&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;m_pRoot</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">m_iData;<br>&nbsp;&nbsp;&nbsp;&nbsp;TreeNode&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">pTmp&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;m_pRoot;<br>&nbsp;&nbsp;&nbsp;&nbsp;m_pRoot&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;Merge(m_pRoot</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">m_pLeft,&nbsp;m_pRoot</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">m_pRight);<br>&nbsp;&nbsp;&nbsp;&nbsp;delete&nbsp;pTmp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br>}<br><br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;LeftistTree::Enqueue(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;iVal)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;TreeNode&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">pNew&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;TreeNode(iVal);<br>&nbsp;&nbsp;&nbsp;&nbsp;m_pRoot&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;Merge(m_pRoot,&nbsp;pNew);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br>}<br><br>TreeNode</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;LeftistTree::Merge(TreeNode&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">pT1,&nbsp;TreeNode&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">pT2)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(pT1</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000">&nbsp;pT2</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(pT1</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">pT2!=0</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;pT2;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(pT2</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">pT1!=0</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;pT1;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(pT1</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">m_iData&nbsp;</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;pT2</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">m_iData)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;Merge(pT2,&nbsp;pT1);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;Stack&nbsp;st(</span><span style="COLOR: #000000">40</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;TreeNode</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;pInsPos&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;pT1;<br>&nbsp;&nbsp;&nbsp;&nbsp;TreeNode</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;pToIns&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;pT2;<br>&nbsp;&nbsp;&nbsp;&nbsp;TreeNode</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;pTmp;<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;st.Push(pInsPos);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">Find&nbsp;a&nbsp;node&nbsp;available&nbsp;for&nbsp;insert.</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(pInsPos</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">m_pRight</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">NULL)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(pToIns</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">m_iData&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;pInsPos</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">m_pRight</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">m_iData)<br>&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;pTmp&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;pInsPos</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">m_pRight;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pInsPos</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">m_pRight&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;pToIns;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pToIns&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;pTmp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;st.Push(pInsPos);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pInsPos&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;pInsPos</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">m_pRight;<br>&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;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br>&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;st.Push(pInsPos);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pInsPos&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;pInsPos</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">m_pRight;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;st.Push(pInsPos);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">Insert<img src="http://www.cppblog.com/Images/dot.gif"></span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pInsPos</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">m_pRight&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;pToIns;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;TreeNode</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;pNode;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">Try&nbsp;to&nbsp;update&nbsp;the&nbsp;relative&nbsp;distance&nbsp;and&nbsp;make&nbsp;the&nbsp;tree&nbsp;be&nbsp;still&nbsp;the&nbsp;leftist&nbsp;tree.</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">st.Pop(pNode))<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(pNode</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">GetLeftDistance()&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;pNode</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">GetRightDistance())<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pNode</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">SwapLeftRight();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pNode</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">UpdateDistance();<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;pT1;<br>}<br><br>TreeNode</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;LeftistTree::GetRoot()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;m_pRoot;<br>}<br><br>#ifdef&nbsp;_DEBUG<br></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;LeftistTree::Print(TreeNode</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;pNode)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(pNode</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">NULL)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(pNode</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">m_pLeft</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">NULL&nbsp;</span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000">&nbsp;pNode</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">m_pRight</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">NULL)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%d[%d]-&gt;(%d,&nbsp;%d)\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;pNode</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">m_iData,&nbsp;pNode</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">m_iDistance,&nbsp;pNode</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">m_pLeft</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">m_iData,&nbsp;pNode</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">m_pRight</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">m_iData);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Print(pNode</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">m_pLeft);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Print(pNode</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">m_pRight);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(pNode</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">m_pLeft</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">NULL)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%d[%d]-&gt;(%d,&nbsp;x)\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;pNode</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">m_iData,&nbsp;pNode</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">m_iDistance,&nbsp;pNode</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">m_pLeft</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">m_iData);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Print(pNode</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">m_pLeft);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(pNode</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">m_pRight</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">NULL)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%d[%d]-&gt;(x,&nbsp;%d)\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;pNode</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">m_iData,&nbsp;pNode</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">m_iDistance,&nbsp;pNode</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">m_pRight</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">m_iData);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Print(pNode</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">m_pRight);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}<br></span><span style="COLOR: #0000ff">#endif</span><span style="COLOR: #000000"><br><br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;main(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;argc,&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;argv[])<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;LeftistTree&nbsp;tree;<br>&nbsp;&nbsp;&nbsp;&nbsp;tree.Enqueue(</span><span style="COLOR: #000000">9</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;tree.Enqueue(</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;tree.Enqueue(</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;tree.Enqueue(</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;tree.Enqueue(</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;tree.Enqueue(</span><span style="COLOR: #000000">8</span><span style="COLOR: #000000">);<br><br>#ifdef&nbsp;_DEBUG<br>&nbsp;&nbsp;&nbsp;&nbsp;tree.Print(tree.GetRoot());<br></span><span style="COLOR: #0000ff">#endif</span><span style="COLOR: #000000"><br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;iVal;<br>&nbsp;&nbsp;&nbsp;&nbsp;tree.Dequeue(iVal);<br>&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">\nDequeue&nbsp;value&nbsp;is&nbsp;%d\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;iVal);<br>&nbsp;&nbsp;&nbsp;&nbsp;tree.Dequeue(iVal);<br>&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Dequeue&nbsp;value&nbsp;is&nbsp;%d\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;iVal);<br><br>#ifdef&nbsp;_DEBUG<br>&nbsp;&nbsp;&nbsp;&nbsp;tree.Print(tree.GetRoot());<br></span><span style="COLOR: #0000ff">#endif</span><span style="COLOR: #000000"><br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>}</span></div>
也许你还想问：怎么你写的代码都不加个头啊，用来声明版权什么的。本人似乎没这个习惯，那些东西繁琐得很，而且根据我多年开发经验，给每个cpp文件加个头其实是没有必要的，就好像注释，不需要的时候也生硬加上，那就是画蛇添足了。<br><br>（未完待续）
<img src ="http://www.cppblog.com/guogangj/aggbug/99833.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/guogangj/" target="_blank">Jiang Guogang</a> 2009-10-30 15:55 <a href="http://www.cppblog.com/guogangj/archive/2009/10/30/99833.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>图解数据结构（8）——二叉堆</title><link>http://www.cppblog.com/guogangj/archive/2009/10/29/99729.html</link><dc:creator>Jiang Guogang</dc:creator><author>Jiang Guogang</author><pubDate>Thu, 29 Oct 2009 06:33:00 GMT</pubDate><guid>http://www.cppblog.com/guogangj/archive/2009/10/29/99729.html</guid><wfw:comment>http://www.cppblog.com/guogangj/comments/99729.html</wfw:comment><comments>http://www.cppblog.com/guogangj/archive/2009/10/29/99729.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.cppblog.com/guogangj/comments/commentRss/99729.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/guogangj/services/trackbacks/99729.html</trackback:ping><description><![CDATA[<p><span style="FONT-SIZE: 18pt"><strong>十二、二叉堆（Binary Heap）</strong></span></p>
<p>经历了上一篇实现AVL树的繁琐，这篇就显得非常easy了。</p>
<p>首先说说数据结构概念——堆（Heap），其实也没什么大不了，简单地说就是一种有序队列而已，普通的队列是先入先出，而二叉堆是：最小先出。</p>
<p>这不是很简单么？如果这个队列是用数组实现的话那用打擂台的方式从头到尾找一遍，把最小的拿出来不就行了？行啊，可是出队的操作是很频繁的，而每次都得打一遍擂台，那就低效了，打擂台的时间复杂度为&#927;(n)，那如何不用从头到尾fetch一遍就出队呢？二叉堆能比较好地解决这个问题，不过之前先介绍一些概念。</p>
<p>完全树（Complete Tree）：从下图中看出，在第n层深度被填满之前，不会开始填第n+1层深度，还有一定是从左往右填满。<br><img border=0 alt="" src="http://www.cppblog.com/images/cppblog_com/guogangj/ds_complete_binary_tree.png" width=241 height=223></p>
<p>再来一棵完全三叉树：<br><img border=0 alt="" src="http://www.cppblog.com/images/cppblog_com/guogangj/ds_complete_ternary_tree.png" width=386 height=220></p>
<p>这样有什么好处呢？好处就是能方便地把指针省略掉，用一个简单的数组来表示一棵树，如图：<br><img border=0 alt="" src="http://www.cppblog.com/images/cppblog_com/guogangj/ds_binary_heap_array.png" width=413 height=475></p>
<p>那么下面介绍二叉堆：二叉堆是一种完全二叉树，其任意子树的左右节点（如果有的话）的键值一定比根节点大，上图其实就是一个二叉堆。</p>
<p>你一定发觉了，最小的一个元素就是数组第一个元素，那么二叉堆这种有序队列如何入队呢？看图：<br><img border=0 alt="" src="http://www.cppblog.com/images/cppblog_com/guogangj/ds_binary_heap_insert.png" width=353 height=690></p>
<p>假设要在这个二叉堆里入队一个单元，键值为2，那只需在数组末尾加入这个元素，然后尽可能把这个元素往上挪，直到挪不动，经过了这种复杂度为&#927;(logn)的操作，二叉堆还是二叉堆。</p>
<p>那如何出队呢？也不难，看图：<br><img border=0 alt="" src="http://www.cppblog.com/images/cppblog_com/guogangj/ds_binary_heap_dequeue.png" width=612 height=551></p>
<p>出队一定是出数组的第一个元素，这么来第一个元素以前的位置就成了空位，我们需要把这个空位挪至叶子节点，然后把数组最后一个元素插入这个空位，把这个&#8220;空位&#8221;尽量往上挪。这种操作的复杂度也是&#927;(logn)，比&#927;(n)强多了吧？</p>
<p>尝试自己写写代码看，当然了，我也写（这个得动动手啦，比AVL容易多了）：</p>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><span style="COLOR: #000000">#include&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">stdio.h</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br><br></span><span style="COLOR: #0000ff">#define</span><span style="COLOR: #000000">&nbsp;SWAP_TWO_INT(a,&nbsp;b)&nbsp;\</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;a</span><span style="COLOR: #000000">^=</span><span style="COLOR: #000000">b;&nbsp;b</span><span style="COLOR: #000000">^=</span><span style="COLOR: #000000">a;&nbsp;a</span><span style="COLOR: #000000">^=</span><span style="COLOR: #000000">b;<br><br></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;CBinaryHeap<br>{<br></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br>&nbsp;&nbsp;&nbsp;&nbsp;CBinaryHeap(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;iSize&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">100</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">~</span><span style="COLOR: #000000">CBinaryHeap();<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">Return&nbsp;0&nbsp;means&nbsp;failed.</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;Enqueue(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;iVal);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;Dequeue(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">iVal);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;GetMin(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">iVal);<br><br>#ifdef&nbsp;_DEBUG<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;PrintQueue();<br></span><span style="COLOR: #0000ff">#endif</span><span style="COLOR: #000000"><br><br></span><span style="COLOR: #0000ff">protected</span><span style="COLOR: #000000">:<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">m_pData;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;m_iSize;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;m_iAmount;<br>};<br><br>CBinaryHeap::CBinaryHeap(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;iSize)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;m_pData&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">[iSize];<br>&nbsp;&nbsp;&nbsp;&nbsp;m_iSize&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;iSize;<br>&nbsp;&nbsp;&nbsp;&nbsp;m_iAmount&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>}<br><br>CBinaryHeap::</span><span style="COLOR: #000000">~</span><span style="COLOR: #000000">CBinaryHeap()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;delete[]&nbsp;m_pData;<br>}<br><br>#ifdef&nbsp;_DEBUG<br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;CBinaryHeap::Enqueue(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;iVal)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(m_iAmount</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">m_iSize)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">Put&nbsp;this&nbsp;value&nbsp;to&nbsp;the&nbsp;end&nbsp;of&nbsp;the&nbsp;array.</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;m_pData[m_iAmount]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;iVal;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">m_iAmount;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;iIndex&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;m_iAmount&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">(m_pData[iIndex]&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;m_pData[(iIndex</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">])<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">Swap&nbsp;the&nbsp;two&nbsp;value</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SWAP_TWO_INT(m_pData[iIndex],&nbsp;m_pData[(iIndex</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">])<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iIndex&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(iIndex</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br>}<br></span><span style="COLOR: #0000ff">#endif</span><span style="COLOR: #000000"><br><br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;CBinaryHeap::Dequeue(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">iVal)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(m_iAmount</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;iVal&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;m_pData[</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">];<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;iIndex&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">&nbsp;(iIndex</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">m_iAmount)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;iLeft&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(iIndex</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;m_iAmount)</span><span style="COLOR: #000000">?</span><span style="COLOR: #000000">(iIndex</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">):</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;iRight&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(iIndex</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;m_iAmount)</span><span style="COLOR: #000000">?</span><span style="COLOR: #000000">(iIndex</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">):</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(iLeft&nbsp;</span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000">&nbsp;iRight)&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Both&nbsp;left&nbsp;and&nbsp;right&nbsp;exists.</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(m_pData[iLeft]</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">m_pData[iRight])<br>&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;SWAP_TWO_INT(m_pData[iIndex],&nbsp;m_pData[iLeft])<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iIndex&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;iLeft;<br>&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;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br>&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;SWAP_TWO_INT(m_pData[iIndex],&nbsp;m_pData[iRight])<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iIndex&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;iRight;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(iLeft)&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">The&nbsp;iRight&nbsp;must&nbsp;be&nbsp;0</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SWAP_TWO_INT(m_pData[iIndex],&nbsp;m_pData[iLeft])<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iIndex&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;iLeft;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">Move&nbsp;the&nbsp;last&nbsp;element&nbsp;to&nbsp;the&nbsp;blank&nbsp;position.<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">Of&nbsp;course,&nbsp;if&nbsp;it&nbsp;is&nbsp;the&nbsp;blank&nbsp;one,&nbsp;forget&nbsp;it.</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(iIndex</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">m_iAmount</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_pData[iIndex]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;m_pData[m_iAmount</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">];<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">Try&nbsp;to&nbsp;move&nbsp;this&nbsp;element&nbsp;to&nbsp;the&nbsp;top&nbsp;as&nbsp;high&nbsp;as&nbsp;possible.</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">(m_pData[iIndex]&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;m_pData[(iIndex</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">])<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">Swap&nbsp;the&nbsp;two&nbsp;value</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SWAP_TWO_INT(m_pData[iIndex],&nbsp;m_pData[(iIndex</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">])<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iIndex&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(iIndex</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">--</span><span style="COLOR: #000000">m_iAmount;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br>}<br><br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;CBinaryHeap::GetMin(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">iVal)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(m_iAmount</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;iVal&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;m_pData[</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">];<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br>}<br><br></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;CBinaryHeap::PrintQueue()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;i</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">m_iAmount;&nbsp;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%d&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;m_pData[i]);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br>}<br><br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;main(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;argc,&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;argv[])<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;CBinaryHeap&nbsp;bh;<br>&nbsp;&nbsp;&nbsp;&nbsp;bh.Enqueue(</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;bh.Enqueue(</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;bh.Enqueue(</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;bh.Enqueue(</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;bh.Enqueue(</span><span style="COLOR: #000000">6</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;bh.Enqueue(</span><span style="COLOR: #000000">5</span><span style="COLOR: #000000">);<br>#ifdef&nbsp;_DEBUG<br>&nbsp;&nbsp;&nbsp;&nbsp;bh.PrintQueue();<br></span><span style="COLOR: #0000ff">#endif</span><span style="COLOR: #000000"><br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;iVal;<br>&nbsp;&nbsp;&nbsp;&nbsp;bh.Dequeue(iVal);<br>&nbsp;&nbsp;&nbsp;&nbsp;bh.Dequeue(iVal);<br>#ifdef&nbsp;_DEBUG<br>&nbsp;&nbsp;&nbsp;&nbsp;bh.PrintQueue();<br></span><span style="COLOR: #0000ff">#endif</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>}</span></div>
<img src ="http://www.cppblog.com/guogangj/aggbug/99729.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/guogangj/" target="_blank">Jiang Guogang</a> 2009-10-29 14:33 <a href="http://www.cppblog.com/guogangj/archive/2009/10/29/99729.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>图解数据结构（7）——二叉查找树及平衡二叉查找树</title><link>http://www.cppblog.com/guogangj/archive/2009/10/26/99502.html</link><dc:creator>Jiang Guogang</dc:creator><author>Jiang Guogang</author><pubDate>Mon, 26 Oct 2009 09:18:00 GMT</pubDate><guid>http://www.cppblog.com/guogangj/archive/2009/10/26/99502.html</guid><wfw:comment>http://www.cppblog.com/guogangj/comments/99502.html</wfw:comment><comments>http://www.cppblog.com/guogangj/archive/2009/10/26/99502.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.cppblog.com/guogangj/comments/commentRss/99502.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/guogangj/services/trackbacks/99502.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 这篇将是最有难度和挑战性的一篇，做好心理准备！十、二叉查找树（BST）前一篇介绍了树，却未介绍树有什么用。但就算我不说，你也能想得到，看我们Windows的目录结构，其实就是树形的，一个典型的分类应用。当然除了分类，树还有别的作用，我们可以利用树建立一个非常便于查找取值又非常便于插入删除的数据结构，这就是马上要提到的二叉查找树（Binary Search Tree），这种二叉树有个特点：对...&nbsp;&nbsp;<a href='http://www.cppblog.com/guogangj/archive/2009/10/26/99502.html'>阅读全文</a><img src ="http://www.cppblog.com/guogangj/aggbug/99502.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/guogangj/" target="_blank">Jiang Guogang</a> 2009-10-26 17:18 <a href="http://www.cppblog.com/guogangj/archive/2009/10/26/99502.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>图解数据结构（6）——树及树的遍历</title><link>http://www.cppblog.com/guogangj/archive/2009/10/16/98772.html</link><dc:creator>Jiang Guogang</dc:creator><author>Jiang Guogang</author><pubDate>Fri, 16 Oct 2009 08:24:00 GMT</pubDate><guid>http://www.cppblog.com/guogangj/archive/2009/10/16/98772.html</guid><wfw:comment>http://www.cppblog.com/guogangj/comments/98772.html</wfw:comment><comments>http://www.cppblog.com/guogangj/archive/2009/10/16/98772.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/guogangj/comments/commentRss/98772.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/guogangj/services/trackbacks/98772.html</trackback:ping><description><![CDATA[<p style="FONT-SIZE: 18pt"><strong>八、树（Tree）</strong></p>
<p>树，顾名思义，长得像一棵树，不过通常我们画成一棵倒过来的树，根在上，叶在下。不说那么多了，图一看就懂：<br><img border=0 alt="" src="http://www.cppblog.com/images/cppblog_com/guogangj/ds_tree_f.png" width=595 height=165></p>
<p>当然了，引入了树之后，就不得不引入树的一些概念，这些概念我照样尽量用图，谁会记那么多文字？<br><img border=0 alt="" src="http://www.cppblog.com/images/cppblog_com/guogangj/ds_tree_concept_f.png" width=413 height=325></p>
<p>树这种结构还可以表示成下面这种方式，可见树用来描述包含关系是很不错的，但这种包含关系不得出现交叉重叠区域，否则就不能用树描述了，看图：<br><img border=0 alt="" src="http://www.cppblog.com/images/cppblog_com/guogangj/ds_tree_another_form.png" width=427 height=283></p>
<p>面试的时候我们经常被考到的是一种叫&#8220;二叉树&#8221;的结构，二叉树当然也是树的一种了，它的特点是除了叶以外的节点都有两个子，图：<br><img border=0 alt="" src="http://www.cppblog.com/images/cppblog_com/guogangj/ds_binarytree.png" width=185 height=197></p>
<p>由此我们还可以推出&#8220;三叉树&#8221;：<br><img border=0 alt="" src="http://www.cppblog.com/images/cppblog_com/guogangj/ds_ternarytree.png" width=208 height=194></p>
<p>当然还有&#8220;四叉树&#8221;，&#8220;五叉树&#8221;，&#8220;六叉树&#8221;&#8230;&#8230;但太难画了，节点太多，略过。</p>
<p><span style="FONT-SIZE: 18pt"><strong>九、树的遍历（Traversal）</strong></span></p>
<p>值得再提一下的是二叉树，因为它确实比较特别，节点有两个子，这两个子是有左右之分的，颠倒一下左右，就是不一样的二叉树了，所以左右是不能随便颠倒的。<br></p>
<p><img border=0 alt="" src="http://www.cppblog.com/images/cppblog_com/guogangj/ds_binarytree2.png" width=227 height=108><br>在第三篇讲到&#8220;队&#8221;的时候，提及到了广度优先遍历（Breadth-first traversal），除了广度优先遍历之外，还有深度优先遍历（Depth-first Traversal），深度优先遍历又可分为：前序遍历（Preorder Traversal），后序遍历（Postorder Traversal）和中序遍历（Inorder Traversal），其中中序遍历只有对二叉树才有意义，下图解释这几种遍历：<br><img border=0 alt="" src="http://www.cppblog.com/images/cppblog_com/guogangj/ds_tree_traversal.png" width=313 height=326></p>
<p>好了，又到代码阶段，写点代码。我看过许多数据结构的教材，二叉树遍历都是必不可少的内容，而且我知道的全部都是用递归实现的，现在，我要求你不用递归，实现对二叉树的中序遍历。怎么办？我给个提示：广度优先遍历时候我们用了队，中序遍历，我们使用*栈*。看看能不能写出来，我也来写：</p>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><span style="COLOR: #000000">#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">stdio.h</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><br></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;TreeNode</span><span style="COLOR: #008000"><br></span><span style="COLOR: #808080">////////////////////////////////////////////////////////////////////////</span><span style="COLOR: #008000">//</span><span style="COLOR: #808080"><br></span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;TreeNode<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;m_cVal;<br>&nbsp;&nbsp;&nbsp;&nbsp;TreeNode</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;m_pLeft;<br>&nbsp;&nbsp;&nbsp;&nbsp;TreeNode</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;m_pRight;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;TreeNode(</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;cVal);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">~</span><span style="COLOR: #000000">TreeNode();<br>};<br><br>TreeNode::TreeNode(</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;cVal)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;m_cVal&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;cVal;<br>&nbsp;&nbsp;&nbsp;&nbsp;m_pLeft&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;m_pRight&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>}<br><br>TreeNode::</span><span style="COLOR: #000000">~</span><span style="COLOR: #000000">TreeNode()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>}<br><br></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">Stack</span><span style="COLOR: #008000"><br></span><span style="COLOR: #808080">////////////////////////////////////////////////////////////////////////</span><span style="COLOR: #008000">//</span><span style="COLOR: #808080"><br></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;Stack<br>{<br></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br>&nbsp;&nbsp;&nbsp;&nbsp;Stack(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;iAmount&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">~</span><span style="COLOR: #000000">Stack();<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">return&nbsp;1&nbsp;means&nbsp;succeeded,&nbsp;0&nbsp;means&nbsp;failed.</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;Pop(TreeNode</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">pVal);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;Push(TreeNode</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;pVal);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;Top(TreeNode</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">pVal);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">1&nbsp;means&nbsp;not&nbsp;null,&nbsp;0&nbsp;means&nbsp;null.</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;NotNull();<br></span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">:<br>&nbsp;&nbsp;&nbsp;&nbsp;TreeNode&nbsp;</span><span style="COLOR: #000000">**</span><span style="COLOR: #000000">m_ppData;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;m_iCount;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;m_iAmount;<br>};<br><br>Stack::Stack(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;iAmount)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;m_ppData&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;TreeNode</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">[iAmount];<br>&nbsp;&nbsp;&nbsp;&nbsp;m_iCount&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;m_iAmount&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;iAmount;<br>}<br><br>Stack::</span><span style="COLOR: #000000">~</span><span style="COLOR: #000000">Stack()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;delete&nbsp;m_ppData;<br>}<br><br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;Stack::Pop(TreeNode</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">pVal)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(m_iCount</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">--</span><span style="COLOR: #000000">m_iCount;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pVal&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;m_ppData[m_iCount];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>}<br><br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;Stack::Push(TreeNode</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;pVal)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(m_iCount</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">m_iAmount)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_ppData[m_iCount]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;pVal;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">m_iCount;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>}<br><br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;Stack::Top(TreeNode</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">pVal)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(m_iCount</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000">&nbsp;m_iCount</span><span style="COLOR: #000000">&lt;=</span><span style="COLOR: #000000">m_iAmount)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pVal&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;m_ppData[m_iCount</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>}<br><br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;Stack::NotNull()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(m_iCount</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>}<br><br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;main(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;argc,&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;argv[])<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">Construct&nbsp;the&nbsp;tree.<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;&nbsp;&nbsp;&nbsp;/&nbsp;&nbsp;&nbsp;\<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;&nbsp;&nbsp;/&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;&nbsp;B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;C<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;&nbsp;&nbsp;\&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/&nbsp;\<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;&nbsp;&nbsp;&nbsp;D&nbsp;&nbsp;&nbsp;E&nbsp;&nbsp;&nbsp;F<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;G&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;H<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/&nbsp;\<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I&nbsp;&nbsp;&nbsp;J<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/&nbsp;\<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;K&nbsp;&nbsp;&nbsp;L</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;TreeNode&nbsp;nA(</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">A</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;TreeNode&nbsp;nB(</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">B</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;TreeNode&nbsp;nC(</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">C</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;TreeNode&nbsp;nD(</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">D</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;TreeNode&nbsp;nE(</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">E</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;TreeNode&nbsp;nF(</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">F</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;TreeNode&nbsp;nG(</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">G</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;TreeNode&nbsp;nH(</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">H</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;TreeNode&nbsp;nI(</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">I</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;TreeNode&nbsp;nJ(</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">J</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;TreeNode&nbsp;nK(</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">K</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;TreeNode&nbsp;nL(</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">L</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;nA.m_pLeft&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">nB;<br>&nbsp;&nbsp;&nbsp;&nbsp;nA.m_pRight&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">nC;<br>&nbsp;&nbsp;&nbsp;&nbsp;nB.m_pRight&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">nD;<br>&nbsp;&nbsp;&nbsp;&nbsp;nD.m_pRight&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">nG;<br>&nbsp;&nbsp;&nbsp;&nbsp;nC.m_pLeft&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">nE;<br>&nbsp;&nbsp;&nbsp;&nbsp;nC.m_pRight&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">nF;<br>&nbsp;&nbsp;&nbsp;&nbsp;nF.m_pRight&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">nH;<br>&nbsp;&nbsp;&nbsp;&nbsp;nH.m_pLeft&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">nI;<br>&nbsp;&nbsp;&nbsp;&nbsp;nH.m_pRight&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">nJ;<br>&nbsp;&nbsp;&nbsp;&nbsp;nI.m_pLeft&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">nK;<br>&nbsp;&nbsp;&nbsp;&nbsp;nI.m_pRight&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">nL;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;Stack&nbsp;st;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">Inorder&nbsp;traversal</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;TreeNode&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">pVal&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">nA;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;iPopped&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">(pVal</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(pVal</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">m_pLeft</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000">&nbsp;iPopped</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;st.Push(pVal);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pVal&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;pVal</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">m_pLeft;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iPopped&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(pVal</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">m_pRight</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%c&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;pVal</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">m_cVal);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pVal&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;pVal</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">m_pRight;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iPopped&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%c&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;pVal</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">m_cVal);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">st.Pop(pVal))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iPopped&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>}</span></div>
代码就那么一点，可第一次写的时候我还真觉得颇费脑筋的。代码中有些注释显示不太正常，这是因为这个博客的的代码字体非等宽的缘故，拿到你的IDE下查看就正常了。<br>（未完待续&#8230;&#8230;） 
<img src ="http://www.cppblog.com/guogangj/aggbug/98772.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/guogangj/" target="_blank">Jiang Guogang</a> 2009-10-16 16:24 <a href="http://www.cppblog.com/guogangj/archive/2009/10/16/98772.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>图解数据结构（5）——散列法及哈希表</title><link>http://www.cppblog.com/guogangj/archive/2009/10/15/98699.html</link><dc:creator>Jiang Guogang</dc:creator><author>Jiang Guogang</author><pubDate>Thu, 15 Oct 2009 08:50:00 GMT</pubDate><guid>http://www.cppblog.com/guogangj/archive/2009/10/15/98699.html</guid><wfw:comment>http://www.cppblog.com/guogangj/comments/98699.html</wfw:comment><comments>http://www.cppblog.com/guogangj/archive/2009/10/15/98699.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/guogangj/comments/commentRss/98699.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/guogangj/services/trackbacks/98699.html</trackback:ping><description><![CDATA[<p><span style="FONT-SIZE: 18pt"><strong>七、哈希表（Hash Table）及散列法（Hashing）</strong></span></p>
<p>数组的特点是：寻址容易，插入和删除困难；而链表的特点是：寻址困难，插入和删除容易。那么我们能不能综合两者的特性，做出一种寻址容易，插入删除也容易的数据结构？答案是肯定的，这就是我们要提起的哈希表，哈希表有多种不同的实现方法，我接下来解释的是最常用的一种方法——拉链法，我们可以理解为&#8220;链表的数组&#8221;，如图：</p>
<p><img border=0 alt="" src="http://www.cppblog.com/images/cppblog_com/guogangj/ds_hashtable1.png" width=508 height=441><br>左边很明显是个数组，数组的每个成员包括一个指针，指向一个链表的头，当然这个链表可能为空，也可能元素很多。我们根据元素的一些特征把元素分配到不同的链表中去，也是根据这些特征，找到正确的链表，再从链表中找出这个元素。</p>
<p>元素特征转变为数组下标的方法就是散列法。散列法当然不止一种，我下面列出三种比较常用的。</p>
<p><span style="FONT-SIZE: 14pt"><strong>1，除法散列法</strong></span><br>最直观的一种，上图使用的就是这种散列法，公式：<br><span style="FONT-SIZE: 14pt"><strong style="COLOR: #0000ff">index = value % 16</strong></span><br>学过汇编的都知道，求模数其实是通过一个除法运算得到的，所以叫&#8220;除法散列法&#8221;。</p>
<p><span style="FONT-SIZE: 14pt"><strong>2，平方散列法</strong></span><br>求index是非常频繁的操作，而乘法的运算要比除法来得省时（对现在的CPU来说，估计我们感觉不出来），所以我们考虑把除法换成乘法和一个位移操作。公式：<br><span style="COLOR: #0000ff; FONT-SIZE: 14pt"><strong>index = (value * value) &gt;&gt; 28</strong></span><br>如果数值分配比较均匀的话这种方法能得到不错的结果，但我上面画的那个图的各个元素的值算出来的index都是0——非常失败。也许你还有个问题，value如果很大，value * value不会溢出吗？答案是会的，但我们这个乘法不关心溢出，因为我们根本不是为了获取相乘结果，而是为了获取index。</p>
<p><span style="FONT-SIZE: 14pt"><strong>3，斐波那契（Fibonacci）散列法</strong></span></p>
<p>平方散列法的缺点是显而易见的，所以我们能不能找出一个理想的乘数，而不是拿value本身当作乘数呢？答案是肯定的。</p>
<p>1，对于16位整数而言，这个乘数是<span style="COLOR: #ff0000">40503<br></span>2，对于32位整数而言，这个乘数是<span style="COLOR: #ff0000">2654435769</span><br>3，对于64位整数而言，这个乘数是<span style="COLOR: #ff0000">11400714819323198485</span></p>
<p>这几个&#8220;理想乘数&#8221;是如何得出来的呢？这跟一个法则有关，叫黄金分割法则，而描述黄金分割法则的最经典表达式无疑就是著名的斐波那契数列，如果你还有兴趣，就到网上查找一下&#8220;斐波那契数列&#8221;等关键字，我数学水平有限，不知道怎么描述清楚为什么，另外斐波那契数列的值居然和太阳系八大行星的轨道半径的比例出奇吻合，很神奇，对么？</p>
<p>对我们常见的32位整数而言，公式：<br><span style="COLOR: #0000ff; FONT-SIZE: 14pt"><strong style="COLOR: #0000ff">index = (value * 2654435769) &gt;&gt; 28</strong></span></p>
<p>如果用这种斐波那契散列法的话，那我上面的图就变成这样了：</p>
<p><img border=0 alt="" src="http://www.cppblog.com/images/cppblog_com/guogangj/ds_hashtable2.png" width=416 height=468><br>看起来不错，以后就用斐波那契散列法吧。</p>
<p>不过我们要注意了，前面提到的都是针对整数的散列法，那如果不是整数呢？下面给出一些参考算法，我把其它类型的数据转变为32位整数，之后的处理前面已经说了。</p>
<p>1，浮点数的散列法</p>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><span style="COLOR: #000000">unsigned&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;HashingDouble(</span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">&nbsp;d)<br>{<br>&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(d</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br>&nbsp;{<br>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;exponent;<br>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">&nbsp;mantissa&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;frexp(d,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">exponent);<br>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;(unsigned&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">)((</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">mantissa</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #000000">~</span><span style="COLOR: #000000">0U</span><span style="COLOR: #000000">));<br>&nbsp;}<br>}</span></div>
<p>2，字符串的散列法</p>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><span style="COLOR: #000000">unsigned&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;HashingString(</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">str,&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;iLen)<br>{<br>&nbsp;unsigned&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;hsval&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">2654435769</span><span style="COLOR: #000000">;<br>&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i;<br>&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;iShift&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;i</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">iLen;&nbsp;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br>&nbsp;{<br>&nbsp;&nbsp;hsval&nbsp;</span><span style="COLOR: #000000">^=</span><span style="COLOR: #000000">&nbsp;(str[i]</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">iShift);<br>&nbsp;&nbsp;iShift</span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(iShift</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">24</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;iShift</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>&nbsp;}<br>&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;hsval;<br>}</span></div>
<p>方法就提供那么多，遇到别的情况，比如说Unicode字符串，随机应变吧！</p>
<img src ="http://www.cppblog.com/guogangj/aggbug/98699.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/guogangj/" target="_blank">Jiang Guogang</a> 2009-10-15 16:50 <a href="http://www.cppblog.com/guogangj/archive/2009/10/15/98699.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>图解数据结构（4）——二分法查找法</title><link>http://www.cppblog.com/guogangj/archive/2009/10/15/98649.html</link><dc:creator>Jiang Guogang</dc:creator><author>Jiang Guogang</author><pubDate>Thu, 15 Oct 2009 02:15:00 GMT</pubDate><guid>http://www.cppblog.com/guogangj/archive/2009/10/15/98649.html</guid><wfw:comment>http://www.cppblog.com/guogangj/comments/98649.html</wfw:comment><comments>http://www.cppblog.com/guogangj/archive/2009/10/15/98649.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/guogangj/comments/commentRss/98649.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/guogangj/services/trackbacks/98649.html</trackback:ping><description><![CDATA[<p><span style="FONT-SIZE: 18pt"><strong>六、二分法查找（Binary Search）</strong></span><br><br>如何从数组里找一个元素的位置？如果排列是无序的，我们只能从头到尾找，但如果排列是有序的，我们则可以用别的更好的方法，二分查找法就类似我们在英汉词典里找一个单词的方法。如下图所示（假如我们要查找的数字是&#8220;88&#8221;）：<br><img border=0 alt="" src="http://www.cppblog.com/images/cppblog_com/guogangj/ds_binarysearch.png" width=685 height=570></p>
<p>下面我给出了一段demo代码，来演示二分查找法比顺序查找快多少，代码为了方便起见，初始化有序表的时候填入的数字都是均匀的，而事实上数字可以不均匀。你可以调整一下代码中TABLE_SIZE的值，从500，调到5000，再调到10000，再调到30000&#8230;&#8230;你会发觉两者差距越来越明显。我在第一篇的地方提到二分查找法的复杂度为&#927;(logn)，而顺序查找的复杂度为&#927;(n)，当n越来越大时候，&#927;(logn)的优势也就越来越明显，当然了，前提是&#8220;有序&#8221;，才可用二分查找法。<br></p>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><span style="COLOR: #000000">#include&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">stdio.h</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br>#include&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">time.h</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br><br></span><span style="COLOR: #0000ff">#define</span><span style="COLOR: #000000">&nbsp;TABLE_SIZE&nbsp;50000</span><span style="COLOR: #000000"><br><br></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">returns&nbsp;the&nbsp;position,&nbsp;-1&nbsp;means&nbsp;failed.</span><span style="COLOR: #008000"><br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;SequenceSearch(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">pArray,&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;iArraySize,&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;iVal)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;i</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">iArraySize;&nbsp;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(pArray[i]</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">iVal)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;i;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br>}<br><br></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">returns&nbsp;the&nbsp;position,&nbsp;-1&nbsp;means&nbsp;failed.</span><span style="COLOR: #008000"><br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;BinarySearch(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">pArray,&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;iArraySize,&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;iVal)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;iLeft&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;iRight&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;iArraySize</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">(iLeft</span><span style="COLOR: #000000">&lt;=</span><span style="COLOR: #000000">iRight)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;iMiddle&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(iLeft</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">iRight)</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(iVal&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;pArray[iMiddle])<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iRight&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;iMiddle</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(iVal&nbsp;</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;pArray[iMiddle])<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iLeft&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;iMiddle</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;iMiddle;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br>}<br><br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;main(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;argc,&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;argv[])<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">make&nbsp;the&nbsp;table</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;table[TABLE_SIZE];<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;i</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">TABLE_SIZE;&nbsp;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;table[i]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;i</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;clock_t&nbsp;ctBegin&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;clock();<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">Test&nbsp;sequence&nbsp;search</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;i</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">TABLE_SIZE;&nbsp;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SequenceSearch(table,&nbsp;TABLE_SIZE,&nbsp;i</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;clock_t&nbsp;ctEnd&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;clock();<br><br>&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">SequenceSearch&nbsp;takes&nbsp;%d&nbsp;clocks.\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;ctEnd</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">ctBegin);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">Test&nbsp;binary&nbsp;search</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;ctBegin&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;clock();<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;i</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">TABLE_SIZE;&nbsp;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BinarySearch(table,&nbsp;TABLE_SIZE,&nbsp;i</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;ctEnd&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;clock();<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">BinarySearch&nbsp;takes&nbsp;%d&nbsp;clocks.\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;ctEnd</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">ctBegin);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>}</span></div>
<p>这篇文章是不是太简单了点？OK，下一篇技术含量要高一点了。</p>
<img src ="http://www.cppblog.com/guogangj/aggbug/98649.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/guogangj/" target="_blank">Jiang Guogang</a> 2009-10-15 10:15 <a href="http://www.cppblog.com/guogangj/archive/2009/10/15/98649.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>图解数据结构（3）——队</title><link>http://www.cppblog.com/guogangj/archive/2009/10/14/98588.html</link><dc:creator>Jiang Guogang</dc:creator><author>Jiang Guogang</author><pubDate>Wed, 14 Oct 2009 08:08:00 GMT</pubDate><guid>http://www.cppblog.com/guogangj/archive/2009/10/14/98588.html</guid><wfw:comment>http://www.cppblog.com/guogangj/comments/98588.html</wfw:comment><comments>http://www.cppblog.com/guogangj/archive/2009/10/14/98588.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/guogangj/comments/commentRss/98588.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/guogangj/services/trackbacks/98588.html</trackback:ping><description><![CDATA[<p><span style="FONT-SIZE: 18pt"><strong>五、队（Queue）</strong></span></p>
<p>前一篇讲了栈（Stack），队和栈其实只有一个差别，栈是先进后出，队是先进先出，如图：<br><img border=0 alt="" src="http://www.cppblog.com/images/cppblog_com/guogangj/ds_queue_basic.png" width=655 height=198></p>
<p>从图中可以看出，队有两个常用的方法，Enqueue和Dequeue，顾名思义，就是进队和出队了。队和栈一样，既可以用数组实现，也可以用链表实现，我还是偏向于用数组，我的实现示意图如下：<br><img border=0 alt="" src="http://www.cppblog.com/images/cppblog_com/guogangj/ds_queue_operation.png" width=527 height=267></p>
<p>队有啥用呢？一个最常用的用途就是&#8220;buffer&#8221;，即缓冲区，比如有一批从网络来的数据，处理需要挺长的时间，而数据抵达的间隔并不均匀，有时快，有时慢，先来的先处理，后来的后处理，于是你创建了一个队，用来缓存这些数据，出队一笔，处理一笔，直到队列为空。当然队的作用远不止于此，下面的例子也是一个很经典的例子，希望读者能举一反三。</p>
<p>例子：使用队对树进行广度优先遍历。</p>
<p>广度优先区别于深度优先，即优先遍历最靠近根节点的各个节点：<br><img border=0 alt="" src="http://www.cppblog.com/images/cppblog_com/guogangj/ds_queue_tree.png" width=312 height=227></p>
<p>我们的算法是：<br>1，根节点入队<br>2，出队一个节点，算一次遍历，直到队列为空<br>3，将刚出队的节点的子节点入队<br>4，转到2</p>
<p>队列的状况如下图：<br></p>
<p><img border=0 alt="" src="http://www.cppblog.com/images/cppblog_com/guogangj/ds_queue_traverse_tree.png" width=250 height=348><br>树的遍历一般习惯使用递归，理论上所有的递归都可以转变为迭代，如何实现这个转变？队就是其中一种有效的办法，OK，下面我给出上述例题的代码以及注释。</p>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><span style="COLOR: #008000">//</span><span style="COLOR: #008000">Not&nbsp;grace&nbsp;code&nbsp;but&nbsp;enough&nbsp;for&nbsp;demo.&nbsp;^_^</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">#include&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">stdio.h</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br><br></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;The&nbsp;Node</span><span style="COLOR: #008000"><br></span><span style="COLOR: #808080">////////////////////////////////////////////////////////////////////////</span><span style="COLOR: #008000">//</span><span style="COLOR: #808080"><br></span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;Node<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;Node(</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;cChar,&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;iSubNodeNum</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">~</span><span style="COLOR: #000000">Node();<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;m_cChar;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;m_iSubNodeNum;<br>&nbsp;&nbsp;&nbsp;&nbsp;Node</span><span style="COLOR: #000000">**</span><span style="COLOR: #000000">&nbsp;m_arrNodePointer;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">Pointers&nbsp;to&nbsp;the&nbsp;sub-node.</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">};<br><br>Node::Node(</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;cChar,&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;iSubNodeNum)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;m_cChar&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;cChar;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;m_iSubNodeNum&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;iSubNodeNum;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(iSubNodeNum</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_arrNodePointer&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;Node</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">[iSubNodeNum];<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_arrNodePointer&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;NULL;<br>}<br><br>Node::</span><span style="COLOR: #000000">~</span><span style="COLOR: #000000">Node()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(m_arrNodePointer</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">NULL)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delete[]&nbsp;m_arrNodePointer;<br>}<br><br></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;The&nbsp;Queue</span><span style="COLOR: #008000"><br></span><span style="COLOR: #808080">////////////////////////////////////////////////////////////////////////</span><span style="COLOR: #008000">//</span><span style="COLOR: #808080"><br></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;Queue<br>{<br></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br>&nbsp;&nbsp;&nbsp;&nbsp;Queue(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;iAmount</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">~</span><span style="COLOR: #000000">Queue();<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">return&nbsp;0&nbsp;means&nbsp;failed,&nbsp;return&nbsp;1&nbsp;means&nbsp;succeeded.</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;Enqueue(Node</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;node);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;Dequeue(Node</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;node);<br></span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">:<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;m_iAmount;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;m_iCount;<br>&nbsp;&nbsp;&nbsp;&nbsp;Node</span><span style="COLOR: #000000">**</span><span style="COLOR: #000000">&nbsp;m_ppFixed;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">The&nbsp;pointer&nbsp;array&nbsp;to&nbsp;implement&nbsp;the&nbsp;queue.</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;m_iHead;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;m_iTail;<br>};<br><br>Queue::Queue(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;iAmount)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;m_iCount&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;m_iAmount&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;iAmount;<br>&nbsp;&nbsp;&nbsp;&nbsp;m_ppFixed&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;Node</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">[iAmount];<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;m_iHead&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;m_iTail&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;iAmount</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br>}<br><br>Queue::</span><span style="COLOR: #000000">~</span><span style="COLOR: #000000">Queue()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;delete[]&nbsp;m_ppFixed;<br>}<br><br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;Queue::Enqueue(Node</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;node)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(m_iCount</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">m_iAmount)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">m_iTail;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(m_iTail&nbsp;</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;m_iAmount</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_iTail&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_ppFixed[m_iTail]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;node;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">m_iCount;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>}<br><br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;Queue::Dequeue(Node</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;node)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(m_iCount</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;node&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;m_ppFixed[m_iHead];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">m_iHead;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(m_iHead&nbsp;</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;m_iAmount</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_iHead&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">--</span><span style="COLOR: #000000">m_iCount;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>}<br><br></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Main</span><span style="COLOR: #008000"><br></span><span style="COLOR: #808080">////////////////////////////////////////////////////////////////////////</span><span style="COLOR: #008000">//</span><span style="COLOR: #808080"><br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;main(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;argc,&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;argv[])<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">Construct&nbsp;the&nbsp;tree.</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;Node&nbsp;nA(</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">A</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;Node&nbsp;nB(</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">B</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;Node&nbsp;nC(</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">C</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;Node&nbsp;nD(</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">D</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;Node&nbsp;nE(</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">E</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;Node&nbsp;nF(</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">F</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;Node&nbsp;nG(</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">G</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;Node&nbsp;nH(</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">H</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;Node&nbsp;nI(</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">I</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;Node&nbsp;nJ(</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">J</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;Node&nbsp;nK(</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">K</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;Node&nbsp;nL(</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">L</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;nA.m_arrNodePointer[</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">nB;<br>&nbsp;&nbsp;&nbsp;&nbsp;nA.m_arrNodePointer[</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">nC;<br>&nbsp;&nbsp;&nbsp;&nbsp;nA.m_arrNodePointer[</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">nD;<br>&nbsp;&nbsp;&nbsp;&nbsp;nB.m_arrNodePointer[</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">nE;<br>&nbsp;&nbsp;&nbsp;&nbsp;nB.m_arrNodePointer[</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">nF;<br>&nbsp;&nbsp;&nbsp;&nbsp;nD.m_arrNodePointer[</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">nG;<br>&nbsp;&nbsp;&nbsp;&nbsp;nD.m_arrNodePointer[</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">nH;<br>&nbsp;&nbsp;&nbsp;&nbsp;nD.m_arrNodePointer[</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">nI;<br>&nbsp;&nbsp;&nbsp;&nbsp;nF.m_arrNodePointer[</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">nJ;<br>&nbsp;&nbsp;&nbsp;&nbsp;nF.m_arrNodePointer[</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">nK;<br>&nbsp;&nbsp;&nbsp;&nbsp;nH.m_arrNodePointer[</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">nL;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;Queue&nbsp;que;<br>&nbsp;&nbsp;&nbsp;&nbsp;que.Enqueue(</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">nA);<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;Node&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">pNode;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">&nbsp;(que.Dequeue(pNode)</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%c&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;pNode</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">m_cChar);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;i</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">pNode</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">m_iSubNodeNum;&nbsp;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;que.Enqueue(pNode</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">m_arrNodePointer[i]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>}</span></div>
代码不算通用，但用来演示和理解足够了，下一篇的内容更精彩！<br><br>（未完待续&#8230;&#8230;）
<img src ="http://www.cppblog.com/guogangj/aggbug/98588.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/guogangj/" target="_blank">Jiang Guogang</a> 2009-10-14 16:08 <a href="http://www.cppblog.com/guogangj/archive/2009/10/14/98588.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>图解数据结构（2）——栈</title><link>http://www.cppblog.com/guogangj/archive/2009/10/14/98565.html</link><dc:creator>Jiang Guogang</dc:creator><author>Jiang Guogang</author><pubDate>Wed, 14 Oct 2009 04:53:00 GMT</pubDate><guid>http://www.cppblog.com/guogangj/archive/2009/10/14/98565.html</guid><wfw:comment>http://www.cppblog.com/guogangj/comments/98565.html</wfw:comment><comments>http://www.cppblog.com/guogangj/archive/2009/10/14/98565.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/guogangj/comments/commentRss/98565.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/guogangj/services/trackbacks/98565.html</trackback:ping><description><![CDATA[<p><span style="FONT-SIZE: 18pt"><strong>四、栈（Stack）</strong></span><br><br>前一篇讲解了最基本的东西，这篇就稍微前进一点点，讲一下栈，栈在英文中叫Stack，翻译成中文又叫&#8220;堆栈&#8221;，但决不能称为&#8220;堆&#8221;，这个要搞清楚，我们说的&#8220;栈&#8221;和&#8220;堆栈&#8221;指的都是Stack这种数据结构，但&#8220;堆&#8221;却是另外一个概念了，这里且不提。</p>
<p>栈最大特点是先进后出，如图：<br><img border=0 alt="" src="http://www.cppblog.com/images/cppblog_com/guogangj/ds_stack_basic.png" width=508 height=565></p>
<p>可以看出，栈有几个最常见的方法，或者说必备的方法，Push，Pop和Top，即进栈，出栈和取最顶元素。从代码上看，栈如何实现呢？用数组好还是用单向链表好呢？其实都可以，我下面的例子是用数组实现的。</p>
<p>说了那么多，栈有什么用呢？下面就举一个最经典的例题——逆波兰表达式（RPN，Reversed Polish Notation）的求解。</p>
<p>什么是逆波兰表达式？我们表述一个算式通常是这样：X+Y，即：&#8220;操作数1 操作符 操作数2&#8221;，当然也有比较特别的，比如&#8220;sqrt(N)&#8221;，sqrt是操作符，N是操作数，而逆波兰表达式则很统一，先操作数，后操作符，为什么叫&#8220;逆波兰表达式&#8221;？因为有一个波兰人发明了波兰表达式，而逆的波兰表达式就叫&#8220;逆波兰表达式&#8221;了。看下图就能很好理解了：<br><img border=0 alt="" src="http://www.cppblog.com/images/cppblog_com/guogangj/ds_rpn.png" width=578 height=115></p>
<p>所有的算式都可以用逆波兰表达式写出来，只是我这里的举例是为了方便起见，限制在整数的四则运算里。</p>
<p>那假如现在我们有一个逆波兰表达式，那我们如何求出它的值呢？这里我们的&#8220;栈&#8221;就要派上用场了，由于操作数在操作符前面，所以我们按顺序遍历这个表达式，遇到操作数的时候进栈，遇到操作符时候让操作数出栈并运算，然后把运算结果进栈。过程如下图所示：<br><img border=0 alt="" src="http://www.cppblog.com/images/cppblog_com/guogangj/ds_rpn_process.png" width=505 height=266></p>
<p>遇到第一个操作符，&#8220;+&#8221;的时候，由于需要两个操作数，所以出栈两次，4和3出栈，执行加法运算，结果是7，7进栈&#8230;&#8230;依此类推。</p>
<p>下面我给出参考代码，我的代码使用很简单，复制，粘贴到一个cpp文件中，编译此cpp文件即可，没别的依赖。</p>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><span style="COLOR: #000000">#include&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">stdio.h</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br><br></span><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;Cell<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;iType;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;0&nbsp;-&nbsp;number,&nbsp;1&nbsp;-&nbsp;'+',&nbsp;2&nbsp;-&nbsp;'-',&nbsp;3&nbsp;-&nbsp;'*',&nbsp;4&nbsp;-&nbsp;'/'</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;iData;<br>};<br><br></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;Stack<br>{<br></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br>&nbsp;&nbsp;&nbsp;&nbsp;Stack(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;iAmount&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">~</span><span style="COLOR: #000000">Stack();<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">return&nbsp;1&nbsp;means&nbsp;succeeded,&nbsp;0&nbsp;means&nbsp;failed.</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;Pop(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;iVal);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;Push(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;iVal);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;Top(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;iVal);<br></span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">:<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">m_pData;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;m_iCount;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;m_iAmount;<br>};<br><br>Stack::Stack(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;iAmount)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;m_pData&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">[iAmount];<br>&nbsp;&nbsp;&nbsp;&nbsp;m_iCount&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;m_iAmount&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;iAmount;<br>}<br><br>Stack::</span><span style="COLOR: #000000">~</span><span style="COLOR: #000000">Stack()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;delete&nbsp;m_pData;<br>}<br><br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;Stack::Pop(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;iVal)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(m_iCount</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">--</span><span style="COLOR: #000000">m_iCount;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iVal&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;m_pData[m_iCount];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>}<br><br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;Stack::Push(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;iVal)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(m_iCount</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">m_iAmount)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_pData[m_iCount]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;iVal;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">m_iCount;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>}<br><br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;Stack::Top(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;iVal)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(m_iCount</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000">&nbsp;m_iCount</span><span style="COLOR: #000000">&lt;=</span><span style="COLOR: #000000">m_iAmount)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iVal&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;m_pData[m_iCount</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>}<br><br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;main(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;argc,&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;argv[])<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">12&nbsp;3&nbsp;4&nbsp;+&nbsp;*&nbsp;6&nbsp;-&nbsp;8&nbsp;2&nbsp;/&nbsp;+</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;Cell&nbsp;rpn[</span><span style="COLOR: #000000">11</span><span style="COLOR: #000000">]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">12</span><span style="COLOR: #000000">,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">6</span><span style="COLOR: #000000">,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">8</span><span style="COLOR: #000000">,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">};<br><br>&nbsp;&nbsp;&nbsp;&nbsp;Stack&nbsp;st;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;I&nbsp;won't&nbsp;check&nbsp;the&nbsp;return&nbsp;value&nbsp;for&nbsp;this&nbsp;is&nbsp;just&nbsp;a&nbsp;demo.</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i,&nbsp;iOpt1,&nbsp;iOpt2;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;i</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(rpn)</span><span style="COLOR: #000000">/</span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(Cell);&nbsp;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">switch</span><span style="COLOR: #000000">(rpn[i].iType)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">case</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">:&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;number</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;st.Push(rpn[i].iData);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">case</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">:&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;+</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;st.Pop(iOpt2);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;st.Pop(iOpt1);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;st.Push(iOpt1&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;iOpt2);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">case</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">:&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;-</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;st.Pop(iOpt2);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;st.Pop(iOpt1);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;st.Push(iOpt1&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;iOpt2);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">case</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">:&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;*</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;st.Pop(iOpt2);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;st.Pop(iOpt1);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;st.Push(iOpt1&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;iOpt2);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">case</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">:&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;/</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;st.Pop(iOpt2);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;st.Pop(iOpt1);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;st.Push(iOpt1&nbsp;</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">&nbsp;iOpt2);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;iResult;<br>&nbsp;&nbsp;&nbsp;&nbsp;st.Pop(iResult);<br>&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">The&nbsp;result&nbsp;is&nbsp;%d\n</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;iResult);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>}</span></div>
<p>（未完待续&#8230;&#8230;）</p>
<img src ="http://www.cppblog.com/guogangj/aggbug/98565.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/guogangj/" target="_blank">Jiang Guogang</a> 2009-10-14 12:53 <a href="http://www.cppblog.com/guogangj/archive/2009/10/14/98565.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>图解数据结构（1）——大圈表示法、动态数组和单向链表</title><link>http://www.cppblog.com/guogangj/archive/2009/10/13/98476.html</link><dc:creator>Jiang Guogang</dc:creator><author>Jiang Guogang</author><pubDate>Tue, 13 Oct 2009 06:21:00 GMT</pubDate><guid>http://www.cppblog.com/guogangj/archive/2009/10/13/98476.html</guid><wfw:comment>http://www.cppblog.com/guogangj/comments/98476.html</wfw:comment><comments>http://www.cppblog.com/guogangj/archive/2009/10/13/98476.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/guogangj/comments/commentRss/98476.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/guogangj/services/trackbacks/98476.html</trackback:ping><description><![CDATA[<p>《数据结构》这门课是计算机专业的核心课程，但往往却让人头痛，因为比较抽象，当然了，也许你足够聪明，并不觉得它有多难，但对我而言，是有点难度，后来我仔细想了想，到底哪里难？我得出这么个结论：长篇大论，缺乏图表。现在的人都喜欢看电影，看电视剧，很少人还热衷于看小说吧，密密麻麻的文字不如一些图来得直观。</p>
<p>另外，我们大多数人是做应用的，不是做研究的，所以我们只需要知道2+3=5，而不需要知道a+b=c。所以我就不深入理论，再说自己也没那个能力。</p>
<p>好，接下去我就用最一般的例子，最通俗易懂的图，算法和尽量少的文字，描述某作者需要长篇大论方可完成教材。</p>
<p style="FONT-SIZE: 18pt"><strong>一、大圈表示法</strong></p>
<p>面试时候如果让你写一个算法，要求复杂度为&#927;(n)，你明白是什么意思吗？说起数据结构，就先提一下这个表示法吧，后面会用到。</p>
<p>&#8220;&#927;&#8221;，其实不是英文的&#8220;O&#8221;，它是个希腊字母，发音大概是&#8220;欧麦克隆&#8221;，所以我们一般说&#8220;圈&#8221;而不是跟英文的O一样的发音。简单地说，大圈表示法是一种用于表示算法复杂度数量级的方法。要精确描述这个表示法，很难，不过我们不需要懂那么精确，只要八九不离十就可以了。下面我列个表，复杂度从低到高，大家就知道其意义：<br><img border=0 alt="" src="http://www.cppblog.com/images/cppblog_com/guogangj/ds_big_o_table.png" width=607 height=390><br>另外还有个叫指数复杂度，这里不提，因为见得实在太少，&#8220;指数级递增&#8221;本身就是一个很夸张的形容词，我们也要避免这种复杂度的出现。还需要说明的一点是大圈表示法是时间递增数量级的表示方法，注意&#8220;递增&#8221;两个字，所以并不是说复杂度为&#927;(1)的算法消耗的时间一定比复杂度为&#927;(n)的算法少。<br><br>如果你还是不太明白大圈表示法，不用担心，继续往下看，会慢慢明白的。</p>
<p><span style="FONT-SIZE: 18pt"><strong>二、动态数组（Dynamic Array）</strong></span><br>接下去介绍最最基本的两种数据结构，即动态数组和单向链表，其它数据结构其实都可以通过这两者衍生出来。BTW：如果算法太简单，我就不列出代码，只稍微描述一下。</p>
<p>&nbsp;<img border=0 alt="" src="http://www.cppblog.com/images/cppblog_com/guogangj/ds_basic_array.png" width=305 height=212><br>这就是一个最基本的动态数组，pData记录了数组第一个元素的位置，Unit Size记录了每个元素的大小，（这样可以方便地找到第N个元素了）Unit Number记录了元素的数目。<br><br>获取数组中第N个元素，是很简单的，无需多说。<br><br>但已知某位置，要插入一个元素，就稍微有点难，因为要挪动一些元素，如图：<br><img border=0 alt="" src="http://www.cppblog.com/images/cppblog_com/guogangj/ds_array_insert.png" width=492 height=251><br>删除元素跟这个也类似，也是需要挪一挪后面的元素，只不过是往前挪。<br><br>数组的大小不能很方便地调整，需要几个步骤，如下图所示：<br><img border=0 alt="" src="http://www.cppblog.com/images/cppblog_com/guogangj/ds_array_resize.png" width=772 height=540><br>代码我就不写了，大概就是new，memcpy，delete这几个步骤。</p>
<p style="FONT-SIZE: 18pt"><strong>三、单向链表（Singly-linked List）</strong></p>
下图就是最简单最一般的单向链表：<br><img border=0 alt="" src="http://www.cppblog.com/images/cppblog_com/guogangj/ds_link_1.png" width=491 height=82><br>还有这种：<br><img border=0 alt="" src="http://www.cppblog.com/images/cppblog_com/guogangj/ds_link_2.png" width=487 height=87><br>多一个Tail指针，好处就是能很方便地找到末尾，然后在末尾插入新的元素什么的。还有这种也比较常见：<br><img border=0 alt="" src="http://www.cppblog.com/images/cppblog_com/guogangj/ds_link_3.png" width=466 height=98><br>留一个终始标志，这个节点作为一个标志，不用于存储数据，链表末尾指向这个节点，形成一个&#8220;环形链表&#8221;，这样无论在链表的哪里插入新的元素，操作都一致了，不必判断头和尾的特殊性。<br><br>数组的好处就是链表的坏处，数组的坏处就是链表的好处，请看：<br><img border=0 alt="" src="http://www.cppblog.com/images/cppblog_com/guogangj/ds_get_link_n.png" width=566 height=90><br>因为需要从头开始找，没办法像数组那样直接跳到那个地址。而插入元素，就比数组方便了，如果你已经得知了要插入的地址的话，不过还要注意哦，是&#8220;后插入&#8221;（Insert After）：<br><img border=0 alt="" src="http://www.cppblog.com/images/cppblog_com/guogangj/ds_link_insert_after.png" width=545 height=218><br>有&#8220;后插入&#8221;，那就有&#8220;前插入&#8221;（Insert Before），两者对单向链表来说真的不一样，下图描述了&#8220;前插入&#8221;：<br><img border=0 alt="" src="http://www.cppblog.com/images/cppblog_com/guogangj/ds_link_insert_before.png" width=553 height=258><br>由于指针向后不向前，我们不知道要插入位置的前一个节点是什么，只能从头找，所以比较麻烦。<br><br>至于链表大小的重新调整，和数组相比如何呢？呃&#8230;&#8230;我可没说链表有大小限制吧？<br><br>（未完待续&#8230;&#8230;）<br>
<img src ="http://www.cppblog.com/guogangj/aggbug/98476.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/guogangj/" target="_blank">Jiang Guogang</a> 2009-10-13 14:21 <a href="http://www.cppblog.com/guogangj/archive/2009/10/13/98476.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【CSDN】PL/SQL笔记</title><link>http://www.cppblog.com/guogangj/archive/2009/09/29/97540.html</link><dc:creator>Jiang Guogang</dc:creator><author>Jiang Guogang</author><pubDate>Tue, 29 Sep 2009 05:32:00 GMT</pubDate><guid>http://www.cppblog.com/guogangj/archive/2009/09/29/97540.html</guid><wfw:comment>http://www.cppblog.com/guogangj/comments/97540.html</wfw:comment><comments>http://www.cppblog.com/guogangj/archive/2009/09/29/97540.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/guogangj/comments/commentRss/97540.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/guogangj/services/trackbacks/97540.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: [20060407发表于blog.csdn.net，20090929重新编辑]重新编辑注释：由于太久没有使用PL/SQL，如今再看这篇笔记，几乎完全陌生了，自己还到baidu去搜索了一下PL/SQL和Pro*C才依稀记起，我不知道以后还有没有机会使用PL/SQL，但无疑的是这篇笔记还是有点价值的，或者作为一个纪念吧。PL/SQL（准确的写法就是&#8220;PL/SQL&#8221;，没有别的，不...&nbsp;&nbsp;<a href='http://www.cppblog.com/guogangj/archive/2009/09/29/97540.html'>阅读全文</a><img src ="http://www.cppblog.com/guogangj/aggbug/97540.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/guogangj/" target="_blank">Jiang Guogang</a> 2009-09-29 13:32 <a href="http://www.cppblog.com/guogangj/archive/2009/09/29/97540.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【CSDN】最常用SQL快速参考（其中某些部分只适合Oracle）</title><link>http://www.cppblog.com/guogangj/archive/2009/04/24/80951.html</link><dc:creator>Jiang Guogang</dc:creator><author>Jiang Guogang</author><pubDate>Fri, 24 Apr 2009 07:52:00 GMT</pubDate><guid>http://www.cppblog.com/guogangj/archive/2009/04/24/80951.html</guid><wfw:comment>http://www.cppblog.com/guogangj/comments/80951.html</wfw:comment><comments>http://www.cppblog.com/guogangj/archive/2009/04/24/80951.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/guogangj/comments/commentRss/80951.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/guogangj/services/trackbacks/80951.html</trackback:ping><description><![CDATA[<p><span style="FONT-SIZE: 12pt; COLOR: red; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">【<span lang=EN-US>20060407</span>发表于<span lang=EN-US>blog.csdn.net</span>，<span lang=EN-US>20090424</span>重新编辑】<span lang=EN-US><br></span></span><span lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><br></span><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">关系型数据库模型由<span lang=EN-US>Codd</span>博士在<span lang=EN-US>1970</span>年提出<span lang=EN-US><br>SQL</span>成为<span lang=EN-US>ANSI</span>标准是在<span lang=EN-US>1986</span>年<span lang=EN-US><br><br></span><strong>最基本查询</strong><span lang=EN-US><br>select * from table1 where name=</span>&#8217;<span lang=EN-US>Lincoln</span>&#8217;<span lang=EN-US>;<br>select col1,col2 from table1;<br><br></span><strong>无重复查询</strong><span lang=EN-US><br>select <span style="COLOR: red">distinct</span> amount from checks;<br>(distinct</span>在一个语句中只能用一次，放在所有字段之前<span lang=EN-US>)<br><br><strong>MySQL</strong></span><strong>的一些常用命令<span lang=EN-US><br></span></strong><span lang=EN-US>show databases; </span>显示所有数据库<span lang=EN-US><br>show tables; </span>显示当前数据库的表<span lang=EN-US><br>use db1; </span>当前数据库切换到<span lang=EN-US>db1<br>describe table1; </span>显示<span lang=EN-US>table1</span>表的表结构<span lang=EN-US><br><br></span><strong>运用表达式和别名<span lang=EN-US><br></span></strong><span lang=EN-US>select item, <span style="COLOR: red">wholesale+0.15</span> from price;<br>select item, (wholesale+0.15) <span style="COLOR: red">retail</span> from price;<br>select * from friends where state<span style="COLOR: red">&lt;=</span></span>&#8217;<span lang=EN-US>la</span>&#8217;<span lang=EN-US>;<br>select * from friends where firstname<span style="COLOR: red">&lt;&gt;</span></span>&#8217;<span lang=EN-US>al</span>&#8217;<span lang=EN-US>;<br>select * from parts where location <span style="COLOR: red">like </span></span><span style="COLOR: red">&#8217;<span lang=EN-US>%back%</span>&#8217;</span><span lang=EN-US>;<br>select * from friends where st <span style="COLOR: red">like </span></span><span style="COLOR: red">&#8217;<span lang=EN-US>C_</span>&#8217;</span><span lang=EN-US>;<br>select <span style="COLOR: red">firstname||lastname</span> entirename from friends; (mysql</span>中不能用<span lang=EN-US>)<br>(mysql</span>可以用<span lang=EN-US style="COLOR: green">select concat(name1, </span><span style="COLOR: green">&#8217; &#8217;<span lang=EN-US>, name2) name from friends;</span></span><span lang=EN-US>)<br>select lastname from vacation where years&lt;=5 <span style="COLOR: red">and</span> leavetaken&gt;20;<br>select * from vacation where lastname <span style="COLOR: red">not like</span> </span>&#8217;<span lang=EN-US>B%</span>&#8217;<span lang=EN-US>;<br><br></span><strong>集合运算，<span lang=EN-US>MySQL</span>不一定能用</strong><span lang=EN-US><br>select name from softball <span style="COLOR: red">union</span> select name from football; </span>合集<span lang=EN-US><br>select name from softball <span style="COLOR: red">union all</span> select name from football; </span>全合集<span lang=EN-US><br>select * from football <span style="COLOR: red">intersect</span> select * from softball; </span>交集<span lang=EN-US><br>select * from football <span style="COLOR: red">minus</span> select * from softball; </span>差集<span lang=EN-US><br><br><strong>In</strong></span><strong>与<span lang=EN-US>Between</span>运算符</strong><span lang=EN-US><br>select * from friends where areacode in(100,381,204);<br>select * from price where wholesale between 0.25 and 0.75;<br><br></span><strong>内置函数的使用</strong><span lang=EN-US><br>count<span style="mso-tab-count: 1">&nbsp; </span></span>求总数<span lang=EN-US><br>sum<span style="mso-tab-count: 1"> </span></span>求总和<span lang=EN-US><br>avg<span style="mso-tab-count: 1"> </span></span>求平均<span lang=EN-US><br>max<span style="mso-tab-count: 1"> </span></span>求最大<span lang=EN-US><br>min<span style="mso-tab-count: 1"> </span></span>求最小<span lang=EN-US><br>variance<span style="mso-tab-count: 1">&nbsp;&nbsp; </span></span>标准方差<span lang=EN-US><br>stddev<span style="mso-tab-count: 1"> </span></span>标准差<span lang=EN-US><br>add_month<span style="mso-tab-count: 1">&nbsp; </span></span>给日期类型增加一月<span lang=EN-US><br>add_date<span style="mso-tab-count: 1">&nbsp;&nbsp; </span></span>给日期类型增加一天<span lang=EN-US><br>last_day<span style="mso-tab-count: 1">&nbsp;&nbsp; </span></span>返回月份的最后一天<span lang=EN-US><br>month_between<span style="mso-tab-count: 1"> </span></span>日期相差的月份<span lang=EN-US><br>sysdate<span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp; </span></span>系统时间<span lang=EN-US><br>abs<span style="mso-tab-count: 1"> </span></span>绝对值<span lang=EN-US><br>ceil<span style="mso-tab-count: 1">&nbsp;&nbsp; </span></span>&#8220;天花板&#8221;<span lang=EN-US><br>floor<span style="mso-tab-count: 1">&nbsp; </span></span>&#8220;地板&#8221;<span lang=EN-US><br>exp<span style="mso-tab-count: 1"> </span></span>指数函数<span lang=EN-US><br>log<span style="mso-tab-count: 1"> </span></span>上面的反函数<span lang=EN-US><br>pow<span style="mso-tab-count: 1"> </span>a^b<br>sign<span style="mso-tab-count: 1">&nbsp;&nbsp; </span></span>正<span lang=EN-US>1</span>零<span lang=EN-US>0</span>负<span lang=EN-US>-1<br>sqrt<span style="mso-tab-count: 1">&nbsp;&nbsp; </span></span>根号<span lang=EN-US><br>chr<span style="mso-tab-count: 1"> </span></span>转换成字符<span lang=EN-US><br>concat<span style="mso-tab-count: 1"> </span></span>连接字符串<span lang=EN-US><br>initcap<span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp; </span></span>首字符大写，其他小写<span lang=EN-US><br>lower<span style="mso-tab-count: 1">&nbsp; </span></span>小写<span lang=EN-US><br>upper<span style="mso-tab-count: 1">&nbsp; </span></span>大写<span lang=EN-US><br>lpad<span style="mso-tab-count: 1">&nbsp;&nbsp; </span></span>左填充，原始，长度，字符<span lang=EN-US><br>rpan<span style="mso-tab-count: 1">&nbsp;&nbsp; </span></span>右填充<span lang=EN-US><br>ltrim<span style="mso-tab-count: 1">&nbsp; </span></span>左剪切<span lang=EN-US><br>rtrim<span style="mso-tab-count: 1">&nbsp; </span></span>右剪切<span lang=EN-US><br>trim<span style="mso-tab-count: 1">&nbsp;&nbsp; </span></span>剪切<span lang=EN-US><br>replace<span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp; </span></span>字符替换，原始，替换，替换成<span lang=EN-US><br>substr<span style="mso-tab-count: 1"> </span></span>获取子字符串，原始，起始，长度<span lang=EN-US><br>instr<span style="mso-tab-count: 1">&nbsp; </span></span>查找字符串，原始，查找，开始，序号<span lang=EN-US><br>length </span>字符串长度<span lang=EN-US><br>to_char<span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp; </span></span>转换成字符串<span lang=EN-US><br>to_number<span style="mso-tab-count: 1">&nbsp; </span></span>转换成数字<span lang=EN-US><br><br></span><strong>子句的运用<span lang=EN-US><br></span></strong><span lang=EN-US>(Where, Group by, Order by, Having)&nbsp;<br>select * from checks <span style="COLOR: red">where</span> amount&gt;100;<br>select * from checks order by check; </span>可以加上<span lang=EN-US>asc</span>代表升序<span lang=EN-US><br>select * from checks order by payee <span style="COLOR: red">desc</span>;<br>select * from checks order by <span style="COLOR: red">remarks, payee</span>;<br>select * from checks order by 1;<br>select payee, sum(amount), count(payee) from checks <span style="COLOR: red">group by</span> payee;<br>select sum(amount), count(payee) from checks group by <span style="COLOR: red">payee, remarks</span>;<br>where</span>之句中不允许用合计函数，因此下面的语句是错误的。<span lang=EN-US><br><span style="COLOR: red">select team, avg(salary) from orgchart where avg(salary)&lt;3800 group by team;<br></span></span>这时候需要<span lang=EN-US>having</span>子句：<span lang=EN-US><br>select team, avg(salary) from orgchart group by team having avg(salary)&lt;3800;<br></span>&#8230;&#8230;<span lang=EN-US> having team in(</span>&#8217;<span lang=EN-US>pr</span>&#8217;<span lang=EN-US>,</span>&#8217;<span lang=EN-US>research</span>&#8217;<span lang=EN-US>);<br><br></span><strong>交叉连接（笛卡尔积）</strong><span lang=EN-US><br>select * from table1, table2;<br>select o.orderedon, o.name, o.partnum, p.partnum, p.description<br>&nbsp;&nbsp;&nbsp; from orders o, part p<br>&nbsp;&nbsp;&nbsp; where o.partnum=p.partnum;<br><br></span><strong>内部连接</strong><span lang=EN-US><br>select p.partnum, p.price, o.name, o.partnum<br>&nbsp;&nbsp;&nbsp; from <strong>part p</strong> <span style="COLOR: red">inner join</span> <strong>orders o</strong> on orders.partnum=54;<br></span>除了使用了&#8220;<span lang=EN-US>on</span>&#8221;来代替&#8220;<span lang=EN-US>where</span>&#8221;之外，和交叉连接没多少区别。<span lang=EN-US><br></span>外部连接<span lang=EN-US><br><br></span><strong>左连接：左边的表全部显示<span lang=EN-US><br></span></strong><span lang=EN-US>select p.partnum, p.description, p.price, o.name, o.partnum<br>&nbsp;&nbsp;&nbsp; from part p <strong>left outer join</strong> orders o on o.partnum=54;<br><br></span><strong>右连接：右边的表全部显示<span lang=EN-US><br></span></strong><span lang=EN-US>select p.partnum, p.description, p.price, o.name, o.partnum<br>&nbsp;&nbsp;&nbsp; from part p <strong>right outer join</strong> orders o on o.partnum=54;<br><br></span><strong>子查询（<span lang=EN-US>MySQL</span>不支持）<span lang=EN-US><br></span></strong><span lang=EN-US>select * from orders<br>where partnum=(select partnum from part where description like </span>&#8220;<span lang=EN-US>ROAD%</span>&#8221;<span lang=EN-US>);<br><br></span><strong>下面是较复杂查询示例：</strong><span lang=EN-US><br>select o.name, o.orderedon, o.quantity * p.price total<br>&nbsp;&nbsp;&nbsp; from orders o, part p<br>&nbsp;&nbsp;&nbsp; where o.partnum=p.partnum and o.quantity * p.price &gt;&nbsp;<br>&nbsp;&nbsp;&nbsp; (select avg(o.quantity * p.price)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; from orders o, part p<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; where o.partnum=p.partnum);<br><br><strong>Exist</strong></span><strong>使用（判断集合是否存在）</strong><span lang=EN-US><br>select name, orderedon from orders where exists<br>&nbsp;&nbsp;&nbsp; (select * from orders where name=</span>&#8217;<span lang=EN-US>Mostly harmless</span>&#8217;<span lang=EN-US>)<br style="mso-special-character: line-break"><br style="mso-special-character: line-break"><o:p></o:p></span></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><span lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><br></span><strong><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">数据库三范式</span></strong><span lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><br>1</span><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">、数据集合分成多张表而不只是一张大表，分成的每张表都有主键；<span style="COLOR: red">主键<span lang=EN-US><br></span></span><span lang=EN-US>2</span>、找出仅仅依赖于主键的列，将其存储在另一个表中；<span style="COLOR: red">仅依赖的列抽出<span lang=EN-US><br></span></span><span lang=EN-US>3</span>、从一个表中删除不依赖于主键的列。<span style="COLOR: red">不依赖的列抽出<span lang=EN-US><br></span></span>缺点：降低性能。<span lang=EN-US><br><br></span><strong>建立数据库</strong><span lang=EN-US><br></span>很难吧？很难！不难吧？不难。仅仅告诉你最简单情况：<span lang=EN-US><br>create database PAYMENTS;<br><br></span><strong>建立表<span lang=EN-US><br></span></strong><span lang=EN-US>create table bills(name char(30), amount number, account_id number);<br>create table empname(id number <span style="COLOR: red">not null</span>, ename char(30));<br>create table newtable <span style="COLOR: red">as</span> select * from oldtable;<br><br></span><strong>改变表：增加列<span lang=EN-US><br></span></strong><span lang=EN-US>alter table emp <span style="COLOR: red">add</span> new_col_name char(20);<br><br></span><strong>改变表：修改列</strong><span lang=EN-US><br>alter table emp <span style="COLOR: red">modify</span> new_col_name char(21);<br><br></span><strong>改变表：改列名</strong><span lang=EN-US>(Oracle 9i Release 2</span>才能用<span lang=EN-US>)<br>alter table emp <span style="COLOR: red">rename column</span> new_col_name <span style="COLOR: red">to</span> old_col_name;<br><br></span><strong>改变表：删除列<span lang=EN-US><br></span></strong><span lang=EN-US>alter table emp <span style="COLOR: red">drop column</span> old_col_name;<br><br></span><strong>删除表<span lang=EN-US><br></span></strong><span lang=EN-US style="COLOR: red">drop table</span><span lang=EN-US> tablename;<br><br></span><strong>删除数据库</strong><span lang=EN-US><br><span style="COLOR: red">drop database</span> databasename;<br><strong><br></strong></span><strong>主键、非空、唯一约束</strong><span lang=EN-US><br></span>主键<span lang=EN-US>primary key<br></span>非空<span lang=EN-US>not null<br></span>唯一<span lang=EN-US>unique </span>除了排序，和<span lang=EN-US>primary key</span>功能一致<span lang=EN-US><br>create table emp<br>&nbsp;&nbsp;&nbsp; (emp_id char(9) <span style="COLOR: red">primary key</span>,<br>&nbsp;&nbsp;&nbsp; emp_name varchar2(40) <span style="COLOR: red">not null</span>,<br>&nbsp;&nbsp;&nbsp; phone number(10) null <span style="COLOR: red">unique</span>);<br></span></span><strong><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><br>外键约束<span lang=EN-US>foreign key</span></span></strong><span lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><br>create table emp_pay<br>&nbsp;&nbsp;&nbsp; (emp_id char(9) not null,<br>&nbsp;&nbsp;&nbsp; position varchar2(15) not null,<br>&nbsp;&nbsp;&nbsp; pay_rate number(4,2) not null);<br>alter table emp_pay<span style="COLOR: red"> add constraint </span>emp_id_fk<span style="COLOR: red"> foreign key(emp_id)&nbsp;<br>references emp(emp_id);<br></span><br></span><strong><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">校验约束<span lang=EN-US>check</span></span></strong><span lang=EN-US style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><br>create table emp<br>&nbsp;&nbsp;&nbsp; (emp_id char(9) not null primary key,<br>&nbsp;&nbsp;&nbsp; emp_name varchar2(40) not null,<br>&nbsp;&nbsp;&nbsp; emp_rate number(4,2) not null,<br>&nbsp;&nbsp;&nbsp; zip number(5) not null);<br>alter table emp<span style="COLOR: red"> add constraint </span>chk_zip<span style="COLOR: red"> check(emp_zip = '46234');<br></span>alter table emp<span style="COLOR: red"> add constraint </span>chk_zip<span style="COLOR: red"> check(emp_zip in ('47634', '13451'));<br></span>alter table emp<span style="COLOR: red"> add constraint </span>chk_zip<span style="COLOR: red"> check(emp_rate &lt; 12.5);<br></span>emp_rate</span><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">为校验约束名。<span lang=EN-US><br><br></span><strong>删除约束</strong><span lang=EN-US><br>alter table emp <span style="COLOR: red">drop constraint emp_no_constraint;<br></span>emp_no_constraint</span>为约束名。<span lang=EN-US><br><br></span><strong>更新记录</strong><span lang=EN-US><br><span style="COLOR: red">update</span> collection set worth = 555, price = 666 where itemid = 1110;<br><br></span><strong>删除记录</strong><span lang=EN-US><br><span style="COLOR: red">delete</span> from collection where itemid = 1113;<br><br></span><strong>事务处理<span lang=EN-US><br></span></strong>&#8230;&#8230;<span lang=EN-US><br><span style="COLOR: red">commit;<br></span></span>&#8230;&#8230;<span lang=EN-US><br><span style="COLOR: red">rollback;<br></span></span>&#8230;&#8230;<span lang=EN-US><br><span style="COLOR: red">savepoint save_it;<br></span></span>&#8230;&#8230;<span lang=EN-US><br><span style="COLOR: red">rollback to savepoint save_it;<br></span><br></span><strong>日期时间<span lang=EN-US><br></span></strong>掌握两个函数就可以了。<span lang=EN-US><br><span style="COLOR: red">to_char</span>(empdate, 'YYYY/MM/DD HH24:MI:SS');<br></span>将<span lang=EN-US>date</span>转变成字符串：&#8220;<span lang=EN-US>2004/11/12 16:30:02</span>&#8221;<span lang=EN-US><br><span style="COLOR: red">to_date</span>('1981/11/12 00:03:16', 'YYYY/MM/DD HH24:MI:SS');<br></span>将字符串&#8220;<span lang=EN-US>1981/11/12 00:03:16</span>&#8221;转变成日期类型。<span lang=EN-US><br></span>还有要注意的事项，在中文<span lang=EN-US>Oracle</span>中，<span lang=EN-US>'26-JAN-03'</span>并不被认为是合法的日期，<span lang=EN-US><br>'26-1</span>月<span lang=EN-US>-03'</span>才是合法的，真别扭，也蛮郁闷的。<span lang=EN-US><br><br></span><strong>建立视图</strong><span lang=EN-US><br>create <span style="COLOR: red">view</span> debts as select * from bills;<br><br></span><strong>删除视图</strong><span lang=EN-US><br>drop <span style="COLOR: red">view</span> debts;<br><br></span><strong>建立索引<span lang=EN-US><br></span></strong><span lang=EN-US>create index empno_index on emp(empno);<br><br></span><strong>删除索引<span lang=EN-US><br></span></strong><span lang=EN-US>drop index empno_index;<br><br></span><strong>创建用户<span lang=EN-US><br></span></strong><span lang=EN-US>create user jguogang identified by mypassword;<br><br></span><strong>授予用户角色</strong><span lang=EN-US><br>grant connect to jguogang;<br>grant resource to jguogang;<br>grant dba to jguogang;<br><br></span><strong>删除用户的角色</strong><span lang=EN-US><br>revoke resource from jguogang;<br><br></span><strong>给予系统特权</strong><span lang=EN-US><br>grant alter any type to public;<br></span>其中&#8220;<span lang=EN-US>alter any type</span>&#8221;为一种系统特权，将被授予全部用户。<span lang=EN-US><br>grant drop any trigger to jguogang;<br></span>将系统特权&#8220;<span lang=EN-US>drop any trigger</span>&#8221;授予用户&#8220;<span lang=EN-US>jguogang</span>&#8221;。<span lang=EN-US><br>grant create user to connect;<br></span>将系统特权&#8220;<span lang=EN-US>create user</span>&#8221;授予角色&#8220;<span lang=EN-US>connect</span>&#8221;。<span lang=EN-US><br></span>收回系统特权<span lang=EN-US><br>revoke alter any type from public;<br></span>给予对象特权<span lang=EN-US><br>grant select <span style="COLOR: red">on</span> emp to jack;<br></span>授予用户&#8220;<span lang=EN-US>jack</span>&#8221;：对&#8220;<span lang=EN-US>emp</span>&#8221;的&#8220;<span lang=EN-US>select</span>&#8221;对象特权。<span lang=EN-US><br>grant select, update(salary) <span style="COLOR: red">on</span> emp to jill;<br></span>授予用户&#8220;<span lang=EN-US>jill</span>&#8221;：对&#8220;<span lang=EN-US>emp</span>&#8221;的&#8220;<span lang=EN-US>select</span>&#8221;、&#8220;<span lang=EN-US>salary</span>&#8221;列的&#8220;<span lang=EN-US>update</span>&#8221;对象特权。<span lang=EN-US><br></span>收回对象特权<span lang=EN-US><br>revoke select <span style="COLOR: red">on</span> emp from jack;<br><br></span><strong>字典</strong><span lang=EN-US><br></span>字典：我是谁<span lang=EN-US><br>select * from user_users;<br></span>字典：我们是谁<span lang=EN-US><br>select * from all_users;<br></span>字典：我能干什么<span lang=EN-US><br>select * from user_sys_privs;<br></span>字典：我充当什么角色<span lang=EN-US><br>select * from user_role_privs;<br></span>字典：我拥有什么表、视图和&#8220;<span lang=EN-US>SEQUENCE</span>&#8221;<span lang=EN-US><br>select * from user_catalog;<br></span>字典：我可访问什么表、视图和&#8220;<span lang=EN-US>SEQUENCE</span>&#8221;（多）<span lang=EN-US><br>select * from all_catalog;<br></span>字典：我拥有什么对象<span lang=EN-US><br>select * from user_object;<br></span>字典：我可访问什么对象（多）<span lang=EN-US><br>select * from all_catalog;<br></span>&#8230;&#8230;关于字典，暂时就介绍那么点了。<span lang=EN-US><br><br></span><strong>注释</strong><span lang=EN-US><br></span>表的注释<span lang=EN-US><br>comment on table emp is 'Employee';<br></span>列的注释<span lang=EN-US><br>comment on column emp.ename is '</span>名字<span lang=EN-US>';<br></span>列出所有包含注释的表<span lang=EN-US><br>select * from user_tab_comments where comments is not null;<br></span>系统时间取得<span lang=EN-US><br>select sysdate from dual;<br><span style="COLOR: red"><br>20050906</span></span><span style="COLOR: red">笔记<span lang=EN-US><br></span></span>查看未提交的事务<span lang=EN-US><br>select * from v$transaction;<br>select * from v$locked_object;<br></span>通过<span lang=EN-US>locked_object</span>视图获知被锁定的对象的<span lang=EN-US>ID</span>（<span lang=EN-US>object_id</span>）<span lang=EN-US><br></span>那么通过下面的语句能获知到底哪个对象被锁定<span lang=EN-US><br>select * from sys.all_objects t where object_id = ###;<br>alter system kill session 30;<br><br></span>修改用户密码相关<span lang=EN-US><br>select username,password from dba_users;<br>alter user aaa identified by aaaspwd;<o:p></o:p></span></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><o:p></o:p></span></p>
<img src ="http://www.cppblog.com/guogangj/aggbug/80951.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/guogangj/" target="_blank">Jiang Guogang</a> 2009-04-24 15:52 <a href="http://www.cppblog.com/guogangj/archive/2009/04/24/80951.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++中类型转换的解释</title><link>http://www.cppblog.com/guogangj/archive/2009/04/23/80870.html</link><dc:creator>Jiang Guogang</dc:creator><author>Jiang Guogang</author><pubDate>Thu, 23 Apr 2009 10:02:00 GMT</pubDate><guid>http://www.cppblog.com/guogangj/archive/2009/04/23/80870.html</guid><wfw:comment>http://www.cppblog.com/guogangj/comments/80870.html</wfw:comment><comments>http://www.cppblog.com/guogangj/archive/2009/04/23/80870.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/guogangj/comments/commentRss/80870.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/guogangj/services/trackbacks/80870.html</trackback:ping><description><![CDATA[<p style="FONT-FAMILY: 宋体">三年前有场笔试，（<span style="COLOR: #0000ff">注：三年前我在blog.csdn.net上发表过一篇同样标题的文章，本想直接转过来，但发现其中很多不妥之处，因此重写</span>）其中碰到一道题目，让我列举C++中的四种cast的转换分别是什么，有何作用，并举例说明，我虽然早知道C++有四种cast转换，但平常使用非常少也就没注意，所以那题我是没做出来，回来后打算对C++的这些类型转换方法进行小结，我做了许多实验，于是有此文，希望对你有些帮助。<br><br>下文中的&#8220;常规类型&#8221;指的是int、double、float、bool&#8230;&#8230;这些非结构化类型，也就是不包括struct和class类型。&#8220;旧式转换&#8221;指的是C语言风格的&#8220;(NewType)(Val)&#8221;方式的转换。<br><br><span style="FONT-SIZE: 18pt">1、指针=&gt;常规类型</span><br><br>比如我们需要打印一个指针的值（它指向的地址）的时候，我们指针直接转换为整数，用printf输出个16进制的地址。我们可以用旧式转换，或者reinterpret_cast，其它转换都是不可以的。</p>
<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"><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;CIndepend&nbsp;oIndepend;<br>&nbsp;&nbsp;&nbsp;&nbsp;CIndepend&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;pIndepend&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">oIndepend;<br>&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;cTest</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(unsigned&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;)pIndepend;<br>&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</span><span style="COLOR: #0000ff">short</span><span style="COLOR: #000000">&nbsp;sTest&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(unsigned&nbsp;</span><span style="COLOR: #0000ff">short</span><span style="COLOR: #000000">&nbsp;)pIndepend;<br>&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;iTest&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(unsigned&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;)pIndepend;</span></div>
<p style="FONT-FAMILY: 宋体">在32位系统中，指针其实是个32位的无符号整型，要正常输出指针的值，正确做法是把它转换为一个无符号32位整形数输出（有符号的可能导致输出不正确），如果转换为一个16位的，或者8位的，那将丢失数据，当然了，前面这段代码不会出现任何error和warning，你知道你在干什么即可。刚说了，我们除了旧式转换还可以用reinterpret_cast，于是上面的代码可以这样写：</p>
<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"><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;cTest</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;reinterpret_cast</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">unsigned&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">(pIndepend);<br>&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</span><span style="COLOR: #0000ff">short</span><span style="COLOR: #000000">&nbsp;sTest&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;reinterpret_cast</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">unsigned&nbsp;</span><span style="COLOR: #0000ff">short</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">(pIndepend);<br>&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;iTest&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;reinterpret_cast</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">unsigned&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">(pIndepend);</span></div>
<p style="FONT-FAMILY: 宋体">也是没有任何问题的，运行效果一样，那我们能不能把指针转换为浮点型呢？这样：</p>
<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"><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&nbsp;fTest&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;reinterpret_cast</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">(pIndepend);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">&nbsp;dTest&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;reinterpret_cast</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">(pIndepend);</span></div>
<p style="FONT-FAMILY: 宋体">不行，你试试看就知道了，你会得到这样的编译错误：<br><br>error C2440: 'reinterpret_cast' : cannot convert from 'class CIndepend *' to 'float'<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; There is no context in which this conversion is possible<br>error C2440: 'reinterpret_cast' : cannot convert from 'class CIndepend *' to 'double'<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; There is no context in which this conversion is possible<br><br>其实将指针转换为浮点数这种做法就很怪异嘛，你不觉得吗？这样有什么用啊？不过你一定要这样干的话也不是没有办法，看代码：</p>
<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"><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&nbsp;fTest&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;reinterpret_cast</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;&gt;</span><span style="COLOR: #000000">(pIndepend);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">&nbsp;dTest&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;reinterpret_cast</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;&gt;</span><span style="COLOR: #000000">(pIndepend);</span></div>
<p style="FONT-FAMILY: 宋体">加个小小的&#8220;&amp;&#8221;符号就可以了，C++会不顾一切地把pIndepend这个变量当作一个float和double，把指针的值&#8220;理解&#8221;为float和double，当然，这样获得的浮点数的值是没什么实际意义的，因为指针的值是32位无符号整型，而浮点数有它自己特定的格式，这么一转换就牛头不对马嘴。你还可以这样写：</p>
<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"><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&nbsp;fTest&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #0000ff">float</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">)pIndepend;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">&nbsp;dTest&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">)pIndepend;</span></div>
<p style="FONT-FAMILY: 宋体">效果一样，得到的也是无意义的值。<br><br><span style="FONT-SIZE: 18pt">2、常规类型=&gt;指针</span><br><br>就是反过来罗，可能不说大家都能猜到结果了。把常规类型转换为指针有什么用呢？可能有点用，比如我们在某些特殊的场合要求一个指针指向一个特别的地址，这时候我们可以直接给指针赋个值，当然了，这个值应该是整型：</p>
<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"><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;CIndepend&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;pIndepend;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;cVal&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">short</span><span style="COLOR: #000000">&nbsp;sVal&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;iVal&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;pIndepend&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(CIndepend&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)cVal;<br>&nbsp;&nbsp;&nbsp;&nbsp;pIndepend&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(CIndepend&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)sVal;<br>&nbsp;&nbsp;&nbsp;&nbsp;pIndepend&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(CIndepend&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)iVal;</span></div>
<p style="FONT-FAMILY: 宋体">这样是没问题的，那浮点数呢？——又来了，浮点数转换为指针？这怎么算啊？显然这是不行的，如果真的需要&#8220;转换&#8221;，那就先把浮点数转换为整型，然后再赋值给指针吧。这个时候，dynamic_cast和static_cast都是不行的。<br><br><span style="FONT-SIZE: 18pt">3、基本类型转换</span><br><br>比如int转换为float，char转变为short，很多时候我们都&#8220;默认&#8221;了这种转换，即使没有显式指定用旧式转换还是static_cast。在这种类型的转换中，旧式转换和static_cast的表现非常地类似：</p>
<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"><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">&nbsp;dVal&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">5.0</span><span style="COLOR: #000000">;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;cVal&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;static_cast</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">(dVal);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">short</span><span style="COLOR: #000000">&nbsp;sVal&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;static_cast</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">short</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">(dVal);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;iVal&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;static_cast</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">(dVal);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;cVal&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">)(dVal);<br>&nbsp;&nbsp;&nbsp;&nbsp;sVal&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #0000ff">short</span><span style="COLOR: #000000">)(dVal);<br>&nbsp;&nbsp;&nbsp;&nbsp;iVal&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">)(dVal);</span></div>
<p style="FONT-FAMILY: 宋体">而dynamic_cast还是不可行，那&#8230;&#8230;reinterpret_cast呢？不妨试试看：</p>
<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"><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">&nbsp;dVal&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">5.0</span><span style="COLOR: #000000">;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;cVal&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;reinterpret_cast</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">(dVal);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">short</span><span style="COLOR: #000000">&nbsp;sVal&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;reinterpret_cast</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">short</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">(dVal);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;iVal&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;reinterpret_cast</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">(dVal);</span></div>
<p style="FONT-FAMILY: 宋体">一编译，就出下面的错误：<br><br>error C2440: 'reinterpret_cast' : cannot convert from 'double' to 'char'<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Conversion is a valid standard conversion, which can be performed implicitly or by use of static_cast, C-style cast or function-style cast<br>error C2440: 'reinterpret_cast' : cannot convert from 'double' to 'short'<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Conversion is a valid standard conversion, which can be performed implicitly or by use of static_cast, C-style cast or function-style cast<br>error C2440: 'reinterpret_cast' : cannot convert from 'double' to 'int'<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Conversion is a valid standard conversion, which can be performed implicitly or by use of static_cast, C-style cast or function-style cast<br><br>说这是个有效标准转换，请使用static_cast或者C风格的旧式转换。reinterpret_cast不是号称最宽松的转换么？怎么不行了？你一定要它行也是没问题的，和前面的那样，加个&#8220;&amp;&#8221;符号：</p>
<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"><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;cVal&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;reinterpret_cast</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;&gt;</span><span style="COLOR: #000000">(dVal);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">short</span><span style="COLOR: #000000">&nbsp;sVal&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;reinterpret_cast</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">short</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;&gt;</span><span style="COLOR: #000000">(dVal);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;iVal&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;reinterpret_cast</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;&gt;</span><span style="COLOR: #000000">(dVal);</span></div>
<p style="FONT-FAMILY: 宋体">但结果并不是你想要的结果，因为这样reinterpret_cast会不管三七二十一，直接把dVal的东西当作是一个char，short和int，很明显，double是有一定的格式的，将double直接&#8220;理解&#8221;为char，short或者int一定会有问题。<br><br><span style="FONT-SIZE: 18pt">4、class的转换</span><br><br>上一节说的是基本类型，那对于类呢？一个类直接转换为另一个类，这看起来确实有些荒谬，不过强大而灵活的C++却偏偏允许了这种行为。看代码：</p>
<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"><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;CBase<br>{<br></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br>&nbsp;&nbsp;&nbsp;&nbsp;CBase(){};<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;m_iBase;<br>};<br><br></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;CIndepend<br>{<br></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br>&nbsp;&nbsp;&nbsp;&nbsp;CIndepend(){};<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;m_iIndepend;<br>};<br><br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;main(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;argc,&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;argv[])<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;CBase&nbsp;oBase;<br>&nbsp;&nbsp;&nbsp;&nbsp;CIndepend&nbsp;oIndepend&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;reinterpret_cast</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">CIndepend&nbsp;</span><span style="COLOR: #000000">&amp;&gt;</span><span style="COLOR: #000000">(oBase);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br>}</span></div>
<p style="FONT-FAMILY: 宋体">居然编译过去了，运行貌似也没什么问题，当然转换过程和前面的差不多，就是把oBase理解为一个CIndepend对象，这个赋值运算执行&#8220;位拷贝&#8221;，这种方式的转换在实际中是碰不到的，起码我想不出有什么理由使用它。这种情况下，其它的转换方式都是不可行的。<br><br><span style="FONT-SIZE: 18pt">5、class=&gt;指针 or 指针=&gt;class</span><br><br>这种行为更怪异，class直接理解为指针？这其实是不可行的，跟前面提到的浮点数转换为指针一样，如果实在需要，就把class转变为整型，然后整型转换为指针：</p>
<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"><span style="COLOR: #000000">CIndepend&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;pIndepend&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;reinterpret_cast</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">CIndepend&nbsp;</span><span style="COLOR: #000000">*&gt;</span><span style="COLOR: #000000">(reinterpret_cast</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">unsigned&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;&gt;</span><span style="COLOR: #000000">(oBase));</span></div>
<p style="FONT-FAMILY: 宋体">可这&#8230;&#8230;这啥意思呢？哈哈，别问我。反过来，指针转换为class恐怕也令人费解：</p>
<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"><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;CDerived&nbsp;oDerived;<br>&nbsp;&nbsp;&nbsp;&nbsp;CDerived&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">pDerived&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">oDerived;<br>&nbsp;&nbsp;&nbsp;&nbsp;CIndepend&nbsp;oIndepend&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;reinterpret_cast</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">CIndepend&nbsp;</span><span style="COLOR: #000000">&amp;&gt;</span><span style="COLOR: #000000">(pDerived);</span></div>
<p style="FONT-FAMILY: 宋体">能担当起这种怪异的工作的，唯reinterpret_cast是也，这样会产生什么后果呢？指针是个32位无符号整型，将它强制理解为一个CIndepend，然后作位拷贝，理所当然，oIndepend的值会被改变，而且还有访问越界的风险，导致内容混乱甚至程序崩溃。<br><br><span style="FONT-SIZE: 18pt">6、指针之间的转换</span><br><br>前面一直没提起的一种转换就是dynamic_cast，因为它是最为严格的一种转换，它只能完成指针到指针的转换，而且还有限制。看这个：</p>
<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"><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;CDerived&nbsp;oDerived;<br>&nbsp;&nbsp;&nbsp;&nbsp;CDerived&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">pDerived&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">oDerived;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">CIndepend&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">pIndepend&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;dynamic_cast</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">CIndepend&nbsp;</span><span style="COLOR: #000000">*&gt;</span><span style="COLOR: #000000">(pDerived);</span></div>
<p style="FONT-FAMILY: 宋体">编译出错了：<br><br>error C2683: dynamic_cast : 'CDerived' is not a polymorphic type<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; D:\work\CastTest\CastTest.cpp(13) : see declaration of 'CDerived'<br><br>因为CDerived和CIndepend没有继承关系，把dynamic_cast换成static_cast还是不行的，会出另外一个错：<br><br>error C2440: 'static_cast' : cannot convert from 'class CDerived *' to 'class CIndepend *'<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast<br><br>编译器说这是没有关系的两个指针，应该用reinterpret_cast或者C风格的旧式转换，再看：</p>
<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"><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">CDerived是CBase的子类</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;CBase&nbsp;oBase;<br>&nbsp;&nbsp;&nbsp;&nbsp;CBase&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">pBase&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">oBase;<br>&nbsp;&nbsp;&nbsp;&nbsp;CDerived&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">pDerived&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;dynamic_cast</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">CDerived&nbsp;</span><span style="COLOR: #000000">*&gt;</span><span style="COLOR: #000000">(pBase);</span></div>
<p style="FONT-FAMILY: 宋体">基类指针转换为子类指针，行不行呢？出错，错误跟刚才的一样，记住，dynamic_cast仅仅可以把子类指针转换为基类指针，别的都不行！上面这段代码如果不用dynamic_cast，而是用static_cast，就能编译通过，static_cast的要求来得比较宽松。<br><br>OK，到这里为止，大家都知道什么时候用什么转换是可以的了，问题是C++为什么搞出怎么多转换出来呢？我想很大程度上是兼顾了安全性和灵活性，要想安全，class指针的转换就使用dynamic_cast；一般情况下我们认为，static_cast也是安全的；C风格的旧式转换则灵活一些，它允许任意类型指针之间的转换；而reinterpret_cast就更加了，什么乱七八糟都可以。那从功能强弱上排个序，我想从强到弱应该是：reinterpret_cast，旧式转换，static_cast，dynamic_cast。<br><br>Oh，还有一种转换，差点忘了，就是const_cast，不过这种转换比较特别，可以独立开来，它的功能就是去除一个变量的const属性，也就是说，允许修改常量的值，哈哈，修改常量的值？既然要修改常量的值，那为什么还要声明它为常量？——这也是C++灵活的一个体现。不过const_cast其实有个问题，有时候它并不能真正改变一个常量的值，关于这个，在我的另一篇博文中有讲述，此文还在csdn.net，晚些时候移过来，我再给个链接。</p>
<img src ="http://www.cppblog.com/guogangj/aggbug/80870.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/guogangj/" target="_blank">Jiang Guogang</a> 2009-04-23 18:02 <a href="http://www.cppblog.com/guogangj/archive/2009/04/23/80870.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【CSDN】TCP/IP简介</title><link>http://www.cppblog.com/guogangj/archive/2009/04/07/79188.html</link><dc:creator>Jiang Guogang</dc:creator><author>Jiang Guogang</author><pubDate>Tue, 07 Apr 2009 08:28:00 GMT</pubDate><guid>http://www.cppblog.com/guogangj/archive/2009/04/07/79188.html</guid><wfw:comment>http://www.cppblog.com/guogangj/comments/79188.html</wfw:comment><comments>http://www.cppblog.com/guogangj/archive/2009/04/07/79188.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/guogangj/comments/commentRss/79188.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/guogangj/services/trackbacks/79188.html</trackback:ping><description><![CDATA[<p style="FONT-FAMILY: 宋体"><span style="COLOR: red">【20060307发表于blog.csdn.net，20090407重编辑】</span><br><br><span style="FONT-SIZE: 18pt">一、TCP/IP 体系结构与特点<br></span><br><strong>1、TCP/IP体系结构<br></strong><br>TCP/IP协议实际上就是在物理网上的一组完整的网络协议。其中TCP是提供传输层服务，而IP则是提供网络层服务。TCP/IP包括以下协议：<br><strong>IP</strong>：网间协议(Internet Protocol) 负责主机间数据的路由和网络上数据的存储。同时为ICMP，TCP，UDP提供分组发送服务。用户进程通常不需要涉及这一层。<br><strong>ARP</strong>：地址解析协议(Address Resolution Protocol) 此协议将网络地址映射到硬件地址。<br><strong>RARP</strong>：反向地址解析协议(Reverse Address Resolution Protocol) 此协议将硬件地址映射到网络地址。<br><strong>ICMP</strong>：网间报文控制协议(Internet Control Message Protocol) 此协议处理信关和主机的差错和传送控制。<br><strong>TCP</strong>：传送控制协议(Transmission Control Protocol) 这是一种提供给用户进程的可靠的全双工字节流面向连接的协议。它要为用户进程提供虚电路服务，并为数据可靠传输建立检查。（注：大多数网络用户程序使用TCP）<br><strong>UDP</strong>： 用户数据报协议(User Datagram Protocol) 这是提供给用户进程的无连接协议，用于传送数据而不执行正确性检查。<br><strong>FTP</strong>： 文件传输协议(File Transfer Protocol) 允许用户以文件操作的方式（文件的增、删、改、查、传送等）与另一主机相互通信。<br><strong>SMTP</strong>： 简单邮件传送协议(Simple Mail Transfer Protocol) SMTP协议为系统之间传送电子邮件。<br><strong>TELNET</strong>：终端协议(Telnet Terminal Procotol) 允许用户以虚终端方式访问远程主机。<br><strong>HTTP</strong>： 超文本传输协议(Hypertext Transfer Procotol)<br><strong>TFTP</strong>: 简单文件传输协议(Trivial File Transfer Protocol)<br><br><strong>2、TCP/IP特点</strong><br><br>TCP/IP协议的核心部分是传输层协议(TCP、UDP)，网络层协议(IP)和物理接口层，这三层通常是在操作系统内核中实现。因此用户一般不涉及。编程时，编程界面有两种形式：一、是由内核心直接提供的系统调用；二、使用以库函数方式提供的各种函数。前者为核内实现，后者为核外实现。用户服务要通过核外的应用程序才能实现，所以要使用套接字(socket)来实现。<br><br><span style="FONT-SIZE: 18pt">二、专用术语<br></span><br><strong>1、套接字</strong><br><br>套接字是网络的基本构件。它是可以被命名和寻址的通信端点，使用中的每一个套接字都有其类型和一个与之相连听进程。套接字存在通信区域（通信区域又称地址簇）中。套接字只与同一区域中的套接字交换数据（跨区域时，需要执行某和转换进程才能实现）。WINDOWS 中的套接字只支持一个域——网际域。套接字具有类型。<br><br>WINDOWS SOCKET 1.1 版本支持两种套接字：流套接字(SOCK_STREAM)和数据报套接字(SOCK_DGRAM)。<br><br><strong>2、WINDOWS SOCKETS 实现<br><br></strong>一个WINDOWS SOCKETS 实现是指实现了WINDOWS SOCKETS规范所描述的全部功能的一套软件。一般通过DLL文件来实现。<br><br><strong>3、阻塞处理例程<br><br></strong>阻塞处理例程(blocking hook,阻塞钩子)是WINDOWS SOCKETS实现为了支持阻塞套接字函数调用而提供的一种机制。<br><br><strong>4、多址广播（multicast，多点传送或组播）<br><br></strong>是一种一对多的传输方式，传输发起者通过一次传输就将信息传送到一组接收者，与单点传送(unicast)和广播(Broadcast)相对应。<br></p>
<img src ="http://www.cppblog.com/guogangj/aggbug/79188.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/guogangj/" target="_blank">Jiang Guogang</a> 2009-04-07 16:28 <a href="http://www.cppblog.com/guogangj/archive/2009/04/07/79188.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>