| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 480 人关注过本帖
标题:霍夫曼解码程序,编译没错,运行有误,求解
只看楼主 加入收藏
C语初学者
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2009-7-23
结帖率:100%
收藏
 问题点数:0 回复次数:0 
霍夫曼解码程序,编译没错,运行有误,求解
程序很长,各位如有耐心,可以看下吧,帮我找出哪错了,多谢!!
#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 编辑 ]
搜索更多相关主题的帖子: 霍夫曼 求解 解码 编译 
2010-10-11 20:51
快速回复:霍夫曼解码程序,编译没错,运行有误,求解
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018634 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved