-
大小: 29.27MB文件類型: .zip金幣: 1下載: 0 次發(fā)布日期: 2023-08-03
- 語言: 其他
- 標(biāo)簽: 數(shù)據(jù)結(jié)構(gòu)??赫夫曼??二叉樹??
資源簡介
這是武漢理工大學(xué)計算機學(xué)院數(shù)據(jù)結(jié)構(gòu)與算法綜合實驗課程的第一次實驗:二叉樹與赫夫曼圖片壓縮實踐的源代碼。運行環(huán)境:VS2017。
代碼片段和文件信息
#include?
#include?
#include?“Compress.h“
#include“Huffman.h“
using?namespace?std;
#define?OK?1
#define?ERROR?0
const?int?SIZE?=?256;
//掃描文件和初始化頭文件的信息
int?InitHead(const?char?*?pFilname?HEAD?&?sHead)
{
strcpy(sHead.type?“HUF“); //文件類型
sHead.length?=?0; //源文件長度
for?(int?i?=?0;?i? {
sHead.weight[i]?=?0; //權(quán)值
}
//以二進制流形式打開文件
FILE?*in?=?fopen(pFilname?“rb“);
//掃描文件,獲得權(quán)重
int?ch;
while?((ch?=?fgetc(in))?!=?EOF)
{
sHead.weight[ch]++;
sHead.length++;
}
//關(guān)閉文件
fclose(in);
in?=?NULL;
return?OK;
}
//得到編碼文件
int?Compress(const?char?*?pFilename)
{
/**************************************************/
//打開并掃描文件
cout?<“正在讀取文件……“?< int?weight[256]?=?{?0?};??//打開文件,獲取權(quán)重
FILE*?in?=?fopen(pFilename?“rb“);
int?tempch;
while?((tempch?=?getc(in))?!=?EOF)
{
weight[tempch]++;
}
//測試掃描結(jié)果:顯示256種字節(jié)出現(xiàn)的次數(shù)
//if?(TestWeight(weight))
// cout?<“測試完畢?。?!“?<
cout?<“文件讀取完畢!\n正在關(guān)閉文件!“?< fclose(in);
/**************************************************/
//將編碼生成Huffman樹
int?i;
int?n?=?256; //Huffman樹共有n個葉子節(jié)點
int?m?=?2?*?n?-?1; //那么就有2n+1個節(jié)點
HuffmanTree?pHT?=?new?HTNode[m?+?1]; //定義Huffman樹
CreateHuffmanTree(pHTweightn);
// cout?<“測試生成的Huffman樹“?<// if?(TestHufTree(pHT))
// cout?<“測試完畢!“?<
//生成Huffman編碼
char**?pHC?=?new?char*[n?+?1];?//編碼
for?(int?i?=?1;?i?<=?n;?i++)
pHT[i].weight?=?weight[i?-?1];
// cout?<“測試生成的Huffman樹“?< //測試生成的Huffman樹
// if?(TestHufTree(pHT))
// cout?<“測試完畢!“?<
HuffmanCoding(pHC?pHT);
/**************************************************/
//計算編碼緩沖區(qū)大小
int?nSize?=?0;
for?(int?i?=?0;?i?256;?i++)
nSize?+=?weight[i]?*?strlen(pHC[i?+?1]);
nSize?=?(nSize?%?8)???nSize?/?8?+?1?:?nSize?/?8;
//對編碼文件進行壓縮
char?*pBuffer?=?NULL;
pBuffer?=?new?char[nSize];
memset(pBuffer?0?(nSize)?*?sizeof(char));
Encode(pFilename?pHC?pBuffer?nSize);
if?(!pBuffer)?{
return?ERROR;
}
HEAD?sHead;
InitHead(pFilename?sHead);
cout?<“目標(biāo)文件大?。骸?< int?afterlen?=?WriteFile(pFilename?sHead?pBuffer?nSize);
cout?<“壓縮文件大小:“?< cout?<“壓縮比率:“?<(double)afterlen?*?100?/?sHead.length?<“%“?<
delete?pHT;?delete[]?pHC;?delete?pBuffer;
return?OK;
}
//實現(xiàn)壓縮編碼
int?Encode(const?char?*?pFilname?const?HuffmanCode?pHC?char?*?pBuffer?const?int?nSize)
{
//打開文件
FILE?*in?=?fopen(pFilname?“rb“);
//開辟緩沖區(qū)ni
pBuffer?=?(char?*)malloc(nSize?*?sizeof(char));
if?(!pBuffer)
{
cout?<“開辟緩沖區(qū)失敗“?< }
char?cd[SIZE]?=?{?0?}; //工作區(qū)
int?pos?=?0; //緩沖區(qū)指針
int?ch;
//掃描文件
while?((ch?=?fgetc(in))?!=?EOF)
{
strcat(cd?pHC[ch?+?1]);
//壓縮編碼
while?(strlen(cd)?>=?8)
{
pBuffer[pos++]?=?Str2byte(cd);
for?(int?i?=?0;?i
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????目錄???????????0??2018-05-08?20:41??HfmCompressCPro\
?????目錄???????????0??2018-05-08?20:41??HfmCompressCPro\.vs\
?????目錄???????????0??2018-05-08?20:41??HfmCompressCPro\.vs\HfmCompressCPro\
?????目錄???????????0??2018-05-08?20:44??HfmCompressCPro\.vs\HfmCompressCPro\v15\
?????文件???????54784??2018-05-08?20:44??HfmCompressCPro\.vs\HfmCompressCPro\v15\.suo
?????文件?????5242880??2018-05-08?20:44??HfmCompressCPro\.vs\HfmCompressCPro\v15\Browse.VC.db
?????目錄???????????0??2018-05-08?20:41??HfmCompressCPro\.vs\HfmCompressCPro\v15\ipch\
?????文件????25755648??2018-05-02?18:10??HfmCompressCPro\.vs\HfmCompressCPro\v15\ipch\54987a9fdebad512.ipch
?????目錄???????????0??2018-05-08?20:42??HfmCompressCPro\.vs\HfmCompressCPro\v15\ipch\AutoPCH\
?????目錄???????????0??2018-05-08?20:41??HfmCompressCPro\.vs\HfmCompressCPro\v15\ipch\AutoPCH\134c91a43b40e1b5\
?????文件????26148864??2018-05-08?20:39??HfmCompressCPro\.vs\HfmCompressCPro\v15\ipch\AutoPCH\134c91a43b40e1b5\COMPRESS.ipch
?????目錄???????????0??2018-05-08?20:41??HfmCompressCPro\.vs\HfmCompressCPro\v15\ipch\AutoPCH\53b7047aad3a8af8\
?????文件????26476544??2018-05-08?20:39??HfmCompressCPro\.vs\HfmCompressCPro\v15\ipch\AutoPCH\53b7047aad3a8af8\MAIN.ipch
?????目錄???????????0??2018-05-08?20:42??HfmCompressCPro\.vs\HfmCompressCPro\v15\ipch\AutoPCH\84b2b339d31b66c8\
?????文件????26476544??2018-05-08?20:43??HfmCompressCPro\.vs\HfmCompressCPro\v15\ipch\AutoPCH\84b2b339d31b66c8\MAIN.ipch
?????目錄???????????0??2018-05-08?20:41??HfmCompressCPro\.vs\HfmCompressCPro\v15\ipch\AutoPCH\fd150ae0430a3a5c\
?????文件????26148864??2018-05-08?20:30??HfmCompressCPro\.vs\HfmCompressCPro\v15\ipch\AutoPCH\fd150ae0430a3a5c\HUFFMAN.ipch
?????文件????26345472??2018-05-07?18:09??HfmCompressCPro\.vs\HfmCompressCPro\v15\ipch\dcdbf1051398cea6.ipch
?????目錄???????????0??2018-05-08?20:42??HfmCompressCPro\Debug\
?????文件???????75776??2018-05-08?20:42??HfmCompressCPro\Debug\HfmCompressCPro.exe
?????文件??????492148??2018-05-08?20:42??HfmCompressCPro\Debug\HfmCompressCPro.ilk
?????文件??????610304??2018-05-08?20:42??HfmCompressCPro\Debug\HfmCompressCPro.pdb
?????目錄???????????0??2018-05-08?20:41??HfmCompressCPro\HfmCompressCPro\
?????文件????????4456??2018-05-08?20:36??HfmCompressCPro\HfmCompressCPro\Compress.cpp
?????文件?????????716??2018-05-08?17:11??HfmCompressCPro\HfmCompressCPro\Compress.h
?????目錄???????????0??2018-05-08?20:42??HfmCompressCPro\HfmCompressCPro\Debug\
?????文件???????61612??2018-05-08?20:42??HfmCompressCPro\HfmCompressCPro\Debug\Compress.obj
?????文件?????????455??2018-05-08?20:42??HfmCompressCPro\HfmCompressCPro\Debug\HfmCompressCPro.log
?????目錄???????????0??2018-05-08?20:42??HfmCompressCPro\HfmCompressCPro\Debug\HfmCompressCPro.tlog\
?????文件????????2766??2018-05-08?20:42??HfmCompressCPro\HfmCompressCPro\Debug\HfmCompressCPro.tlog\CL.command.1.tlog
?????文件???????54354??2018-05-08?20:42??HfmCompressCPro\HfmCompressCPro\Debug\HfmCompressCPro.tlog\CL.read.1.tlog
............此處省略19個文件信息
評論
共有 條評論