




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、.XXX學院本科數(shù)據(jù)結(jié)構(gòu)課程設(shè)計總結(jié)報告 設(shè)計題目:實驗一、哈夫曼編/譯碼器 學生姓名:XXX 系 別:XXX 專 業(yè):XXX 班 級:XXX 學 號:XXX 指導教師:XXX XXX 2012年 6 月 21日xxx學院課 程 設(shè) 計 任 務(wù) 書題目 一、赫夫曼編譯碼器 專業(yè)、班級 xxx 學號 xxx 姓名 xxx 主要內(nèi)容、基本要求、主要參考資料等:1. 主要內(nèi)容利用哈夫曼編碼進行信息通信可大大提高信道利用率,縮短信息傳輸時間,降低傳輸成本。要求在發(fā)送端通過一個編碼系統(tǒng)對待傳數(shù)據(jù)預(yù)先編碼;在接收端將傳來的數(shù)據(jù)進行譯碼(復原)。對于雙工信道(既可以雙向傳輸信息的信道),每端都需要一個完整的
2、編/譯碼系統(tǒng)。試為這樣的信息收發(fā)站寫一個哈夫曼的編/譯碼系統(tǒng)。2. 基本要求 系統(tǒng)應(yīng)具有以下功能:(1)C:編碼(Coding)。對文件tobetrans中的正文進行編碼,然后將結(jié)果存入文件codefile中,將以此建好的哈夫曼樹存入文件HuffmanTree中(2)D:解碼(Decoding)。利用已建好的哈夫曼樹將文件codefile中的代碼進行譯碼,結(jié)果存入textfile中。(3)P:打印代碼文件(Print)。將文件codefile以緊湊格式顯示在終端上,每行50個代碼。同時將此字符形式的編碼文件寫入文件codeprint中。(4)T:打印哈夫曼樹(Tree Printing)。將已
3、在內(nèi)存中的哈夫曼樹以直觀的方式(樹或凹入表形式)顯示在終端上,同時將此字符形式的哈夫曼樹寫入文件treeprint中。3. 參考資料:數(shù)據(jù)結(jié)構(gòu)(C語言版) 嚴蔚敏、吳偉民編著; 數(shù)據(jù)結(jié)構(gòu)標準教程 胡超、閆寶玉編著完 成 期 限: 2012年6月21 日 指導教師簽名: 課程負責人簽名: 2012年 6月 21 日一、設(shè)計題目(任選其一)實驗一、哈夫曼編/譯碼器二、 實驗?zāi)康?鞏固和加深對數(shù)據(jù)結(jié)構(gòu)的理解,提高綜合運用本課程所學知識的能力;2 深化對算法課程中基本概念、理論和方法的理解;3 鞏固構(gòu)造赫夫曼樹的算法;4 設(shè)計試驗用程序?qū)嶒灪辗蚵鼧涞臉?gòu)造。 三、運行環(huán)境(軟、硬件環(huán)境)Windows
4、xp sp3,Visual C+ 6.0英文版四、算法設(shè)計的思想(1)初始化赫夫曼樹,輸入文件tobetrans.txt中各字符及其權(quán)值,并保存于hfmtree.txt文件中(2)編碼(Coding)。對文件tobetrans中的正文進行編碼,然后將結(jié)果存入文件codefile中(3)D:解碼(Decoding)。利用已建好的哈夫曼樹將文件codefile中的代碼進行譯碼,結(jié)果存入textfile中。(4)P:打印代碼文件(Print)。將文件codefile以緊湊格式顯示在終端上,每行50個代碼。同時將此字符形式的編碼文件寫入文件codeprint中。(5)T:打印哈夫曼樹(Tree Pri
5、nting)。將已在內(nèi)存中的哈夫曼樹以直觀的方式顯示在終端上,同時將此字符形式的哈夫曼樹寫入文件treeprint中。五、 流程圖六、 算法設(shè)計分析1.赫夫曼樹節(jié)點的數(shù)據(jù)類型定義為:typedef struct /赫夫曼樹的結(jié)構(gòu)體char ch;int weight; /權(quán)值int parent,lchild,rchild; HTNode,*HuffmanTree;2. void HuffmanCoding(HuffmanTree &,char *,int *,int);建立赫夫曼樹的算法,此函數(shù)塊調(diào)用了Select()函數(shù)。void select(HuffmanTree HT,int
6、 j,int *x,int *y);從已建好的赫夫曼樹中選擇parent為0,weight最小的兩個結(jié)點。3利用已建好的哈夫曼樹從文件hfmtree.txt中讀入,對文件中的正文進行編碼,然后將結(jié)果存入文件codefile.txt中。4. coding 編碼功能:對輸入字符進行編碼5. Decoding譯碼功能: 利用已建好的哈夫曼樹將文件codefile.txt中的代碼進行譯碼,結(jié)果存入文件textfile.txt 中。6. Print() 打印功能函數(shù):輸出哈夫曼樹以及對應(yīng)的編碼。七、源代碼/#include <stdio.h>#include <stdlib.h>
7、#include <string.h>/定義赫夫曼樹結(jié)點的結(jié)構(gòu)體typedef struct char ch; /增加一個域,存放該節(jié)點的字符int weight; int parent,lchild,rchild;HTNode,*HuffmanTree;typedef char *HuffmanCode; /指向赫夫曼編碼的指針void tips(); /打印操作選擇界面void HuffmanCoding(HuffmanTree &,char *,int *,int); /建立赫夫曼樹的算法void select(HuffmanTree HT,int j,int *x,
8、int *y); /從已建好的赫夫曼樹中選擇parent為0,weight最小的兩個結(jié)點void Init(); void Coding(); /編碼void Decoding(); /譯碼void Print_code(); /打印譯碼好的代碼void Print_tree(); /打印哈夫曼樹int Read_tree(HuffmanTree &); /從文件中讀入赫夫曼樹void find(HuffmanTree &HT,char *code,char *text,int i,int m); /譯碼時根據(jù)01字符串尋找相應(yīng)葉子節(jié)點的遞歸算法void Convert_tre
9、e(unsigned char T100100,int s,int *i,int j); /將內(nèi)存中的赫夫曼樹轉(zhuǎn)換成凹凸表形式的赫夫曼樹HuffmanTree HT; /全局變量int n=0; /全局變量,存放赫夫曼樹葉子結(jié)點的數(shù)目int main()char select;while(1) tips(); scanf("%c",&select); switch(select) /選擇操作,根據(jù)不同的序號選擇不同的操作 case '1':Init();break; case '2':Coding();break; case '
10、;3':Decoding();break; case '4':Print_code();break; case '5':Print_tree();break; case '0':exit(1); default :printf("Input error!n"); getchar();return 0;void tips() /操作選擇界面printf(" -n");printf(" - 請選擇操作 -n");printf(" -n");printf("
11、; n");printf(" -1初始化赫夫曼樹 -n");printf(" -2編碼 -n");printf(" -3譯碼 -n");printf(" -4打印代碼文件 -n");printf(" -5打印赫夫曼樹 -n");printf(" -0退出 -n");printf(" -n");/初始化函數(shù),輸入n個字符及其對應(yīng)的權(quán)值,根據(jù)權(quán)值建立哈夫曼樹,并將其存于文件hfmtree中void Init() FILE *fp;int i,n,w5
12、2; /數(shù)組存放字符的權(quán)值char character52; /存放n個字符printf("n輸入字符個數(shù) n:");scanf("%d",&n); /輸入字符集大小printf("輸入%d個字符及其對應(yīng)的權(quán)值:n",n);for (i=0;i<n;i+) char b=getchar(); scanf("%c",&characteri); scanf("%d",&wi); /輸入n個字符和對應(yīng)的權(quán)值 HuffmanCoding(HT,character,w,n);
13、 /建立赫夫曼樹if(fp=fopen("hfmtree.txt","w")=NULL) printf("Open file hfmtree.txt error!n");for (i=1;i<=2*n-1;i+) if(fwrite(&HTi,sizeof(HTNode),1,fp)!=1) /將建立的赫夫曼樹存入文件hfmtree.txt中 printf("File write error!n");printf("n赫夫曼樹建立成功,并已存于文件hfmtree.txt中n");f
14、close(fp);/建立赫夫曼樹的算法void HuffmanCoding(HuffmanTree &HT,char *character,int *w,int n)int m,i,x,y;HuffmanTree p;if(n<=1) return;m=2*n-1;HT=(HuffmanTree)malloc(m+1)*sizeof(HTNode);for(p=HT+1,i=1;i<=n;+i,+p,+character,+w)p->ch=*character;p->weight=*w;p->parent=0;p->lchild=0;p->r
15、child=0;for(;i<=m;+i,+p) p->ch=0;p->weight=0;p->parent=0;p->lchild=0;p->rchild=0;for(i=n+1;i<=m;+i) select(HT,i-1,&x,&y); HTx.parent=i;HTy.parent=i; HTi.lchild=x;HTi.rchild=y; HTi.weight=HTx.weight+HTy.weight;/從HT1到HTj中選擇parent為0,weight最小的兩個結(jié)點,用x和y返回其序號void select(Huffma
16、nTree HT,int j,int *x,int *y)int i;/查找weight最小的結(jié)點for (i=1;i<=j;i+) if (HTi.parent=0) *x=i;break;for (;i<=j;i+) if (HTi.parent=0)&&(HTi.weight<HT*x.weight) *x=i; HT*x.parent=1;/查找weight次小的結(jié)點for (i=1;i<=j;i+) if (HTi.parent=0) *y=i;break;for (;i<=j;i+) if (HTi.parent=0)&&
17、;(i!=*x)&&(HTi.weight<HT*y.weight) *y=i;/對文件tobetrans中的正文進行編碼,然后將結(jié)果存入文件codefile中void Coding() FILE *fp,*fw;int i,f,c,start;char *cd;HuffmanCode HC;if(n=0) n=Read_tree(HT);/從文件hfmtree.txt中讀入赫夫曼樹,返回葉子結(jié)點數(shù)/求赫夫曼樹中各葉子節(jié)點的字符對應(yīng)的的編碼,并存于HC指向的空間中HC=(HuffmanCode)malloc(n+1)*sizeof(char*);cd=(char *)ma
18、lloc(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' HCi=(char *)malloc(n-start)*sizeof(char); strcpy(HCi,&cdstart);free(cd);if(fp=fopen("tobetrans.txt","rb&q
19、uot;)=NULL) printf("Open file tobetrans.txt error!n");if(fw=fopen("codefile.txt","wb+")=NULL) printf("Open file codefile.txt error!n");char temp;fscanf(fp,"%c",&temp); /從文件讀入第一個字符while(!feof(fp) for(i=1;i<=n;i+) if(HTi.ch=temp) break; /在赫夫曼樹中查
20、找字符所在的位置 for(int r=0;HCir!='0'r+) /將字符對應(yīng)的編碼存入文件 fputc(HCir,fw); fscanf(fp,"%c",&temp); /從文件讀入下一個字符fclose(fw);fclose(fp);printf("n已將文件hfmtree.txt成功編碼,并已存入codefile.txt中!nn");/將文件codefile中的代碼進行譯碼,結(jié)果存入文件textfile中void Decoding() FILE *fp,*fw;int m,i;char *code,*text,*p; if
21、(n=0) n=Read_tree(HT);/從文件hfmtree.txt中讀入赫夫曼樹,返回葉子結(jié)點數(shù)if(fp=fopen("codefile.txt","rb")=NULL) printf("Open file codefile.txt error!n"); if(fw=fopen("textfile.txt","wb+")=NULL) printf("Open file textfile.txt error!n");code=(char *)malloc(sizeof
22、(char);fscanf(fp,"%c",code); /從文件讀入一個字符for(i=1;!feof(fp);i+) code=(char *)realloc(code,(i+1)*sizeof(char); /增加空間 fscanf(fp,"%c",&codei); /從文件讀入下一個字符 codei-1='0'/ codefile.txt文件中的字符已全部讀入,存放在code數(shù)組中 text=(char *)malloc(100*sizeof(char);p=text; m=2*n-1;if(*code='0
23、9;) find(HT,code,text,HTm.lchild,m); /從根節(jié)點的左子樹去找else find(HT,code,text,HTm.rchild,m); /從根節(jié)點的右子樹去找 for(i=0;pi!='0'i+) /把譯碼好的字符存入文件textfile.txt中 fputc(pi,fw);fclose(fp);fclose(fw);printf("n已將codefile.txt文件成功譯碼,兵已存入textfile.txt文件!nn");/將文件codefi1e以緊湊格式顯示在終端上,每行50個代碼。同時將此字符形式的編碼文件寫入文件c
24、odeprint中。void Print_code()FILE *fp,*fw;char temp;int i; if(fp=fopen("codefile.txt","rb")=NULL) printf("Open file codefile.txt error!n");if(fw=fopen("codeprint.txt","wb+")=NULL) printf("Open file codeprint.txt error!n");printf("n文件code
25、fi1e顯示如下:n");fscanf(fp,"%c",&temp); /從文件讀入一個字符for (i=1;!feof(fp);i+) printf("%c",temp); if(i%50=0) printf("n"); fputc(temp,fw); /將該字符存入文件codeprint.txt中 fscanf(fp,"%c",&temp); /從文件讀入一個字符printf("nn已將此字符形式的編碼寫入文件codeprint.txt中!nn");fclose(f
26、p);fclose(fw);/將已在內(nèi)存中的哈夫曼樹顯示在屏幕上,并將此字符形式的哈夫曼樹寫入文件treeprint中。void Print_tree()unsigned char T100100;int i,j,m=0;FILE *fp;if(n=0) n=Read_tree(HT); /從文件hfmtree.txt中讀入赫夫曼樹,返回葉子結(jié)點數(shù)Convert_tree(T,0,&m,2*n-1); /將內(nèi)存中的赫夫曼樹轉(zhuǎn)換成凹凸表形式的樹,存于數(shù)組T中if(fp=fopen("treeprint.txt","wb+")=NULL) print
27、f("Open file treeprint.txt error!n"); printf("n打印已建好的赫夫曼樹:n");for(i=1;i<=2*n-1;i+) for (j=0;Tij!=0;j+) if(Tij=' ') printf(" ");fputc(Tij,fp); else printf("%d",Tij);fprintf(fp,"%dn",Tij); printf("n");fclose(fp);printf("n已將該字符
28、形式的哈夫曼樹寫入文件treeprint.txt中!nn");/從文件hfmtree.txt中讀入赫夫曼樹,返回葉子節(jié)點數(shù)int Read_tree(HuffmanTree &HT) FILE *fp;int i,n;HT=(HuffmanTree)malloc(sizeof(HTNode); if(fp=fopen("hfmtree.txt","r")=NULL) printf("Open file hfmtree.txt error!n");for (i=1;!feof(fp);i+) HT=(HuffmanTr
29、ee)realloc(HT,(i+1)*sizeof(HTNode); /增加空間 fread(&HTi,sizeof(HTNode),1,fp); /讀入一個節(jié)點信息fclose(fp);n=(i-1)/2;return n;/譯碼時根據(jù)01字符串尋找相應(yīng)葉子節(jié)點的遞歸算法void find(HuffmanTree &HT,char *code,char *text,int i,int m)if(*code!='0') /若譯碼未結(jié)束 code+; if(HTi.lchild=0&&HTi.rchild=0) /若找到葉子節(jié)點 *text=HT
30、i.ch; /將葉子節(jié)點的字符存入text中 text+; if(*code='0') find(HT,code,text,HTm.lchild,m); /從根節(jié)點的左子樹找 else find(HT,code,text,HTm.rchild,m); /從根節(jié)點的右子樹找 else /如果不是葉子節(jié)點 if(*code='0') find(HT,code,text,HTi.lchild,m); /從該節(jié)點的左子樹去找 else find(HT,code,text,HTi.rchild,m); /從該節(jié)點的右子樹去找else *text='0' /
31、譯碼結(jié)束/將文件中的赫夫曼樹轉(zhuǎn)換成凹凸表形式的赫夫曼樹打印出來void Convert_tree(unsigned char T100100,int s,int *i,int j)int k,l;l=+(*i);for(k=0;k<s;k+) Tlk=' 'Tlk=HTj.weight;if(HTj.lchild) Convert_tree(T,s+1,i,HTj.lchild);if(HTj.rchild) Convert_tree(T,s+1,i,HTj.rchild); Tl+k='0'/八、運行結(jié)果分析截圖說明:1、運行后界面如圖(1):圖(1)選
32、擇要選擇的操作序號可以運行各個步驟;2、初始化赫夫曼樹:輸入tobetrans.txt中各元素及其出現(xiàn)頻率,如圖(2)圖(2)3、編碼及譯碼,如圖(3)圖(3)4、打印編碼文件,如圖(4)圖(4)5、打印赫夫曼樹,如圖(5)圖(5)6、各步驟所存的文件內(nèi)容如圖(6)圖(6)九、收獲及體會課程設(shè)計是讓我們充分利用我們專業(yè)課程所學知識的機會,也是我們邁向社會,從事工作前一個必不少的過程。通過這次課程設(shè)計,我深深體會到將知識運用到實踐中的重要作用。我這兩天的課程設(shè)計,是讓我學會腳踏實地邁開這一步,也是為明天能穩(wěn)健地在社會大潮中奔跑打下堅實的基礎(chǔ)。我的課程設(shè)計題目是赫夫曼編譯碼器。最初做這個程序的時候
33、,讓我覺得完成這次程序設(shè)計真的是太難了,然后我查閱了課本,并去圖書館借了資料,在寫這個程序的時候也參考了網(wǎng)上的設(shè)計流程,寫完剛運行時出現(xiàn)了很多問題。尤其是編碼錯誤,導致內(nèi)存無法read,通過同組人員的交流請教,逐漸明白過來,然后經(jīng)過不知道多少次修改才順利運行。本次試驗也讓我明白了理論與實際相結(jié)合的重要性,并提高了自己組織數(shù)據(jù)及編寫大型程序的能力,培養(yǎng)了基本的、良好的程序設(shè)計技能以及合作能力。 通過對各個步驟各個流程的控制,逐漸讓我產(chǎn)生了興趣,在實際編寫過程中,和同學們相互討論讓我學到的不僅僅是一些解決問題的方法,更是解決問題的思想。課程設(shè)計本身也是一種相互學習的過程,/ #include &l
34、t;stdio.h>#include <stdlib.h> /為exit()提供原型#include <string.h>/哈夫曼樹結(jié)點的結(jié)構(gòu)typedef struct char ch; /該字符域用于存放節(jié)點的關(guān)鍵字int weight;int parent, lchild, rchild;HTNode, *HuffmanTree; /動態(tài)分配數(shù)組存儲哈夫曼樹typedef char *HuffmanCode; /動態(tài)分配數(shù)組存儲哈夫曼編碼表void Menu(); /顯示菜單void HuffmanCoding(HuffmanTree &HT, ch
35、ar *character, int * w, int n); /建立哈夫曼樹void select(HuffmanTree HT, int j, int *x, int *y); /從已建好的赫夫曼樹中選擇parent為0,weight最小的兩個結(jié)點void Init();void Coding(); /編碼void Decoding(); /譯碼void Print_code(); /打印譯碼好的代碼void Print_tree(); /打印哈夫曼樹int Read_tree(HuffmanTree &); /從文件中讀入赫夫曼樹void find(HuffmanTree &am
36、p;HT, char *code, char *text, int i, int m); /譯碼時根據(jù)01字符串尋找相應(yīng)葉子節(jié)點的遞歸算法void Convert_tree(unsigned char T100100, int s, int *i, int j); /將內(nèi)存中的赫夫曼樹轉(zhuǎn)換成凹凸表形式的赫夫曼樹HuffmanTree HT; /全局變量int n = 0; /全局變量,存放赫夫曼樹葉子結(jié)點的數(shù)目int main()char select;while (1)Menu();scanf("%c", &select);switch (select) /選擇操
37、作,根據(jù)不同的序號選擇不同的操作case '1':Init();break;case '2':Coding();break;case '3':Decoding();break;case '4':Print_code();break;case '5':Print_tree();break;case '0':exit(1);default:printf("Input error!n");getchar();return 0;void Menu() /操作選擇界面printf(&quo
38、t; -n");printf(" - 請選擇操作 -n");printf(" -n");printf(" n");printf(" -1初始化赫夫曼樹 -n");printf(" -2編碼 -n");printf(" -3譯碼 -n");printf(" -4打印代碼文件 -n");printf(" -5打印赫夫曼樹 -n");printf(" -0退出 -n");printf(" -n"
39、;);/初始化函數(shù),輸入n個字符及其對應(yīng)的權(quán)值,根據(jù)權(quán)值建立哈夫曼樹,并將其存于文件hfmtree中void Init()FILE *fp;int i, n, w52; /數(shù)組存放字符的權(quán)值char character52; /存放n個字符printf("n輸入字符個數(shù) n:");scanf("%d", &n); /輸入字符集大小printf("輸入%d個字符及其對應(yīng)的權(quán)值:n", n);for (i = 0; i<n; i+)char b = getchar();scanf("%c", &c
40、haracteri);scanf("%d", &wi); /輸入n個字符和對應(yīng)的權(quán)值HuffmanCoding(HT, character, w, n); /建立赫夫曼樹if (fp = fopen("hfmtree.txt", "w") = NULL)printf("Open file hfmtree.txt error!n");for (i = 1; i <= 2 * n - 1; i+)if (fwrite(&HTi, sizeof(HTNode), 1, fp) != 1) /將建立的
41、赫夫曼樹存入文件hfmtree.txt中printf("File write error!n");printf("n赫夫曼樹建立成功,并已存于文件hfmtree.txt中n");fclose(fp);/構(gòu)造哈夫曼樹的算法void HuffmanCoding(HuffmanTree &HT, char *character, int * w, int n) /w存放n個字符的權(quán)值(均>0),構(gòu)造哈夫曼樹HTint m, i, x, y;HuffmanTree p;if (n <= 1) return;m = 2 * n - 1;HT =
42、 (HuffmanTree)malloc(m + 1) * sizeof(HTNode); for (p = HT + 1, i = 1; i <= n; +i, +p, +character, +w)p->ch = *character; p->weight = *w; p->parent = 0; p->lchild = 0; p->rchild = 0;for (; i <= m; +i, +p) p->ch = 0; p->weight = 0; p->parent = 0; p->lchild = 0; p->r
43、child = 0; for (i = n + 1; i <= m; +i)select(HT, i - 1, &x, &y);HTx.parent = i; HTy.parent = i;HTi.lchild = x; HTi.rchild = y;HTi.weight = HTx.weight + HTy.weight;/從HT1到HTj中選擇parent為0,weight最小的兩個結(jié)點,用x和y返回其序號void select(HuffmanTree HT, int j, int *x, int *y)int i;/查找weight最小的結(jié)點for (i = 1;
44、i <= j; i+)if (HTi.parent = 0)*x = i; break;for (; i <= j; i+)if (HTi.parent = 0) && (HTi.weight<HT*x.weight)*x = i;HT*x.parent = 1;/查找weight次小的結(jié)點for (i = 1; i <= j; i+)if (HTi.parent = 0)*y = i; break;for (; i <= j; i+)if (HTi.parent = 0) && (i != *x) && (HTi.
45、weight<HT*y.weight)*y = i;/對文件tobetrans中的正文進行編碼,然后將結(jié)果存入文件codefile中void Coding()FILE *fp, *fw;int i, f, c, start;char *cd;HuffmanCode HC;if (n = 0)n = Read_tree(HT);/從文件hfmtree.txt中讀入赫夫曼樹,返回葉子結(jié)點數(shù) /求赫夫曼樹中各葉子節(jié)點的字符對應(yīng)的的編碼,并存于HC指向的空間中HC = (HuffmanCode)malloc(n + 1) * sizeof(char*);cd = (char *)malloc(n
46、 * 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'HCi = (char *)malloc(n - start) * sizeof(char);strcpy(HCi, &cdstart);free(cd);if (fp = fopen(
47、"tobetrans.txt", "rb") = NULL)printf("Open file tobetrans.txt error!n");if (fw = fopen("codefile.txt", "wb+") = NULL)printf("Open file codefile.txt error!n");char temp;fscanf(fp, "%c", &temp); /從文件讀入第一個字符while (!feof(fp)for (i
48、 = 1; i <= n; i+)if (HTi.ch = temp) break; /在赫夫曼樹中查找字符所在的位置for (int r = 0; HCir != '0' r+) /將字符對應(yīng)的編碼存入文件fputc(HCir, fw);fscanf(fp, "%c", &temp); /從文件讀入下一個字符fclose(fw);fclose(fp);printf("n已將文件hfmtree.txt成功編碼,并已存入codefile.txt中!nn");/將文件codefile中的代碼進行譯碼,結(jié)果存入文件textfile
49、中void Decoding()FILE *fp, *fw;int m, i;char *code, *text, *p;if (n = 0)n = Read_tree(HT);/從文件hfmtree.txt中讀入赫夫曼樹,返回葉子結(jié)點數(shù)if (fp = fopen("codefile.txt", "rb") = NULL)printf("Open file codefile.txt error!n");if (fw = fopen("textfile.txt", "wb+") = NULL)p
50、rintf("Open file textfile.txt error!n");code = (char *)malloc(sizeof(char);fscanf(fp, "%c", code); /從文件讀入一個字符for (i = 1; !feof(fp); i+)code = (char *)realloc(code, (i + 1) * sizeof(char); /增加空間fscanf(fp, "%c", &codei); /從文件讀入下一個字符 codei - 1 = '0'/ codefile.t
51、xt文件中的字符已全部讀入,存放在code數(shù)組中text = (char *)malloc(100 * sizeof(char);p = text;m = 2 * n - 1;if (*code = '0')find(HT, code, text, HTm.lchild, m); /從根節(jié)點的左子樹去找elsefind(HT, code, text, HTm.rchild, m); /從根節(jié)點的右子樹去找for (i = 0; pi != '0' i+) /把譯碼好的字符存入文件textfile.txt中fputc(pi, fw);fclose(fp);fclose(fw);printf("n已將codefile.txt文件成功譯碼,兵已存入textfile.txt文件!nn");/將文件codefi1e以緊湊格式顯示在終端上,每行50個代碼。同時將此字符形式的編
溫馨提示
- 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. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五單位的聘用合同
- 變配電施工合同范例二零二五年
- 二零二五茶園承包經(jīng)營合同范例
- 保密合同書模板
- 店鋪轉(zhuǎn)讓協(xié)議書常用范例二零二五年
- 聘用美容師合同范例
- 二零二五公司辦公場所轉(zhuǎn)租合同范例
- 2025借款擔保合同范本
- 小學生防欺凌班會課件
- 2025年塑鋼窗安裝工程合同
- 2023年最新的雷雨劇本 雷雨劇本第三幕
- GB∕T 28897-2021 流體輸送用鋼塑復合管及管件
- 小學五年級語文上冊我愛你漢字課件ppt
- 人教版三年級美術(shù)下冊 第10課 快樂的節(jié)日 課件(18ppt)
- 中學生安全教育優(yōu)質(zhì)實用課件(共54張PPT)
- 私募股權(quán)投資基金研究報告(131張幻燈片)課件
- 陳氏十八式太極拳教案
- 紅色卡通風區(qū)三好學生競選演講圖文PPT教學課件
- 北京市統(tǒng)一醫(yī)療服務(wù)收費標準(大紅本)
- 經(jīng)緯度數(shù)轉(zhuǎn)換工具
- 導向系統(tǒng)設(shè)計(課堂PPT)
評論
0/150
提交評論