哈夫曼编码实验报告c语言,C语言-哈夫曼编码实验报告.doc

PAGE

PAGE 11

福 建 工 程 学 院

课程设计

课 程: 数据结构

题 目: 哈夫曼编码和译码

专 业: 信息管理信息系统

班 级: 1002班

座 号: 15号

姓 名: 林左权

2011年 6月 27日

一、要解决的问题

利用哈夫曼编码进行信息通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。但是,这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数据进行译码(复原)。对于双工信道(即可以双向传输信息的信道),每端都需要一个完整的编/译码系统。

二、算法基本思想描述:

根据给定的字符和其中每个字符的频度,构造哈夫馒树,并输出字符集中每个字符的哈夫曼编码.将给定的字符串根据其哈夫曼编码进行编码,并进行相应的译码.

三、设计

1. 数据结构的设计

(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;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值