`

哈夫曼编码

 
阅读更多
装载请注明涞源chengyaogen.blog.chinaunix.net
 
前面一节我们知道了,怎样去创建一个哈夫曼树,这一节我们来看看哈夫曼编码。
 
思想:得到哈夫曼树后,自顶向下按路径编号,指向左节点的边编号0,指向右节点的边编号1,从根到叶节点的所有边上的0和1连接起来,就是叶子节点中字符的哈夫曼编码。
 
下图体现了哈夫曼编码的过程:
 
 
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. //哈夫曼树结点
  5. typedef struct HuffNode
  6. {
  7.     int weight;
  8.     char ch;
  9.     char code[20];
  10.     struct HuffNode *rchild;
  11.     struct HuffNode *lchild;
  12.     
  13. }HuffMan;
  14. //队列设计
  15. typedef struct _node_
  16. {
  17.     HuffMan *data;
  18.     struct _node_ *next;
  19. }ListNode;
  20. typedef struct
  21. {
  22.     ListNode *front;
  23.     ListNode *rear;
  24. }Queue;
  25. //create empty queue
  26. Queue *create_empty_queue()
  27. {
  28.     ListNode *HList;
  29.     Queue *Hqueue;
  30.     HList = (ListNode *)malloc(sizeof(ListNode));
  31.     HList->next = NULL;
  32.     
  33.     Hqueue = (Queue *)malloc(sizeof(Queue));
  34.     Hqueue->front = Hqueue->rear = HList;
  35.     return Hqueue;
  36. }
  37. //入队
  38. int EnterQueue(Queue *head,HuffMan *data)
  39. {
  40.     ListNode *temp;
  41.     temp = (ListNode *)malloc(sizeof(ListNode));
  42.     temp->data = data;
  43.     temp->next = NULL;
  44.     head->rear->next = temp;
  45.     head->rear = temp;
  46.     return 0;
  47. }
  48. //有序插入结点
  49. int OrderEnterQueue(Queue *head,HuffMan *p)
  50. {
  51.     ListNode *= head->front->next;
  52.     ListNode *= head->front;
  53.     ListNode *temp;
  54.     while(m)
  55.     {
  56.         if(m->data->weight < p->weight)
  57.         {
  58.             m = m->next;
  59.             n = n->next;
  60.         }
  61.         else{
  62.             
  63.             break;
  64.         }
  65.     }
  66.     //插到最后一个结点
  67.     if(== NULL)
  68.     {
  69.         temp = (ListNode *)malloc(sizeof(ListNode));
  70.         temp->data = p;
  71.         temp->next = NULL;
  72.         n->next = temp;
  73.         head->rear = temp;
  74.         return 0;
  75.     }
  76.     //插入中间结点
  77.     temp = (ListNode *)malloc(sizeof(ListNode));
  78.     temp->data = p;
  79.     n->next = temp;
  80.     temp->next = m;
  81.     return 0;
  82. }
  83. //判断队列是否为空(注意,我们认为队列含有一个结点为空,想想为什么
  84. //这样做?
  85. int _is_empty_queue(Queue *head)
  86. {
  87.     if(head->front->next->next == NULL)
  88.     {
  89.         printf("is_empty_queue\n");
  90.         return 1;
  91.     }
  92.     
  93.     return 0;
  94. }
  95. //判断队列是否为空
  96. int is_empty_queue(Queue *head)
  97. {
  98.     if(head->front == head->rear)
  99.         return 1;
  100.     else
  101.         return 0;
  102. }
  103. //出队
  104. HuffMan *DeleteQueue(Queue * head)
  105. {
  106.     ListNode *temp;
  107.     temp = head->front;
  108.     head->front = temp->next;
  109.     free(temp);
  110.     temp = NULL;
  111.     return head->front->data;
  112. }
  113. //创建哈夫曼树
  114. HuffMan *create_huffman_tree(Queue *head)
  115. {
  116.     HuffMan *right,*left,*current;
  117.     //循环结束时,队列只含有一个结点
  118.     while(!_is_empty_queue(head))
  119.     {
  120.         left = DeleteQueue(head);
  121.         right = DeleteQueue(head);
  122.         current = (HuffMan *)malloc(sizeof(HuffMan));
  123.         current->weight = left->weight + right->weight;
  124.         current->rchild = right;
  125.         current->lchild = left;
  126.         OrderEnterQueue(head,current);    
  127.     }
  128.     return head->front->next->data;
  129. }
  130. //哈夫曼编码
  131. int HuffmanCode(HuffMan *root)
  132. {
  133.     HuffMan *current = NULL;
  134.     Queue *queue = NULL;
  135.     queue = create_empty_queue();
  136.     EnterQueue(queue, root);
  137.     while(!is_empty_queue(queue))
  138.     {
  139.         current = DeleteQueue(queue);
  140.         if(current->rchild == NULL && current->lchild == NULL)
  141.         {
  142.             printf("%c:%d %s\n",current->ch,current->weight,current->code);
  143.         }
  144.         if(current->lchild)
  145.         {
  146.             strcpy(current->lchild->code,current->code);
  147.             strcat(current->lchild->code,"0");
  148.             EnterQueue(queue, current->lchild);
  149.         }
  150.         if(current->rchild)
  151.         {
  152.             strcpy(current->rchild->code,current->code);
  153.             strcat(current->rchild->code,"1");
  154.             EnterQueue(queue, current->rchild);
  155.         }
  156.     }
  157.     return 0;
  158. }
运行结果:
分享到:
评论

相关推荐

    哈夫曼编码的贪心算法设计

    ### 哈夫曼编码的贪心算法设计 #### 实验背景与意义 哈夫曼编码是一种广泛应用的数据压缩技术,特别是在文件压缩领域有着极其重要的作用。哈夫曼编码利用了贪心算法的思想来构建最优的前缀编码树,进而达到高效...

    哈夫曼树与哈夫曼编码

    哈夫曼树与哈夫曼编码是数据结构和算法领域中的一个重要概念,广泛应用于数据压缩、文本编码以及优先队列等场景。哈夫曼编码是一种特殊的前缀编码方法,能够为字符提供一种高效的二进制表示,使得频繁出现的字符具有...

    哈夫曼编码计算信源熵及编码效率

    哈夫曼编码计算信源熵及编码效率 哈夫曼编码是一种变长前缀编码方法,它可以根据信源符号的概率分布计算信源熵和编码效率。本文将详细介绍哈夫曼编码的原理、步骤和实现方法。 哈夫曼编码的原理 哈夫曼编码的原理...

    简单哈夫曼编码实例

    哈夫曼编码是一种高效的数据编码方法,主要用于无损数据压缩。它的原理是为每个字符分配一个唯一的二进制编码,使得频繁出现的字符拥有较短的编码,而不常出现的字符则有较长的编码,以此来减少平均编码长度,达到...

    图像处理哈夫曼编码程序

    哈夫曼编码是一种高效的数据编码方法,主要用于无损数据压缩,尤其在文本和图像处理领域广泛应用。它基于字符出现频率构建最优的二叉树结构,使得频繁出现的字符占用更短的编码,从而提高压缩效率。这个“图像处理...

    哈夫曼编码C语言实现-利用哈夫曼编码进行通信可以大大提高信道的利用率

    利用哈夫曼编码进行通信可以大大提高信道的利用率,缩短信息传输的时间,降低传输成本。根据哈夫曼编码的原理,编写一个程序,在用户输入结点权值的基础上求哈夫曼编码。 从键盘输入若干字符及每个字符出现的频率,...

    哈夫曼编码matlab程序

    ### 哈夫曼编码MATLAB程序解析 #### 前言 哈夫曼编码是一种广泛应用在数据压缩领域的编码方式,其核心思想是通过构建一棵特殊的二叉树(哈夫曼树)来实现对不同字符的高效编码。该编码方法在确保原始数据可被完全...

    哈夫曼编码C语言程序

    哈夫曼编码是一种高效的数据压缩方法,主要用于无损数据压缩,尤其在文本文件的压缩中效果显著。它基于字符出现频率构建最小带权路径长度(Minimum Weighted Path Length, MWPL)的二叉树,也被称为哈夫曼树。在这个...

    c语言实现哈夫曼编码

    哈夫曼编码是一种高效的数据压缩方法,由大卫·艾伦·哈夫曼在1952年提出。它是基于字符频率构建的一种前缀编码,能够为频繁出现的字符分配较短的编码,从而减少数据存储空间,提高传输效率。在C语言中实现哈夫曼...

    哈夫曼编码 将文本哈夫曼编码并求平均码长

    ### 哈夫曼编码原理及其实现 #### 前言 哈夫曼编码是一种广泛应用在数据压缩领域的编码方式,特别适用于无损压缩。它通过构建一个特殊的二叉树——哈夫曼树来实现最优前缀编码。本文将详细介绍哈夫曼编码的基本...

    哈夫曼编码译码器

    哈夫曼编码是一种高效的数据压缩方法,源自于数据结构中的二叉树理论,由David A. Huffman在1952年提出。它基于频率最小的编码原则,通过构建一棵特殊的二叉树(哈夫曼树)来为每个字符或符号生成唯一的前缀编码,...

    哈夫曼编码C++实现

    哈夫曼编码是广泛用于数据文件压缩的十分有效的编码方式,其压缩率通常在20%—90%之间。哈夫曼编码算法是通过使用字符在文件中出现的频率表来构造最优前缀码的贪心算法。所谓前缀码,即是任一字符的编码都不是其他...

    哈夫曼树及哈夫曼编码数据结构实验报告

    哈夫曼编码是一种高效的前缀编码方法,它根据数据出现频率分配最短的二进制码,频繁出现的字符拥有较短的编码,从而减少传输或存储的数据量。 实验报告中提到的实验目的是为了让学生熟练掌握树形结构,特别是哈夫曼...

    哈夫曼编码译码器 C语言 数据结构课设

    哈夫曼编码是一种高效的数据压缩方法,常用于文本、图像等多种数据类型的压缩。在数据结构课程中,哈夫曼树(又称最优二叉树)是理解哈夫曼编码的关键。这个C语言实现的哈夫曼编码译码器是学习哈夫曼编码原理和实践...

    三元哈夫曼编码 哈夫曼树

    "三元哈夫曼编码 哈夫曼树" 哈夫曼树是一种特殊的二叉树结构,它可以用于数据压缩、图像处理和网络通讯等领域。哈夫曼树的构造方法是根据给定的权值来构造一棵二叉树,使其带权路径长度 WPL 最小。哈夫曼树的优点是...

    哈夫曼编码实现对文件的加密解密

    哈夫曼编码是一种基于二叉树的数据压缩方法,由美国计算机科学家戴维·哈夫曼在1952年提出。在本项目中,我们利用哈夫曼编码实现了对文本文件的加密和解密功能,具体操作是针对ASCII字符集内的字符进行。以下是关于...

    哈夫曼编码解码的可视化界面实现

    哈夫曼编码是一种高效的数据编码方法,主要用于无损数据压缩,通过构建最优的二叉树结构(哈夫曼树)来实现对字符的编码。在本项目中,使用Java语言实现了一个哈夫曼编码和解码的可视化界面,使得用户能够直观地观察...

    数据结构大作业-哈夫曼编码实验报告.doc

    哈夫曼编码实验报告 数据结构大作业哈夫曼编码实验报告是一个关于哈夫曼编码的实验报告,讲述了哈夫曼编码的基本原理、构造过程和代码实现。哈夫曼编码是一种变长前缀编码,用于数据压缩和编码。下面是该实验报告的...

    哈夫曼编码译码器(数据结构)

    哈夫曼编码是一种高效的数据压缩方法,源自于数据结构中的二叉树理论,由David A. Huffman在1952年提出。它基于频率优先的原则,通过构建最优的二叉树(也称为哈夫曼树或最小带权路径长度树)来为字符或符号分配唯一...

Global site tag (gtag.js) - Google Analytics