首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

求哈夫曼编译码的代码解决方法

2013-01-08 
求哈夫曼编译码的代码1、接受原始数据从终端读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树,并将它存

求哈夫曼编译码的代码
1、接受原始数据
从终端读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树,并将它存于文件hfmtree.dat中。
2、编码
利用已建好的哈夫曼树(如不在内存,则从文件hfmtree.dat中读入),对文件中的正文进行编码,然后将结果存于文件codefile.dat中。
3、译码
利用已建好的哈夫曼树将文件codefile.dat中的代码进行译码,结果存入文件textfile.dat中。
4、打印编码规则
即字符与编码的一一对应关系。

[解决办法]
可以参考我的博客,里面的程序是我自己写的,如有疑问可以留言交流。
http://blog.csdn.net/thefutureisour/article/details/7888893
[解决办法]
http://blog.csdn.net/a174787252/article/details/7261311
[解决办法]
#include <iostream>
#include <malloc.h>
using namespace std;
  
//存储树的节点  
typedef struct {  
    int weight;  
    int parent,lchild,rchild;  
}HTNode,*HuffmanTree;  
//找到s1,s2,tmp(下标)中,值更小的两个节点  
//权重更小的节点下标存在s1,次小存在s2  
//以下程序类似对三个数进行排序  
void compare(HuffmanTree &HT,int &s1,int &s2,int temp)  
{  
      
    if(HT[s1].weight <=HT[temp].weight &&HT[s1].weight<=HT[s2].weight )  
    {  
        if(HT[s2].weight >HT[temp].weight )  
        s2=temp;  
    }  
    else if(HT[s2].weight <=HT[temp].weight &&HT[s2].weight <=HT[s1].weight )  
    {    
        if(HT[s1].weight >HT[temp].weight )  
      
        {    s1=s2;  
             s2=temp;  
      
        }  
        else  
        {  
            temp=s1;  
            s1=s2;  
            s2=temp;  
        }  
    }  
    else  
    {  
        if(HT[s1].weight <HT[s2].weight )  
            s2=s1;  
        s1=temp;  
    }  
  
}  
//在n个节点中选择权重更小的两个节点  
void Select(HuffmanTree&HT,int n,int &s1,int &s2)  
{  
    int i=1,temp;  
    while(HT[i].parent !=0) i++;  
 s1=i++;  
    while(HT[i].parent !=0) i++;  
 s2=i++;  
    for(;i<=n;i++)  
    {  
        while(HT[i].parent !=0)i++;  


        temp=i;  
        compare(HT,s1 ,s2,temp );  
    }  
}  
//w存储1-n个节点的权重  
void HuffmanCoding(HuffmanTree&HT,char**&HC,int*w,int n)  
{  
    if(n<=1)return;  
    int i;  
    int s1,s2;  
    int m=2*n-1;  
    //m+1是因为下标0未被使用  
    HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode));  
    //1-n个节点初始化  
    for(i=1;i<=n;i++,w++)  
    {  
        HT[i].weight =*w;  
        HT[i].parent =0;  
        HT[i].lchild =0;  
        HT[i].rchild =0;  
    }  
    //节点n+1-m初始化为空  
    for(;i<=m;i++)  
    {  
        HT[i].weight =0;  
        HT[i].parent =0;  
        HT[i].lchild =0;  
        HT[i].rchild =0;  
    }  
      
    for(i=n+1;i<=m;i++){  
        //在1-n棵树中选择  
        Select(HT,i-1,s1,s2);  
        HT[s1].parent=i;HT[s2].parent=i;  
        HT[i].lchild=s1;HT[i].rchild=s2;  
        HT[i].weight =HT[s1].weight+HT[s2].weight;  
    }  
    //  
    HC=(char**)malloc((n+1)*sizeof(char*));  
    char *cd=(char*)malloc(n*sizeof(char));  
    cd[n-1]='\0';  
    //n为函数的参数  
    for(i=1;i<=n;i++)  
    {  
        int start=n-1;//因为是从叶子到根逆向求编码,所以这里从n-1开始存编码  
        //c为当前节点,f为c的父节点,f=HT[f].parent继续得到父节点  
        for(int c=i,f=HT[i].parent ;f!=0;c=f,f=HT[f].parent )  
            //如果是父节点的左孩子,则记录0  
            if(HT[f].lchild ==c)  
                cd[--start]='0';  
            else  
                cd[--start]='1';  
          
        HC[i]=(char*)malloc((n-start)*sizeof(char));  
        //从位置start开始复制到HC[i]中  


        strcpy(HC[i],&cd[start]);  
    }  
    //释放分配给cd的空间  
    free(cd);  
}  
  
int main()  
{  
    HuffmanTree HT;  
    int *w;  
    int n;  
    char **HC;  
    cin>>n;  
w=(int*)malloc(n*sizeof(int));
    for(int i=0;i<n;i++)  
        cin>>w[i];  
    HuffmanCoding(HT,HC,w,n);  
    for(i=1;i<=n;i++)  
        cout<<HC[i]<<endl;  
    return 0;  
}

热点排行