C++數(shù)據(jù)結(jié)構(gòu)算法演示系統(tǒng)_第1頁(yè)
C++數(shù)據(jù)結(jié)構(gòu)算法演示系統(tǒng)_第2頁(yè)
C++數(shù)據(jù)結(jié)構(gòu)算法演示系統(tǒng)_第3頁(yè)
C++數(shù)據(jù)結(jié)構(gòu)算法演示系統(tǒng)_第4頁(yè)
C++數(shù)據(jù)結(jié)構(gòu)算法演示系統(tǒng)_第5頁(yè)
已閱讀5頁(yè),還剩48頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、 摘要數(shù)據(jù)結(jié)構(gòu)算法演示系統(tǒng)數(shù)據(jù)結(jié)構(gòu)在計(jì)算機(jī)科學(xué)中是一門(mén)綜合性的專業(yè)基礎(chǔ)課,它不僅設(shè)計(jì)到計(jì)算機(jī)硬件(特別是編碼理論、存儲(chǔ)裝置和存取方法等)的研究范圍,而且和計(jì)算機(jī)軟件的研究有著更密切的關(guān)系,無(wú)論是編譯程序還是操作系統(tǒng),都涉及到數(shù)據(jù)元素在存儲(chǔ)器中的分配問(wèn)題。在研究信息檢索時(shí)也必須考慮如何組織數(shù)據(jù),以便查找和存取數(shù)據(jù)元素更方便。因此,它是介于數(shù)學(xué)、計(jì)算機(jī)硬件和計(jì)算機(jī)軟件三者之間的一門(mén)核心課程。在計(jì)算機(jī)科學(xué)中,數(shù)據(jù)結(jié)構(gòu)不僅是一般程序設(shè)計(jì)的基礎(chǔ),而且是設(shè)計(jì)和實(shí)現(xiàn)編譯程序、操作系統(tǒng)、數(shù)據(jù)庫(kù)系統(tǒng)及其他系統(tǒng)程序和大型應(yīng)用程序的重要基礎(chǔ)。本文充分利用C+ BUILDER的RAD優(yōu)點(diǎn),設(shè)計(jì)并建立了一套數(shù)據(jù)結(jié)構(gòu)算法

2、的演示系統(tǒng)。講解了線性表、堆棧和隊(duì)列、樹(shù)、圖等數(shù)據(jù)結(jié)構(gòu)的概念,該系統(tǒng)具有操作便捷、形象生動(dòng)等特點(diǎn),對(duì)于深化對(duì)數(shù)據(jù)結(jié)構(gòu)算法的理解,提高計(jì)算機(jī)程序設(shè)計(jì)水平具有很好的促進(jìn)作用,而且具有一定的實(shí)用價(jià)值,能有效地改善數(shù)據(jù)結(jié)構(gòu)算法教學(xué)的質(zhì)量和效率,對(duì)于其他類似系統(tǒng)也有很大的借鑒意義。關(guān)鍵字:數(shù)據(jù)結(jié)構(gòu);算法;C+ BUILDERAbstractData structure algorithms demonstration systemData structures,is a comprehensive professional foundation courses in computer science,

3、not only to studied computer hardware design (especially coding theory, storage devices and visit methods), and researched computer software in closer relationship, whether translation or operating system, data elements are involved in the allocation of memory. In information retrieval research, dat

4、a must also consider how to organize in order to identify the data elements and visit more convenient. Therefore, it is a door core curriculum between mathematics, computer hardware and computer software. In computer science, data structure is not only the basis for general programming, but also the

5、 design and realization of heavy editing procedures, operating systems, database systems and other systems procedures and the essential foundation for large-scale applications.The full use of the RAD advantage C+ builder design and build a data structure algorithms demonstration system. On the linea

6、r tables, Duizhan and Britain, trees, maps, and other data structure concept, the system has operated convenient, vivid image characteristics of the data structure to deepen the understanding of algorithms to improve the level of computer programming in good catalyst, but with some practical value t

7、o effectively improve data structure algorithms teaching quality and efficiency For other similar systems.Key words: Data structure;Algorithms;C+ builder目 錄 TOC o 1-2 h z HYPERLINK l _Toc137965369 1 緒論 PAGEREF _Toc137965369 h 1 HYPERLINK l _Toc137965370 2 需求分析 PAGEREF _Toc137965370 h 2 HYPERLINK l _

8、Toc137965371 解決問(wèn)題 PAGEREF _Toc137965371 h 2 HYPERLINK l _Toc137965372 具備功能 PAGEREF _Toc137965372 h 2 HYPERLINK l _Toc137965373 3 系統(tǒng)設(shè)計(jì) PAGEREF _Toc137965373 h 3 HYPERLINK l _Toc137965374 開(kāi)發(fā)及使用環(huán)境 PAGEREF _Toc137965374 h 3 HYPERLINK l _Toc137965375 系統(tǒng)結(jié)構(gòu) PAGEREF _Toc137965375 h 10 HYPERLINK l _Toc137965

9、376 詳細(xì)設(shè)計(jì) PAGEREF _Toc137965376 h 12 HYPERLINK l _Toc137965377 4 系統(tǒng)操作 PAGEREF _Toc137965377 h 28 HYPERLINK l _Toc137965378 主菜單操作 PAGEREF _Toc137965378 h 28 HYPERLINK l _Toc137965379 線性表操作 PAGEREF _Toc137965379 h 28 HYPERLINK l _Toc137965380 樹(shù)操作 PAGEREF _Toc137965380 h 29 HYPERLINK l _Toc137965381 算法說(shuō)

10、明操作 PAGEREF _Toc137965381 h 29 HYPERLINK l _Toc137965382 結(jié)束語(yǔ) PAGEREF _Toc137965382 h 30 HYPERLINK l _Toc137965383 謝 辭 PAGEREF _Toc137965383 h 31 HYPERLINK l _Toc137965384 參考文獻(xiàn) PAGEREF _Toc137965384 h 32 HYPERLINK l _Toc137965385 附錄 PAGEREF _Toc137965385 h 33 HYPERLINK l _Toc137965386 附錄A 外文翻譯原文部分 PA

11、GEREF _Toc137965386 h 33 HYPERLINK l _Toc137965387 附錄B 外文翻譯譯文部分 PAGEREF _Toc137965387 h 39 HYPERLINK l _Toc137965388 附錄C 源代碼 PAGEREF _Toc137965388 h 45 緒論數(shù)據(jù)結(jié)構(gòu)是在整個(gè)計(jì)算機(jī)科學(xué)與技術(shù)領(lǐng)域上廣泛被使用的術(shù)語(yǔ)。它用來(lái)反映一個(gè)數(shù)據(jù)的內(nèi)部構(gòu)成,即一個(gè)數(shù)據(jù)由那些成分?jǐn)?shù)據(jù)構(gòu)成,以什么方式構(gòu)成,呈什么結(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ì)算機(jī)內(nèi)部的存儲(chǔ)安排。

