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

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

?? main.c

?? It s an interface for using huffman trees (data structure application) that can be used for compress
?? C
字號:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>


#define MAX_CHARS    256



typedef struct btNode
{
    struct btNode *parent;

    struct btNode *left,
                  *right;

    char ch;
    int freq;
} binTree;


typedef struct node
{
    struct node *next;

    binTree *root;
} listRootNodes;


typedef struct chElement
{
    char ch;
    char *code;

    binTree *node;

    int freq;
} chArrayElement;


listRootNodes *firstRootNode,
              *lastRootNode;

chArrayElement chArray[MAX_CHARS];


int numChArrayElements;
int textLen;






void _Init
   (
   )

{
    firstRootNode=NULL;
    lastRootNode =NULL;

    numChArrayElements=0;
}


binTree *_AllocBTNode
   (
    binTree *parent,
    char ch,
    int freq
   )

{
    binTree *cBTNode;


    cBTNode=(binTree *)malloc(sizeof(binTree));

    cBTNode->parent=parent;

    cBTNode->left =NULL;
    cBTNode->right=NULL;

    cBTNode->ch  =ch;
    cBTNode->freq=freq;


    return(cBTNode);
}



binTree *_NewBTNode
   (
    binTree **root,
    binTree *node,
    char ch,
    int freq
   )

{
    binTree *cBTNode;


    if (!(*root))
    {
        (*root)=_AllocBTNode(NULL,ch,freq);


        return(*root);
    }
    else
    if (freq<node->freq)
    {
        if (node->left)
        {
            return(_NewBTNode(root,node->left,ch,freq));
        }
        else
        {
            cBTNode=_AllocBTNode(node,ch,freq);

            node->left=cBTNode;


            return(cBTNode);
        }
    }
    else
    {
        if (node->right)
        {
            return(_NewBTNode(root,node->right,ch,freq));
        }
        else
        {
            cBTNode=_AllocBTNode(node,ch,freq);

            node->right=cBTNode;


            return(cBTNode);
        }
    }
}




listRootNodes *_NewListNode
   (
   )

{
    listRootNodes *cNode;


    if (!firstRootNode)
    {
        firstRootNode=(listRootNodes *)malloc(sizeof(listRootNodes));

        firstRootNode->next=NULL;
        cNode=firstRootNode;
    }
    else
    {
        cNode=(listRootNodes *)malloc(sizeof(listRootNodes));

        cNode->next=NULL;
        lastRootNode->next=cNode;
    }

    lastRootNode=cNode;


    return(cNode);
}


int _DeleteListNode
   (
    listRootNodes *node
   )

{
    listRootNodes *prevNode;


    if (!node)
    {
        return(0);
    }

    if (node==firstRootNode)
    {
        firstRootNode=firstRootNode->next;

        free(node);
    }
    else
    {
        prevNode=firstRootNode;

        while (prevNode)
        {
            if (prevNode->next==node)
            {
                break;
            }

            prevNode=prevNode->next;
        }

        if (!prevNode)
        {
            return(0);
        }

        prevNode->next=node->next;

        if (node==lastRootNode)
        {
            lastRootNode=prevNode;
        }

        free(node);
    }


    return(1);
}



void _FreeList
   (
   )

{
    while (firstRootNode)
    {
        lastRootNode=firstRootNode->next;

        free(firstRootNode);

        firstRootNode=lastRootNode;
    }

    firstRootNode=NULL;
    lastRootNode =NULL;
}



void _DeleteAllBTNodes
   (
    binTree *root,
    binTree *node
   )

{
    binTree *cNode;


    if (!root)
    {
        return;
    }

    if (
        (!node->left)&&
        (!node->right)
       )
    {
        cNode=node;

        free(node);

        if (cNode==root)
        {
            root=NULL;
        }
    }
    else
    {
        if (node->left)
        {
            _DeleteAllBTNodes(root,node->left);

            node->left=NULL;
        }

        if (node->right)
        {
            _DeleteAllBTNodes(root,node->right);

            node->right=NULL;
        }
    }
}



int _GetBTNodeKeyDepth
   (
    binTree *node,
    char ch,
    int depth
   )

