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

? 歡迎來(lái)到蟲(chóng)蟲(chóng)下載站! | ?? 資源下載 ?? 資源專(zhuān)輯 ?? 關(guān)于我們
? 蟲(chóng)蟲(chóng)下載站

?? huffman.cpp

?? 老問(wèn)題
?? CPP
?? 第 1 頁(yè) / 共 2 頁(yè)
字號(hào):
/*
 *Beijing Jiaotong University CIT_2003 JK0309 Copyright@2005
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>

#define MAX_SINGLECODE_LEN 10          //單個(gè)字符最大碼長(zhǎng)
#define MAX_STRING_LEN 1000            //要編碼的字符串的最大長(zhǎng)度
#define MAX_CODESTRING_LEN 10000       //產(chǎn)生的二進(jìn)制碼的最大長(zhǎng)度
#define MAX_WORDS 1000                 //要編碼的字符串中字符種數(shù)最大值
#define END_TREE 9999                  //樹(shù)部分存儲(chǔ)的結(jié)束符
#define PATH_LEN 50                    //路徑串最大長(zhǎng)度

/*****哈夫曼樹(shù)結(jié)構(gòu)定義*****/
typedef struct Huffmantree{
    char ch;                           //字符
    int  weight;                       //結(jié)點(diǎn)權(quán)值
    int  mark;                         //標(biāo)記是否加入樹(shù)中
    struct Huffmantree *parent,*lchild,*rchild,*next;
}HTNode,*LinkTree;

/*****編碼表結(jié)構(gòu)定義*****/
typedef struct{
    char ch;                           //字符部分
    char code[MAX_SINGLECODE_LEN];     //編碼部分
}CodeDictionary;

/*********函數(shù)聲明*********/
LinkTree setWeight(char *);
LinkTree sortNode(LinkTree);
LinkTree createHTree(LinkTree);
void codeHTree(LinkTree,CodeDictionary *);
void decodeHTree(LinkTree,char *,char *);
void deleteNode(LinkTree);
void compressString(char *s,CodeDictionary *,char *);
void readFile(char *);
void writeFile(char *);
void readCode(LinkTree,char *);
void writeCode(LinkTree,char *);
void menu();

/*主函數(shù)*/
int main(){
    char choice;                       //菜單選擇變量
    char string[MAX_STRING_LEN];       //保存從文件中讀取的內(nèi)容
    LinkTree temp;                     //保存賦了權(quán)值的表
    LinkTree ht;                       //保存排序后的表
    LinkTree htcopy,tempcopy;          //表備份
    LinkTree htree;                    //保存哈夫曼樹(shù)
    LinkTree ptr=NULL;
    CodeDictionary codedictionary[MAX_WORDS];    //編碼字典
    char codestring[MAX_CODESTRING_LEN];         //保存0-1形的代碼串     
    char codestring2[MAX_CODESTRING_LEN];        //保存0-1形的代碼串
    LinkTree ht2;                       //保存讀取的樹(shù)
    LinkTree htree2;                    //保存排序后的表
    char filestring[MAX_STRING_LEN];    //解碼后要寫(xiě)入文件中的內(nèi)容

    if((ht2=(LinkTree)malloc(sizeof(HTNode)))==NULL)//創(chuàng)建鏈表的頭結(jié)點(diǎn)
    {
        printf("內(nèi)存分配失??!");
        getch();
        exit(0);
    }
    ht2->next=NULL;

    while(1)
    {
        menu();                        //調(diào)入主菜單
        choice=getch();                //讀入用戶(hù)選項(xiàng)
        switch(choice)                 //判斷用戶(hù)選擇
        {
            case 'c':
            case 'C':
                printf("\n\n\n\n\n\n\n\n\n\n\n\n\n");
                printf("\n您選擇了文件編碼方式!\n\n");
                readFile(string);                //讀取要編碼的文件(字符串)
                temp=setWeight(string);          //得到有權(quán)值的表
                tempcopy=setWeight(string);
                ht=sortNode(temp);               //按權(quán)值排序后的表
                htcopy=sortNode(tempcopy);       //用于記錄解碼樹(shù)
                htree=createHTree(ht);           //得到哈夫曼樹(shù)
                codeHTree(htree,codedictionary); //哈夫曼編碼
                compressString(string,codedictionary,codestring);//壓縮為0-1碼
                writeCode(htcopy,codestring);    //將解碼樹(shù)和0-1碼保存                
                deleteNode(htree);               //釋放空間*/
                break;
            case 'd':
            case 'D':
                printf("\n\n\n\n\n\n\n\n\n\n\n\n\n");
                printf("\n您選擇了文件解碼方式!\n\n");
                readCode(ht2,codestring2);       //讀取要解碼的0-1碼
                htree2=createHTree(ht2);         //得到哈夫曼樹(shù)
                codeHTree(htree2,codedictionary);//哈夫曼編碼
                decodeHTree(htree2,codestring2,filestring);//解碼
                writeFile(filestring);           //將解碼文件保存
                deleteNode(htree2);              //釋放空間
                break;
            case 'q':
            case 'Q':
                exit(0);                         //退出程序
        }
    }
}