12、數(shù)據(jù)結(jié)構(gòu)是數(shù)據(jù)存在的形式。 數(shù)據(jù)結(jié)構(gòu)是信息的一種組織方式,其目的是為了提高算法的效率,它通常與一組算法的集合相對(duì)應(yīng),通過(guò)這組算法集合可以對(duì)數(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)系,討論它們?cè)谟?jì)算機(jī)中的存儲(chǔ)表示,并結(jié)合各種數(shù)據(jù)結(jié)構(gòu),討論對(duì)它們實(shí)行的各種運(yùn)算的實(shí)現(xiàn)算法。很多算法實(shí)際上是對(duì)某種數(shù)據(jù)結(jié)構(gòu)施行的一種變換,研究算法也就是研究在實(shí)施變換過(guò)程中數(shù)據(jù)結(jié)構(gòu)的動(dòng)態(tài)性質(zhì)。數(shù)據(jù)結(jié)構(gòu),作為計(jì)算機(jī)學(xué)科的基礎(chǔ)性專業(yè)課程,其在計(jì)算機(jī)科學(xué)中的及其重要,課程學(xué)習(xí)的好壞,直接關(guān)系到學(xué)員后期計(jì)算機(jī)水平的高低。而這門(mén)課程一直因?yàn)檫^(guò)于抽象,難以理解,而讓人望而

13、止步。如果能夠把這門(mén)抽象的課程變得具體而生動(dòng),必將提高學(xué)習(xí)人員興趣,增加其積極性和主動(dòng)性,也有利于人員的對(duì)此課程的學(xué)習(xí)?;谶@些目的,我們開(kāi)發(fā)了這個(gè)數(shù)據(jù)結(jié)構(gòu)算法演示系統(tǒng),數(shù)據(jù)結(jié)構(gòu)是我們所做的系統(tǒng)的主要理論基礎(chǔ),我們完成了線性表、堆棧、隊(duì)列、樹(shù)、圖幾個(gè)主要結(jié)構(gòu),在學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)這門(mén)課程的時(shí)候,我們了解了這些結(jié)構(gòu)的算法,當(dāng)時(shí)也做過(guò)一些相關(guān)的程序,在此基礎(chǔ)之上,我運(yùn)用c+ builder開(kāi)發(fā)工具,把這些算法演示出來(lái)。數(shù)據(jù)結(jié)構(gòu)算法演示系統(tǒng)可以演示線性表、堆棧、隊(duì)列、樹(shù)、圖等幾個(gè)基礎(chǔ)結(jié)構(gòu)的算法,輔助一些算法說(shuō)明,讓使用者更好地掌握算法,在幫助中把演示的具體過(guò)程和操作做詳細(xì)的介紹。 該系統(tǒng)具有操作簡(jiǎn)單、形象

14、生動(dòng),能很好地改善人員對(duì)數(shù)據(jù)結(jié)構(gòu)課程的學(xué)習(xí)理解,從很大程度上提高人員的學(xué)習(xí)質(zhì)量和效率。需求分析解決問(wèn)題做為一個(gè)數(shù)據(jù)結(jié)構(gòu)演示系統(tǒng),首先我們確定要演示的內(nèi)容,在本系統(tǒng)中,我們對(duì)線性表、堆棧和隊(duì)列、樹(shù)、圖幾個(gè)主要數(shù)據(jù)結(jié)構(gòu)做了講解;接著,對(duì)四種算法的說(shuō)明也是必不可少的,這樣配合演示,可以達(dá)到更好地效果;最后,作為我們?cè)O(shè)計(jì)的演示過(guò)程,使用者對(duì)操作不是太了解,我們有必要做個(gè)詳細(xì)的操作過(guò)程,讓使用者更好地操作系統(tǒng)。具備功能系統(tǒng)由數(shù)據(jù)結(jié)構(gòu)、操作、幫助、程序四個(gè)部分組成?,F(xiàn)分述如下:數(shù)據(jù)結(jié)構(gòu)由線性表、堆棧和隊(duì)列、樹(shù)、圖等四個(gè)部分組成,分別對(duì)應(yīng)數(shù)據(jù)結(jié)構(gòu)的四個(gè)部分。線性表又分為鏈表概念、鏈表模型、鏈表操作、雙向鏈表

15、四個(gè)部分,堆棧和隊(duì)列分為基本堆棧、基本隊(duì)列、循環(huán)隊(duì)列三個(gè)部分,樹(shù)分為數(shù)據(jù)二叉樹(shù)、結(jié)構(gòu)二叉樹(shù)、類二叉樹(shù),圖分為圖表示、圖搜索、最短路徑。操作由線性表說(shuō)明、堆棧說(shuō)明、隊(duì)列說(shuō)明、樹(shù)說(shuō)明、圖說(shuō)明組成,對(duì)各數(shù)據(jù)結(jié)構(gòu)的算法說(shuō)明。幫助由關(guān)于和幫助組成,是本系統(tǒng)的一些說(shuō)明和對(duì)演示過(guò)程的操作詳細(xì)說(shuō)明。程序部分由退出組成,完成系統(tǒng)的終止。系統(tǒng)設(shè)計(jì)開(kāi)發(fā)及使用環(huán)境 C+ BUILDERC+ BUILDER介紹提起B(yǎng)orland C/C+,相信業(yè)界的許多朋友都會(huì)感慨萬(wàn)千,因?yàn)樗鴰ьI(lǐng)很多人跨進(jìn)了Windows開(kāi)發(fā)的大門(mén)。和美國(guó)Inprise公司(原Borland公司)其他面向企業(yè)分布式系統(tǒng)的開(kāi)發(fā)工具(如Delphi 、

16、Jbuilder )相比,新近推出的最新版本C+ RAD(快速應(yīng)用開(kāi)發(fā))工具Borland C+ Builder 4,無(wú)論是在開(kāi)發(fā)環(huán)境、分布式應(yīng)用系統(tǒng)開(kāi)發(fā)、支持已有C+資源方面,還是在快速開(kāi)發(fā)Web及Internet應(yīng)用程序、數(shù)據(jù)庫(kù)處理等方面,都表現(xiàn)出了其獨(dú)特的一面。(1)全新的集成開(kāi)發(fā)環(huán)境C+ Builder保留了使用Framework(如:OWL、MFC)的開(kāi)發(fā)方式,融合了Visual Basic、Delphi等開(kāi)發(fā)工具的面向組件的開(kāi)發(fā)方式。C+ Builder的集成開(kāi)發(fā)環(huán)境提供了120多個(gè)VCL組件,使開(kāi)發(fā)人員不需太多編碼,就能夠?qū)崿F(xiàn)很多復(fù)雜的功能,體現(xiàn)了軟件的“重用性”原則。C+ Bu

17、ilder的用戶界面也非常友好,易于使用,并且采用了停駐式(docking)工具條,可以自由組合集成開(kāi)發(fā)環(huán)境窗口和工具條的排放方式。在編碼過(guò)程中,還可以使用CodeExplorer技術(shù)對(duì)源代碼進(jìn)行管理。CodeCompletion技術(shù)使編譯器能夠自動(dòng)列出VCL組件的可用屬性和方法供程序員選擇,而不必手工輸入冗長(zhǎng)的代碼。C+ Builder的集成開(kāi)發(fā)環(huán)境如圖1所示。(2)簡(jiǎn)化了分布式應(yīng)用系統(tǒng)的開(kāi)發(fā)企業(yè)向多層分布式系統(tǒng)跨越已經(jīng)成為了一種必然趨勢(shì),目前分布式運(yùn)算標(biāo)準(zhǔn)主要有Microsoft 的DCOM和OMG的CORBA,是否支持這兩種標(biāo)準(zhǔn)決定了開(kāi)發(fā)工具的適用領(lǐng)域和范圍。C+ Builder可以說(shuō)是

