资源简介
绝对是完整的可以运行的程序!首先输入随便一段字符,根据字符的多少确定权值,最后编码译码。形象输出二叉树!
代码片段和文件信息
#include
# include
# include
# define maxsize 100
# define max 100
typedef struct
{
char data;
int weight;
int parent;
int left;
int right;
}huffnode; //记录哈夫曼树结点的数据类型
typedef struct
{
char cd[max];
int start;
}huffcode; //记录哈夫曼编码的数据类型
void dq(huffnode * ht) //初期化,读取字符串
{
char st[100];
FILE *fz;
char j;
int i=0nmcount=0x;
printf(“1.手动输入字符串 2.读取字符串文件 0.退出\n“);
scanf(“%d“&x);
getchar();
switch(x)
{
case 1:
printf(“输入字符串:“);
st[i]=getchar();
while(st[i]!=‘\n‘)
{
i++;
count++;
st[i]=getchar();
}
break;
case 2:
fz=fopen(“hfmtree.txt““r“);
if(fz==NULL)
{
printf(“没有字符串文件。\n“);
return;
}
else
{
j=fgetc(fz);
while(j!=EOF)
{
count++;
st[i]=j;
i++;
j=fgetc(fz);
}
fclose(fz);
}
break;
case 0:
break;
default:
printf(“输入错误。\n“);
}
for(i=0m=1;i {
for(n=1;n<=m;n++) //判断,频度表里面是有有当前字符
if(st[i]==ht[n].data) //若有,对应的频度加1
{
ht[n].weight++;
break;
}
if(n>m) //若没有,新增频度表,并初始化
{
ht[m].data=st[i];
ht[m].weight=1;
m++;
}
}
ht[0].data=‘#‘; //赋上特殊符号,用于判断是否空结点
ht[0].weight=m-1; //记录叶子数
printf(“字符频度表:\n“); //输出频度表
for(i=1;i<=ht[0].weight;i++){
printf(“%c:“ht[i].data);
printf(“%d\n“ht[i].weight);
}
}
void input(char * zf) //读取需要编码的文件,用数组记录文件内容
{
FILE * in;
char j;
int i;
in=fopen(“tobetrans.dat““r“);
if(in==NULL)
{
printf(“没有可编译的文件。\n“);
zf[0]=-1;
return;
}
else
{
for(i=0;i<=100;i++)
{
j=fgetc(in); //读取字符
if(j==EOF)
{
zf[i]=‘\0‘;
return;
}
else
{
zf[i]=j; //记录字符
}
}
}
fclose(in);
}
void select(huffnode * htint iint *s1int *s2)
//找出权值最小的树,s1记录最小值下标,s2记录次最小指下标
{
int x;
int m1m2;
m1=m2=1000;
for(x=1;x<=i;x++)
if(ht[x].parent==0) //对没有父亲结点的结点,进行对比
if(ht[x].weight {
m2=m1; //最小值变成次最小值
m1=ht[x].weight; //当前结点权值成为最小值
*s2=*s1; //最小值下标成为次最小值下标
*s1=x; //当前结点下标成为最小值小标
}
else
if(ht[x].weight {
m2=ht[x].weight; //当前结点的权值成为次最小值
*s2=x; //该下标成为次最小值下标
}
}
void hfmtree(huffnode * ht) //生成哈夫曼树
{
int ix1=0x2=0n;
n=ht[0].weight;
for(i=1;i<=2*n-1;i++)
ht[i].parent=ht[i].left=ht[i].right=0; //初始化
for(i=n+1;i<=2*n-1;i++)
{
select(hti-1&x1&x2);
ht[x1].parent=i;
ht[x2].parent=i;
ht[i].weight=ht[x1].weight+ht[x2].weight; //合并
ht[i].left=x1;
ht[i].right=x2;
}
}
void hcc(huffnode * htt) //存储哈夫曼树于文件hfmtree.bin
{
FILE * fht;
int i=0;
fht=fopen(“hfmtree.bin““wb“);
if(fht==NULL) printf(“建立文件hfmtree.bin失败。\n“);
else
{
fwrite(&htt[i]sizeof(huffnode)2*htt[0].weightfht);
fclose(fht);
}
}
void dhf(huffnode *
- 上一篇:基于MFCVC6.0的简单计算器程序
- 下一篇:C语言动画设计卫星环绕地球初学者
相关资源
- C语言动画设计卫星环绕地球初学者
- c语言五子棋小游戏课程设计报告
- 基本蚁群算法C语言,比较详细!
- c语言编写的一个基于mysql简单数据管
- CH422原厂C语言驱动
-
C语言编写的xm
l库源文件(支持xm< - C语言课程设计——职工管理系统
- 从放弃C语言到使用C刷算法的简明教程
- C语言程序设计——职工档案管理系统
- 火车票订票系统模拟 (C 语言)
- FFT算法的C语言实现可以直接用在单片
- 有源噪声控制FxLMS算法C语言程序
- C语言计算器界面
- C语言实现傅里叶变换
- 算术编码,C语言实现
- 用C语言实现任意矩阵的相乘
- C语言实现唯一可译码
- 数字图像处理算法C语言实现.
- C语言:powell鲍威尔法;
- 雅克比迭代法 c语言实现计算方法
- 基于C语言的快速傅里叶变换FFT算法含
- 基于C语言的BPSK
- 单项选择标准化考试系统 C语言版
- c语言解决迷宫问题
- HDB3码C语言实现
- C语言潮流计算
- C语言贪吃蛇小游戏
- KLT(C语言)
- c语言流程图生成器
- 数据结构严蔚敏C语言第二版习题答案
评论
共有 条评论