/*algo6-1.c 求哈夫曼编码。实现算法6.12的程序*/公用的常量和类型-includeincludeincludeinclude函数结果状态代码define TRUE 1define FALSE 0define OK 1define ERROR 0define INFEASIBLE-1define OVERFLOW-2define UINT_MAX 1000typedef int Status;c6-7.h 哈夫曼树和哈夫曼编码的存储表示*/typedef struct HTNode{char leaf;unsigned int weight;unsigned int parent,lchild,rchild;}HTNode,*HuffmanTree;动态分配数组存储哈夫曼编码表*/typedef char*HuffmanCode;动态分配数组存储哈夫曼编码表*/typedef struct Node{char leaf;unsigned int weight;struct Node*next;}LeafNode,*LeafLink;typedef struct{LeafLink head;unsigned len;}LeafLinkList;int min1(HuffmanTree t,int i){/*函数void select()调用*/int j,flag;unsigned int k=UINT_MAX;取k为不小于可能的值*/for(j=1;j;j+)if(t[j].weight[j].parent=0)k=t[j].weight,flag=j;t[flag].parent=1;return flag;}void select(HuffmanTree t,int i,int*s1,int*s2){/*s1为最小的两个值中序号小的那个*/int j;s1=min1(t,i);s2=min1(t,i);if(*s1>;*s2){j=*s1;s1=*s2;s2=j;}}。
求哈夫曼编码 #includeincludeinclude定义赫夫曼树结点的结构体变量,存放结点的权值、字符、双亲、坐孩子和右孩子*/typedef struct{int weight;char ch;增加一个域用于存放该节点的字符int parent,lchild,rchild;}HTNode,*HuffmanTree;typedef char*HuffmanCode;指向赫夫曼编码的指针本程序用到的函数原型*/void welcome();打印操作选择界面void HuffmanCoding(HuffmanTree&,char*,int*,int);建立赫夫曼树的算法void select(HuffmanTree HT,int j,int*s1,int*s2);从目前已建好的赫夫曼树中选择parent为0且weight最小的两个结点void Init();输入n个字符及其对应的权值,根据权值建立哈夫曼树void Coding();编码void Decoding();译码void Print_code();打印译码好的代码文件void Print_tree();以凹凸表形式打印哈夫曼树int Read_tree(HuffmanTree&);从文件中读入赫夫曼树void find(HuffmanTree&HT,char*code,char*text,int i,int m);译码时根据01字符串寻找相应叶子节点的递归算法void Convert_tree(unsigned char T[100][100],int s,int*i,int j);将内存中的赫夫曼树转换成凹凸表形式的赫夫曼树HuffmanTree HT;全局变量,指向存放赫夫曼树的存储空间int n=0;。
哈夫曼编码码字的如何确定?我会写编码过程,就是不知道怎么确定码字,书上说是从最后一级开始,向前返回
给一串给定的概率进行哈夫曼编码,其结果是不是唯一的??? 不唯一,同一层上的结点,位置是可以互换的。哈夫曼树不唯一,所以,编码也不唯一。