18、目前唯一同時(shí)支持CORBA和COM的C+集成開(kāi)發(fā)環(huán)境,因此既適用于基于ORB的分布式開(kāi)發(fā),又適用于基于COM的Windows開(kāi)發(fā)。C+ Builder內(nèi)置了VisiBroker3。3,它是目前全球分發(fā)數(shù)量最多的CORBA ORB,并且包含了Event Service和NamingService等標(biāo)準(zhǔn)CORBA服務(wù),從而為開(kāi)發(fā)CORBA應(yīng)用提供了可能。C+ Builder 將CORBA IDL 編譯器集成在其開(kāi)發(fā)環(huán)境中,通過(guò)配合各種向?qū)?Wizard),可以快速生成CORBA Client和Server的源程序代碼框架,這對(duì)于開(kāi)發(fā)CORBA產(chǎn)品的朋友來(lái)說(shuō),確實(shí)是非常方便的。圖2顯示了C+ Bui

19、lder中建立CORBA對(duì)象的各種向?qū)АT贛icrosoft COM方面,C+ Builder 同樣提供了各種向?qū)В梢砸徊缴蒀OM標(biāo)準(zhǔn)組件、OLE Automation組件及ActiveX組件,您可以在Windows環(huán)境下大顯身手。 C+ Builder 提供的MIDAS2同時(shí)支持CORBAIIOP、DCOM、DCE RPC以及TCP/IP等多種連接方式,適用于分布式系統(tǒng)的開(kāi)發(fā)。比如,非Windows環(huán)境上的Java應(yīng)用程序,可以通過(guò)CORBA IIOP使用C+ Builder開(kāi)發(fā)出來(lái)的應(yīng)用程序服務(wù)器。從而使用戶可以在原有系統(tǒng)基礎(chǔ)之上構(gòu)建跨平臺(tái)、跨程序語(yǔ)言的分布式應(yīng)用系統(tǒng)。(3)對(duì)已有C+

20、資源的支持用戶可能會(huì)關(guān)心,對(duì)于過(guò)去開(kāi)發(fā)的基于Borland C+ OWL和Microsoft MFC的程序,C+ Builder是否能夠兼容?回答是肯定的。C+ Builder的另一特性就是提供了MFC4。2版的函數(shù)庫(kù),強(qiáng)化了對(duì)Microsoft Visual C+源代碼的兼容性,可以直接編譯MSDN與各種SDK中的范例程序。通過(guò)MFC向?qū)?,還可以生成MFC的代碼框架。除此之外,C+ Builder能夠編譯原有的BorlandC+ OWL程序碼,因此就不必?fù)?dān)心以前的工作白做了!C+ Builder中提供了符合ANSI/ISO標(biāo)準(zhǔn)的C+編輯器,還能夠開(kāi)發(fā)可移植于非Windows平臺(tái)的C+程序。(

21、4)快速開(kāi)發(fā)Web及Internet應(yīng)用程序目前,基于Internet的開(kāi)發(fā)已經(jīng)成為一種時(shí)尚。C+ Builder在開(kāi)發(fā)Web及Internet應(yīng)用方面的功能也非常強(qiáng)大。C+ Builder提供了21個(gè)Internet通信協(xié)議組件,用于Internet應(yīng)用程序的開(kāi)發(fā)。開(kāi)發(fā)人員可以建立“零配置”、基于Web瀏覽器的“瘦客戶”應(yīng)用程序。C+ Builder同時(shí)支持CGI、WINCGI、ISAPI及NSAPI等標(biāo)準(zhǔn),使開(kāi)發(fā)人員利用現(xiàn)有的開(kāi)發(fā)技術(shù)就可以用可視化的方式開(kāi)發(fā)跨平臺(tái)的Web應(yīng)用程序。運(yùn)用ActiveForm/ATL及WebDeploy技術(shù),還可以實(shí)現(xiàn)ActiveX組件的Web分發(fā)。(5)強(qiáng)大

22、的數(shù)據(jù)庫(kù)處理功能C+ Builder提供了對(duì)Oracle8、Microsoft SQLServer 7、Informix 9、Sybase、IBM DB 2 UniversalServer、InterBase 5。5等大型數(shù)據(jù)庫(kù)的高速驅(qū)動(dòng)程序,并支持Oracle8的對(duì)象關(guān)聯(lián)延伸功能(如圖3所示),如Abstract Data Type、Nested Tables、Variable LengthArrays、Object Pointers(REFs)及External FileReference等。同時(shí)C+ Builder還保留了對(duì)MicrosoftAccess 97、FoxPro、Visual

23、 dBASE及Paradox等本地?cái)?shù)據(jù)庫(kù)的處理能力。因此,無(wú)論是大型的數(shù)據(jù)庫(kù)應(yīng)用系統(tǒng)開(kāi)發(fā),還是小型的數(shù)據(jù)庫(kù)管理系統(tǒng),C+ Builder都有其用武之地。C+ Builder還提供了MTS 組件向?qū)В糜诳焖偕芍С諱icrosoft Transaction Server的COM組件。BDEResource Dispenser使用戶可以在MTS中使用BDE存取數(shù)據(jù)庫(kù),保證了MTS對(duì)數(shù)據(jù)庫(kù)的兩階段提交(Two PhaseCommit)及資源管理的能力。(6)強(qiáng)大的調(diào)試功能C+ Builder強(qiáng)化了原有的Module View、EventLog View及Inspect Local Variable

24、等調(diào)試窗口的功能,并在Windows NT環(huán)境中提供多線程調(diào)試的新功能,使用戶可以在某一特定過(guò)程中跟蹤程序代碼。C+ Builder針對(duì)多層分布式開(kāi)發(fā)環(huán)境提供了遠(yuǎn)程調(diào)試能力,開(kāi)發(fā)人員可以通過(guò)網(wǎng)絡(luò)直接對(duì)遠(yuǎn)端的應(yīng)用程序服務(wù)器進(jìn)行調(diào)試,從而簡(jiǎn)化了多層應(yīng)用系統(tǒng)的開(kāi)發(fā)和維護(hù)工作。(7)其他特點(diǎn)C+ Builder還有很多新增的功能,如:針對(duì)Windows 98提供了PageScroller、MonthCalendar等Windows 98格式的新組件,并支持Windows98的多重屏幕顯示功能及Microsoft Office97格式的選擇選單和停駐式(docking)工具條。對(duì)界面的處理上,可以控制窗

25、口的最大/最小尺寸以及窗口尺寸變動(dòng)時(shí)其中組件的相對(duì)位置和比例,等等??傊?,C+ Builder 的強(qiáng)大功能并不是通過(guò)筆者有限的介紹所能夠涵蓋的,在C+海洋里遨游的朋友不妨親自嘗試一下C+ Builder,體驗(yàn)一下它的靈活與強(qiáng)大,相信您定會(huì)“戀戀不舍”的。C+ BUILDER與Visual C+對(duì)比首先,從它們的應(yīng)用程序框架(Application Frame,有時(shí)也稱為對(duì)象框架)進(jìn)行比較。Visual C+采用的框架是MFC。MFC不僅僅是人們通常理解的一個(gè)類庫(kù)。(同樣,Del phi和C+Builder使用的VCL的概念也不僅僅是一個(gè)控件庫(kù)。)你如果選擇了MFC,也就選擇了一種程序結(jié)構(gòu),一種

