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

📄 哈夫曼树应用4.txt

📁 20071204.rar
💻 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 + -