基于哈夫曼编码的通信系统的设计和实现

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

河北工业大学

《数据结构》课程实验

实验报告

题目:基于哈夫曼编码的通信系统的设计与实现专业:

班级:

姓名:

学号:

完成日期:

一、试验内容

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

二、试验目的

(1)掌握二叉树的存储结构及其相关操作。

(2)掌握构造哈夫曼树的基本思想,及其编码/译码过程。

三、流程图

判断

输入编码字符

及编码长度

进行哈夫曼

编码

输入要传送的

信息

对接收到的信

息进行译码

结束

四、源程序代码

#include

#include

#include

int hfmbm(int n,int m,char p[])

{

typedef struct{

float we;

int pa,lc,rc;

}htnode,*huff;

h uff HT;

t ypedef char **huffman;

h uffman HC;

FILE *fp,*fp1;

i nt i,j,t,d,min[2],*h;

f loat *g;

c har a,*q[100],*temp;

h=(int *)malloc(m);

for(i=0;i<100;i++){

q[i]=(char *)malloc(m+1);

//对信息进行字符编码

for(j=0;j

if(i==0){h[j]=1;q[i][j]=p[h[j]];continue;}

else if(j==0){h[j]+=1;q[i][j]=p[h[j]];}

else q[i][j]=p[h[j]];

if(h[j]>n){h[j]=1;h[j+1]+=1;q[i][j]=p[h[j]];}

}

q[i][j]='\0';

}

fp=fopen("zifu.txt","w+");//字符编码写入文件

f or(i=0;i<100;i++){fputs(q[i],fp);}

f close(fp);

g=(float *)malloc(n);

f or(i=0;i

f or(i=0;i<100;i++)

for(j=0;j

for(t=1;t

if(q[i][j]==p[t]) g[t-1]++;

f or(i=0;i

H T=(huff)malloc((2*n-1)*sizeof(htnode));

//计算哈弗曼编码

for(i=0;i

f or(;i<2*n-1;i++){

for(t=0;t<2;t++){

for(j=0;j

if(HT[j].pa==0){min[t]=j;continue;}

if(HT[j].pa==0&&HT[j].we

}

HT[min[t]].pa=i;

}

HT[i].we=HT[min[0]].we+HT[min[1]].we;

HT[i].pa=0;HT[i].lc=min[0];HT[i].rc=min[1];

}

HC=(huffman)malloc(n);

temp=(char *)malloc(m+1);

t=2*n-2;

d=-1;

//进行哈夫曼编码

f or(i=0,d=0;d!=n;i++){

if(HT[t].lc!=-1){t=HT[t].lc;temp[i]='0';}

else if(HT[t].rc==-1){

if(t>=0&&t

*)malloc(i+1);for(j=0;j

t=HT[t].pa;

if(temp[i-1]=='0') HT[t].lc=-1;

else HT[t].rc=-1;

i=i-2;

}

else{t=HT[t].rc;temp[i]='1';}

}

fp=fopen("zifu.txt","r");

fp1=fopen("hmbn.txt","w+");

f or(i=0;i<100;i++){

for(j=0;j

a=fgetc(fp);

for(t=0;t

}

putc('\n',fp1);

}

f close(fp1);

f close(fp);

r eturn(0);

}

main()

{

相关文档
最新文档