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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? huffman.cpp

?? 實現(xiàn)huffman編碼的功能
?? CPP
字號:
#include "stdio.h"
#include "conio.h"
#include "string.h"
#include "stdlib.h"
#include "malloc.h"
typedef struct code
{
    char c;
    int weight;
}CODE;
CODE s[128]; /*用于存儲記錄過的字符數(shù)*/
typedef struct node
{
    char c;
    int tag;          /*是否有雙親的標(biāo)志*/
    int weight;
    char code[100];         /*該字符的huffman編碼*/
    struct node *parents,*lc,*rc;
}NODE;
NODE *head;
char filename1[40]={0};                 /*源文件名*/
char filename2[40]={0};                 /*統(tǒng)計結(jié)果文件名稱*/
char filename3[40]={0};                 /*壓縮文件名稱*/
char filename4[40]={0};                 /*解壓后源文件名稱*/
int n;
/*保存統(tǒng)計結(jié)果保存函數(shù)*/
void save(void)
{
    int i;
    FILE *fp;
    printf("\nPlease input the huffcode file path:");
    gets(filename2);
    if((fp=fopen(filename2,"wt"))==NULL)
    {
        printf("Can't open creat the huffcode file!\nPlease cheak the flie!");
        getch();
        return ;
    }
    n=0;
    for(i=1;i<=128;i++)
    {
        if(s[i].weight==0)
            continue;
        n++;                    /*不存在的元素不輸出*/
    }
    fprintf(fp,"%d",n);
    s[10].c='^'; /*因為回車在輸出到huffcode中后不便于后面的讀取,所以用英文中幾乎不出現(xiàn)的字符 ^ 來代替會回車*/
    s[32].c='~'; /*空格在讀取字符時會出錯,用~代替*/
    s[9].c=127;
    for(i=1;i<=128;i++)
    {
        if(s[i].weight==0)
            continue;          /*過濾權(quán)值非0字符*/
        fprintf(fp," %c %d",s[i].c,s[i].weight);
     }
    fclose(fp);
}
/*建樹模塊*/
NODE *BuildTree(void)
{
    int min1=32767,min2=32767,i,j;
    NODE *p1,*p2;
    char cd[20];
    FILE *fp;
    
    if((fp=fopen(filename2,"rt"))==NULL)
    {
        printf("Sorry!the code file can't be opened!\nPlease check it!");
        exit(0) ;
    }
    fscanf(fp,"%d",&n);
    head=(NODE *)malloc(2*n*sizeof(NODE));/*多申請一個空間,0號空間空留不用,構(gòu)成一個結(jié)構(gòu)體數(shù)組head[2*n]*/                   /*n為字符的種類*/
    for(i=1;i<=n;i++)
    {
        fscanf(fp," %c %d",&head[i].c,&head[i].weight);    /* %c和%d之前的空格不能少,因為是格式化輸出的*/
        head[i].tag=0; /*無雙親*/
        head[i].parents=NULL;
        head[i].lc=NULL;
        head[i].rc=NULL;
        head[i].code[0]='\0';
    }
    for(i=1;i<=3;i++)
    {                     /*還原被代替的字符*/
        if(head[i].c==127)
            head[i].c=9;
        else if (head[i].c=='^')
            head[i].c='\n';
        else if(head[i].c=='~')
            head[i].c=' ';
        else   ;
    }
    for(i=1;i<n;i++)     /*n個字符操作n-1次*/
    {
        min1=min2=32767;
        p1=NULL;p2=NULL;
        for(j=1;j<n+i;j++)
            if((head[j].weight<min1)&&(head[j].tag==0))
            {
                min2=min1;
                p2=p1;
                min1=head[j].weight;
                p1=&head[j];
            }
            else if((head[j].weight<min2)&&(head[j].tag==0))
            {
                min2=head[j].weight;
                p2=&head[j];
            }                      /*找出了最小p1的次小的p2*/
        p1->tag=1;
        p2->tag=1;
        head[n+i].weight=p1->weight+p2->weight;
        p1->parents=&head[n+i];
        p2->parents=&head[n+i];
        head[n+i].parents=NULL;
        head[n+i].lc=p1;
        head[n+i].rc=p2;
        head[n+i].tag=0;
    }
    if(n==1)                              /*一種字符構(gòu)不成huffman樹,定義其代碼*/
    {
        head[1].code[0]='0';
        head[1].code[1]='\0';
    }
    else
    {
        for(i=1;i<=n;i++)
        {
            j=19;
            cd[j]='\0';
            p1=&head[i];
            for(p2=p1->parents;p2!=NULL;p2=p1->parents)
            {
                if(p1==p2->lc)
                    cd[--j]='0';
                else
                    cd[--j]='1';                     /*用棧來存儲編碼實現(xiàn)對其順序的調(diào)整*/
                p1=p2;
            }
            strcpy(head[i].code,&cd[j]);
        }
    }
    fclose(fp);
    return head;             /*申請了2n個空間,0號不用最后一個是2n-1*/
}
/*文件校驗函數(shù)*/
void CheckSymbol(void)
{
    FILE *fp,*fp1;
    char ch1,ch2;
    int  num=0;
    if((fp=fopen(filename1,"rt"))==NULL)
    {
        printf("Can't open the source file!");
        getch();    
        return ;
    }
    if((fp1=fopen(filename4,"rt"))==NULL)
    {
        printf("Can't open the restore file!");
        getch();
        return ;
    }
    while(feof(fp)==0||feof(fp1)==0)
    {
        ch1=fgetc(fp);
        ch2=fgetc(fp1);
        if(ch1==ch2)
         {   num++; continue; }
        else
        {
            printf("\nThe %d character is difficult!",num);
            printf("\nPlease check it!");
            getch();
            return ;
        }
    }
    printf("\nSucceeful!The file decoded is right!");
    getch();
}
/*統(tǒng)計主函數(shù)*/
void CountSymbol(void)
{
    FILE *fp;
    char t;
    int i;
    for(i=0;i<=128;i++)
    {
        s[i].c=i;
        s[i].weight=0;
    }
    printf("\nPlease input the file's path and file name:");
    getchar();
    gets(filename1);
    if((fp=fopen(filename1,"rt"))==NULL)
    {
        printf("Can't open the source file!\nPlease cheak the flie!");
        getch();
        return ;
    }
    t=0;
    while(feof(fp)==0) /*0時文件未結(jié)束*/
    {
        t=fgetc(fp);
        s[t].weight++;       /*按照ASCII碼表的對應(yīng)位置統(tǒng)計權(quán)值*/
     }
    save();
    fclose(fp);
    printf("\nThe code has been saved succeful!");
    getch();
}
/*編碼模塊*/
void Encode(NODE *head)
{
    FILE *fp,*fpc;
    char t,cd[20];
    int i;
    fp=fopen(filename1,"rt");                        /*遍歷比較得到huffman編碼*/
    fpc=fopen("encode.txt","wt");        /*生成中間0 1 代碼文件*/
    while(feof(fp)==0)
    {
        t=fgetc(fp);
        for(i=1;i<=n;i++)
            if(t==head[i].c)
            {
                strcpy(cd,head[i].code);
                fprintf(fpc,"%s",cd);
            }
    }
    fclose(fp);
    fclose(fpc);
}
/*7位壓縮模塊*/
void Compress(void)
{
    int n=0,i=6;
    long  num=0;                 /*統(tǒng)計0 1 個數(shù)*/
    unsigned char ch=0,ch1;
    FILE *fp,*fp1;
    if((fp=fopen("encode.txt","rt"))==NULL)
    {
        printf("Can't open the code file!\nPlease cheak the flie!");
        getch();
        return ;
    }
    printf("\nplease input the compressed file path and name:");
    getchar();
    gets(filename3);
    if((fp1=fopen(filename3,"wt"))==NULL)
    {
        printf("Can't open the compressed file!\nPlease cheak the file!");
        getch();
        return ;
    }
    while(feof(fp)==0)
    {
        num++;
        ch1=fgetc(fp);           /*統(tǒng)計出了 0 1 個數(shù)*/
    }                            /*遍歷文件得到字符的個數(shù),保存在filename3文件中*/
    num--;
    rewind (fp);                 /*將文件指針移回文件的頭*/
    fprintf(fp1,"%ld",num);
    ch1='\\';
    fprintf(fp1,"%c",ch1);      /*注意輸出的格式*/
    while(feof(fp)==0)
    {
        ch1=fgetc(fp);           /*將數(shù)字0和1轉(zhuǎn)換為字符0和1*/
        if(ch1==255)             /*因為ch1只可能是結(jié)束標(biāo)志或0 、1*/
        {
            fputc(ch,fp1);
            break;
        }   
        ch1-=48;
        ch1<<=i--;               /*從文件中讀取字符*/
        ch=ch|ch1;               /*與0取或?qū)?個數(shù)字合并未一個*/
        n++;
        if(n%7==0)
        {
            if(ch==7)           /*屏對文件有影響的字符*/
                ch=128;         /*7號顯示不出,8號后退一個吃掉前一個字符*/
            else if (ch==8)     /*13號顯示不出,10號是換行,26號文件結(jié)束字符*/
                ch=129;
            else if (ch==9)
                ch=130;
            else if (ch==10)
                ch=131;
            else if (ch==13)
                ch=132;
            else if (ch==26)
                ch=133;
            else  ;                 
            fputc(ch,fp1);
            n=0;i=6;ch=0;   /*初始化*/
        }
    }
    fclose(fp1);
    fclose(fp);
}
/*解碼模塊*/
void Decode(NODE *head,int n)
{
    FILE *fp,*fp1;
    char t='0';          /*隨便賦初值*/
    NODE *p1,*p0;
    p1=p0=&head[2*n-1];
    if((fp=fopen("d:\\encode.txt","rt"))==NULL)
    {
        printf("Can't open the compress file!");
        getch();
        return ;
    }
    if((fp1=fopen(filename4,"wt"))==NULL)
    {
        printf("Can't open the decode file!");
        getch();
        return ;
    }
    while(feof(fp)==0)
    {
        t=fgetc(fp);        /*只有一個節(jié)點是構(gòu)不成huffman樹*/
        if(t=='0')
        {
            if(p1->lc==NULL)
                fprintf(fp1,"%c",p1->c);
            else
            {               
                p1=p1->lc;                  
                if(p1->lc==NULL&&p1->rc==NULL)
                {
                    fprintf(fp1,"%c",p1->c);
                    p1=p0;
                }
            }
        }
        else if(t=='1')
        {
            p1=p1->rc;
            if(p1->rc==NULL&&p1->lc==NULL)
            {
                fprintf(fp1,"%c",p1->c);
                p1=p0;
            }
        }
    }
    fclose(fp);
    fclose(fp1);
}
/*解7位壓縮模塊*/
void Uncompress(void)
{
    FILE *fp,*fp1;
    long num;
    int i;
    unsigned char ch,exp;      /*在tc環(huán)境下默認(rèn)有符號,但在vc環(huán)境下默認(rèn)有符號*/
    if((fp=fopen(filename3,"rt"))==NULL)
    {
        printf("Can't open file!\nPlease cheak the flie!");
        getch();
        exit(1);
    }
    if((fp1=fopen("d:\\encode.txt","wt"))==NULL)
    {
        printf("Can't open file!\nPlease cheak the flie!");
        getch();
        exit(1);
    }
    fscanf(fp,"%ld",&num);  /*注意格式*/
    fscanf(fp,"%c",&ch);    /*取出'\'*/
    while(feof(fp)==0) /*只讀出有用字符,而且解決了中斷問題!!*/
    {
        ch=fgetc(fp);
        if(ch==255)   /*這塊有問題,最后11111111時會出錯!*/
            break;
        if(ch==128)           /*屏蔽對文件有影響的ASCII碼*/
            ch=7;         /*7號顯示不出,8號后退一個吃掉前一個字符,9號tab多時出錯*/
        else if (ch==129)     /*13號顯示不出,10號是換行,26號文件結(jié)束字符*/
            ch=8;
        else if (ch==130)
            ch=9;
        else if (ch==131)
            ch=10;
        else if (ch==132)
            ch=13;
        else if (ch==133)
            ch=26;
        else  ;
        for(i=1;i<8;i++)
        {
            exp=ch;  /*寄存*/
            exp<<=i;
            exp>>=7;         
            exp+=48;           /*將從文件中讀出的字符中的有效數(shù)字還原成數(shù)字*/
            if(num!=0)      /*輸出的總的有效的位數(shù)夠后就不進(jìn)行輸出*/
            {
                num--;     /*只將有效的字符輸出*/
                fputc(exp,fp1);
            }
        }
    }
    fclose(fp1);
    fclose(fp);
}
/*壓縮率計算模塊*/
void Rate(void)
{
    FILE *fp,*fp1;
    char ch=1;
    float num=0.0,num1=0.0;
    float weight,weight1,rate;
    fp=fopen(filename1,"rt");
    fp1=fopen(filename3,"rt");
    while(feof(fp)==0)
    {
        ch=fgetc(fp);          /*比較源文件和壓縮后的文件*/
        num++;
    }
    num--;  /*減去末尾結(jié)束標(biāo)志*/
    weight=num/1024;
    while(feof(fp1)==0)
    {
        ch=fgetc(fp1);
        num1++;
    }
    num1--;/*減去末尾結(jié)束標(biāo)志*/
    weight1=num1/1024;
    rate=weight1/weight;
    printf("\nThe source file weight is %.4f Kb!",weight);
    printf("\nThe compressed file weight is %.4fKb!",weight1);
    printf("\nThe compresse rete is %.2f %!",rate*100);
    getch();
}
/*編碼壓縮主函數(shù)*/
void EncodeSymbol(void)
{
    NODE *head=NULL;
    head=BuildTree();       /*得到了huffman樹的首地址*/
    Encode(head);
    Compress();
/*    remove("d:\\encode.txt"); */    /*將中間文件刪除*/
    printf("\nThe file has been compressed!");
    printf("\nIt was saved in %s",filename2);
    Rate();
}
/*解碼壓縮主函數(shù)*/
void DecodeSymbol(void)
{
    NODE *head=NULL;
    printf("\nPlease input the code file path:");
    getchar();
    gets(filename2);
    printf("\nPlease input the compressed file path:");
    gets(filename3);
    printf("\nPlease input the restored file path:");
    gets(filename4);
    head=BuildTree();
    Uncompress();
    Decode(head,n);
/*    remove("d:\\encode.txt");  *//*刪除中間文件*/
    printf("\nThe file has been restored!");
    printf("\nIt is saved in the %s!",filename4);
    getch();
}
/*主函數(shù)*/
void main(void)
{
    int choice;
    do
    {
        printf("\n\n\n\n\n\n\n");
        printf("                           This is a huffman code  \n             ");
        printf("\n                          1: Count character frequency");
        printf("\n                          2: Encode the file");
        printf("\n                          3: Decode the file");
        printf("\n                          4: Check the result");
        printf("\n                          0: exit\n\n");
        printf("\n          Please input your chose:");
        scanf("%d",&choice);
        while(choice<0||choice>4)
        {
            printf("          Sorry !The choice is wrong!\n          Please input it again:");
            scanf("%d",&choice);
        }
        switch(choice)
        {
            case 1:  CountSymbol();     break;   /*計數(shù)模塊*/
            case 2:  EncodeSymbol();    break;   /*編碼模塊*/
            case 3:  DecodeSymbol();    break;   /*解碼模塊*/
            case 4:  CheckSymbol();     break;   /*校驗?zāi)K*/
            case 0:  exit(0);            /*正常退出*/
         }
    }while(1);
}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美亚洲禁片免费| 亚洲精品一区二区三区福利| 亚洲最新在线观看| 91最新地址在线播放| 国产精品久99| 成人免费看视频| 国产精品网站在线播放| 成人动漫视频在线| 国产精品热久久久久夜色精品三区| 国产一区二区三区四区五区入口| 精品国产91洋老外米糕| 理论电影国产精品| 久久久国产一区二区三区四区小说| 狠狠色综合色综合网络| 2020国产精品| 国产成人av电影免费在线观看| 久久久www免费人成精品| 国产精品亚洲午夜一区二区三区| 久久久精品一品道一区| 成人免费视频国产在线观看| 中文字幕一区二区在线播放| 91在线一区二区| 亚洲无人区一区| 91精品国产综合久久精品图片| 日韩成人一区二区| 精品国产乱码91久久久久久网站| 国产黄色精品视频| 亚洲男人的天堂网| 欧美精品自拍偷拍动漫精品| 蜜臀精品久久久久久蜜臀| 久久综合中文字幕| 99riav久久精品riav| 一区二区三区不卡视频在线观看| 欧美日韩精品是欧美日韩精品| 免费日本视频一区| 中文字幕的久久| 91激情在线视频| 日韩**一区毛片| 久久久精品黄色| 91日韩一区二区三区| 亚洲777理论| 久久蜜臀中文字幕| 91网址在线看| 偷拍一区二区三区四区| 精品国产乱码久久久久久久久| 成人aa视频在线观看| 午夜免费久久看| 久久久亚洲精品石原莉奈| 色综合天天在线| 日本在线不卡视频| 国产欧美综合在线观看第十页 | 亚洲一区在线观看免费| 欧美一二区视频| 不卡影院免费观看| 石原莉奈一区二区三区在线观看| 久久这里只有精品首页| 日本道免费精品一区二区三区| 美日韩黄色大片| 中文字幕一区av| 7777精品伊人久久久大香线蕉超级流畅 | 成人免费高清在线| 亚洲成a人在线观看| 久久这里只有精品视频网| 日本高清不卡在线观看| 久久精品国产99久久6| 中文字幕亚洲一区二区av在线| 欧美日韩成人激情| 成人禁用看黄a在线| 午夜视频在线观看一区| 欧美国产精品专区| 91麻豆精品国产综合久久久久久 | 美国十次了思思久久精品导航| 中文字幕一区日韩精品欧美| 日韩一区二区在线观看| 色综合亚洲欧洲| 国产精品99久久久久| 亚洲成av人片在线| 中文字幕精品一区二区精品绿巨人 | 一区二区成人在线视频| 久久一夜天堂av一区二区三区| 在线看国产一区二区| 国产一区不卡精品| 天堂va蜜桃一区二区三区漫画版| 亚洲国产高清aⅴ视频| 91精品在线麻豆| 一本久久a久久免费精品不卡| 久久精品国产99久久6| 亚洲一区在线播放| 亚洲欧美在线高清| 精品91自产拍在线观看一区| 欧美三区在线观看| 99久久久久久| 风间由美一区二区三区在线观看| 奇米888四色在线精品| 亚洲美女电影在线| 国产精品国产三级国产有无不卡 | 国产精品美日韩| 久久午夜电影网| 欧美一区二区福利在线| 在线观看欧美日本| 成人av在线播放网站| 国产福利一区二区三区视频在线 | 亚洲第一成人在线| 亚洲精品视频在线看| 欧美激情艳妇裸体舞| 欧美精品一区二区三区高清aⅴ| 欧美另类久久久品| 欧美三级一区二区| 色综合久久久久久久久久久| 成人永久aaa| 国产成人免费在线观看| 国产在线国偷精品产拍免费yy | 天堂精品中文字幕在线| 亚洲图片有声小说| 亚洲一区在线观看免费观看电影高清| 国产精品电影一区二区三区| 国产精品天天看| 国产精品午夜电影| 国产精品久久久久四虎| 国产精品情趣视频| 国产精品天美传媒沈樵| 欧美极品美女视频| 欧美激情中文不卡| 国产精品视频在线看| 中文字幕高清一区| 亚洲欧洲一区二区三区| 亚洲欧洲三级电影| 亚洲美女少妇撒尿| 亚洲国产aⅴ天堂久久| 亚洲一区二区三区在线看| 亚洲午夜成aⅴ人片| 亚洲v日本v欧美v久久精品| 亚洲福利一区二区三区| 亚洲国产视频网站| 午夜精品福利视频网站 | 亚洲女同一区二区| 亚洲免费av网站| 亚洲成人福利片| 日本伊人色综合网| 久久99精品久久久久久国产越南| 激情偷乱视频一区二区三区| 国内一区二区在线| 国产福利一区在线观看| av综合在线播放| 色成人在线视频| 欧美视频中文一区二区三区在线观看| 欧美男人的天堂一二区| 日韩丝袜美女视频| 久久久精品国产免大香伊| 欧美激情一区在线观看| 亚洲人成网站影音先锋播放| 亚洲激情第一区| 五月激情六月综合| 国产在线国偷精品产拍免费yy| 成人一道本在线| 日本高清视频一区二区| 5858s免费视频成人| 精品国产凹凸成av人导航| 中文字幕精品一区| 亚洲影视资源网| 麻豆国产精品777777在线| 国产成人在线色| 色狠狠一区二区三区香蕉| 欧美高清视频一二三区 | 3d动漫精品啪啪| 久久综合九色欧美综合狠狠| 中文字幕在线观看一区| 婷婷久久综合九色综合绿巨人| 蜜臀av性久久久久蜜臀aⅴ流畅| 国产精品影视天天线| 色综合久久久网| 欧美一区二区三区色| 久久精品视频在线看| 一区二区激情视频| 国产综合成人久久大片91| 99久久久国产精品免费蜜臀| 欧美高清视频一二三区| 欧美激情中文字幕一区二区| 亚洲国产精品一区二区久久恐怖片 | 99热精品国产| 欧美精品电影在线播放| 国产嫩草影院久久久久| 性欧美疯狂xxxxbbbb| 国产原创一区二区| 欧美亚洲自拍偷拍| 久久久久综合网| 午夜精品久久久久久久蜜桃app| 国产精品一区二区久激情瑜伽| 欧美在线观看你懂的| 26uuu精品一区二区| 亚洲国产日韩一区二区| 国产福利91精品一区| 欧美日韩另类一区| 国产精品精品国产色婷婷| 蜜臀av性久久久久蜜臀aⅴ四虎| 97久久精品人人澡人人爽| 日韩欧美卡一卡二| 一区二区三区色| 国产成人午夜精品5599 | 欧洲激情一区二区|