资源简介
哈夫曼编码及译码,可以查看编码后的二进制文件,可以打印生成的哈夫曼树,还可以译码,提供菜单选项,根据提示键入大写字母进行相应的操作
代码片段和文件信息
#include
#include
#include
struct bitree
{
char c;//字符
int num;//对应字符的个数
int flag;//标记位,先定义为1,在输出直观二叉树时使用
struct bitree *parent;
struct bitree *rchild;
struct bitree *lchild;
};
//二叉树节点信息
struct data
{
char c;//字符
int num;//对应字符的个数
int x[26];//对应字符的哈夫曼编码
}a[26];
//字符信息
struct stack
{
struct bitree *t;//二叉树节点指针
struct stack *next;
};
//构造二叉树的入栈出栈操作
int inputdata()
{
FILE *input;
char ch;
char infile[10];
printf(“please enter the filenamewhich will save the characters:“);
scanf(“%s“infile);
input=fopen(infile“w“);
printf(“please enter a string of charactersend with #:“);
getchar();
ch=getchar();
while(ch!=‘#‘)
{
fputc(chinput);
ch=getchar();
}
fclose(input);
return 0;
}
//输入需要编码的数据,保存在文件中
struct stack * pushstack(struct stack *hdstruct stack * tpstruct bitree *p)
{
struct stack *q;
int t=p->num;
q=(struct stack *)malloc(sizeof(struct stack));
if(q==NULL)
{
printf(“false!“);
exit(0);
}
q->t=p;
q->next=NULL;
if(tp->next==NULL)
{
q->next=tp;
tp=q;
return tp;
}
if(t<=tp->t->num)
{
q->next=tp;
tp=q;
return tp;
}
struct stack *s=tp;
while(s->next!=hd)
{
if(t>s->next->t->num)
s=s->next;
else
break;
}
q->next=s->next;
s->next=q;
return tp;
}
//各个字符按从大到小的顺序依次入栈
struct stack * statistics(struct stack *hdstruct stack *tp)
{
char ch;
int i;
char filename[10];
struct bitree *p;
FILE *output;
printf(“please enter the filenamewhich save the characters:“);
scanf(“%s“filename);
output=fopen(filename“r“);
if(output==NULL)
{
printf(“cannot open the file!“);
exit(0);
}
for(i=0;i<26;i++)
a[i].num=0;
while(!feof(output))
{
ch=fgetc(output);
if(ch>=97&&ch<=122)
{
for(i=97;i<=122;i++)
if(ch==i)
{
a[i-97].c=ch;
a[i-97].num++;
break;
}
}
}
fclose(output);
for(i=0;i<26;i++)
if(a[i].num)
printf(“(%c%d) “a[i].ca[i].num);
for(i=0;i<26;i++)
if(a[i].num)
{
p=(struct bitree *)malloc(sizeof(struct bitree));
if(p==NULL)
{
printf(“false!“);
exit(0);
}
p->c=a[i].c;
p->flag=1;
p->num=a[i].num;
p->lchild=p->parent=p->rchild=NULL;
tp=pushstack(hdtpp);
}
return tp;
}
//分析文件中的字符,并且入栈
struct stack *popstack(struct stack *top)
{
struct stack *p;
p=top->next;
free(top);
top=p;
return top;
}
//出栈操作,构造二叉树时使用
struct stack * inittree(struct stack *headstruct st
- 上一篇:一个语法分析程序C语言
- 下一篇:浙江大学 面向对象程序设计历年试卷
评论
共有 条评论