哈夫曼编码C++实现
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
j=k; s=j; ht[j].parent=-1; } else { s=j; ht[j].parent=-1; } k++; } return s;
百度文库
//始终令“ht[j]”为二者中权值小的那一个 //如果 ht[j]是权值较小的,将 ht[j]的 parent 记为-1,
} void CHTree::huffmancode() { if(n<=1)return; m=2*n-1; for(int i=1;i<=n;i++) //叶子节点的初始化 { ht[i].parent=0; ht[i].lchild=0; ht[i].rchild=0; } for(;i<=m;i++) //非叶子节点的初始化 { ht[i].weight=0; ht[i].parent=0; ht[i].lchild=0; ht[i].rchild=0; } for(i=n+1;i<=m;++i) //构造哈夫曼树 { s1=select(i-1); //函数在 ht[1]到 ht[i-1]中选择 parent 为 0 且 weight 最小的结点, 并将结点序号返回 s1,并将 ht[s1].parent 设为-1 s2=select(i-1); ht[s1].parent=i; ht[s2].parent=i; ht[i].lchild=s1; ht[i].rchild=s2; ht[i].weight=ht[s1].weight+ht[s2].weight; } //--------从叶子到根逆向求每个字符的哈夫曼编码-----------// int c,f; for(i=1;i<=n;++i)
while(x<l) {//统计字符出现的次数 B=true; for(j=0;j<i;j++) { if(ht[j].c==a[x]) //如果字符 a[x]已经出现过,则记录,权值加 1 { ht[j].weight++; B=false; break; } } if(B==true) //若字符没有出现过,字符入列,且权值设为 1 { n=i; //记录叶子节点数 ht[i].weight=1; ht[i].c=a[x]; i++; } x++; } } int CHTree::select(int i) //函数在 ht[1]到 ht[i]中选择 parent 为 0 且 weight 最小的结点, 并将结 点序号返回 { int j=1; int k=1; int s; while(ht[j].parent!=0) { j++; s=j; } k=j+1; while(k<=i) { while(ht[k].parent!=0) k++; if(k>i)return s; if(ht[j].weight>ht[k].weight) { ht[j].parent=0; // 如果第二次和第二次以后循环中发现有比 ht[j]权值还 小的,将 ht[j].parent 重新设为 0
{ for(c=i,f=ht[i].parent;f!=0;c=f,f=ht[f].parent) if(ht[f].lchild==c) { str[i].insert(0,"0",0,1); } “0” else { str[i].insert(0,"1",0,1); } 符“1” } } void CHTree::Display() { cout<<"字符"<<'\t'<<"权值"<<'\t'<<"哈夫曼编码"<<endl; for(int i=1;i<=n;i++) { cout<<ht[i].c<<'\t'<<ht[i].weight<<'\t'<<str[i]<<endl; } cout<<"程序结束!"<<endl; delete ht; } int main() { CHTree h; cout<<'\n'<<"//----------------------哈夫曼编码-----------------------"<<endl; h.creat(); h.huffmancode(); h.Display(); return 0; } //在字符串 str[i]的第 0 位置插入字 //逆向求叶子结点的哈夫曼编码 //在字符串 str[i]的第 0 位置插入字符
//----------哈夫曼编码 C++实现-----------------// //-----------中原工学院 软件工程 孙冬冬--------// #include<iostream> #include<string> using namespace std; struct HTNode { char c; int weight; int lchild,rchild,parent; }; bool B; #define MAXSIZE 1000 //哈夫曼数存储的最大叶子节点数 class CHTree { public: CHTree(); void creat(); void huffmancode(); int select(int i); void Display(); private: HTNode *ht; int m; int n; //叶子结点数 int s1; int s2; string a; //存储输入的字符串 string str[MAXSIZE]; //存储叶子结点的哈夫曼编码 }; CHTree::CHTree() { ht=NULL; } void CHTree::creat() { int i=1; int j=0; int x=0; cout<<"请输入字符串:"<<endl; cin>>a; int l=a.length(); ht=(HTNode*)malloc((MAXSIZE)*sizeof(HTNode)); // 分配 MAXSIZE 个叶子结点的存 储空间