哈夫曼编码[tc]

#include "stdio.h"
#include "stdlib.h"
#include "conio.h"
#include "string.h"
#include "ctype.h"
/********************全局变量定义部分***************************/
int n;
FILE *fp;
char tmpcode[50];
int t=0;
/*************************结点定义***************************/
struct node{
 int w;
 int flag;
 char c;
 struct node *plink,*llink,*rlink;
 char code[50];
}*num[100],*root;
/*************************函数声明********************/
void Initialization(void);  /*建立树*/
void Encoding(void);   /*对文件编码*/
void Decoding(void);   /*译码*/
void Print(void);    /*印制代码文件*/
char DrawScreen();    /*菜单显示*/
void WriteHfmTree(struct node *);/*将编码写入HfmTree文件*/
void GetCode(struct node *); /*建立每一个字符的编码*/
/********************主函数从这里开始*****************/
void main()
{
 char c;
 root=(struct node*)malloc(sizeof(struct node)); /*初始化根节点*/
 do
 {
  system("cls");
  clrscr();
  c=DrawScreen();
  switch(c)
  {
  case 'i':;
   case 'I':Initialization();;break;
  case 'e':;
   case 'E':Encoding();break;
  case 'd':;
   case 'D':Decoding();break;
  case 'p':;
   case 'P':Print();break;
  case 't':;
   case 'T':Print();break;
  case 'q':;
   case 'Q':exit(0);break;
  default :printf("Input Error!/n");
  } 
 }while(c!='q'&&c!='Q');
}
/*************************DrawScreen***************************/
char DrawScreen()
{
 int i;
 char *f[]={"  Initialization.", "[E] Encoding.", "[D] Decoding.","[P] Print.", "[T] Tree printing.", "[Q] Quit."};
 clrscr();
 textcolor(LIGHTRED);
 textbackground(DARKGRAY);
 window(0, 0, 80, 45);
 clrscr();
 for(i=0; i<6; i++)
 { 
  gotoxy(30, i+10);
  cputs(f[i]);
 }
 printf("/n");
 gotoxy(20, i+10);
 cputs("Please input your choice:");
 return (getchar());
}
/*************************Initialization***************************/
void Initialization(void)
{   
 int i,j,k;
 struct node *p1,*p2,*tmp,*p; 
 puts("Input the number of the code:");
 scanf("%d",&n);
 while(getchar()!='/n')
  continue;  
 for(i=0;i<n;i++)
 { 
  p=(struct node *)malloc(sizeof(struct node));
  puts("Please input a charactor:");
  scanf("%c",&p->c);
  while(getchar()!='/n')
   continue;
  puts("Please input it/'s size:");
  scanf("%d",&p->w);
  while(getchar()!='/n')
   continue;   
  p->plink=NULL;
  p->rlink=NULL;
  p->llink=NULL;
  num[i]=p;
 }   
 for(i=0;i<n-1;i++)     /*按照权重从小到大选择排序*/
 {   
  for(j=i+1;j<n;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<k;i++)
  {
   num[i]=num[i+1];
  }  
  k--;
  num[0]=p;
  for(i=0;i<k-1;i++)     /* 排序 */
  {   
   for(j=i+1;j<k;j++)   
   {   
    if(num[i]->w>num[j]->w) 
    { 
     tmp=num[i]; 
     num[i]=num[j];  
     num[j]=tmp; 
    }  
   }  
  }   
 }   
 root=num[0];
 if((fp=fopen("hfmTree.hfm","wb"))==NULL) /*写入文件*/ 
 {
  puts("File open error!"); 
  getchar(); 
  exit(0);
 }
 GetCode(root);
 WriteHfmTree(root);
 fclose(fp);
  }
/*************************GetCode***************************/
  void GetCode(struct node *p)
  {   
   if(p->llink==NULL&&p->rlink==NULL)
   {
    tmpcode[t]='/0';
    strcpy(p->code,tmpcode);
   }
   else   
   {   
    tmpcode[t++]='0';  /*递归调用*/
    GetCode(p->llink);
    t--;
    tmpcode[t++]='1';
    GetCode(p->rlink);
    t--;
   }   
  }
