西安邮电大学。
题目哈夫曼编/译码器。
一、 课程设计目的。
熟悉数据结构的有关树的知识和c语言的文件基本操作。把数据结构所学学会运用。在实践中发现问题,解决问题。
二、 课程设计内容。
利用哈夫曼编码进行信息通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。但是,这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数据进行译码(复原)。试为这样的信息收发站写一个哈夫曼的编/译码器。
三、需求分析。
本程序可以实现要求的基本功能。
创建:通过文件和手工输入创建哈夫曼树。
编码:运用哈夫曼编码知识,将已经建立的哈夫曼树编码,获得各个字符的哈夫曼编码,并对正文进行编码,然后输出编码结果,并将其存入文本文档(.txt)中。
译码:利用已建立好的哈夫曼树将文件中的哈夫曼编码进行译码,并输出译码结果,再存入文本文档(.txt)中。
压缩,解压:利用位运算实现文件的压缩和解压。这两个功能在经过尝试后未能实现。编码,压缩功能已经实现,但是解压功能没有实现,因此,译码时的结果出现了错误。
四、概要设计。
void welcome();打印操作选择界面。
void huffmancoding(huffmantree &,char *,int *,int);/建立赫夫曼树的算法。
void huffmancoding(huffmantree &,char *,int *,int)
/从目前已建好的赫夫曼树中选择parent为0且weight最小的两个结点。
void init();输入n个字符及其对应的权值,根据权值建立哈夫曼树。
void coding();编码。
void decoding();译码。
int read_tree(huffmantree &)从文件中读入赫夫曼树。
void find(huffmantree &ht,char *code,char *text,int i,int m);
/译码时根据01字符串寻找相应叶子节点的递归算法。
void welcome()
void huffmancoding(huffmantree &,char *,int *,int)
void select(huffmantree ht,int j,int *s1,int *s2);
mainvoid init()
void coding()
void decoding()
int read_tree(huffmantree &)
void find(huffmantree &ht,char *code,char *text,int i,int m);
五、详细设计及运行结果。
菜单界面:创建并存入文件中:
编码并存储:
译码:主要函数:
void coding()
file *fp,*fw;
int i,f,c,start;
char *cd;
huffmancode hc;
if(n==0)
n=read_tree(ht);
free(cd);
if((fp=fopen(""r"))null)
printf("open file error!");
if((fw=fopen(""w"))null)
printf("open file error!");
char temp;
fscanf(fp,"%c",&temp); 从文件读入第一个字符。
while(!feof(fp))
fclose(fw);
fclose(fp);
printf("对文件编码成功,结果已存入中。");
void decoding()
file *fp,*fw;
int m,i;
char *code,*text,*p;
if(n==0)
n=read_tree(ht);/从文件中读入赫夫曼树,返回叶子结点数。
if((fp=fopen(""r"))null)
printf("open file error!");
if((fw=fopen(""w"))null)
printf("open file error!");
code=(char *)malloc(sizeof(char));
fscanf(fp,"%c",code从文件读入一个字符。
for(i=1;!feof(fp);i++)
code[i-1]='0';
到此文件中的字符已全部读入,存放在code数组中。
text=(char *)malloc(100*sizeof(char));
p=text;
m=2*n-1;
if(*code=='0')
find(ht,code,text,ht[m].lchild,m); 从根节点的左子树去找。
elsefind(ht,code,text,ht[m].rchild,m); 从根节点的右子树去找。
for(i=0;p[i]!=0';i++)把译码好的字符存入文件中。
fputc(p[i],fw);
fclose(fp);
fclose(fw);
printf("对文件译码成功,结果已存入文件。");
六、调试情况,设计技巧及体会。
在初步设计好程序后,程序可以实现基本的编码和译码的功能。看到时间稍微宽松后萌生了设计一个压缩和解压函数的程序。在查阅了相关书籍和网络资料后开始了哈夫曼压缩,解压部分的编写。
但是在实践后才发现并非像想象的那么简单!压缩要使用到位运算的相关知识,而我对这方面很是欠缺。查阅书籍对位运算有了简单的了解后便开始了压缩部分的编写。
编写过程中遇到很多问题,在查阅书籍无果后运用到了网络,在c语言论坛上求助网友,专业**提问,解决了很多问题。
当然,合作是必不可少的,再有问题部分还找了几个同学帮忙。他们给了很多意见与建议,调试时也给予了我很多帮助。
体会:不能闭门造车,学会合作。作为计算机专业的我们应该合理利用网络资源帮助自己解决问题。
七、参考文献。
数据结构(c语言)》耿国华版。
数据结构(c语言)》严蔚敏版。
数据结构课程设计案例详解》
计算机导论》
网络相关资源。
八、附录:源**。
#include <>
#include <>
#include <>
typedef struct
int weight;
char ch
int parent,lchild,rchild;
htnode,*huffmantree;
typedef char **huffmancode;
void welcome();
void huffmancoding(huffmantree &,char *,int *,int);
void select(huffmantree ht,int j,int *s1,int *s2);
数据结构课程设计报告 网络
华北科技学院。课程设计说明书。数据结构课程设计 专业网络工程。课程名称 数据结构课程设计班级 网络b11 1姓名学号 完整学号 设计题目。设计时间 2012 2 25 至 2012 3 8评语。评阅成绩 评阅教师。一 问题描述与需求分析。1 问题描述。2 功能需求分析。二 概要设计。1 总体设计思路...
数据结构课程设计报告 网络
华北科技学院。课程设计说明书。学号完整学号。班级 网络b17 1 姓名。设计题目。设计地点。设计时间 2018 9 3 至 2018 9 14成绩评定 1 工作量 a b c d e 2 难易度 a b c d e 3 答辩情况 a b c d e 4 报告规范度 a b c d e 5 学习态度 ...
数据结构课程设计报告
东莞理工学院城市学院。题目 二叉排序树 专业 计算机科学与技术 本 年级 2010级计算机科学与技术专业 1 班。个人姓名 何振江。指导教师 张娟老师 时间 2010至2011第二学期第18周 地点 实验楼615机房 东莞理工学院城市学院计算机与信息科学系制。2011年 6月。实习报告的内容。一 问...