• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            鍵盤上的舞者

            My Email: marckywu@gmail.com
            隨筆 - 19, 文章 - 0, 評論 - 3, 引用 - 0
            數據加載中……

            HuffmanTree的創建及編碼

            typedef struct _HTNode {
                unsigned 
            int weight;        /* 權值 */
                unsigned 
            int parent;        /* 父節點索引 */
                unsigned 
            int lchild;        /* 左孩子索引 */
                unsigned 
            int rchild;        /* 右孩子索引 */
            } HTNode, 
            *HuffmanTree;         /* 動態分配數組存儲哈夫曼樹 */

            typedef 
            char **HuffmanCode;     /* 動態分配數組存儲哈夫曼編碼表 */

            /* 從ht的1~n的節點中找出權值最小的兩個節點,分別存于s1, s2中 */
            void Select(HuffmanTree ht, int n, int *s1, int *s2)
            {
                
            int i;

                
            *s1 = 0;
                
            *s2 = 0;
                
            /*設置s1, s2到開始兩個parent等于0的節點位置*/
                
            for (i = 1; i <= n; ++i) {
                    
            if (*s1 != 0 && *s2 != 0)
                        
            break;
                   
                    
            if (ht[i].parent == 0)
                        
            *s1 == 0 ? *s1 = i : *s2 = i;
                }
                
            /*找出ht中parent等于0,且權值最小的兩個節點位置,分別存于s1, s2中*/
                
            for ( ; i <= n; ++i) {
                    
            if (ht[i].parent != 0continue;

                    
            if ( (ht[*s1].weight > ht[*s2].weight) && (ht[*s1].weight > ht[i].weight))
                        
            *s1 = i;
                    
            else if ( (ht[*s2].weight > ht[*s1].weight) && (ht[*s2].weight > ht[i].weight))
                        
            *s2 = i;
                }
            }

            /* 通過w存儲的n個權值,來創建一顆哈夫曼樹, ht_ptr指向這顆哈夫曼樹 */
            void CreateHuffmanTree(HuffmanTree *ht_ptr, int *w, int n)
            {
                
            int m;
                
            int i;
                
            int s1, s2;
                HuffmanTree p;
                
                
            if (n <= 1return;
                m 
            = 2 * n - 1;              /* n個字符,需要2n-1個空間來存儲整顆huffman tree */
                
            *ht_ptr = (HuffmanTree)malloc( (m + 1* sizeof(HTNode)); /* 0號單元不用 */

                
            for (p = *ht_ptr + 1, i = 1; i <= n; ++i, ++p, ++w) { /* 初始化數組中前n個單元存儲的字符 */
                    p
            ->weight = *w;
                    p
            ->parent = 0;
                    p
            ->lchild = 0;
                    p
            ->rchild = 0;
                }
                
            for ( ; i <= m; ++i, ++p) { /* 初始化數組中剩余的單元 */
                    p
            ->weight = 0;
                    p
            ->parent = 0;
                    p
            ->lchild = 0;
                    p
            ->rchild = 0;
                }

                
            for (i = n + 1; i <= m; ++i) {
                    Select(
            *ht_ptr, i - 1&s1, &s2);
                    
            /* 設置s1, s2的父親為i */
                    (
            *ht_ptr + s1)->parent = i;
                    (
            *ht_ptr + s2)->parent = i;
                    
            /* 設置i的左孩子為s1, 右孩子為s2 */
                    (
            *ht_ptr + i)->lchild = s1;
                    (
            *ht_ptr + i)->rchild = s2;
                    
            /* 設置i的權值為s1, s2之和 */
                    (
            *ht_ptr + i)->weight = (*ht_ptr + s1)->weight + (*ht_ptr + s2)->weight;
                }
            }

            /* 對ht_ptr存儲的哈夫曼樹的n個葉子節點進行哈夫曼編碼 */
            void HuffmanCoding(HuffmanTree *ht_ptr, HuffmanCode *hc_ptr, int n)
            {
                
            int i;
                
            int start;
                
            char *cd = NULL;
                
                
            *hc_ptr = (HuffmanCode)malloc( (n + 1* sizeof(char *));

                cd 
            = (char *)malloc(n * sizeof(char));
                cd[n 
            - 1= '\0';

                
            for (i = 1; i <= n; ++i) {
                    start 
            = n - 1;

                    
            int current, father;
                    
            for (current = i, father = (*ht_ptr + i)->parent; /* 從葉子節點開始,并取得父節點father */
                         father 
            != 0;                                 /* 父節點為0時及到達了根節點 */
                         current 
            = father, father = (*ht_ptr + father)->parent) { /* 逐漸向根節點靠攏 */
                        
            if ( (*ht_ptr + father)->lchild == current) /* 當前節點為左孩子 */
                            cd[
            --start] = '0';
                        
            else
                            cd[
            --start] = '1';

                    }

                    
            *(*hc_ptr + i) = (char *)malloc( (n - start) * sizeof(char));
                    strcpy(
            *(*hc_ptr +i), &cd[start]);
                }
                free(cd);
            }


            posted on 2009-09-28 17:49 Marcky 閱讀(598) 評論(0)  編輯 收藏 引用 所屬分類: 數據結構和算法

            久久99久久成人免费播放| 97久久国产综合精品女不卡| 久久99精品国产99久久| 国产精品久久久天天影视香蕉| 99久久综合国产精品二区| 久久综合色区| 久久久久夜夜夜精品国产| 欧美伊人久久大香线蕉综合69| 无码人妻久久一区二区三区| 国产福利电影一区二区三区久久久久成人精品综合 | 一级a性色生活片久久无| 久久九九精品99国产精品| 久久久91人妻无码精品蜜桃HD | 久久综合给久久狠狠97色| 久久精品成人一区二区三区| 久久久一本精品99久久精品66| 久久综合九色综合欧美就去吻| 99re这里只有精品热久久| 四虎国产精品成人免费久久| 97久久精品人人做人人爽| 久久综合亚洲欧美成人| 亚洲午夜久久久久久噜噜噜| 久久99精品久久久久久不卡| 99久久精品国产综合一区| 97久久综合精品久久久综合| 无码人妻少妇久久中文字幕蜜桃| 亚洲国产成人精品91久久久 | 国产福利电影一区二区三区久久老子无码午夜伦不 | 亚洲人成无码网站久久99热国产| 精品国产91久久久久久久| 无码人妻久久一区二区三区免费丨 | 亚洲αv久久久噜噜噜噜噜| 少妇人妻综合久久中文字幕| 久久国产AVJUST麻豆| 99热成人精品免费久久| 青青热久久综合网伊人| 91精品久久久久久无码| 久久久久综合国产欧美一区二区| 久久久黄片| 亚洲日韩中文无码久久| 久久精品国产久精国产思思|