2017年計(jì)算機(jī)等級考試二級C++輔導(dǎo):C++實(shí)現(xiàn)赫夫曼編碼/譯碼器

字號:


    首先,我們來看看main函數(shù):
    void main()
    {
    char choice=' ';
    while(choice!='q')
    { 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;
    switch(choice)
    {
    case 'i':
    Initialization();
    break;
    case 'w':
    InputCode();
    break;
    case 'e':
    Encoding();
    break;
    case 'd':
    Decoding();
    break;
    case 'p':
    Code_printing();
    break;
    case 't':
    Tree_printing(HT,2*n-1);
    break;
    case 'q':
    break;
    default:
    cout<<"input error"<  }
    }
    free(z);
    free(w);
    free(HT);
    }
    這個(gè)函數(shù)主要就是和用戶交互使用。這個(gè)過程我用switch case 來實(shí)現(xiàn),你們也可以選擇其他的方式實(shí)現(xiàn)如if else ,這個(gè)就個(gè)人愛好選擇。下面我們來看看初始化赫夫曼樹的函數(shù)Initialization()。
    void Initialization()
    {
    flag=1;
    int num;
    int num2;
    cout<<"下面初始化赫夫曼鏈表"<  cin>>num;
    n=num;
    w=(int*)malloc(n*sizeof(int));
    z=(char*)malloc(n*sizeof(char));
    cout<<"\n請依次輸入"<  char base[2];
    for(i=0;i  {
    cout<<"第"<  gets(base);//這個(gè)地方有點(diǎn)小小的問題
    *(z+i)=*base;
    }
    for(i=0;i<=n-1;i++)
    {
    cout<  }
    cout<<"\n請依次輸入"<  for(i=0;i<=n-1;i++)
    {
    cout<  cin>>num2;
    *(w+i)=num2;
    }
    HuffmanCoding(HT,HC,w,n);
    //------------------------打印編碼-------------------------------------------
    cout<<"字符對應(yīng)的編碼為:"<  for(i=1;i<=n;i++)
    {
    //cout<<"字符"<<*(z+i-1)<<"的編碼";
    puts(HC[i]);
    }
    //--------------------------將赫夫曼編碼寫入文件------------------------
    cout<<"下面將赫夫曼編碼寫入文件"<  FILE *hfmTree;
    char r[]={' ','\0'};
    if((hfmTree=fopen("hfmTree.txt","w"))==NULL)
    {
    cout<<"can not open file"<  return;
    }
    fputs(z,hfmTree);
    for(i=0;i  {
    fprintf(hfmTree,"%6d",*(w+i));
    fputs(r,hfmTree);
    }
    for(i=1;i<=n;i++)
    {
    fputs(HC[i],hfmTree);
    fputs(r,hfmTree);
    }
    fclose(hfmTree);
    cout<<"已將字符與對應(yīng)編碼寫入根目錄下文件hfmTree.txt中"<  }