哈夫曼树的编码与译码
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{
int i,c,p;
codetype cd;
for(i=0;i<n;i++)
{
cd.start=n;
scanf("%c",&cd.ch);
c=i+1;
p=tree[i].parent;
while(p!=0)
{
cd.start--;
if(tree[p-1].lchild==c)
cd.bits[cd.start]='0';
int lchild,rchild,parent;
}hufmtree;
//定义结构体
typedef struct
{
char bits[n];
int start;
char ch;
}codetype;
hufmtree tree[m];
codetype code[n];
//建立哈夫曼树
void HUFFMAN(hufmtree tree[])
if(tree[j].weight<small1)
{
small2=small1;
small1=tree[j].weight;
p2=p1;
p1=j;
}
else
if(tree[j].weight<small2)
{
small2=tree[j].weight;
p2=j;
}
tree[p1].parent=i+1;
tree[p2].parent=Байду номын сангаас+1;
tree[i].lchild=p1+1;
tree[i].rchild=p2+1;
tree[i].weight=tree[p1].weight+tree[p2].weight;
}
}
//哈夫曼编码
void HUFFMANCODE(codetype code[],hufmtree tree[])
测验数据:7 5 2 3 8 10 20
五、代码
#include <stdio.h>
#include <stdlib.h>
#define maxval 1024
#define n 5
#define m 2*n-1
typedef int datatype;
//定义结构体
typedef struct
{
float weight;
do
{
scanf("%d",&b[j]);
}while(b[j++]!=-1);
j=0;
printf("\n\n电文译码为:");
while(b[j]!=-1)
{
if(b[j]==0)
i=tree[i].lchild-1;
else
i=tree[i].rchild-1;
if(tree[i].lchild==0)
{
int i,j,p1,p2;
float small1,small2,f;
for(i=0;i<m;i++)
{
tree[i].parent=0;
tree[i].lchild=0;
tree[i].rchild=0;
tree[i].weight=0.0;
}
printf("\n\t\t\t\t哈夫曼编码与译码\n");
上机实验报告
学院:计算机与信息技术学院
专业:计算机科学与技术(师范)
课程名称:数据结构
实验题目:哈夫曼树编码与译码
班级序号:师范1班
学号:201421012731
学生姓名:邓雪
指导教师:杨红颖
完成时间:2015年12月25号
一、实验目的:
本实验的目的是通过对简单的哈夫曼编/译码系统的设计与实现来熟练掌握树形结构在实际问题中的应用。设计要求对输入的一串电文字符实现哈夫曼编码,再对哈夫曼编码生成的代码串进行译码,输出电文字符串。
printf("%c ",code[i].bits[j]);
printf("\n");
}
}
//主函数
void main()
{
HUFFMAN(tree);
getchar();
printf("\n请输入结点所代表的字符:");
HUFFMANCODE(code,tree);
getchar();
Printma(code,tree);
八、参考文献
《数据结构——用C语言描述》
else
cd.bits[cd.start]='1';
c=p;
p=tree[p-1].parent;
}
code[i]=cd;
}
}
//哈夫曼译码
void DECODE(codetype code[],hufmtree tree[])
{
int i,j=0,b[60];
i=m-1;
printf("\n\n\n请输入电文(以-1结束):");
DECODE(code,tree);
printf("\n");
}
六、运行界面
七、实验中遇到的问题及总结
建树的时候出现了很多次的程序终止问题原因:对指针以及哈夫曼树不理解,不能很好的使用。通过写哈夫曼译码的程序让我更一步的理解了哈夫曼树,知道了哈夫曼树的存储结构以及编写程序时需要注意的一些地方,总体来说,虽然这次写的过程中出了很多问题,但还是有很多收获,让我进一步的理解以及学会了哈夫曼树的运用。
二、实验环境:
Windows 8.1
MicrosoftVisualc++ 6.0
三、实验内容及要求:
本设计必须实现以下几个方面的功能:
1)哈夫曼树的建立
2)哈夫曼编码的生成
3)编码文件的译码
四、概要设计:
创建哈夫曼树,定义二叉树结点值的类型为字符型。
建立编码文件的基本思想是:将要编码的字符串中的字符逐一与预先生成哈夫曼树时保存的字符编码对照表进行比较,找到以后,将字符的编码写入代码文件,直至所有的字符处理完为止。
printf("请输入叶子结点的权值:");
for(i=0;i<n;i++)
{
scanf("%f",&f);
tree[i].weight=f;
}
for(i=n;i<m;i++)
{
p1=0;
p2=0;
small1=maxval;
small2=maxval;
for(j=0;j<=i-1;j++)
if(tree[j].parent==0)
{
putchar(code[i].ch);
i=m-1;
}
j++;
}
}
//输出哈夫曼编码
void Printma(codetype code[],hufmtree tree[])
{
int i,j;
printf("\n");
printf("哈夫曼编码:\n");
for(i=0;i<n;i++)
{
for(j=code[i].start;j<n;j++)
int i,c,p;
codetype cd;
for(i=0;i<n;i++)
{
cd.start=n;
scanf("%c",&cd.ch);
c=i+1;
p=tree[i].parent;
while(p!=0)
{
cd.start--;
if(tree[p-1].lchild==c)
cd.bits[cd.start]='0';
int lchild,rchild,parent;
}hufmtree;
//定义结构体
typedef struct
{
char bits[n];
int start;
char ch;
}codetype;
hufmtree tree[m];
codetype code[n];
//建立哈夫曼树
void HUFFMAN(hufmtree tree[])
if(tree[j].weight<small1)
{
small2=small1;
small1=tree[j].weight;
p2=p1;
p1=j;
}
else
if(tree[j].weight<small2)
{
small2=tree[j].weight;
p2=j;
}
tree[p1].parent=i+1;
tree[p2].parent=Байду номын сангаас+1;
tree[i].lchild=p1+1;
tree[i].rchild=p2+1;
tree[i].weight=tree[p1].weight+tree[p2].weight;
}
}
//哈夫曼编码
void HUFFMANCODE(codetype code[],hufmtree tree[])
测验数据:7 5 2 3 8 10 20
五、代码
#include <stdio.h>
#include <stdlib.h>
#define maxval 1024
#define n 5
#define m 2*n-1
typedef int datatype;
//定义结构体
typedef struct
{
float weight;
do
{
scanf("%d",&b[j]);
}while(b[j++]!=-1);
j=0;
printf("\n\n电文译码为:");
while(b[j]!=-1)
{
if(b[j]==0)
i=tree[i].lchild-1;
else
i=tree[i].rchild-1;
if(tree[i].lchild==0)
{
int i,j,p1,p2;
float small1,small2,f;
for(i=0;i<m;i++)
{
tree[i].parent=0;
tree[i].lchild=0;
tree[i].rchild=0;
tree[i].weight=0.0;
}
printf("\n\t\t\t\t哈夫曼编码与译码\n");
上机实验报告
学院:计算机与信息技术学院
专业:计算机科学与技术(师范)
课程名称:数据结构
实验题目:哈夫曼树编码与译码
班级序号:师范1班
学号:201421012731
学生姓名:邓雪
指导教师:杨红颖
完成时间:2015年12月25号
一、实验目的:
本实验的目的是通过对简单的哈夫曼编/译码系统的设计与实现来熟练掌握树形结构在实际问题中的应用。设计要求对输入的一串电文字符实现哈夫曼编码,再对哈夫曼编码生成的代码串进行译码,输出电文字符串。
printf("%c ",code[i].bits[j]);
printf("\n");
}
}
//主函数
void main()
{
HUFFMAN(tree);
getchar();
printf("\n请输入结点所代表的字符:");
HUFFMANCODE(code,tree);
getchar();
Printma(code,tree);
八、参考文献
《数据结构——用C语言描述》
else
cd.bits[cd.start]='1';
c=p;
p=tree[p-1].parent;
}
code[i]=cd;
}
}
//哈夫曼译码
void DECODE(codetype code[],hufmtree tree[])
{
int i,j=0,b[60];
i=m-1;
printf("\n\n\n请输入电文(以-1结束):");
DECODE(code,tree);
printf("\n");
}
六、运行界面
七、实验中遇到的问题及总结
建树的时候出现了很多次的程序终止问题原因:对指针以及哈夫曼树不理解,不能很好的使用。通过写哈夫曼译码的程序让我更一步的理解了哈夫曼树,知道了哈夫曼树的存储结构以及编写程序时需要注意的一些地方,总体来说,虽然这次写的过程中出了很多问题,但还是有很多收获,让我进一步的理解以及学会了哈夫曼树的运用。
二、实验环境:
Windows 8.1
MicrosoftVisualc++ 6.0
三、实验内容及要求:
本设计必须实现以下几个方面的功能:
1)哈夫曼树的建立
2)哈夫曼编码的生成
3)编码文件的译码
四、概要设计:
创建哈夫曼树,定义二叉树结点值的类型为字符型。
建立编码文件的基本思想是:将要编码的字符串中的字符逐一与预先生成哈夫曼树时保存的字符编码对照表进行比较,找到以后,将字符的编码写入代码文件,直至所有的字符处理完为止。
printf("请输入叶子结点的权值:");
for(i=0;i<n;i++)
{
scanf("%f",&f);
tree[i].weight=f;
}
for(i=n;i<m;i++)
{
p1=0;
p2=0;
small1=maxval;
small2=maxval;
for(j=0;j<=i-1;j++)
if(tree[j].parent==0)
{
putchar(code[i].ch);
i=m-1;
}
j++;
}
}
//输出哈夫曼编码
void Printma(codetype code[],hufmtree tree[])
{
int i,j;
printf("\n");
printf("哈夫曼编码:\n");
for(i=0;i<n;i++)
{
for(j=code[i].start;j<n;j++)