
第一次发帖,先试试水,希望排版别太乱
字符的编码方式有多种,除了大家熟悉的ascii编码,哈夫曼编码(huffmancoding)也是一种编码方式,它是可变字长编码。字符的编码方式有多种,除了大家熟悉的ascii编码,哈夫曼编码(huffman coding)也是一种编码方式,它是可变字长编码。哈夫曼编码是上个世纪五十年代由哈夫曼教授研制开发的,它借助了数据结构当中的树型结构,在哈夫曼算法的支持下构造出一棵最优二叉树,我们把这类树命名为哈夫曼树.因此,准确地说,哈夫曼编码是在哈夫曼树的基础之上构造出来的一种编码形式,它的本身有着非常广泛的应用.那么,哈夫曼编码是如何来实现数据的压缩和解压缩的呢。
一开始是用的冒泡排序,编译出来是等长的编码。。而且找了一天没发现错误,最后换了选择排序,总算把问题揪出来了
不多说,上代码——
——————————————————————————————————————————————————————
#include <stdio.h>
#include <stdlib.h>
#define N 8
struct hNode//定义数组结点
{
int suffix ;//下标
int weight ;//权值
int parent , lchild , rchild ; //父子结点
};
struct cNode// 定义编码结点
{
int suffix ;
int weight ;
int length ; //编码长度
char *code ; //编码字符串
};
void Initial( hNode h[],int w[] )//数组初始化( 将数组w[]里的数放到到h[]里面 )
{
int i;
for ( i = 1 ; i <= N ; i++ ) // 前半部分 , 叶子结点的标号从1 到 N
{
h[i].suffix = i ;
h[i].weight = w[i-1];
h[i].parent = 0 ;
h[i].lchild = 0 ;
h[i].rchild = 0 ;
}
86 //1--n号存放叶子结点,初始化叶子结点,结构数组来初始化每个叶子结点,初始的时候看做一个个单个结点的二叉树。(1) a、根结点无左子树的二叉树 b、根结点无右子树的二叉树c、只有根结点的二叉树或非叶子结点只有左子树的二叉树d、只有根结点的二叉树或非叶子结点只有右子树的二叉树(2) a、非叶子结点只有左子树的二叉树 b、只有根结点的二叉树 c、根结点无右子树的二叉树 d、非叶子结点只有右子树的二叉树 10、 假设一棵二叉树的后序遍历序列为 dgjhebifca,中序遍历序列为 dbgehjacif,则其前序遍历序列为 (10) 。2.哈夫曼编码规定哈夫曼编码的左分支代表0,右分支代表1,则从根节点到每个叶子结点所经过的路径组成的0和1的序列便为该叶子结点对应字符的编码,称为哈夫曼编码。
{
h[i].suffix =i ;
h[i].weight =0 ;
h[i].parent = 0 ;
h[i].lchild = 0 ;
h[i].rchild = 0 ;
}

}
//将数组h[]的结点按权值大小或下标顺序排序
void Sort ( hNode h[] ,int m , int n ,int action )
{
int i , j , pos ,min , flag ;
hNode temp ;
if( action == 0 ) //action == 0 ,用选择排序依权值从小到大排序
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-95077-1.html
任何人任何组织都承担不起这个历史罪责
期待ing