文档介绍:西安郵電大學
数据结构课程设计报告
题目: 哈夫曼编/译码器
院系名称: 计算机学院
专业名称: 软件工程
班级: 1101班
学生姓名: 武妍娜
学号(8位): 04113027
指导教师: 李培
设计起止时间:2012年12月3日~2012年12月14日
一. 设计目的
,提高综合运用本课程所学知识的能力;
、理论和方法的理解;
;
,编码和译码。
二. 设计内容
利用哈夫曼编码进行信息通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。但是,这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数据进行译码(复原)。试为这样的信息收发站写一个哈夫曼的编/译码器。
主程序模块
;
编码模块
译码模块
文件模块
密码模块
。
(1)主程序模块
打印菜单;
让用户选择是编码还是译码;
让用户决定是否观看一些信息。
密码模块
void Login()
密码函数,用户输入用户名和密码,密码正确方能进入系统,否则重新输入。
(3)编码模块
void OpenSourceFile(char s[])
打开源文件,并将其内容存到s[]中
void Code(char s[],char str[],char code[],int freq[],HFMTree *HT,CodeNode HC[])
编码函数,调用编码所需的所有函数
void Search(char s[],char str[],int freq[])
查找各个字符,将其存到str[]中,并统计其出现的频数,即权值,存放在freq[]中
void CreateHFMTree(HFMTree *HT,int freq[])
创建哈夫曼树
void HFMCode(HFMTree HT,CodeNode HC[],char str[])
按左0右1的顺序进行编码
AllCode(s,HC,code)
将所有字符的编码连起来,存放到code[]中
Save(code)
(4)译码模块
void DeCode(char code[],char str[],char ss[],HFMTree *HT,CodeNode HC[])
译码函数,调用译码所需的所有函数
void OpenCodeFile(char code[])
打开编码文件
Decoding(code,*HT,str,ss)
从根结点开始按编码顺序进行译码
Save(ss)
查找权值
查找字符
创建哈夫曼树
密码
编码
连接编码
编码
主函数
保存编码
打开源文件
菜单
打开文件
译码
显示哈夫曼信息
保存译码
译码
开始
(1)创建哈夫曼树函数
int i=0;
HFMTree p,HT1,HT2;
p=*HT=(HFMTree)malloc(sizeof(HFMNode));
p->next=p->LChild=p->RChild=p->Parent=NULL;
i<2n-1
是
否
i++;
p=*HT;
p->next=(HFMTree)malloc(sizeof(HFMNode));
p=p->next;
p->next=p->LChild=p->RChild=p->Parent=NULL;
i++;
i<n
i<2n-1
否
p->weight=freq[i];
p=p->next;
i++;
是
Select(*HT,i,&HT1,&HT2);
HT1->Parent=HT2->Parent=p;
p->LChild=HT1;
p->RChild=HT2;
p->weight=HT1->weight+HT2->weight;
p=p->next;
i++;
开始
(2)编码函数
int i=0;
HFMTree q,p=HT;
i<n
是
HC[i].ch=str[i];
HC[i].code[n-1]='\0';
i=0;
i<n
HC[i].flag=n-1;
p=q;
q->Parent!=Null;
否
是
q==q->Parent->Lchild
HC[i].code