26、編程風(fēng)格。MFC早在Windows 3.x的時(shí)代就出現(xiàn)了,那時(shí)的Visual C+還是16位的。經(jīng)過(guò)這些年的不斷補(bǔ)充和完善,MFC已經(jīng)十分成熟。但由于原型出現(xiàn)得比較早,MFC相比于VCL落后了一個(gè)時(shí)代。盡管微軟對(duì)MFC的更新沒(méi)有停止,我也經(jīng)常讀到持只要Windows不過(guò)時(shí),MFC就不會(huì)過(guò)時(shí)之類觀點(diǎn)的文章,但就象Inprise(原Borland)的OWL框架的淡出一樣,MFC的淡出也是早晚的事。如果MFC青春永駐,微軟的開(kāi)發(fā)人員也不會(huì)私自開(kāi)發(fā)出基于ATL的WTL呀。當(dāng)然,WTL的地位不能和MFC比,它并不是微軟官方支持的框架,封裝的功能也相當(dāng)有限。但至少也反襯出了MFC存在的不足。 我以為,最能

27、體現(xiàn)一個(gè)應(yīng)用程序框架的先進(jìn)性的是它的委托模型,即對(duì)Windows消息的封裝機(jī)制。(對(duì)Windows API的封裝就不用說(shuō)了吧。大同小異,也沒(méi)什么技術(shù)含量。 如果高興,你也可以自己寫(xiě)一個(gè)類庫(kù)來(lái)封裝。但對(duì)Windows消息驅(qū)動(dòng)機(jī)制的封裝就不是那么容易的了。)最自然的封裝方式是采用虛成員函數(shù)。如果要響應(yīng)某個(gè)消息就重載相應(yīng)的虛函數(shù)。但出乎我的意料,MFC采用的是古老的宏定義方法。用宏定義方法的好處是省去了虛函數(shù)VTable的系統(tǒng)開(kāi)銷。(由于Windows的消息種類很多,開(kāi)銷不算太小。)不過(guò)帶來(lái)的缺點(diǎn)就是映射不太直觀。好在較新版本VC帶的ClassWizard可以自動(dòng)生成消息映射代碼,使用起來(lái)還是比較方

28、便的。但和VCL的委托模型相比,MFC的映射方法就顯得太落后了。而C+Builder對(duì)C+語(yǔ)言進(jìn)行了擴(kuò)展,以便引入組件、事件處理、屬性等新特性。由于功夫做在編譯器級(jí),生成的源代碼就顯得十分簡(jiǎn)潔。但是由于擴(kuò)展的非標(biāo)準(zhǔn)特性,使用VCL的C+Builder的源代碼無(wú)法被其它編譯器編譯。而MFC的功夫做在源代碼級(jí),雖然消息映射代碼較為復(fù)雜且不直觀,但兼容性非常好。只要你有MFC庫(kù)的源代碼(隨VC企業(yè)版的光盤(pán)提供),你的MFC程序理論上用任何符合ANSI標(biāo)準(zhǔn)的編譯器均可編譯通過(guò)。C+Builder 3以上版本可以原封不動(dòng)直接編譯Visual C+程序,很多人認(rèn)為這是C+Builder的兼容性好,實(shí)際上很

29、大程度應(yīng)歸功于MFC的兼容性好。微軟辛辛苦苦用標(biāo)準(zhǔn)方法寫(xiě)MFC,卻為對(duì)手制造了方便。不知他們作何感想?而因?yàn)镃+Builder對(duì)語(yǔ)言作了擴(kuò)展,VC不能編譯C+Builder的程序??磥?lái)在這方面VC要輸給C+Builder了。而且VCL所支持的組件、屬性等都是MFC所缺乏的特性。雖然VC也能支持組件,但要通過(guò)AppWizard先生成一個(gè)包裹類(wrapper),不如VCL來(lái)得簡(jiǎn)潔。有很多人使用C+Builder就是沖著控件板上那一大堆組件來(lái)的,VC雖然能使用的組件也很多(也許不比C+Builder少),但由于不方便而對(duì)RAD程序員沒(méi)有吸引力。 C+Builder的VCL比Visual C+的MF

30、C先進(jìn)的另一個(gè)特性是異常處理。但令人啼笑皆非的是,它的異常處理代碼有bug,有時(shí)會(huì)無(wú)端拋出異常。不知道在最新的版本中有沒(méi)有改正了。而VC的框架MFC也不是一無(wú)是處。經(jīng)歷了那么多年的發(fā)展和完善,MFC功能非常全面,而且十分穩(wěn)定,bug很少。其中你可能遇到的bug更少。而且有第三方的專門(mén)工具幫助你避開(kāi)這些bug。如此規(guī)模的一個(gè)類庫(kù),能做到這一點(diǎn)不容易。不要小看了這一點(diǎn),很多專業(yè)程序員就是為這個(gè)選擇VC的。而C+Builder的VCL的bug就相對(duì)較多了,而且有些它自己帶的示例程序都有錯(cuò)誤。看來(lái)Inprise還有很長(zhǎng)的路要走。 再?gòu)乃鼈兊囊子眯员容^。VC有ClassWizard、SourceBrow

31、ser等一系列工具,還附帶Visual SourceSafe、Visual Modeler等強(qiáng)大的工具,易用性非常好。(VC自帶建模工具Visual Modeler,也許說(shuō)明了它才是工程級(jí)的開(kāi)發(fā)平臺(tái),與C+Builder的定位不同。)它所帶的MSDN這部開(kāi)發(fā)者的百科全書(shū)更是讓你沒(méi)有找不到的,只有想不到的。而且它的AutoComplete之類小功能也比C+Builder要體貼。C+Builder的新版本雖然也提供了這一功能,但它的提示要等好幾秒才出來(lái),有時(shí)你不經(jīng)意間把鼠標(biāo)停在某一處,也要等硬盤(pán)響好幾秒,這可是在566Mhz的賽揚(yáng)II上呀。不要笑我瑣碎,有時(shí)一個(gè)開(kāi)發(fā)工具的成熟和易用,就是從這些小地

32、方體現(xiàn)出來(lái)的。C+Builder作為RAD工具,理應(yīng)強(qiáng)調(diào)易用性。但與VC相比還顯出不成熟。這是不應(yīng)該的。 再來(lái)看看它們的可移植性。Inprise正在開(kāi)發(fā)C+Builder和Delphi的Linux版本, 代號(hào)為Kylix。也許通過(guò)Kylix,用VCL構(gòu)架編寫(xiě)的Windows程序向Linux移植成為可能。但這只是可能。因?yàn)樵谀壳癐nprise的兼容性工作做得并不好。C+Builder可以編譯VC程序還要多謝微軟使用標(biāo)準(zhǔn)方法寫(xiě)MFC,而它自己各個(gè)版本之間兼容性卻不太好。低版本的C+Builder不能使用高版本的VCL組件(這還別去說(shuō)它),而高版本的C+Builder竟然不能使用低版本的VCL組件。

