![](https://static.zsdocx.com/FlexPaper/FileRoot/2019-6/5/21/c950a251-a42e-4592-9faa-d760e04a99d5/c950a251-a42e-4592-9faa-d760e04a99d5pic.jpg)
![c++數(shù)據(jù)結(jié)構(gòu)算法演示系統(tǒng)畢業(yè)設(shè)計_第1頁](https://static.zsdocx.com/FlexPaper/FileRoot/2019-6/5/21/c950a251-a42e-4592-9faa-d760e04a99d5/c950a251-a42e-4592-9faa-d760e04a99d51.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、<p><b> 摘要</b></p><p><b> Abstract</b></p><p><b> 目 錄</b></p><p><b> 1 緒論1</b></p><p><b> 2 需求分析2<
2、/b></p><p> 2.1 解決問題2</p><p> 2.2 具備功能2</p><p><b> 3 系統(tǒng)設(shè)計2</b></p><p> 3.1 開發(fā)及使用環(huán)境2</p><p> 3.2 系統(tǒng)結(jié)構(gòu)2</p><p> 3.3 詳細(xì)
3、設(shè)計2</p><p><b> 4 系統(tǒng)操作2</b></p><p> 4.1 主菜單操作2</p><p> 4.2 線性表操作2</p><p><b> 4.3 樹操作2</b></p><p> 4.4 算法說明操作2</p>
4、<p><b> 結(jié)束語2</b></p><p><b> 謝 辭2</b></p><p><b> 參考文獻(xiàn)2</b></p><p><b> 附錄2</b></p><p> 附錄A 外文翻譯-原文部分2<
5、/p><p> 附錄B 外文翻譯-譯文部分2</p><p><b> 附錄C 源代碼2</b></p><p><b> 緒論</b></p><p> 數(shù)據(jù)結(jié)構(gòu)是在整個計算機(jī)科學(xué)與技術(shù)領(lǐng)域上廣泛被使用的術(shù)語。它用來反映一個數(shù)據(jù)的內(nèi)部構(gòu)成,即一個數(shù)據(jù)由那些成分?jǐn)?shù)據(jù)構(gòu)成,以什么方式構(gòu)成,呈什
6、么結(jié)構(gòu)。數(shù)據(jù)結(jié)構(gòu)有邏輯上的數(shù)據(jù)結(jié)構(gòu)和物理上的數(shù)據(jù)結(jié)構(gòu)之分。邏輯上的數(shù)據(jù)結(jié)構(gòu)反映成分?jǐn)?shù)據(jù)之間的邏輯關(guān)系,而物理上的數(shù)據(jù)結(jié)構(gòu)反映成分?jǐn)?shù)據(jù)在計算機(jī)內(nèi)部的存儲安排。數(shù)據(jù)結(jié)構(gòu)是數(shù)據(jù)存在的形式。 數(shù)據(jù)結(jié)構(gòu)是信息的一種組織方式,其目的是為了提高算法的效率,它通常與一組算法的集合相對應(yīng),通過這組算法集合可以對數(shù)據(jù)結(jié)構(gòu)中的數(shù)據(jù)進(jìn)行某種操作。數(shù)據(jù)結(jié)構(gòu)課程的主要目的是介紹一些常用的數(shù)據(jù)結(jié)構(gòu),闡明數(shù)據(jù)結(jié)構(gòu)內(nèi)在的邏輯關(guān)系,討論它們在計算機(jī)中的存儲表示,并結(jié)合各種
7、數(shù)據(jù)結(jié)構(gòu),討論對它們實(shí)行的各種運(yùn)算的實(shí)現(xiàn)算法。很多算法實(shí)際上是對某種數(shù)據(jù)結(jié)構(gòu)施行的一種變換,研究算法也就是研究在實(shí)施變換過程中數(shù)據(jù)結(jié)構(gòu)的動態(tài)性質(zhì)。</p><p> 數(shù)據(jù)結(jié)構(gòu),作為計算機(jī)學(xué)科的基礎(chǔ)性專業(yè)課程,其在計算機(jī)科學(xué)中的及其重要,課程學(xué)習(xí)的好壞,直接關(guān)系到學(xué)員后期計算機(jī)水平的高低。而這門課程一直因?yàn)檫^于抽象,難以理解,而讓人望而止步。如果能夠把這門抽象的課程變得具體而生動,必將提高學(xué)習(xí)人員興趣,增加其積極
8、性和主動性,也有利于人員的對此課程的學(xué)習(xí)。</p><p> 基于這些目的,我們開發(fā)了這個數(shù)據(jù)結(jié)構(gòu)算法演示系統(tǒng),數(shù)據(jù)結(jié)構(gòu)是我們所做的系統(tǒng)的主要理論基礎(chǔ),我們完成了線性表、堆棧、隊(duì)列、樹、圖幾個主要結(jié)構(gòu),在學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)這門課程的時候,我們了解了這些結(jié)構(gòu)的算法,當(dāng)時也做過一些相關(guān)的程序,在此基礎(chǔ)之上,我運(yùn)用c++ builder開發(fā)工具,把這些算法演示出來。</p><p> 數(shù)據(jù)結(jié)構(gòu)算法
9、演示系統(tǒng)可以演示線性表、堆棧、隊(duì)列、樹、圖等幾個基礎(chǔ)結(jié)構(gòu)的算法,輔助一些算法說明,讓使用者更好地掌握算法,在幫助中把演示的具體過程和操作做詳細(xì)的介紹。</p><p> 該系統(tǒng)具有操作簡單、形象生動,能很好地改善人員對數(shù)據(jù)結(jié)構(gòu)課程的學(xué)習(xí)理解,從很大程度上提高人員的學(xué)習(xí)質(zhì)量和效率。</p><p><b> 需求分析</b></p><p>
10、<b> 解決問題</b></p><p> 做為一個數(shù)據(jù)結(jié)構(gòu)演示系統(tǒng),首先我們確定要演示的內(nèi)容,在本系統(tǒng)中,我們對線性表、堆棧和隊(duì)列、樹、圖幾個主要數(shù)據(jù)結(jié)構(gòu)做了講解;接著,對四種算法的說明也是必不可少的,這樣配合演示,可以達(dá)到更好地效果;最后,作為我們設(shè)計的演示過程,使用者對操作不是太了解,我們有必要做個詳細(xì)的操作過程,讓使用者更好地操作系統(tǒng)。</p><p>
11、<b> 具備功能</b></p><p> 系統(tǒng)由數(shù)據(jù)結(jié)構(gòu)、操作、幫助、程序四個部分組成?,F(xiàn)分述如下:</p><p> 數(shù)據(jù)結(jié)構(gòu)由線性表、堆棧和隊(duì)列、樹、圖等四個部分組成,分別對應(yīng)數(shù)據(jù)結(jié)構(gòu)的四個部分。線性表又分為鏈表概念、鏈表模型、鏈表操作、雙向鏈表四個部分,堆棧和隊(duì)列分為基本堆棧、基本隊(duì)列、循環(huán)隊(duì)列三個部分,樹分為數(shù)據(jù)二叉樹、結(jié)構(gòu)二叉樹、類二叉樹,圖分為圖
12、表示、圖搜索、最短路徑。</p><p> 操作由線性表說明、堆棧說明、隊(duì)列說明、樹說明、圖說明組成,對各數(shù)據(jù)結(jié)構(gòu)的算法說明。</p><p> 幫助由關(guān)于和幫助組成,是本系統(tǒng)的一些說明和對演示過程的操作詳細(xì)說明。</p><p> 程序部分由退出組成,完成系統(tǒng)的終止。</p><p><b> 系統(tǒng)設(shè)計</b>
13、</p><p><b> 開發(fā)及使用環(huán)境</b></p><p> C++ BUILDER</p><p> C++ BUILDER介紹</p><p> 提起B(yǎng)orland C/C++,相信業(yè)界的許多朋友都會感慨萬千,因?yàn)樗鴰ьI(lǐng)很多人跨進(jìn)了Windows開發(fā)的大門。和美國Inprise公司(原Borland
14、公司)其他面向企業(yè)分布式系統(tǒng)的開發(fā)工具(如Delphi 、Jbuilder )相比,新近推出的最新版本C++ RAD(快速應(yīng)用開發(fā))工具――Borland C++ Builder 4,無論是在開發(fā)環(huán)境、分布式應(yīng)用系統(tǒng)開發(fā)、支持已有C++資源方面,還是在快速開發(fā)Web及Internet應(yīng)用程序、數(shù)據(jù)庫處理等方面,都表現(xiàn)出了其獨(dú)特的一面。</p><p> (1)全新的集成開發(fā)環(huán)境</p><p
15、> C++ Builder保留了使用Framework(如:OWL、MFC)的開發(fā)方式,融合了Visual Basic、Delphi等開發(fā)工具的面向組件的開發(fā)方式。C++ Builder的集成開發(fā)環(huán)境提供了120多個VCL組件,使開發(fā)人員不需太多編碼,就能夠?qū)崿F(xiàn)很多復(fù)雜的功能,體現(xiàn)了軟件的“重用性”原則。C++ Builder的用戶界面也非常友好,易于使用,并且采用了停駐式(docking)工具條,可以自由組合集成開發(fā)環(huán)境窗口和
16、工具條的排放方式。在編碼過程中,還可以使用CodeExplorer技術(shù)對源代碼進(jìn)行管理。CodeCompletion技術(shù)使編譯器能夠自動列出VCL組件的可用屬性和方法供程序員選擇,而不必手工輸入冗長的代碼。C++ Builder的集成開發(fā)環(huán)境如圖1所示。</p><p> (2)簡化了分布式應(yīng)用系統(tǒng)的開發(fā)</p><p> 企業(yè)向多層分布式系統(tǒng)跨越已經(jīng)成為了一種必然趨勢,目前分布式運(yùn)算
17、標(biāo)準(zhǔn)主要有Microsoft 的DCOM和OMG的CORBA,是否支持這兩種標(biāo)準(zhǔn)決定了開發(fā)工具的適用領(lǐng)域和范圍。C++ Builder可以說是目前唯一同時支持CORBA和COM的C++集成開發(fā)環(huán)境,因此既適用于基于ORB的分布式開發(fā),又適用于基于COM的Windows開發(fā)。C++ Builder內(nèi)置了VisiBroker3。3,它是目前全球分發(fā)數(shù)量最多的CORBA ORB,并且包含了Event Service和NamingService
18、等標(biāo)準(zhǔn)CORBA服務(wù),從而為開發(fā)CORBA應(yīng)用提供了可能。C++ Builder 將CORBA IDL 編譯器集成在其開發(fā)環(huán)境中,通過配合各種向?qū)?Wizard),可以快速生成CORBA Client和Server的源程序代碼框架,這對于開發(fā)CORBA產(chǎn)品的朋友來說,確實(shí)是非常方便的。圖2顯示了C++ Builder中建立CORBA對象的各種向?qū)А?lt;/p><p> 在Microsoft COM方面,C++ B
19、uilder 同樣提供了各種向?qū)?,可以一步生成COM標(biāo)準(zhǔn)組件、OLE Automation組件及ActiveX組件,您可以在Windows環(huán)境下大顯身手?!?C++ Builder 提供的MIDAS2同時支持CORBAIIOP、DCOM、DCE RPC以及TCP/IP等多種連接方式,適用于分布式系統(tǒng)的開發(fā)。比如,非Windows環(huán)境上的Java應(yīng)用程序,可以通過CORBA IIOP使用C++ Builder開發(fā)出來的應(yīng)用程序服務(wù)器。從
20、而使用戶可以在原有系統(tǒng)基礎(chǔ)之上構(gòu)建跨平臺、跨程序語言的分布式應(yīng)用系統(tǒng)。</p><p> (3)對已有C++資源的支持</p><p> 用戶可能會關(guān)心,對于過去開發(fā)的基于Borland C++ OWL和Microsoft MFC的程序,C++ Builder是否能夠兼容?回答是肯定的。C++ Builder的另一特性就是提供了MFC4。2版的函數(shù)庫,強(qiáng)化了對Microsoft Vis
21、ual C++源代碼的兼容性,可以直接編譯MSDN與各種SDK中的范例程序。通過MFC向?qū)?,還可以生成MFC的代碼框架。</p><p> 除此之外,C++ Builder能夠編譯原有的BorlandC++ OWL程序碼,因此就不必?fù)?dān)心以前的工作白做了!C++ Builder中提供了符合ANSI/ISO標(biāo)準(zhǔn)的C++編輯器,還能夠開發(fā)可移植于非Windows平臺的C++程序。</p><p&g
22、t; (4)快速開發(fā)Web及Internet應(yīng)用程序</p><p> 目前,基于Internet的開發(fā)已經(jīng)成為一種時尚。C++ Builder在開發(fā)Web及Internet應(yīng)用方面的功能也非常強(qiáng)大。C++ Builder提供了21個Internet通信協(xié)議組件,用于Internet應(yīng)用程序的開發(fā)。開發(fā)人員可以建立“零配置”、基于Web瀏覽器的“瘦客戶”應(yīng)用程序。C++ Builder同時支持CGI、WIN-
23、CGI、ISAPI及NSAPI等標(biāo)準(zhǔn),使開發(fā)人員利用現(xiàn)有的開發(fā)技術(shù)就可以用可視化的方式開發(fā)跨平臺的Web應(yīng)用程序。運(yùn)用ActiveForm/ATL及WebDeploy技術(shù),還可以實(shí)現(xiàn)ActiveX組件的Web分發(fā)。</p><p> (5)強(qiáng)大的數(shù)據(jù)庫處理功能</p><p> C++ Builder提供了對Oracle8、Microsoft SQLServer 7、Informix
24、9、Sybase、IBM DB 2 UniversalServer、InterBase 5。5等大型數(shù)據(jù)庫的高速驅(qū)動程序,并支持Oracle8的對象關(guān)聯(lián)延伸功能(如圖3所示),如Abstract Data Type、Nested Tables、Variable LengthArrays、Object Pointers(REFs)及External FileReference等。同時C++ Builder還保留了對MicrosoftAcc
25、ess 97、FoxPro、Visual dBASE及Paradox等本地數(shù)據(jù)庫的處理能力。因此,無論是大型的數(shù)據(jù)庫應(yīng)用系統(tǒng)開發(fā),還是小型的數(shù)據(jù)庫管理系統(tǒng),C++ Builder都有其用武之地。</p><p> C++ Builder還提供了MTS 組件向?qū)?,用于快速生成支持Microsoft Transaction Server的COM組件。BDEResource Dispenser使用戶可以在MTS中使用
26、BDE存取數(shù)據(jù)庫,保證了MTS對數(shù)據(jù)庫的兩階段提交(Two PhaseCommit)及資源管理的能力。</p><p> (6)強(qiáng)大的調(diào)試功能</p><p> C++ Builder強(qiáng)化了原有的Module View、EventLog View及Inspect Local Variable等調(diào)試窗口的功能,并在Windows NT環(huán)境中提供多線程調(diào)試的新功能,使用戶可以在某一特定過程
27、中跟蹤程序代碼。C++ Builder針對多層分布式開發(fā)環(huán)境提供了遠(yuǎn)程調(diào)試能力,開發(fā)人員可以通過網(wǎng)絡(luò)直接對遠(yuǎn)端的應(yīng)用程序服務(wù)器進(jìn)行調(diào)試,從而簡化了多層應(yīng)用系統(tǒng)的開發(fā)和維護(hù)工作。</p><p><b> (7)其他特點(diǎn)</b></p><p> C++ Builder還有很多新增的功能,如:針對Windows 98提供了PageScroller、MonthCale
28、ndar等Windows 98格式的新組件,并支持Windows98的多重屏幕顯示功能及Microsoft Office97格式的選擇選單和停駐式(docking)工具條。對界面的處理上,可以控制窗口的最大/最小尺寸以及窗口尺寸變動時其中組件的相對位置和比例,等等。</p><p> 總之,C++ Builder 的強(qiáng)大功能并不是通過筆者有限的介紹所能夠涵蓋的,在C++海洋里遨游的朋友不妨親自嘗試一下C++ B
29、uilder,體驗(yàn)一下它的靈活與強(qiáng)大,相信您定會“戀戀不舍”的。</p><p> C++ BUILDER與Visual C++對比</p><p> 首先,從它們的應(yīng)用程序框架(Application Frame,有時也稱為對象框架)進(jìn)行比較。Visual C++采用的框架是MFC。MFC不僅僅是人們通常理解的一個類庫。(同樣,Del phi和C++Builder使用的VCL的概念也
30、不僅僅是一個控件庫。)你如果選擇了MFC,也就選擇了一種程序結(jié)構(gòu),一種編程風(fēng)格。MFC早在Windows 3.x的時代就出現(xiàn)了,那時的Visual C++還是16位的。經(jīng)過這些年的不斷補(bǔ)充和完善,MFC已經(jīng)十分成熟。但由于原型出現(xiàn)得比較早,MFC相比于VCL落后了一個時代。盡管微軟對MFC的更新沒有停止,我也經(jīng)常讀到持"只要Windows不過時,MFC就不會過時"之類觀點(diǎn)的文章,但就象Inprise(原Borland
31、)的OWL框架的淡出一樣,MFC的淡出也是早晚的事。如果MFC青春永駐,微軟的開發(fā)人員也不會"私自"開發(fā)出基于ATL的WTL呀。當(dāng)然,WTL的地位不能和MFC比,它并不是微軟官方支持的框架,封裝的功能也相當(dāng)有限。但至少也反襯出了MFC存在的不足。 </p><p> 我以為,最能體現(xiàn)一個應(yīng)用程序框架的先進(jìn)性的是它的委托模型,即對Windows消息的封裝機(jī)制。(對Windows API的封裝就
32、不用說了吧。大同小異,也沒什么技術(shù)含量。 如果高興,你也可以自己寫一個類庫來封裝。但對Windows消息驅(qū)動機(jī)制的封裝就不是那么容易的了。)最自然的封裝方式是采用虛成員函數(shù)。如果要響應(yīng)某個消息就重載相應(yīng)的虛函數(shù)。但出乎我的意料,MFC采用的是"古老"的宏定義方法。用宏定義方法的好處是省去了虛函數(shù)VTable的系統(tǒng)開銷。(由于Windows的消息種類很多,開銷不算太小。)不過帶來的缺點(diǎn)就是映射不太直觀。好在較新版本VC
33、帶的ClassWizard可以自動生成消息映射代碼,使用起來還是比較方便的。但和VCL的委托模型相比,MFC的映射方法就顯得太落后了。而C++Builder對C++語言進(jìn)行了擴(kuò)展,以便引入組件、事件處理、屬性等新特性。由于功夫做在編譯器級,生成的源代碼就顯得十分簡潔。但是由于擴(kuò)展的非標(biāo)準(zhǔn)特性,使用VCL的C++Builder的源代碼無法被其它編譯器編譯。而MFC的功夫做在源代碼級,雖然消息映射代碼較為復(fù)雜且不直觀,但兼容性非常好。只要你
34、有MFC庫的源</p><p> C++Builder的VCL比Visual C++的MFC先進(jìn)的另一個特性是異常處理。但令人啼笑皆非的是,它的異常處理代碼有bug,有時會無端拋出異常。不知道在最新的版本中有沒有改正了。而VC的框架MFC也不是一無是處。經(jīng)歷了那么多年的發(fā)展和完善,MFC功能非常全面,而且十分穩(wěn)定,bug很少。其中你可能遇到的bug更少。而且有第三方的專門工具幫助你避開這些bug。如此規(guī)模的一個
35、類庫,能做到這一點(diǎn)不容易。不要小看了這一點(diǎn),很多專業(yè)程序員就是為這個選擇VC的。而C++Builder的VCL的bug就相對較多了,而且有些它自己帶的示例程序都有錯誤??磥鞩nprise還有很長的路要走。 </p><p> 再從它們的易用性比較。VC有ClassWizard、SourceBrowser等一系列工具,還附帶Visual SourceSafe、Visual Modeler等強(qiáng)大的工具,易用性非常好
36、。(VC自帶建模工具Visual Modeler,也許說明了它才是工程級的開發(fā)平臺,與C++Builder的定位不同。)它所帶的MSDN這部"開發(fā)者的百科全書"更是讓你"沒有找不到的,只有想不到的"。而且它的AutoComplete之類小功能也比C++Builder要體貼。C++Builder的新版本雖然也提供了這一功能,但它的提示要等好幾秒才出來,有時你不經(jīng)意間把鼠標(biāo)停在某一處,也要等硬盤響好幾
37、秒,這可是在566Mhz的賽揚(yáng)II上呀。不要笑我瑣碎,有時一個開發(fā)工具的成熟和易用,就是從這些小地方體現(xiàn)出來的。C++Builder作為RAD工具,理應(yīng)強(qiáng)調(diào)易用性。但與VC相比還顯出不成熟。這是不應(yīng)該的。 </p><p> 再來看看它們的可移植性。Inprise正在開發(fā)C++Builder和Delphi的Linux版本, 代號為Kylix。也許通過Kylix,用VCL構(gòu)架編寫的Windows程序向Linux移
38、植成為可能。但這只是可能。因?yàn)樵谀壳癐nprise的兼容性工作做得并不好。C++Builder可以編譯VC程序還要多謝微軟使用標(biāo)準(zhǔn)方法寫MFC,而它自己各個版本之間兼容性卻不太好。低版本的C++Builder不能使用高版本的VCL組件(這還別去說它),而高版本的C++Builder竟然不能使用低版本的VCL組件。真是豈有此理,我很少看見軟件有不向下兼容的。如果Windows 98不能運(yùn)行95的程序,Windows 95不能運(yùn)行3.x的程
39、序,Win 3.x不能運(yùn)行DOS程序,你 還會用Windows嗎?如果不是C++Builder的其它某些方面太出色,光是這個向下不兼容就足以讓我拋棄它。而且雖說通過捆綁編譯器,C++Builder可以編譯Delphi的Object Pascal代碼,但C++Builder仍不能使用為Delphi開發(fā)的VCL組件。所以一個組件有for D1/D 2/D3/D4/D5/C1</p><p> 再來看看它們的前景吧。
40、實(shí)際上,技術(shù)的進(jìn)步在很多時候是此消彼長的。當(dāng)初Borland的Turbo C和Borland C++幾乎是唯一的選擇。微軟的Quick C(現(xiàn)在還有人知道這個產(chǎn)品嗎?)和Microsoft C/C++從來也沒有成為過主流。但Borland C++又流行了多少年呢?不久就被新崛起的Microsoft Visual C/C++壓下去了?,F(xiàn)在的C++Builder又有后來居上的態(tài)勢,如果穩(wěn)定性再提高一些,bug再少一些,有希望成為主流。但I(xiàn)n
41、spires的總體實(shí)力不及微軟,這也是無可爭議的。從C++Builder 5的Release Notes中的Known Issues部分,以及它們的幫助文檔的規(guī)模和質(zhì)量都可以看出。(哪個同類產(chǎn)品的幫助文檔能和MSDN比呢?)Inprise公司應(yīng)從Netscape吸取教訓(xùn),不要讓C++Builder成為第二個Netscape Communicator。(Communicator也是一度技術(shù)領(lǐng)先,甚至曾占據(jù)了大部分的瀏覽器市場,但似乎后勁不
42、足,而且 6.0 PR1、2中bug多多,現(xiàn)在被IE壓得抬不起頭。)C++Builder是Insp</p><p> 就技術(shù)(主要指應(yīng)用框架)來說,C++Builder目前領(lǐng)先于Visual C++。但多多少少的不盡人意之處對Inprise"想說愛你不容易"。而VC盡管發(fā)展到今日已十分完善,但MFC框架已是明日黃花了。如果不使用MFC,目前又沒有合適的替代品。WFC是支持組件、屬性和事件的,
43、但那是Visual J++里邊用的;ATL也很先進(jìn),但是用來進(jìn)行COM/ActiveX開發(fā)的;基于ATL的WTL也不錯,可惜是非官方作品,也未必比VCL先進(jìn)。微軟最近提出了C#(讀作C Sharp)語言方案,但那屬于和Java同一類的東西??磥硎墙馃o足赤啊。根據(jù) 你的需要做選擇吧。實(shí)際上Visual C++和C++Builder也不是單單競爭關(guān)系。它們在許多領(lǐng)域并不重疊,甚至是互補(bǔ)的。到底怎樣取舍,要根據(jù)你的項(xiàng)目特性決定。如果你開發(fā)系統(tǒng)
44、底層的東西,需要極好的兼容性和穩(wěn)定性,選Visual C++吧。你可以只調(diào)用Windows的各種API,不用MFC。如果你寫傳統(tǒng)的Windows桌面應(yīng)用程序,Visual C++的MFC框架是"正統(tǒng)"的選擇。如果你為企業(yè)開發(fā)數(shù)據(jù)庫、信息管理系統(tǒng)等高層應(yīng)用("高層"是相對于"低層/底層</p><p><b> BCB的調(diào)試</b></
45、p><p> 程序的bugs越少,最終用戶對這個程序的評價越高。而開發(fā)人員事先對bugs的處理越多,最終用戶能提供的關(guān)于bugs的信息就越多,也越準(zhǔn)確,這樣,開發(fā)人員在接到最終用戶反映之后,就能夠快速找到出現(xiàn)bugs的那部分代碼,并以最快速度發(fā)布程序的升級包。 </p><p> (1)寫易讀的代碼 </p><p> 第一點(diǎn),大概也是最重要的一點(diǎn),就是寫干凈易讀
46、的代碼。易讀的代碼是很有價值的。請想象一下,如果隨便掃視一眼代碼或注釋,就能立刻知道這段代碼的的作用,以及在寫代碼的時候?yàn)槭裁匆@樣寫,當(dāng)時的思路是什么,那么就可以節(jié)約大量時間。這樣的代碼,在寫的時候可能會稍稍慢一些,不過,當(dāng)你調(diào)試程序時,就不會花上幾個小時來尋找bugs,相反,你可以快速,簡單的完成除錯工作。這時,你就會覺得多花一些時間使程序易讀是很值得的。</p><p> 所以,在寫程序的時候,應(yīng)該養(yǎng)成自
47、己的風(fēng)格,或是讀一讀Scott的關(guān)于代碼風(fēng)格的文章。 </p><p> (2)使用Exceptions和Exception的處理方法 </p><p> 除去一些少數(shù)的情況,開發(fā)人員不可能總是依靠于集成的調(diào)試工具。所以,學(xué)會用其它的方法來找到煩人的bugs是很重要的。一些重要的、處理的錯誤可能會在窗體之外發(fā)生。在C++標(biāo)準(zhǔn)制定出來之前的黑暗日子里,在程序里面發(fā)出發(fā)生錯誤的信號,通常是
48、通過返回錯誤代碼完成的(現(xiàn)在這種方法仍然應(yīng)用于OLE技術(shù)和一些Winapi函數(shù)),這樣的處理方法很容易就會被忽略。(比如說,你經(jīng)常檢查winapi函數(shù)的返回值嗎?)所以,出現(xiàn)問題的可能性并不小。由于以上的原因,需要一個這樣的機(jī)制,它不能忽略這些錯誤,而且,這個機(jī)制應(yīng)該能被我們控制和自定義的。在這樣的需求下,異常處理機(jī)制出現(xiàn)了。需要一個特殊的錯誤類型嗎?簡單,定義一個新的異常類型就行了(和定義一個類的方法差不多),然后拋出(throw)它
49、。 </p><p> C++Builder定義了try {} catch (…) {}機(jī)制。這和剛剛定義的異常機(jī)制的結(jié)構(gòu)很相似。這個機(jī)制完全可以按照需要自定義。要使用異常處理了,只要把要執(zhí)行的代碼放到try塊里面,為了讓程序知道出現(xiàn)異常后應(yīng)該做什么,還需要定義一個catch()或是__finally塊。Catch()語句里面可以指定一個要捕捉的類型或是變量,甚至可以用它來捕捉樹結(jié)構(gòu)或是繼承類的異常,如果捕捉了
50、基類的異常,它就能捕捉到繼承這個基類的所有的類的異常。比如,在VCL中,所有的異常都是繼承于Exception類。所以,catch(Exception& E)可以捕捉到除了EsocketError的所有VCL異常。為了讓這個機(jī)制更強(qiáng)大,C++Builder中還定義了catch(…)語句。(沒錯,就是三個點(diǎn))使用這條語句可以捕捉到所有的異常。還有更多的功能嗎?當(dāng)然,你可以添加更多的catch()語句,可以向使用if…else if
51、…語句那樣使用它。注意,在一系列的catch()語句中,錯誤不會被重復(fù)的捕捉,也就是說,如果前面的catch()語句捕捉到了錯誤,后面的catch()語句將不會捕捉這條錯誤。 </p><p> 這個機(jī)制還有更多的功能。如果你想處理異常,但是不想在處理的位置停止,那么可以重新拋出異常。這時,程序?qū)⒗^續(xù)尋找下一個catch()語句來處理這個異常。這個方法和“throw”差不多。這樣,你處理過的異常會再次被拋出,
52、繼續(xù)尋找下一個catch語句來處理它。 </p><p> 最后一個要說的是__finally(這不是標(biāo)準(zhǔn)的用法,是Borland添加的一個好方法),在__finally{}程序塊中代碼,無論是否發(fā)生異常都會被執(zhí)行。這是一個清理程序中使用new分配的本地變量,設(shè)置用作旗標(biāo)的變量值為正常的好位置。(比如,把一個等待狀態(tài)的光標(biāo)圖標(biāo)設(shè)置為正常光標(biāo)。) </p><p> 就是這些了。有時間的
53、話,請看看C++Builder幫助文件中的Exception類以及繼承Exception的類。這些將對于理解本節(jié)所說的內(nèi)容有很大幫助。 </p><p> (3)使用記錄機(jī)制 </p><p> 不可能總是用調(diào)試器來調(diào)試代碼,在某些情況下,可能無法使用內(nèi)部集成的調(diào)試器,這時候,就不得不依靠其他手段調(diào)試程序了。(比如:Windows NT服務(wù)程序,ISAPI/CGI程序,實(shí)時應(yīng)用程序等等
54、)。這時候,有經(jīng)驗(yàn)的程序員可能會借助古老的調(diào)試方法,例如,使用一些分類的記錄機(jī)制來確定程序?qū)嶋H運(yùn)行的過程。現(xiàn)在有一系列的方法可以簡單的完成這樣的工作。下面將介紹3種方法。 </p><p> 第一個方法:OutputDebugString。(WinAPI: VOID OutputDebugString(LPCTSTR lpOutputString);)很幸運(yùn),微軟徹底的實(shí)現(xiàn)了調(diào)試子系統(tǒng)。它包括的一些特點(diǎn)可能讓你
55、想把自己的記錄系統(tǒng)扔掉。應(yīng)用程序在調(diào)試器進(jìn)程中運(yùn)行時OutputDebugString將用C字符串把調(diào)試器輸出的信息打印出來。如果程序沒有在調(diào)試器進(jìn)程中運(yùn)行,它將忽略這些調(diào)用。它會很好的在客戶的機(jī)器上運(yùn)行,不會彈出信息窗口。如果在發(fā)布給客戶的時候,忘記去掉這些代碼程序僅僅會變慢一點(diǎn),不會有別的不良后果。 </p><p> 第二個方法:使用了Gexperts,通過 dbugint.pas接口進(jìn)行調(diào)試。它是個可以
56、稱之為偉大的程序,你可以把它分發(fā)給客戶。和OutputDebugString一樣,如果客戶沒有這個程序,它就根本什么也不作。(它會自動檢測機(jī)器上是否安裝了客戶端)。要使用dbugintf,它很容易被加入到你的工程中,加入#include "dbugintf.HPp"(要把它加入工程,然后會編譯它的pascal文件)。然后,你就可以直接使用SendDebug(要送到記錄文件的字符串); 或者,你需要它更機(jī)警一些,可以使
57、用SendDebugEx(它給TMsgDlgType增加了一個新的消息類型)SendMethodEnter, SendMethodExit, SendSeparator等等(用法都差不多)。如果你打算給最終用戶分發(fā)客戶端 (Gdebug.exe),不要忘記include所需要的程序包。Gexperts可以在http://www.gexperts.org 得到,它是免費(fèi)的。 </p><p> 第三個方法:大概是
58、最艱苦的方法,就是使用自己的記錄控制。這個方法可能不是想象的這么簡單??赡苁紫葧氲健霸诖绑w上扔一個RichEdit,把它設(shè)置為只讀的,然后往里面寫記錄”是這樣吧?理論上不錯,但是,實(shí)施起來…首先,使用RichEdit控件來做記錄,會大大降低應(yīng)用程序的速度,還會在內(nèi)存中造成碎片,甚至丟失內(nèi)存。通常,在運(yùn)行10分鐘左右之后,會使整個計算機(jī)的速度變慢!所以,如果希望在自己的記錄中能夠使用彩色和圖標(biāo),那么最好自己創(chuàng)建一個組件。如果沒有這么高的
59、要求,那么有一個簡單有效的方法,就是使用ListBox控件作記錄,把ListBox的Style屬性設(shè)置為lbOwnerDrawFixed,這樣句柄將會自繪。(Gexperts的控制臺就是用這樣的方法制作的)。 </p><p> (4)將記錄和異常處理結(jié)合使用 </p><p> 不用總是擔(dān)心可能會發(fā)生什么偶然的異常。一般來說,通過很多的bugs測試后(盡量折磨程序,看看它會不會崩潰)
60、,應(yīng)用程序在運(yùn)行是應(yīng)該不會出現(xiàn)什么錯誤。下面的這個技術(shù),建議組件開發(fā)者,在第一次把組件放在IDE環(huán)境測試的時候,很應(yīng)該遵守。一個在IDE中產(chǎn)生的異常會導(dǎo)致很多問題,甚至可能無法重新啟動IDE也不能恢復(fù)。這個技術(shù)很簡單。在代碼中每一個函數(shù)或是主要的函數(shù)中加入: </p><p><b> try </b></p><p><b> { </b>
61、</p><p><b> //函數(shù)的代碼 </b></p><p><b> } </b></p><p> catch(Exception &E) </p><p><b> { </b></p><p> SendDebugMes
62、sage(“Exception caught in classname::functionname of type:” +E.ClassName() +” with the message:”+E.Message); </p><p><b> }; </b></p><p> 把字符串中classname 和 functionname 替換成相應(yīng)的類名和函數(shù)名。
63、在出現(xiàn)錯誤時,你會立刻知道錯誤發(fā)生的位置。這樣也就不至于強(qiáng)制重起IDE的了。 </p><p> ClassName()給了什么樣的幫助呢?它只是用于返回字符串“Exception”嗎?每一次,E都被聲明為異常類型?這是VCL另一個優(yōu)秀的地方,所有的類都從Tobject繼承,所以,這些類都能自動獲得正確的類型和基類的類型,所有的更多的信息都可以在這里找到。(請參見Tobject的幫助)所以,盡管使用了Excep
64、tion &E,其中的E.ClassName()將返回捕獲到的產(chǎn)生異常的實(shí)際類名。得到這些好處需要付出的代價是編譯出來的可執(zhí)行文件變大了一些。所有的Delphi/Cbuilder用戶都注意到了這一點(diǎn),但是說沒有付出就沒有收獲。在http://www.bytamin-c.com/的howto欄目可以看到Xiphias的一系列文章。其中,他提到了使用TStringList作記錄的方法:先將錯誤通過TStringList的Add方法加
65、入到StringList里面,然后使用SaveToFile保存到硬盤上。不過要注意在程序結(jié)束的時候不要忘記使用SaveToFile()方法把TStringList保存起來?;蛘?,也可以每次捕捉到異常之后都保存一次。 </p><p><b> 系統(tǒng)結(jié)構(gòu)</b></p><p> 主菜單模塊由數(shù)據(jù)結(jié)構(gòu)、操作、幫助、程序四個部分組成。</p><p
66、> 數(shù)據(jù)結(jié)構(gòu)模板由線性表、堆棧和隊(duì)列、樹、圖等四個部分組成。線性表又分為鏈表概念、鏈表模型、鏈表操作、雙向鏈表四個部分,堆棧和隊(duì)列分為基本堆棧、基本隊(duì)列、循環(huán)隊(duì)列三個部分,樹分為數(shù)據(jù)二叉樹、結(jié)構(gòu)二叉樹、類二叉樹,圖分為圖表示、圖搜索、最短路徑。</p><p> 操作模板由線性表說明、堆棧說明、隊(duì)列說明、樹說明、圖說明組成。</p><p> 幫助模板由關(guān)于和幫助組成。<
67、/p><p> 程序模塊由退出組成。</p><p> 系統(tǒng)的功能模塊如圖3-1所示。</p><p> 本系統(tǒng)是由我與另外一個同學(xué)合作完成的,根據(jù)系統(tǒng)的結(jié)構(gòu),我們對各自的任務(wù)做了明確的分工。</p><p> 我在本系統(tǒng)中所做的工作是:</p><p> 1、詳細(xì)分析了系統(tǒng)需求,提出了系統(tǒng)設(shè)計方案,并進(jìn)行了論證
68、;</p><p> 2、分析了RAD設(shè)計方法的利弊,并選定了設(shè)計方案。</p><p> 3、主菜單、線性表、樹、操作四部分模塊的設(shè)計。</p><p><b> 詳細(xì)設(shè)計</b></p><p><b> 主菜單</b></p><p> (1)主菜單主要由一個
69、菜單控件、一個顯示文本、三個按紐、二個可供長文本輸入/出等七個控件組成。如圖3-2所示:</p><p><b> (2)設(shè)計思想:</b></p><p> 作為一個演示系統(tǒng)的菜單,應(yīng)給人一個直觀的感覺,有個醒目的標(biāo)題,通過一個菜單控件,連接我們設(shè)計的各種數(shù)據(jù)結(jié)構(gòu)的算法演示;兩個文本輸入,用于對算法的說明,輔助使用者對算法的學(xué)習(xí);作為一個系統(tǒng),一個幫助模塊是不可
70、缺少的。主菜單的流程圖如圖3-3所示。</p><p><b> (3)控件介紹:</b></p><p> C++ Builder的組件工具箱(Component Palette)提供各種制作組件的工具,包括文字標(biāo)簽、文本框、圖象組件等。</p><p> 在本系統(tǒng)中,用到了MainMenu(建立主菜單)、PopupMemu(建立彈出式
71、菜單元件)、Label(在窗體上顯示文本信息的工具)、Edit(建立文本框的工具)、Memo(可以讓用戶輸入文字信息,功能較文字標(biāo)簽更多元化)、Button(在窗體上建立命令按紐組件,在窗體上單擊此按紐時,可以執(zhí)行對應(yīng)的程序代碼)、ListBox(在窗體建立列表框組件,提供數(shù)據(jù)選項(xiàng))、ComboBox(它可建立下拉式列表,是列表框與文本框的組合)、ScrollBar(用來建立滾動條組件)、GroupBox(在窗體上建立框架組件)、Rad
72、ioGroup(建立選擇群組組件)、Panel(存放其他組件的容器組件)、ActionList(存放執(zhí)行動作的組件);Bitbin(可有圖標(biāo)的按紐)、StingGrid(字符串)、Image(顯示圖象圖片)、Shape(基本圖形的建立)、Bevel(建立邊框面板)、TabControl(建立標(biāo)簽集)、ImageList(圖象序列)、RichEdit(多功能編輯)、StatusBar(狀態(tài)顯示)、Timer(時間時間控制)這些組件。<
73、;/p><p><b> 線性表模塊</b></p><p> (1)在菜單中,我們通過調(diào)用WinExec函數(shù),以執(zhí)行外部命令的方式,調(diào)用鏈表概念.exe程序,來完成鏈表概念的演示。源代碼如下:</p><p> NewFileName=ExtractFilePath(Application->ExeName)+"鏈表概念.e
74、xe";</p><p> i=WinExec(NewFileName.c_str(),SW_SHOWNORMAL); </p><p> 在鏈表概念的實(shí)現(xiàn)中,比較數(shù)組與鏈表的區(qū)別,兩者最明顯的差別在于存儲空間的配置上,數(shù)組是固定配置存儲空間,因此存取上受到限制,如果超過范圍則會產(chǎn)生無法預(yù)期的狀況。</p><p> 此程序是用一組地址連續(xù)的存儲單
75、位依次存儲線性表的數(shù)據(jù)元素,以此實(shí)現(xiàn)線性表的順序存儲結(jié)構(gòu),這種存儲結(jié)構(gòu)的線性表叫順序表。如圖3-4所示。</p><p> (2)在菜單中,我們通過調(diào)用WinExec函數(shù),以執(zhí)行外部命令的方式,調(diào)用鏈表模型.exe程序,來完成鏈表模型的演示。源代碼如下:</p><p> NewFileName=ExtractFilePath(Application->ExeName)+&quo
76、t;鏈表模型.exe";</p><p> i=WinExec(NewFileName.c_str(),SW_SHOWNORMAL); </p><p> 在鏈表模型的實(shí)現(xiàn)中,此程序是一個用c++類方式編寫的鏈表模型。線性表的鏈?zhǔn)酱鎯Y(jié)構(gòu)的特點(diǎn)是用一組任意的存儲單元存儲線性表的數(shù)據(jù)元素(這組存儲單元可以是連續(xù)的,也可以是不連續(xù)的)。因此,為了表示每個數(shù)據(jù)元素與其直接后繼數(shù)據(jù)
77、元素之間的邏輯關(guān)系,對數(shù)據(jù)元素來說,除了存儲其本身的信息之外,還需存儲一個指示其直接后繼的信息。</p><p> 根據(jù)以上思想,我設(shè)計該程序的運(yùn)行頁面如圖3-6所示。</p><p> (3)在菜單中,我們通過調(diào)用WinExec函數(shù),以執(zhí)行外部命令的方式,調(diào)用鏈表操作.exe程序,來完成鏈表操作的演示。源代碼如下:</p><p> NewFileName=
78、ExtractFilePath(Application->ExeName)+"鏈表操作.exe";</p><p> i=WinExec(NewFileName.c_str(),SW_SHOWNORMAL); </p><p> 在鏈表操作的實(shí)現(xiàn)中,此程序是鏈表的基本操作模型,在這種存儲結(jié)構(gòu)中,容易實(shí)現(xiàn)線性表的某些操作, 在此程序中,我們重點(diǎn)實(shí)現(xiàn)了鏈表的插入
79、和刪除。</p><p> 假設(shè)我們要在線性表的兩個數(shù)據(jù)元素a和b之間插入一個數(shù)據(jù)元素x,已知p為其鏈表存儲結(jié)構(gòu)中指向接點(diǎn)a的指針,如圖3-8(a)所示:</p><p> 為插入數(shù)據(jù)元素x,首先要生成一個數(shù)據(jù)域?yàn)閤的結(jié)點(diǎn),然后插入在單鏈表中。根據(jù)插入操作的邏輯定義,還需要修改結(jié)點(diǎn)a中的指針域,令其指向結(jié)點(diǎn)x,而結(jié)點(diǎn)x中的指針域應(yīng)指向結(jié)點(diǎn)b,從而實(shí)現(xiàn)3個元素a、b和x之間邏輯關(guān)系的變化
80、。插入后的單鏈表如圖(b)所示。假設(shè)s為指向結(jié)點(diǎn)x的指針,則上述指針修改用語句描述即為:</p><p> s->next=p->next ; p->next=s;</p><p> 反之,如圖3-9所示在線性表中刪除元素b時,為在單鏈表中實(shí)現(xiàn)元素a、b和c之間的邏輯關(guān)系的變化,僅需要修改結(jié)點(diǎn)a中的指針域即可。假設(shè)p為指向結(jié)點(diǎn)a的指針,則上述指針修改用語句描述即為:&
81、lt;/p><p> p->next=p->next->next;</p><p> 可見,在已知鏈表中元素插入或刪除的確切位置的情況下,在單鏈表中插入或刪除一個結(jié)點(diǎn)時,僅需修改指針而不需要移動元素。</p><p> 根據(jù)插入和刪除的思想,我設(shè)計出了此程序的運(yùn)行界面如圖3-10所示:</p><p> (4)在菜單中,
82、我們通過調(diào)用WinExec函數(shù),以執(zhí)行外部命令的方式,調(diào)用雙向鏈表.exe程序,來完成雙向鏈表的演示。源代碼如下:</p><p> NewFileName=ExtractFilePath(Application->ExeName)+"雙向鏈表.exe";</p><p> i=WinExec(NewFileName.c_str(),SW_SHOWNORMAL
83、); </p><p> 以上討論的鏈表存儲結(jié)構(gòu)的結(jié)點(diǎn)中只有一個指示直接后繼的指針域的指針域,因此,從某個結(jié)點(diǎn)結(jié)點(diǎn)出發(fā)只能順指針往后尋查其他結(jié)點(diǎn)。若要尋查結(jié)點(diǎn)的直接后趨,則需從表頭指針出發(fā),為了克服單鏈表這種單向性的缺點(diǎn),可利用雙向鏈表。顧名思義,在雙向鏈表的結(jié)點(diǎn)中有兩個指針域,其一指向直接后繼,另一指向直接前趨。</p><p> 和單鏈表的循環(huán)表相似,雙向鏈表也可以有循環(huán)表,如圖
84、3-12(b)所示,鏈表中存有兩個環(huán),圖3-12(a)所示為只有一個表頭結(jié)點(diǎn)的空表。在雙向鏈表中,若d為指向表中一結(jié)點(diǎn)的指針,則顯然有</p><p> d->next->prior->=d->prior->next=d</p><p> 這個表示式恰當(dāng)?shù)胤从沉诉@種結(jié)構(gòu)的特性。</p><p> 在雙向鏈表中,有些操作涉及一個方向
85、的指針,則它們的算法描述和線性鏈表的操作相同,但在插入、刪除時有很大的不同,在雙向鏈表中需同時修改兩個方向上的指針。圖3-13和圖3-14分別顯示了刪除和插入結(jié)點(diǎn)時指針修改的情況。</p><p> 根據(jù)以上思想,我設(shè)計出了本程序的運(yùn)行界面如圖3-15所示:</p><p><b> 樹模塊</b></p><p> (1)在菜單中,我們
86、通過調(diào)用WinExec函數(shù),以執(zhí)行外部命令的方式,調(diào)用數(shù)組二叉樹.exe程序,來完成數(shù)組二叉樹的演示。源代碼如下:</p><p> NewFileName=ExtractFilePath(Application->ExeName)+"數(shù)組二叉樹.exe";</p><p> i=WinExec(NewFileName.c_str(),SW_SHOWNORMA
87、L); </p><p> 在數(shù)組二叉樹的實(shí)現(xiàn)中,樹是由根莖和葉構(gòu)成,顧名思義樹狀結(jié)構(gòu)也具有這樣的組成特點(diǎn)的結(jié)構(gòu)形態(tài);然而必須注意在數(shù)據(jù)結(jié)構(gòu)中,樹的生長方向是向下的,而且決定延伸的環(huán)節(jié)是由結(jié)點(diǎn)和線段所組成的。</p><p> 電腦數(shù)據(jù)并不是真的有結(jié)構(gòu),而是我們經(jīng)過程序設(shè)計來實(shí)現(xiàn)這一程序或步驟,使原來單純而龐雜的數(shù)據(jù)能方便地存取及應(yīng)用。</p><p> 二
88、叉樹是樹的一種,應(yīng)用最多也最廣,它的子接點(diǎn)最多兩個,故稱為二叉樹,與一般的樹比較,二叉樹可為空,與子樹有順序關(guān)系且結(jié)點(diǎn)度數(shù)最大為2。</p><p> 根據(jù)以上思想,我設(shè)計了一個基本的二叉樹基本模型,顯示頁面如圖3-17所示。</p><p> (2)在菜單中,我們通過調(diào)用WinExec函數(shù),以執(zhí)行外部命令的方式,調(diào)用結(jié)構(gòu)二叉樹.exe程序,來完成結(jié)構(gòu)二叉樹的演示。源代碼如下:<
89、/p><p> NewFileName=ExtractFilePath(Application->ExeName)+"結(jié)構(gòu)二叉樹.exe";</p><p> i=WinExec(NewFileName.c_str(),SW_SHOWNORMAL); </p><p> 按照順序存儲結(jié)構(gòu)的定義,在此約定,用一組地址連續(xù)的存儲單元依次自上
90、而下、自左至右存儲完全二叉樹上的結(jié)點(diǎn)元素,即將完全二叉樹上編號為i的結(jié)點(diǎn)元素存儲在定義好的一維數(shù)組中下標(biāo)為i-1的分量中。對于一般二叉樹,則應(yīng)將其每個結(jié)點(diǎn)與完全二叉樹上的結(jié)點(diǎn)相對照,存儲在一維數(shù)組的相應(yīng)分量中,如圖3-19所示,二叉樹的順序存儲結(jié)構(gòu)如圖3-20所示,圖中以“0”表示不存在此結(jié)點(diǎn)。</p><p> 根據(jù)以上思想,我設(shè)計的結(jié)構(gòu)二叉樹是順序存儲結(jié)構(gòu)的一種表現(xiàn),該程序的運(yùn)行界面如圖3-21所示。<
91、;/p><p> (3)在菜單中,我們通過調(diào)用WinExec函數(shù),以執(zhí)行外部命令的方式,調(diào)用類別二叉樹.exe程序,來完成類別二叉樹的演示。源代碼如下:</p><p> NewFileName=ExtractFilePath(Application->ExeName)+"類別二叉樹.exe";</p><p> i=WinExec(Ne
92、wFileName.c_str(),SW_SHOWNORMAL); </p><p> 在二叉樹的一些應(yīng)用中,常常要求在樹中查找具有某種特性的結(jié)點(diǎn),或者對樹中全部結(jié)點(diǎn)逐一進(jìn)行某種處理。這就提出了了一個遍歷二叉樹的問題,如果按某條搜索路徑巡訪樹中每個結(jié)點(diǎn),使得每個結(jié)點(diǎn)均被訪問一次,而且僅被訪問一次。“訪問”的含義很廣,可以是對結(jié)點(diǎn)做各種處理,如輸出結(jié)點(diǎn)的信息等。遍歷對線性結(jié)點(diǎn)來說,是容易解決的,而對二叉樹則不然
93、,由于二叉樹是一種非線性結(jié)構(gòu),每個結(jié)點(diǎn)都可能有兩課子樹,因而需要尋找一種規(guī)律,以便使二叉樹上的結(jié)點(diǎn)能排列在一個線性隊(duì)列上,從而便于遍歷。</p><p> 二叉樹的遞歸定義可知,二叉樹是由3個基本單元組成:根結(jié)點(diǎn)、左子樹、右子樹。因此,若能依次遍歷這三部分,便是遍歷了整個二叉樹。假如以L、D、R分別表示遍歷左子樹、訪問根結(jié)點(diǎn)和遍歷右子樹,則可以DLR、LDR、LRD、DRL、RDL、RLD這六種遍歷二叉樹的方案
94、。若限定先左后右,則只有前三種情況,分別稱之先序遍歷、中序遍歷和后序遍歷。</p><p> 遍歷二叉樹的遞歸算法定義:先序遍歷二叉樹的操作定義,若二叉樹為空,則空操作,否則訪問根結(jié)點(diǎn),先序遍歷左子樹,先序遍歷右子樹;中序遍歷二叉樹的操作定義,若二叉樹為空,則空操作,否則中序遍歷左子樹,訪問根結(jié)點(diǎn),中序遍歷右子樹;后序遍歷二叉樹的操作定義,若二叉樹為空,則空操作,否則后序遍歷左子樹,后序遍歷右子樹,訪問根結(jié)點(diǎn)。
95、</p><p> 根據(jù)以上思想,我設(shè)計了一個查找結(jié)點(diǎn)的類別二叉樹,運(yùn)行界面如圖3-23所示。</p><p> 3.3.4操作模塊的設(shè)計</p><p> 本部分主要由兩個文本輸入/輸出和3個按紐組成,如圖3-2所示。主要顯示各種算法的說明,輔助大家更好地學(xué)習(xí)。</p><p><b> 代碼顯示:</b>&l
96、t;/p><p> //---------------------------------------------------------------------------</p><p> void __fastcall TForm1::N10Click(TObject *Sender)</p><p><b> {</b></p&
97、gt;<p> Memo1->Lines->LoadFromFile("1.txt");</p><p><b> }</b></p><p> //---------------------------------------------------------------------------</p>
98、;<p> void __fastcall TForm1::N11Click(TObject *Sender)</p><p><b> {</b></p><p> Memo1->Lines->LoadFromFile("2.txt");</p><p><b> }</b
99、></p><p> //---------------------------------------------------------------------------</p><p> void __fastcall TForm1::N12Click(TObject *Sender)</p><p><b> {</b>&
100、lt;/p><p> Memo1->Lines->LoadFromFile("5.txt"); </p><p><b> }</b></p><p> //----------------------------------------------------------------------
101、-----</p><p> void __fastcall TForm1::N13Click(TObject *Sender)</p><p><b> {</b></p><p> Memo1->Lines->LoadFromFile("3.txt"); </p><p
102、><b> }</b></p><p> //---------------------------------------------------------------------------</p><p> void __fastcall TForm1::N14Click(TObject *Sender)</p><p>&
103、lt;b> {</b></p><p> Memo1->Lines->LoadFromFile("4.txt");</p><p><b> }</b></p><p> //--------------------------------------------------------
104、-------------------</p><p> void __fastcall TForm1::Button2Click(TObject *Sender)</p><p><b> {</b></p><p> Memo1->Lines->Text="";</p><p>
105、 Memo1->SetFocus();</p><p> Memo2->Lines->Text="";</p><p> Memo2->SetFocus();</p><p><b> }</b></p><p> //------------------------
106、---------------------------------------------------</p><p> void __fastcall TForm1::Button1Click(TObject *Sender)</p><p><b> {</b></p><p> Memo1->Lines->SaveToF
107、ile("6.txt");</p><p><b> }</b></p><p> //---------------------------------------------------------------------------</p><p> void __fastcall TForm1::Button3
108、Click(TObject *Sender)</p><p><b> {</b></p><p> Memo2->Lines->LoadFromFile("6.txt");</p><p><b> }</b></p><p> //------------
109、--------------------------------------------------------------- </p><p><b> 系統(tǒng)操作</b></p><p><b> 主菜單操作</b></p><p> 主菜單運(yùn)行如圖3-2所示。</p><p>
110、 菜單選擇,清空文本輸入,開始數(shù)據(jù)結(jié)構(gòu)的算法學(xué)習(xí)。</p><p><b> 線性表操作</b></p><p> 線性表運(yùn)行如圖3-4、3-6、3-10、3-15所示。</p><p><b> 4.2.1鏈表概念</b></p><p> 左邊的數(shù)字是用數(shù)組列出來的;左邊的數(shù)字,則是把輸
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 畢業(yè)設(shè)計---數(shù)據(jù)結(jié)構(gòu)算法演示系統(tǒng)
- c++ 數(shù)據(jù)結(jié)構(gòu)、算法筆試題
- 數(shù)據(jù)結(jié)構(gòu)算法演示系統(tǒng)
- 畢業(yè)論文---數(shù)據(jù)結(jié)構(gòu)算法演示系統(tǒng)
- 畢業(yè)論文---數(shù)據(jù)結(jié)構(gòu)算法演示系統(tǒng)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計---數(shù)據(jù)結(jié)構(gòu)相關(guān)算法的演示系統(tǒng)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計--- 數(shù)據(jù)結(jié)構(gòu)各章算法的演示系統(tǒng)
- 數(shù)據(jù)結(jié)構(gòu)算法設(shè)計和演示
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計--排序算法演示系統(tǒng)
- 數(shù)據(jù)結(jié)構(gòu) --隊(duì)列 --- c++實(shí)現(xiàn)
- 數(shù)據(jù)結(jié)構(gòu)c++版試題
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計——公交換乘系統(tǒng)(c++)
- 數(shù)據(jù)結(jié)構(gòu)與算法課程設(shè)計報告——航班信息查詢系統(tǒng)(c++)
- 大數(shù)據(jù)結(jié)構(gòu)課程設(shè)計排序算法演示系統(tǒng)
- c語言數(shù)據(jù)結(jié)構(gòu)畢業(yè)設(shè)計外文翻譯
- 數(shù)據(jù)結(jié)構(gòu)與算法課程設(shè)計報告-北京地鐵查詢系統(tǒng)c++版
- 大數(shù)據(jù)結(jié)構(gòu)課程設(shè)計排序算法演示系統(tǒng)58165
- 數(shù)據(jù)結(jié)構(gòu)算法與應(yīng)用-c++語言描述(清晰版)
- 數(shù)據(jù)結(jié)構(gòu)----集合運(yùn)算課程設(shè)計報告(c++)
- c++與數(shù)據(jù)結(jié)構(gòu)實(shí)驗(yàn)指導(dǎo)教程
評論
0/150
提交評論