亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? cpp1.cpp

?? 哈夫曼嗎 完整的哈夫曼碼的數據結構編程 功能強大
?? CPP
字號:
#include <iostream>
#include <fstream>
#include <iomanip>
#include <string>
using namespace std;
typedef struct{// 哈夫曼樹和哈夫曼編碼的存儲表示
unsigned int weight;
unsigned int parent,lChild,rChild;
}HTNode, *HuffmanTree;// 用動態數組存儲哈夫曼樹
typedef struct{
     char ch;
     char* hufCh;
}HuffmanCode;//用動態數組存儲哈夫曼編碼表
typedef struct{// 權值字符結點
char ch;
int wt;
}wElem;// 動態分配數組存儲讀入字符與權值
void HuffmanCoding(HuffmanTree &,HuffmanCode *,wElem *,int);//構造哈夫曼樹HT,并求哈夫曼編碼,將結果存入hufTree.txt
void DeCoding(HuffmanTree,HuffmanCode *,const char*,const int);//對文件里的代碼進行譯碼,將結果存入textfile.txt                                                                
void SelectTwoNode(HuffmanTree,int,int&,int&);//選擇兩個最小的結點
void HuffmanCoding(HuffmanTree &HT,HuffmanCode* HC,wElem* w,int n)//構造哈夫曼樹HT,并求出n個字符的哈夫曼編碼HC
{
if(n<=1)
   return;
int m=2*n-1;                       // m為結點數目
HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode));            //未用0號單元
HuffmanTree p=HT;
p++;                      //p指向HT的第1號單元
int i=0,ww=0;           //ww為wElem* w的下標 
for(i=1;i<=n;i++,p++,ww++) 
{
   p->weight=w[ww].wt;
   p->parent=p->lChild=p->rChild=0;
}                                                //初始化
for(;i<=m;++i,++p)
{
   p->weight=p->parent=p->lChild=p->rChild=0;
}                                
int s1=0,s2=0;                           //s1,s2為HT[1 .. i-1]中parent為0且weight最小的兩個結點
for(i=n+1;i<=m;++i)
{
   SelectTwoNode(HT,i-1,s1,s2); 
   HT[s1].parent=i;              // 標記 parent               
   HT[s2].parent=i;                // 標記 parent             
   HT[i].lChild=s1;               // 標記左孩子
   HT[i].rChild=s2;                // 標記右孩子
   HT[i].weight=HT[s1].weight+HT[s2].weight;
}
char* cd=new char[n];              //分配編碼的空間
cd[n-1]='\0';                       //結束符
int c=0;
int f=0;
for(i=1;i<=n;++i)                //開始編碼
{
   int start=n-1;                     //編碼結束符位置
   for(c=i,f=HT[i].parent;f!=0;c=f,f=HT[f].parent) //逆求編碼
   {
    if(HT[f].lChild==c)
    {
     cd[--start]='0';
    }
    else
    {
        cd[--start]='1';
    }
   }
   HC[i].ch=w[i-1].ch;     //復制字符
   HC[i].hufCh=(char*)malloc((n-start)*sizeof(char));    //為第i個字符編碼分配空間
   strcpy(HC[i].hufCh,&cd[start]);               //從cd復制編碼到HC
}
delete []cd;                     //釋放空間
}

