赫夫曼编译码程序出现错误,请各位大师帮我看看。急
#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
}