Huffman编码与译码-数据结构设计性实验
- 格式:doc
- 大小:184.00 KB
- 文档页数:10
数据结构设计性实验Huffman编码与译码学号2009120302 28姓名张德武班级信息092设计性实验—Huffman 编码与译码一.实验目的:在掌握相关基础知识的基础上,学会自己设计实验算法,熟练掌握Huffman 树的建立方法,Huffman 编码的方法,进而设计出Huffman 译码算法,并编程实现。
二、实验要求:在6学时以内,制作出能够实现基于26个英文字母的任意字符串的编译码。
写出技术工作报告并附源程序。
三.实验内容及任务:1.设字符集为26个英文字母,其出现频度如下表所示。
2.建Huffman 树; 3.利用所建Huffman 树对任一字符串文件进行编码——即设计一个Huffman 编码器;4.对任一字符串文件的编码进行译码——即设计一个Huffman 译码器。
实现步骤:1.数据存储结构设计; 2.操作模块设计; 3.建树算法设计; 4.编码器设计;5. 译码器设计;四. 算法设计1. 数据结构霍夫曼树的节点结构 typedef struct {51 48 1 15 63 57 20 32 5 1频度z y x w v u t 字符11611882380频度p 21 f q15 g r 47 h s o n m l k j 字符 57 103 32 22 13 64 186 频度 i e d c b a 空格 字符int weight;int flag;int parent;int leftChild;int rightChild;} HaffNode;霍夫曼编码的结构typedef struct {unsigned int bit[MaxN];int start;int weight;}Code;2.设计构造霍夫曼树的算法:void Haffman(int weight[],int n,HaffNode haffTree[]){int i,j,m1,m2,x1,x2;for(i=0;i<2*n-1;i++){if(i<n)haffTree[i].weight=weight[i];elsehaffTree[i].weight=0;haffTree[i].parent=-1;haffTree[i].flag=0;haffTree[i].leftChild=-1;haffTree[i].rightChild=-1;}for(i=0;i<n-1;i++){m1=m2=MaxValue;x1=x2=0;for(j=0;j<n+i;j++){if(haffTree[j].weight<m1&&haffTree[j].flag==0){m2=m1;x2=x1;m1=haffTree[j].weight;x1=j;}else if(haffTree[j].weight<m2&&haffTree[j].flag==0){m2=haffTree[j].weight;x2=j;}}haffTree[x1].parent=n+i;haffTree[x2].parent=n+i;haffTree[x1].flag=1;haffTree[x2].flag=1;haffTree[n+i].weight=haffTree[x1].weight+haffTree[x2].weight;haffTree[n+i].leftChild=x1;haffTree[n+i].rightChild=x2;}}3.设计编码的算法:void HaffCode(HaffNode haffTree[],int n,Code haffCode[]) {Code *cd=(Code *)malloc(sizeof(Code));int i,j,child,parent;for(i=0;i<n;i++){cd->start=n-1;cd->weight=haffTree[i].weight;child=i;parent=haffTree[child].parent;while(parent!=-1){if(haffTree[parent].leftChild==child)cd->bit[cd->start]=0;elsecd->bit[cd->start]=1;cd->start--;child=parent;parent=haffTree[child].parent;}for(j=cd->start+1;j<n;j++)haffCode[i].bit[j]=cd->bit[j];haffCode[i].start=cd->start+1;haffCode[i].weight=cd->weight;}}以上算法都包含在haffman.h的头文件中4主函数的设计#include <stdio.h>#include <stdlib.h>#define MaxValue 10000#define MaxBit 10#define MaxN 100#include "haffMan.h"void main(){int i,j,k,n=27;chars[]={'','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s',' t','u','v','w','x','y','z'};intweight[]={187,64,13,22,32,103,21,15,47,57,1,5,32,20,57,63,15,1,48,51,80,23,8,13 ,1,16,1};HaffNode *myHaffTree=(HaffNode *)malloc(sizeof(HaffNode)*(2*n+1));Code *myHaffCode=(Code *)malloc(sizeof(Code)*n);if(n>MaxN){printf("给出的n越界,修改MaxN");exit(0);}Haffman(weight,n,myHaffTree);HaffCode(myHaffTree,n,myHaffCode);for(i=0;i<n;i++){printf("字符是%c 权数=%d 霍夫曼编码= ",s[i],myHaffCode[i].weight);for(j=myHaffCode[i].start;j<n;j++)printf("%d",myHaffCode[i].bit[j]);printf("\n");}}实验结果:实验总结:通过本次实验首先学习了霍夫曼树及其编码,接着分析写出了建立霍夫曼树和计算霍夫曼编码算法的代码,在huffman编码当中虽出现许多错误但通过了进一步的学习都可以学习改正,基本上可以实现Huffman编码算法的实现与编程应用实验代码#include <stdlib.h>#include <iostream.h>#include <stdio.h>#include <string.h>#define OVERFLOW -1typedef struct{char letter;float weight;int parent,lchild,rchild;}HTNode,*HuffmanTree;typedef char * *HuffmanCode;void Select(HuffmanTree &HT,int i,int &s1,int &s2) {int j, k;for(k = 1; k < i; k++){if(HT[k].parent != NULL)continue;s1 = k;break;}for(j = 1; j < i; j++){if(HT[j].parent != NULL)continue;if(HT[j].weight < HT[s1].weight)s1 = j;}for(k = 1; k <= i; k++){if(HT[k].parent != NULL || k == s1)continue;s2 = k;break;}for(j = 1; j < i; j++){if(HT[j].parent != NULL)continue;if(HT[j].weight <= HT[s2].weight && j != s1)s2 = j;}}void HuffmanCoding(HuffmanTree &HT,HuffmanCode &HC,char *zi,float *w,int n) {HuffmanTree p;int m,i,s1,s2,f,r;int Istart = 1;char *cd;if(n <= 1)return;m = 2*n-1;if(!(HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode))))exit(OVERFLOW);for(p=HT+1,i=1;i<=n;++i,++zi,++p,++w){p->parent = NULL;p->letter = *zi;p->lchild = NULL;p->rchild = NULL;p->weight = *w;}for(;i<=m;++i,++p){(*p).weight=0;(*p).parent=0;(*p).lchild=0;(*p).rchild=0;}for(i=n+1;i<=m;++i){Select(HT,i-1,s1,s2);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;}HC=(HuffmanCode)malloc((n+1)*sizeof(char *));cd=(char*)malloc(n*sizeof(char));cd[n-1]='\0';for(i=1;i<=n;++i){Istart = n - 1;for(r= i, f = HT[i].parent; f != 0; r= f, f = HT[f].parent)if(HT[f].lchild == r)cd[--Istart] = '0';elsecd[--Istart] = '1';HC[i] = (char *)malloc((n - Istart) * sizeof(char));strcpy(HC[i], &cd[Istart]);}free(cd);}void main(){HuffmanTree HT;HuffmanCode HC;int i,j,yu;char c[100];charzi[27]={'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R' ,'S','T','U','V','W','X','Y','Z',' '};float w[27]={8.19 ,1.47 ,3.83 , 3.91 , 12.25 , 2.26 , 1.71, 4.57 , 7.10 , 0.14 ,0.41 , 3.77 ,3.34 ,7.06, 7.26 , 2.89 , 0.09 , 6.85 , 6.36 ,9.41, 2.58 ,1.09 ,1.59 , 0.21 , 1.58 ,0.08 ,9.11};HuffmanCoding(HT,HC,zi,w,29);cout<<endl;cout<<"char weight huffmancode "<<endl;for(i=1;i<=27;i++)cout<<HT[i].letter<<" "<<HT[i].weight<<" "<<HC[i]<<endl; printf("please input the text:");gets(c);printf("The code is:");for(i=0; i<strlen(c); i++){if(c[i]!=' ')printf("%s",HC[(c[i] - 'A' + 1)]); elseprintf("%s",HC[27]);}cout<<endl;cout<<"Enter the code:";cin>>c;j=strlen(c);yu=57;i=1;cout<<"The text is:";while(i <= j){while(HT[yu].lchild != 0){if(c[i-1] == '0'){yu = HT[yu].lchild;i++;continue;}if(c[i-1]== '1'){yu=HT[yu].rchild;i++;continue;}}cout<<HT[yu].letter;yu = 57;}cout<<endl;}。