c实现哈夫曼树和哈夫曼编码
2013-12-06 15:52
302 查看
typedef struct HaffTree{
int parent,lchild,rchild;
int data;
int weight;
}HaffTree,*Htree;
typedef char* *Ch;
//得到每个叶子结点的haffman编码值
void get_haff_code(Htree T,Ch *ch,int n){
int c,f;
char * chpoint=(char*)malloc(n*sizeof(char)); //分配一串字符空间
chpoint[start]='/0'; //最后一个字符设置为空格,便于在控制台输出更清晰。
for(int i=1;i<=n;i++){ //从第一个叶子结点开始循环读取haff编码
int start=n-1;
for(c=1,f=T[c].parent;f!=0;c=f;f=T[f].parent) //
{ if(T[f].lchild==c)
chpoint[--start]='0'; //若为左孩子则设置为0
else
chpoint[--start]='1'; //否则设置为1
}
ch[i]=(char*)malloc((n-start)sizeof(char)); //分配得到的编码的长度的字符空间。
strcopy(ch[i],&chpoint[start]); //复制。
}
free(chpoint); //最后释放空间。
}
//创建一个Haffmantree,传递的参数为:T 树的首地址,s1为左孩子的序号,s2为右孩子序号,n为叶子结点数
void create_haff_tree(Htree T,int n,int &s1,int&s2){
for(int i=n+1;i<2*n-1;i++){
select_max_node(T,i-1,&s1,&s2);
T[s1].parent=i;
T[s2].parent=i;
T[i].lchild=s1;
T[i].rchild=s2;
T[i].weight=T[s1].weight+T[s2].weight;
}
}
Ch* init_tree(Htree T,Data *v,int n)
{
Ch *ch;
int m= 2*n-1;
T=(Htree)malloc((m+1)*sizeof(HaffTree));//分配m+1个结点的HaffTree,从1开始计数
ch=(Ch)malloc((m+1)sizeof(Ch)); //分配m+1个字符串指针数组,每个指针值指向一串字符编码
//***************初始化叶子结点值
for(int i=1;i<=m;i++)
{
T[i]->parent=0;
T[i]->lchild=0;
T[i]->rchild=0;
T[i]->data=v.data;
T[i]->weight=v.weight;
}
//*****************初始化父节点的值
for(int i=n+1;i<=2*n-1;i++)
{
T[i].parent=0;
T[i].lchild=0;
T[i].rchild=0;
T[i].weight=0;
}
return ch;
}
int parent,lchild,rchild;
int data;
int weight;
}HaffTree,*Htree;
typedef char* *Ch;
//得到每个叶子结点的haffman编码值
void get_haff_code(Htree T,Ch *ch,int n){
int c,f;
char * chpoint=(char*)malloc(n*sizeof(char)); //分配一串字符空间
chpoint[start]='/0'; //最后一个字符设置为空格,便于在控制台输出更清晰。
for(int i=1;i<=n;i++){ //从第一个叶子结点开始循环读取haff编码
int start=n-1;
for(c=1,f=T[c].parent;f!=0;c=f;f=T[f].parent) //
{ if(T[f].lchild==c)
chpoint[--start]='0'; //若为左孩子则设置为0
else
chpoint[--start]='1'; //否则设置为1
}
ch[i]=(char*)malloc((n-start)sizeof(char)); //分配得到的编码的长度的字符空间。
strcopy(ch[i],&chpoint[start]); //复制。
}
free(chpoint); //最后释放空间。
}
//创建一个Haffmantree,传递的参数为:T 树的首地址,s1为左孩子的序号,s2为右孩子序号,n为叶子结点数
void create_haff_tree(Htree T,int n,int &s1,int&s2){
for(int i=n+1;i<2*n-1;i++){
select_max_node(T,i-1,&s1,&s2);
T[s1].parent=i;
T[s2].parent=i;
T[i].lchild=s1;
T[i].rchild=s2;
T[i].weight=T[s1].weight+T[s2].weight;
}
}
Ch* init_tree(Htree T,Data *v,int n)
{
Ch *ch;
int m= 2*n-1;
T=(Htree)malloc((m+1)*sizeof(HaffTree));//分配m+1个结点的HaffTree,从1开始计数
ch=(Ch)malloc((m+1)sizeof(Ch)); //分配m+1个字符串指针数组,每个指针值指向一串字符编码
//***************初始化叶子结点值
for(int i=1;i<=m;i++)
{
T[i]->parent=0;
T[i]->lchild=0;
T[i]->rchild=0;
T[i]->data=v.data;
T[i]->weight=v.weight;
}
//*****************初始化父节点的值
for(int i=n+1;i<=2*n-1;i++)
{
T[i].parent=0;
T[i].lchild=0;
T[i].rchild=0;
T[i].weight=0;
}
return ch;
}
相关文章推荐
- 数据结构(15)--哈夫曼树以及哈夫曼编码的实现
- C语言哈夫曼树和哈夫曼编码的实现
- 哈夫曼树与哈夫曼编码详解及C++模板实现
- 哈夫曼树数据机构的建立及哈夫曼编码与解码的C++实现
- 哈夫曼编码和哈夫曼树的实现——Pascal实现
- 数据结构与C语言实现(五)——树(下):哈夫曼树与哈夫曼编码
- 树和二叉树的基本运算实现-哈夫曼树/哈夫曼编码
- C/C++ — 哈夫曼树与哈夫曼编码的实现
- 哈夫曼编码、哈夫曼树构建、哈夫曼树Java实现
- 哈夫曼树及哈夫曼编码Java实现
- [置顶] 树:哈夫曼树和哈夫曼编码的详细介绍以及代码实现
- 数组实现哈夫曼树及哈夫曼编码
- 哈夫曼树及哈夫曼编码的实现
- java创建哈夫曼树和实现哈夫曼编码
- 数据结构图文解析之:哈夫曼树与哈夫曼编码详解及C++模板实现
- 哈夫曼树、哈夫曼编码 C++实现
- 哈夫曼树及哈夫曼编码 C++代码实现
- 哈夫曼树的基本操作,(树的建立,带权路径长度,哈夫曼编码)
- 哈夫曼树与哈夫曼编码
- 哈夫曼树实现