哈夫曼编码[tc]

    技术2022-05-11  93

    #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);  } 

    最新回复(0)