33、真是豈有此理,我很少看見(jiàn)軟件有不向下兼容的。如果Windows 98不能運(yùn)行95的程序,Windows 95不能運(yùn)行3.x的程序,Win 3.x不能運(yùn)行DOS程序,你 還會(huì)用Windows嗎?如果不是C+Builder的其它某些方面太出色,光是這個(gè)向下不兼容就足以讓我拋棄它。而且雖說(shuō)通過(guò)捆綁編譯器,C+Builder可以編譯Delphi的Object Pascal代碼,但C+Builder仍不能使用為Delphi開(kāi)發(fā)的VCL組件。所以一個(gè)組件有for D1/D 2/D3/D4/D5/C1/C3/C4/C5這些不同版本是常有的事,而且隨著C+Builder版本的升級(jí)可 能還會(huì)增加。希望Inpri

34、se能先解決同門(mén)兄弟的兼容性問(wèn)題。而微軟的VC就沒(méi)有這類問(wèn)題 MFC1.0的程序也可以毫無(wú)障礙地在VC6.0下編譯通過(guò)。 再來(lái)看看它們的前景吧。實(shí)際上,技術(shù)的進(jìn)步在很多時(shí)候是此消彼長(zhǎng)的。當(dāng)初Borland的Turbo C和Borland C+幾乎是唯一的選擇。微軟的Quick C(現(xiàn)在還有人知道這個(gè)產(chǎn)品嗎?)和Microsoft C/C+從來(lái)也沒(méi)有成為過(guò)主流。但Borland C+又流行了多少年呢?不久就被新崛起的Microsoft Visual C/C+壓下去了?,F(xiàn)在的C+Builder又有后來(lái)居上的態(tài)勢(shì),如果穩(wěn)定性再提高一些,bug再少一些,有希望成為主流。但I(xiàn)nspires的總體實(shí)力不及

35、微軟,這也是無(wú)可爭(zhēng)議的。從C+Builder 5的Release Notes中的Known Issues部分,以及它們的幫助文檔的規(guī)模和質(zhì)量都可以看出。(哪個(gè)同類產(chǎn)品的幫助文檔能和MSDN比呢?)Inprise公司應(yīng)從Netscape吸取教訓(xùn),不要讓C+Builder成為第二個(gè)Netscape Communicator。(Communicator也是一度技術(shù)領(lǐng)先,甚至曾占據(jù)了大部分的瀏覽器市場(chǎng),但似乎后勁不足,而且 6.0 PR1、2中bug多多,現(xiàn)在被IE壓得抬不起頭。)C+Builder是Inspires的旗艦產(chǎn)品之一,前景應(yīng)當(dāng)還是比較樂(lè)觀的,而且Inspires已經(jīng)在向Linux進(jìn)軍了,

36、而微軟還遲遲沒(méi)有動(dòng)作,難道非要到Linux成燎原之勢(shì)(或許已經(jīng)成燎原之勢(shì)了)才會(huì)奮起占領(lǐng)這個(gè)新興市場(chǎng)?似乎他們對(duì)Linux的態(tài)度與幾年前對(duì)互聯(lián)網(wǎng)的興起的反應(yīng)遲緩有些相似。但后來(lái)唉,真希望Inprise不要步Netscape的后塵。C+Builder是一個(gè)很有前途的開(kāi)發(fā)工具。遺憾的是,Inprise公司Delphi的創(chuàng)始人已經(jīng)跳槽到微軟去主持Visual J+項(xiàng)目了。但愿對(duì)Inprise沖擊不會(huì)太大。微軟的Visual C+的前景又怎樣呢?Visual Studio 7.0不久就要推出了。不知能不能在保持穩(wěn)定性的同時(shí)在技術(shù)的先進(jìn)性上趕上C+Builder。另外,這一版本將加強(qiáng)網(wǎng)絡(luò)開(kāi)發(fā)的特性。看來(lái)

37、微軟雖然被判解體,開(kāi)發(fā)實(shí)力可是一點(diǎn)沒(méi)打折扣。 就技術(shù)(主要指應(yīng)用框架)來(lái)說(shuō),C+Builder目前領(lǐng)先于Visual C+。但多多少少的不盡人意之處對(duì)Inprise想說(shuō)愛(ài)你不容易。而VC盡管發(fā)展到今日已十分完善,但MFC框架已是明日黃花了。如果不使用MFC,目前又沒(méi)有合適的替代品。WFC是支持組件、屬性和事件的,但那是Visual J+里邊用的;ATL也很先進(jìn),但是用來(lái)進(jìn)行COM/ActiveX開(kāi)發(fā)的;基于ATL的WTL也不錯(cuò),可惜是非官方作品,也未必比VCL先進(jìn)。微軟最近提出了C#(讀作C Sharp)語(yǔ)言方案,但那屬于和Java同一類的東西??磥?lái)是金無(wú)足赤啊。根據(jù) 你的需要做選擇吧。實(shí)際上

38、Visual C+和C+Builder也不是單單競(jìng)爭(zhēng)關(guān)系。它們?cè)谠S多領(lǐng)域并不重疊,甚至是互補(bǔ)的。到底怎樣取舍,要根據(jù)你的項(xiàng)目特性決定。如果你開(kāi)發(fā)系統(tǒng)底層的東西,需要極好的兼容性和穩(wěn)定性,選Visual C+吧。你可以只調(diào)用Windows的各種API,不用MFC。如果你寫(xiě)傳統(tǒng)的Windows桌面應(yīng)用程序,Visual C+的MFC框架是正統(tǒng)的選擇。如果你為企業(yè)開(kāi)發(fā)數(shù)據(jù)庫(kù)、信息管理系統(tǒng)等高層應(yīng)用(高層是相對(duì)于低層/底層而言的,不是說(shuō)技術(shù)高級(jí)或低級(jí)。)而且有比較緊的期限限制,選C+Builder比較好。如果你用的語(yǔ)言是Object Pascal,Delphi是唯一的選擇(如果GNU Pascal等免

39、費(fèi)編譯器不考慮的話)。如果你原先用Delphi(Object Pascal語(yǔ)言),現(xiàn)在想改學(xué) C+,應(yīng)當(dāng)先C+Builder。熟悉的界面和相同的框架會(huì)讓你的轉(zhuǎn)軌事半功倍。 BCB的調(diào)試程序的bugs越少,最終用戶對(duì)這個(gè)程序的評(píng)價(jià)越高。而開(kāi)發(fā)人員事先對(duì)bugs的處理越多,最終用戶能提供的關(guān)于bugs的信息就越多,也越準(zhǔn)確,這樣,開(kāi)發(fā)人員在接到最終用戶反映之后,就能夠快速找到出現(xiàn)bugs的那部分代碼,并以最快速度發(fā)布程序的升級(jí)包。 (1)寫(xiě)易讀的代碼 第一點(diǎn),大概也是最重要的一點(diǎn),就是寫(xiě)干凈易讀的代碼。易讀的代碼是很有價(jià)值的。請(qǐng)想象一下,如果隨便掃視一眼代碼或注釋,就能立刻知道這段代碼的的作用,以

40、及在寫(xiě)代碼的時(shí)候?yàn)槭裁匆@樣寫(xiě),當(dāng)時(shí)的思路是什么,那么就可以節(jié)約大量時(shí)間。這樣的代碼,在寫(xiě)的時(shí)候可能會(huì)稍稍慢一些,不過(guò),當(dāng)你調(diào)試程序時(shí),就不會(huì)花上幾個(gè)小時(shí)來(lái)尋找bugs,相反,你可以快速,簡(jiǎn)單的完成除錯(cuò)工作。這時(shí),你就會(huì)覺(jué)得多花一些時(shí)間使程序易讀是很值得的。所以,在寫(xiě)程序的時(shí)候,應(yīng)該養(yǎng)成自己的風(fēng)格,或是讀一讀Scott的關(guān)于代碼風(fēng)格的文章。 (2)使用Exceptions和Exception的處理方法 除去一些少數(shù)的情況,開(kāi)發(fā)人員不可能總是依靠于集成的調(diào)試工具。所以,學(xué)會(huì)用其它的方法來(lái)找到煩人的bugs是很重要的。一些重要的、處理的錯(cuò)誤可能會(huì)在窗體之外發(fā)生。在C+標(biāo)準(zhǔn)制定出來(lái)之前的黑暗日子里,

41、在程序里面發(fā)出發(fā)生錯(cuò)誤的信號(hào),通常是通過(guò)返回錯(cuò)誤代碼完成的(現(xiàn)在這種方法仍然應(yīng)用于OLE技術(shù)和一些Winapi函數(shù)),這樣的處理方法很容易就會(huì)被忽略。(比如說(shuō),你經(jīng)常檢查winapi函數(shù)的返回值嗎?)所以,出現(xiàn)問(wèn)題的可能性并不小。由于以上的原因,需要一個(gè)這樣的機(jī)制,它不能忽略這些錯(cuò)誤,而且,這個(gè)機(jī)制應(yīng)該能被我們控制和自定義的。在這樣的需求下,異常處理機(jī)制出現(xiàn)了。需要一個(gè)特殊的錯(cuò)誤類型嗎?簡(jiǎn)單,定義一個(gè)新的異常類型就行了(和定義一個(gè)類的方法差不多),然后拋出(throw)它。 C+Builder定義了try catch () 機(jī)制。這和剛剛定義的異常機(jī)制的結(jié)構(gòu)很相似。這個(gè)機(jī)制完全可以按照需要自定

42、義。要使用異常處理了,只要把要執(zhí)行的代碼放到try塊里面,為了讓程序知道出現(xiàn)異常后應(yīng)該做什么,還需要定義一個(gè)catch()或是_finally塊。Catch()語(yǔ)句里面可以指定一個(gè)要捕捉的類型或是變量,甚至可以用它來(lái)捕捉樹(shù)結(jié)構(gòu)或是繼承類的異常,如果捕捉了基類的異常,它就能捕捉到繼承這個(gè)基類的所有的類的異常。比如,在VCL中,所有的異常都是繼承于Exception類。所以,catch(Exception& E)可以捕捉到除了EsocketError的所有VCL異常。為了讓這個(gè)機(jī)制更強(qiáng)大,C+Builder中還定義了catch()語(yǔ)句。(沒(méi)錯(cuò),就是三個(gè)點(diǎn))使用這條語(yǔ)句可以捕捉到所有的異常。還有更多

43、的功能嗎?當(dāng)然,你可以添加更多的catch()語(yǔ)句,可以向使用ifelse if語(yǔ)句那樣使用它。注意,在一系列的catch()語(yǔ)句中,錯(cuò)誤不會(huì)被重復(fù)的捕捉,也就是說(shuō),如果前面的catch()語(yǔ)句捕捉到了錯(cuò)誤,后面的catch()語(yǔ)句將不會(huì)捕捉這條錯(cuò)誤。 這個(gè)機(jī)制還有更多的功能。如果你想處理異常,但是不想在處理的位置停止,那么可以重新拋出異常。這時(shí),程序?qū)⒗^續(xù)尋找下一個(gè)catch()語(yǔ)句來(lái)處理這個(gè)異常。這個(gè)方法和“throw”差不多。這樣,你處理過(guò)的異常會(huì)再次被拋出,繼續(xù)尋找下一個(gè)catch語(yǔ)句來(lái)處理它。 最后一個(gè)要說(shuō)的是_finally(這不是標(biāo)準(zhǔn)的用法,是Borland添加的一個(gè)好方法),在

44、_finally程序塊中代碼,無(wú)論是否發(fā)生異常都會(huì)被執(zhí)行。這是一個(gè)清理程序中使用new分配的本地變量,設(shè)置用作旗標(biāo)的變量值為正常的好位置。(比如,把一個(gè)等待狀態(tài)的光標(biāo)圖標(biāo)設(shè)置為正常光標(biāo)。) 就是這些了。有時(shí)間的話,請(qǐng)看看C+Builder幫助文件中的Exception類以及繼承Exception的類。這些將對(duì)于理解本節(jié)所說(shuō)的內(nèi)容有很大幫助。 (3)使用記錄機(jī)制 不可能總是用調(diào)試器來(lái)調(diào)試代碼,在某些情況下,可能無(wú)法使用內(nèi)部集成的調(diào)試器,這時(shí)候,就不得不依靠其他手段調(diào)試程序了。(比如:Windows NT服務(wù)程序,ISAPI/CGI程序,實(shí)時(shí)應(yīng)用程序等等)。這時(shí)候,有經(jīng)驗(yàn)的程序員可能會(huì)借助古老的調(diào)

45、試方法,例如,使用一些分類的記錄機(jī)制來(lái)確定程序?qū)嶋H運(yùn)行的過(guò)程?,F(xiàn)在有一系列的方法可以簡(jiǎn)單的完成這樣的工作。下面將介紹3種方法。 第一個(gè)方法:OutputDebugString。(WinAPI: VOID OutputDebugString(LPCTSTR lpOutputString);)很幸運(yùn),微軟徹底的實(shí)現(xiàn)了調(diào)試子系統(tǒng)。它包括的一些特點(diǎn)可能讓你想把自己的記錄系統(tǒng)扔掉。應(yīng)用程序在調(diào)試器進(jìn)程中運(yùn)行時(shí)OutputDebugString將用C字符串把調(diào)試器輸出的信息打印出來(lái)。如果程序沒(méi)有在調(diào)試器進(jìn)程中運(yùn)行,它將忽略這些調(diào)用。它會(huì)很好的在客戶的機(jī)器上運(yùn)行,不會(huì)彈出信息窗口。如果在發(fā)布給客戶的時(shí)候,忘

46、記去掉這些代碼程序僅僅會(huì)變慢一點(diǎn),不會(huì)有別的不良后果。 第二個(gè)方法:使用了Gexperts,通過(guò) dbugint.pas接口進(jìn)行調(diào)試。它是個(gè)可以稱之為偉大的程序,你可以把它分發(fā)給客戶。和OutputDebugString一樣,如果客戶沒(méi)有這個(gè)程序,它就根本什么也不作。(它會(huì)自動(dòng)檢測(cè)機(jī)器上是否安裝了客戶端)。要使用dbugintf,它很容易被加入到你的工程中,加入#include dbugintf.HPp(要把它加入工程,然后會(huì)編譯它的pascal文件)。然后,你就可以直接使用SendDebug(要送到記錄文件的字符串); 或者,你需要它更機(jī)警一些,可以使用SendDebugEx(它給TMsgD

