最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言實(shí)現(xiàn)哈夫曼編碼

 更新時(shí)間:2020年04月28日 10:28:23   作者:_yxy_  
這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)哈夫曼編碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了C語言實(shí)現(xiàn)哈夫曼編碼的具體代碼,供大家參考,具體內(nèi)容如下

代碼來自于《小甲魚C++快速入門》

主程序main.cpp

#include "stdafx.h"
#include <stdlib.h>
#include "huffman.h"
int main()
{
 htTree *codeTree = buildTree("I love wwwwwwwwwFishC.com!");//建立哈夫曼樹
 hlTable *codeTable = buildTable(codeTree);//建立編碼表
 encode(codeTable,"I love FishC.com!");//對輸入的字符串進(jìn)行編碼
 decode(codeTree,"0011111000111");//解碼
 system("pause");
 return 0;
}

兩個(gè)頭文件:
huffman.h:定義了哈夫曼樹和編碼表的結(jié)構(gòu)

#pragma once
#ifndef _HUFFMAN_H
#define _HUFFMAN_H
typedef struct _htNode{
 char symbol;
 struct _htNode *left,*right;
}htNode;
 
typedef struct _htTree{
 htNode *root;
}htTree;
 
typedef struct _hlNode{
 char symbol;
 char *code;
 struct _hlNode *next;
}hlNode;
 
typedef struct _hlTable{
 hlNode *first;
 hlNode *last;
}hlTable;
 
htTree *buildTree(char *str);
hlTable *buildTable(htTree *huffmanTree);
void encode(hlTable *table, char *stringToEncode);
void decode(htTree *tree, char *stringToDecode);
#endif

queue.h:定義了有序隊(duì)列的結(jié)構(gòu),將字符按優(yōu)先級排列,即頻率從小到大排列,val是樹節(jié)點(diǎn),直接由隊(duì)列建立起哈夫曼樹

#pragma once
#ifndef _PQUEUE_H
#define _PQUEUE_H
#include "huffman.h"
#define MAX_SZ 256
#define TYPE htNode *
 
typedef struct _pQueueNode{
 TYPE val;
 unsigned int priority;
 struct _pQueueNode *next;
}pQueueNode;
 
typedef struct _pQueue{
 unsigned int size;
 pQueueNode *first;
}pQueue;
 
void initPQueue(pQueue **queue);
void addPQueue(pQueue **queue, TYPE val, unsigned int priority);
TYPE getQueue(pQueue **queue);
#endif

兩個(gè)cpp文件實(shí)現(xiàn)兩個(gè)頭文件聲明的函數(shù):
huffman.cpp

#include "stdafx.h"
#include "queue.h"
#include "huffman.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
htTree *buildTree(char *str)
{
 int *probability = (int *)malloc(sizeof(int) * 256);
 //初始化
 for (int i = 0; i < 256; i++)
 {
 probability[i] = 0;
 }
 //統(tǒng)計(jì)待編碼的字符串各個(gè)字符出現(xiàn)的次數(shù)
 for (int j = 0; str[j] != '\0'; j++)
 {
 probability[str[j]]++;
 }
 
 //定義隊(duì)列的頭指針
 pQueue *huffmanQueue;
 initPQueue(&huffmanQueue);
 //填充隊(duì)列
 for (int k = 0; k < 256; k++)
 {
 if (probability[k] != 0)
 {
  htNode *aux = (htNode *)malloc(sizeof(htNode));
  aux->left = NULL;
  aux->right = NULL;
  aux->symbol = (char)k;
  addPQueue(&huffmanQueue, aux, probability[k]);
 }
 }
 free(probability);
 //生成哈夫曼樹
 while (huffmanQueue->size != 1)
 {
 unsigned int newPriority = huffmanQueue->first->priority + huffmanQueue->first->next->priority;
 htNode *aux = (htNode *)malloc(sizeof(htNode));
 aux->left = getQueue(&huffmanQueue);
 aux->right = getQueue(&huffmanQueue);
 addPQueue(&huffmanQueue, aux, newPriority);
 }
 htTree *tree = (htTree *)malloc(sizeof(htTree));
 tree->root = getQueue(&huffmanQueue);
 return tree;
}
 