{
    int retLeft,retRight;


    if (!node)
    {
        return(-1);
    }

    if (node->ch==ch)
    {
        return(depth);
    }
    else
    {
        retLeft =-1;
        retRight=-1;

        if (node->left)
        {
            retLeft=_GetBTNodeKeyDepth(node->left,ch,depth+1);
        }

        if (node->right)
        {
            retRight=_GetBTNodeKeyDepth(node->right,ch,depth+1);
        }

        if (retLeft!=-1)
        {
            return(retLeft);
        }
        else
        {
            return(retRight);
        }
    }


    return(-1);
}



void _PrintTree
   (
    binTree *root,
    binTree *node,
    int level,
    int brachType
   )

{
    int i,len;
    binTree *tNode;


    if (!node)
    {
        return;
    }


    printf("\n");

    for (i=0; i<level; i++)
    {
        printf("\t");
    }


    if (node==root)
    {
        printf("Radacina (%c,%d)",node->ch,node->freq);
    }
    else
    {
        if (!brachType)
        {
            printf("Fiu stang (%c,%d)",node->ch,node->freq);
        }
        else
        {
            printf("Fiu drept (%c,%d)",node->ch,node->freq);
        }
    }

    if (node->left)
    {
        _PrintTree(root,node->left,level+1,0);
    }

    if (node->right)
    {
        _PrintTree(root,node->right,level+1,1);
    }
}


int _TryInsertCh
   (
    char ch
   )

{
    int i;


    for (i=0; i<numChArrayElements; i++)
    {
        if (chArray[i].ch==ch)
        {
            chArray[i].freq++;


            return(1);
        }
    }


    chArray[numChArrayElements].ch=ch;
    chArray[numChArrayElements].freq=1;
    chArray[numChArrayElements].code=NULL;

    numChArrayElements++;


    return(0);
}


void _ReadList
   (
   )

{
    char str[MAX_CHARS+1];
    int i;
    listRootNodes *cNode;


    printf("\n\nDati stringul: ");
    fgets(str,MAX_CHARS,stdin);
    str[MAX_CHARS]='\0';

    str[strchr(str,'\n')-str]='\0';

    textLen=strlen(str);

    for (i=0; i<textLen; i++)
    {
        _TryInsertCh(str[i]);
    }


    for (i=0; i<numChArrayElements; i++)
    {
        cNode=_NewListNode();

        cNode->root=NULL;
        cNode->root=_NewBTNode(&cNode->root,NULL,chArray[i].ch,chArray[i].freq);

        chArray[i].node=cNode->root;
    }
}


void _Replace2Chars
   (
   )

{
    int minFreq;
    listRootNodes *cNode,*minNode1,*minNode2;
    binTree *cBTNode;


    if (firstRootNode==lastRootNode)
    {
        return;
    }

    cNode=firstRootNode;

    minFreq=cNode->root->freq;
    minNode1=cNode;

    cNode=cNode->next;

    while (cNode)
    {
        if (cNode->root->freq<minFreq)
        {
            minFreq=cNode->root->freq;
            minNode1=cNode;
        }

        cNode=cNode->next;
    }


    ////
    cNode=firstRootNode;

    if (cNode==minNode1)
    {
        cNode=cNode->next;
    }

    minFreq=cNode->root->freq;
    minNode2=cNode;

    cNode=cNode->next;

    while (cNode)
    {
        if (cNode==minNode1)
        {
            cNode=cNode->next;

            continue;
        }

        if (cNode->root->freq<minFreq)
        {
            minFreq=cNode->root->freq;
            minNode2=cNode;
        }

        cNode=cNode->next;
    }


    ////
    cBTNode=_AllocBTNode(NULL,'X',minNode1->root->freq+minNode2->root->freq);

    if (minNode1->root->freq<minNode2->root->freq)
    {
        cBTNode->left =minNode1->root;
        cBTNode->right=minNode2->root;
    }
    else
    {
        cBTNode->left =minNode2->root;
        cBTNode->right=minNode1->root;
    }

    minNode1->root->parent=cBTNode;
    minNode2->root->parent=cBTNode;

    minNode1->root=cBTNode;

    _DeleteListNode(minNode2);

    _Replace2Chars();
}


void _BuildCodes
   (
   )

