數(shù)據(jù)結構》課程設計_第1頁
數(shù)據(jù)結構》課程設計_第2頁
數(shù)據(jù)結構》課程設計_第3頁
數(shù)據(jù)結構》課程設計_第4頁
數(shù)據(jù)結構》課程設計_第5頁
已閱讀5頁,還剩27頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、精品文檔 沈 陽 工 程 學 院課 程 設 計 課程設計題目: 數(shù)據(jù)結構與算法課程設計 系 別 信息工程學院 班級 物聯(lián)本 學生姓名 許 學號 2 指導教師 職稱 講師 任 務 下 達 時 間: 2021 年 6 月 24 日起止日期:2021年6月24日起至 2021年 7 月5日止 沈 陽 工 程 學 院 課程設計任務書 設計題目:寫出圖的廣度優(yōu)先搜索算法的非遞歸算法 哈夫曼編碼系 別 信息工程學院 班級 物 21 學生姓名 許 學號 2 指導教師 職稱 講師 任 務 下 達 時 間: 2021 年 6 月 24 日起止日期:2021年6月24日起至 2021年 7 月5日止 歡迎下載精品

2、文檔一、課程設計的原始資料及依據(jù)數(shù)據(jù)結構與算法課程設計是在完成數(shù)據(jù)結構理論課程學習之后進行的一個綜合性的實踐教學環(huán)節(jié),是對課程理論和課程實驗的一個補充。通過課程設計,培養(yǎng)學生綜合運用已學過的理論和技能去分析和解決實際問題的能力,并使所學知識得到進一步穩(wěn)固、深化和擴展。二、課程設計主要內容及要求設計內容:1、 寫出圖的廣度優(yōu)先搜索算法的非遞歸算法。2、 哈夫曼編碼l 問題描述:利用哈夫曼編碼進行通信可以大大提高信道利用率,縮短信息傳輸時間,降低傳輸本錢。這就要求在發(fā)送端通過一個編碼系統(tǒng)對待傳數(shù)據(jù)預先編碼,在接收端將傳來的數(shù)據(jù)進行譯碼。對于雙工信道(即可以雙向傳輸信息的信道),每端都需要一個完成的

3、編譯碼系統(tǒng)。試為這樣的信息收發(fā)站寫一個哈夫曼的編譯碼系統(tǒng)。l 根本要求:1. 初始化。從終端讀入字符集大小n,以及n個字符和n個權值,建立哈夫曼樹。 2. 編碼。利用已建好的哈夫曼樹,對正文進行編碼。 3. 譯碼。對編碼好的內容進行譯碼。 4. 打印編碼。 設計要求:(1)每名同學任選三題;標號的題為選做題,完成有加分;(2)學生應明確設計任務和要求,并擬定設計方案,按時完成;(3)設計分階段進行,每一階段的設計沒有原那么錯誤時才能允許進行下一階段設計;(4)設計過程中,提倡獨立思考、深入鉆研,主動地、創(chuàng)造性地進行設計;(5)要求設計態(tài)度嚴肅認真、有錯必改。三、對課程設計說明書撰寫內容、格式、

4、字數(shù)的要求1課程設計說明書是表達和總結課程設計成果的載體,主要內容包括:設計題目、設計目的、設備器材、設計原理及內容、設計步驟、遇到的問題及解決方法、設計總結、參考文獻等。一般不應少于3000字。2在適當位置配合相應的實驗原理圖、功能模塊圖、算法流程圖等圖表進行說明。應做到文理通順,內容正確完整,書寫工整,裝訂整齊。3設計總結局部主要寫本人完成工作簡介以及自己的設計體會,包括通過課程設計學到了什么,哪里遇到了困難,解決的方法以及今后的目標。4課程設計說明書手寫或打印均可。手寫要用學校統(tǒng)一的課程設計用紙,用黑或藍黑墨水工整書寫;打印時采用A4紙,頁邊距均為20mm,正文采用宋體小四號字,行間距1

5、8磅。文中大標題采用黑體小三號字,一級節(jié)標題采用黑體四號字,二級節(jié)標題采用黑體小四號字,表題與圖題采用宋體五號字。5課程設計說明書裝訂順序為:封面、任務書、成績評定表、目錄、正文、參考文獻。四、設計完成后應提交成果的種類、數(shù)量、質量等方面的要求1完成“任務書中指定的功能,運行結果正確。2課程設計報告。五、時間進度安排順序階段日期計 劃 完 成 內 容備注1第1天閱讀資料及系統(tǒng)分析設計2第2-5天程序編制3第6-7天程序調試4第8-9天成績評定5第10天書寫課程設計說明書六、主要參考資料文獻1?數(shù)據(jù)結構?,清華大學出版社,2001,嚴蔚敏 吳偉民 2?數(shù)據(jù)結構題集?,清華大學出版社,1999,嚴

6、蔚敏 吳偉民 3?數(shù)據(jù)結構習題與解析?,清華大學出版社,2006,李春葆4?數(shù)據(jù)結構?,高等教育出版社,2006,許卓群5?數(shù)據(jù)結構習題解析?,清華大學出版社,2021,殷人昆 沈 陽 工 程 學 院數(shù)據(jù)結構與算法課程設計成績評定表系部: 信息工程學院 班級: 物聯(lián)本121 學生姓名: 許榮燊 指 導 教 師 評 審 意 見評價內容具 體 要 求權重評 分加權分調研論證能獨立查閱文獻,收集資料;能制定課程設計方案和日程安排。0.15432工作能力態(tài)度工作態(tài)度認真,遵守紀律,出勤情況是否良好,能夠獨立完成設計工作, 0.25432工作量按期圓滿完成規(guī)定的設計任務,工作量飽滿,難度適宜。0.254

7、32說明書的質量說明書立論正確,論述充分,結論嚴謹合理,文字通順,技術用語準確,符號統(tǒng)一,編號齊全,圖表完備,書寫工整標準。0.55432指導教師評審成績加權分合計乘以8 分加權分合計指 導 教 師 簽 名: 年 月 日評 閱 教 師 評 審 意 見評價內容具 體 要 求權重評 分加權分查閱文獻查閱文獻有一定廣泛性;有綜合歸納資料的能力0.25432工作量工作量飽滿,難度適中。0.55432說明書的質量說明書立論正確,論述充分,結論嚴謹合理,文字通順,技術用語準確,符號統(tǒng)一,編號齊全,圖表完備,書寫工整標準。0.35432評閱教師評審成績加權分合計乘以4分加權分合計評 閱 教 師 簽 名: 年

8、 月 日 摘 要 “數(shù)據(jù)結構是一門專業(yè)技術根底課。它的教學要求是:學會分析研究計算機加工的數(shù)據(jù)結構的特征,以便為應用涉及的數(shù)據(jù)選擇適當?shù)倪壿嫿Y構、存儲結構及其相應的算法,并初步掌握算法的時間分析和空間分析的技術。另一方面,本課程的學習過程也是復雜程序設計的訓練過程,要求學生編寫的程序結構清楚和正確易讀,符合軟件工程的標準。圖作為數(shù)據(jù)結構的重要一局部,它的應用十分廣泛。一方面由于很多實際問題跟圖有關,例如通信線路、交通運輸、集成電路布線圖等;另一方面在于還有很多實際問題可間接地用圖來表示,處理起來比擬方便,例如工程進度的安排等。圖的遍歷過程:假設從圖中的某個頂點V出發(fā),在訪問V之后依次訪問V的各

9、個未曾訪問的鄰接頂點,然后分別從這些鄰接點出發(fā)依次訪問他們的鄰接點,并使“先訪問的頂點的鄰接點先于“后訪問的頂點的鄰接點被訪問,直到圖中所有已被訪問的頂點的鄰接點都被訪問到。哈夫曼的優(yōu)點:利用哈夫曼編碼進行通信可以大大提高信道利用率,縮短信息傳輸時間,降低傳輸本錢。創(chuàng)立赫夫曼樹之后,從樹根開始標志赫夫曼碼,赫夫曼碼是由0和1所組成的,左子樹填入0,右子樹填入1,因此欲知每一個數(shù)據(jù)元素的赫夫曼樹的方法為:對數(shù)據(jù)中出現(xiàn)過的每一個元素各自產(chǎn)生一樹葉節(jié)點,并賦予樹葉節(jié)點該元素的出現(xiàn)頻率。令L是所有樹葉節(jié)點所成之集合: 產(chǎn)生一個新節(jié)點N 令N為L1和L2的父親節(jié)點L1 ,L2和L2是L中出現(xiàn)頻率最低的倆