/*
 *整理輸入的字符串,統(tǒng)計(jì)每個(gè)字符在數(shù)組中出現(xiàn)的次數(shù),作為其權(quán)值
 */
LinkTree setWeight(char *string)
{
    int i=0;                                     //文件字符串下標(biāo)
    LinkTree tree;                               //頭指針
    LinkTree ptr,beforeptr;                      //創(chuàng)建指針與其前驅(qū)
    HTNode *node;
    
    if((tree=(LinkTree)malloc(sizeof(HTNode)))==NULL)//創(chuàng)建鏈表的頭結(jié)點(diǎn)
        return NULL;
    tree->next=NULL;
    
    for(i=0;string[i]!='\0';i++)
    {    
        ptr=tree;
        beforeptr=tree;
        
        if((node=(HTNode *)malloc(sizeof(HTNode)))==NULL)
            return NULL;
        node->next=NULL;
        node->parent=NULL;
        node->lchild=NULL;
        node->rchild=NULL;
        node->mark=0;
        node->ch=string[i];
        node->weight=1;
        
        if(tree->next==NULL)                     //如果是第一個(gè)非頭結(jié)點(diǎn)
            tree->next=node;
        else
        {    
            ptr=tree->next;
            while(ptr&&ptr->ch!=node->ch)        //查找相同字符
            {    
                ptr=ptr->next;
                beforeptr=beforeptr->next;
            }
            if(ptr&&ptr->ch==node->ch)           //如果鏈表中某結(jié)點(diǎn)的字符與新結(jié)點(diǎn)的字符相同
            {    
                ptr->weight++;                   //將該結(jié)點(diǎn)的權(quán)加一  
                free(node);    
            }
            else                                 //將新結(jié)點(diǎn)插入鏈表后
            {    
                node->next=beforeptr->next;
                beforeptr->next=node;
            }
        }
    }
    return tree;                                 //返回頭指針
}

/*
 *將整理完的字符串(帶權(quán)鏈表)按出現(xiàn)次數(shù)從小到大的順序排列
 */
LinkTree sortNode(LinkTree tree)
{    
    LinkTree head;                               //頭指針
    LinkTree ph,beforeph;                        //創(chuàng)建指針及其前驅(qū)
    LinkTree pt;
    
    if((head=(LinkTree)malloc(sizeof(HTNode)))==NULL)//創(chuàng)建新鏈表的頭結(jié)點(diǎn)
        return NULL;
    head->next=NULL;
    
    ph=head;
    beforeph=head;
    
    while(tree->next)
    {    
        pt=tree->next;                           //取被操作鏈表的頭結(jié)點(diǎn)
        tree->next=pt->next;
        pt->next=NULL;
        
        ph=head->next;
        beforeph=head;
        
        if(head->next==NULL)
            head->next=pt;                       //創(chuàng)建當(dāng)前操作鏈表頭結(jié)點(diǎn)
        else
        {
            while(ph&&ph->weight<pt->weight)     //將被操作結(jié)點(diǎn)插入相應(yīng)位置
            {    
                ph=ph->next;
                beforeph=beforeph->next;
            }
            pt->next=beforeph->next;
            beforeph->next=pt;
        }
    }
    free(tree);
    return head;                                 //返回排序后的頭指針
}

/*
 *用排完序的字符串建立哈夫曼樹(shù)
 */
