题目4《哈夫曼编码器》

题目表述:

实现一个哈夫曼编码器,主要功能包括以下几点:

1.建立哈夫曼树及编码:通过输入一段文本,统计每个字符出现的次数,构建哈夫曼树,计算每个字符的哈夫曼编码;

2.更新字符集和权值:支持用户动态输入新的字符和权值,更新哈夫曼树和编码;

3.对字符串进行编码并保存到文件:通过输入一段文本,使用哈夫曼编码对文本进行压缩,并将压缩后的二进制数据保存到文件中;

4.从文件中读取编码并进行译码:读取之前生成的压缩文件,使用哈夫曼编码进行译码,还原出原始的文本内容;

5.退出程序:在完成以上操作后,用户可以选择退出程序。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//哈夫曼树-》n个字符,需要2n-1个节点
#define max 30
typedef struct HTNode
{
    int weight;  //节点权重=>某字符出现次数
    char ch;    //记录字符
    int parent,left,right;//父节点、左孩子、右孩子的下标
}HTNode,*HuffmanTree;

typedef struct HFMcode
{
    char ch;
    char *code;
}HFMcode,*CODES;

//统计字符出现个数和种类
HuffmanTree countchar()
{
    HuffmanTree chs;
    char ch;
    int i,sum=0;
    chs=(HTNode*)malloc(sizeof(HTNode));//[0]空着
    printf("请输入字符串,以#为结束 :");
    scanf("%c",&ch);
    while(ch!='#')
    {
        int found=0;
        for(i=1;i<=sum;i++)
        {
            if(chs[i].ch==ch)
            {
                chs[i].weight++;
                found=1;
                break;
            }
        }
        if(found==0)
        {
            sum++;
            chs=(HTNode*)realloc(chs,sizeof(HTNode)*(sum+1));
            chs[sum].ch=ch;
            chs[sum].weight=1;
            chs[sum].parent=0;
            chs[sum].left  =0;
            chs[sum].right =0;
        }
        scanf("%c",&ch);
        }
    chs[0].parent=sum;//记录字符种类(叶子节点)个数
    return chs;
}

void select(HuffmanTree T,int number,int *m1,int *m2)//找出森林集合中根权值最小的两个的下标
{                         //number指T中可供选择合成的树个数
    int i;
    int key;
    int n=T[0].parent;//数组T已有的节点范围[1,n],(节点个数=节点最大下标)
    *m1=-1;
    *m2=-1;
    if(n<0){//节点最小为0,<0出错
        printf("错误!\n");return ;}
    else if(n==0){//0个节点,空
        printf("树空\n");return ;}
    if(number<=0){//无意义的
        printf("输入的剩余树的个数出错\n");return;}
    if(n<number){//数组已有节点范围>=剩余选择节点个数
       
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值