日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
淺談如何利用C++實現(xiàn)赫夫曼編碼/譯碼器

現(xiàn)在我就來說明一下這個赫夫曼編碼/譯碼器實現(xiàn)方法吧。整個項目我就用win32控制臺程序?qū)懙摹_@樣可以方便測試,排除其他麻煩。

成都創(chuàng)新互聯(lián)是一家專業(yè)提供安塞企業(yè)網(wǎng)站建設,專注與成都網(wǎng)站制作、成都做網(wǎng)站、外貿(mào)營銷網(wǎng)站建設、H5建站、小程序制作等業(yè)務。10年已為安塞眾多企業(yè)、政府機構等服務。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站制作公司優(yōu)惠進行中。

首先,我們來看看main函數(shù):

 
 
 
  1. void main()  
  2. {  
  3.         char choice=' ';  
  4.         while(choice!='q')  
  5.         {       cout<<"\n******************************"<                cout<<" 歡迎使用赫夫曼編碼譯碼系統(tǒng)"<                cout<<"******************************"<                cout<<"(1)要初始化赫夫曼鏈表請輸入'i'"<                cout<<"(2)輸入要編碼的字符'w'"<                cout<<"(3)要編碼請輸入'e'"<                cout<<"(4)要譯碼請輸入'd'"<                cout<<"(5)要打印編碼請輸入'p'"<                cout<<"(6)要打印赫夫曼樹請輸入't'"<                cout<<"(7)要離開請輸入'q'"<                if(flag==0)cout<<"\n請先初始化赫夫曼鏈表,輸入'i'"<                cin>>choice;  
  6.                  switch(choice)  
  7.                  {  
  8.                  case 'i':  
  9.                                 Initialization();  
  10.                                 break;  
  11.                  case 'w':  
  12.                                 InputCode();  
  13.                                 break;  
  14.                  case 'e':  
  15.                                 Encoding();  
  16.                                 break;  
  17.                  case 'd':  
  18.                                 Decoding();  
  19.                                 break;  
  20.                  case 'p':  
  21.                                 Code_printing();  
  22.                                 break;  
  23.                  case 't':  
  24.                                     Tree_printing(HT,2*n-1);  
  25.                                     break;  
  26.                  case 'q':  
  27.                                 break;  
  28.                  default:  
  29.                                 cout<<"input error"<                 }   
  30.  
  31.         }  
  32.        free(z);  
  33.        free(w);  
  34.        free(HT);  

這個函數(shù)主要就是和用戶交互使用。這個過程我用switch case 來實現(xiàn),你們也可以選擇其他的方式實現(xiàn)如if else ,這個就個人愛好選擇。下面我們來看看初始化赫夫曼樹的函數(shù)Initialization()。

 
 
 
  1. void Initialization()  
  2. {  
  3.         flag=1;  
  4.         int num;  
  5.         int num2;  
  6.         cout<<"下面初始化赫夫曼鏈表"<        cin>>num;  
  7.         n=num;  
  8.         w=(int*)malloc(n*sizeof(int));  
  9.         z=(char*)malloc(n*sizeof(char));  
  10.         cout<<"\n請依次輸入"<        char base[2];  
  11.         for(i=0;i   {  
  12.         cout<<"第"<        gets(base);//這個地方有點小小的問題  
  13.         *(z+i)=*base;  
  14.         }  
  15.         for(i=0;i<=n-1;i++)  
  16.         {  
  17.                 cout<        }  
  18.         cout<<"\n請依次輸入"<        for(i=0;i<=n-1;i++)  
  19.         {  
  20.          cout<         cin>>num2;  
  21.          *(w+i)=num2;  
  22.    }  
  23.         HuffmanCoding(HT,HC,w,n);  
  24. //------------------------打印編碼-------------------------------------------  
  25.         cout<<"字符對應的編碼為:"<        for(i=1;i<=n;i++)  
  26.         {  
  27.                 //cout<<"字符"<<*(z+i-1)<<"的編碼";  
  28.                 puts(HC[i]);  
  29.         }  
  30. //--------------------------將赫夫曼編碼寫入文件------------------------  
  31.         cout<<"下面將赫夫曼編碼寫入文件"<   
  32.  
  33.         FILE *hfmTree;  
  34.         char r[]={' ','\0'};         
  35.         if((hfmTree=fopen("hfmTree.txt","w"))==NULL)  
  36.    {  
  37.    cout<<"can not open file"<   return;  
  38.    }   
  39.  
  40.         fputs(z,hfmTree);  
  41.         for(i=0;i        {  
  42.          fprintf(hfmTree,"%6d",*(w+i));  
  43.          fputs(r,hfmTree);  
  44.    }  
  45.         for(i=1;i<=n;i++)  
  46.         {  
  47.          fputs(HC[i],hfmTree);  
  48.          fputs(r,hfmTree);  
  49.         }  
  50.         fclose(hfmTree);  
  51.         cout<<"已將字符與對應編碼寫入根目錄下文件hfmTree.txt中"<} 

上述代碼中有個小問題,已經(jīng)用紅色標示,這個地方獲取數(shù)據(jù)的時候有一次是沒有輸入就直接執(zhí)行的。這個疑問我一直都沒想通。初始化的結果放入hfmTree.txt的文件中。

下面來看看輸入要編碼的字符的函數(shù)InputCode()

 
 
 
  1. void InputCode()  
  2. {  
  3.     //cout<<"請輸入你想要編碼的字符"<    FILE *tobetran;  
  4.     char str[100];  
  5.     if((tobetran=fopen("tobetran.txt","w"))==NULL)  
  6.     {  
  7.         cout<<"不能打開文件"<        return;  
  8.     }  
  9.     cout<<"請輸入你想要編碼的字符"<    cin>>str;  
  10.     fputs(str,tobetran);  
  11.     cout<<"獲取報文成功"<    fclose(tobetran);  
  12. }  

這個函數(shù)里我也碰到了一個問題,cin>>str;部分一開始的時候,我是用gets代替的,不過問題就是用gets我不用輸入就能直接執(zhí)行完函數(shù)。這個郁悶啊。

下面來看看赫夫曼編碼/譯碼器函數(shù)

 
 
 
  1. //---------------------編碼函數(shù)---------------------------------  
  2. void Encoding()  
  3. {  
  4.         cout<<"下面對目錄下文件tobetran.txt中的字符進行編碼"<   
  5.  
  6.         FILE *tobetran,*codefile;   
  7.  
  8.         if((tobetran=fopen("tobetran.txt","rb"))==NULL)  
  9.         {  
  10.                 cout<<"不能打開文件"<        }  
  11.         if((codefile=fopen("codefile.txt","wb"))==NULL)  
  12.         {  
  13.                 cout<<"不能打開文件"<        }   
  14.  
  15.         char *tran;  
  16.         i=99;  
  17.         tran=(char*)malloc(100*sizeof(char));   
  18.  
  19.         while(i==99)  
  20.         {  
  21.                 if(fgets(tran,100,tobetran)==NULL)  
  22.                 {  
  23.                         cout<<"不能打開文件"<                        break;  
  24.                 }  
  25.                 for(i=0;*(tran+i)!='\0';i++)  
  26.                 {  
  27.                         for(j=0;j<=n;j++)  
  28.                         {  
  29.                                 if(*(z+j-1)==*(tran+i))  
  30.                                 {  
  31.                                   fputs(HC[j],codefile);  
  32.                                   if(j>n)  
  33.                                   {  
  34.                                    cout<<"字符錯誤,無法編碼!"<                                   break;  
  35.                                   }  
  36.                                 }  
  37.                         }  
  38.                 }  
  39.         }  
  40.         cout<<"編碼工作完成"<        fclose(tobetran);  
  41.         fclose(codefile);  
  42.         free(tran);  
  43. }   
  44.  
  45. //-----------------譯碼函數(shù)---------------------------------  
  46. void Decoding()  
  47. {  
  48. cout<<"下面對根目錄下文件codefile.txt中的字符進行譯碼"<        FILE *codef,*txtfile;  
  49.         if((txtfile=fopen("\\Textfile.txt","w"))==NULL)  
  50.         {  
  51.                 cout<<"不能打開文件"<        }  
  52. //txtfile=fopen("Textfile.txt","w");  
  53.         if ((codef=fopen("codefile.txt","r"))==NULL)  
  54.         {  
  55.                 cout<<"不能打開文件"<        }  
  56. //codef=fopen("codefile.txt","r");  
  57.    char *work,*work2,i2;  
  58. int i4=0,i,i3;  
  59.         unsigned long length=10000;  
  60.         work=(char*)malloc(length*sizeof(char));  
  61. fgets(work,length,codef);  
  62. work2=(char*)malloc(length*sizeof(char));  
  63. i3=2*n-1;  
  64. for(i=0;*(work+i)!='\0';i++)  
  65. {  
  66.    i2=*(work+i);  
  67.    if(HT[i3].lchild==0)   
  68.    {  
  69.     *(work2+i4)=*(z+i3-1);  
  70.     i4++;  
  71.     i3=2*n-1;  
  72.     i--;  
  73.    }  
  74.    else if(i2=='0') i3=HT[i3].lchild;  
  75.    else if(i2=='1') i3=HT[i3].rchild;  
  76. }  
  77. *(work2+i4)='\0';  
  78. fputs(work2,txtfile);  
  79. cout<<"譯碼完成"
  80. free(work2);  
  81.         fclose(txtfile);  
  82.         fclose(codef);   
  83.  
  84. }  

整個赫夫曼編碼/譯碼器實現(xiàn)過程也就這樣了。

我沒有學過數(shù)據(jù)結構,我只是看過一些資料,這里可能會有不好的地方,高手可以指點一下。


當前題目:淺談如何利用C++實現(xiàn)赫夫曼編碼/譯碼器
分享地址:http://www.dlmjj.cn/article/djopejp.html