数据结构程序设计作业——《哈夫曼编码》

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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)

{

相关文档
最新文档