47、lgType增加了一個(gè)新的消息類型)SendMethodEnter, SendMethodExit, SendSeparator等等(用法都差不多)。如果你打算給最終用戶分發(fā)客戶端 (Gdebug.exe),不要忘記include所需要的程序包。Gexperts可以在 :/ 得到,它是免費(fèi)的。 第三個(gè)方法:大概是最艱苦的方法,就是使用自己的記錄控制。這個(gè)方法可能不是想象的這么簡(jiǎn)單??赡苁紫葧?huì)想到“在窗體上扔一個(gè)RichEdit,把它設(shè)置為只讀的,然后往里面寫(xiě)記錄”是這樣吧?理論上不錯(cuò),但是,實(shí)施起來(lái)首先,使用RichEdit控件來(lái)做記錄,會(huì)大大降低應(yīng)用程序的速度,還會(huì)

48、在內(nèi)存中造成碎片,甚至丟失內(nèi)存。通常,在運(yùn)行10分鐘左右之后,會(huì)使整個(gè)計(jì)算機(jī)的速度變慢!所以,如果希望在自己的記錄中能夠使用彩色和圖標(biāo),那么最好自己創(chuàng)建一個(gè)組件。如果沒(méi)有這么高的要求,那么有一個(gè)簡(jiǎn)單有效的方法,就是使用ListBox控件作記錄,把ListBox的Style屬性設(shè)置為lbOwnerDrawFixed,這樣句柄將會(huì)自繪。(Gexperts的控制臺(tái)就是用這樣的方法制作的)。 (4)將記錄和異常處理結(jié)合使用 不用總是擔(dān)心可能會(huì)發(fā)生什么偶然的異常。一般來(lái)說(shuō),通過(guò)很多的bugs測(cè)試后(盡量折磨程序,看看它會(huì)不會(huì)崩潰),應(yīng)用程序在運(yùn)行是應(yīng)該不會(huì)出現(xiàn)什么錯(cuò)誤。下面的這個(gè)技術(shù),建議組件開(kāi)發(fā)者,在

49、第一次把組件放在IDE環(huán)境測(cè)試的時(shí)候,很應(yīng)該遵守。一個(gè)在IDE中產(chǎn)生的異常會(huì)導(dǎo)致很多問(wèn)題,甚至可能無(wú)法重新啟動(dòng)IDE也不能恢復(fù)。這個(gè)技術(shù)很簡(jiǎn)單。在代碼中每一個(gè)函數(shù)或是主要的函數(shù)中加入: try /函數(shù)的代碼 catch(Exception &E) SendDebugMessage(“Exception caught in classname:functionname of type:” +E.ClassName() +” with the message:”+E.Message); ; 把字符串中classname 和 functionname 替換成相應(yīng)的類名和函數(shù)名。在出現(xiàn)錯(cuò)誤時(shí),你會(huì)立刻

50、知道錯(cuò)誤發(fā)生的位置。這樣也就不至于強(qiáng)制重起IDE的了。 ClassName()給了什么樣的幫助呢?它只是用于返回字符串“Exception”嗎?每一次,E都被聲明為異常類型?這是VCL另一個(gè)優(yōu)秀的地方,所有的類都從Tobject繼承,所以,這些類都能自動(dòng)獲得正確的類型和基類的類型,所有的更多的信息都可以在這里找到。(請(qǐng)參見(jiàn)Tobject的幫助)所以,盡管使用了Exception &E,其中的E.ClassName()將返回捕獲到的產(chǎn)生異常的實(shí)際類名。得到這些好處需要付出的代價(jià)是編譯出來(lái)的可執(zhí)行文件變大了一些。所有的Delphi/Cbuilder用戶都注意到了這一點(diǎn),但是說(shuō)沒(méi)有付出就沒(méi)有收獲。在

51、 :/ bytamin-c /的howto欄目可以看到Xiphias的一系列文章。其中,他提到了使用TStringList作記錄的方法:先將錯(cuò)誤通過(guò)TStringList的Add方法加入到StringList里面,然后使用SaveToFile保存到硬盤(pán)上。不過(guò)要注意在程序結(jié)束的時(shí)候不要忘記使用SaveToFile()方法把TStringList保存起來(lái)?;蛘撸部梢悦看尾蹲降疆惓V蠖急4嬉淮?。 系統(tǒng)結(jié)構(gòu)主菜單模塊由數(shù)據(jù)結(jié)構(gòu)、操作、幫助、程序四個(gè)部分組成。數(shù)據(jù)結(jié)構(gòu)模板由線性表、堆棧和隊(duì)列、樹(shù)、圖等四個(gè)部分組成。線性表又分為鏈表概念、鏈表模型、鏈表操作、雙向鏈表四個(gè)部分,堆棧和隊(duì)列分為基本堆棧、

52、基本隊(duì)列、循環(huán)隊(duì)列三個(gè)部分,樹(shù)分為數(shù)據(jù)二叉樹(shù)、結(jié)構(gòu)二叉樹(shù)、類二叉樹(shù),圖分為圖表示、圖搜索、最短路徑。操作模板由線性表說(shuō)明、堆棧說(shuō)明、隊(duì)列說(shuō)明、樹(shù)說(shuō)明、圖說(shuō)明組成。幫助模板由關(guān)于和幫助組成。程序模塊由退出組成。系統(tǒng)的功能模塊如圖3-1所示。本系統(tǒng)是由我與另外一個(gè)同學(xué)合作完成的,根據(jù)系統(tǒng)的結(jié)構(gòu),我們對(duì)各自的任務(wù)做了明確的分工。我在本系統(tǒng)中所做的工作是:1、詳細(xì)分析了系統(tǒng)需求,提出了系統(tǒng)設(shè)計(jì)方案,并進(jìn)行了論證;2、分析了RAD設(shè)計(jì)方法的利弊,并選定了設(shè)計(jì)方案。3、主菜單、線性表、樹(shù)、操作四部分模塊的設(shè)計(jì)。 鏈表概念 鏈表模型退出程序鏈表操作雙向鏈表線性表基本堆棧基本隊(duì)列堆棧和隊(duì)列數(shù)據(jù)結(jié)構(gòu)循環(huán)隊(duì)列數(shù)組

53、二叉樹(shù)樹(shù)結(jié)構(gòu)二叉樹(shù)操作二叉樹(shù)圖圖表示進(jìn)入系統(tǒng)線性表說(shuō)明圖搜索最短路徑操作堆棧說(shuō)明隊(duì)列說(shuō)明樹(shù)說(shuō)明圖說(shuō)明關(guān)于幫助幫助圖3-1 系統(tǒng)模塊圖詳細(xì)設(shè)計(jì)主菜單(1)主菜單主要由一個(gè)菜單控件、一個(gè)顯示文本、三個(gè)按紐、二個(gè)可供長(zhǎng)文本輸入/出等七個(gè)控件組成。如圖3-2所示:圖3-2 主菜單的顯示圖(2)設(shè)計(jì)思想:開(kāi)始作為一個(gè)演示系統(tǒng)的菜單,應(yīng)給人一個(gè)直觀的感覺(jué),有個(gè)醒目的標(biāo)題,通過(guò)一個(gè)菜單控件,連接我們?cè)O(shè)計(jì)的各種數(shù)據(jù)結(jié)構(gòu)的算法演示;兩個(gè)文本輸入,用于對(duì)算法的說(shuō)明,輔助使用者對(duì)算法的學(xué)習(xí);作為一個(gè)系統(tǒng),一個(gè)幫助模塊是不可缺少的。主菜單的流程圖如圖3-3所示。幫助操作數(shù)據(jù)結(jié)構(gòu)程序線性表說(shuō)明圖說(shuō)明幫助關(guān)于樹(shù)說(shuō)明隊(duì)列說(shuō)

