




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、華北科技學院 用哈夫曼編碼實現文件壓縮實驗報告用哈夫曼編碼實現文件壓縮實 驗 報 告課程名稱 數據結構B 實驗學期 2012 至 2013 學年 第 一 學期學生所在系部 計算機學院 年級 2011 專業班級 信管B111 學生姓名 學號 任課教師 蘭蕓 實驗成績 一、實驗題目:用哈夫曼編碼實現文件壓縮二、實驗目的:1、 了解文件的概念。2、 掌握線性鏈表的插入、刪除等算法。3、掌握Huffman樹的概念及構造方法。4、掌握二叉樹的存儲結構及遍歷算法。5、利用Huffman樹及Huffman編碼,掌握實現文件壓縮的一般原理。三、實驗設備與環境:微型計算機、Windows 系列操作系統 、Vis
2、ual C+6.0軟件四、實驗內容:根據ascii碼文件中各ascii字符出現的頻率情況創建Haffman樹,再將各字符對應的哈夫曼編碼寫入文件中,實現文件壓縮。五、概要設計:(1)構造Hufffman樹的方法Hufffman算法構造Huffman樹步驟:I. 根據給定的n個權值w1,w2,wn,構造n棵只有根結點的二叉樹,令起權值為wj。II. 在森林中選取兩棵根結點權值最小的樹作左右子樹,構造一棵新的二叉樹,置新二叉樹根結點權值為其左右子樹根結點權值之和。III. 在森林中刪除這兩棵樹,同時將新得到的二叉樹加入森林中。IV. 重復上述兩步,直到只含一棵樹為止,這棵樹即哈夫曼樹。(2)Huf
3、fman編碼:數據通信用的二進制編碼思想:根據字符出現頻率編碼,使電文總長最短編碼:根據字符出現頻率構造Huffman樹,然后將樹中結點引向其左孩子的分支標“0”,引向其右孩子的分支標“1”;每個字符的編碼即為從根到每個葉子的路徑上得到的0、1序列。(3) 解壓 根據存放在文件中的編碼表和文件壓縮后的編碼,進行一對一的翻譯過程。六、詳細設計: 壓縮的代碼#include #include #include #include struct head unsigned char b; /*the charactor*/ long count; /*the frequency*/ long pare
4、nt,lch,rch; /*make a tree*/ char bits256; /*the haffuman code*/ header512,tmp; void yasuo() /*壓縮*/ char filename255,outputfile255,buf512; unsigned char c; char wenjianming255; long i,j,m,n,f; long min1,pt1,flength; FILE *ifp,*ofp; printf(輸入文件地址及文件名:); gets(filename); ifp=fopen(filename,rb); /*打開源文件*
5、/while(ifp=NULL) printf(打開文件出錯n); printf(重新輸入文件地址及文件名); gets(filename); ifp=fopen(filename,rb); printf(輸入壓縮后的文件地址和文件名及后綴:); gets(wenjianming); ofp=fopen(wenjianming,wb); /*創建并打開目的文件*/while(ofp=NULL)printf(重新輸入壓縮后的文件地址和文件名及后綴:); ofp=fopen(wenjianming,wb); flength=0; while(!feof(ifp) /*讀取ifp文件*/ fread
6、(&c,1,1,ifp); /*按位讀取*/ headerc.count+; flength+; flength-1; headerc.count-1; /*讀取文件結束*/ for(i=0;i512;i+) /*構造哈弗曼樹*/ if(headeri.count!=0) headeri.b=(unsigned char)i; else headeri.b=0; headeri.parent=-1; headeri.lch=headeri.rch=-1; for(i=0;i256;i+) for(j=i+1;j256;j+) if(headeri.countheaderj.count) tmp
7、=headeri; headeri=headerj; headerj=tmp; for(i=0;i256;i+) if(headeri.count=0) break; n=i; m=2*n-1; for(i=n;im;i+) min1=999999999; for(j=0;jheaderj.count) pt1=j; min1=headerj.count; continue; headeri.count=headerpt1.count; headerpt1.parent=i; headeri.lch=pt1; min1=999999999; for(j=0;jheaderj.count) pt
8、1=j; min1=headerj.count; continue; headeri.count+=headerpt1.count; headeri.rch=pt1; headerpt1.parent=i; for(i=0;in;i+) f=i; headeri.bits0=0; while(headerf.parent!=-1) j=f; f=headerf.parent; if(headerf.lch=j) j=strlen(headeri.bits); memmove(headeri.bits+1,headeri.bits,j+1); headeri.bits0=0; else j=st
9、rlen(headeri.bits); memmove(headeri.bits+1,headeri.bits,j+1); headeri.bits0=1; /*哈弗曼構造結束*/ fseek(ifp,0,SEEK_SET); /*把文件指針指向文件的開頭*/ fwrite(&flength,sizeof(int),1,ofp); /把哈弗曼代碼寫入ofp文件 fseek(ofp,8,SEEK_SET); buf0=0; f=0; pt1=8; while(!feof(ifp) c=fgetc(ifp); /從流中讀取一個字符,并增加文件指針的位置 f+; for(i=0;i=8) for(i
10、=0;i8;i+) if(bufi=1) c=(c1)|1; else c=c0) strcat(buf,00000000); for(i=0;i8;i+) if(bufi=1) c=(c1)|1; else c=c1; fwrite(&c,1,1,ofp); pt1+; fseek(ofp,4,SEEK_SET); /*fseek 用于二進制方式打開的文件,移動文件讀寫指針位置.第一個是文件流,第3個是指針零點位置,第2個是把指針移動到的地點. */ fwrite(&pt1,sizeof(long),1,ofp); /*是要輸出數據的地址,每次寫入的位數,數據項的個數,目標文件地址*/ fs
11、eek(ofp,pt1,SEEK_SET); fwrite(&n,sizeof(long),1,ofp); for(i=0;in;i+) fwrite(&(headeri.b),1,1,ofp); c=strlen(headeri.bits); fwrite(&c,1,1,ofp); j=strlen(headeri.bits); if(j%8!=0) /*按八位讀取*/ for(f=j%8;f8;f+) strcat(headeri.bits,0); while(headeri.bits0!=0) c=0; for(j=0;j8;j+) if(headeri.bitsj=1) c=(c1)|
12、1; else c=c1; strcpy(headeri.bits,headeri.bits+8); /*把從headeri.bits+8地址開始且含有NULL結束符的字符串賦值到以headeri.bits開始的地址空間 */ fwrite(&c,1,1,ofp); fclose(ifp); fclose(ofp); printf(壓縮成功n); void main() /*主函數*/printf(輸入a開始壓縮n);printf(輸入b結束壓縮n);while(1)char c; c=getch(); if(c=a) yasuo(); else if(c=b) return;壓縮的圖解解壓的
13、代碼#include #include #include #include struct head unsigned char b; /*the charactor*/ long count; /*the frequency*/ long parent,lch,rch; /*make a tree*/ char bits256; /*the haffuman code*/ header512,tmp; void jieya() /*解壓*/ char filename255,outputfile255,buf255,bx255; unsigned char c; char wenjianmin
14、g255; long i,j,m,n,f,p,l; long flength; FILE *ifp,*ofp; printf(要解壓的文件:); gets(filename); ifp=fopen(filename,rb); /*打開源文件*/while(ifp=NULL) printf(打開文件出錯n); printf(重新輸入文件地址及文件名); gets(filename); ifp=fopen(filename,rb); printf(輸入解壓后的文件地址和文件名及后綴:); gets(wenjianming); ofp=fopen(wenjianming,wb); /*創建并打開目的
15、文件*/while(ofp=NULL) ofp=fopen(d:123解壓的文件.txt,wb); fread(&flength,sizeof(long),1,ifp); fread(&f,sizeof(long),1,ifp); fseek(ifp,f,SEEK_SET); fread(&n,sizeof(long),1,ifp); for(i=0;i0) m=p/8+1; else m=p/8; for(j=0;jf;l-) strcat(headeri.bits,0); strcat(headeri.bits,buf); headeri.bitsp=0; for(i=0;in;i+) f
16、or(j=i+1;jstrlen(headerj.bits) tmp=headeri; headeri=headerj; headerj=tmp; p=strlen(headern-1.bits); fseek(ifp,8,SEEK_SET); m=0; bx0=0; while(1) while(strlen(bx)f;l-) strcat(bx,0); strcat(bx,buf); for(i=0;in;i+) if(memcmp(headeri.bits,bx,headeri.count)=0) break; strcpy(bx,bx+headeri.count); c=headeri.b; fwrite(&c,1,1,ofp); m+; if(m=flength) break; fclose(ifp); fclose(ofp); printf(解壓成功n); return;
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 優化招聘流程的策略與實施計劃
- 優化資源配置的年度工作計劃
- 為法學概論加分的試題及答案
- 2024年黑龍江建華區公益性崗位招聘筆試真題
- 2024年安徽相山水泥公司招聘筆試真題
- 法學概論考試形式與內容的結合研究試題及答案
- 軟件設計師常考技能解析與試題及答案
- 河南省新鄉市部分重點中學2025屆七下數學期末統考模擬試題含解析
- 私募股權投資中的風險評估和管理試題及答案
- 界面用戶反饋收集試題及答案
- SWOT分析法很全面課件
- 膀胱造瘺的護理課件
- 基坑工程施工驗收記錄表
- 消防應急疏散演練人員簽到表(標準通用版)
- 微生物實驗室病原微生物評估報告
- 陜旅版五年級英語上冊句型詞匯知識點總結
- 漢字構字的基本原理和識字教學模式分析
- RouterOS介紹
- 十字軸鍛造成型工藝及模具設計畢業論文
- 主體結構監理實施細則范本
- 控制性詳細規劃 - 寧波市規劃局
評論
0/150
提交評論