// -----------------------選擇兩個最小的結點,序號分別放在s1和s2中--------------------
void SelectTwoNode(HuffmanTree HT,int i,int &s1,int &s2)
{
unsigned int sm1,sm2;
s1=1;                //從序號為1的權值開始 
s2=1;
int m=0;                //最小權值的序號臨時變量
for(m=1;m<=i;m++)           //第一遍中第一個parent為0的結點
{
   if(HT[m].parent!=0) 
    continue;
   else
   {
    sm1=HT[m].weight;
    s1=m;
    break;
   }
}
for(int j=m+1;j<=i;j++)                     // 第一遍選第一個最小的
{
   if(HT[j].parent!=0) 
    continue;
   else
   {
    if(sm1>HT[j].weight) 
    {
     sm1=HT[j].weight;
     s1=j;
    }
   }
}
for(m=1;m<=i;m++) //第二遍中第一個parent為0的結點
{
   if(HT[m].parent!=0) 
    continue;
   else 
   {
    sm2=HT[m].weight;
    s2=m;
    if(s2==s1) 
     continue;
    else 
     break;
   }
}
for(int k=m+1;k<=i;k++) //第二遍選第二個最小的
{
   if(HT[k].parent!=0) 
    continue;
   else
   {
    if((HT[k].weight<sm2)&&(k!=s1)) //保證sm1!=sm2
    {
     sm2=HT[k].weight;
     s2=k;
    }
   }
}
}
//-------------------譯碼實現,在 HC 里進行逐字掃描比較求子串相應的字符--------------------------------------
void DeCoding(HuffmanTree HT,HuffmanCode *HC,const char* iFile,const int n)
{// 參數n為字符個數p=2*n-1就為HT的結點數目.HT[p]就為HT的根.
ifstream fIn(iFile,ios::in);
char inBuf='1';
ofstream fout("textfile.txt",ios::out);
char* cd=new char[n];   // 儲存字串的空間
int start=0;              //譯碼開始標記
int p=2*n-1;          //根下標
int iHC=1;                // 用于掃描 HC 的循環變
while(fIn.get(inBuf))   // 循環讀入 \'0\' 或 \'1\' 或 \'\\n\'
{
   if(inBuf=='0')
   {
    if(HT[p].lChild!=0)
    {
     cd[start++]=inBuf;   //使inBuf進cd*
     p=HT[p].lChild;      //進入左子樹
     continue;
    }
    else
    {
     cd[start++] = '\0';
     for(iHC=1;iHC<=n;iHC++) //尋找與子串匹配的字符
     {
      if(strcmp(HC[iHC].hufCh,cd)==0)
      {
       fout<<HC[iHC].ch;
       break;     //找到則跳出for循環
      }
      else 
       continue;
     }
     start=0;
     cd[start++]=inBuf;     //為讀下一子串做準備
     p=HT[2*n-1].lChild; //此時p指向root的leftchild
    }
   }
   else 
    if(inBuf=='1')
    {
     if(HT[p].rChild!=0)
     {
      cd[start++]=inBuf;   //讓inBuf進入cd*
      p=HT[p].rChild;      //進入左子樹
      continue;
     }
     else
     {
      cd[start++]='\0';      //子串結束符
      for(iHC=1;iHC<=n;iHC++) //尋找與子串匹配的字符
      {
       if(strcmp(HC[iHC].hufCh,cd)==0)
       {
        fout<<HC[iHC].ch;
        break; // 找到則跳出for循環
       }
       else
       {  
        continue;
       }
      }
      start=0;
      cd[start++]='1';       //準備讀下一個子串
      p=HT[2*n-1].rChild; //p指向root的rightchild
     }
    }
     else 
      if(inBuf=='\n')
     {
      continue;
            }
}
cd[start]='\0';
for(iHC=1;iHC<=n;iHC++) //尋找與子串匹配的字符
{
   if(strcmp(HC[iHC].hufCh,cd)==0)
   {
    fout<<HC[iHC].ch;
    break; //找到則跳出for循環
   }
   else 
   {   
    continue;
   }  
}
     delete [] cd; //釋放空間
fIn.close();   //關閉文件
fout.close(); //關閉文件
}              
int main( )
{
     char* wFileName=new char[128];
cout<<endl<<"請輸入字符存放位置及文件名: ";
cin >> wFileName;
ifstream hufInPut(wFileName,ios::in );//用hufInPut打開外部文件 
if(!hufInPut)
   cerr << "文件不存在" << endl;
int hufNum=0;
hufInPut>>hufNum; //讀入字符集大小n到hufNum
//-------------------輸出基本信息--------------------------------
cout<<"字符總數: " << hufNum << endl;
cout<<" 字符    權值" << endl;
wElem* hufW=new wElem[hufNum]; //分配n個字符和n個權值的儲存空間
for(int ii=0;ii<hufNum;ii++)
{
// ------------------循環讀入字符及其對應的權值--------------------------
   hufInPut >> hufW[ii].ch >> hufW[ii].wt;
   cout << setw(4) << hufW[ii].ch << setw(8) << hufW[ii].wt << endl;
}
cout<<endl;
hufInPut.close();     //關閉存放字符和權值的文件
delete [] wFileName; //釋放空間
HuffmanTree hufT;
HuffmanCode* hufC=(HuffmanCode* )malloc((hufNum+1)*sizeof(HuffmanCode)); //分配n個字符編碼的頭指針向量
HuffmanCoding(hufT,hufC,hufW,hufNum );//編碼
// ------------------用hufTreeOutPut把哈夫曼樹HT,HC輸出到文件hufTree.txt中------------------------------------------
ofstream hufTreeOutPut( "hufTree.txt" , ios::out );
hufTreeOutPut << "++ 哈夫曼樹 ++++++++++++++++++++++++++++" << endl << setw(9) << "            權值 " <<"     雙親 " << "   左孩子 " << " 右孩子 "<< endl;
for(int tOut=1;tOut<=2*hufNum-1;tOut++)
{
   hufTreeOutPut<<setw(6)<<tOut<<setw(8)<<hufT[tOut].weight<<setw(8)<<hufT[tOut].parent<<setw(8)<<hufT[tOut].lChild << setw( 8 ) << hufT[ tOut ].rChild << endl;
}
hufTreeOutPut << "------------------------------------------ " << endl << endl << "++ 哈夫曼編碼 +++++++++++++++++++++++++++ " << endl;
//-----------向屏幕輸出編碼過的編碼基本信息----------------------------------------------------------------------
     cout << "將字符編碼后, 代碼為: " <<endl;
     cout << " 字符    代碼" << endl;
for( int cOut=1;cOut<=hufNum;cOut++)
{
   hufTreeOutPut << "    " << hufC[cOut].ch<< " +++++>> "<<hufC[cOut].hufCh<<endl;
//-----------------向屏幕輸出編碼過的編碼內容----------------------------------------------------------
   cout<<setw(4)<<hufC[cOut].ch<<setw(8)<<hufC[cOut].hufCh<<endl;
}
cout<<"+++++++轉換后的代碼存儲在文件<hufTree.txt>中+++++++ "<<endl;
cout<<endl<<endl;
hufTreeOutPut <<"++ 轉換成功!++++++++++++++++++++" << endl;
hufTreeOutPut.close(); //輸出完畢,關閉文件
delete [] hufW; //釋放內存
//-------------------向屏幕輸出編碼過的代碼內容------------------------------------- 
     char* cFileName=new char[128]; // 存放文件名的空間
cout << endl<< "請輸入存儲有代碼的文件位置及名稱: ";
cin >> cFileName;
ifstream codeIn(cFileName,ios::in );
if(!codeIn) 
   cerr << "file can not be opened" << endl;
char codeInBuf='0';
cout<<"\n待編譯的代碼為:\n---------------------------------------------"<<endl;
while( codeIn.get( codeInBuf ) ) 
cout << codeInBuf;
cout<<"\n---------------------------------------------";
     cout << endl << endl; 
     DeCoding(hufT,hufC,cFileName,hufNum);           //譯碼
//--------------- 向屏幕輸出譯碼后的內容----------------------------------------------------
cout << "譯碼為: " << endl;
cout<<"---------------------------------------------\n";
ifstream dcodeIn("textfile.txt",ios::in);
if( !dcodeIn ) 
   cerr <<"file can not be opened"<<endl;
char dcodeInBuf='0';
while( dcodeIn.get(dcodeInBuf)) 
   cout <<dcodeInBuf;
     cout<<endl;
cout<<"---------------------------------------------";
     cout<<"\n********譯碼存儲在文件textfile.txt中*******"<<endl;
cout << endl<<endl;
return 0;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美一区二区三区免费在线看| 青草av.久久免费一区| 6080亚洲精品一区二区| 91日韩精品一区| 风间由美一区二区三区在线观看| 日韩黄色一级片| 亚洲福利视频一区二区| 亚洲一区av在线| 亚洲国产色一区| 亚洲午夜久久久| 肉肉av福利一精品导航| 亚洲狠狠爱一区二区三区| 亚洲精品乱码久久久久久久久 | 日本系列欧美系列| 亚洲精品中文在线影院| 亚洲欧美另类图片小说| 国产精品女同一区二区三区| 亚洲国产精品黑人久久久| www久久久久| 国产午夜亚洲精品午夜鲁丝片 | 麻豆一区二区99久久久久| 免费久久99精品国产| 久久国产三级精品| 韩国精品久久久| 国产成人在线网站| 99re视频精品| 日本丶国产丶欧美色综合| 欧美日韩一区二区三区在线| 91精品国产色综合久久不卡蜜臀| 日韩一区二区在线观看视频播放| 91精品婷婷国产综合久久| 亚洲精品在线电影| 日本一区二区三级电影在线观看 | 国产欧美一区二区三区沐欲| 国产精品网站在线播放| 夜夜嗨av一区二区三区网页 | 亚洲成人你懂的| 蜜桃一区二区三区在线| 国产一区二区成人久久免费影院| 成人精品高清在线| 3atv一区二区三区| 国产午夜精品一区二区| 一区二区在线观看视频在线观看| 日本免费在线视频不卡一不卡二 | 欧美xxxx老人做受| 国产精品素人视频| 亚洲国产精品久久艾草纯爱| 国产大陆a不卡| 91国产免费看| 国产人妖乱国产精品人妖| 亚洲综合一区二区精品导航| 国内成+人亚洲+欧美+综合在线| 91丨porny丨国产入口| 91精品国产91久久久久久一区二区 | 日韩精品乱码av一区二区| 国产精品羞羞答答xxdd| 欧美卡1卡2卡| 国产精品乱码久久久久久| 日韩成人一级片| 91玉足脚交白嫩脚丫在线播放| 制服丝袜中文字幕一区| 中文字幕中文字幕一区| 极品瑜伽女神91| 欧美日韩精品一区二区三区四区 | 欧美成人欧美edvon| 亚洲日本免费电影| 从欧美一区二区三区| 91精品久久久久久久91蜜桃| 亚洲黄色小视频| 成人小视频免费在线观看| 欧美电视剧在线看免费| 亚洲一区二区中文在线| 91在线视频免费91| 国产女主播视频一区二区| 久久精品国产精品青草| 3d动漫精品啪啪| 亚洲一区二区三区四区在线观看 | 亚洲精品视频免费看| 国产成人精品网址| 日韩欧美成人一区| 麻豆视频观看网址久久| 日韩一区国产二区欧美三区| 亚洲 欧美综合在线网络| 欧美在线免费播放| 亚洲乱码国产乱码精品精小说| 99久久精品情趣| 成人免费在线播放视频| 成人av第一页| 亚洲欧洲美洲综合色网| 9l国产精品久久久久麻豆| 日韩一区欧美一区| av亚洲产国偷v产偷v自拍| 成人免费在线观看入口| 一本大道av伊人久久综合| 国产精品传媒在线| 91麻豆高清视频| 亚洲高清免费观看| 欧美精品三级日韩久久| 精品一区二区三区欧美| 国产亚洲欧美在线| 粉嫩aⅴ一区二区三区四区 | 成人精品免费视频| 亚洲区小说区图片区qvod| 欧美艳星brazzers| 免费精品99久久国产综合精品| 欧美一区二区免费| 国产剧情一区在线| **欧美大码日韩| 欧美色男人天堂| 全国精品久久少妇| 欧美国产丝袜视频| 在线观看日韩av先锋影音电影院| 丝袜脚交一区二区| 欧美国产欧美综合| 色哟哟一区二区在线观看| 日韩一区欧美二区| 国产日韩一级二级三级| 欧洲人成人精品| 狠狠狠色丁香婷婷综合久久五月| 欧美激情艳妇裸体舞| 欧美另类久久久品| 国产成人免费网站| 日韩精品亚洲一区| 亚洲少妇30p| 欧美大片顶级少妇| 91同城在线观看| 久久 天天综合| 夜夜嗨av一区二区三区网页| 精品国产一区二区三区不卡| 在线免费一区三区| 国产一区视频网站| 亚洲夂夂婷婷色拍ww47| 久久久久成人黄色影片| 51午夜精品国产| 91免费版在线看| 国产剧情av麻豆香蕉精品| 午夜精品福利一区二区蜜股av | 国产激情精品久久久第一区二区 | 欧美日韩精品一区二区天天拍小说| 国产一区二区三区综合| 午夜精品一区二区三区电影天堂 | 亚洲欧美日韩中文字幕一区二区三区| 777xxx欧美| 精品视频色一区| 99久久er热在这里只有精品15 | 裸体健美xxxx欧美裸体表演| 亚洲色图丝袜美腿| 国产色综合久久| 日韩精品中文字幕在线不卡尤物| 在线视频亚洲一区| 91视频免费看| 成年人国产精品| 成人一区二区视频| 国产大片一区二区| 国产精品资源站在线| 狠狠色丁香婷婷综合久久片| 日韩高清中文字幕一区| 五月激情丁香一区二区三区| 一区二区三区欧美日韩| 亚洲麻豆国产自偷在线| 国产精品不卡一区| 国产精品每日更新在线播放网址 | 久久久久久久综合色一本| 欧美mv日韩mv| 欧美精品一区二区久久婷婷| 日韩欧美精品在线视频| 日韩久久免费av| 久久无码av三级| 久久美女高清视频| 国产欧美一区二区三区鸳鸯浴| 国产欧美日韩在线看| 国产视频一区在线播放| 国产嫩草影院久久久久| 国产精品三级视频| 亚洲另类在线视频| 亚洲国产aⅴ天堂久久| 日韩—二三区免费观看av| 美女在线观看视频一区二区| 国产一区啦啦啦在线观看| 国产1区2区3区精品美女| av亚洲精华国产精华精| 欧美在线免费播放| 日韩欧美www| 中文字幕久久午夜不卡| 亚洲欧美福利一区二区| 天天爽夜夜爽夜夜爽精品视频| 美女免费视频一区二区| 粉嫩久久99精品久久久久久夜| 成人午夜免费电影| 欧美少妇性性性| 亚洲精品一区二区三区香蕉| 久久九九国产精品| 亚洲一区二区三区影院| 久久疯狂做爰流白浆xx| 成人福利在线看| 欧美日韩亚洲不卡| 国产欧美日韩一区二区三区在线观看| 日韩久久一区二区| 极品尤物av久久免费看| 色综合av在线|