10、個節(jié)點。令N節(jié)點的出現(xiàn)頻率等于L1和L2的出現(xiàn)頻率總和。從L中刪除L1和L2,并將N參加L中。標志樹中各個節(jié)點的左子樹銜接為0,右子樹銜接為1。 關鍵詞:廣度,非遞歸,隊列,樹的構建,哈夫曼 歡迎下載精品文檔第一章 問題分析1.1引言圖是比樹更為復雜的一種非線性數(shù)據(jù)結構,在圖結構中,每個節(jié)點都可以和其他任何節(jié)點相連接,圖結構可以描述復雜的數(shù)據(jù)對象。圖有廣泛的應用,一方面由于有很多實際問題與圖有關,例如通信線路,交通線路,交通運輸,集成電路布線圖等;另一方面在于還有很多實際問題可以間接地用圖來表示,處理起來比擬方便,例如工程進度的安排等。1.2背景數(shù)據(jù)結構一般包括以下三方面內容:數(shù)據(jù)的邏輯結構是

11、從邏輯關系上描述數(shù)據(jù),與數(shù)據(jù)的存儲無關,是獨立于計算機的。數(shù)據(jù)的邏輯結構可以看作是從具體問題抽象出來的數(shù)學模型。數(shù)據(jù)的存儲結構是邏輯結構用計算機語言的實現(xiàn),它依賴于計算機語言。對機器語言而言,存儲結構是具體的。一般,只在高級語言的層次上討論存儲結構。數(shù)據(jù)的運算定義在數(shù)據(jù)的邏輯結構上,每種邏輯結構都有一個運算的集合。最常用的檢索、插入、刪除、更新、排序等運算實際上只是在抽象的數(shù)據(jù)上所施加的一系列抽象的操作。所謂抽象的操作,是指我們只知道這些操作是"做什么",而無須考慮"如何做"。只有確定了存儲結構之后,才考慮如何具體實現(xiàn)這些運算。1.3分析圖是一種復雜的非

12、線形數(shù)據(jù)結構。在圖中數(shù)據(jù)元素之間的聯(lián)系是任意的,即任何兩個頂點都可能存在鄰接關系。圖的存儲方式主要有兩種:鄰接矩陣和鄰接表,我們在此次課程設計時候選擇鄰接表作為圖的存儲方式。圖的遍歷就是從圖的某一個頂點出發(fā),訪問圖中每個頂點一次,切僅一次。如果采用非遞歸算法就需要用到一個棧。廣度優(yōu)先遍歷是一種逐層橫向搜索的過程。不是遞歸過程,算法設計時候需要一個隊列。在無向圖中,如果從頂點Vi到頂點Vj之間有路徑,那么稱這兩個頂點是連通的。如過圖中任意一對頂點都是連通的,那么稱此圖為連通圖。此題目要求判斷是否是連通圖,根據(jù)鄰接表的一些特性以及鄰接表的概念。設計一個簡單的算法可以判斷是否是連通圖了。 第二章 理

13、論與運行環(huán)境2.1 數(shù)據(jù)理論數(shù)據(jù)的邏輯結構可以看作是從具體問題抽象出來的數(shù)學模型。數(shù)據(jù)的存儲結構是邏輯結構用計算機語言的實現(xiàn),它依賴于計算機語言。對機器語言而言,存儲結構是具體的。一般,只在高級語言的層次上討論存儲結構。數(shù)據(jù)的運算定義在數(shù)據(jù)的邏輯結構上,每種邏輯結構都有一個運算的集合。最常用的檢索、插入、刪除、更新、排序等運算實際上只是在抽象的數(shù)據(jù)上所施加的一系列抽象的操作。所謂抽象的操作,是指我們只知道這些操作是"做什么",而無須考慮"如何做"。只有確定了存儲結構之后,才考慮如何具體實現(xiàn)這些運算。鏈表是一種有序的列表,鏈表的內容通常是存儲與內存中分散的

