📄 哈夫曼树应用4.txt
字号:
#include
#include
#include
#include
int n;
struct node{
int w;
int flag;
char c;
struct node *plink,*llink,*rlink;
char code[50];
}*num[100],*root;
FILE *fp;
char tmpcode[50];
int t=0;
void main(void)
{
int i;
void settree(void); //建立树
void code(void); //对文件编码
void decode(void); // 译码
void disp(void) ;
root=(struct node*)malloc(sizeof(struct node));
puts("*******************哈夫曼编/译码器演示******************************");
while(1){
start:
puts("1. 初始化 2. 编码 3. 译码 4.显示编码表 5. 退出");
while(scanf("%d",&i)!=1)
{
while(getchar()!=
)
continue;
puts("输入错误!");
puts("请重新输入!");
puts("1. 初始化 2. 编码 3. 译码 4.显示编码表 5. 退出");
}
switch (i)
{
case 1:
settree();
break;
case 2:
code();
break;
case 3:
decode();
break;
case 4:
disp();
break;
case 5:
exit(0);
default:
puts("输入错误!");
puts("请重新输入!");
goto start;
}
}
}
void settree(void)
{
int i,j,k;
struct node *p1,*p2,*tmp,*p;
void go(struct node *);
void setcode(struct node *);//建立每一个字符的编码
void printtree(struct node *);
puts("输入字符集的大小:");
scanf("%d",&n);
while(getchar()!=
)
continue;
for(i=0;i
{
p=(struct node *)malloc(sizeof(struct node));
puts("请输入一个字符");
scanf("%c",&p->c);
while(getchar()!=
)
continue;
puts("请输入该字符的权值:");
scanf("%d",&p->w);
while(getchar()!=
)
continue;
p->plink=NULL;
p->rlink=NULL;
p->llink=NULL;
num[i]=p;
}
for(i=0;i
{
for(j=i+1;j
{
if(num[i]->w>num[j]->w)
{
tmp=num[i];
num[i]=num[j];
num[j]=tmp;
}
}
}
/*******************************开始建立树***********************/
num[n]=NULL; //结束标志
k=n;
while(num[1]!=NULL)
{
p=(struct node *)malloc(sizeof(struct node));
p1=num[0];
p2=num[1];
p->llink=p1;
p->rlink=p2;
p->plink=NULL;
p1->plink=p;
p2->plink=p;
p->w=p1->w+p2->w;
for(i=1;i
{
num[i]=num[i+1];
}
k--;
num[0]=p;
for(i=0;i
{
for(j=i+1;j
{
if(num[i]->w>num[j]->w)
{
tmp=num[i];
num[i]=num[j];
num[j]=tmp;
}
}
}
}
root=num[0];
/*建立完毕*/
/*写入文件,前序*/
if((fp=fopen("c:hfmtree.wxl","wb"))==NULL)
{
puts("文件打开错误!");
getchar();
exit(0);
}
setcode(root);
go(root);
fclose(fp);
}
void setcode(struct node *p)
{
if(p->llink==NULL&&p->rlink==NULL)
{
tmpcode[t]=;
strcpy(p->code,tmpcode);
}
else
{
tmpcode[t++]=0;
setcode(p->llink);
t--;
tmpcode[t++]=1;
setcode(p->rlink);
t--;
}
}
void go(struct node *p)
{
if(p->llink==NULL&&p->rlink==NULL)
{
fputc((,fp);
fputc(p->c,fp);
fputs(p->code,fp);
fputc(),fp);
}
else
{
go(p->llink);
go(p->rlink);
}
}
void code(void)
{
FILE *fp1,*fp2,*fp3;
char ch1,ch2,c;
if((fp1=fopen("c:hfmtree.wxl","rb"))==NULL)
{
puts("文件打开错误!");
getchar();
exit(0);
}
if((fp2=fopen("c: obetrans.txt","rb"))==NULL)
{
puts("文件打开错误!");
getchar();
exit(0);
}
if((fp3=fopen("c:codefile.wxl","wb"))==NULL)
{
puts("文件打开错误!");
getchar();
exit(0);
}
while((ch1=fgetc(fp2))!=EOF)
{
t=0;
while((ch2=fgetc(fp1))!=EOF)
{
if(ch1==ch2)
{
while((c=fgetc(fp1))!=))
{
tmpcode[t++]=c;
}
tmpcode[t]=;
fputs(tmpcode,fp3);
fputc(@,fp3);
rewind(fp1);
break;
}
}
}
fclose(fp1);
fclose(fp2);
fclose(fp3);
}
void decode(void)
{
FILE *fp1,*fp2,*fp3;
char ch1,ch2,ch3;
char temp_3[20];
char temp_1[20];
int t1,t3;
if((fp1=fopen("c:hfmtree.wxl","rb"))==NULL)
{
puts("文件打开错误!");
getchar();
exit(0);
}
if((fp2=fopen("c: extfile.txt","wb"))==NULL)
{
puts("文件打开错误!");
getchar();
exit(0);
}
if((fp3=fopen("c:codefile.wxl","rb"))==NULL)
{
puts("文件打开错误!");
getchar();
exit(0);
}
while((ch3=fgetc(fp3))!=EOF)
{
t3=0;
while(ch3!=@)
{
temp_3[t3++]=ch3;
ch3=fgetc(fp3);
}
temp_3[t3]=;
while((ch1=fgetc(fp1))!=EOF)
{
if(isalpha(ch1))
{
ch2=ch1;
t1=0;
while((ch1=fgetc(fp1))!=))
{
temp_1[t1++]=ch1;
}
temp_1[t1]=;
if(strcmp(temp_1,temp_3)==0)
{
fputc(ch2,fp2);
rewind(fp1);
break;
}
}
}
}
fclose(fp1);
fclose(fp2);
fclose(fp3);
}
void disp(void)
{
FILE *fp1,*fp2;
char ch1,ch2;
char tmp[20];
int t;
if((fp1=fopen("c:hfmtree.wxl","rb"))==NULL)
{
puts("文件打开错误!");
getchar();
exit(0);
}
if((fp2=fopen("c:hfmcode.txt","wb"))==NULL)
{
puts("文件打开错误!");
getchar();
exit(0);
}
while((ch1=fgetc(fp1))!=EOF)
{
if(ch1==()
{
t=0;
ch1=fgetc(fp1);
ch2=ch1;
while((ch1=fgetc(fp1))!=))
{
tmp[t++]=ch1;
}
tmp[t]=;
printf("%c-----%s
",ch2,tmp);
fputc(ch2,fp2);
fputc(-,fp2);
fputc(-,fp2);
fputc(-,fp2);
fputs(tmp,fp2);
fputc(
,fp2);
}
}
fclose(fp1);
fclose(fp2);
}
在建立树完成之后,输入"2",根本不能编码,提示"文件打开错误",这是什么原因啊.还有,这个程序中,打开另外一个文件怎么用fopen("c:hfmtree.wxl","wb")类似的函数,这个函数好象没见过,如果c或c++那应该用什么函数?后缀wxl是什么意思啊,还有后面的wb也无法理解打开另外一个文件怎么用fopen("c: hfmtree.wxl","wb")类似的函数,这个函数好象没见过,如果c或c++那应该用什么函数?后缀wxl是什么意思啊,还有后面的wb也无法理解,还有后面的(ch1=fgetc(fp1))!=EOF中的EOF是什么意思呢,伤脑筋啊
请大家千万要帮帮忙啊,如果谁有关于这个问题更好的程序,不吝赐教,我感激不尽啊!!!!!!!!!!!!!!!!多谢大家.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -