1、数据结构课程设计哈夫曼编码译码器题目一:哈夫曼编码与译码一、任务设计一个利用哈夫曼算法的编码与译码系统,重复地显示并处理以下项目,直到选择退出为止。要求:1)将权值数据存放在数据文件(文件名为data、txt,位于执行程序的当前目录中) ;2)初始化:键盘输入字符集统计字符权值、自定义26个字符与26个权值、统计文件中一篇英文文章中26个字母,建立哈夫曼树;3)编码:利用建好的哈夫曼树生成哈夫曼编码;4)输出编码(首先实现屏幕输出,然后实现文件输出);5) 译码(键盘接收编码进行译码、文件读入编码进行译码);6)界面优化设计。二、流程图三、代码分解/头文件#include#include#in
2、clude#include #define N 1000#define M 2*N-1#define MAXcode 6000/函数声明void count(CHar &ch,HTNode ht);void editHCode(HTNode ht,HCode hcd,CHar &ch,int n,char bianma); /编码函数void printyima(HTNode ht,HCode hcd,int n,char bianma); /译码函数void creatHT(HTNode ht,int n);void CreateHCode (HTNode ht,HCode hcd,int
3、n);void DispHCode(HTNode ht,HCode hcd,int n);void input_key(CHar &ch);void input_ &ch);void input_cw(HTNode ht);void bianma1(HTNode ht,HCode hcd,CHar &ch,int n,char bianma);void bianma2(HTNode ht,HCode hcd,CHar &ch,int n,char bianma);void yima1(HTNode ht,HCode hcd,int n,char bianma);void yima2(HTNod
4、e ht,HCode hcd,int n,char bianma);void creat_cw();void bianmacaidan();void yimacaidan();void bianmayima();int caidan(); /结构体typedef struct char data; int parent; int weight; int lchild; int rchild;HTNode;typedef struct char cdN; int start;HCode;typedef struct char sN; int num;CHar;CHar ch;HTNode htM
5、;HCode hcdN;/主函数int main() int xh; while(1) system(color 1f); /操作菜单背景颜色 xh=caidan(); /调用菜单函数 switch(xh) /switch语句 case 1:system(cls);creat_cw();break; case 2:system(cls);creatHT(ht,n);break; case 3:system(cls);CreateHCode(ht,hcd,n);DispHCode(ht,hcd,n);break; case 4:system(cls);bianmayima();break; ca
6、se 0:system(cls);printf(nnnnnnnnntttt感谢使用本系统!nnnnnnn ttt);exit(0); default:system(cls);putchar(a); printf(ntt输入有误,请重新输入:n);break; return 0;/菜单函数int caidan() /菜单函数模块/ int xh; printf(nnn); printf(tt 欢迎使用哈夫曼编码译码系统 n); printf(tt n); printf(tt*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*n); printf(tt*= =
7、*n); printf(tt*= *=*=*=*=*=*=*=*=*=*=*= =*n); printf(tt*= 1、建立字符权值 =*n); printf(tt*= *=*=*=*=*=*=*=*=*=*=*= =*n); printf(tt*= 2、建立并输出哈夫曼树 =*n); printf(tt*= *=*=*=*=*=*=*=*=*=*=*= =*n); printf(tt*= 3、生成并查瞧哈夫曼编码 =*n); printf(tt*= *=*=*=*=*=*=*=*=*=*=*= =*n); printf(tt*= 4、编码与译码 =*n); printf(tt*= *=*=*
8、=*=*=*=*=*=*=*=*= =*n); printf(tt*= 0、退出系统 =*n); printf(tt*= =*n); printf(tt*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*n); printf(ntt请输入序号进行选择:); scanf(%d, &xh); return xh; /返回从键盘接收的选项void bianmayima() int xh; while(1) printf(nnnnn); printf(tt 编码与译码 n); printf(tt n); printf(tt*= *=*=*=*=*=*=*=*=*=
9、*=*=*=*=*=* =*n); printf(tt*= 1、编码 =*n); printf(tt*= *=*=*=*=*=*=*=*=*=*=*=*=*=*=* =*n); printf(tt*= 2、译码 =*n); printf(tt*= *=*=*=*=*=*=*=*=*=*=*=*=*=*=* =*n); printf(tt*= 0、返回上级菜单 =*n); printf(tt*= *=*=*=*=*=*=*=*=*=*=*=*=*=*=* =*n); printf(ntt请输入序号进行选择:); scanf(%d,&xh); switch(xh) /switch语句 case 1
10、:system(cls);bianmacaidan();break; case 2:system(cls);yimacaidan();break; case 0:system(cls);return; default:system(cls);putchar(a); printf(ntt输入有误,请重新输入:n);break; void yimacaidan() int xh; while(1) printf(nnnnn); printf(tt 译码 n); printf(tt n); printf(tt*= *=*=*=*=*=*=*=*=*=*=*=*=*=*=* =*n); printf(
11、tt*= 1、键盘输入编码进行译码 =*n); printf(tt*= *=*=*=*=*=*=*=*=*=*=*=*=*=*=* =*n); printf(tt*= 2、文件读入编码进行译码 =*n); printf(tt*= *=*=*=*=*=*=*=*=*=*=*=*=*=*=* =*n); printf(tt*= 0、返回上级菜单 =*n); printf(tt*= *=*=*=*=*=*=*=*=*=*=*=*=*=*=* =*n); printf(ntt请输入序号进行选择:); scanf(%d,&xh); switch(xh) /switch语句 case 1:system(c
12、ls);yima1(ht,hcd,n,bianma);break; case 2:system(cls);yima2(ht,hcd,n,bianma);break; case 0:system(cls);return; default:system(cls);putchar(a); printf(ntt输入有误,请重新输入:n);break; void bianmacaidan() int xh; while(1) printf(nnnnn); printf(tt 编码 n); printf(tt n); printf(tt*= *=*=*=*=*=*=*=*=*=*=*=*=*=*=* =*
13、n); printf(tt*= 1、键盘输入字符集编码 =*n); printf(tt*= *=*=*=*=*=*=*=*=*=*=*=*=*=*=* =*n); printf(tt*= 2、文件读入文章编码 =*n); printf(tt*= *=*=*=*=*=*=*=*=*=*=*=*=*=*=* =*n); printf(tt*= 0、返回上级菜单 =*n); printf(tt*= *=*=*=*=*=*=*=*=*=*=*=*=*=*=* =*n); printf(ntt请输入序号进行选择:); scanf(%d,&xh); switch(xh) /switch语句 case 1:
14、system(cls);bianma1(ht,hcd,ch,n,bianma);break; case 2:system(cls);bianma2(ht,hcd,ch,n,bianma);break; case 0:system(cls);return; default:system(cls);putchar(a); printf(ntt输入有误,请重新输入:n);break; void creat_cw() int xh2; while(1) printf(nnnnn); printf(tt 建立字符权值 n); printf(tt n); printf(tt*= *=*=*=*=*=*=*
15、=*=*=*=*=*=*=*=* =*n); printf(tt*= 1、从键盘输入字符集进行统计 =*n); printf(tt*= *=*=*=*=*=*=*=*=*=*=*=*=*=*=* =*n); printf(tt*= 2、从文件读入字符集统计 =*n); printf(tt*= *=*=*=*=*=*=*=*=*=*=*=*=*=*=* =*n); printf(tt*= 3、自定义字符权值 =*n); printf(tt*= *=*=*=*=*=*=*=*=*=*=*=*=*=*=* =*n); printf(tt*= 0、返回上级菜单 =*n); printf(tt*= *=
16、*=*=*=*=*=*=*=*=*=*=*=*=*=* =*n); printf(ntt请输入序号进行选择:); scanf(%d,&xh2); switch(xh2) /switch语句 case 1:system(cls);input_key(ch);break; case 2:system(cls);input_);break; case 3:system(cls);input_cw(ht);break; case 0:system(cls);return; default:system(cls);putchar(a); printf(ntt输入有误,请重新输入:n);break; /建
17、立字符权值模块void input_key(CHar &ch) int i,j=0; char stN; printf(请输入字符集(以#结束):n); for(i=0;iN;i+) scanf(%c,&sti); if(sti=#) sti=0;break; strcpy(ch、s,st); ch、num=strlen(st); count(ch,ht); printf(按任意键返回!); getch(); system(cls); return;void input_ &ch) int i; ; char 20; printf(请输入要打开的文件名(*、txt):); scanf(%s,&
18、); if(fp=fopen(,r)=NULL) printf(ntt文件打开失败!); return; for(i=0;!feof(fp);i+) fread(&ch、si,sizeof(char),1,fp); ch、num=strlen(ch、s); printf(读入成功!n); printf(文件中的字符集为:%sn,ch、s); fclose(fp); count(ch,ht); printf(按任意键返回!); getch(); system(cls); return;void input_cw(HTNode ht) int i,w,s,j; char a; printf(要输入
19、的字符总个数就是?:); scanf(%d,&s); n=s; printf(请输入字符及其权值:n); for(i=0;is;i+) printf(请输入第%d个字母:,i+1); scanf(%s,&a); hti、data=a; printf(请输入其权值:); scanf(%d,&w); hti、weight=w; FILE *fp; if(fp=fopen(data、txt,w)=0) printf(ntt文件打开失败!); return; printf(n定义权值成功!nn); printf(各字符及其权值为:nn); fprintf(fp,各字符及其权值为:n); printf(
20、 字符t权值); fprintf(fp, 字符t权值); for(j=0;ji;j+) printf(n); fprintf(fp,n); printf( %-8c%-8d,htj、data,htj、weight); fprintf(fp, %-8c%-8d%,htj、data,htj、weight); printf(n); printf(n字符权值已输出至文件“data、txt”!); fclose(fp); printf(输入完成,按任意键返回!); getch(); system(cls); return;/统计字符权值函数void count(CHar &ch,HTNode ht) i
21、nt i,j,m=0; char cN; int sumN=0; for(i=0;ch、si!=0;i+) for(j=0;j=a&cj=z&ch、si+32=cj) break; if(j=A&ch、si=Z) cj=ch、si+32; else cj=ch、si; sumj+; m+; for(i=0;im;i+) hti、data=ci; hti、weight=sumi; n=m; FILE *fp; if(fp=fopen(data、txt,w)=0) printf(ntt文件打开失败!); return; printf(n统计权值成功!nn); printf(各字符及其权值为:nn)
22、; fprintf(fp,各字符及其权值为:n); printf( 字符t权值); fprintf(fp, 字符t权值); for(j=0;jm;j+) printf(n); fprintf(fp,n); printf( %-8c%-8d,htj、data,htj、weight); fprintf(fp, %-8c%-8d%,htj、data,htj、weight); printf(n); printf(n字符权值已输出至文件“data、txt”!); fclose(fp);/构造哈夫曼树void creatHT(HTNode ht,int n) FILE *fp; if(fp=fopen(哈
23、夫曼树、txt,w)=0) printf(ntt文件打开失败!); return; int i,j,k,lnode,rnode; int min1,min2; for (i=0;i2*n-1;i+) hti、parent=hti、lchild=hti、rchild=-1; for (i=n;i2*n-1;i+) min1=min2=32767; lnode=rnode=-1; for(k=0;k=i-1;k+) if(htk、parent=-1) if (htk、weightmin1) min2=min1;rnode=lnode; min1=htk、weight;lnode=k; else i
24、f(htk、weightmin2) min2=htk、weight;rnode=k; htlnode、parent=i;htrnode、parent=i; hti、weight=htlnode、weight+htrnode、weight; hti、lchild=lnode;hti、rchild=rnode; printf(建立huffman树成功!n); printf(输出huffman树:n); fprintf(fp,输出huffman树:n); printf(t字符t权值t父节点t 左子节点t右子节点); fprintf(fp,t字符t权值t父节点t 左子节点t右子节点); for(j=1
25、;ji;j+) printf(n); fprintf(fp,n); printf(t %-8c%-8d%-10d%-14d%-10d,htj、data,htj、weight,htj、parent,hti、lchild,htj、rchild); fprintf(fp,t %-8c%-8d%-10d%-14d%-10d,htj、data,htj、weight,htj、parent,hti、lchild,htj、rchild); printf(n); printf(哈夫曼树已输出至文件“哈夫曼树、txt”!按任意键返回!); fclose(fp); getch(); system(cls); ret
26、urn;/生成哈夫曼编码void CreateHCode (HTNode ht,HCode hcd,int n) int i,f,c,j=0; HCode hc; for(i=0;in;i+) hc、start=n;c=i; hc、cdhc、start-=0; f=hti、parent; while(f!=-1) if (htf、lchild=c) hc、cdhc、start-=0; else hc、cdhc、start-=1; c=f;f=htf、parent; hc、start+; for(j=0;jhc、start;j+) hc、cdj= ; hcdi=hc; void DispHCode
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1