⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 huffmantree.txt

📁 利用哈夫曼编码进行信息通信可以大大提高信道利用率
💻 TXT
📖 第 1 页 / 共 2 页
字号:
             #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 + -