{
    int i,len,count;
    binTree *pNode,*node;


    for (i=0; i<numChArrayElements; i++)
    {
        len=_GetBTNodeKeyDepth(firstRootNode->root,chArray[i].ch,0);

        chArray[i].code=(char *)malloc(len+1);
        chArray[i].code[len]='\0';

        node=chArray[i].node;

        count=0;

        do
        {
            pNode=node->parent;

            if (!pNode)
            {
                break;
            }

            if (pNode->left==node)
            {
                chArray[i].code[len-1-count]='0';
            }
            else
            {
                chArray[i].code[len-1-count]='1';
            }

            node=pNode;

            count++;
        }
        while (1);
    }
}


void _PrintCodeFreqTable
   (
   )

{
    int i;


    printf("\n\nTabel de coduri Huffmann: ");

    for (i=0; i<numChArrayElements; i++)
    {
        printf("\nCaracter: %c   Frecventa: %d  Cod: %s",chArray[i].ch,chArray[i].freq,chArray[i].code);
    }
}


void _PrintNeededBits
   (
   )

{
    int i,sum;


    sum=0;

    for (i=0; i<numChArrayElements; i++)
    {
        sum+=chArray[i].freq*strlen(chArray[i].code);
    }

    printf("\n\nStringul dat necesita %d biti (%d bytes) pentru a fi stocat + marimea tabelului de coduri!..in comparatie cu %d bits (%d bytes).\nProcent de compresie aprox: %.2f%%",sum,(sum+7)>>3,textLen<<3,textLen,(float)sum*100/(textLen<<3));
}




int main
   (
    int argc,
    char **argv
   )
{
    _Init();
    _ReadList();

    _Replace2Chars();

    _PrintTree(firstRootNode->root,firstRootNode->root,0,-1);
    _BuildCodes();
    _PrintCodeFreqTable();
    _PrintNeededBits();

    _DeleteAllBTNodes(firstRootNode->root,firstRootNode->root);
    _FreeList();


    getch();

    return(0);
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲在线中文字幕| 久久久久久久综合色一本| 在线观看91视频| 91精品视频网| 自拍偷拍国产精品| 精品一区二区三区影院在线午夜| 成人a级免费电影| 日韩欧美一区电影| 亚洲精品中文字幕在线观看| 国产在线不卡一卡二卡三卡四卡| 欧美日韩午夜精品| 亚洲色图.com| 不卡的电视剧免费网站有什么| 91精品国产手机| 亚洲综合一区二区| 亚洲高清视频在线| 精品久久久影院| 中文字幕av一区二区三区| 日本一区二区不卡视频| 日韩不卡手机在线v区| 日韩一区二区影院| 亚洲三级在线免费| av不卡一区二区三区| 26uuu国产一区二区三区| 三级精品在线观看| 欧美亚一区二区| 一区二区三区精品在线观看| 99精品在线观看视频| 国产日韩欧美综合在线| 精品在线观看视频| 日韩精品一区二区三区在线观看| 日韩电影在线观看网站| 欧美日韩中字一区| 午夜在线电影亚洲一区| 欧美视频在线一区二区三区 | 一个色综合av| 丰满岳乱妇一区二区三区| 久久综合色综合88| 国产一区二区中文字幕| 欧美精品一区二区三区在线| 国内精品在线播放| 久久久亚洲国产美女国产盗摄| 加勒比av一区二区| 欧美精品一区二区久久久| 韩国欧美国产1区| 久久九九久久九九| 成人av小说网| 亚洲欧洲日韩在线| 欧美亚洲动漫另类| 美洲天堂一区二卡三卡四卡视频| 日韩精品一区二区在线| 国产 欧美在线| 椎名由奈av一区二区三区| 在线亚洲免费视频| 免费成人av在线| 国产免费久久精品| 久久九九全国免费| 欧美福利视频导航| 亚洲六月丁香色婷婷综合久久| 91在线精品一区二区| 亚洲一区二区三区美女| 日韩一级高清毛片| 国产成人av电影免费在线观看| 成人免费一区二区三区视频| 欧美中文字幕久久| 久久99国产精品成人| 国产精品久久久久久久久果冻传媒| 色狠狠一区二区| 蜜乳av一区二区| 综合久久一区二区三区| 91麻豆精品国产| 国产成人综合网站| 午夜精品久久久久| 久久精品一区八戒影视| 欧日韩精品视频| 国产一区二区三区免费在线观看| 国产精品美女视频| 欧美一区二区成人| 白白色 亚洲乱淫| 青草av.久久免费一区| 国产精品二区一区二区aⅴ污介绍| 欧美日韩一区视频| 高清视频一区二区| 免费成人美女在线观看| 亚洲自拍偷拍av| 久久久久97国产精华液好用吗| 欧美日韩另类一区| eeuss国产一区二区三区| 久久99日本精品| 亚洲一本大道在线| 国产精品国产三级国产专播品爱网| 91精品午夜视频| 日本丶国产丶欧美色综合| 国产成人午夜精品影院观看视频 | 精品日韩在线一区| 欧美亚一区二区| av在线不卡免费看| 九一久久久久久| 午夜日韩在线观看| 亚洲综合在线五月| 337p粉嫩大胆噜噜噜噜噜91av| 9人人澡人人爽人人精品| 国产剧情一区在线| 亚洲综合免费观看高清在线观看| 国产天堂亚洲国产碰碰| 日韩午夜小视频| 欧美日韩成人一区二区| 91成人免费网站| 一本色道久久综合狠狠躁的推荐| 国产**成人网毛片九色| 国内欧美视频一区二区| 蜜臂av日日欢夜夜爽一区| 亚洲国产欧美一区二区三区丁香婷| 国产精品久久二区二区| 欧美激情中文字幕| 国产婷婷色一区二区三区| 久久中文娱乐网| 日韩欧美国产一区二区在线播放| 51精品秘密在线观看| 7777精品伊人久久久大香线蕉经典版下载| 色就色 综合激情| 色狠狠av一区二区三区| 欧美性一级生活| 欧美综合久久久| 欧美日韩亚洲综合一区| 欧美色图激情小说| 欧美妇女性影城| 欧美大片免费久久精品三p| 精品三级在线看| 久久先锋影音av鲁色资源网| 国产亚洲va综合人人澡精品| 欧美激情中文不卡| 久久精品亚洲乱码伦伦中文 | 欧美顶级少妇做爰| 久久新电视剧免费观看| 精品国产污网站| 精品福利在线导航| 国产丝袜在线精品| 亚洲欧美日韩精品久久久久| 亚洲精品亚洲人成人网| 亚洲午夜电影在线观看| 日韩不卡一区二区三区 | 欧美日韩久久久| 日韩一二三四区| 国产午夜精品久久久久久免费视| 中文字幕av在线一区二区三区| 亚洲色大成网站www久久九九| 亚洲欧美偷拍卡通变态| 日韩高清电影一区| 国产成人久久精品77777最新版本 国产成人鲁色资源国产91色综 | caoporn国产一区二区| 91蝌蚪国产九色| 欧美群妇大交群的观看方式| 精品精品欲导航| 一区在线播放视频| 香港成人在线视频| 国产成人久久精品77777最新版本| 在线欧美一区二区| 精品国产三级电影在线观看| 亚洲私人黄色宅男| 日韩av电影天堂| 国产91高潮流白浆在线麻豆 | 在线观看成人小视频| 精品久久国产老人久久综合| 亚洲欧美色一区| 老司机免费视频一区二区| 99re66热这里只有精品3直播 | 免费成人美女在线观看.| 日韩免费福利电影在线观看| 日韩一区中文字幕| 91久久线看在观草草青青| 久久久久久久综合日本| ●精品国产综合乱码久久久久| 亚洲h精品动漫在线观看| 福利一区二区在线观看| 在线成人免费视频| 亚洲精品欧美激情| 国产成人免费视频一区| 欧美一区三区四区| 亚洲精品国产第一综合99久久| 国产主播一区二区三区| 欧美人伦禁忌dvd放荡欲情| 1024成人网| 粉嫩在线一区二区三区视频| 日韩精品一区二区三区三区免费 | 97se亚洲国产综合在线| 26uuu亚洲综合色| 亚洲国产欧美在线人成| 91免费视频网| 日韩伦理免费电影| 粉嫩在线一区二区三区视频| 精品国产乱码久久久久久久久| 国产精品美女视频| 久久综合色8888| 色综合中文字幕国产 | 成人av动漫网站| 国产乱人伦偷精品视频免下载 | 国产99久久久国产精品潘金| 欧美精品一区二区久久久| 国产91精品在线观看|