数据结构程序设计作业——《哈夫曼编码》
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构实验报告
题目哈夫曼编码
学生姓名王某某
专业班级测控120X班
学号U2012XXXXX
1 问题描述
输入一字符串,以字符串中各字符出现的频数为权值构造哈夫曼编码。然后输入一0—1序列,根据生成的哈夫曼编码解码序列。
2 算法描述
(1)哈夫曼树的表示
设计哈夫曼树的结构体(htnode),其中包含权重、左右孩子、父母和要编码的字符。用这个结构体(htnode)定义个哈夫曼数组(hfmt[])。
迷宫定义如下:
typedef struct
{
int weight;
int lchild;
int rchild;
int parent;
char key;
}htnode;
typedef htnode hfmt[MAXLEN];
(2)对原始字符进行编码
初始化哈夫曼树(inithfmt)。
从终端读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树。
并显示出每个字符的编码。
1.void inithfmt(hfmt t)//对结构体进行初始化
2.void inputweight(hfmt t)//输入函数
3.void selectmin(hfmt t,int i,int *p1,int *p2)//选中两个权值最小的函数
4.void creathfmt(hfmt t)//创建哈夫曼树的函数
5.void phfmnode(hfmt t)//对字符进行初始编码
(3)对用户输入的字符进行编码
void encoding(hfmt t)//对用户输入的电文进行编码{
char r[1000];//用来存储输入的字符串
int i,j;
printf("\n\n请输入需要编码的字符:");
gets(r);
printf("编码结果为:");
for(j=0;r[j]!='\0';j++)
for(i=0;i if(r[j]==t[i].key) hfmtpath(t,i,j); printf("\n"); } (4)对用户输入的字符进行编码 void decoding(hfmt t)//对用户输入的密文进行译码{ char r[100]; int i,j,len; j=2*n-2;//j初始从树的根节点开始 printf("\n\n请输入需要译码的字符串:"); gets(r); len=strlen(r); printf("译码的结果是:"); for(i=0;i { if(r[i]=='0') { j=t[j].lchild; if(t[j].lchild==-1) { printf("%c",t[j].key); j=2*n-2; } } else if(r[i]=='1') { j=t[j].rchild; if(t[j].rchild==-1) { printf("%c",t[j].key); j=2*n-2; } } } printf("\n\n"); } 3 程序设计流程图 4 运行测试 1.用户输入字符串,以回车键作为结束 2.对字符统计打印统计结果、编码表和编码结果 3.对一串数据解码 4.统计编码前后的数据大小,计算压缩率 5 实验收获 代码编写完会有很多与预期不同的结果,耐心调试,修改代码,开始写代码的时候就认真的写,在调试时找出逻辑问题比较困难,做到一步到位。此外程序编完后有时间可以对其中的一些算法优化,另外了调整输出界面,看起来更加美观。 附:程序代码 #include #include #include typedef struct { int weight; int parent,lchild,rchild; }HTNode,*HuffmanTree;//动态分配数组存储哈弗曼树 typedef char** Huffmancode;//动态分配数组存储哈弗曼编码表unsigned int wordweight[26]; HuffmanTree HT; Huffmancode HC; void HuffmanCoding(int n); void Select(int i,int*t1,int*t2); void for_weight(void); //求每个字母的权值 void HuffmanDecoding(); int main() { int i; char c; printf("输入1-哈弗曼编码,输入2-哈弗曼解码,输入3-退出程序\n"); while((c=getchar())!='3') { if(c=='1') { HuffmanCoding(26); for(i=1;i<=26;i++) printf("%c的哈弗曼编码为%s\n",'a'+i-1,HC[i]); printf("输入1-哈弗曼编码,输入2-哈弗曼解码,输入3-退出程序\n"); } if (c=='2') { HuffmanDecoding(); printf("输入1-哈弗曼编码,输入2-哈弗曼解码,输入3-退出程序\n"); } } } void HuffmanCoding(int n) { void Select(int,int*,int*); char *cd; int i,m,start,f; int s1,s2,c; if(n<=1) {