• 大小: 11KB
    文件类型: .c
    金币: 2
    下载: 1 次
    发布日期: 2021-08-04
  • 语言: C/C++
  • 标签:

资源简介

哈夫曼编码及译码,可以查看编码后的二进制文件,可以打印生成的哈夫曼树,还可以译码,提供菜单选项,根据提示键入大写字母进行相应的操作

资源截图

代码片段和文件信息

#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

评论

共有 条评论