/*************************WriteHfmTree***************************/
  void WriteHfmTree(struct node *p)
  {   
   if(p->llink==NULL&&p->rlink==NULL)
   {   
    fputc('(',fp);
    fputc(p->c,fp);
    fputs(p->code,fp);
    fputc(')',fp);
   }
   else   
   {   
    WriteHfmTree(p->llink);
    WriteHfmTree(p->rlink);
   }   
  }
/*************************Encoding***************************/
  void Encoding(void)
  {
   FILE *fp1,*fp2,*fp3;   
   char ch1,ch2,c;
   if((fp1=fopen("hfmTree.hfm","rb"))==NULL)
   {   
    puts("fp1 File open error!");   
    getchar();   
    exit(0);   
   }
   if((fp2=fopen("tobetrans.txt","rb"))==NULL)
   {
    puts("fp2 File open error!");
    getchar();
    exit(0);
   }
   if((fp3=fopen("CodeFile.hfm","wb"))==NULL)
   {
    puts("fp3 File open error!");
    getchar();
    exit(0);
   }
   printf("/nCode From File is:/n");
   while((ch1=fgetc(fp2))!=EOF)
   {
    t=0;
    printf("%c->",ch1);
    while((ch2=fgetc(fp1))!=EOF)
    {
     if(ch1==ch2)
     {
      while((c=fgetc(fp1))!=')')
      {
       tmpcode[t++]=c;
      }
      tmpcode[t]='/0';
      fputs(tmpcode,fp3);
      printf("%s./n",tmpcode);
      fputc('-',fp3);
      rewind(fp1);
      break;
     }
    }
   }
   getchar();
   printf("/n/nPress any key to continue...");
   getchar();
   fclose(fp1);
   fclose(fp2);
   fclose(fp3);
  }
  /************************Decoding*************************/
  void Decoding(void)
  {   
   FILE *fp1,*fp2,*fp3;   
   char ch1,ch2,ch3;   
   char temp_3[20];
   char temp_1[20];
   int t1,t3;
   if((fp1=fopen("hfmTree.hfm","rb"))==NULL)
   {
    puts("File open error!");
    getchar();
    exit(0);
   }
   if((fp2=fopen("TextFile.txt","wb"))==NULL)
   {
    puts("File open error!");
    getchar();
    exit(0);
   }
   if((fp3=fopen("CodeFile.hfm","rb"))==NULL)
   {
    puts("File open Error!");
    getchar();
    exit(0);
   }
   printf("/nAfter Decode the result is:/n");
   while((ch3=fgetc(fp3))!=EOF)
   {
    t3=0;
    while(ch3!='-')
    {
     temp_3[t3++]=ch3;
     ch3=fgetc(fp3);   
    }   
    temp_3[t3]='/0';
    while((ch1=fgetc(fp1))!=EOF)   
    {   
     if(isalpha(ch1))   
     {   
      ch2=ch1;   
      t1=0;   
      while((ch1=fgetc(fp1))!=')')   
      {   
       temp_1[t1++]=ch1;   
      }   
      temp_1[t1]='/0';   
      if(strcmp(temp_1,temp_3)==0)   
      {   
       fputc(ch2,fp2);  
       printf("%c",ch2);
       rewind(fp1);
       break;
      }
     }
    }
   }
   getchar();
   printf("/n/nPress any key to continue...");
   getchar();
   fclose(fp1);
   fclose(fp2);
   fclose(fp3);
  }
  
  /*************************************************/
  void Print(void)
  { 
   FILE *fp1,*fp2;   
   char ch1,ch2;   
   char tmp[20];   
   int t;
   if((fp1=fopen("hfmTree.hfm","rb"))==NULL)
   {   
    puts("File open error!");
    getchar();
    exit(0);
   }
   if((fp2=fopen("hfmcode.txt","wb"))==NULL)
   {
    puts("File open error!");
    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]='/0';
     printf("%c-----%s/n",ch2,tmp);
     fputc(ch2,fp2);
     fputc('-',fp2);
     fputc('-',fp2);
     fputc('-',fp2);
     fputs(tmp,fp2);
     fputc('/n',fp2);
    }
   }
   getchar();
   getchar();
   printf("Press any key to continue...");
   getchar();
   fclose(fp1);
   fclose(fp2);
  }
 

你可能感兴趣的:(c,File,null,FP,encoding,initialization)