LinkTree createHTree(LinkTree tree)
{   
    LinkTree p,q,beforep;
    HTNode *newnode;
    
    for(p=tree->next,q=p->next;p!=NULL&&q!=NULL;p=tree->next,q=p->next)
                                                 //p、q初值為頭結(jié)點(diǎn)后的兩個(gè)結(jié)點(diǎn),即最小權(quán)結(jié)點(diǎn)
    {
        tree->next=q->next;
        q->next=NULL;
        p->next=NULL;
        
        if((newnode=(HTNode *)malloc(sizeof(HTNode)))==NULL)
                                                 //申請(qǐng)新結(jié)點(diǎn)作為哈夫曼樹(shù)的中間結(jié)點(diǎn)
            return NULL;
        newnode->next=NULL;
        newnode->mark=0;
        
        newnode->lchild=p;                       //取鏈表頭結(jié)點(diǎn)后的兩個(gè)結(jié)點(diǎn)作為新結(jié)點(diǎn)的左、右孩子
        newnode->rchild=q;
        p->parent=newnode;
        q->parent=newnode;
        newnode->weight=p->weight+q->weight;     //權(quán)值相加
        
        p=tree->next;
        beforep=tree;
        
        if(p!=NULL&&p->weight>=newnode->weight)
        {
            newnode->next=beforep->next;         //將新結(jié)點(diǎn)插入原鏈表的相應(yīng)位置
            beforep->next=newnode;    
        }
        else
        {
            while(p!=NULL&&p->weight<newnode->weight)
            {    
                p=p->next;
                beforep=beforep->next;
            }
            newnode->next=beforep->next;
            beforep->next=newnode;
        }
    }
    return (tree->next);
}

/*
 *對(duì)哈夫曼樹(shù)進(jìn)行編碼
 */
