- 9
- 0
- 约3.5千字
- 约 5页
- 2017-08-29 发布于重庆
- 举报
C哈夫曼编解码器
#includeiostream#includestring.h#define max 100char c[max],str[max];float length1,length3[max];float length2=0;using namespace std;int n=0;structHNode{int weight;//结点权值int parent;//双亲指针intlchild;//左孩子指针intrchild;//右孩子指针};structHCode{char data;//存储字符char code[100];//存储字符对应的哈夫曼码};class Huffman{private:HNode* HTree;//哈夫曼树HCode* HCodeTable;//哈弗曼编码表public:void Init(int a[],int n);//创建哈夫曼树void selectmin(HNode*hTree,intn,int i1,int i2);//选择两个最小权值void CreateTable(char data[],int n);//创建编码表void Encoding(int n);//编码void Decoding(char* s);//解码~Huffman();};void Huffman::selectmin(HNode*hTree,intn,int i1,int i2){inti,j;//找一个比较值的起始值for(i=0;in;i++)//找i1{if(hTree[i].parent==-1){i1=i;break;}}i++;for(;in;i++)//找i2{if(hTree[i].parent==-1){i2=i;break;}}if(hTree[i1].weighthTree[i2].weight)//i1指向最小的{j=i2;i2=i1;i1=j;}i++;//开始找最小的两个for(;in;i++){if(hTree[i].parent==-1hTree[i].weighthTree[i1].weight){i2=i1;i1=i;}else if(hTree[i].parent==-1hTree[i].weighthTree[i2].weight){i2=i;}}}void Huffman::Init(int a[],int n)//输入参数a[]存储每种字符的权值,n为字符的种类{HTree=new HNode[2*n-1];//根据权重重组数组a[]初始化哈夫曼树for(int i=0;in;i++){HTree[i].weight=a[i];HTree[i].lchild=-1;HTree[i].rchild=-1;HTree[i].parent=-1;}intx,y;for(int i=n;i2*n-1;i++)//开始建哈夫曼树{selectmin(HTree,i,x,y);//从1-i中选出两个权值最小的结点,读者自行实现HTree[x].parent=i;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::CreateTable(char data[],int n){HCodeTable=new HCode[n];//生成编码表for(int i=0;in;i++){HCodeTable[i].data=data[i];int child=i;int parent=HTree[i].parent;int k=0;while(parent!=-1){if(child==HTree[parent].lchild)HCodeTable[i].code[k]=0;//左孩子标‘0’elseHCodeTable[i].code[k]=1;//右孩子标‘1’k++;child=parent;parent=HTree[child].parent;}HCodeTable[i].code[k]=\0;char code[100];//开始将编码字符逆置for(int u=0;uk;u++)code[u]=HCodeTable[i].code[k-u-1];for(int u=0;uk;u++)HCodeTable[i].code[u]=code[u];coutc[i]的哈夫曼编码为:;//输出对应的哈弗曼编码coutHCodeTable[i].codeendl; length3[i]=k;}coutendl;}void Huffman::Decoding(char* s
原创力文档

文档评论(0)