霍夫曼树和霍夫曼编码(c / c ++代码)

电脑杂谈  发布时间:2020-06-03 09:20:49  来源:网络整理

huffman 编码 c_c哈夫曼树编码_哈夫曼编码树

标题: 霍夫曼树和霍夫曼编码:

从终端输入几个字符,计算(或指定)字符的频率,使用字符的频率作为节点的权重,建立霍夫曼树,然后霍夫曼对每个字符进行编码. 最后打印霍夫曼树和相应的霍夫曼代码

代码如下:

// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^ ## include

#include

#include

#include

#include

#define MAX_LENGTH 100

typedef结构

{

int weight; //用于存储每个节点的权重

int parent,lchild,rchild; //指向父级和子级节点的指针

} HTNode,* HuffmanTree; //动态分配数组存储的Huffman树

typedef char ** HuffmanCode; //动态分配数组存储Huffman代码

// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^ / / #####选择两个父节点为0且权重在ht [1]〜ht [i-1]范围内最小的节点,并将其序列号分别分配给s1和s2,并返回void选择(HuffmanTree HT,int i,int&s1,int&s2)

{

哈夫曼编码树_huffman 编码 c_c哈夫曼树编码

int j,k;

k = 1;

while(HT [k] .parent!= 0)

k ++; //跳出一会儿之后,HT [k] .parent = 0

s1 = k; //选择父节点为0的节点之一作为s1的初始值

对于(j = 1; j <= i; ++ j)

{

if(HT [j] .parent == 0 && HT [j] .weight

{

s1 = j;

}

}

k = 1;

while(HT [k] .parent!= 0 || k == s1)//避免s2的初始值为s1;

k ++;

s2 = k; //如果s2的初始值为s1,则最终s1 = s2,所以s2的初始值不能为s1

对于(j = 1; j <= i; ++ j)

哈夫曼编码树_huffman 编码 c_c哈夫曼树编码

{

if(HT [j] .parent == 0 && HT [j] .weight

{

s2 = j;

}

}

}

// ~~~~~~~~~~~~~~~~~~~~~~~~~~构造霍夫曼树ht并找到霍夫曼代码hc ~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ p

void HuffmanCoding(HuffmanTree&HT,HuffmanCode&HC,int * w,int n)

{// w存储n个权重,构造霍夫曼树ht,并找到霍夫曼代码hc

/

int * freqchar(int w [],int&m)

{

字符c;

int i,n,num [26] = {0}; //字符数,将26个字符初始化为0

n = 0;

printf(“请输入一个字符串: \ n”);

哈夫曼编码树_huffman 编码 c_c哈夫曼树编码

while(((c = getchar())!='\ n')

{

if(c> ='a'&& c <='z'|| c> ='A'&& c <='Z')

{

n ++;

if(c> ='a'&& c <='z')num [c-'a'] ++;

if(c> ='A'&& c <='Z')num [c-'A'] ++;

}

}

printf(“字符数: %d \ n”,n);

printf(“每个字符的出现次数: \ n”);

for(i = 0,m = 0; i <26; i ++)

{

if(num [i]> 0)

{

printf(“字符%c: %d次”,i +'a',num [i]);

w [m] = num [i];

huffman 编码 c_哈夫曼编码树_c哈夫曼树编码

m ++;

}

}

cout <<“” m =“ << m;

returnw;

}

// ____________________________________________ main()函数_________________________________________________

voidmain()

{

HuffmanTree HT;

HuffmanCodeHC;

int n;

int * w,W [MAX_LENGTH] ;;

cout << endl << endl <<“ HuffmanCoding.cpp”;

cout << endl <<“ ================= << endl;

w = freqchar(W,n); //统计字符的出现频率

HuffmanCoding(HT,HC,wc哈夫曼树编码c哈夫曼树编码,n);

cout << endl << endl <<“ ... OK!...”;

}

// ++++++++++++++++++++++++++++++++++++++++++++ main ()结束++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-232229-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      热点图片
      拼命载入中...