void codeHTree(LinkTree tree,CodeDictionary *codedictionary)
{   
    int index=0,k=0;
    char code[MAX_SINGLECODE_LEN];               //用于統(tǒng)計(jì)每個(gè)字符的哈夫曼編碼
    LinkTree ptr=tree;                           //從樹(shù)的根結(jié)點(diǎn)開(kāi)始

    if(ptr==NULL)
    {
        printf("要進(jìn)行編碼的文件為空!\n");
        //exit(0);
    }
    else
    {
        while(ptr->lchild&&ptr->rchild&&ptr->mark==0)
        {
            while(ptr->lchild&&ptr->lchild->mark==0)
            {
                code[index++]='0';               //左支路編碼為0
                ptr=ptr->lchild;
                if(!ptr->lchild&&!ptr->rchild)   //如果沒(méi)有左右孩子,即葉子結(jié)點(diǎn)
                {
                    ptr->mark=1;                 //作標(biāo)記,表明該字符已被編碼
                    code[index]='\0';            //編碼0-1字符串結(jié)束
                    codedictionary[k].ch=ptr->ch;//給字典賦字符值
                    for(index=0;code[index]!='\0';index++)
                        codedictionary[k].code[index]=code[index];//給字典賦碼值
                    codedictionary[k].code[index]='\0';
                    k++;

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美午夜精品电影| 久久综合九色综合97_久久久| 青青草97国产精品免费观看无弹窗版 | 精品国产123| 在线观看日韩电影| 粉嫩嫩av羞羞动漫久久久| 视频一区二区三区入口| 亚洲特级片在线| 日本一区二区三区四区| 日韩午夜中文字幕| 欧洲另类一二三四区| 成人动漫视频在线| 国产成人精品一区二| 青青草原综合久久大伊人精品| 一区二区三区四区蜜桃 | 石原莉奈在线亚洲二区| 亚洲特黄一级片| 欧美经典三级视频一区二区三区| 日韩欧美精品三级| 91精品国产丝袜白色高跟鞋| 在线精品视频小说1| 99久久久精品| 99国产欧美久久久精品| 成人app软件下载大全免费| 国产在线一区观看| 韩国女主播成人在线观看| 青青草精品视频| 蜜乳av一区二区| 日韩精彩视频在线观看| 亚洲大型综合色站| 亚洲成人高清在线| 亚洲国产日韩a在线播放性色| 亚洲欧美韩国综合色| 亚洲欧美电影院| 亚洲男女一区二区三区| 亚洲日本va午夜在线电影| 综合久久国产九一剧情麻豆| 国产精品成人一区二区三区夜夜夜| 欧美国产精品v| 中文字幕久久午夜不卡| 一色桃子久久精品亚洲| 中文字幕五月欧美| 一级特黄大欧美久久久| 亚洲国产裸拍裸体视频在线观看乱了 | 色综合 综合色| 欧美性极品少妇| 欧美日韩的一区二区| 欧美一区二区国产| www久久精品| 中文字幕欧美国产| 亚洲精品高清视频在线观看| 亚洲不卡在线观看| 久久精品国产亚洲aⅴ| 国产自产v一区二区三区c| 福利一区二区在线| 在线视频欧美区| 欧美老肥妇做.爰bbww| 欧美大片一区二区| 日本一区二区三区高清不卡| 亚洲欧洲日本在线| 亚洲国产精品视频| 九色porny丨国产精品| 国产成人亚洲综合a∨婷婷图片| 99精品视频在线播放观看| 欧美日韩在线电影| 久久综合丝袜日本网| 亚洲欧洲国产日本综合| 日韩电影在线观看电影| 国产福利一区二区三区视频| 在线观看av一区二区| 日韩欧美国产综合一区| 国产精品对白交换视频| 日韩中文字幕1| 丰满亚洲少妇av| 欧美精品在线视频| 国产欧美视频一区二区| 一区二区三区自拍| 国产精品一区二区三区四区| 一本色道久久加勒比精品 | 精品一二线国产| 91热门视频在线观看| 91麻豆精品国产自产在线| 欧美国产一区二区在线观看| 午夜精品久久久久久久99水蜜桃| 国产成人自拍网| 制服.丝袜.亚洲.另类.中文| 中文字幕一区免费在线观看 | 日本韩国欧美三级| 精品99999| 性欧美疯狂xxxxbbbb| 国产成人精品免费网站| 制服视频三区第一页精品| 亚洲欧洲成人av每日更新| 久久精品噜噜噜成人av农村| 色综合天天视频在线观看 | 亚洲成a人片在线不卡一二三区| 国产美女主播视频一区| 欧美日韩成人在线| 中文字幕在线一区| 激情丁香综合五月| 欧美久久一区二区| 亚洲人成人一区二区在线观看| 国产在线一区二区| 欧美日韩国产精选| 一区二区三区毛片| 成人免费视频国产在线观看| 日韩一级黄色片| 夜色激情一区二区| 99精品视频在线播放观看| 国产清纯在线一区二区www| 久久精品久久99精品久久| 欧美人妇做爰xxxⅹ性高电影| 亚洲欧美日韩久久| 99久久99久久综合| 中文字幕一区二区三区不卡| 国产成人鲁色资源国产91色综| 日韩精品一区二区三区swag| 性欧美疯狂xxxxbbbb| 欧美性色黄大片手机版| 伊人色综合久久天天| 99久久伊人久久99| 国产精品色呦呦| 国产成人aaa| 日本一区二区三区国色天香| 国产精品2024| 国产女人水真多18毛片18精品视频| 久久99国产精品麻豆| 日韩女优制服丝袜电影| 久久精品99久久久| 欧美成人a∨高清免费观看| 日韩国产高清影视| 91精品国产综合久久香蕉的特点| 日韩电影网1区2区| 精品少妇一区二区三区日产乱码 | 成人在线综合网| 亚洲国产高清不卡| 成人动漫一区二区| 亚洲欧美一区二区久久| 色视频成人在线观看免| 一区二区三区高清在线| 欧美日韩一级大片网址| 首页欧美精品中文字幕| 日韩女优av电影| 国产一区二区在线影院| 欧美极品美女视频| 91蜜桃免费观看视频| 亚洲国产精品一区二区尤物区| 欧美精选在线播放| 久久99国产精品麻豆| 亚洲国产精品精华液2区45| 成人综合激情网| 亚洲精品欧美激情| 欧美丰满高潮xxxx喷水动漫| 久久99精品久久久久久国产越南 | 欧美在线观看视频在线| 五月天婷婷综合| 久久综合九色综合欧美就去吻| 国产成人精品免费网站| 一区二区欧美在线观看| 91精品国产综合久久福利| 国产精品一二三区在线| 亚洲色图欧洲色图婷婷| 6080午夜不卡| 成人99免费视频| 丝袜a∨在线一区二区三区不卡| 欧美精品一区二区三| av日韩在线网站| 午夜电影网亚洲视频| 久久综合av免费| 在线免费亚洲电影| 久久99国内精品| 樱花草国产18久久久久| 日韩精品一区二区三区在线播放| av在线一区二区| 日韩va欧美va亚洲va久久| 国产欧美日本一区二区三区| 欧美综合久久久| 国产一区二区免费在线| 亚洲激情图片小说视频| 精品久久久久久无| 色综合久久中文字幕| 精品中文av资源站在线观看| 亚洲久本草在线中文字幕| 精品欧美久久久| 在线影视一区二区三区| 国产美女视频91| 视频一区二区三区中文字幕| 中文字幕一区二区三区在线不卡 | av激情亚洲男人天堂| 免费在线观看精品| 一二三四社区欧美黄| 国产日本欧洲亚洲| 欧美大片在线观看| 欧美日韩一卡二卡三卡| 99re66热这里只有精品3直播| 麻豆精品视频在线观看免费| 亚洲一区二区黄色| 亚洲视频图片小说| 国产午夜亚洲精品不卡| 欧美成人一区二区三区片免费 |