【数据结构实验】哈夫曼编/译码

来源:互联网 发布:淘宝售后培训ppt 编辑:程序博客网 时间:2024/06/06 21:03


#include <iostream>#include <iomanip>#include <stdlib.h>#include <string.h>using namespace std;#define Max 20typedef struct{int weight;//权重int parent,lchild,rchild;char charr;}HTNode,*HuffmanTree;typedef char **HuffmanCode;//=============================================================================void Select(HuffmanTree HT,int i,int &s1,int &s2){int j,k=1;while(HT[k].parent!=0)k++;s1=k;for(j=1;j<=i;++j)if(HT[j].parent==0&&HT[j].weight<HT[s1].weight)s1=j;k=1;while(HT[k].parent!=0||k==s1)k++;s2=k;for(j=1;j<=i;++j)if(HT[j].parent==0&&HT[j].weight<HT[s2].weight&&j!=s1)s2=j;}//=============================================================================void HuffmanCoding(HuffmanTree &HT,int *w,int n){int m,i,s1,s2;if(n <= 1)return;m = 2 * n - 1;HT = (HuffmanTree)malloc((m + 1) * sizeof(HTNode));for(i = 1;i <= n;++i){HT[i].weight = w[i];HT[i].lchild = 0;HT[i].rchild = 0;HT[i].parent = 0;}for(i = n + 1;i <= m;++i){HT[i].weight = 0;HT[i].lchild = 0;HT[i].rchild = 0;HT[i].parent = 0;}//构建哈弗曼树for(i = n + 1;i <= m;++i){Select(HT,i - 1,s1,s2);//选择parent为0且weight最小的两个结点,期序号分别为s1,s2HT[s1].parent = i;HT[s2].parent = i;HT[i].lchild = s1;HT[i].rchild = s2;HT[i].weight = HT[s1].weight + HT[s2].weight;}}void Encoding(HuffmanCode HC,char str[Max],int n){int M;int i, j;cout<<"请出入您想要编码的字符串长度M:"<<endl;cin>>M;cout << "请出入您想要编码的字符串str:" << endl;for(i=0;i<M;i++)cin>>str[i];int temp[Max];for(i=0;i<M;i++)temp[i]=int (str[i])-64;cout<<"您输入的字符串对应的Huffman编码为:"<<endl;for(i=0;i<M;i++){for(j=1;j<=n;j++){if(temp[i]==j)cout<<HC[j];}}cout<<endl;}void Huffmancode(HuffmanTree &HT,HuffmanCode &HC,int n){char str0[Max]={'A','B','C','D','E','F','G','H','I','J','K','L'};char *cd;int c,f,start;int i;HC = (HuffmanCode)malloc((n + 1) * sizeof(char *));cd = new char[n];cd[n - 1] = '\0';//编码结束标志cout<<"哈夫曼编码如下:";for(i = 1;i <= n;++i)//逐个字符求赫夫曼编码{start = n - 1;for(c = i,f = HT[i].parent;f != 0;c = f,f =HT[f].parent)//从叶子到根逆向求编码{if(HT[f].lchild == c)cd[--start] = '0';elsecd[--start] = '1';}HC[i] = (char *)malloc(n * sizeof(char));//为第i个字符编码分配空间strcpy(HC[i],&cd[start]);//从cd复制编码到HCcout<<endl;cout<<"字符 "<<str0[i-1]<<" 对应的哈夫曼编码是: "<<HC[i];}cout << endl;char str[Max];Encoding(HC,str,n);//编码free(cd);//释放工作空间cd}void Decoding(HuffmanTree HT,int m){int i;char str0[Max]={'A','B','C','D','E','F','G','H','I','J','K','L'};char order[Max];int M=1;cout<<"请输入您要解码的序列order(输入#结束):"<<endl;for(int j=0;j<Max;j++){cin>>order[j];if(order[j]=='#')break;M++;}order[M]='\0';char *ch = order;cout<<"您输入的序列解码后对应的字符串为:"<<endl;while( *ch != '\0' ){//解码一个结点每次都从树根m开始for(i=m; HT[i].lchild !=0 && HT[i].rchild != 0; ){if( *ch == '0' )i = HT[i].lchild;else if( *ch == '1' )i = HT[i].rchild;++ch;}cout<<str0[i-1];}cout<<endl;}int main(){HuffmanTree HT;HuffmanCode HC;int *w;char *e;int i,n,m,wei;cout << "请输入哈弗曼树的带权数目: " << endl;cin >> n;w = new int[n + 1];e = new char[n + 1];char str0[Max]={'A','B','C','D','E','F','G','H','I','J','K','L'};for(i = 1;i <= n;i++){cout << "请输入字符 " << str0[i-1] << " 对应的权值w["<<i<<"]: ";cin >> wei;w[i] = wei;}HuffmanCoding(HT,w,n);m = 2 * n - 1;Huffmancode(HT,HC,n);Decoding(HT,m);//解码return 0;} cout<<"哈夫曼编码如下:"; for(i = 1;i <= n;++i)//逐个字符求赫夫曼编码 {  start = n - 1;  for(c = i,f = HT[i].parent;f != 0;c = f,f =HT[f].parent)//从叶子到根逆向求编码  {   if(HT[f].lchild == c)    cd[--start] = '0';   else    cd[--start] = '1';  }  HC[i] = (char *)malloc(n * sizeof(char));//为第i个字符编码分配空间  strcpy(HC[i],&cd[start]);//从cd复制编码到HC  cout<<endl;  cout<<"字符 "<<str0[i-1]<<" 对应的哈夫曼编码是: "<<HC[i]; } cout << endl; char str[Max]; Encoding(HC,str,n);//编码 free(cd);//释放工作空间cd}void Decoding(HuffmanTree HT,int m) {     int i; char str0[Max]={'A','B','C','D','E','F','G','H','I','J','K','L'}; char order[Max]; int M=1; cout<<"请输入您要解码的序列order(输入#结束):"<<endl; for(int j=0;j<Max;j++) {  cin>>order[j];  if(order[j]=='#')   break;  M++; } order[M]='\0'; char *ch = order; cout<<"您输入的序列解码后对应的字符串为:"<<endl;    while( *ch != '\0' ) {         //解码一个结点每次都从树根m开始         for(i=m; HT[i].lchild !=0 && HT[i].rchild != 0; )  {            if( *ch == '0' )                 i = HT[i].lchild;             else if( *ch == '1' )                 i = HT[i].rchild;             ++ch;         }         cout<<str0[i-1];     } cout<<endl;}int main(){ HuffmanTree HT; HuffmanCode HC; int *w; char *e; int i,n,m,wei; cout << "请输入哈弗曼树的带权数目:  " << endl; cin >> n; w = new int[n + 1]; e = new char[n + 1]; char str0[Max]={'A','B','C','D','E','F','G','H','I','J','K','L'}; for(i = 1;i <= n;i++) {  cout << "请输入字符 " << str0[i-1] << " 对应的权值w["<<i<<"]:  ";  cin >> wei;  w[i] = wei; } HuffmanCoding(HT,w,n); m = 2 * n - 1; Huffmancode(HT,HC,n);    Decoding(HT,m);//解码 return 0;}


10 0
原创粉丝点击