void traverseTree(htNode *treeNode,hlTable **table,int k,char code[256])
{
 if (treeNode->left == NULL&&treeNode->right == NULL)
 {
 code[k] = '\0';
 hlNode *aux = (hlNode *)malloc(sizeof(hlNode));
 aux->code = (char *)malloc(sizeof(char)*(strlen(code) + 1));
   strcpy(aux->code,code);
 aux->symbol = treeNode->symbol;
 aux->next = NULL;
 if ((*table)->first == NULL)
 {
  (*table)->first = aux;
  (*table)->last = aux;
 }
 else
 {
  (*table)->last->next = aux;
  (*table)->last = aux;
 }
 }
 if (treeNode->left != NULL)
 {
 code[k] = '0';
 traverseTree(treeNode->left,table,k+1,code);
 }
 if (treeNode->right != NULL)
 {
 code[k] = '1';
 traverseTree(treeNode->right, table, k + 1, code);
 }
}
 
hlTable *buildTable(htTree *huffmanTree)
{
 hlTable *table = (hlTable *)malloc(sizeof(hlTable));
 table->first = NULL;
 table->last = NULL;
 
 char code[256];
 int k = 0;
 
 traverseTree(huffmanTree->root,&table,k,code);
 return table;
}
void encode(hlTable *table, char *stringToEncode)
{
 hlNode *traversal;
 printf("Encoding......\n\nInput string:\n%s\n\nEncoded string :\n",stringToEncode);
 for (int i = 0; stringToEncode[i] != '\0'; i++)
 {
 traversal = table->first;
 while (traversal->symbol != stringToEncode[i])
  traversal = traversal->next;
 printf("%s", traversal->code);
 }
 printf("\n");
}
void decode(htTree *tree,char *stringToDecode)
{
 htNode *traversal = tree->root;
 
 printf("\n\nDecoding......\n\nInput string: \n%s\n\nDecoded string: \n",stringToDecode);
 for (int i = 0; stringToDecode[i] != '\0'; i++)
 {
 if (traversal->left == NULL&&traversal->right == NULL)
 {
  printf("%c", traversal->symbol);
  traversal = tree->root;
 }
 if (stringToDecode[i] == '0')
  traversal = traversal->left;
 else if (stringToDecode[i] == '1')
  traversal = traversal->right;
 else
 {
  printf("The input string is not coded correctly!\n");
  return;
 }
 }
 printf("\n\n");
 return;
}

queue.cpp:

#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include "queue.h"
void initPQueue(pQueue **queue)
{
 *queue = (pQueue *)malloc(sizeof(pQueue));
 (*queue)->first = NULL;
 (*queue)->size = 0;
 return;
}
void addPQueue(pQueue **queue, TYPE val, unsigned int priority)
{
 if ((*queue)->size == MAX_SZ)
 {
 printf("\n Queue is full. \n");
 return;
 }
 pQueueNode *aux = (pQueueNode *)malloc(sizeof(pQueueNode));
 aux->priority = priority;
 aux->val = val;
 if ((*queue)->size == 0||(*queue)->first==NULL)
 {
 aux->next = NULL;
 (*queue)->first = aux;
 (*queue)->size = 1;
 return;
 }
 else
 {
 if (priority <= (*queue)->first->priority)
 {
  aux->next = (*queue)->first;
  (*queue)->first = aux;
  (*queue)->size++;
  return;
 }
 else
 {
  pQueueNode *iterator = (*queue)->first;
  while (iterator->next!=NULL)
  {
  if (priority <= iterator->next->priority)
  {
   aux->next = iterator->next;
   iterator->next = aux;
   (*queue)->size++;
   return;
  }
  iterator = iterator->next;
  }
  if (iterator->next == NULL)
  {
  aux->next = NULL; 
  iterator->next = aux;
  (*queue)->size++;
  return;
  }
 }
 }
}
TYPE getQueue(pQueue **queue)
{
 TYPE returnValue;
 if ((*queue)->size > 0)
 {
 returnValue = (*queue)->first->val;
 (*queue)->first = (*queue)->first->next;
 (*queue)->size--;
 }
 else
 {
 returnValue = NULL;
 printf("\n Queue is empty \n");
 }
 
 return returnValue;
}

