霍夫曼解码程序,编译没错,运行有误,求解
程序很长,各位如有耐心,可以看下吧,帮我找出哪错了,多谢!!#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;
*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);
}
}
[ 本帖最后由 C语初学者 于 2010-10-11 20:53 编辑 ]