| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 440 人关注过本帖
标题:赫夫曼编译码程序出现错误,请各位大师帮我看看。急
只看楼主 加入收藏
loritajiang
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2010-12-29
结帖率:0
收藏
已结贴  问题点数:20 回复次数:2 
赫夫曼编译码程序出现错误,请各位大师帮我看看。急
#include "he.h"
#include<math.h>
#include<stdio.h>
#include<string.h>
#include<conio.h>
#include<iostream>
using namespace std;
void HuffmanCoding(HuffmanTree &HT,HuffmanCode &HC,int *w,int n){
    HuffmanTree p;
    int m,i;
    if(n<=1)
        return ;
    m=2*n-1;
    HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode));
    for(p=HT,i=1;i<=n;++i,++p,++w)
        *p={*w,0,0,0};
    for(;i<=m;++i,++p)
        *p={0,0,0,0};
    for(i=n+1;i<=m;++i){
        int h,k;                //通过循环一次构造每一个双亲结点与其左右子树。
        Select(HT,i-1,h,k);    //s1,s2分别为最小和次小的数,通过调用函数,得到最小的两个数。进行以下的赋值。
        HT[h].parent=i;       //构造s1的双亲结点
        HT[k].parent=i;      //构造s2的双亲结点
        HT[i].lchild=h;     //即通过HT[i]将s1与s2的双亲结点合并,即生成了一个双亲结点,且为其赋值
        HT[i].rchild=k;    //这个双亲结点的右子数
        HT[i].weight=HT[h].weight+HT[k].weight; //每一个双亲结点的权值
    }
    //----从叶子到根逆向求每个字符的赫夫曼编码----//
    HC=(HuffmanCode)malloc((n+1)*sizeof(char *));
    char *cd;
    int c,f,start;
    cd=(char *)malloc(n*sizeof(char));
    cd[n-1]="\0";
    for(i=1;i<=n;++i){
        start=n-1;
        for(c=i,f=HT[i].parent;f!=0;c=f,f=HT[f].parent)
            if(HT[f].lchild==c)
                cd[--start]="0";
            else cd[--start]="1";
            HC[i]=(char *)malloc((n-start)*sizeof(char));
            strcpy(HC[i],&cd[start]);
    }
    free(cd);
}     //HuffanCoding为每个字符编码
void Select(HuffmanTree HT,int n,int &s1,int &s2)//查找这些数据中最小和次小的那个数
{
    int min2;
    int min1=100000;
    for(int i=1;i<=n;i++)//第一个for循环来寻找最小的那个数
    {
        if(HT[i].parent==0&&HT[i].weight<min1)
        {s1=i;
        min1=HT[i].weight;
        }
    }
    min2=1000000;//定义一个无穷大的数,即不可能超过的数。
    for(int j=1;j<=n;j++)//第二个for循环来寻找次小的那个数
    {
        if(HT[j].parent==0&&(s1!=j)&&HT[j].weight<min2)
        {
            s2=j;
            min2=HT[j].weight;
        }
    }
    if(s1>s2)//找到两个数中最小的那个数。
    {int temp;
    temp=s1;
    s1=s2;
     s2=temp;
    }
}
void Init(HuffmanTree &HT,HuffmanCode &HC,char *ch,int &n)
{//从键盘上分别输入若干个字符以及权值,分别存放在两个不同的数组中。
     ch[10];
    int zhi[10];
    int m;
    for(int i=0;i<10;i++)
    {
        cin>>ch[i];
        cout<<"ch字符数组的第"<<i<<"个数是:"<<ch[i]<<"\t";
    }
    for(int j=10;j<10;j++)
    {cin>>zhi[j];
        cout<<"zhi权值数组的第"<<j<<"个数是:"<<ch[j]<<"\t";
    }
    FILE *fp;
    n=strlen(ch);
    HuffmanCoding(HT,HC,zhi,ch);
    fp=fopen("hfmtree.text","zhi");//创建打开文件hfmtree.txt
    m=2*n-1;
    fprintf(fp,"%d\n",m);//保存赫夫曼中结点的数
    for(int i=0;i<m;i++)//保存赫夫曼中的数
        fprintf(fp,"%-6u%-6u%-6u%-6u\n",HT[i].weight,HT[i].parent,HT[i].lchild,HT[i].rchild);
    fclose(fp);//关闭文件
    fp=fopen("hc.txt","w");//创建打开文件hc.txt
    fprintf(fp,"%d\n",n);
    //for
fclose(fp);//关闭文件tc.txt
}
void Code(HuffmanCode HC,char *ch,int n)
{int j;
char c;
FILE *fp,*fp1;
if((fp1=fopen("BTree.txt","r"))==NULL)//打开文件BTree.txt
{
    cout<<"The file is not found\n";
    exit(0);
}
fp=fopen("codefile","zhi");//建立文件confile
c=fgetc(fp1);
while(c!=EOF)
{
    for(j=0;j<n;j++)
        if(c==ch[j])
            break;
        else
        {
            cout<<"没有这个字符"<<endl;
            exit(0);
        }
fprintf(fp,"%s",HC[j]);
c=fgetc(fp1);
}
fclose(fp);
fclose(fp1);
}
//将已建好的赫夫曼树将文件codefile中的代码进行一马,结果存入文件textfile中
void Decode(HuffmanTree HT,char *ch,int n)
{
    int m;
    char c;
    FILE *fp,*fp1;
    if((fp1=fopen("codefile","r"))==NULL)//打开文件codefile
    {//若文件codefile不存在,则报错,并中断程序的执行
        cout<<"file is found \n";
        exit(0);
    }
    fp=fopen("textfile.txt","zhi");
    m=2*n-1;
    while(!feof(fp1))
    {
        c=fgetc(fp1);
        if(c=='0')
            m=HT[m].lchild;
        else
            m=HT[m].rchild;
        if(HT[m].lchild==0&&HT[m].rchild==0)
        {
            fputc(ch[m-1],fp);
            m=2*n-1;
        }
    }
    fclose(fp);
    fclose(fp1);
}
//打印代码的文件模块//
//将文件codefile以紧凑的格式显示在终端上,每行25个字符,同时将此字节形式的编码文件写入文件codeprint中
void printcode()
{
    unsigned char a=0,c,k=0,i=0;
    FILE *fp,*fp1;
    if((fp1=fopen("codefile","r"))==NULL)//打开文件codefile
    {
        //若文件codefile不存在,则报错,并中断程序的执行.
        cout<<"file is not found\n";
        exit(0);
    }
    fp=fopen("codeprint","zhi");
    c=fgetc(fp1);
    while(!feof(fp1))//未到文件尾部,则循环
    {//每行8个字符,合成一个字符存于a中
        c=c-'0';//将字符转换成数字
        a=(a<<1)|c;
        k++;
        if(k==8)
        {
            k=0;
            fputc(a,fp);//合成的字节写到文件codeprint中
            cout<<a;
            a=0;
            i++;
            if(i==25)
            {
                cout<<endl;
                i=0;
            }
        }
        c=fgetc(fp1);
    }
    if(k)
    {
        for( ;k<8;k++)
            a=a<<1;
        fputc(a,fp);
        cout<<a;
    }
    cout<<endl;
    fclose(fp);//关闭文件codeprint
    fclose(fp1);//关闭文件codefile
}


搜索更多相关主题的帖子: return 
2010-12-30 21:07
诸葛修勤
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:11
帖 子:549
专家分:1955
注 册:2010-10-28
收藏
得分:10 
顶上去
2011-01-01 08:40
qq1023569223
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:湖南科技大学
等 级:贵宾
威 望:26
帖 子:2753
专家分:13404
注 册:2010-12-22
收藏
得分:10 
代码之长,纯属罕见,看得头晕了。不是自己写的,恐怕不好找错了。

   唯实惟新 至诚致志
2011-01-03 21:43
快速回复:赫夫曼编译码程序出现错误,请各位大师帮我看看。急
数据加载中...
 
   



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

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