資源簡介
哈夫曼編碼(壓縮文件),c/c++課程設計,附帶程序運行用例以及講解答辯PPT,程序清晰易懂

代碼片段和文件信息
#include??
?#include
#define?ASCIIL?256??
#define?F(x)?((x-1)>>1)???
#define?L(x)?((x<<1)+1)??
#define?R(x)?((x<<1)+2)??
#define?SWAP(abtmp)?{tmp=a;a=b;b=tmp;}??
??
using?namespace?std;??
??
//實現二叉堆模板類,小頂堆??
template???
class?CHeap??
{??
????HeapType?*datatmp;??
????int?size;??
??????
????void?HeapUp(int?ix)??
????{//自底向頂維護堆??
????????int?f;??
????????for(f=F(ix);ix&&data[ix]????????????SWAP(data[ix]data[f]tmp);??
????}??
??????
????void?HeapDown(int?ix)??
????{//自頂向底維護堆??
????????int?lrt;??
????????HeapType?mintmp;??
????????if(ix>=size)?return?;??
????????l=L(ix)r=R(ix);??
??????????
????????min=data[ix]t=ix;??
??????????
????????if(l ????????????t=lmin=data[l];??
????????if(r ????????????t=rmin=data[l];??
??????????
????????SWAP(data[ix]data[t]tmp);??
????????if(ix!=t)?HeapDown(t);??
????}??
??????
public:??
????CHeap()??
????{//這里特殊應用,堆內元素個數不超過256??
????????size=0;??
????????data=new?HeapType[256];??
????}??
????~CHeap()??
????{//釋放內存??
????????delete?[]?data;??
??
????}??
????int?getsize()??
????{//返回堆大小??
????????return?size;??
????}??
????void?clear()??
????{//清空堆??
????????size=0;??
????}??
????void?insert(HeapType?e)??
????{//向堆尾中插入元素,并向頂維護堆??
????????data[size++]=e;??
????????HeapUp(size-1);??
????}??
????HeapType?top()??
????{//從堆頂取出元素,并向底維護堆??
????????HeapType?ret=data[0];??
????????data[0]=data[--size];??
????????HeapDown(0);return?ret;??
????}??
};??
??
//哈夫曼樹結點結構體實現??
typedef?struct?talNode{??
??????
????unsigned?char?c;????//葉結點時對應ASCII值??
????int?weight;?????????//該結點權值??
????int?ltrt;??????????//左、右結點下標??
??????
????talNode(){}??
??????
????talNode(unsigned?char?_cint?_p):??
????c(_c)weight(_p)lt(-1)rt(-1)??
????{}??
??????
????talNode(unsigned?char?_cint?_pint?lint?r)??
????????:c(_c)weight(_p)lt(l)rt(r)??
????{}??
??????
????bool?operator?(talNode?a)??
????{//重載運算符“<”用于二叉堆內的比較??
????????return?weight ????}??
??????
}HuffNode;??
??
??
??
class?CHuffMan{??
????HuffNode?arr[512];??????//哈夫曼樹結點數組??
????int?size;???????????????//哈夫曼樹結點個數??
????bool?code[256][64];?????//ASCII對應編碼方案??
????int?lenth[256];?????????//ASCII對應編碼長度??
??
????//lastcodelenthps[256]用于存儲壓縮文件中作為文件頭??
????int?lastcodelenth;??????//文件最后一個字符實用幾位??
????int?ps[256];????????????//ASCII對應出現頻率??
????int?soucelentargetlen;?//源及目標文件長度??
??
??
????//私有成員函數,用于實現內部功能??
????void?SetHuffTree(int?[]);???????????//根據字符頻率生成哈夫曼樹??
????void?SetHuffCode(int?bool?[]int?);//根據哈夫曼樹生成編碼方案??
????void?CreateHuff(int?[]);????????????//創建哈夫曼樹及編碼方案??
????void?EnCodePre(char?[]);????????????//壓縮前預處理??
????void?DeCodePre(FILE?*);?????????????//解壓前預處理??
????void?SaveHuffHead(FILE?*);??????????//保存壓縮文件頭??
????void?ReadHuffHead(FILE?*);??????????//讀取壓縮文件頭??
??
public:??
????CHuffMan(){Clear();}????????????????//構造函數??
????~CHuffMan
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件???????4546??2018-05-23?10:36??哈夫曼\1234.txt
?????文件???????3490??2018-05-29?20:55??哈夫曼\2345.huf
?????文件???????4546??2018-05-29?21:05??哈夫曼\3456.txt
?????文件?????905247??2018-05-23?11:25??哈夫曼\信息化教學設計ppt模板(2)(1).pptx
?????文件??????14451??2018-05-23?10:26??哈夫曼\壓縮文件(哈夫曼樹).cpp
?????文件????1943033??2018-05-29?20:53??哈夫曼\壓縮文件(哈夫曼樹).exe
?????目錄??????????0??2020-01-28?18:01??哈夫曼
-----------?---------??----------?-----??----
??????????????2875313????????????????????7
- 上一篇:學生管理系統 mfc 數據庫 c++
- 下一篇:c語言復習專用
評論
共有 條評論