14、位置上。鏈表的方式有兩種:一種是利用數(shù)組結構串連的有序列表。例如;兩個數(shù)組,一個存放數(shù)據(jù),另一個存放連接的關系。這種缺乏彈性。另一種以動態(tài)內存配置的鏈表,通常指的鏈表是一動態(tài)內存分配的鏈表動態(tài)內存配置的鏈表,是由許許多多的node所鏈接而成的,每一個結點,包含了數(shù)據(jù)局部和指向下一個結點的指針Pointer。以動態(tài)內存配置的鏈表,在插入和刪除元素的時候,只需要將指針改變指向就可以。鏈表和數(shù)組一樣是一種數(shù)據(jù)結構,如何使用完全基于你的應用需求。 鏈表和C+語言本身沒有任何聯(lián)系。很多語言都可以實現(xiàn)鏈表數(shù)據(jù)結構。 我講一下數(shù)據(jù)和鏈表的區(qū)別有可能幫助你對鏈表的使用有個感覺。 數(shù)組是將元素在內存中連續(xù)存放,

15、由于每個元素占用內存相同,所以你可以通過下標迅速訪問數(shù)組中任何元素。但是如果你要在數(shù)組中增加一個元素,你需要移動大量元素,在內存中空出一個元素的空間,然后將要增加的元素放在其中。同樣的道理,如果你想刪除一個元素,你同樣需要移動大量元素去填掉被移動的元素。 鏈表恰好相反,鏈表中的元素在內存中不是順序存儲的,而是通過存在元素中的指針聯(lián)系到一起。比方:上一個元素有個指針指到下一個元素,以此類推,直到最后一個元素。如果你要訪問鏈表中一個元素,你需要從第一個元素開始,一直找到你需要的元素位置。但是增加和刪除一個元素對于鏈表數(shù)據(jù)結構就非常簡單了, 只要修改元素中的指針就可以了。 鏈表是指將假設干個數(shù)據(jù)項按

16、一定的規(guī)那么連接起來的表,其中的數(shù)據(jù)項成為結點。鏈表是一種常見的重要的數(shù)據(jù)結構。它是動態(tài)地進行存儲分配的一種結構。它可以根據(jù)需要開辟內存單元。鏈表有一個“頭指針變量,以head表示,它存放一個地址。該地址指向一個元素。鏈表中每一個元素稱為“結點,每個結點都應包括兩個局部:一為用戶需要用的實際數(shù)據(jù),二為下一個結點的地址。因此,head指向第一個元素:第一個元素又指向第二個元素;,直到最后一個元素,該元素不再指向其它元素,它稱為“表尾,它的地址局部放一個“NULL表示“空地址,鏈表到此結束。2.2 運行環(huán)境Visual C+ 6.0的工作環(huán)境可以劃分為三塊區(qū)域,最左邊的區(qū)域是工作區(qū),最下面的區(qū)域是

17、輸出區(qū),最右邊的區(qū)域是編輯區(qū)。編輯區(qū)用來對源文件進行編輯,現(xiàn)在的編輯區(qū)是灰色的,表示還沒有源文件在進行編輯,輸出區(qū)的作用是對程序進行編譯和連接后,如果程序有錯誤或者警告,那么顯示在輸出區(qū),可以對照錯誤或者警告提示進行程序修改。如下列圖:Visual C+ 6.0的工作環(huán)境圖2.1 Visual C+ 6.0的工作環(huán)境第3章 算法分析及實現(xiàn)3.1 程序流程圖1. 廣度優(yōu)先遍歷的流程圖;1.1主要流程圖如下: 圖3.1.1為廣度優(yōu)先遍歷 1.2遍歷實現(xiàn):接受v頂點并找出相應的i數(shù)值visitedi= =0開始輸出vVisitedi=1;queuerear=v;入隊rear!=frontfront=

18、front+1;v=queuefrontP=gi.link;更新i值P!=0更新i值visitedi= =0輸出該頂點visitedi=1;rear=rear+1;queuerear=p->adjvexp=p->next結束否是否否否是是 3.1.2圖的遍歷實現(xiàn) 2. 哈夫曼編碼: 圖3.2為哈夫曼遍歷過程3.2算法分析及設計3.2.1創(chuàng)立圖函數(shù)void create()for(i=1;i<=e;i+) printf("nplease input two vertex of a edge (s,d)n"); scanf("%c,%c",

19、&s,&d); for(j=1;j<n;j+) if(s=gj.data|d=gj.data) p=(struct edgenode *)malloc(sizeof(struct edgenode);p->adjvex=d;p->next=gs.link;gs.link=p;p=(struct edgenode *)malloc(sizeof(struct edgenode);p->adjvex=s;p->next=gd.link;gd.link=p; void CreateMGraph(MGraph *G) /創(chuàng)立圖 int i,j,k; cha

20、r ch1,ch2; printf("請輸入頂點數(shù)和邊數(shù)(輸入格式為:頂點數(shù),邊數(shù)):n"); scanf("%d,%d",&(G->n),&(G->e); printf("請輸入頂點信息(頂點號<CR>)每個頂點以回車作為結束:n"); for(i=0;i<G->n;i+) getchar();scanf("%c",&(G->vexsi); for(i=0;i<G->n;i+) for(j=0;j<G->n;j+) G-&g

21、t;edgesij=0;printf("請輸入每條邊對應的兩個頂點的序號(輸入格式為:i,j):n"); for(k=0;k<G->e;k+) getchar(); printf("請輸入第%d條邊的頂點序號:",k+1); scanf("%c,%c",&ch1,&ch2); for(i=0;ch1!=G->vexsi;i+); for(j=0;ch2!=G->vexsj;j+); G->edgesij=1;for(i=0;ch1!=G->vexsi;i+); for(j=0;ch2

22、!=G->vexsj;j+); G->edgesji=1; 先選擇要操作的局部創(chuàng)立圖,然后依次輸入頂點和邊,圖創(chuàng)立完成后按任意鍵結束,界面顯示如圖3.2.1(1)所示: 3.2.1(1)創(chuàng)立圖函數(shù)界面遍歷圖的非遞歸算法:void BFSTraverse (ALGraph *G,int v) /*從v出發(fā)遍歷圖G非遞歸算法*/ EdgeNode *p; int w,i; int queueMAXV,front=0,rear=0; /*定義循環(huán)隊列*/ bool visitedMAXV; /*定義頂點的訪問標志數(shù)組*/ for(i=0;i<G->n;i+) visitedi

23、=false; /*初始化*/ Visit(v); /*訪問編號為v的頂點*/ visitedv=true; /*置已訪問標記*/ rear=(rear+1)%MAXV; /*已訪點v入隊*/ queuerear=v; while (front!=rear) /*假設隊列不空時循環(huán)*/ front=(front+1)%MAXV; w=queuefront; /*已訪頂點出隊,賦給w*/ p=G->adjlistw.firstedge ; /*從w的首鄰接點出發(fā)*/ while(p) /*找w的所有鄰接點*/ if (visitedp->adjvex=false) /*處理未訪鄰接點

24、*/ Visit(p->adjvex); /*訪問鄰接點*/ visitedp->adjvex=true; /*置已訪標記*/ rear=(rear+1)%MAXV; /*已訪點進隊*/ queuerear=p->adjvex; p=p->next; /*找下一個鄰接點*/ / while (p) / while (front!=rear) 運行的結果為: 圖3.2.12圖的非遞歸遍歷3.2.2創(chuàng)立哈夫曼函數(shù)/ / 實現(xiàn)哈夫曼編/譯碼/-主函數(shù)- void main() char choice; while(choice!='q') cout<&l

25、t;"n*"<<endl; cout<<" 歡送使用哈夫曼編碼解碼系統(tǒng)"<<endl; cout<<"*"<<endl; cout<<"(1)要初始化哈夫曼鏈表請輸入'i'"<<endl; cout<<"(2)要編碼請輸入'e'"<<endl; cout<<"(3)要譯碼請輸入'd'"<<endl;

26、 cout<<"(4)要打印編碼請輸入'p'"<<endl; cout<<"(5)要打印哈夫曼樹請輸入't'"<<endl; cout<<"(6)要打印譯碼請輸入'y'"<<endl; if(flag=0)cout<<"n請先初始化哈夫曼鏈表,輸入'i'"<<endl; cin>>choice; switch(choice) case '

27、i': Initialization(); break; case 'e': Encoding(); break; case 'd': Decoding(); break; case 'p': Code_printing(); break; case 't': Tree_printing(HT,2*n-1); break; case 'y': Code_printing1(); break; default: cout<<"input error"<<endl;

28、free(z); free(w); free(HT); 如圖運行如下:圖3.2.21 哈夫曼樹的創(chuàng)立 圖3.2.21 哈夫曼樹的創(chuàng)立/-初始化哈夫曼鏈表- void Initialization() int a,k,flag,len; a=0; len=InputCode(); for(i=0;i<len;i+) k=0;flag=1; coui-a.data=stri; coui-a.count=1; while(i>k) if(stri=strk) a+; flag=0; k+; if(flag=0) break; if(flag) for(j=i+1;j<len;j+)

29、 if(stri=strj) +coui-a.count; n=len-a; for(i=0;i<n;i+) cout<<coui.data<<" " cout<<coui.count<<endl; for(i=0;i<=n;i+) *(z+i)=coui.data; *(w+i)=coui.count; HuffmanCoding(HT,HC,w,n); 遍歷如下: 圖3.2.22 圖3.2.22初始化哈夫曼鏈表建立哈夫曼的算法:void HuffmanCoding(HuffmanTree &HT,Huf

30、fmanCode &HC,int *w,int n) / w存放n個字符的權值(均>0),構造哈夫曼樹HT,并求出n個字符的哈夫曼編碼HC int m,i,s1,s2,start; /unsigned c,f; int c,f; HuffmanTree p; char *cd; if(n<=1) return;/檢測結點數(shù)是否可以構成樹 m=2*n-1; HT=(HuffmanTree)malloc(m+1)*sizeof(HTNode); / 0號單元未用 for(p=HT+1,i=1;i<=n;+i,+p,+w) p->weight=*w; p->pa

31、rent=0; p->lchild=0; p->rchild=0; for(;i<=m;+i,+p) p->parent=0; for(i=n+1;i<=m;+i) / 建哈夫曼樹 / 在HT1i-1中選擇parent為0且weight最小的兩個結點,其序號分別為s1和s2 select(HT,i-1,s1,s2); HTs1.parent=HTs2.parent=i; HTi.lchild=s1; HTi.rchild=s2; HTi.weight=HTs1.weight+HTs2.weight; / 從葉子到根逆向求每個字符的哈夫曼編碼 HC=(Huffman

32、Code)malloc(n+1)*sizeof(char*); / 分配n個字符編碼的頭指針向量(0不用) cd=(char*)malloc(n*sizeof(char); / 分配求編碼的工作空間 cdn-1='0' / 編碼結束符 for(i=1;i<=n;i+) / 逐個字符求哈夫曼編碼 start=n-1; / 編碼結束符位置 for(c=i,f=HTi.parent;f!=0;c=f,f=HTf.parent) / 從葉子到根逆向求編碼 if(HTf.lchild=c) cd-start='0' else cd-start='1'

33、 HCi=(char*)malloc(n-start)*sizeof(char); / 為第i個字符編碼分配空間 strcpy(HCi,&cdstart); / 從cd復制編碼(串)到HC free(cd); / 釋放工作空間 /-編碼函數(shù)- void Encoding() cout<<"下面對目錄下文件tobetran.txt中的字符進行編碼"<<endl; FILE *tobetran,*codefile; if(tobetran=fopen("tobetran.txt","rb")=NULL) c

34、out<<"不能翻開文件"<<endl; if(codefile=fopen("codefile.txt","wb")=NULL) cout<<"不能翻開文件"<<endl; char *tran; i=99; tran=(char*)malloc(100*sizeof(char); while(i=99) if(fgets(tran,100,tobetran)=NULL) cout<<"不能翻開文件"<<endl; bre

35、ak; for(i=0;*(tran+i)!='0'i+) for(j=0;j<=n;j+) if(*(z+j-1)=*(tran+i) fputs(HCj,codefile); if(j>n) cout<<"字符錯誤,無法編碼!"<<endl; break; cout<<"編碼工作完成"<<endl<<"編碼寫入目錄下的codefile.txt中"<<endl<<endl; fclose(tobetran); fclose

36、(codefile); free(tran); 運行的結果為: 圖3.2.23 圖3.2.23建立哈夫曼編碼/-譯碼函數(shù)- void Decoding() cout<<"下面對根目錄下文件codefile.txt中的字符進行譯碼"<<endl; FILE *codef,*txtfile; if(txtfile=fopen("txtfile.txt","w")=NULL) cout<<"不能翻開文件"<<endl; if (codef=fopen("codef

37、ile.txt","r")=NULL) cout<<"不能翻開文件"<<endl; char *work,*work2,i2; int i4=0,i,i3; unsigned long length=10000; work=(char*)malloc(length*sizeof(char); fgets(work,length,codef); work2=(char*)malloc(length*sizeof(char); i3=2*n-1; for(i=0;*(work+i-1)!='0'i+) i2=

38、*(work+i); if(HTi3.lchild=0) *(work2+i4)=*(z+i3-1); i4+; i3=2*n-1; i-; else if(i2='0') i3=HTi3.lchild; else if(i2='1') i3=HTi3.rchild; *(work2+i4)='0' fputs(work2,txtfile); cout<<"譯碼完成"<<endl<<"內容寫入根目錄下的文件txtfile.txt中"<<endl<<

39、endl; free(work); free(work2); fclose(txtfile); fclose(codef); 譯碼輸出為:圖3.2.24 圖3.2.24譯碼輸出/-打印編碼的函數(shù)- void Code_printing() cout<<"下面打印根目錄下文件CodePrin.txt中編碼字符"<<endl; FILE * CodePrin,* codefile; if(CodePrin=fopen("CodePrin.txt","w")=NULL) cout<<"不能翻開文

40、件"<<endl; return; if(codefile=fopen("codefile.txt","r")=NULL) cout<<"不能翻開文件"<<endl; return; char *work3; work3=(char*)malloc(51*sizeof(char); do if(fgets(work3,51,codefile)=NULL) cout<<"不能讀取文件"<<endl; break; fputs(work3,CodeP

41、rin); puts(work3); while(strlen(work3)=50); free(work3); cout<<"打印工作結束"<<endl<<endl; fclose(CodePrin); fclose(codefile); 打印編碼為:圖3.2.25 圖3.2.25打印編碼輸出/-打印哈夫曼樹的函數(shù)- void coprint(HuffmanTree start,HuffmanTree HT) if(start!=HT) FILE * TreePrint; if(TreePrint=fopen("TreePri

42、nt.txt","a")=NULL) cout<<"創(chuàng)立文件失敗"<<endl; return; numb+;/該變量為已被聲明為全局變量 coprint(HT+start->rchild,HT); cout<<setw(5*numb)<<start->weight<<endl; fprintf(TreePrint,"%dn",start->weight); coprint(HT+start->lchild,HT); numb-; fclos

43、e(TreePrint); void Tree_printing(HuffmanTree HT,int w) HuffmanTree p; p=HT+w; cout<<"下面打印哈夫曼樹"<<endl; coprint(p,HT); cout<<"打印工作結束"<<endl; 打印哈夫曼樹為:圖3.2.26 圖3.2.26打印哈夫曼樹/- 打印譯碼函數(shù)- void Code_printing1() cout<<"下面打印根目錄下文件txtfile.txt中譯碼字符"<<endl; FILE * CodePrin1,* txtfile; if(CodePrin1=fopen("CodePrin1.txt","w")=NULL) co

溫馨提示

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

評論

0/150

提交評論