運(yùn)行結(jié)果:

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • C語言中feof函數(shù)和ferror函數(shù)示例詳解

    C語言中feof函數(shù)和ferror函數(shù)示例詳解

    在C語言中feof函數(shù)用于檢查文件流的結(jié)束標(biāo)志,判斷文件在讀取時(shí)是否已經(jīng)到達(dá)了文件的末尾,這篇文章主要給大家介紹了關(guān)于C語言中feof函數(shù)和ferror函數(shù)的相關(guān)資料,需要的朋友可以參考下
    2024-09-09
  • 解析C++11的std::ref、std::cref源碼

    解析C++11的std::ref、std::cref源碼

    這篇文章主要介紹了解析C++11的std::ref、std::cref源碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • C++11顯示類型轉(zhuǎn)換的優(yōu)點(diǎn)

    C++11顯示類型轉(zhuǎn)換的優(yōu)點(diǎn)

    這篇文章主要介紹了C++11顯示類型轉(zhuǎn)換的優(yōu)點(diǎn),幫助大家更好的理解和學(xué)習(xí)c++,感興趣的朋友可以了解下
    2020-08-08
  • c++難以發(fā)現(xiàn)的bug(有趣)

    c++難以發(fā)現(xiàn)的bug(有趣)

    這篇文章主要介紹了c++難以發(fā)現(xiàn)的bug(有趣)的相關(guān)資料,需要的朋友可以參考下
    2017-10-10
  • C++/STL實(shí)現(xiàn)判斷平面內(nèi)兩條線段的位置關(guān)系代碼示例

    C++/STL實(shí)現(xiàn)判斷平面內(nèi)兩條線段的位置關(guān)系代碼示例

    這篇文章主要介紹了C++/STL實(shí)現(xiàn)判斷平面內(nèi)兩條線段的位置關(guān)系代碼示例,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-11-11
  • C++list的模擬實(shí)現(xiàn)

    C++list的模擬實(shí)現(xiàn)

    list是數(shù)據(jù)結(jié)構(gòu)中的鏈表,在C++的STL中,有l(wèi)ist的模板,STL中的list的結(jié)構(gòu)是帶頭雙向循環(huán)鏈表,當(dāng)然STL中還有一個(gè)forward_list的鏈表,這個(gè)鏈表是一個(gè)帶頭的單鏈表。為了更好的理解list,我們來對其進(jìn)行模擬實(shí)現(xiàn)。,需要的朋友可以參考
    2023-04-04
  • 一篇文章帶你入門C語言:操作符

    一篇文章帶你入門C語言:操作符

    這篇文章主要介紹了C語言中的運(yùn)算符,文中講解非常詳細(xì),適合初學(xué)小白進(jìn)行學(xué)習(xí),想入門C語言的朋友不妨了解下,希望能給你帶來幫助
    2021-08-08
  • C語言中字符型數(shù)據(jù)和浮點(diǎn)型數(shù)據(jù)介紹

    C語言中字符型數(shù)據(jù)和浮點(diǎn)型數(shù)據(jù)介紹

    大家好,本篇文章主要講的是C語言中字符型數(shù)據(jù)和浮點(diǎn)型數(shù)據(jù)介紹,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2022-01-01
  • C++:函數(shù)對象,STL提供的函數(shù)對象,函數(shù)適配器詳解

    C++:函數(shù)對象,STL提供的函數(shù)對象,函數(shù)適配器詳解

    這篇文章主要介紹了C++:函數(shù)對象,STL提供的函數(shù)對象,函數(shù)適配器的使用詳解,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-08-08
  • 用C語言實(shí)現(xiàn)掃雷游戲

    用C語言實(shí)現(xiàn)掃雷游戲

    這篇文章主要為大家詳細(xì)介紹了用C語言實(shí)現(xiàn)掃雷游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06

最新評論

靖远县| 莫力| 怀远县| 德令哈市| 临泉县| 贺兰县| 深州市| 达拉特旗| 彰武县| 建德市| 临猗县| 乌恰县| 南岸区| 马尔康县| 宁晋县| 陵水| 合江县| 阳春市| 乐清市| 托里县| 马山县| 广饶县| 刚察县| 吉首市| 莫力| 砀山县| 田东县| 黎平县| 伊川县| 张家界市| 漾濞| 浦县| 中西区| 仲巴县| 故城县| 广元市| 尖扎县| 青岛市| 安平县| 池州市| 安丘市|