A simple test

哈夫曼编码


此代码用于生成哈夫曼树并且获取哈夫曼编码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char buffer[100010];
typedef struct node
{
    int cnt;
    char *s;
    struct node *left,*right,*next;
} HuffmanNode;
HuffmanNode* Root=NULL;
HuffmanNode Trees[200];
HuffmanNode* createNode()
{
    HuffmanNode* p = (HuffmanNode*)malloc(sizeof(HuffmanNode));
    p->cnt = 0;
    p->left=p->right=p->next=NULL;
    return p;
}
void InsertLinkedList(HuffmanNode* p)//插入有序链表中
{
    HuffmanNode* q = Root,*front=NULL;
    if (Root==NULL) {
        Root=p;
    } else {
        if (p->cnt < Root->cnt) {
            p->next = Root;
            Root = p;
        } else {
            while (q && q->cnt <= p->cnt) {//保证相等权值的结点总是后插入的在后面
                front = q;
                q = q->next;
            }
            p->next = front->next;
            front->next = p;
        }
    }
}
void getHuffmanCode(HuffmanNode* p,char *temp,int i) {//得到字符的Huffman编码
    if (p->left==NULL && p->right==NULL) {//只有在叶节点时才停止
        temp[i]=0;
        p->s = (char *)malloc(strlen(temp)+1);
        strcpy(p->s,temp);
        return;
    } else {
        temp[i]='0';
        getHuffmanCode(p->left,temp,i+1);//沿左子树,Huffman编码加一个'0'
        temp[i]='1';
        getHuffmanCode(p->right,temp,i+1);//沿右子树,Huffman编码加一个'1'
    }
}
int main()
{
    FILE* fin = fopen("input.txt","r");
    FILE* fout = fopen("output.txt","w");
    int i,len,j=0,t=0;
    char temp[1000];
    unsigned char hc=0;

    Trees[0].cnt = 1;//让'\0'权值为1
    len = fread(buffer,1,100000,fin);//统计每个字符的频率
    for (i=0;i<len;i++) {
        if (buffer[i]!='\n') {
            Trees[buffer[i]].cnt++;
        }
    }

    for (i=0;i<200;i++) {//ascii码值从小往大插入,保证了相等的权值下,ascii码值小的在前面
        if (Trees[i].cnt) InsertLinkedList(&Trees[i]);
    }

    while (Root->next) {//形成哈夫曼树
        HuffmanNode *p = Root,*q = Root->next;
        Root = Root->next->next;
        HuffmanNode *T = createNode();
        T->cnt = p->cnt+q->cnt;
        T->left = p;
        T->right = q;
        InsertLinkedList(T);
    }

    getHuffmanCode(Root,temp,0);//获取哈夫曼编码

    for (i=0;i<=len;i++) {//输出结果
        if (buffer[i]!='\n') {
            j=0;
            while (Trees[buffer[i]].s[j]) {
                hc = (hc<<1) | (Trees[buffer[i]].s[j++]-'0');//注意此处右移的用法
                t++;
                if (t==8) {//8位一输出
                    printf("%x",hc);
                    fputc(hc,fout);
                    hc=0;
                    t=0;
                }
            }
        }
    }
    while(t>0) {
        hc = hc<<1;
        t++;
        if (t==8) {
            printf("%x",hc);
            fputc(hc,fout);
            break;
        }
    }
    return 0;
}


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,335评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,895评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,766评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,918评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,042评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,169评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,219评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,976评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,393评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,711评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,876评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,562评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,193评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,903评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,142评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,699评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,764评论 2 351

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,900评论 25 707
  • 最近在看图像的压缩,就想着先实现一个jpeg文件的解码。本来以为这种资料在网上会一搜一大堆,但搜了之后才发现很多网...
    月夢書阅读 10,636评论 6 14
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,644评论 18 139
  • 你没看错,今天的读书日志不讲大道理,也不讲小案例。只为有“小姐姐”需求的小伙介绍一位国外大牛,看看人家是如何靠一条...
    Null_Point阅读 529评论 0 1
  • 1.什么是库,为什么使用库? 库是共享程序代码的方式,一般分为静态库和动态库;库实现了iOS程序的模块化,将某些特...
    公子墨香阅读 11,572评论 18 60