📄 huffmantree.txt
字号:
#include<process.h>
#include<stdlib.h>
#include<dos.h>
#include<conio.h>
#include<stdio.h>
#define Key_DOWN 80
#define Key_UP 72
#define left 77
#define right 75
#define Key_A 30
#define Key_B 48
#define Key_C 46
#define Key_E 18
#define Key_ENTER 28
#define maxsize 110
char *m1[]={"Initialize"," Coding"," Decoding"," Cprint "," Tprint "," Exit"};
typedef struct nodetype{
int weight;
char data;
int parent,lch,rch;
}node;
typedef struct codetype{
int bits[maxsize];
int start;
}code;
typedef struct ynode{
char value;
int len;
int ad;
} ye;
node huftree[maxsize];
code hufcode[maxsize];
ye yy[maxsize];
int begin=1;
int getkey() /*取按键值函数*/
{
union REGS rg;
rg.h.ah=0;
int86(0x16,&rg,&rg);
return rg.h.ah;
}
void choosing(int this,int last)
{
lowvideo();
textcolor(LIGHTBLUE);
gotoxy((last-1)*10+3,2); cprintf("%s",m1[last-1]);
highvideo();
textcolor(YELLOW);
gotoxy((this-1)*10+3,2); cprintf("%s",m1[this-1]);
}
void select(int i,int *s3 ,int *s4,node ht[maxsize]){
int k,temp1,temp2,o,f,h,p;
for(p=1;p<=i;p++) {
if (ht[p].parent==0) { temp1=ht[p].weight; break;}
}
for(k=1;k<=i;k++){
if (ht[k].parent!=0) continue;
if (ht[k].weight<temp1) temp1=ht[k].weight;
}
for(k=1;k<=i;k++){
if ((ht[k].weight==temp1)&&(ht[k].parent==0)) {o=k;break;}
}
for(p=1;p<=i;p++) {
if ((ht[p].parent==0)&&(ht[p].weight>temp1)) {
temp2=ht[p].weight; break;
}
}
for(k=1;k<=i;k++){
if ( (k==o)|| (ht[k].parent!=0) )continue;
if (ht[k].weight<temp2) temp2=ht[k].weight;
}
for(k=1;k<=i;k++){
if(k==o) continue;
if ((ht[k].weight==temp2)&&(ht[k].parent==0)) {f=k;break;}
}
*s3=o;
*s4=f;
/*printf("s3=%d ch=%c ",*s3,ht[o].data);
printf("s4=%d ch=%c \n ",*s4,ht[f].data);
getch();
*/
}
void buildtree(){ /*建哈夫曼树*/
FILE *fp,*fp1,*fp2;
int w[maxsize];
struct nodetype node[maxsize],ht[maxsize];
code cd;
code hcd[maxsize];
int i,m,s1,s2,n,c,f,t,j;
printf("Please input the n : ");
scanf("%d",&n);
m=2*n-1;
for(i=1;i<=n;i++){
gotoxy(1,wherey());
printf("Please input %d chars and weights : ",i);
fflush(stdin);
scanf("%c%d",&node[i].data,&node[i].weight);
}
for(i=1;i<=m;i++) {
ht[i].parent=0;
ht[i].lch=0;
ht[i].rch=0;
}
for(i=1;i<=n;i++){
ht[i].weight=node[i].weight;
ht[i].data=node[i].data;
}
for(i=n+1;i<=m;i++){
select(i-1,&s1,&s2,ht);
ht[s1].parent=i;
ht[s2].parent=i;
ht[i].lch=s1;
ht[i].rch=s2;
ht[i].parent=0;
ht[i].weight=ht[s1].weight+ht[s2].weight;
ht[i].data='*';
}
for(i=1;i<=2*n-1;i++){
cd.start=n;
c=i;
f=ht[c].parent;
while (f!=0){
if (ht[f].lch==c) cd.bits[cd.start]=0;
else cd.bits[cd.start]=1;
cd.start=cd.start-1;
c=f;
f=ht[f].parent;
}
hcd[i]=cd;
}
if((fp2=fopen("code","wt"))==NULL){
getch();
exit(1);
}
for(i=1;i<=2*n-1;i++){
fwrite(&hcd[i],sizeof(code),1,fp2);
}
fclose(fp2);
if((fp=fopen("hfmtree","wb"))==NULL){
printf("open file is fail hfmtree");
getch();
exit(1);
}
for(i=1;i<=m;i++){
fwrite(&ht[i],sizeof(node),1,fp);
}
fclose(fp);
fp1=fopen("test.dat", "w");
fprintf(fp1, "%d\n", n);
fclose(fp1);
getch();
}
void coding2(){
int i,c,n,f,j,t,cn,o;
code cd;
code hcd[maxsize],a[maxsize];
node ht[maxsize];
char text[maxsize],ch;
FILE *fp,*fp1,*fp2,*fp3;
if((fp1=fopen("test.dat", "r"))==NULL){
printf("Cannot open file strike any key exit!00000");
getch();
}
fscanf(fp1, "%d", &n);
fclose(fp1);
if((fp=fopen("hfmtree","rb"))==NULL){
printf("Cannot open file strike any key exit!2222");
getch();
}
for(i=1;i<=2*n-1;i++){
fread(&ht[i],sizeof(struct nodetype),1,fp);
}
fclose(fp);
if((fp2=fopen("code","rt"))==NULL){
printf("Cannot open file strike any key exit!2222");
getch();
}
for(i=1;i<=n;i++){
fread(&hcd[i],sizeof(code),1,fp2);
}
fclose(fp2);
gotoxy(1,5);printf("Please input your text : ");
fflush(stdin);
gets(text);
for(cn=0;text[cn]!='\0';cn++);
if((fp=fopen("codefile.dat","w"))==NULL){
getch();
exit(1);
}
if((fp2=fopen("tobetrans.txt","w"))==NULL){
printf("Cannot open the file.....5555666\n");
getch();
exit(1);
}
for(j=0;j<=cn-1;j++){
fwrite(&text[j],sizeof(char),1,fp2);
}
for(i=0;i<cn;i++){
for(j=1;j<=n;j++){if (text[i]==ht[j].data) {o=j;break;} }
t=hcd[o].start+1;
for(j=t;j<=n;j++){
fwrite(&hcd[o].bits[j],sizeof(int),1,fp);
}
}
getch();
fclose(fp2);
fclose(fp);
}
void coding()
{
int i,c,n,f,j,t,cn,o;
code cd;
code hcd[maxsize],a[maxsize];
node ht[maxsize];
char text[maxsize],ch;
FILE *fp,*fp1,*fp2,*fp3;
if((fp1=fopen("test.dat", "r"))==NULL)
{
printf("Cannot open file strike any key exit!00000");
getch();
}
fscanf(fp1, "%d", &n);
fclose(fp1);
if((fp=fopen("hfmtree","rb"))==NULL)
{
printf("Cannot open file strike any key exit!2222");
getch();
}
for(i=1;i<=2*n-1;i++)
{
fread(&ht[i],sizeof(struct nodetype),1,fp);
}
fclose(fp);
if((fp2=fopen("code","rt"))==NULL)
{
printf("Cannot open file strike any key exit!2222");
getch();
}
for(i=1;i<=n;i++)
{
fread(&hcd[i],sizeof(code),1,fp2);
}
fclose(fp2);
if((fp2=fopen("tobetrans.txt","r"))==NULL)
{
printf("Cannot open the file.....5555666\n");
getch();
exit(1);
}
cn=0;
while(fread(&ch,sizeof(char),1,fp)!=NULL)
{
text[cn]=ch;cn++;
if((fp=fopen("codefile.dat","w"))==NULL)
{
getch();
exit(1);
}
for(i=0;i<cn;i++)
{
for(j=1;j<=n;j++)
{if (text[i]==ht[j].data)
{o=j;break;}
}
t=hcd[o].start+1;
for(j=t;j<=n;j++){ /*printf("%d",hcd[o].bits[j]) ;*/
fwrite(&hcd[o].bits[j],sizeof(int),1,fp);
}
}
gotoxy(15,6);printf("!** CODEING SUCCESSSFULLY **!");
fclose(fp2);
fclose(fp);
}
}
void decoding(){
FILE *fp1,*fp;
int code[maxsize];
int root,check=0,in;
int i=0,cn,n;
struct nodetype ht[maxsize];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -