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

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

?? huffman.cpp

?? 老問題
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
/*
 *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          //單個字符最大碼長
#define MAX_STRING_LEN 1000            //要編碼的字符串的最大長度
#define MAX_CODESTRING_LEN 10000       //產生的二進制碼的最大長度
#define MAX_WORDS 1000                 //要編碼的字符串中字符種數最大值
#define END_TREE 9999                  //樹部分存儲的結束符
#define PATH_LEN 50                    //路徑串最大長度

/*****哈夫曼樹結構定義*****/
typedef struct Huffmantree{
    char ch;                           //字符
    int  weight;                       //結點權值
    int  mark;                         //標記是否加入樹中
    struct Huffmantree *parent,*lchild,*rchild,*next;
}HTNode,*LinkTree;

/*****編碼表結構定義*****/
typedef struct{
    char ch;                           //字符部分
    char code[MAX_SINGLECODE_LEN];     //編碼部分
}CodeDictionary;

/*********函數聲明*********/
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();

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

    if((ht2=(LinkTree)malloc(sizeof(HTNode)))==NULL)//創建鏈表的頭結點
    {
        printf("內存分配失敗!");
        getch();
        exit(0);
    }
    ht2->next=NULL;

    while(1)
    {
        menu();                        //調入主菜單
        choice=getch();                //讀入用戶選項
        switch(choice)                 //判斷用戶選擇
        {
            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);          //得到有權值的表
                tempcopy=setWeight(string);
                ht=sortNode(temp);               //按權值排序后的表
                htcopy=sortNode(tempcopy);       //用于記錄解碼樹
                htree=createHTree(ht);           //得到哈夫曼樹
                codeHTree(htree,codedictionary); //哈夫曼編碼
                compressString(string,codedictionary,codestring);//壓縮為0-1碼
                writeCode(htcopy,codestring);    //將解碼樹和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);         //得到哈夫曼樹
                codeHTree(htree2,codedictionary);//哈夫曼編碼
                decodeHTree(htree2,codestring2,filestring);//解碼
                writeFile(filestring);           //將解碼文件保存
                deleteNode(htree2);              //釋放空間
                break;
            case 'q':
            case 'Q':
                exit(0);                         //退出程序
        }
    }
}


/*
 *整理輸入的字符串,統計每個字符在數組中出現的次數,作為其權值
 */
LinkTree setWeight(char *string)
{
    int i=0;                                     //文件字符串下標
    LinkTree tree;                               //頭指針
    LinkTree ptr,beforeptr;                      //創建指針與其前驅
    HTNode *node;
    
    if((tree=(LinkTree)malloc(sizeof(HTNode)))==NULL)//創建鏈表的頭結點
        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)                     //如果是第一個非頭結點
            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)           //如果鏈表中某結點的字符與新結點的字符相同
            {    
                ptr->weight++;                   //將該結點的權加一  
                free(node);    
            }
            else                                 //將新結點插入鏈表后
            {    
                node->next=beforeptr->next;
                beforeptr->next=node;
            }
        }
    }
    return tree;                                 //返回頭指針
}

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

/*
 *用排完序的字符串建立哈夫曼樹
 */
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初值為頭結點后的兩個結點,即最小權結點
    {
        tree->next=q->next;
        q->next=NULL;
        p->next=NULL;
        
        if((newnode=(HTNode *)malloc(sizeof(HTNode)))==NULL)
                                                 //申請新結點作為哈夫曼樹的中間結點
            return NULL;
        newnode->next=NULL;
        newnode->mark=0;
        
        newnode->lchild=p;                       //取鏈表頭結點后的兩個結點作為新結點的左、右孩子
        newnode->rchild=q;
        p->parent=newnode;
        q->parent=newnode;
        newnode->weight=p->weight+q->weight;     //權值相加
        
        p=tree->next;
        beforep=tree;
        
        if(p!=NULL&&p->weight>=newnode->weight)
        {
            newnode->next=beforep->next;         //將新結點插入原鏈表的相應位置
            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);
}

/*
 *對哈夫曼樹進行編碼
 */
void codeHTree(LinkTree tree,CodeDictionary *codedictionary)
{   
    int index=0,k=0;
    char code[MAX_SINGLECODE_LEN];               //用于統計每個字符的哈夫曼編碼
    LinkTree ptr=tree;                           //從樹的根結點開始

    if(ptr==NULL)
    {
        printf("要進行編碼的文件為空!\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)   //如果沒有左右孩子,即葉子結點
                {
                    ptr->mark=1;                 //作標記,表明該字符已被編碼
                    code[index]='\0';            //編碼0-1字符串結束
                    codedictionary[k].ch=ptr->ch;//給字典賦字符值
                    for(index=0;code[index]!='\0';index++)
                        codedictionary[k].code[index]=code[index];//給字典賦碼值
                    codedictionary[k].code[index]='\0';
                    k++;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲天堂福利av| 精品国产乱码久久| 亚洲欧洲制服丝袜| 99精品视频中文字幕| 亚洲欧美偷拍卡通变态| 欧美网站大全在线观看| 视频一区中文字幕| 欧美va亚洲va香蕉在线| 成人免费看黄yyy456| 亚洲精品免费在线观看| 欧美精品色一区二区三区| 看电视剧不卡顿的网站| 国产精品视频一二三| 91麻豆国产香蕉久久精品| 亚洲 欧美综合在线网络| 欧美成人国产一区二区| www.欧美精品一二区| 亚洲成人7777| 久久久精品人体av艺术| 日本高清不卡视频| 精品一区精品二区高清| 日韩美女视频一区二区| 欧美一区国产二区| 成人不卡免费av| 日韩影视精彩在线| 欧美国产一区在线| 欧美精品自拍偷拍动漫精品| 国产精品资源在线看| 亚洲乱码中文字幕| 337p粉嫩大胆噜噜噜噜噜91av | 久久亚洲影视婷婷| 一本色道久久综合狠狠躁的推荐| 日本怡春院一区二区| 国产精品美女久久久久久久久久久 | 欧美精品少妇一区二区三区| 韩国女主播成人在线| 国产精品二三区| 日韩一区二区在线观看| 色综合天天综合色综合av| 蜜乳av一区二区| 一区二区在线观看不卡| 久久青草国产手机看片福利盒子| 色狠狠av一区二区三区| 国产成人在线免费观看| 日韩精品成人一区二区在线| 中文字幕一区二区三区在线不卡 | 日本高清成人免费播放| 国产一区二区视频在线| 午夜电影一区二区三区| 亚洲色图一区二区| 久久久国产一区二区三区四区小说| 欧美性猛片aaaaaaa做受| av午夜精品一区二区三区| 国内精品免费在线观看| 日本欧美一区二区| 亚洲午夜三级在线| 亚洲人成在线播放网站岛国| 日本一区二区三区在线观看| 精品人在线二区三区| 91精品综合久久久久久| 欧美性色黄大片| 91久久精品日日躁夜夜躁欧美| 国产乱理伦片在线观看夜一区| 日本欧美一区二区| 日韩在线观看一区二区| 亚洲成人激情av| 夜夜嗨av一区二区三区四季av| 亚洲欧洲av一区二区三区久久| 国产午夜精品一区二区三区四区 | 国产成人精品一区二区三区四区 | 亚洲精品国产一区二区三区四区在线| 久久综合色播五月| 日韩欧美一区二区三区在线| 337p亚洲精品色噜噜噜| 制服.丝袜.亚洲.另类.中文| 欧美日韩国产经典色站一区二区三区 | 日本免费新一区视频| 首页综合国产亚洲丝袜| 日韩成人免费在线| 久久精品国产77777蜜臀| 久久国产视频网| 国产乱人伦精品一区二区在线观看 | 日本va欧美va瓶| 青青草97国产精品免费观看| 免费在线看成人av| 九一九一国产精品| 欧美美女网站色| 欧美丰满一区二区免费视频 | 欧美电影免费观看高清完整版在 | 26uuuu精品一区二区| 久久久久久久久99精品| 国产精品视频观看| 亚洲男同1069视频| 午夜激情一区二区三区| 久久不见久久见免费视频7| 国产一区在线不卡| caoporen国产精品视频| 日本乱码高清不卡字幕| 欧美精品一级二级三级| 欧美精品一区二区三区四区| 国产婷婷色一区二区三区 | av电影天堂一区二区在线 | 成人午夜电影小说| 91福利小视频| 日韩欧美一级精品久久| 国产精品少妇自拍| 亚洲五月六月丁香激情| 久久成人精品无人区| 成人av网站在线| 欧美日韩国产一区二区三区地区| 日韩免费福利电影在线观看| 中文一区一区三区高中清不卡| 亚洲最大成人网4388xx| 韩日av一区二区| 91国模大尺度私拍在线视频 | 国产免费成人在线视频| 亚洲国产成人av| 国产精品一级片| 欧美日韩一级大片网址| 久久久久久9999| 午夜久久电影网| av激情综合网| 日韩视频在线一区二区| **性色生活片久久毛片| 美脚の诱脚舐め脚责91| 在线看日韩精品电影| 久久精品视频在线免费观看| 亚洲成a人在线观看| 成人综合婷婷国产精品久久免费| 欧美日韩亚洲国产综合| 欧美极品aⅴ影院| 麻豆一区二区三| 欧美在线观看18| 中文字幕亚洲电影| 久久国产福利国产秒拍| 在线精品视频一区二区三四| 国产欧美一区二区在线观看| 日韩电影在线观看电影| 色婷婷精品久久二区二区蜜臀av| 久久久久久久久久久久久女国产乱| 亚洲一区二区三区中文字幕| 成人app下载| 2020国产精品| 老鸭窝一区二区久久精品| 欧美主播一区二区三区| 亚洲天堂精品在线观看| 成人综合婷婷国产精品久久蜜臀| 日韩精品中文字幕在线一区| 午夜视频在线观看一区二区| 色女孩综合影院| 国产精品久久久久久久久免费相片| 极品美女销魂一区二区三区 | 91在线观看成人| 日本一区二区三级电影在线观看| 久久精品72免费观看| 欧美日韩国产免费一区二区 | 欧美日韩一级片网站| 亚洲美女屁股眼交| 99久久免费国产| 中文字幕欧美一区| av电影一区二区| 中文字幕在线播放不卡一区| 成人久久18免费网站麻豆| 欧美激情一区二区三区不卡| 国产成人av自拍| 国产亚洲午夜高清国产拍精品 | 三级不卡在线观看| 欧美日韩免费一区二区三区 | 成人影视亚洲图片在线| 久久精品在线免费观看| 国产成人夜色高潮福利影视| 久久女同精品一区二区| 国产精品99久久久久久宅男| 久久久精品免费免费| 成人h动漫精品一区二| 一色屋精品亚洲香蕉网站| 色婷婷精品久久二区二区蜜臂av| 亚洲三级电影网站| 欧美色中文字幕| 日韩精品一区第一页| 日韩欧美卡一卡二| 国产91综合一区在线观看| 国产精品美女一区二区在线观看| 91片在线免费观看| 亚洲1区2区3区4区| 欧美一级片免费看| 国产成人午夜片在线观看高清观看| 欧美国产国产综合| 91行情网站电视在线观看高清版| 天天射综合影视| 欧美精品一区二区三区视频| 99麻豆久久久国产精品免费| 亚洲国产精品久久人人爱| 欧美大片在线观看一区| 成人午夜视频免费看| 一区二区三区四区中文字幕| 日韩丝袜美女视频| 99视频国产精品| 免费一区二区视频| 国产精品对白交换视频|