54、明堆棧說(shuō)明圖樹(shù)堆棧和隊(duì)列線性表退出圖3-3 主菜單流程圖(3)控件介紹:C+ Builder的組件工具箱(Component Palette)提供各種制作組件的工具,包括文字標(biāo)簽、文本框、圖象組件等。在本系統(tǒng)中,用到了MainMenu(建立主菜單)、PopupMemu(建立彈出式菜單元件)、Label(在窗體上顯示文本信息的工具)、Edit(建立文本框的工具)、Memo(可以讓用戶輸入文字信息,功能較文字標(biāo)簽更多元化)、Button(在窗體上建立命令按紐組件,在窗體上單擊此按紐時(shí),可以執(zhí)行對(duì)應(yīng)的程序代碼)、ListBox(在窗體建立列表框組件,提供數(shù)據(jù)選項(xiàng))、ComboBox(它可建立下拉式列

55、表,是列表框與文本框的組合)、ScrollBar(用來(lái)建立滾動(dòng)條組件)、GroupBox(在窗體上建立框架組件)、RadioGroup(建立選擇群組組件)、Panel(存放其他組件的容器組件)、ActionList(存放執(zhí)行動(dòng)作的組件);Bitbin(可有圖標(biāo)的按紐)、StingGrid(字符串)、Image(顯示圖象圖片)、Shape(基本圖形的建立)、Bevel(建立邊框面板)、TabControl(建立標(biāo)簽集)、ImageList(圖象序列)、RichEdit(多功能編輯)、StatusBar(狀態(tài)顯示)、Timer(時(shí)間時(shí)間控制)這些組件。線性表模塊(1)在菜單中,我們通過(guò)調(diào)用WinE

56、xec函數(shù),以執(zhí)行外部命令的方式,調(diào)用鏈表概念.exe程序,來(lái)完成鏈表概念的演示。源代碼如下: NewFileName=ExtractFilePath(Application-ExeName)+鏈表概念.exe; i=WinExec(NewFileName.c_str(),SW_SHOWNORMAL); 在鏈表概念的實(shí)現(xiàn)中,比較數(shù)組與鏈表的區(qū)別,兩者最明顯的差別在于存儲(chǔ)空間的配置上,數(shù)組是固定配置存儲(chǔ)空間,因此存取上受到限制,如果超過(guò)范圍則會(huì)產(chǎn)生無(wú)法預(yù)期的狀況。此程序是用一組地址連續(xù)的存儲(chǔ)單位依次存儲(chǔ)線性表的數(shù)據(jù)元素,以此實(shí)現(xiàn)線性表的順序存儲(chǔ)結(jié)構(gòu),這種存儲(chǔ)結(jié)構(gòu)的線性表叫順序表。如圖3-4所示。

57、圖3-4 鏈表概念顯示圖 圖3-5 鏈表概念流程圖開(kāi)始輸入數(shù)據(jù)選擇按紐顯示鏈表順序退出結(jié)束(2)在菜單中,我們通過(guò)調(diào)用WinExec函數(shù),以執(zhí)行外部命令的方式,調(diào)用鏈表模型.exe程序,來(lái)完成鏈表模型的演示。源代碼如下: NewFileName=ExtractFilePath(Application-ExeName)+鏈表模型.exe; i=WinExec(NewFileName.c_str(),SW_SHOWNORMAL); 在鏈表模型的實(shí)現(xiàn)中,此程序是一個(gè)用c+類方式編寫(xiě)的鏈表模型。線性表的鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)的特點(diǎn)是用一組任意的存儲(chǔ)單元存儲(chǔ)線性表的數(shù)據(jù)元素(這組存儲(chǔ)單元可以是連續(xù)的,也可以是不連

58、續(xù)的)。因此,為了表示每個(gè)數(shù)據(jù)元素與其直接后繼數(shù)據(jù)元素之間的邏輯關(guān)系,對(duì)數(shù)據(jù)元素來(lái)說(shuō),除了存儲(chǔ)其本身的信息之外,還需存儲(chǔ)一個(gè)指示其直接后繼的信息。根據(jù)以上思想,我設(shè)計(jì)該程序的運(yùn)行頁(yè)面如圖3-6所示。圖3-6 鏈表模型顯示圖開(kāi)始輸入內(nèi)容選擇爭(zhēng)先奪后列席結(jié)束圖3-7 鏈表模型流程圖(3)在菜單中,我們通過(guò)調(diào)用WinExec函數(shù),以執(zhí)行外部命令的方式,調(diào)用鏈表操作.exe程序,來(lái)完成鏈表操作的演示。源代碼如下: NewFileName=ExtractFilePath(Application-ExeName)+鏈表操作.exe; i=WinExec(NewFileName.c_str(),SW_SHO

59、WNORMAL); 在鏈表操作的實(shí)現(xiàn)中,此程序是鏈表的基本操作模型,在這種存儲(chǔ)結(jié)構(gòu)中,容易實(shí)現(xiàn)線性表的某些操作, 在此程序中,我們重點(diǎn)實(shí)現(xiàn)了鏈表的插入和刪除。假設(shè)我們要在線性表的兩個(gè)數(shù)據(jù)元素a和b之間插入一個(gè)數(shù)據(jù)元素x,已知p為其鏈表存儲(chǔ)結(jié)構(gòu)中指向接點(diǎn)a的指針,如圖3-8(a)所示:ababxpps(a)(b)圖3-8 在單鏈表中插入結(jié)點(diǎn)時(shí)指針變化狀況為插入數(shù)據(jù)元素x,首先要生成一個(gè)數(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個(gè)元素a、b和x之間邏輯關(guān)系的變化。插入后的單鏈表如圖(b)所示。

60、假設(shè)s為指向結(jié)點(diǎn)x的指針,則上述指針修改用語(yǔ)句描述即為:s-next=p-next ; p-next=s;反之,如圖3-9所示在線性表中刪除元素b時(shí),為在單鏈表中實(shí)現(xiàn)元素a、b和c之間的邏輯關(guān)系的變化,僅需要修改結(jié)點(diǎn)a中的指針域即可。假設(shè)p為指向結(jié)點(diǎn)a的指針,則上述指針修改用語(yǔ)句描述即為:p-next=p-next-next;可見(jiàn),在已知鏈表中元素插入或刪除的確切位置的情況下,在單鏈表中插入或刪除一個(gè)結(jié)點(diǎn)時(shí),僅需修改指針而不需要移動(dòng)元素。p圖3-9 在單鏈表中刪除結(jié)點(diǎn)時(shí)指針變化狀況abc根據(jù)插入和刪除的思想,我設(shè)計(jì)出了此程序的運(yùn)行界面如圖3-10所示:圖3-10鏈表操作顯示圖開(kāi)始輸入內(nèi)容選擇按

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論