
标题: 霍夫曼树和霍夫曼编码:
从终端输入几个字符,计算(或指定)字符的频率,使用字符的频率作为节点的权重,建立霍夫曼树,然后霍夫曼对每个字符进行编码. 最后打印霍夫曼树和相应的霍夫曼代码
代码如下:
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^ ## 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)
{

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) { 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”); 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]; 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
喘气吗
真的好想好想接近你桃子
武器的火力强度