跪求霍夫曼解码程序 请问各位大哥谁有霍夫曼解码算法的源程序啊,能解码已压缩文件,将其转化为Word格式的?小弟我感激不尽那 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我这也有一个,但不知怎的,编译没错,运行就出现问题了,程序很长,所以之前没发上来,各位如有耐心,可以看下吧,帮我找出哪错了,多谢!!程序如下:#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); }} http://search.download.csdn.net/search/huffman~~ 一个按钮自绘问题 怎样得到WebBrowser中页面焦点所在的元素的指针? 谢谢!急,状态栏问题 关于MFC程序运行时的参数 一题也不会的——google面试题 如何Domodal两次?? 如何从服务器端得到客户端正在运行的所有进程 利用ADO技术Select表中数据??? 求教,在MFC下,如果结束程序? mfc里面的OnOk按钮是如何产生的,他的消息又是如何发送的,请大神详细讲解下,在线等................................... 谁给我解释一下这个code具体是干什么的 VS2010中打开一个MFC项目(任何选项卡都看不到任何文件)奇怪啊!
程序如下:
#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);
}}
~~