91av视频/亚洲h视频/操亚洲美女/外国一级黄色毛片 - 国产三级三级三级三级

  • 大小: 5KB
    文件類型: .cpp
    金幣: 1
    下載: 0 次
    發布日期: 2021-05-12
  • 語言: C/C++
  • 標簽: c++??哈夫曼樹??

資源簡介

本程序是c++語言利用數據結構中的樹來實現二院哈夫曼編譯碼,支持任意字符串的編譯碼,直接用visual studio打開運行即可。

資源截圖

代碼片段和文件信息

#include?
#include?
using?namespace?std;
struct?HNode?
{
int?weight;??? //結點權值
??? int?parent;??? //雙親指針
int?LChild;?? //左孩子指針
int?RChild?;? //右孩子指針
};????
struct?HCode
??{
char?data;
char?code[100];
??};

class?Huffman
{
private:
????HNode*?HTree;????????????????????//Huffman樹??
HCode*?HCodeTable;???????????????//Huffman編碼表
char?str[1024];??????????????????//輸入的原始字符串
char?leaf[256];??????????????????//葉子節點對應的字符
int??a[256];?????????????????????//記錄每個出現的字符的個數
public:
????int??n;??????????????????????????//葉子節點數
????void?init();?????????????????????//初始化
????void?CreateHTree();?????? ?//創建huffman樹
????void?CreateCodeTable();? ?//創建編碼表
????void?Encode(char?*d);????????????//編碼
void?Decode(char?*s?char?*d);???//解碼
void?print(int?iint?m);?????????//打印Huffman樹

void?SelectMin(int?&x?int?&y?int?s?int?e?);//選擇兩個最小的節點
void?Reverse(char*?s);?//逆轉編碼
????~?Huffman();//析構函數
};
void?Huffman::init()
{
int?nNum[256]=?{0};????????????????//記錄每一個字符出現的次數
int?ch?=?cin.get();??
int?i=0;??
while((ch!=‘\r‘)?&&?(ch!=‘\n‘))
{
nNum[ch]++;???????????????????//統計字符出現的次數
str[i++]?=?ch;???????????????????//記錄原始字符串
ch?=?cin.get();???????????????????//讀取下一個字符
}
str[i]=‘\0‘;
cout<<“各個字符出現的次數:“<????n?=?0;
????for?(?i=0;i<256;i++)
{
if?(nNum[i]>0)??????????????//若nNum[i]==0說明該字符未出現
{
leaf[n]?=?(char)i;?????????
a[n]?=?nNum[i];???
n++;
cout<<(char)i<<“-“< }
}
cout<}
void?Huffman::CreateHTree()
{
HTree?=?new?HNode?[2*n-1];? //根據權重數組a[0..n-1]?初始化Huffman樹
for?(int?k?=?0;?k? {
HTree[k].weight?=?a[k];
HTree[k].LChild?=?HTree[k].RChild?=?HTree[k].parent?=?-1;
}
??? int?x?y;
??? for?(int?i?=?n;?i? {???
SelectMin(x?y?0?i);? ?//從1~i中選出兩個權值最小的結點
HTree[x].parent?=?HTree[y].parent?=?i;
HTree[i].weight?=?HTree[x].weight+?HTree[y].weight;
HTree[i].LChild?=?x;
HTree[i].RChild?=?y;
HTree[i].parent?=?-1;
}
}

void?Huffman::SelectMin(int?&x?int?&y?int?s?int?e?)
{
int?i;
for?(?i=s;?i<=e;i++)
if?(HTree[i].parent?==?-1)
{
x?=y=?i;????break;??????????//找出第一個有效權值x,并令y=x
}
????for?(?;?i if?(HTree[i].parent?==?-1)?????????//該權值未使用過
{
if?(?HTree[i].weight????????????{

評論

共有 條評論