基于哈夫曼编码的通信系统的设计和实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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() {