请问各位大哥谁有霍夫曼解码算法的源程序啊,能解码已压缩文件,将其转化为Word格式的?小弟我感激不尽那

解决方案 »

  1.   

    我这也有一个,但不知怎的,编译没错,运行就出现问题了,程序很长,所以之前没发上来,各位如有耐心,可以看下吧,帮我找出哪错了,多谢!!
    程序如下:
    #include "stdio.h"
    #include "stdlib.h" //exit
    #include "math.h"  //pow,floor函数
    #include "string.h"  //strcmp函数
    //#include "huff_dLL.h" //若加上它main前面的所有函数声明和类型定义及常量定义都可以去掉#define END_OF_STREAM 256  //最后结束符为257
    #define Max_code_length 256 //共257个字符,可能的最长代码二进制位数为256个,假设第257个字符为结束符
    #define Max_number 257 //加上结束符,共257个字符
    typedef struct tree_node
    {
    //int data;  //结点值
        double weight;  //权重,把权重写入输出文件时,
    int flag;  //标识是否为待构建结点,是的话用0表示,否则用1表示
    int parent; //父结点
    int lchild; //左结点
    int rchild; //右结点
    }NODE;typedef struct codetype
    {
        int code[Max_code_length]; //共257个字符,可能的最长代码二进制位数为256个,假设第257个字符为结束符
    int code_length;
    }CODE;//申明要使用的函数
    FILE *read_file1(char *p1);
    FILE *write_file1(char *p1);
    void InitHuffman1(NODE nodes[],int n);//树的初始化
    int build_tree1(NODE nodes[]);//构建huffman树,返回根结点的位置,并返回值
    void input_counts1(FILE *input,NODE nodes[]);
    void expand_data1(FILE *input,FILE *output,NODE nodes[],int root_node);
    int inputbit1(FILE *input,unsigned char *r,int *pcode);//引用要使用的函数
    int main(int argc, char* argv[])
    {
    FILE *input,*output; //输入和输出文件的指针
    NODE nodes[2*Max_number-1];//定义513个节点
    int root_node;
    input=read_file1(argv[1]);//打开原始文件,读文件
    output=write_file1(argv[2]); //创建一个新文件,准备写入
        
    printf("\n decode %s to %s\n",argv[1],argv[2]);
    InitHuffman1(nodes,Max_number);
    input_counts1(input,nodes);
    root_node=build_tree1(nodes);
    expand_data1(input,output,nodes,root_node);
    printf("decode finish\n");
    return 0;
    }FILE *read_file1(char *p1)
    {
    FILE *in;

    in=fopen("D:\\***","rb");
    if(in==NULL)
    {
    printf("can't find the file");
    exit(0);
    }
    return(in);
    }FILE *write_file1(char *p1)
    {
    FILE *out; out=fopen("D:\\***","wb");
    if(out==NULL)
    {
    printf("can't open the file");
    exit(0);
    }
    return(out);
    }void InitHuffman1(NODE nodes[],int n)
    {
    int i;
    for(i=0;i<2*n-1;i++)
    {
    nodes[i].weight=0;
    nodes[i].parent=0;
    nodes[i].flag=0;
    nodes[i].lchild=-1;
    nodes[i].rchild=1;
    }
    }void input_counts1(FILE *input,NODE nodes[])
    {
    int i;
    for(i=0;i<=256;i++)
    nodes[i].weight=(double)fgetc(input);
    }int build_tree1(NODE nodes[])
    {
    int i,j,min1,min2;
    double m1,m2;
    for(i=1;i<=257;i++)
    {
    for(j=0;j<513;j++)
    if(nodes[j].weight!=0&&nodes[j].flag==0)
    {
    min1=j;
    m1=nodes[j].weight;
    break;
    }
    for(j=1;min1+j<513;j++)
    if(nodes[min1+j].weight!=0&&nodes[min1+j].flag==0)
    if(m1>nodes[min1+j].weight)
    {
    m1=nodes[min1+j].weight;
    min1=min1+j;
    j=0;
    }
    nodes[min1].flag=0;//将最小权重值标记为0
    for(j=0;j<513;j++)
    if(nodes[j].weight!=nodes[j].flag==0)
    {
    min2=j;
    m2=nodes[j].weight;
    break;
    }
    if(j==513)
    break;
    for(j=1;min2+j<513;j++)
    if(nodes[min2+j].weight!=0&&nodes[min2+j].flag==0)
    if(m2>nodes[min2+j].weight)
    {
    m2=nodes[min2+j].weight;
    min2=min2+j;
    j=0;
    }
    nodes[min2].flag=0;
    nodes[256+j].lchild=min1;
    nodes[256+j].rchild=min2;
    nodes[256+j].weight=m1+m2;
    nodes[min1].parent=256+i;
    nodes[min2].parent=256+i;
    }
    return(min1);
    }int inputbit1(FILE *input,unsigned char *r,int *pcode)//从以压缩文件中读入字符时,判断读入的每一位是0还是1,然后返回值
    {
    int value;
    value=(*pcode)&(*r);
    (*r)=(*r)>>1;
    if(*r==0);
    {
    *r=0x80;a
    *pcode=(int)fgetc(input);
    }
    return value;
    }void expand_data1(FILE *input,FILE *output,NODE nodes[],int root_node)
    {
    int node,i;
    unsigned char r1=0x80;
    int ascii_code=0;
    ascii_code=fgetc(input);
    while(1)
    {
    node=root_node;
    while(node>256)
    {
    i=inputbit1(input,&r1,&ascii_code);
    if(i==0)
    node=nodes[node].lchild;
    else
    node=nodes[node].rchild;
    }
    if(node==256)
    {
    fclose(input);
    fclose(output);
    break;
    }
    else
    fputc(node,output);

    }}
      

  2.   

    http://search.download.csdn.net/search/huffman
    ~~